docs(pipeline): single-source the milestone-close gate
Define the cycle/milestone distinction and the complete-and-functional close gate once in pipeline.md; rename audit's cycle-close edge to drift-clean so it no longer reads as a milestone close.
This commit is contained in:
+51
-2
@@ -7,12 +7,12 @@
|
|||||||
brainstorm -> plan -> implement debug -> implement (mini)
|
brainstorm -> plan -> implement debug -> implement (mini)
|
||||||
(per iteration loop)
|
(per iteration loop)
|
||||||
|
|
|
|
||||||
[cycle close]
|
[cycle close — a loop step, not a milestone close]
|
||||||
|
|
|
|
||||||
v
|
v
|
||||||
audit --(drift)--> plan + implement (tidy iteration)
|
audit --(drift)--> plan + implement (tidy iteration)
|
||||||
--(ratify)-> --update-baseline + ratify paragraph in audit commit body
|
--(ratify)-> --update-baseline + ratify paragraph in audit commit body
|
||||||
--(clean)-+
|
--(drift-clean)-+
|
||||||
|
|
|
|
||||||
[orchestrator: cycle complete? if surface-touch:]
|
[orchestrator: cycle complete? if surface-touch:]
|
||||||
v
|
v
|
||||||
@@ -29,6 +29,55 @@
|
|||||||
next cycle
|
next cycle
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 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 → 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:
|
||||||
|
|
||||||
|
1. **Complete** — every cycle filed under the milestone is
|
||||||
|
`audit` drift-clean (or its drift explicitly ratified), and
|
||||||
|
the milestone container has no open iterations / issues left.
|
||||||
|
2. **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 open
|
||||||
|
`bug` findings; `friction` / `spec_gap` findings resolved or
|
||||||
|
ratified into the design ledger.
|
||||||
|
|
||||||
|
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 (`tea
|
||||||
|
milestone close`, or the tracker equivalent); no skill performs
|
||||||
|
it automatically.
|
||||||
|
|
||||||
## Phase descriptions
|
## Phase descriptions
|
||||||
|
|
||||||
### brainstorm
|
### brainstorm
|
||||||
|
|||||||
Reference in New Issue
Block a user