task-pipeline-skill 1.96.0 → 1.98.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +90 -0
- package/HOW-IT-WORKS.md +17 -13
- package/README.md +23 -17
- package/SKILL-CARD.md +2 -2
- package/cursor/rules/task-pipeline.mdc +33 -21
- package/evals/task-pipeline.evals.json +3 -3
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +2 -2
- package/plugins/task-pipeline/commands/task-pipeline.md +14 -219
- package/plugins/task-pipeline/skills/evidence-docs/SKILL.md +8 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/GENERATED.md +1 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/learned.md +24 -1
- package/plugins/task-pipeline/skills/evidence-docs/references/retrospective.md +21 -576
- package/plugins/task-pipeline/skills/project-audit/SKILL.md +8 -1
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +162 -230
- package/plugins/task-pipeline/skills/task-pipeline/graph.schema.json +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +9 -9
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +10 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +3 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/browser.md +48 -11
- package/plugins/task-pipeline/skills/task-pipeline/references/build.md +7 -7
- package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +49 -44
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +32 -24
- package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/finish-line.md +13 -8
- package/plugins/task-pipeline/skills/task-pipeline/references/iteration.md +20 -23
- package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +5 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +24 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +17 -7
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +47 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +5 -4
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md +39 -25
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md +3 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/stage-08-post-deploy.md +3 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +34 -22
- package/plugins/task-pipeline/skills/task-pipeline/references/tdd.md +3 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/waves.md +6 -4
- package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +77 -21
- package/plugins/task-pipeline/skills/task-pipeline/scripts/retro_budget.py +305 -0
- package/plugins/task-pipeline/skills/task-pipeline/scripts/short_path.py +70 -0
- package/plugins/task-pipeline/skills/task-pipeline/scripts/waves.py +22 -10
- package/plugins/task-pipeline/skills/task-pipeline/templates/browser-claims.json +5 -5
- package/plugins/task-pipeline/skills/task-pipeline/templates/canvas.md +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro-archive.md +9 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +10 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: task-pipeline
|
|
3
|
-
description: "Use when work changes the repository
|
|
3
|
+
description: "Use when work changes the repository: feature, fix, bug, refactor, migration, integration, audit, PR review; фича, фикс, баг, рефактор, миграция, интеграция, аудит. Runs a substantial task through gated stages, intake grill to docs/wiki and acceptance; a small change takes a short path. 'waves'/'волнами' closes the board. Not for questions or one-line edits; 'без пайплайна' opts out."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: "Doctrine runs on any agent. The bundled scripts need python3; the run needs git. Missing either degrades, never blocks — the graph verbs and seeded gates go unused, and the run says so."
|
|
6
6
|
---
|
|
@@ -8,234 +8,171 @@ compatibility: "Doctrine runs on any agent. The bundled scripts need python3; th
|
|
|
8
8
|
# task-pipeline
|
|
9
9
|
|
|
10
10
|
Self-contained orchestrator. Runs a task through **gated stages**, each carrying its
|
|
11
|
-
own built-in doctrine
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
[`
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
**resume** point
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
the
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
`references/
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
as the NAMED check that was not done, never as a failed task.
|
|
81
|
-
|
|
82
|
-
**The grill is built in and mandatory** (`references/grill.md`). No "clear enough task"
|
|
83
|
-
exemption and no stage 1 without a committed, operator-confirmed brief. It produces the
|
|
84
|
-
**REQ spine** — the request as an addressable list, each row naming how it is verified —
|
|
85
|
-
which stages 3–5 trace to, stage 4 set-compares against, and **stage 10 accounts for
|
|
86
|
-
every one of**, turning the pipeline from a funnel into a circle.
|
|
87
|
-
|
|
88
|
-
**Harvest before you ask** (`references/knowledge-sources.md`). Stage 0 opens by
|
|
89
|
-
pulling what the project already knows about *this* task, writes the source ledger
|
|
90
|
-
into the brief, and then interviews **against** it — so the operator outranks any
|
|
91
|
-
document, **but only out loud**, and an override is a recorded decision rather than
|
|
92
|
-
an undetected divergence. That ledger is also stage 9's work list. Which sources,
|
|
93
|
-
and the two ways the retro is read — standing instructions in full because they
|
|
94
|
-
bind this run, the log queried because nothing caps it — are in
|
|
95
|
-
`references/knowledge-sources.md` and `references/retrospective.md`.
|
|
96
|
-
|
|
97
|
-
**Three artifacts close a run, not two — and they are a convergence, not a sequence.**
|
|
98
|
-
Stage 9 syncs the docs, the wiki **and the code graph**; none consumes another, and the
|
|
99
|
-
**graph↔docs divergence check is the gate over their convergence** — the only thing
|
|
100
|
-
comparing two of the three against each other, so it is not optional where a graph
|
|
101
|
-
exists. A stale graph is a false premise **carrying the authority of a machine**
|
|
102
|
-
(`references/knowledge-graph.md`, `references/audit.md`).
|
|
103
|
-
|
|
104
|
-
**Documentation is a deliverable, and it has a gate** (`references/documentation.md`).
|
|
105
|
-
Stage 0 answers the four questions that make docs a *system* into `docs/DOCMAP.md`;
|
|
106
|
-
from then the **Doc Loop** fires whenever anything is settled, at **any** stage rather
|
|
107
|
-
than only at stage 9, the stage-9 sweep walks the **propagation matrix** — the harvest
|
|
108
|
-
ledger names what you *read*, the matrix names what you *owe* — and *"docs in sync"*
|
|
109
|
-
becomes a command with an exit code.
|
|
11
|
+
own built-in doctrine; no companion plugin is required. No stage advances until its
|
|
12
|
+
gate passes, and the whole run uses one model, confirmed before it starts.
|
|
13
|
+
|
|
14
|
+
**Proportional, then autonomous.** Stage 0 is a **gap check** before it is an
|
|
15
|
+
interview: the brief is built from the request, the files and the harvest, and a
|
|
16
|
+
question is asked only for a **material unknown** the sources cannot answer. A
|
|
17
|
+
complete brief yields ZERO intake questions; what the request or the project already
|
|
18
|
+
decided is recorded, never re-negotiated. When the change is also small (R1 risk, at most five
|
|
19
|
+
files, no public contract, no user-facing change, no deploy), the run **takes the short
|
|
20
|
+
path by default** and says so in one line: brief in the run ledger, build with tests,
|
|
21
|
+
one verification, docs and handoff, a retro entry only for a new lesson
|
|
22
|
+
([`references/stage-00-intake.md`](references/stage-00-intake.md) → Phase 1d, which
|
|
23
|
+
also names the triggers that bring a skipped stage back). Anything larger runs the
|
|
24
|
+
full flow, with the interview, where gaps remain, as ONE batch that pre-resolves
|
|
25
|
+
stages 1→10: every MATERIAL question skipped at stage 0 comes back as an interruption
|
|
26
|
+
later.
|
|
27
|
+
|
|
28
|
+
**Config contract: [`pipeline.schema.json`](pipeline.schema.json).** A pipeline is an
|
|
29
|
+
ordered list of stages, each with `skills[]` and a `gate {type, check}`; the schema
|
|
30
|
+
imposes no stages, skills or gate assignments.
|
|
31
|
+
[`pipeline.example.json`](pipeline.example.json) is the copy-and-rewrite example of
|
|
32
|
+
this plugin's default flow (stage 0 plus the 1→10 stages below) and an optional
|
|
33
|
+
`release` block.
|
|
34
|
+
|
|
35
|
+
**Two layers, and only one is replaceable.** The **KERNEL** is what every unit of
|
|
36
|
+
work carries in any pipeline: its **scope**, its **evidence**, its **deps** and a
|
|
37
|
+
**resume** point. The kernel is invariant. The **PROFILE** is the stage list, and a
|
|
38
|
+
project replaces it wholesale. **The stage numbers belong to the SELECTED profile,
|
|
39
|
+
never to the kernel:** a minimal three-stage profile has no "stage 7", and a rule
|
|
40
|
+
keyed on a global stage number is a rule about the default profile. A custom profile
|
|
41
|
+
may drop stages, never a kernel field. Each gate has a **type**: `auto` (the orchestrator verifies the
|
|
42
|
+
`check`), `judgment` (a named judge rules, recorded as judgement, never as a
|
|
43
|
+
measurement; `references/gates.md` → *The judgment gate*) or `manual` (an explicit go).
|
|
44
|
+
**The
|
|
45
|
+
default profile's gates are `auto`; a gate is `manual` only where the operator's
|
|
46
|
+
`pipeline.json` says so, and a standing operator authorization naming the act counts
|
|
47
|
+
as the go.** In `skills[]`, `task-pipeline:<name>` is this skill's own doctrine
|
|
48
|
+
(`references/<name>.md`) and `host:<name>` the host project's own command
|
|
49
|
+
(`references/conventions.md`).
|
|
50
|
+
|
|
51
|
+
## Prerequisites: none required
|
|
52
|
+
|
|
53
|
+
Every stage's doctrine ships inside this skill, and **no stage blocks on an install**:
|
|
54
|
+
stage 1 falls back to web search, the wiki and the code graph are recommendations.
|
|
55
|
+
Which reference owns which stage:
|
|
56
|
+
[`references/doctrine-map.md`](./references/doctrine-map.md). **Precedence:** on a
|
|
57
|
+
CUSTOM profile the **kernel wins**; `references/stages.md` is the **default
|
|
58
|
+
profile's** normative gate set; the kernel is normative for all; another skill set on stages 2/4/5/6 is
|
|
59
|
+
`references/companion-skills.md`.
|
|
60
|
+
|
|
61
|
+
**super-ux is the preferred provider for ANY user-facing task**, and **the stage-3
|
|
62
|
+
gate checks the ARTIFACT, not the package**: valid scenarios covering the change, from
|
|
63
|
+
super-ux, an equivalent provider or the inline fallback in
|
|
64
|
+
`references/companion-skills.md`, pass. The ABSENCE of any scenario artifact stops the
|
|
65
|
+
gate; a missing tool is reported as the NAMED check that was not done, never as a
|
|
66
|
+
failed task.
|
|
67
|
+
|
|
68
|
+
**The grill is built in** (`references/grill.md`) and produces the **REQ spine**: the
|
|
69
|
+
request as an addressable list, each row naming how it is verified, which stages 3–5
|
|
70
|
+
trace to and **stage 10 accounts for every one of**. **Harvest before you ask**
|
|
71
|
+
(`references/knowledge-sources.md`): stage 0 pulls what the project already knows,
|
|
72
|
+
writes the source ledger, and checks every answer against it; the operator outranks a
|
|
73
|
+
document **but only out loud**.
|
|
74
|
+
|
|
75
|
+
**Three artifacts close a run and they converge:** stage 9 syncs the docs, the wiki
|
|
76
|
+
and the code graph, and the graph↔docs divergence check is the gate over them where a
|
|
77
|
+
graph exists (`references/knowledge-graph.md`). **Documentation is a deliverable with a
|
|
78
|
+
gate** (`references/documentation.md`): `docs/DOCMAP.md`, the Doc Loop at any stage,
|
|
79
|
+
the propagation matrix at stage 9, and *"docs in sync"* as a command with an exit code.
|
|
110
80
|
|
|
111
81
|
**The run teaches the next run, and the list stays short**
|
|
112
|
-
(`references/retrospective.md`).
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
triggers and what an entry must carry are in `references/retrospective.md`; why
|
|
119
|
-
the order cannot be swapped is `references/learned.md` rule 21.
|
|
120
|
-
|
|
121
|
-
Stage 0 reads those standing instructions in full, which is why the prune is a gate
|
|
122
|
-
criterion: a rule nobody reads to the end is worse than no rule, because everyone
|
|
123
|
-
believes it is covered.
|
|
124
|
-
|
|
125
|
-
**At stage 0, read [grill.md](references/grill.md)** for domain awareness
|
|
126
|
-
(`CONTEXT.md` / ADRs; write resolved terms back), the autonomy sweep (pre-resolve
|
|
127
|
-
stages 1→10), and the Figma design destination (file and team per surface, settled
|
|
128
|
-
before drawing, never invented by the drawing agent).
|
|
82
|
+
(`references/retrospective.md`). Stage 10's last act, **in this order and the order is
|
|
83
|
+
load-bearing**: stamp the run, then prune, then write the entry (`references/learned.md`
|
|
84
|
+
rule 21). The floor stage 0 reads in full (standing instructions plus run stamps) has
|
|
85
|
+
a **byte budget**: `scripts/retro_budget.py check` prints its bytes and bytes/4 tokens
|
|
86
|
+
at stage 0, and gate 10 fails over budget until `migrate` moves the narrative to the
|
|
87
|
+
archive, verbatim and hash-proved.
|
|
129
88
|
|
|
130
89
|
## How to run
|
|
131
90
|
|
|
132
|
-
1. Restate the task in one line
|
|
133
|
-
**
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
it is **absent, the mode is off**; recommend it in one line and move on.
|
|
146
|
-
Silence arms nothing, and the mode never collapses a `manual` gate.
|
|
147
|
-
2. **Run stage 0 — always, no exceptions.** It opens with the **knowledge harvest**
|
|
148
|
-
(`references/knowledge-sources.md`): query the project's own sources — repo docs,
|
|
149
|
-
ADRs, `docs/ux/`, past briefs, the wiki if installed, any doc repo the project
|
|
150
|
-
names — for this task's terms, and write the **source ledger** into the brief
|
|
151
|
-
before question one. Then grill until shared
|
|
152
|
-
understanding is reached, **each answer checked against the harvest**, the
|
|
153
|
-
autonomy sweep is covered, **the REQ table is
|
|
154
|
-
written (one row per independently verifiable deliverable, each naming its
|
|
155
|
-
check)** and the brief is locked
|
|
156
|
-
(`references/stage-00-intake.md`). Do not touch stage 1 before the brief is
|
|
157
|
-
committed and confirmed. **Entered from super-ux?**
|
|
158
|
-
(a validated `docs/ux/` chain and/or a `docs/ux/plans/…` fix plan already
|
|
159
|
-
exists — super-ux's `/ux` hands off here) → don't re-grill or rebuild the UX
|
|
160
|
-
chain: just check it's OK (`/ux-lint` green), confirm scope in one line, and
|
|
161
|
-
skip ahead to the first stage with real work (see `references/stage-00-intake.md`).
|
|
162
|
-
3. Walk stages 1→10 on the model confirmed at preflight. **Don't re-ask about the
|
|
163
|
-
model at every boundary** — only when the operator recorded a per-stage override
|
|
164
|
-
map and the next stage's entry differs (`references/model-tiering.md`).
|
|
91
|
+
1. Restate the task in one line, track each stage from 0 (host task tool or a prose
|
|
92
|
+
checklist, for resume), then emit the **preflight block** once: the model decision
|
|
93
|
+
(`references/model-tiering.md`: recommend the most capable model as advice, the
|
|
94
|
+
operator confirms or overrides, the choice — inherited verbatim by plan, stages and
|
|
95
|
+
subagents), the run mode (`pipeline.json` → `run.loop`,
|
|
96
|
+
`references/continuity.md`; absent means off, and the mode never collapses a
|
|
97
|
+
`manual` gate) and the optional companions: super-ux for UI tasks, context7,
|
|
98
|
+
wiki-update, graphify (`references/companion-skills.md`).
|
|
99
|
+
2. **Run stage 0.** Harvest, then the gap check, then the proportional decision
|
|
100
|
+
(`references/stage-00-intake.md`). **Entered from super-ux** (a validated
|
|
101
|
+
`docs/ux/` chain or a `docs/ux/plans/…` fix plan exists)? Check `/ux-lint` green,
|
|
102
|
+
confirm scope in one line and skip to the first stage with real work.
|
|
103
|
+
3. Walk the stages on the model confirmed at preflight; don't re-ask it per stage.
|
|
165
104
|
**The SELECTED profile is compiled once, at preflight, and only ITS declared
|
|
166
|
-
stages and gates run
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
the
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
types and generic loop flags cannot supply that authority (`references/continuity.md`).
|
|
191
|
-
5. **The cross-cutting rules fire at any stage**, not only here — the Doc Loop, the
|
|
192
|
-
loop guard, the audit's exit, the finish line, the frozen REQ list, the carry-over
|
|
193
|
-
ledger, and what counts as evidence, and **every gate prints `holds: N`** — what this run left
|
|
194
|
-
running, across all eight classes, enumerated by class and never by a single
|
|
195
|
-
tool — and stage 10 does not close while this run's residue is live and
|
|
196
|
-
unaccounted (`references/residue.md`). The rest are in
|
|
105
|
+
stages and gates run**: a custom profile with three stages runs three, and no
|
|
106
|
+
hidden stage 0, 7 or 10 is injected. What a custom profile does NOT escape is the
|
|
107
|
+
KERNEL: dropping stages never drops the evidence gate. And an unknown MANDATORY
|
|
108
|
+
capability blocks the compile: a `must_understand` capability this runtime lacks is
|
|
109
|
+
refused, never run with the capability silently absent. **A platform rather than a change?** Stage 2 cuts it into modules
|
|
110
|
+
(`references/decomposition.md`) and stages 3→10 run per module
|
|
111
|
+
(`references/stages.md` → *The program loop*). **The whole board?**
|
|
112
|
+
`/task-pipeline waves` (`references/waves.md`). **Releases:**
|
|
113
|
+
`references/iteration.md`; findings are triaged when found, and the iteration stops
|
|
114
|
+
at its finish line: exit checks green on the artefact and one round with no new
|
|
115
|
+
blocking finding (two for an R3 or flagship node), or the budget spent
|
|
116
|
+
(`references/finish-line.md`).
|
|
117
|
+
4. Do **not** advance until the stage **gate** passes (`references/stages.md`). For
|
|
118
|
+
`auto`, verify the `check` yourself; for `judgment`, record the ruling as judgement;
|
|
119
|
+
for `manual`, cite the operator's go or the standing authorization naming this act.
|
|
120
|
+
**Loops stop:** an R1 node certifies with one blind tier and a clean round ends a
|
|
121
|
+
node unless it is R3 or flagship; the certification ceiling parks the node with its
|
|
122
|
+
evidence and moves on; no tier re-runs on unchanged input; the review loop caps at
|
|
123
|
+
three rounds (`references/certification.md`, `references/loop-guard.md`).
|
|
124
|
+
5. **Cross-cutting rules fire at any stage** (the Doc Loop, the loop guard, the
|
|
125
|
+
audit's exit, the finish line, the frozen REQ list, the carry-over ledger, and
|
|
126
|
+
what counts as evidence), and every gate prints `holds: N` across all eight residue
|
|
127
|
+
classes; stage 10 does not close while this run's residue is live
|
|
128
|
+
(`references/residue.md`). Their long form is
|
|
197
129
|
[`references/gates.md`](references/gates.md) → *Cross-cutting, at every stage*.
|
|
198
130
|
|
|
131
|
+
## What to read, and when
|
|
132
|
+
|
|
133
|
+
At entry read **this file only**; its stage table below is the stage index. Each
|
|
134
|
+
stage's detail is read **when that stage starts** (`references/stages.md` routes it,
|
|
135
|
+
one section at a time; never preload all details). The rest loads on its trigger:
|
|
136
|
+
|
|
137
|
+
| Reference | Read when |
|
|
138
|
+
|---|---|
|
|
139
|
+
| `references/grill.md` | the gap check leaves a material unknown |
|
|
140
|
+
| `references/knowledge-sources.md` | a source needs more than its ledger row: the code graph, the wiki, a lesson store, a carried-in claim, a stale row |
|
|
141
|
+
| `references/companion-skills.md` | a user-facing task (the provider rule), a substituted skill set, or a companion is missing |
|
|
142
|
+
| `references/continuity.md` | `run.loop` is armed, a context-budget signal arrives, or a run resumes |
|
|
143
|
+
| `references/model-tiering.md` | the operator overrides the model, or a stage map differs |
|
|
144
|
+
| `references/gates.md` | you write or change a check, a gate's verdict is disputed, or a judgment gate runs |
|
|
145
|
+
|
|
199
146
|
## Stages (gates and routes in `references/stages.md`)
|
|
200
147
|
|
|
201
|
-
All stages run on the **one model confirmed at preflight
|
|
202
|
-
capable available — see `references/model-tiering.md`).
|
|
148
|
+
All stages run on the **one model confirmed at preflight**.
|
|
203
149
|
|
|
204
150
|
| # | Stage | Gate | Type |
|
|
205
151
|
|---|---|---|---|
|
|
206
|
-
| 0 | Intake grill — **mandatory** | source ledger written with its `Contradictions:` line; `docs/DOCMAP.md` answered and intent reconciled against as-built; the retro read in full; autonomy sweep covered; UI: `surface_class` recorded; brief locked and confirmed |
|
|
152
|
+
| 0 | Intake grill — **mandatory** | source ledger written with its `Contradictions:` line; `docs/DOCMAP.md` answered and intent reconciled against as-built; the retro floor read in full, its bytes printed; autonomy sweep covered; UI: `surface_class` recorded; brief locked and confirmed | auto |
|
|
207
153
|
| 1 | Docs study | contracts grounded on fetched docs | auto |
|
|
208
|
-
| 2 | Brainstorm + decompose | design approved; UI verdict recorded; every REQ answered; **the queue is an artifact** — a work graph validates and its coverage names no unserved REQ; platform: module map approved |
|
|
209
|
-
| 3 | Spec | committed + reviewed; UI: chain validated, linter green, scenarios and `SCR-` traced; COPY and VISUAL are a parallel layer after UX, and where both ran their convergence check is recorded; VISUAL is checked by its director record |
|
|
154
|
+
| 2 | Brainstorm + decompose | design approved; UI verdict recorded; every REQ answered; **the queue is an artifact** — a work graph validates and its coverage names no unserved REQ; platform: module map approved | auto |
|
|
155
|
+
| 3 | Spec | committed + reviewed; UI: chain validated, linter green, scenarios and `SCR-` traced; COPY and VISUAL are a parallel layer after UX, and where both ran their convergence check is recorded; VISUAL is checked by its director record | auto |
|
|
210
156
|
| 4 | Plan | parallel-ready, DoD per task; **every edge names what it carries** — the fake-edge test run and its `Edges:` count computed; **`scripts/plan_audit.py` clean** — every live node's packet survives a cold reader, and no two unordered nodes edit one file | auto |
|
|
211
157
|
| 5 | Dev | tasks DONE, TDD green per task, branch integrated per the brief; a fanned-out group gets **one convergence check over all its diffs together** before the first worktree lands | auto |
|
|
212
158
|
| 6 | Tests | full suite green, new and changed code covered, every new check probed both ways and asserted on its exit code; **a web surface is checked in a browser, not in the diff** — where a browser channel is connected; absent, the weaker claim is recorded; a gated surface's contact sheet passes | auto |
|
|
213
|
-
| 7 | Lint + deploy | lint clean and suite green before deploy; deploy needs a go, or the brief's specific standing authorization |
|
|
159
|
+
| 7 | Lint + deploy | lint clean and suite green before deploy; deploy needs a go, or the brief's specific standing authorization | auto |
|
|
214
160
|
| 8 | Post-deploy | clean boot or an honest degradation report; **a deployed web target is opened, not curled** — a `200` proves the server answered and nothing else; where no browser channel is connected, the weaker claim is recorded | auto |
|
|
215
161
|
| 9 | Docs + wiki | every stale row of the stage-0 source ledger updated; the propagation matrix walked for every change type this run produced; the documentation gate green with its ratchets printed; docs, wiki and the code graph synced and checked against each other | auto |
|
|
216
|
-
| 10 | **Acceptance** | the ladder walk ran and its absences became REQ rows; every REQ accounted for with evidence from a check seen failing once; no unresolved ledger row; **every repository clean, pushed and pointed at**; the hand-back written and the environment given back; the retrospective written **last**,
|
|
217
|
-
|
|
218
|
-
**Every gate above is the short form**, and the long form is the point of
|
|
219
|
-
[`references/stages.md`](references/stages.md) — one gate and exact detail route per
|
|
220
|
-
default stage. Before work on entry or resume, read that stage’s routed detail,
|
|
221
|
-
including waves and approved short paths; never preload all details. CUSTOM
|
|
222
|
-
profiles use their own declared doctrine; matching numeric ids do not select
|
|
223
|
-
default details. Full obligations stay in the spine and the selected detail.
|
|
162
|
+
| 10 | **Acceptance** | the ladder walk ran and its absences became REQ rows; every REQ accounted for with evidence from a check seen failing once; no unresolved ledger row; **every repository clean, pushed and pointed at**; the hand-back written and the environment given back; the retrospective written **last**, in order and within its byte budget | auto |
|
|
224
163
|
|
|
225
|
-
**
|
|
226
|
-
|
|
227
|
-
|
|
164
|
+
**Every gate above is the short form**; the long form is
|
|
165
|
+
[`references/stages.md`](references/stages.md). CUSTOM profiles use their own declared
|
|
166
|
+
doctrine; matching numeric ids do not select default details. **Several
|
|
167
|
+
repositories?** A submodule is finished when its parent says so:
|
|
228
168
|
[`references/acceptance.md`](references/acceptance.md) → *A project of several
|
|
229
169
|
repositories*.
|
|
230
170
|
|
|
231
|
-
## Model
|
|
171
|
+
## Model: ask once, at preflight
|
|
232
172
|
|
|
233
|
-
Recommend **the most capable reasoning model available
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
reminder: no such tier means say which one is in use and continue. Record the
|
|
237
|
-
answer in the brief, don't re-ask per stage; stage-5 subagents are pinned to it
|
|
238
|
-
automatically.
|
|
173
|
+
Recommend **the most capable reasoning model available**, a tier resolved at runtime,
|
|
174
|
+
**never a hardcoded id** (`references/model-tiering.md` → *Mechanic*). Record the
|
|
175
|
+
answer in the brief; stage-5 subagents are pinned to it.
|
|
239
176
|
|
|
240
177
|
## Degradation
|
|
241
178
|
|
|
@@ -245,31 +182,26 @@ automatically.
|
|
|
245
182
|
|
|
246
183
|
## Bring your own skills
|
|
247
184
|
|
|
248
|
-
The stages above are the **example** flow. A host
|
|
249
|
-
`pipeline.
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
block. The
|
|
253
|
-
framework ships no fixed stage count and no opinion on which gates are manual —
|
|
254
|
-
`pipeline.schema.json` is the only contract.
|
|
185
|
+
The stages above are the **example** flow. A host copies `pipeline.example.json` →
|
|
186
|
+
`pipeline.json`, defines its own stages (any count), points each `skills[]` at what its
|
|
187
|
+
environment resolves, sets each `gate.type` (`auto`/`judgment`/`manual`) and toggles its
|
|
188
|
+
own `release` block. `pipeline.schema.json` is the only contract.
|
|
255
189
|
|
|
256
190
|
## References
|
|
257
191
|
|
|
258
|
-
Most references are routed from
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
`
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
audit
|
|
274
|
-
ids derived from finding ids, never positional; evidence, limits and priority
|
|
275
|
-
kept apart from status; and any row it cannot map blocks the compile.
|
|
192
|
+
Most references are routed from `references/doctrine-map.md` by stage. The rest are
|
|
193
|
+
routed by prose: `stages.md`, `learned.md` (cited where a rule binds) and `probing.md`
|
|
194
|
+
(from `gates.md`). Beside this file: the config contracts, and the family's
|
|
195
|
+
task/context contract, `execution-packet.schema.json` and `execution-result.schema.json`
|
|
196
|
+
with their examples, validated dependency-free by `scripts/packet.py` (an unknown
|
|
197
|
+
mandatory version, a ref without its digest, or an unbound decision is rejected; a stale
|
|
198
|
+
result re-plans instead of landing). `scripts/context_packets.py compile|verify` maps an
|
|
199
|
+
audit report onto parent tasks: ids derived from finding ids, never positional, and any
|
|
200
|
+
row it cannot map blocks the compile.
|
|
201
|
+
|
|
202
|
+
## Triggers
|
|
203
|
+
|
|
204
|
+
The description is the short form. The full trigger list it carried until 1.98.0,
|
|
205
|
+
moved here verbatim, still routes to this skill:
|
|
206
|
+
|
|
207
|
+
"Use when work changes the repository — feature, fix, bug, refactor, migration, integration, rewrite, adoption or hardening; фича, фикс, баг, рефактор, миграция, интеграция, доработать, починить, внедрить, перевести — or a finding that lands in it: audit/аудит, bug hunt/проверь ошибки, production check/проверь прод, PR review/ревью PR — or on 'run this through the pipeline'/'прогони по конвейеру', 'the full cycle'/'полный цикл', /task-pipeline. Runs a substantial task through gated stages: intake grill, docs, brainstorm, spec, plan, build, tests, deploy, post-deploy, docs/wiki, acceptance. 'waves'/'волнами'/'release iteration'/'итерация релиза' closes the board; 'checkup'/'чекап' lists unconfirmed releases; 'setup' audits docs. Not for: answering a question, explaining, a typo, a one-line edit, a rename, recon that lands nothing — say 'no pipeline'/'без пайплайна' to opt out."
|
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
},
|
|
209
209
|
"risk": {
|
|
210
210
|
"enum": ["R1", "R2", "R3"],
|
|
211
|
-
"description": "The node's risk class (`references/iteration.md` → *Verification starts when a node lands*), computed from what it touches and never lowered to save time. It sets how many PASSING certification rounds the node owes (a failed round counts for nothing): R1 one, R2
|
|
211
|
+
"description": "The node's risk class (`references/iteration.md` → *Verification starts when a node lands*), computed from what it touches and never lowered to save time. It sets how many PASSING certification rounds the node owes (a failed round counts for nothing): R1 one (with one blind tier), R2 one, R3 two, one of them recorded adversarial (`certify --kind adversarial`); a flagship surface owes two, one adversarial. A round is the blind tiers the class owes (three; one on R1) plus one fix cycle. Absent outside wave mode or a release iteration. `graph.py close` refuses a node until the rounds its class owes have passed."
|
|
212
212
|
},
|
|
213
213
|
"wave": {
|
|
214
214
|
"type": "integer",
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"task-pipeline:grill"
|
|
18
18
|
],
|
|
19
19
|
"gate": {
|
|
20
|
-
"type": "
|
|
21
|
-
"check": "MANDATORY stage — never skipped (only sanctioned bypass: the entry-from-super-ux short-circuit). PHASE 1, before the first question: harvest the knowledge sources (references/knowledge-sources.md) — code, THE CODE GRAPH when one is built (references/knowledge-graph.md: graphify query/affected/god-nodes answer reach, which grep cannot; detect graphify-out/graph.json — recommended, never required), CLAUDE.md/AGENTS.md, CONTEXT.md + docs/adr, docs/ + docs/ux, past pipeline briefs and carry-over ledgers, THE RETRO'S STANDING INSTRUCTIONS (docs/evidence/retro.md — read IN FULL, not queried: they are capped at ten and they BIND this run; stamp each one the moment it fires, since that date is the only evidence behind stage 10's cold-retirement rule — references/retrospective.md), the knowledge wiki when installed (obsidian-wiki — recommended, never required; detect ~/.obsidian-wiki/config), and any other repo or hosted doc system the project names as its docs — queried by this task's own terms, with the SOURCE LEDGER written into the brief (a row per source consulted, or an explicit 'none found'; THE GRAPH'S ROW CARRIES ITS MEASURED LAG — commits and days behind HEAD, the signal it was measured with (built_at_commit exact / mtime approximate / unresolvable), and the marker '⚠ not trusted for reach until refreshed' — that exact string, so one marker is greppable across every ledger — on anything but current. A bare build date does NOT satisfy this: it is the graph's own reply about itself, true and self-reported and silent about whether the graph describes the tree this run is about to change — references/knowledge-graph.md -> Measure the lag, and references/gates.md -> False success for the class). PHASE 2, the grill, built into the skill (references/grill.md) — no companion to install. Per its contract: close what the code/docs answer first, then ONE batch of the material unknowns ordered by dependency, a recommended answer with each (one at a time only where answers depend on each other or the operator asks), contradictions reconciled; EVERY answer that touches a harvested source is validated against that source — the operator outranks any document, but only out loud, and the losing side is logged for the stage-9 doc update; domain awareness applied (terms challenged against CONTEXT.md, ADRs recorded for hard-to-reverse calls). The autonomy sweep is covered — every stage 1-10 has its blockers pre-resolved (docs sources, branch/tracker policy, test + lint commands, deploy target and authorization, log/health locations, docs+wiki targets, and for UI tasks the design surface: Figma on or text-only, is the Figma MCP connected, and if it is not — ship text-only or stop and connect it, since the UX chain degrades on its own and never blocks; plus, with Figma on, the DESIGN DESTINATION — which team/org by name and which file per surface, App / Web / ASO (the recorded one, a URL the operator gives, or creation in that named team with the creation explicitly authorized), written into the project's canonical record before the first frame, and never created while a recorded file resolves — an unreachable recorded file means stop and ask, never make a replacement) or is explicitly marked 'stop and ask here'. UI verdict recorded (arms super-ux), and for a user-facing task its SURFACE CLASS — surface_class: flagship | product | internal | ad — which selects the visual gate profile for stages 3, 6 and 10 (references/stages.md -> The surface class); model decision recorded. All of it locked into a committed task brief the operator
|
|
20
|
+
"type": "auto",
|
|
21
|
+
"check": "MANDATORY stage — never skipped (only sanctioned bypass: the entry-from-super-ux short-circuit). PHASE 1, before the first question: harvest the knowledge sources (references/knowledge-sources.md) — code, THE CODE GRAPH when one is built (references/knowledge-graph.md: graphify query/affected/god-nodes answer reach, which grep cannot; detect graphify-out/graph.json — recommended, never required), CLAUDE.md/AGENTS.md, CONTEXT.md + docs/adr, docs/ + docs/ux, past pipeline briefs and carry-over ledgers, THE RETRO'S STANDING INSTRUCTIONS (docs/evidence/retro.md — read IN FULL, not queried: they are capped at ten and they BIND this run; stamp each one the moment it fires, since that date is the only evidence behind stage 10's cold-retirement rule — references/retrospective.md), the knowledge wiki when installed (obsidian-wiki — recommended, never required; detect ~/.obsidian-wiki/config), and any other repo or hosted doc system the project names as its docs — queried by this task's own terms, with the SOURCE LEDGER written into the brief (a row per source consulted, or an explicit 'none found'; THE GRAPH'S ROW CARRIES ITS MEASURED LAG — commits and days behind HEAD, the signal it was measured with (built_at_commit exact / mtime approximate / unresolvable), and the marker '⚠ not trusted for reach until refreshed' — that exact string, so one marker is greppable across every ledger — on anything but current. A bare build date does NOT satisfy this: it is the graph's own reply about itself, true and self-reported and silent about whether the graph describes the tree this run is about to change — references/knowledge-graph.md -> Measure the lag, and references/gates.md -> False success for the class). PHASE 2, the grill, built into the skill (references/grill.md) — no companion to install. Per its contract: close what the code/docs answer first, then ONE batch of the material unknowns ordered by dependency, a recommended answer with each (one at a time only where answers depend on each other or the operator asks), contradictions reconciled; EVERY answer that touches a harvested source is validated against that source — the operator outranks any document, but only out loud, and the losing side is logged for the stage-9 doc update; domain awareness applied (terms challenged against CONTEXT.md, ADRs recorded for hard-to-reverse calls). The autonomy sweep is covered — every stage 1-10 has its blockers pre-resolved (docs sources, branch/tracker policy, test + lint commands, deploy target and authorization, log/health locations, docs+wiki targets, and for UI tasks the design surface: Figma on or text-only, is the Figma MCP connected, and if it is not — ship text-only or stop and connect it, since the UX chain degrades on its own and never blocks; plus, with Figma on, the DESIGN DESTINATION — which team/org by name and which file per surface, App / Web / ASO (the recorded one, a URL the operator gives, or creation in that named team with the creation explicitly authorized), written into the project's canonical record before the first frame, and never created while a recorded file resolves — an unreachable recorded file means stop and ask, never make a replacement) or is explicitly marked 'stop and ask here'. UI verdict recorded (arms super-ux), and for a user-facing task its SURFACE CLASS — surface_class: flagship | product | internal | ad — which selects the visual gate profile for stages 3, 6 and 10 (references/stages.md -> The surface class); model decision recorded. All of it locked into a committed task brief, confirmed before stage 1 by the operator's answer or by the standing authorization recorded in it; a small change (the short-path triage) writes the brief into the run ledger instead and goes straight to stage 5. The REQ table is written — one row per independently verifiable deliverable, each naming how it is verified — and frozen: adding later is free, removing or narrowing needs the operator's explicit agreement. The carry-over ledger is seeded. PHASE 1b, THE DOCUMENTATION INVENTORY (references/documentation.md): four questions answered into docs/DOCMAP.md before the interview — where settled things live (the DECISION HOME, and there is exactly one per project: an existing docs/adr/ IS the register and is recorded as such, never duplicated), what each fact's single home is, what a change of type X obliges (THE PROPAGATION MATRIX, non-empty, every row naming the check that enforces it or the word 'review' with a one-line reason), and what proves it (the gate command). A project with no answers gets them seeded — registers, matrix and scripts/check-docs.sh from the skill's templates — and the seeding is recorded as the register's first entry; the seeded gate must exit 0 on its own seeds, because a project that starts red teaches everyone on day one that the gate is noise. The regime is recorded. PHASE 1c, RECONCILE: git says how it should be, the run record says how it turned out — read both for the area about to be touched and resolve every divergence (the document is stale, the record is wrong, or they genuinely disagree and that is a decision), because starting on an unresolved divergence means building against a system that does not exist. The retro's in-force sections are read IN FULL and its archive is QUERIED by the task's nouns."
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
{
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"task-pipeline:decomposition"
|
|
46
46
|
],
|
|
47
47
|
"gate": {
|
|
48
|
-
"type": "
|
|
49
|
-
"check": "the
|
|
48
|
+
"type": "auto",
|
|
49
|
+
"check": "the design is approved (the operator's go, or the standing authorization recorded in the brief) AND the UI verdict is recorded (does the task touch a user-facing surface — web/mobile/CLI/TUI? this arms the stage-3 UX track). Every REQ is answered by the design, or explicitly dropped by the operator into the carry-over ledger. For a platform (several independent capabilities or shippable surfaces): the module map specs/<topic>-modules.md is committed and approved — brick criteria met or excepted in writing, dependency graph acyclic, build order topological with the walking skeleton first, every REQ mapped to exactly one module, cross-module contracts named with their owner. Single-module work records 'single module: <name>' instead — a skipped decomposition is a recorded decision, never an omission. THE LOOP'S ARMING STATE IS PRINTED — armed with its queue and pacing, or not armed with the reason; the queue exists at this stage and a loop armed earlier has nothing to walk."
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
{
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"task-pipeline:spec"
|
|
65
65
|
],
|
|
66
66
|
"gate": {
|
|
67
|
-
"type": "
|
|
68
|
-
"check": "UX track ran FIRST for user-facing tasks (/ux -> ux-foundation CJM -> ux-flows screens -> ux-scenarios -> /ux-lint green); spec committed and
|
|
67
|
+
"type": "auto",
|
|
68
|
+
"check": "UX track ran FIRST for user-facing tasks (/ux -> ux-foundation CJM -> ux-flows screens -> ux-scenarios -> /ux-lint green); spec committed and reviewed (by the operator, or under the brief's standing authorization by an independent reader); every user-facing requirement traces to a scenario ID. Every spec section carries covers: REQ-... and every REQ appears in at least one section. With Figma on: the destination the brief named was used — the canonical record (docs/ux/foundation.md -> Design tooling) names one file per surface (App, Web, ASO), no file was created while a recorded one resolved, and every screens.md frame link's :fileKey is one of the recorded set (a string match, not a judgement — scripts/visual_gate.py filekeys; a key outside the set means the run drew in a file nobody recorded and nobody will open). COPY and VISUAL are a parallel layer after UX: every user-facing string went through the COPY track or the refusal is recorded, the visual layer went through the VISUAL track or the refusal is recorded — and on a flagship, product or ad surface the VISUAL track is checked by its TRACE, not by the fact it ran: the director record at docs/design/<surface>/director-record.md carries the fields its surface_class owes ('scripts/visual_gate.py record <file> --class <surface_class>' exits 0; sheleg-design's own --check-record validator runs where installed and reads NOT_RUN, never PASS, where it is not; 'Mode: declined' with its reason is the refusal and passes), and where both tracks ran their convergence check is recorded - findings with the ruling, or 'Tracks converge: clean'."
|
|
69
69
|
}
|
|
70
70
|
},
|
|
71
71
|
{
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"host:deploy"
|
|
121
121
|
],
|
|
122
122
|
"gate": {
|
|
123
|
-
"type": "
|
|
123
|
+
"type": "auto",
|
|
124
124
|
"check": "lint clean and full suite green before deploy; deploy is outward and needs explicit operator go — or the specific standing authorization recorded in the stage-0 brief (named target + named preconditions; a vague 'do everything' is not one). No REQ is still open; a partial ships only with the operator's explicit acceptance."
|
|
125
125
|
}
|
|
126
126
|
},
|
|
@@ -166,8 +166,8 @@
|
|
|
166
166
|
"task-pipeline:retrospective"
|
|
167
167
|
],
|
|
168
168
|
"gate": {
|
|
169
|
-
"type": "
|
|
170
|
-
"check": "Close the circle. FIRST the LADDER WALK (references/audit.md), because the REQ table can only find what was named and lost — a comparison needs two sides and an absence has one: walk each REQ bottom-up through its rungs (decision -> spec section -> contract AND its failure behavior -> plan task -> change -> executed test -> surface/docs), check the seam at each step — and where the VISUAL track ran, the row visual intent (the director record) <-> final render (the APPROVED contact sheet: 'visual_gate.py sheet ... --require-approval' exits 0 on flagship, product or ad), with the review rounds it took copied from the run ledger's review: lines into the acceptance file — order findings BY SEAM not by file, and turn every absence into a new REQ row with its check BEFORE the table is written; findings belonging to a lower layer go back to that layer (spec -> stage 3, plan -> stage 4); record the pass's two counts (new findings vs findings caused by this run's own fixes) so the next pass can tell whether the axis is exhausted. THEN the coverage table: every REQ has a status (verified / partial / deferred / dropped) — none unknown; every verified carries evidence (a passing test name, file:line, a command and its output, or a scenario ID) — 'done' without evidence is downgraded to partial, not upgraded, and a green from a check nobody has watched fail against a planted defect is not evidence at all; every partial names what is missing and where it is tracked; every deferred/dropped has the operator's agreement and, for deferred, a tracker entry; no carry-over row is left unresolved and the ledger's counts are printed beside this verdict, so 'green' never reads as 'verified'; EVERY REPOSITORY IS CLOSED, THE PARENT INCLUDED — a submodule is finished only when its parent points at it, so 'git submodule status' shows no line starting with '+' and every repo is clean and pushed ('git -C <repo> status --porcelain' and 'git -C <repo> log @{u}..HEAD' both empty), because a parent records a submodule as a pointer to one commit and moving the submodule does not move the pointer: neither repo looks wrong alone and the disagreement survives every check that runs inside one; and the operator answers the closing question — here is what you asked for, here is what shipped, here is what is deferred, what is missing? —
|
|
169
|
+
"type": "auto",
|
|
170
|
+
"check": "Close the circle. FIRST the LADDER WALK (references/audit.md), because the REQ table can only find what was named and lost — a comparison needs two sides and an absence has one: walk each REQ bottom-up through its rungs (decision -> spec section -> contract AND its failure behavior -> plan task -> change -> executed test -> surface/docs), check the seam at each step — and where the VISUAL track ran, the row visual intent (the director record) <-> final render (the APPROVED contact sheet: 'visual_gate.py sheet ... --require-approval' exits 0 on flagship, product or ad), with the review rounds it took copied from the run ledger's review: lines into the acceptance file — order findings BY SEAM not by file, and turn every absence into a new REQ row with its check BEFORE the table is written; findings belonging to a lower layer go back to that layer (spec -> stage 3, plan -> stage 4); record the pass's two counts (new findings vs findings caused by this run's own fixes) so the next pass can tell whether the axis is exhausted. THEN the coverage table: every REQ has a status (verified / partial / deferred / dropped) — none unknown; every verified carries evidence (a passing test name, file:line, a command and its output, or a scenario ID) — 'done' without evidence is downgraded to partial, not upgraded, and a green from a check nobody has watched fail against a planted defect is not evidence at all; every partial names what is missing and where it is tracked; every deferred/dropped has the operator's agreement and, for deferred, a tracker entry; no carry-over row is left unresolved and the ledger's counts are printed beside this verdict, so 'green' never reads as 'verified'; EVERY REPOSITORY IS CLOSED, THE PARENT INCLUDED — a submodule is finished only when its parent points at it, so 'git submodule status' shows no line starting with '+' and every repo is clean and pushed ('git -C <repo> status --porcelain' and 'git -C <repo> log @{u}..HEAD' both empty), because a parent records a submodule as a pointer to one commit and moving the submodule does not move the pointer: neither repo looks wrong alone and the disagreement survives every check that runs inside one; and the operator answers the closing question — here is what you asked for, here is what shipped, here is what is deferred, what is missing? — in the hand-back; the operator's sign-off is read from it, never waited for. LAST ACT, THE RETROSPECTIVE (references/retrospective.md, written to docs/evidence/retro.md — one file per project, not per run, because every gate in this flow is good at THIS run and blind across runs): STAMP THE RUN FIRST (date, topic, verdict, counts) — the order is load-bearing, not style: the cold-retirement trigger reads the stamp this stage writes, so a prune placed ahead of the stamp can never run on real data; THEN PRUNE — every standing instruction checked against its retirement triggers (it became a check; every path/command/stage it names is gone; it has not fired in the last five run stamps, or in the last sixty days), the list held to its hard cap of ten (at eleven the oldest never-fired row goes — 'they all matter' is the state in which the list stopped being read), and EVERY DELETION LOGGED as one line, never silent; THEN, only if the run diverged, write the entry — symptom with evidence, the stage it surfaced at, the stage that OWNED it, the root cause ('the agent was careless' is not one), the fix by grade (mechanical check > standing instruction with its retire-when written at birth > a note that expires in two runs), and the check that catches it the first time from now on. A retro left empty after a messy run is the failure this file exists to stop, and the retro counts are printed beside this gate's verdict like the carry-over ledger's, so a list that quietly grew back is visible where it happened. EVERY LESSON CARRIES ITS COMMIT: each standing instruction has the SHA that introduced it and the SHA of the run in which it last fired, each log entry and each retirement carries one, the run stamp carries the run's own — a file:line rots at the next edit while 'git show <sha>' reconstructs the whole incident two months later — and every SHA must resolve, which the documentation gate checks with 'git rev-parse --verify'. ROTATION: entries older than the last five run stamps MOVE into docs/evidence/retro/YYYY-QN.md, which is append-only and QUERIED rather than read, so the in-force file stays short enough to be read in full and pruning costs no knowledge. AND THE GATE ITSELF IS PROVEN: every check this close-out leans on — the documentation gate included — has been seen failing once against a planted defect, with the probe recorded, and its ratchet counts are printed beside this verdict (references/gates.md). THE HAND-BACK IS WRITTEN — the request quoted as GIVEN, progress against it, what was solved with evidence, what surfaced unasked, every waiting decision ASKED here with options, and the ambiguity count computed from the four registers; zero prints as zero."
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
],
|