How to use the workflow

How to run a job end-to-end — from a free-form intake file through every stage and into 4_done/. Skim the architecture first if you have not yet — it explains the standalone agent roles (app-init/app-update, orchestrator, operation agents — D-41 folded creation into the orchestrator), the Kanban queues, and the three sources of truth.

The big picture — You write an intake. The orchestrator turns it into a structured JOB.md in 1_creation/ via its internal creation/bootstrap step (D-41), then — unless you set the after_creation gate to yes — advances it to 2_ready/, dispatches each enabled stage as a sub-agent (from _processes/02_orchestrator/stages/; D-56 — the orchestrator is a pure conductor), stops at every approval gate you asked for, and lands the folder in 4_done/ — all in one prompt.

Two invocation modes

Every user-invoked workflow prompt (orchestrator, promote, extend, app-init/app-update) can be launched from either of two cwd locations. Both are first-class supported and produce identical job-pipeline behaviour; the canonical rule is _processes/_shared/handoff-paths.md.

ModeSession cwdPrompt path you pasteAuto-loads
Host-root (recommended when the job touches host source code)host project's repository root (one level above _code_workflow/)_code_workflow/_processes/<…>.prompt.mdthe host project's own CLAUDE.md / AGENTS.md if any
Workflow-internal (use for workflow-self-modification, or when you prefer the workflow-scoped instructions)_code_workflow/ itself_processes/<…>.prompt.md_code_workflow/CLAUDE.md / _code_workflow/AGENTS.md

Pick one mode per session and stick with it. Each agent detects which mode it was invoked in by inspecting cwd only; sub-tree CLAUDE.md / AGENTS.md auto-loads are informational and do not change the mode. The agent then prints all subsequent "Next step" / "Next action" paths in that same mode, so copy-paste works first try.

The init agent is the one exception: it requires workflow-internal mode for its one-time bootstrap, then its hand-off prints both forms so you can switch to host-root mode for everything afterward if you prefer. Every other agent supports both modes from invocation 1.

Throughout this page, prompt paths are shown in workflow-internal form for brevity (bare _processes/...). When running in host-root mode, prefix every workflow-internal path with _code_workflow/.

Step 0 — First-time setup (run the init agent)

Before any other agent will run, _code_workflow/app.md must exist and not be the bootstrap placeholder ("To be generated", or the older "To Be Generated, once the init process is done."), and _code_workflow/config.json must declare which sub-agent runtimes are available on your machine. Both files are produced by the init agent in one pass (D-33, D-36).

Skip if — you can skip this step entirely if _code_workflow/app.md already describes your host project and _code_workflow/config.json exists and lists every runtime your jobs will need. Open both files and confirm — if they match your environment, jump straight to "Starting a new job".

How to run init

  1. Open a fresh Claude Code session with cwd = _code_workflow/ (i.e. cd /path/to/_code_workflow && claude). Init runs in its own session so its direct AskUserQuestion carve-out (D-33b) works cleanly.
  2. Send the prompt path _processes/00_app/app-init.prompt.md as the first message. Pasting the full prompt still works, but path-only invocation is the intended UX.
  3. Answer init's targeted questions via AskUserQuestion. It auto-discovers everything it can from ../ (host's CLAUDE.md, AGENTS.md, README.md, dependency manifests, directory layout) and only asks where it cannot infer.
  4. Init writes two files and reports back:
    • _code_workflow/app.md — host-fact H2 sections (Identity, Canonical context files, Tech stack, Directory map, Coding patterns, Security rules, Common commands, Test framework, Documentation conventions, Agent reading rules, Domain glossary, Never-do list). Built from _processes/00_app/app.template.md and validated against _processes/00_app/APP_CONTRACT.md.
    • _code_workflow/config.json — gitignored; shape {"runtimes": {"claude": true, "codex": <probed>}}. Init empirically probes each runtime: claude is recorded true unconditionally; codex is checked by running a trivial codex exec availability probe and looking for a clean response.
  5. Hand off to the orchestrator — once init finishes, jump to "Starting a new job".

Re-validating later

Run the dedicated _processes/00_app/app-update.prompt.md agent when the runtime set changes (e.g. you just installed the Codex plugin) or when host facts drift. app-update runs the same deep host survey as app-init, regenerates a clean current app.md preserving only host-backed facts (dropping stale sections), and re-probes runtimes into config.json unconditionally. It is a separate, independently-runnable agent — not a mode or alias of app-init (D-39).

Non-Claude runtimes

Codex CLI, Aider, Cursor, and other agents that can't run the init prompt as-is should follow the manual port flow in _docs/how-to-port.md: copy _processes/00_app/app.template.md to _code_workflow/app.md, fill the host-fact sections by hand against the contract at _processes/00_app/APP_CONTRACT.md, and copy config.example.json to config.json with the right runtimes booleans.

Starting a new job

Two intake paths. Pick the one that matches the job's size.

1 · Hand-write a markdown file (recommended)

Copy jobs/0_new/_new.md to a new filename, write a few sentences about what you want, drop it under jobs/0_new/. No required structure — write prose. The orchestrator's creation/bootstrap step extracts what it can and surfaces any open questions in its chat report.

2 · HTML form (first-time users)

Open interface/index.html in a browser — no backend/build; network required on first load unless cached. Sections: request type, identity, mandate, stage configuration, approval gates, Git. Output is a single markdown block — Copy or Download and save under jobs/0_new/. Or serve it via the optional local helper app (below) to skip the copy/hand-place step entirely.

Running the local app (optional)

The interface/ form works on its own (open it as a file, Copy/Download, hand-place into jobs/0_new/). For a smoother loop there is an optional local helper app — a tiny, zero-dependency Node service (_tools/app/server.js) that serves the form and a dashboard over your live jobs/ tree. It is a trusted local convenience: it binds 127.0.0.1 only, writes only ever to jobs/0_new/<slug>.md, never shells out, and never touches PROGRESS.md / .lock / queue moves / stage artifacts — the orchestrator stays the sole owner of job state.

One-click intake

A Create job in 0_new button writes the generated markdown straight into jobs/0_new/<slug>.md — no copy/paste. Rejects a slug that already exists anywhere in the queues.

Job dashboard

At /dashboard — every job across the six queues with click-through detail (type, queue, advancement bar, next action, intake, note.md, key-findings.md). Reads the live filesystem on each load.

Prepare run command

Builds the exact claude / codex line to run the orchestrator on a job in your own terminal, under your own logged-in CLI — never via an API key, never inside the container.

Start / stop — the installer (recommended; multi-project)

Running the helper in more than one project at once would collide on host port 4319, the container name, and the Compose project name. The installer _tools/app/install.sh fixes that — it leases a unique port + container/compose name for this project from a durable per-user registry, so several projects' helpers run side by side. From the workflow root:

./_tools/app/install.sh install      # lease + build + up  (idempotent; recommended start)
./_tools/app/restart.sh              # same thing (thin shim over install.sh)
./_tools/app/restart.sh down         # bring THIS project down
./_tools/app/install.sh ls           # list every project + its leased port
./_tools/app/install.sh doctor --check-health   # docker/compose + /health diagnosis
./_tools/app/install.sh release      # return this project's port lease
./_tools/app/install.sh gc           # prune leases for deleted projects

The scripts ship executable; bash _tools/app/install.sh <cmd> is the bit-independent fallback for a vendored/zip copy that lost the execute bit. The script is the deterministic source of truth (port leasing under a lock, .env migration, naming, build + up), is idempotent, runs offline / in CI, and emits one JSON object on stdout. The first install writes a .env with CWAPP_PORT, CWAPP_NAME, and CWAPP_DISPLAY_NAME — all read by docker-compose.yml.

Project name in the header — CWAPP_DISPLAY_NAME is the human project name shown next to the title in the form header (e.g. Intake form - era-ui-kit). It is host-aware: the parent/host project when the workflow is installed as a _code_workflow/ sub-folder, or the repo directory name for a standalone workflow. Leased into .env by install.sh; the server falls back to CWAPP_NAME when it is unset.

Start / stop (manual, single-project)

If you only run one project, bare Compose works from the workflow root:

docker compose up -d        # build + start (http://127.0.0.1:4319/)
docker compose down         # stop
docker compose logs -f      # follow logs

Then open http://127.0.0.1:<port>/ for the form (the Create button, a Dashboard link, and the project name in the header appear automatically when served this way) or /dashboard. <port> is 4319 by default, or whatever install.sh leased (install.sh ls lists it). The stack binds 127.0.0.1:<port>:4319 (never reachable off-host), mounts jobs/ read-write and interface/ + app.md read-only, and runs a /health healthcheck.

Without Docker (needs Node ≥ 18): WORKFLOW_ROOT="$PWD" node _tools/app/server.js from the workflow root.

Driven by an agent too — paste _processes/00_app/app-install.prompt.md into Claude Code (the App install op-card in the form) to run the installer conversationally: it preflights, runs the script, validates /health, diagnoses failures, and recommends app-init. The agent adds judgment only — the script owns all allocation.

The helper is not required for any workflow operation — it only removes manual file-shuffling. Verify it with node _tools/app/test/smoke.test.mjs, node _tools/app/test/parsers.test.mjs, and the installer with node _tools/app/test/install.test.mjs (offline).

Creating a job (run the orchestrator)

Since v0.6 (D-41) the orchestrator is the single main-flow prompt — it creates the job and runs the pipeline. Open a coding-agent session in either supported invocation mode and send the orchestrator prompt path: _processes/02_orchestrator/orchestrator.prompt.md from workflow-internal mode, or _code_workflow/_processes/02_orchestrator/orchestrator.prompt.md from host-root mode. Pasting the full file still works, but the prompt path alone is enough. There is no separate creation prompt anymore.

What the orchestrator picks up

SituationWhat the orchestrator does
Explicit slug / intake path in your promptUses exactly that (resolves furthest-advanced queue first: 3_ongoing/ → 2_ready/ → 1_creation/ → a 0_new/ intake).
Single candidate across 0_new/ / 1_creation/ / 2_ready/ / unlocked 3_ongoing/Uses it silently.
Multiple candidatesLists them (annotated by kind/queue) with one-line previews and asks. Other drafts stay put for later runs.
Everything emptyStops cleanly and tells you.

What the creation/bootstrap step does (for a 0_new intake)

  1. Reads the source file end-to-end.
  2. Infers (or reads) the request type from the closed vocabulary.
  3. Loads the matching preset from _processes/_shared/presets/<type>.md and seeds defaults (including the after_creation gate).
  4. Generates the slug YY-MM-DD-kebab-title — or YY-MM-DD-NNN-kebab-title when the source intake filename starts with a three-digit sequence prefix (010-base.md → 26-07-24-010-base, D-3 as extended by D-76), so an ordered set of intakes keeps its order in the queues (collisions get -2, -3, …).
  5. If Git → Create branch: yes, verifies the worktree is clean and the target branch does not already exist, then creates the branch <type>/<slug> from main. Worktree-dirty or branch-exists is an early refusal — nothing is written, the intake stays in jobs/0_new/ for a re-run.
  6. Writes jobs/1_creation/<slug>/JOB.md (version 0.14) + PROGRESS.md, then seeds root continuity files note.md + key-findings.md.
  7. Moves the source intake into jobs/1_creation/<slug>/00_intake/<source filename> as the last filesystem action (D-28; subfolder renamed from 00_init/ by D-36). The intake travels with the job; 0_new/ is left clean.
The after_creation gate (D-41, default no) — After writing JOB.md, the orchestrator reads after_creation. Default no → it advances the job 1_creation → 2_ready → 3_ongoing and runs the pipeline in the same session, no review pause. Set after_creation: yes to keep the old review checkpoint — the orchestrator then stops in 1_creation/ and you re-run it on the slug once happy. (Revises D-6.)

Reviewing the generated job (only when after_creation: yes)

  1. Open jobs/1_creation/<slug>/JOB.md. Read it end-to-end.
  2. Confirm or correct the inferred request type, the Git options, the stage list, the gate values, the per-stage config.
  3. Resolve every open question the orchestrator surfaced in its chat report. Edit JOB.md directly — you own the mandate.
  4. Read jobs/1_creation/<slug>/PROGRESS.md. Check there are no unresolved blockers.
  5. Re-run the orchestrator on the slug — it advances the job onward through the pipeline.

For non-standard / recovery queue moves, the promote operation agent (_processes/_operations/promote/promote.prompt.md) and a manual mv jobs/1_creation/<slug> jobs/2_ready/<slug> (plain mv, not git mv — job folders are gitignored) remain available, but they are no longer part of the normal new-job path.

Running the orchestrator

Open a coding-agent session in either supported invocation mode and send the orchestrator prompt path: _processes/02_orchestrator/orchestrator.prompt.md from workflow-internal mode, or _code_workflow/_processes/02_orchestrator/orchestrator.prompt.md from host-root mode.

Picking the slug

SituationWhat the orchestrator does
Explicit slug in your promptResolves 3_ongoing/<slug>/ first (resume), then 2_ready/<slug>/ (fresh pickup).
Single candidate across 2_ready/ + unlocked 3_ongoing/Uses it silently.
Multiple candidatesLists them tagged with current queue and asks. Pick any; when you have no preference, choose the oldest ready job.
No candidatesStops cleanly and tells you.

What the orchestrator does on every run

  1. Outside workflow-modification mode, verifies app.md exists and is not the bootstrap placeholder, then reads config.json for runtime availability. Jobs launched from inside _code_workflow/ itself use the D-37 self-hosting bypass for workflow-maintenance work.
  2. Moves the job to 3_ongoing/<slug>/ and writes a .lock marker (D-20).
  3. Reads JOB.md and PROGRESS.md.
  4. Cross-checks the three sources of truth (D-19). Stops on hard disagreements.
  5. Iterates the closed stage order, skipping disabled and already-[x] stages.
  6. For each pending stage: lazily creates the stage's subfolder, dispatches the matching stage prompt (_processes/02_orchestrator/stages/<NN>_<name>.prompt.md, or the brainstorm/review helper prompts) as a sub-agent (D-56), verifies the expected artifact(s) exist, parses the stage's STAGE_HANDOFF, marks PROGRESS.md → Stages [x]. A multi-phase execute is re-dispatched per phase back-to-back within the run (D-42).
  7. Honours every approval gate set to yes — stops, removes .lock, reports.
  8. When every enabled stage is [x], runs the git-landing step (_processes/_shared/git-landing.md, D-63) when the job's ## Git asks — one commit on the job branch (<type>/<slug>: <job title>), and on PR: yes a PR to the resolved PR target branch (blank ⇒ production), gated by before_commit / before_pr, with a remote-aware fallback on non-GitHub remotes or without gh — then moves the folder to 4_done/, removes .lock.
Never does — the orchestrator never edits JOB.md, never merges a PR (since 0.14 it does commit and open the PR when ## Git asks — behind the before_commit / before_pr gates, D-63; merging stays yours), never auto-removes a stale .lock it did not write.

Handling approval gates

Approval gates are yes/no switches in JOB.md → Approval gates. Closed vocabulary:

GateWhen the orchestrator stops
after_creationAfter the creation/bootstrap step writes JOB.md into 1_creation/, before advancing to 2_ready/. Default no (D-41) — the orchestrator normally advances automatically; set yes to review the generated job first, then re-run the orchestrator on the slug.
after_clarifyAfter clarify completes, before any downstream stage. Auto-passes when the clarify report's Verdict is NO_CLARIFICATION_NEEDED — even when set to yes. Every other verdict (READY_AFTER_REVIEW, BLOCKED) honours the gate normally.
after_brainstormAfter brainstorm completes — in dual_consolidate mode after consolidated.md is produced; in solo mode after the single per-agent file is produced.
before_planAfter brainstorm, before plan.
before_executionAfter plan, before execute.
before_commitAt the post-validate git landing (orchestrator §I for pipeline jobs; inline in the action prompts — D-63), immediately before staging + committing; the stop shows the staged-diff summary — and, under Push: yes, states that a push to origin/<branch> will follow (D-82), which makes this stop your last checkpoint before the first write to the shared remote. Only meaningful when Commit: yes.
before_prAt the same git landing, immediately before the PR is opened; the stop shows the generated PR description and the resolved target branch. The job branch is already on the remote by this point (the push runs earlier — D-82). Only meaningful when PR: yes.

When the orchestrator stops at a gate

  1. Updates PROGRESS.md → Current state → Next action with the gate name and the artifact you should review.
  2. Removes .lock.
  3. Reports in chat: gate name, artifact path, the exact command to re-trigger.

To re-trigger after a gate stop: send the orchestrator prompt path again with the explicit slug (the job is in 3_ongoing/, not 2_ready/). The orchestrator detects no .lock, reads PROGRESS.md, sees which stages are [x], and continues from where it stopped.

Mid-stage questions vs. gate stops (D-29) — An approval gate is a deliberate human checkpoint between stages — the orchestrator stops, releases .lock, and waits for you to re-trigger. Approval gates are the only user-visible stop format for the main flow (D-56). A question relay is different and is not a stop: a dispatched stage (e.g. clarify on ambiguity, or the brainstorm consolidate helper) returns Completion: awaiting_user_input so the orchestrator asks you inline via AskUserQuestion, captures answers, and re-dispatches the same stage in the same run. .lock stays in place; you do not re-send the prompt. Decline a question and the orchestrator falls back to the blocker path.

Resuming or extending a job

A job in 4_done/ is re-openable (E-2). There are two distinct patterns for taking finished brainstorm work forward; pick by the rule below.

Pattern X — extend in place

Use when: the brainstorm and the implementation are the same intellectual project. This is the common "I just brainstormed it, now I want to ship it" case.

Send the extend prompt to a fresh coding agent session (D-31) — paste _processes/_operations/extend/extend.prompt.md in workflow-internal mode or _code_workflow/_processes/_operations/extend/extend.prompt.md in host-root mode, per Two invocation modes. The extend operation agent resolves which slug to extend, asks which stages to add, then does the JOB.md surgery and the folder move in one session:

Default added stages are plan,execute,test,document,validate. The agent confirms or accepts overrides (e.g. just plan,execute).

The agent ends with a hint to send _processes/02_orchestrator/orchestrator.prompt.md to another fresh session. The orchestrator reads PROGRESS.md, sees the already-[x] stages, and starts at the next pending one. No manual PROGRESS.md edit is needed (D-8).

What extend does not touch: Type, Preset, the Mandate body, Git, and existing per-stage config blocks. It preserves existing Approval gates except explicit extend-agent gate updates the user confirms, such as before_commit / before_pr.

Pattern Y — spawn a child job

Use when: the brainstorm was a one-off thinking exercise, and the implementation is a separate project that references the prior brainstorm as input. The parent stays in 4_done/ untouched.

  1. Write a new intake file in jobs/0_new/<file>.md referencing the parent's brainstorm:
    # Implement design from <parent-slug>
    
    Type: feature
    
    ## Mandate
    Implement the design produced in `jobs/4_done/<parent-slug>/02_brainstorm/consolidated.md`.
    Read its §3 (Locked design) before planning — that is the spec.
  2. Run the orchestrator on the new intake — its creation/bootstrap step produces a new JOB.md with a fresh slug, feature-preset defaults, and your mandate, then drives the pipeline.
  3. Run the orchestrator as normal.

Rule of thumb

If your fingers reach for "the brainstorm was the first phase of this work" → Pattern X. If they reach for "the brainstorm is a reference for new work" → Pattern Y. When in doubt, X — it's cheaper to extend than to start fresh.

When things go wrong

Stale .lock after a crash

If a previous orchestrator run crashed, .lock will be present in 3_ongoing/<slug>/ even though no run is in flight. The orchestrator never auto-removes a .lock it did not write (C-3 AC4 / R-9). Manual recovery:

rm jobs/3_ongoing/<slug>/.lock

Then re-run the orchestrator. If uncertain whether another session is running, check before deleting.

Status conflict (D-19)

If queue location, PROGRESS.md, and JOB.md disagree in a way the orchestrator cannot reconcile, it stops and records the disagreement in PROGRESS.md → Blockers. Queue is operational truth. Update PROGRESS.md or JOB.md (or move the folder back) to match, then re-run.

Missing or malformed app.md

Every prompt except init verifies app.md exists and is not the bootstrap placeholder when running against a host application. Workflow-maintenance jobs launched from inside _code_workflow/ itself use the D-37 auto-loaded-scope bypass described in CLAUDE.md / AGENTS.md. Primary fix: send _processes/00_app/app-init.prompt.md to a fresh Claude Code session at _code_workflow/. Fallback for non-Claude runtimes: follow the manual port flow in _docs/how-to-port.md, then re-run.

Unknown workflow contract version

The orchestrator and operation agents refuse to run a JOB.md whose Workflow version is not the current contract version (currently 0.14). To migrate an older JOB.md:

Migrating from 0.13 to 0.14 (current target)

The 0.14 bump is D-63: the ## Git contract becomes real end-to-end. The ## Git block gains a fifth line — - PR target branch: <branch name, or blank> — naming the branch the PR merges INTO (blank or absent reads as production; distinct from Base branch, the branch the job branch is cut FROM, default main, and from the header's Target branch, the job branch itself). Commit: yes and PR: yes are now honoured by the shared git landing (_processes/_shared/git-landing.md): pipeline jobs commit (and open the PR) in the orchestrator's §I Completion after the final validate PASS, gated by before_commit / before_pr, with a remote-aware fallback on non-GitHub remotes or without gh; action-layer jobs run the same procedure inline. The workflow never merges a PR. New validity rule: PR: yes requires Commit: yes (the creation/bootstrap step refuses an intake violating it). Later, within 0.15, D-82 grew the block to six lines — adding - Push: yes|no as its fourth line, directly after Commit — making the push a standalone landing step that runs on every remote host instead of only as a sub-step of the GitHub PR path, with PR: yes additionally requiring Push: yes, and off-GitHub PRs surfaced as credential-free PR-creation links from a host table. An absent Push: line resolves by PR (PR: yes ⇒ yes), so pre-D-82 jobs land unchanged and no version bump was required. This is a contract-only, additive migration for all jobs:

Migrating from 0.12 to 0.13

The 0.13 bump is D-61/D-62: the audit request type is reshaped from a read-only action-layer singlet into its own action-layer orchestrator (_processes/03_action/audit/audit.prompt.md, the old path retained as a tombstone), gaining an internal per-kind 3-phase matrix (current-code → global-app → best-practice/web, each Kind declaring which phases it runs), the new revalidate audit Kind (a whole-app/scoped soundness sweep across all concern-types), and an audit-scoped UpdateMode: report | report_fix (default report; report_fix is drop-and-tell — after writing its reports the audit emits one contract-valid Type: feature intake into jobs/0_new/ referencing the audit reports, then stops). Adding a new Kind enum value is a closed-vocabulary change, which is what bumps the contract. This is a contract-only, additive migration for non-audit jobs:

Migrating from 0.11 to 0.12

The 0.12 bump is D-59: review moves to run immediately before validate (new canonical order clarify → brainstorm → plan → execute → test → document → review → validate; validate is the final certification gate). The per-job artifact folders are renumbered to match the new order — review writes 07_review/review-findings.md and validate writes 08_validate/validate-report.md. The review stage gains a bounded code auto-fix carve-out (modeled on validate's), and the orchestrator gains a loop-back engine (a blocked review or failed validate can re-run earlier enabled stages up to a per-job cap, default 3; D-83 later added a second, fail-closed light-fix route for small review blockers — it changes nothing about this migration). Existing finished jobs stay as-is; an active 0.11 job is only migrated if you intend to:

Migrating from 0.10 to 0.11

The 0.11 bump is D-56: the main-flow orchestrator is re-architected from the inline-milestone model (D-40) into a pure-conductor dispatch model — it now dispatches every enabled stage to a standalone prompt under _processes/02_orchestrator/stages/ and writes only the shared job-root state. The handoff schema HELPER_HANDOFF.md is renamed back to STAGE_HANDOFF.md (widened Stage vocabulary + one optional clarify-only field). This migration is a NO-OP:

Migrating from 0.9 to 0.10

The 0.10 bump is D-48: two new documentation action-layer request types — doc_upkeep (validate + update an existing HTML docs folder against the code and the project's documentation UI kit; mandatory target folder) and doc_create (generate a section or full-app HTML docs). Both are shape: orchestrator under _processes/03_action/. (The documentation-UI-kit reference was later moved out of app.md into the committed pointer _processes/03_action/_shared/documentation-webkit.json by D-55.) This migration is additive:

Migrating from 0.8 to 0.9

The 0.9 bump is D-45: action becomes its own layer, not a stage. It is removed from the stage vocabulary (nine → eight); the request type carries a layer/shape in the new registry _processes/_shared/request-types.md; audit becomes a singlet and quick_fix its own parallel-fixer orchestrator under _processes/03_action/; 08_action.milestone.md is retired. First NON-additive migration:

Migrating from 0.7 to 0.8

The 0.8 bump (D-44) added the action stage. Bump the version line and add - [ ] action (disabled) to ## Stages — then apply the 0.8 → 0.9 step above (which removes it again for pipeline jobs; if migrating straight to 0.9, skip the add). Old 4_done/ jobs at 0.7 stay readable (per D-18).

Migrating from 0.5 to 0.6

The 0.6 bump is D-41: the standalone creation agent is folded into the orchestrator, and a new opt-in after_creation approval gate is added (default no). Additive:

Migrating from 0.4 to 0.5

The 0.5 bump bundles D-38 (validate gains a pickable runtime via ### Validate → Agent: claude | codex, default claude, plus an internal code review with a bounded auto-fix carve-out) and D-40 (the main pipeline runs as orchestrator-internal milestones). Mechanical and additive:

Migrating from 0.3 to 0.4

The 0.4 bump is the D-35 folder-rename: job stage subfolders carry a numeric NN_ prefix matching execution order. Mechanical:

Migrating from earlier versions

Apply migrations in order: 0.1 → 0.2 → 0.3 → 0.4 → 0.5 → 0.6 → 0.7 → 0.8 → 0.9 → 0.10 → 0.11 → 0.12 → 0.13 → 0.14. The 0.13 → 0.14 step (D-63) adds the PR target branch line + the shared post-validate git landing — contract-only/additive (bump the version line; an absent field reads as blank ⇒ production); see above. The 0.12 → 0.13 step (D-61/D-62) is the audit singlet → orchestrator reshape + the new revalidate Kind + the audit UpdateMode — contract-only/additive for non-audit jobs; see above. The 0.11 → 0.12 step (D-59) is the review-before-validate reorder + artifact renumber + loop-back engine — see above. The 0.10 → 0.11 step (D-56) is a NO-OP (bump the version line only). The 0.9 → 0.10 step (D-48) is additive (bump the version line; the two new doc types are opt-in). The 0.8 → 0.9 step (D-45) is the first non-additive one — see above. For 0.6 → 0.7: bump the version line; the orchestrator lazily creates note.md + key-findings.md on pickup (no manual file creation). For 0.2 → 0.3: bump the version line; if the job uses ### Brainstorm → Mode: dual_consolidate, add - Consolidator: claude. For 0.1 → 0.2: add - [ ] clarify as the first ## Stages line and - after_clarify: <yes|no> to ## Approval gates; do not add a ### Clarify config block; bump the version line.

Reading the artifacts

A jobs/<queue>/<slug>/ folder, fully populated, looks like:

PathWhat it is
JOB.mdThe scoping contract and mandate. Header fields, then ## Git, ## Stages, ## Approval gates, ## Per-stage config, ## Expected artifacts, then the --- separator and a free-text # Mandate body.
PROGRESS.mdLive workflow state. Current queue, in-flight stage, stage checklist, decisions log, blockers, handoff notes.
note.mdRequired root continuity file for forward-looking downstream notes. Seeded at creation; later updated only by the orchestrator from stage handoffs.
key-findings.mdRequired root continuity file for durable findings with provenance. Seeded at creation; later updated only by the orchestrator from stage handoffs.
.lockPresent only while the orchestrator is mid-run. Never edited by hand.
00_intake/<source filename>The original intake file, moved here by the creation/bootstrap step on success (D-28 / D-41). Eager — present in every job folder from 1_creation/ onward. JOB.md is the canonical mandate clarify may rewrite; 00_intake/ preserves the request as the user originally wrote it.
01_clarify/clarify-report.mdClarify stage artifact (lazy). Starts with a **Verdict:** line the orchestrator reads to decide whether to honour after_clarify.
02_brainstorm/claude.md, codex.md, consolidated.mdBrainstorm artifacts (lazy — dual mode writes all three; solo mode writes only the selected per-agent file).
03_plan/PLAN.mdThe plan artifact (lazy).
04_execution/notes.md, phases/phase-<N>.mdCumulative execute log and per-phase details (lazy; per-phase only when multi-phase).
05_test/notes.mdTest stage artifact (lazy).
06_document/notes.mdDocument stage artifact (lazy).
07_review/review-findings.mdReview stage artifact (lazy; only if review is enabled).
08_validate/validate-report.mdValidation report (lazy).
Re-running overwrites in place — re-running a stage overwrites its artifact in place (D-3 AC1). Git is the version history; there are no PLAN_v2.md files in-tree.