Workflow (state on disk → the phase that comes next)
You do none of the work here. You route. This skill reads where an effort already stands, names the
phase that comes next, and invokes it. Then it does the same again, until it reaches something that
needs a person.
It exists because the lifecycle has eight phases and remembering which one is next is not a good use of
anybody's attention — and because the answer is already written on disk. Every artefact the
lifecycle produces is committed, and the spec's Status: header is a state machine nobody was reading.
Three ways in, all the same thing: the command /lifecycle:advance, the skill lifecycle:workflow,
or just saying "advance" or "what's next" in a sentence.
This repo describes itself in .agents/, at the repository root. Read the files that bind your step,
and treat them as authority over anything you would otherwise assume.
| File |
Answers |
.agents/lifecycle.md |
which phases run, which review lenses are in use, how many rounds each loop gets, how wide a wave may be |
.agents/gates.md |
the commands that must pass, in order, and what "green" means here |
.agents/tracker.md |
where specs and tickets live, and what may be written to the board |
.agents/forge.md |
the git host, and how a branch becomes a reviewed change |
.agents/docs.md |
where architecture truth lives, the glossary, and what "docs are part of done" costs |
.agents/naming.md |
branch, commit, directory and test-name grammar |
.agents/working-agreement.md |
working hours, what may run unattended, how to report, when to stop and ask |
Three rules:
- A missing file is a real answer: that thing is not configured here. Say so in one line and take
the safest reading — do not invent the repo's conventions, and do not fall back on another project's.
If the whole directory is absent, stop and tell the user to run
/onboard instead of guessing.
.agents/ beats your own judgement, and loses to the user. It was written deliberately, so a rule
you disagree with is reported once, not routed around.
- Read only what your step needs. Every line costs on every turn of a long run.
Arguments
| Form |
Means |
/lifecycle:advance |
find the effort, run the next phase, keep going until a gate |
/lifecycle:advance <path> |
the same, for a named spec or effort directory |
/lifecycle:advance --once |
run exactly one phase, then stop and report |
/lifecycle:advance --dry |
say where you are and what is next. Run nothing. |
Start with --dry when you are not sure the state is what you think it is. It costs one turn and it
is the whole point of having the state written down.
Write the command in its namespaced form whenever you name it back to the user — a plugin command is
/<plugin>:<command>, and the bare /advance is an unknown command. Telling somebody to type a command
that does not resolve costs them a round for nothing.
Step 1 — Find the effort
In this order, and say which rule matched in one line:
- A path in the argument. A spec file, or the directory holding one.
- The current branch name.
.agents/naming.md maps a branch to its effort directory.
- The most recently modified effort directory whose spec is neither
Built nor
Superseded by <path>.
- Nothing found → there is no work in flight. Say so and offer
/frame.
Two efforts in flight and no argument is an ambiguity, not a guess. List them with their statuses
and ask which one. Picking the most recent is exactly the wrong move when somebody has just come back to
older work.
Step 2 — Read the state
Read only these. Every one is a fact on disk; none of it is inferred from the conversation, which is
what makes this work in a fresh session.
| Question |
Where the answer is |
| is this repo configured at all? |
does .agents/ exist |
| which phases are even on here? |
.agents/lifecycle.md |
| is there a contract? |
spec.md exists |
| how far has it got? |
the spec's **Status:** header |
| is the contract complete? |
is ## Open absent or empty |
| is there a plan? |
plan.md exists |
| is the plan current? |
its Spec: header matches, and Scouted: is after the last spec commit |
| was the plan checked? |
plan-check.md, and its **Verdict:** line |
| is the work split? |
issues/ populated |
| how much is built? |
each ticket's Status:, the spec's **Wave:**, and git log |
| what has already been decided alone? |
implementation-record.md, ledger.md |
git log outranks your memory and outranks a stale header. A ticket whose commit is on the branch is
done whether or not somebody ticked its box — say so, and fix the header.
Step 3 — The state table
Read top to bottom and take the first row that matches.
| State |
Next phase |
Gate? |
no .agents/ directory |
/onboard |
halt — it interviews you |
.agents/ exists, no effort found |
/frame |
halt — it returns questions |
an effort exists, no spec.md, questions unanswered |
/grill |
halt — it is an interview |
design settled in conversation, no spec.md |
/spec |
continue |
spec.md has a non-empty ## Open |
/grill |
halt — a draft is not a contract |
Status: Specced, no plan.md |
/plan |
continue |
plan.md exists but is stale for its spec |
/plan |
continue |
plan.md current, no plan-check.md |
/plan-check |
continue |
Verdict: Not ready, under the re-plan cap |
/plan |
continue |
Verdict: Not ready, cap reached |
— |
halt — get a person |
Verdict: Ready with changes |
apply them, then /plan-check on what changed |
continue |
Verdict: Ready to build, Status: Specced |
/build |
halt at its go-ahead |
Status: Building |
/build — it resumes itself |
continue |
Status: Built |
— |
halt — name this repo's ship step from .agents/forge.md |
Status: Superseded by <path> |
— |
halt — say so, and offer to advance the spec it names instead |
A phase .agents/lifecycle.md turns off is skipped, and you say you skipped it. That file is the
authority on which phases exist here; a repo that does not use /plan-check should not be told it is
missing one.
A state not in this table is a real finding. Say what you observed, say it does not match a known
state, and stop. Never pick the nearest row. A plan.md beside a spec that says Built, a populated
issues/ with no plan, a Verdict: line you cannot parse — each of those means something happened that
this table does not model, and guessing costs more than asking.
Step 4 — Report, then run
Report before you run, in this shape, so a wrong reading is caught in one line rather than three
phases later:
effort <path> (matched by: branch name)
status Specced
beside plan.md ✓ plan-check.md ✗ issues/ —
next /plan, then /plan-check
halting before /build, to show you the shape
running /plan …
Then invoke the phase as a skill. You are not reimplementing it.
--dry stops here. Report and return.
--once runs this one phase, reports, and returns.
- Otherwise keep going: after a phase completes, go back to step 2 and re-read the state from disk.
Re-read it; do not assume the phase moved it where you expected. A phase that failed halfway leaves
a state the table can route on, and trusting your expectation is how a run marches past a problem.
Step 5 — Halt properly
A halt is a result, not a failure. Say three things and stop:
- where the work now stands — the new status, and the artefact that proves it;
- why you stopped — a human gate, a verdict, a cap, an unknown state;
- the exact next command, or the exact question that needs answering.
halted /build is ready to run but wants one go-ahead on the shape
stands Specced · plan.md + plan-check.md committed · Verdict: Ready to build
next /build (or /advance again — it will offer the same go-ahead)
Never halt silently, and never halt without naming the next move. A driver that stops without saying
why is worse than no driver, because the user now has to work out both where they are and whether
something broke.
What halts a run, in full
- Every interactive phase —
/onboard, /frame, /grill. Their whole value is that a person
answers, and answering for them defeats the purpose.
/build's single go-ahead. It is the one interruption in the unattended half, and it is
deliberate.
- A verdict or a cap —
Not ready twice, a fix loop past its round cap, a failing gate.
- An unknown state, per step 3.
- Outside working hours, where
.agents/working-agreement.md sets them. Run the phase you are on if
somebody is clearly there, then say you are not starting another chain tonight. Do not begin an
unattended chain that will finish with a question nobody is awake to answer.
What this skill must never do
- Never do a phase's work itself. If
/plan is next, invoke /plan. A router that starts planning
is a second planner nobody reviews.
- Never skip a gate because the answer looks obvious. The gates are where the expensive mistakes get
caught.
- Never edit a spec, a plan or a ticket — beyond correcting a status line that
git log contradicts,
which you report in one line.
- Never advance an effort the user did not name when two are in flight.
Dispatching the agents
This skill spawns none. It invokes skills, and those skills dispatch their own agents.
1---2name: workflow3description: Work out where a piece of work already stands and run the phase that comes next — reading the state off disk rather than asking. Advances through the unattended phases in a row and halts at any phase that needs a person. Use when the user says "advance", "next step", "continue", "keep going", "carry on", "what's next", "where are we", "pick up where we left off", or invokes /advance. Also use when resuming work after a break or a fresh session, and when you are unsure which lifecycle phase applies. Keywords - workflow, advance, next step, continue, keep going, carry on, what's next, where are we, resume, pick up, drive it forward, which phase, state of play.4---56# Workflow (state on disk → the phase that comes next)78**You do none of the work here. You route.** This skill reads where an effort already stands, names the9phase that comes next, and invokes it. Then it does the same again, until it reaches something that10needs a person.1112It exists because the lifecycle has eight phases and remembering which one is next is not a good use of13anybody's attention — **and because the answer is already written on disk.** Every artefact the14lifecycle produces is committed, and the spec's `Status:` header is a state machine nobody was reading.1516Three ways in, all the same thing: the command **`/lifecycle:advance`**, the skill **`lifecycle:workflow`**,17or just saying **"advance"** or **"what's next"** in a sentence.1819<!-- shared:repo-config:start source=repo-config.md -->20**This repo describes itself in `.agents/`, at the repository root. Read the files that bind your step,21and treat them as authority over anything you would otherwise assume.**2223| File | Answers |24|---|---|25| `.agents/lifecycle.md` | which phases run, which review lenses are in use, how many rounds each loop gets, how wide a wave may be |26| `.agents/gates.md` | the commands that must pass, in order, and what "green" means here |27| `.agents/tracker.md` | where specs and tickets live, and what may be written to the board |28| `.agents/forge.md` | the git host, and how a branch becomes a reviewed change |29| `.agents/docs.md` | where architecture truth lives, the glossary, and what "docs are part of done" costs |30| `.agents/naming.md` | branch, commit, directory and test-name grammar |31| `.agents/working-agreement.md` | working hours, what may run unattended, how to report, when to stop and ask |3233Three rules:3435- **A missing file is a real answer: that thing is not configured here.** Say so in one line and take36 the safest reading — do not invent the repo's conventions, and do not fall back on another project's.37 If the whole directory is absent, stop and tell the user to run `/onboard` instead of guessing.38- **`.agents/` beats your own judgement, and loses to the user.** It was written deliberately, so a rule39 you disagree with is reported once, not routed around.40- **Read only what your step needs.** Every line costs on every turn of a long run.41<!-- shared:repo-config:end -->4243## Arguments4445| Form | Means |46|---|---|47| `/lifecycle:advance` | find the effort, run the next phase, keep going until a gate |48| `/lifecycle:advance <path>` | the same, for a named spec or effort directory |49| `/lifecycle:advance --once` | run exactly one phase, then stop and report |50| `/lifecycle:advance --dry` | say where you are and what is next. **Run nothing.** |5152**Start with `--dry` when you are not sure the state is what you think it is.** It costs one turn and it53is the whole point of having the state written down.5455**Write the command in its namespaced form whenever you name it back to the user** — a plugin command is56`/<plugin>:<command>`, and the bare `/advance` is an unknown command. Telling somebody to type a command57that does not resolve costs them a round for nothing.5859## Step 1 — Find the effort6061In this order, and **say which rule matched** in one line:62631. **A path in the argument.** A spec file, or the directory holding one.642. **The current branch name.** `.agents/naming.md` maps a branch to its effort directory.653. **The most recently modified effort directory** whose spec is neither `Built` nor66 `Superseded by <path>`.674. **Nothing found** → there is no work in flight. Say so and offer `/frame`.6869**Two efforts in flight and no argument is an ambiguity, not a guess.** List them with their statuses70and ask which one. Picking the most recent is exactly the wrong move when somebody has just come back to71older work.7273## Step 2 — Read the state7475Read only these. **Every one is a fact on disk; none of it is inferred from the conversation**, which is76what makes this work in a fresh session.7778| Question | Where the answer is |79|---|---|80| is this repo configured at all? | does `.agents/` exist |81| which phases are even on here? | `.agents/lifecycle.md` |82| is there a contract? | `spec.md` exists |83| how far has it got? | the spec's `**Status:**` header |84| is the contract complete? | is `## Open` absent or empty |85| is there a plan? | `plan.md` exists |86| is the plan current? | its `Spec:` header matches, and `Scouted:` is after the last spec commit |87| was the plan checked? | `plan-check.md`, and its `**Verdict:**` line |88| is the work split? | `issues/` populated |89| how much is built? | each ticket's `Status:`, the spec's `**Wave:**`, and `git log` |90| what has already been decided alone? | `implementation-record.md`, `ledger.md` |9192**`git log` outranks your memory and outranks a stale header.** A ticket whose commit is on the branch is93done whether or not somebody ticked its box — say so, and fix the header.9495## Step 3 — The state table9697Read top to bottom and take the first row that matches.9899| State | Next phase | Gate? |100|---|---|---|101| no `.agents/` directory | `/onboard` | **halt** — it interviews you |102| `.agents/` exists, no effort found | `/frame` | **halt** — it returns questions |103| an effort exists, no `spec.md`, questions unanswered | `/grill` | **halt** — it is an interview |104| design settled in conversation, no `spec.md` | `/spec` | continue |105| `spec.md` has a non-empty `## Open` | `/grill` | **halt** — a draft is not a contract |106| `Status: Specced`, no `plan.md` | `/plan` | continue |107| `plan.md` exists but is stale for its spec | `/plan` | continue |108| `plan.md` current, no `plan-check.md` | `/plan-check` | continue |109| `Verdict: Not ready`, under the re-plan cap | `/plan` | continue |110| `Verdict: Not ready`, cap reached | — | **halt** — get a person |111| `Verdict: Ready with changes` | apply them, then `/plan-check` on what changed | continue |112| `Verdict: Ready to build`, `Status: Specced` | `/build` | **halt at its go-ahead** |113| `Status: Building` | `/build` — it resumes itself | continue |114| `Status: Built` | — | **halt** — name this repo's ship step from `.agents/forge.md` |115| `Status: Superseded by <path>` | — | **halt** — say so, and offer to advance the spec it names instead |116117**A phase `.agents/lifecycle.md` turns off is skipped, and you say you skipped it.** That file is the118authority on which phases exist here; a repo that does not use `/plan-check` should not be told it is119missing one.120121**A state not in this table is a real finding.** Say what you observed, say it does not match a known122state, and stop. **Never pick the nearest row.** A `plan.md` beside a spec that says `Built`, a populated123`issues/` with no plan, a `Verdict:` line you cannot parse — each of those means something happened that124this table does not model, and guessing costs more than asking.125126## Step 4 — Report, then run127128**Report before you run**, in this shape, so a wrong reading is caught in one line rather than three129phases later:130131```132effort <path> (matched by: branch name)133status Specced134beside plan.md ✓ plan-check.md ✗ issues/ —135next /plan, then /plan-check136halting before /build, to show you the shape137138running /plan …139```140141Then invoke the phase **as a skill**. You are not reimplementing it.142143- **`--dry` stops here.** Report and return.144- **`--once` runs this one phase**, reports, and returns.145- **Otherwise keep going**: after a phase completes, go back to step 2 and re-read the state from disk.146 **Re-read it; do not assume the phase moved it where you expected.** A phase that failed halfway leaves147 a state the table can route on, and trusting your expectation is how a run marches past a problem.148149## Step 5 — Halt properly150151A halt is a result, not a failure. **Say three things and stop:**1521531. **where the work now stands** — the new status, and the artefact that proves it;1542. **why you stopped** — a human gate, a verdict, a cap, an unknown state;1553. **the exact next command**, or the exact question that needs answering.156157```158halted /build is ready to run but wants one go-ahead on the shape159stands Specced · plan.md + plan-check.md committed · Verdict: Ready to build160next /build (or /advance again — it will offer the same go-ahead)161```162163**Never halt silently, and never halt without naming the next move.** A driver that stops without saying164why is worse than no driver, because the user now has to work out both where they are *and* whether165something broke.166167## What halts a run, in full168169- **Every interactive phase** — `/onboard`, `/frame`, `/grill`. Their whole value is that a person170 answers, and answering for them defeats the purpose.171- **`/build`'s single go-ahead.** It is the one interruption in the unattended half, and it is172 deliberate.173- **A verdict or a cap** — `Not ready` twice, a fix loop past its round cap, a failing gate.174- **An unknown state**, per step 3.175- **Outside working hours**, where `.agents/working-agreement.md` sets them. Run the phase you are on if176 somebody is clearly there, then say you are not starting another chain tonight. **Do not begin an177 unattended chain that will finish with a question nobody is awake to answer.**178179## What this skill must never do180181- **Never do a phase's work itself.** If `/plan` is next, invoke `/plan`. A router that starts planning182 is a second planner nobody reviews.183- **Never skip a gate because the answer looks obvious.** The gates are where the expensive mistakes get184 caught.185- **Never edit a spec, a plan or a ticket** — beyond correcting a status line that `git log` contradicts,186 which you report in one line.187- **Never advance an effort the user did not name when two are in flight.**188189## Dispatching the agents190191This skill spawns none. It invokes skills, and those skills dispatch their own agents.