Per-cycle specs and plans stop being git-tracked commit-then-git-rm artefacts and become git-ignored working files: created on disk for the active cycle, read across sessions from the working tree, and shell-rm'd at cycle close by audit. Nothing is committed, so there is no git-history copy — the durable record of a cycle's intent is the design ledger only, and no durable artefact (code, test, doc, ledger) may cite a spec/plan by number or path. - conventions/pipeline/design/README: invert the git-tracked -> git-rm -> git-history-recovery model to gitignored -> shell-rm -> ledger-only. - naming: drop the NNNN file counter; files are slug.md (fieldtest specs keep a fieldtest- prefix as the cycle-close discriminator). - cycle number: separated from the (now-gone) file number, sourced from the feat(NNNN)/audit(NNNN) commit subjects, which cycle commits carry. - specify/planner/fieldtest/fieldtester: no commit step; fieldtest splits fixtures (committed as code) from its spec (gitignored), with the cross-cycle rule that a fieldtest- spec belongs to the next cycle. - boss: auto-sign auditability moves from the (boss-signed) commit subject to the run's reference issue; rollback reverts only code. - audit: new Step 5 shell-rm's the cycle spec+plan after the architect reads them, sparing fieldtest- specs. Companion machine config (outside this repo): the global git excludes (~/.config/git/ignore) gains docs/specs/ and docs/plans/ so the ignore applies to every project at once.
16 KiB
Pipeline
ENTRY PATHS — the selector cascade, walked top to bottom (see boss/SKILL.md)
bug observed ........... debug ........................ implement (mini) # RED-first; FIRST in the cascade
design fork ............ brainstorm -> specify -> plan -> implement
type/signature edit .... compiler-driven -> commit (clean build + suite green unchanged)
-> bounce: specify | tdd (a hole) | debug (suite red)
test-specifiable ....... tdd -> implement (mini) # RED executable-spec -> GREEN
settled prose design ... specify -> plan -> implement
(specify / tdd bounce to brainstorm on a design fork)
(per iteration loop)
|
[cycle close — a loop step, not a milestone close]
|
v
audit --(drift)--> plan + implement (tidy iteration)
--(ratify)-> --update-baseline + ratify paragraph in audit commit body
--(drift-clean)-+
|
[orchestrator: cycle complete? if surface-touch:]
v
fieldtest --(bug)------> debug -> implement (mini)
--(friction)-> brainstorm OR plan (tidy)
--(spec_gap)-> ratify OR tighten ledger
--(clean)----+
|
[orchestrator: surface stable across N cycles?]
v
docwriter
|
v
next cycle
The methodology taxonomy
Development paths differ on two irreducible axes — the first artefact
written, and the correctness oracle. (Error-recovery is not a
third axis: whole-attempt discard is the plugin's universal containment,
not a per-path signature.) The top-level cut — ratified prose intent
before code (spec-driven) vs. machine / test / run oracles — is the hard
boundary; the paths cannot be centralised in one skill, only share the
implement executor as a primitive and the cycle-close audit tail.
| Path | First artefact | Oracle | Bounce-out when |
|---|---|---|---|
| spec-driven | ratified prose spec | human intent, judged at the document | (the deliberate heavy sink) |
| tdd / debug | a RED test | the assertion goes green | not test-specifiable → brainstorm |
| compiler-driven | a type / signature edit | clean build + suite green unchanged | a hole needs a decision → specify (or tdd if it is test-specifiable new behaviour); suite red → debug |
| try-and-error | throwaway code | an observed run | attempt budget exhausted |
try-and-error is deferred — listed for completeness, not yet a
live path. It is an exploration front-end terminating in a tdd-style
handoff, and its attempt tail is structurally unbounded (it can cost
more wall-clock than the spec-driven baseline it is meant to beat, and
its attempt-budget is a magic number the selector cannot derive). Out of
scope until it is given a bounded form.
Cycle vs. milestone
These are two distinct axes, and conflating them is a bug.
- A cycle is one round in the pipeline graph above
(
brainstorm → specify → planner → implement → audit → [fieldtest]). A cycle close is an internal loop step. - A milestone is a tracker container (Gitea milestone, GitHub milestone, Linear project — whatever the project's tracker calls a long-running work scope). A milestone spans potentially many cycles and closes only when the work it promised is complete and functional (see the gate below).
audit runs at cycle close and proves drift-clean — the code
matches the design ledger. It is blind to whether the work is
functional from a downstream consumer's point of view; that is
what fieldtest measures. So no audit result closes a
milestone, and neither does a /boss done-state.
Milestone-close gate
A milestone may be closed in the tracker only when both legs hold:
- Complete — every cycle filed under the milestone is
auditdrift-clean (or its drift explicitly ratified), and the milestone container has no open iterations / issues left. - Functional — the milestone fieldtest has run its
curated end-to-end scenarios against the milestone's promise
and its status roll-up is
clean: every scenario demonstrably delivers what the milestone promised; no openbugfindings;friction/spec_gapfindings resolved or ratified into the design ledger. Acleanroll-up is honoured only with positive evidence the test actually ran — at least 2 examples in the working tree (examples_added). Acleanwith fewer, over a milestone that touched user-visible surface, is itself aspec_gap, not a clean close (the agent owes the same floor —fieldtest/agents/fieldtester.md"What you DO NOT ship"; the gate verifies it rather than trusting the roll-up). The empty report is valid only when no example was applicable.
The milestone fieldtest is the milestone-wide variant of the
fieldtest skill: the same fieldtester agent, a carrier scoped
to the milestone's promise rather than one cycle's surface. Its
scenarios are chosen top-down from what the milestone as a whole
promised, not assembled as the union of per-cycle axes.
A milestone whose entire scope is internal (no user-visible surface) is exempt from the functional leg — the milestone fieldtest is not applicable and the complete leg suffices.
This gate defines when a milestone is closeable. The actual
close stays a deliberate human / orchestrator act — the
tracker's own milestone-close action (on Gitea, tea milestone close); no skill performs it automatically.
Phase descriptions
brainstorm
Optional discovery front-end. Enumerates the cycle's load-bearing design
forks, then — instead of a serial interview — populates them with a parallel
swarm of grounded, genuinely-opposed synthetic-user stances and triages the
result: a fork the swarm settles on a cited shared ground was derivable and
is decided (the user vetoes); a fork it splits on, or agrees on with no citable
ground, is a direction fork the user settles. The orchestrator authors the 2-3
approaches from the populated space (never the swarm) and hands the ratified
design to specify (it writes no spec itself). A fire-check skips the swarm
when there are too few forks or the project is below a grounding floor
(greenfield, no ledger to cite against), falling back to a direct interview.
Skipped entirely when the design is already settled in the sources — that work
enters through specify directly. Under /boss the swarm runs autonomously:
convergent forks are decided and recorded on the reference issue, only a
divergent direction fork (or a sub-floor greenfield design) bounces to the
user.
specify
Hard-gate before plan — the spec-production core and the carrier of the
"no plan without an approved spec" invariant. Takes a settled design
(directly from sources, or a ratified design handed over by
brainstorm), applies the feature-acceptance criterion, writes the
spec to docs/specs (an ephemeral active-cycle working file —
git-ignored, never committed, shell-rm'd at cycle close — see
conventions.md § Lifecycle), runs
the grounding-check gate, and takes sign-off — with review but no
interview. Under the bold stance it decides every load-bearing fork it
can derive an answer for and records the decision in the run's
reference issue; it bounces to brainstorm only when a fork hangs on a
pure user preference no source settles. A core node — the spec-production
gate before planner on every design path.
Outside /boss the sign-off is the user's. Under /boss the autonomous
signature is the grounding-check PASS itself: an independent
fresh-context agent's verdict against currently-green tests, not the
orchestrator's confidence. On PASS the orchestrator keeps the signed
spec as a git-ignored working file (never committed), records the
autonomous sign on the run's reference issue, fires the vetoable
auto-sign notify, and continues to planner; a no-override grounding
BLOCK / INFRA_ERROR
routes to the human sign-off pause. The former obligatory five-lens
spec-skeptic panel is retired (baseline tag pre-autosign-rework):
the judgement it applied now lives upstream in Step 1.5's bold-decide
stance, and spec-skeptic survives only as the optional ad-hoc
bias-breaker the orchestrator pulls when unsure whether its leaning on a
fork is judgement or bias. Editorial roughness the panel would have
caught is let through deliberately — cheap to patch inline downstream.
See ../specify/SKILL.md Step 6 and ../boss/SKILL.md §"Spec auto-sign".
planner
Hard-gate before implement. Produces a placeholder-free,
bite-sized implementation plan in docs/plans (an ephemeral,
git-ignored working file, shell-rm'd alongside the spec at cycle
close — see conventions.md § Lifecycle) that the implement skill can
execute task-by-task. Dispatches
the plan-recon agent for read-only file-structure mapping.
implement
Runs the implement-loop Workflow (implement/workflows/implement-loop.js),
a deterministic script that executes the per-task loop —
implementer → spec-compliance → quality, each a separate
agent() call — and aggregates the verdicts in code. A Workflow
orchestrates from the top level, so the per-task phases are real,
independently-invokable agent calls; this retired the former
implement-orchestrator agent's inline-role-switch workaround
(the four phase agents survive as the agent-types the script
dispatches). Writes code, tests, and stats files directly in the
working tree as unstaged changes; never commits. On PARTIAL or
BLOCKED, also writes BLOCKED.md at the repo root.
compiler-driven
The lighter executor for a behaviour-preserving type/signature
edit at a definition site — the cascade arm between debug and
tdd. Runs the compiler-driven-edit Workflow
(implement/workflows/compiler-driven-edit.js): make the edit,
propagate it mechanically across the sites the build enumerates,
then let a real build + suite run settle the verdict —
observe-then-bounce. Clean build AND suite green unchanged →
the edit is committed by the orchestrator; a hole that forces a
design decision → bounce to specify (or tdd if it turns out to be
test-specifiable new behaviour, per the straddle rule); the suite not
green-unchanged (a regression — the edit was not behaviour-preserving)
→ bounce to debug, RED-first. A truly trivial edit may run inline
without the
workflow, under the same done-signal. Never skips the
review-and-commit discipline; the orchestrator inspects and commits.
audit
Runs at cycle close. Dispatches the architect agent (read-only
drift review against the design ledger) and the bencher agent
(regression diagnostics). Reports drift and regress. Once it is
drift-clean, the orchestrator discards the cycle's spec and plan with a
plain shell rm (nothing to git rm — they were never committed),
sparing any fieldtest--prefixed spec (it belongs to the next cycle);
the cycle-close commit contains only code and ledger changes (see
conventions.md § Lifecycle).
debug
Runs whenever a bug is observed. RED-first: produces a failing test in the working tree before any fix is attempted. Hands off the GREEN side to the implement skill in mini mode.
tdd
A standard alternative entry, alongside brainstorm → specify → planner,
for work whose desired behaviour is test-specifiable — expressible
as one failing test. RED-first: the tdd-author agent turns a
description or issue into a single minimal, autonomous RED
executable-spec ("how it should work"), then hands the GREEN side
to implement in mini mode, exactly as a bug fix. When the
behaviour is not test-specifiable (a genuine design fork surfaces),
or two decomposition rounds fail, it bounces back to brainstorm.
When one iteration cannot reach GREEN, the headline test is carved
into a ladder of BLOCKER sub-tests, each its own RED→GREEN
mini-cycle. Distinct from the per-task TDD the implementer already
practices inside implement.
fieldtest
Optional. Orchestrator-dispatched after the audit closes clean on a cycle that touched user-visible surface. Picks 2-4 real- world tasks within the cycle's scope, implements them using only the design ledger and public examples (never the language's own implementation), runs the results, and writes a friction- and-bug spec.
docwriter
Optional. Orchestrator-dispatched after API surface has stabilised across multiple cycles. Brings docstrings up to a level where a newcomer can navigate the public API without reading the design ledger first.
Status protocol
Agents return one of these terminal states:
| State | Meaning |
|---|---|
DONE |
Task complete; no concerns. |
DONE_WITH_CONCERNS |
Task complete; flagged issues the orchestrator should weigh before committing. |
PARTIAL |
Task partially complete; the rest is blocked or out-of-scope. Writes BLOCKED.md. |
BLOCKED |
Task cannot proceed; explanation in report. Writes BLOCKED.md. |
NEEDS_CONTEXT |
Task cannot proceed without additional information from the orchestrator. |
Reviewer agents have role-specific states:
| Role | States |
|---|---|
| spec-reviewer | compliant / non_compliant / unclear / infra_blocked |
| quality-reviewer | approved / changes_requested / infra_blocked |
Skip rules
Skipping is codified per skill, not ad hoc. Each SKILL.md
documents what the skill skips and under what conditions:
specifyis never skipped at cycle start — it is the spec-production gate beforeplanner.brainstormis the optional discovery stage before it: skipped when the design is already settled in the sources (the work enters throughspecifydirectly), run when a load-bearing decision is still open.planneris never skipped at iteration start, except for the side paths that carry no prose plan: the bug-drivendebug → implement (mini)path and thecompiler-drivenpath (whose "plan" is the type-checker's enumeration of edit sites).implementis the iteration body; not skippable.auditis mandatory at cycle close.debugis mandatory RED-first for any observable bug — first in the selector cascade, so a mechanical-looking fix cannot bypass it.tddis a standard alternative entry tobrainstormfor test-specifiable work; it bounces back tobrainstormon a design fork. Always available — not opt-in.compiler-drivenis the cascade arm for a behaviour-preserving type/signature edit: it skipsspecifyandplanner, and its done-signal (clean build + suite green unchanged) is the gate. It bounces on a hole tospecify(a design choice) ortdd(discovered test-specifiable new behaviour), and todebugon a regression. Always available — not opt-in.fieldtestanddocwriterare optional and orchestrator- dispatched.
If a skill's body says it must run and the orchestrator wants to skip it, the orchestrator records the reason in the relevant commit body — never as undocumented practice.
Pipeline configuration
There is none. The phase set, the gates, and the conditional
dispatch shown above are fixed — the same for every project. All
phases (brainstorm, specify, planner, implement, audit,
debug, tdd, fieldtest, docwriter) are always available; which
ones run on a given iteration is the orchestrator's judgement per the
skip rules above, not a per-project setting. There is no behavioural
toggle either: spec auto-sign is always on under /boss. See
conventions.md.
If a project declares a glossary in its CLAUDE.md project facts, that
file is standing reading for every role — the canonical-nomenclature
source every skill and agent consults (see glossary-convention.md).