Support more than one pipeline graph per repository #5
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Today a repository has exactly one process:
.osf/pipeline.yaml, read out of git at therun's base sha (
src/osf/pipeline/loader.py), or the built-in default when that file isabsent. Every run gets the same graph.
That graph hard-codes one branching model — feature branching: a worktree on
osf/run_<id>cut frommain, andpr.open(open_pull_requestinsrc/osf/forgejo.py,base="main") pushes it and opens a PR back intomain.Want
Choose the graph per run, so the same repository can offer more than one process. The
first motivating second graph is a proper git-flow pipeline:
feature/*branches cut from and merged back intodevelop, notmainrelease/*path: branch fromdevelop, stabilise, merge tomain+ tag, back-merge todevelophotfix/*path: branch frommain, merge to bothmainanddevelopThe existing graph stays as the default feature-branch pipeline.
Create a third graph built for speed called minimalist, which uses openspec lightly, just propose through archive, no explore or review. It also uses git feature branching. It also runs unit tests, and UI tests when required. Speed is the priority on this, but without compromising specs, version control and testing.
Sketch
.osf/pipelines/<name>.yaml, with.osf/pipeline.yamlstill honouredas
default. Every graph read out of git at the base sha, as now.tools/drive.py, intake).For Forgejo intake, map from an issue label (e.g.
osf:git-flow) with a fallback to default.start event so recovery and redo replay against the same graph.
pipeline-level settings instead of
"main"/osf/run_literals, so git-flow ismostly configuration plus a few new scripted nodes (merge, tag, back-merge).
Open questions
::osf:effect::markers andredo semantics like
pr.openhas.pr.mergeis still commented out in the default node table; git-flow likely needs it first.Done when
develop.default_pipeline()behaviour is unchanged for repos with a single.osf/pipeline.yaml.Shipped in
b8cb11a(change archived as2026-09-26-named-pipelines, specopenspec/specs/named-pipelines), deployed to production.default=.osf/pipeline.yaml,<name>=.osf/pipelines/<name>.yaml, falling back to a built-in of that name; unknown names block admission with the name.minimalist(propose → apply → unit tests, browser tests only when UI files changed → PR → merge → archive; no explore/review),git-flow(feature/* from and into develop),git-flow-release(release/* from develop → PR into main → tag vX.(Y+1).0 → merge back into develop),git-flow-hotfix(minimalist on hotfix/* from main → archive → tag vX.Y.(Z+1) → merge back into develop). Release is its own graph, not a gate on a feature run.branches: {base, work_prefix, pr_target}replace themain/osf/literals; PRs now target the branch the run was cut from.git.flow.release-start,git.flow.pr.open,git.flow.tag,git.flow.back-mergeemit::osf:effect::markers and are idempotent underredo: supersede.GET /api/pipelines),pipelineonPOST /api/runs,tools/drive.py --pipeline, or anosf:<name>issue label (which also starts the run). Shown on the run list and spine header.default_pipeline()is unchanged; git-flow needs adevelopbranch (the run blocks naming it otherwise).