task-pipeline-skill 1.93.3 → 1.95.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.
Files changed (69) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/CONTRIBUTING.md +32 -0
  3. package/HOW-IT-WORKS.md +4 -3
  4. package/README.md +59 -15
  5. package/SKILL-CARD.md +2 -2
  6. package/bin/task-pipeline.js +64 -33
  7. package/cursor/rules/task-pipeline.mdc +10 -5
  8. package/evals/RESULTS.md +1 -1
  9. package/evals/task-pipeline.evals.json +16 -0
  10. package/package.json +3 -3
  11. package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
  12. package/plugins/task-pipeline/agents/verifier.md +5 -2
  13. package/plugins/task-pipeline/commands/task-pipeline.md +25 -10
  14. package/plugins/task-pipeline/hooks/memory-nudge.sh +45 -3
  15. package/plugins/task-pipeline/hooks/release-gate.sh +1 -1
  16. package/plugins/task-pipeline/skills/evidence-docs/references/gates.md +6 -3
  17. package/plugins/task-pipeline/skills/evidence-docs/references/hooks.md +2 -1
  18. package/plugins/task-pipeline/skills/evidence-docs/references/retrospective.md +26 -1
  19. package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +24 -20
  20. package/plugins/task-pipeline/skills/task-pipeline/graph.schema.json +89 -4
  21. package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +7 -0
  22. package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +1 -1
  23. package/plugins/task-pipeline/skills/task-pipeline/references/backlog.md +25 -0
  24. package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +1 -1
  25. package/plugins/task-pipeline/skills/task-pipeline/references/browser.md +1 -1
  26. package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +46 -2
  27. package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +3 -2
  28. package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +97 -26
  29. package/plugins/task-pipeline/skills/task-pipeline/references/deploy-targets.md +30 -4
  30. package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +20 -2
  31. package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +6 -3
  32. package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +2 -2
  33. package/plugins/task-pipeline/skills/task-pipeline/references/hooks.md +2 -1
  34. package/plugins/task-pipeline/skills/task-pipeline/references/iteration.md +387 -0
  35. package/plugins/task-pipeline/skills/task-pipeline/references/knowledge-sources.md +1 -0
  36. package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +4 -1
  37. package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +13 -1
  38. package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +26 -1
  39. package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +7 -5
  40. package/plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md +158 -0
  41. package/plugins/task-pipeline/skills/task-pipeline/references/stage-01-docs-study.md +10 -0
  42. package/plugins/task-pipeline/skills/task-pipeline/references/stage-02-brainstorm.md +52 -0
  43. package/plugins/task-pipeline/skills/task-pipeline/references/stage-03-spec.md +66 -0
  44. package/plugins/task-pipeline/skills/task-pipeline/references/stage-04-plan.md +11 -0
  45. package/plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md +55 -0
  46. package/plugins/task-pipeline/skills/task-pipeline/references/stage-06-tests.md +11 -0
  47. package/plugins/task-pipeline/skills/task-pipeline/references/stage-07-lint-deploy.md +15 -0
  48. package/plugins/task-pipeline/skills/task-pipeline/references/stage-08-post-deploy.md +29 -0
  49. package/plugins/task-pipeline/skills/task-pipeline/references/stage-09-docs-wiki.md +45 -0
  50. package/plugins/task-pipeline/skills/task-pipeline/references/stage-10-acceptance.md +91 -0
  51. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +60 -475
  52. package/plugins/task-pipeline/skills/task-pipeline/references/verification.md +1 -1
  53. package/plugins/task-pipeline/skills/task-pipeline/references/waves.md +76 -36
  54. package/plugins/task-pipeline/skills/task-pipeline/references/work-graph.md +54 -5
  55. package/plugins/task-pipeline/skills/task-pipeline/scripts/backlog_sources.py +54 -13
  56. package/plugins/task-pipeline/skills/task-pipeline/scripts/context_packets.py +3 -3
  57. package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +205 -22
  58. package/plugins/task-pipeline/skills/task-pipeline/scripts/lessons.py +1137 -0
  59. package/plugins/task-pipeline/skills/task-pipeline/scripts/stage_checkpoint.py +264 -44
  60. package/plugins/task-pipeline/skills/task-pipeline/scripts/waves.py +546 -0
  61. package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +6 -0
  62. package/plugins/task-pipeline/skills/task-pipeline/templates/backlog-sources.schema.json +96 -0
  63. package/plugins/task-pipeline/skills/task-pipeline/templates/canvas.md +97 -0
  64. package/plugins/task-pipeline/skills/task-pipeline/templates/dossier.md +82 -0
  65. package/plugins/task-pipeline/skills/task-pipeline/templates/inventory.schema.json +94 -0
  66. package/plugins/task-pipeline/skills/task-pipeline/templates/lesson.schema.json +221 -0
  67. package/plugins/task-pipeline/skills/task-pipeline/templates/questions.md +45 -0
  68. package/plugins/task-pipeline/skills/task-pipeline/templates/retro.md +4 -0
  69. package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +2 -2
@@ -1,11 +1,20 @@
1
1
  # Stages — detail & gates
2
2
 
3
+ For the selected **default profile**, read this spine at entry, then the one detail
4
+ linked in the current stage before work on every entry or resume, including wave
5
+ iterations and approved short paths. Do not preload all stage details. Missing or
6
+ unreadable detail means stop that stage and repair its route, never guess. A custom
7
+ profile uses its own declared doctrine and stages; numeric ids do not select these
8
+ default details, and the kernel still applies.
9
+
10
+
3
11
  For each stage: what it does, what to invoke, artifacts, and the **GATE** that
4
12
  must pass before advancing. Each gate is tagged with its **type** — `auto` (the
5
13
  orchestrator verifies the check itself, pass/fail), `judgment` (a named judge
6
14
  rules where no complete deterministic check exists — [`gates.md`](gates.md) →
7
- *The judgment gate*) or `manual` (wait for the
8
- operator's explicit go). These stages (0 intake + 1→10) are the plugin's
15
+ *The judgment gate*) or `manual` (requires the operator's explicit go, including a
16
+ specific standing authorization naming the act, cited with its source and scope;
17
+ otherwise wait). These stages (0 intake + 1→10) are the plugin's
9
18
  **example** flow, encoded in `pipeline.example.json` against the universal contract
10
19
  `pipeline.schema.json`; a host project replaces it with its own
11
20
  stages/agents/types (see SKILL.md → *Bring your own skills*).
@@ -72,150 +81,9 @@ never that the work was skipped quietly.
72
81
 
73
82
  ## 0 — Intake grill — MANDATORY
74
83
  - **Freedom: medium** — the interview adapts to the answers; its two phases and their order do not ([`gates.md`](gates.md) → *Axis C*).
75
- - **Stage 0 is not optional and not skippable.** There is no "small enough task"
76
- exemption, no "the request was already clear" exemption, no starting stage 1
77
- "while the operator thinks". The only sanctioned bypass is the
78
- entry-from-super-ux short-circuit below, and even that still requires a scope
79
- confirmation and a record of what was adopted vs skipped. A run that reaches
80
- stage 1 without a committed, operator-confirmed brief is a **failed run** —
81
- stop and go back.
82
- - **Entry-from-super-ux short-circuit (check FIRST).** task-pipeline is often
83
- launched *from* super-ux — its `/ux` action menu offers "execute autonomously
84
- via the task-pipeline plugin" once the UX chain (and often a
85
- `docs/ux/plans/…` fix plan) is already built. Before grilling, detect that:
86
- if `docs/ux/` already holds a validated chain (foundation → flows → screens →
87
- scenarios) and/or a fresh fix plan, **do not re-run the grill or the stage-3
88
- UX track from scratch.** Instead: (1) run a quick check — `/ux-lint`
89
- (`docs/ux/lint.py`) green, chain present, plan (if any) readable; (2) confirm
90
- the scope with the operator in ONE line; (3) skip to the first stage that
91
- still has real work (usually stage 4 Plan if a UX fix plan already exists, or
92
- stage 3 Spec to formalize it). Record what was adopted vs skipped. If the
93
- check finds drift/gaps, fall back to the normal flow for the missing parts
94
- only.
95
- - **What (normal entry):** the operator's one-line task is almost never enough to
96
- run autonomously. Before anything else, **grill the operator** to expand that
97
- one line into a complete, unambiguous brief — resolve every decision branch
98
- up front so stages 1→10 need no further human input beyond the manual gates.
99
- This is input expansion, not design: turn "make me feature X" into locked
100
- answers for scope, users, constraints, data, edge cases, done-criteria.
101
- - **Phase 1 — harvest the knowledge sources FIRST**
102
- ([`knowledge-sources.md`](knowledge-sources.md)). Before the first question:
103
- query what the project already knows about this task — code, **the code graph**
104
- when one is built ([`knowledge-graph.md`](knowledge-graph.md): `graphify query` /
105
- `affected` / `god-nodes` answer *reach*, which is what grep cannot), `CLAUDE.md`,
106
- `CONTEXT.md`/ADRs, `docs/` + `docs/ux/`, past pipeline briefs and carry-over
107
- ledgers, **the retro's standing instructions and run stamps** (`<artifacts>/retro.md`,
108
- read **in full** — ten standing rows and ten stamps, both bounded **by a cap**, and they bind this
109
- run; stamp each instruction as it fires. Its *Recent log* is **queried** by the
110
- task's nouns, not read: uncapped narrative inside a binding source is what makes the
111
- capped part get skimmed, [`retrospective.md`](retrospective.md)), the **knowledge wiki** if one is
112
- installed
113
- ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — recommended,
114
- never required), and any **other repo or hosted doc system the project names as
115
- its docs**. Write the **source ledger** into the brief (a row per source, or an
116
- explicit "none found"; **the graph's row carries its measured lag — commits and
117
- days behind `HEAD`, the signal that measured it, and `⚠ not trusted for reach
118
- until refreshed` on anything but `current`**
119
- ([`knowledge-graph.md`](knowledge-graph.md) → *Measure the lag*; a build date is
120
- the graph's own reply about itself, not a measurement of it). It is retrieval
121
- scoped by the task's own nouns, not a read of everything — and it is what makes
122
- phase 2's answers checkable instead of merely confident.
123
- - **Phase 1b — the documentation inventory**
124
- ([`documentation.md`](documentation.md)). Four questions, answered before the
125
- interview and written to `docs/DOCMAP.md` (seeded from
126
- [`../templates/docmap.md`](../templates/docmap.md), **only when absent**): where
127
- do settled things live, what is each fact's single home, what does a change of
128
- type X oblige, and what proves it. A project with no answers gets them seeded —
129
- registers, the matrix and `scripts/check-docs.sh` — and the seeding is itself
130
- recorded as the register's first entry. **One decision home per project:** an
131
- existing `docs/adr/` *is* the register and is recorded as such, never duplicated.
132
- The gate is seeded so that it exits `0` on its own seeds; a project that starts
133
- red learns on day one that the gate is noise.
134
- - **Phase 1b+ — offer the entry audit, once** ([`setup.md`](setup.md)). When
135
- `docs/DOCMAP.md` is absent or its regime line predates the project's last release,
136
- ask whether to audit the documentation that already exists **before** building on
137
- it. Record the answer — including a refusal — in the brief's autonomy sweep and
138
- never ask again. `audit.md`'s ladder runs at the *end* over the change; this runs
139
- at the *start* over what is already there.
140
- - **Phase 1c — reconcile intent against as-built.** Git says how it *should* be;
141
- the run record says how it *turned out*. Read both for the area you are about to
142
- touch and resolve every divergence — the document is stale, the record is wrong,
143
- or they genuinely disagree and that is a decision. There is no fourth option, and
144
- starting on an unresolved divergence means building against a system that does
145
- not exist.
146
- - **Phase 1d — the short-path triage: printed, proposed, never taken silently.** This
147
- pipeline's own boundary exempts a typo, a one-line fix and a mechanical rename — and
148
- nothing measured that until 2026-08-10, so the exemption depended on an agent
149
- remembering it while eleven stages and four manual gates stood in front of a
150
- one-paragraph edit. Three questions, each with something behind it:
151
-
152
- ```
153
- 1. files the request names, resolved git ls-files -- <paths> -> N
154
- 2. any of them a public contract the surfaces the host's release
155
- syncs, its schema or config
156
- contracts, a shipped command,
157
- its README -> yes/no
158
- 3. behaviour a user or a caller observes changes -> yes/no
159
- ```
160
-
161
- Few files, no contract, no observable change ⇒ **propose** the short path: stages 1,
162
- 2, 3 and 4 marked `⊘` with the triage answer as the reason, and 5→10 running
163
- unchanged. **Propose, never take.** The answer goes in the brief's autonomy sweep and
164
- silence takes the full flow — the same floor deploy authorization uses. The glyph is
165
- what makes it safe: a skipped stage is printed on the rail **with its reason**
166
- ([`progress.md`](progress.md)), and a skip nobody can see is indistinguishable from a
167
- stage that was never entered.
168
- - **How it runs: [`grill.md`](grill.md)** — the full doctrine, built into this
169
- skill (nothing to install). In short: close what the sources can, then ONE batch
170
- of the material unknowns, ordered by dependency, a recommended answer with each —
171
- one at a time only where answers depend on each other or the operator asks;
172
- contradictions reconciled on the spot; **every answer that touches
173
- a harvested source is checked against it** — the operator outranks any document,
174
- but only out loud, and the losing side is logged for the stage-9 doc update; plus
175
- **domain awareness**
176
- (challenge terms against `CONTEXT.md`, sharpen fuzzy language, stress-test with
177
- concrete scenarios, cross-reference the code, record ADRs for hard-to-reverse
178
- calls) and the **autonomy sweep** that pre-resolves every stage-1→10 blocker.
179
- Deploy authorization has a hard floor there: a standing go counts only when it
180
- names the target and the preconditions.
181
- - **The run mode is settled here too** ([`continuity.md`](continuity.md)): does
182
- the run advance item-by-item with no check-in between items, and on what
183
- interval? Read `pipeline.json` → `run.loop` first — a recorded mode is the
184
- answer and is not re-asked; **absent, it is off**. It buys pacing, never
185
- authorization: no loop mode collapses a `manual` gate or an outward act. The
186
- same file carries the other half of pacing — the context budget, which fires
187
- only on a harness signal or the operator's word, never on an estimate.
188
- - **UI early-detect:** one branch of the grill is always "does this touch a
189
- user-facing surface (web/mobile/CLI/TUI)?". If yes → surface **super-ux**
190
- now (use it if installed; otherwise give the install line — see SKILL.md
191
- *Prerequisites*); this arms the stage-3 UX track. **And the same branch records
192
- the surface's class** — the next bullet.
193
- - **The surface class.** Every user-facing task's brief carries
194
- `surface_class: flagship | product | internal | ad`, and the class selects the gate
195
- profile the visual layer is held to for the rest of the run:
196
-
197
- | Class | What it is | Director record (stage 3) | Visual half (stages 5–6) | Stage 10 |
198
- |---|---|---|---|---|
199
- | `flagship` | the surface a product is judged by — landing, onboarding, paywall, a hero screen | the full record | **gate**: full matrix, pairwise across every axis, the full rubric | approved contact sheet |
200
- | `product` | an ordinary screen of the product | the short record — Brief, Mode, References, Markers, Open | **gate**: every state and the mandatory pairs; the gate items of the rubric | approved contact sheet |
201
- | `internal` | an admin panel, an internal tool, a CLI | none owed | recommended; the project linter is the floor | the functional look |
202
- | `ad` | a creative that runs as an advertisement or a store asset | Brief, Mode, References, Markers, ADA (its rubric profile and safe zones), Open | **gate**: the ad profile and the safe zones | approved contact sheet |
203
-
204
- Ask it as one question with a recommended answer read off the request — a landing or a
205
- paywall is `flagship` unless the operator says otherwise — and never leave it to stage
206
- 5: a class decided at build time is decided by whoever wants the build to pass. A
207
- work-graph node that builds the surface copies the class as `surface_class`, and
208
- `graph.py certify` then owes the fourth, `visual` reading on `flagship` and `product`
209
- ([`certification.md`](certification.md) → *The fourth reading*).
210
- - **Artifact:** lock the resolved decisions into a **task brief** committed at
211
- `<artifacts>/specs/YYYY-MM-DD-<topic>-brief.md` (scope, users/UI verdict and,
212
- for a user-facing task, `surface_class`, constraints, assumptions, explicitly-deferred items, done-criteria) **plus the
213
- autonomy sweep's per-stage answers and the model decision**. Seed it from
214
- the skill's `templates/brief.md` skeleton — but only when absent, never
215
- overwrite an existing brief. Stages 2–4 build on this brief; stages 5–10 read
216
- its autonomy section instead of asking. Where the session produced them, also:
217
- an updated `CONTEXT.md` (terms written as they resolved) and any ADRs under
218
- `docs/adr/` — see `grill.md` → *Domain awareness*.
84
+
85
+ **On entry or resume:** read [stage-00-intake.md](stage-00-intake.md) before stage work.
86
+
219
87
  - **GATE (manual):** shared understanding reached — **the source ledger is written
220
88
  (every source consulted, or an explicit "none found")** and **its `Contradictions:`
221
89
  line is written under it** — the harvest is a fan-out that converges on one brief, and
@@ -251,65 +119,25 @@ never that the work was skipped quietly.
251
119
  own churn detection mechanical and reads the `touch:` lines, and
252
120
  [`progress.md`](progress.md) derives the rail and the iteration counter from the
253
121
  `stage:` and `iter:` lines. The header goes out before the interview because a run
254
- that announces its position only at the end announced it to nobody.
122
+ that announces its position only at the end announced it to nobody. A new ledger starts a new
123
+ run's memory state: a previous run's "memory unavailable" marker is honoured only while
124
+ its own ledger line is in the ledger, so a reseeded ledger — even the same day — is nudged
125
+ again, and the stale marker is cleared at the next `stage_checkpoint.py record`.
255
126
  - **The board is read, or seeded.** `<artifacts>/backlog.md` ([`backlog.md`](backlog.md)) — its **open count is quoted in the brief**, measured by a command at the top of the run rather than inherited from the last run's report. Absent ⇒ seeded from the template and said so; an empty board and no board are the same thing to work on, and only one of them can be appended to.
256
127
 
257
128
  ## 1 — Docs study
258
129
  - **Freedom: medium** — which sources to fetch is judgement; grounding contracts on fetched docs is not ([`gates.md`](gates.md) → *Axis C*).
259
- - **What:** ground every external library / API / SDK the task touches on the
260
- *current* docs, before locking any contract.
261
- - **Invoke:** the `context7` MCP — `context7:resolve-library-id` → `context7:query-docs`,
262
- scoped by topic or the `context7-docs` skill. Web-search fallback for libs context7
263
- can't resolve.
130
+
131
+ **On entry or resume:** read [stage-01-docs-study.md](stage-01-docs-study.md) before stage work.
132
+
264
133
  - **GATE (auto):** every contract the design will lock is grounded in fetched docs,
265
134
  not recall. Unresolvable libraries are flagged in the spec.
266
135
 
267
136
  ## 2 — Brainstorm + decompose
268
137
  - **Freedom: high** — many designs are valid — this is the open field, and the only fixed thing is the gate ([`gates.md`](gates.md) → *Axis C*).
269
- - **How it runs: [`brainstorm.md`](brainstorm.md)** — built into this skill. Read
270
- the brief first (stage 0 already answered scope/constraints/done-criteria), then
271
- explore the codebase, scope-check for decomposition, the open questions in one
272
- batch, 2–3 approaches with a recommendation, design presented in sections and
273
- approved section by section. **Hard gate:** no code, no scaffolding, no implementation
274
- skill before the operator approves the design — including on "obviously simple"
275
- tasks.
276
- - **UI detection (mandatory check):** decide whether the task touches any
277
- user-facing surface (web, mobile, CLI, TUI — new feature, new screen/command,
278
- or a change to user-visible behavior). Record the verdict; it arms the UX
279
- track in stage 3.
280
- - **Decomposition (platforms only): [`decomposition.md`](decomposition.md).** If
281
- the brief describes a platform rather than a change — several independent
282
- capabilities, several surfaces that could ship separately, REQs no single
283
- deliverable satisfies — cut it into **modules** before any spec is written, and
284
- commit the module map (`specs/<topic>-modules.md`): what each module delivers,
285
- the entities it owns, what it depends on, the contracts it exposes, its REQs and
286
- its status, in build order with the walking skeleton first. Single-module work
287
- records `single module: <name>` in the design and moves on — a skipped
288
- decomposition is a decision, never an omission.
289
- - **Where the queue is a work graph, it is WRITTEN here**
290
- ([`work-graph.md`](work-graph.md)): `.task-pipeline/graph.json`, carrying the frozen REQ
291
- ids so `serves` resolves, one node per unit of work with its owner, what it touches and
292
- **the check that will close it**, and an edge per dependency **naming what it hands
293
- over**. The check is the planner's job and not the verifier's: a node whose completion
294
- test is decided by whoever happens to close it is a node two closes will disagree about,
295
- and `validate` refuses one that names none. Then
296
- `python3 scripts/graph.py validate` — a graph that does not validate is not a queue, and
297
- `next` refuses to walk one. The reason to prefer it over a prose plan is measured, not
298
- aesthetic: a 400-node graph and a 4-node graph produce the same 27-byte frontier, so the
299
- cost of knowing what is next does not grow with the programme.
300
- - **And the check is what THREE readings will run, not one**
301
- ([`certification.md`](certification.md)). A node is closed by `unit`, `seam` and `product`
302
- reports, dispatched blind and in parallel, and `certify` refuses the close until all three
303
- pass. That is a planning fact, not only a verification one: a node whose blast radius nobody
304
- can name is a node the seam and product tiers cannot scope, so `touches` and `serves` are
305
- what make the two outer readings possible at all.
306
- - **The queue exists here, so the loop arms here** ([`continuity.md`](continuity.md) →
307
- *Part 1a*). Where `run.loop.arm` is `after-decomposition` and the map holds more than
308
- one module, arm the mode at the close of this stage and print one line: the mode, and
309
- either the job id and its cancel command (`interval`) or the delay chosen and why
310
- (`dynamic`). Arming collapses no gate and authorizes no outward act; it decides only
311
- that the run does not stop to ask *"shall I take the next one?"*. Single-module work
312
- arms nothing and says so — a loop with one item is a timer.
138
+
139
+ **On entry or resume:** read [stage-02-brainstorm.md](stage-02-brainstorm.md) before stage work.
140
+
313
141
  - **GATE (manual):** the user approves the design, the UI verdict is recorded, **the
314
142
  queue is an artifact rather than a recollection** — where it is a work graph,
315
143
  `graph.py validate` exits 0 and `graph.py coverage` names any requirement no node serves,
@@ -323,65 +151,9 @@ never that the work was skipped quietly.
323
151
 
324
152
  ## 3 — Spec — with UX track for user-facing tasks
325
153
  - **Freedom: medium** — what the contract says is judgement; which contracts must be locked is a list ([`gates.md`](gates.md) → *Axis C*).
326
- - **How it runs: [`spec.md`](spec.md)** — built into this skill: the UX-track order,
327
- what the spec must lock (types, schemas, signatures, file layout, the **Global
328
- Constraints** block stages 4–5 depend on), the self-review pass and the operator
329
- review gate.
330
- - **UX track (runs FIRST when stage 2 flagged UI; skip entirely otherwise).**
331
- Requires the **super-ux** skills. If missing on a UI task → give the install
332
- line and stop (see SKILL.md *Prerequisites*: `/plugin marketplace add
333
- ssheleg/super-ux` → `/plugin install super-ux@super-ux`, or `npx skills add
334
- ssheleg/super-ux`). super-ux builds a traced chain — walk it top-down (see its
335
- `system-map.md`):
336
- 0. **Destination first, when Figma is on.** The brief already names the team/org
337
- and the files — **one per surface** (App, Web, ASO: store screenshots, icon and
338
- logo), never one file for every frame; `docs/ux/foundation.md` → *Design tooling*
339
- is the canonical record. Confirm each **resolves** before drawing. **Never create a file while a
340
- recorded one resolves; if it doesn't resolve, stop and ask — never create a
341
- replacement** (that is the duplicate, and it hides a permissions problem).
342
- A creation happens at most once, in the named team, and its URL is written to
343
- the canonical record before the first frame.
344
- 1. `/ux` (the only super-ux entry) — reports which `docs/ux/` layers exist,
345
- repairs the skeleton, records the Figma on/off choice, recommends the next
346
- action. Never make the operator pick skills.
347
- 2. `ux-foundation` → `docs/ux/foundation.md` — the **WHY**: personas, Jobs to
348
- Be Done, **customer journey maps (CJM)**, user stories (Given/When/Then).
349
- 3. `ux-flows` → `docs/ux/flows.md` + `docs/ux/screens.md` — the **HOW + UI
350
- map**: task analysis, user-flow diagrams (branches, error paths), every
351
- screen + state with wireframe and (Figma on) a Figma frame link.
352
- 4. `ux-scenarios` → `docs/ux/scenarios.md` — the **WHAT** (source of truth for
353
- behavior): scenarios validated against the scenario-format contract super-ux
354
- itself ships (`scenario-format.md` — read its current version there, never
355
- pin one here) — IDs, statuses, `Traces:` to stories/journey stages/flows,
356
- edge/error states enumerated.
357
- 5. **Run the super-ux linter** (`/ux-lint` or `python3 docs/ux/lint.py`) — it
358
- must pass: no drift, no orphans, no broken traces or stale Figma links.
359
- These skills are **idempotent** — reuse and extend existing `docs/ux/` layers,
360
- never rebuild from scratch. If the chain already exists and is validated (e.g.
361
- the task entered from super-ux), just verify (linter green) and embed it into
362
- the spec; only build the parts that are missing.
363
- - **COPY track and VISUAL track — a parallel layer after UX, and their
364
- convergence.** Three tracks, three questions, none substituting for another:
365
- super-ux decides what the interface must **do**, `copywriting` how it
366
- **sounds** (every string a product's user will read, against the brand pack),
367
- `sheleg-design` how it **looks** (tokens, themes, typography, motion). COPY and
368
- VISUAL are **parallel** — both consume the UX track's scenarios, neither
369
- consumes the other — and where both ran, **their convergence check is run and
370
- recorded before the spec is committed**: each can be right alone and the two
371
- disagree together on one screen. The full doctrine — each track's scope and
372
- out-of-scope, the refusal sentences, the four contradictions the check
373
- catches — is [`spec.md`](spec.md) → *The COPY and VISUAL tracks, and their
374
- convergence*, its one home. **The VISUAL track leaves a trace, not a fact**: a
375
- director record at `docs/design/<surface>/director-record.md`, whose fields the gate
376
- reads by the brief's `surface_class` (`python3 scripts/visual_gate.py record <file>
377
- --class <c>`), and a refusal is that same file saying `Mode: declined` and why.
378
- - **Spec:** write the approved design to
379
- `<artifacts>/specs/YYYY-MM-DD-<topic>-design.md` and commit it. Lock all
380
- shared contracts (types, schemas, signatures, file layout). For UI tasks the
381
- spec **embeds the UX layer**: links the validated scenario IDs, the flows and
382
- `SCR-` screens, the CJM stages the feature serves, and the UX
383
- patterns/principles from super-ux that apply (`best-practices.md`,
384
- `ux-design-principles.md`, `component-guidelines.md`).
154
+
155
+ **On entry or resume:** read [stage-03-spec.md](stage-03-spec.md) before stage work.
156
+
385
157
  - **GATE (manual):** the **`## Self-review` section written and committed with
386
158
  computed values** — every check the spec names resolving or marked `review`, the
387
159
  brief's decisions and stage 2's rejected options read back with no unresolved
@@ -416,12 +188,9 @@ never that the work was skipped quietly.
416
188
 
417
189
  ## 4 — Plan
418
190
  - **Freedom: low** — the task format is prescribed and the REQ set-comparison is mechanical ([`gates.md`](gates.md) → *Axis C*).
419
- - **How it runs: [`planning.md`](planning.md)** — built into this skill →
420
- `<artifacts>/plans/YYYY-MM-DD-<topic>.md` (same slug as the brief and the
421
- spec). Zero-context tasks, exact
422
- paths, complete code in every step, TDD steps with expected output, DoD each,
423
- dependency graph + parallel groups, non-overlapping file ownership, and the
424
- Global Constraints block copied verbatim from the spec.
191
+
192
+ **On entry or resume:** read [stage-04-plan.md](stage-04-plan.md) before stage work.
193
+
425
194
  - **GATE (auto):** `python3 scripts/plan_audit.py` clean — the plan read as the agent
426
195
  who was NOT there will read it: every live node carries a packet answering the cold
427
196
  reader's eight questions, no two nodes the graph leaves unordered edit one file, the
@@ -445,56 +214,9 @@ never that the work was skipped quietly.
445
214
 
446
215
  ## 5 — Dev
447
216
  - **Freedom: low** — TDD order, worktree isolation and 'a subagent never writes the register' are the narrow bridge ([`gates.md`](gates.md) → *Axis C*).
448
- - **How it runs: [`build.md`](build.md)** — built into this skill: isolate the
449
- workspace (native worktree tool first, git fallback, baseline tests), keep a
450
- ledger under `.task-pipeline/build/<plan>/` so a compacted context can resume,
451
- then one fresh implementer subagent per task with a file-based brief and report,
452
- a review after every task ([`review.md`](review.md)), and a five-round fix loop
453
- with an explicit breaker. TDD per task ([`tdd.md`](tdd.md)): failing test →
454
- watch it fail → minimal impl → watch it pass → commit. Pin subagents to the
455
- run's confirmed model (`model-tiering.md`). The plan's parallel groups fan out
456
- **only when all three hold** — the tasks share no `depends:`, their file ownership
457
- is exclusive per the plan, and each implementer gets its own worktree; otherwise
458
- sequential. A group that did fan out gets **one convergence check over all its
459
- reports and diffs together, before the first worktree is integrated**
460
- ([`build.md`](build.md) §4.2a) — a per-task review reads one diff and cannot see a
461
- contradiction that exists only between two of them.
462
- - **Web front end? The task's own surface is checked in a browser, not in the diff.**
463
- Where a browser channel is connected — `playwright` **or** `chrome-devtools`, either
464
- one, whichever answers first (**how**: [`browser.md`](browser.md); which:
465
- [`companion-skills.md`](companion-skills.md)): after a
466
- task that changes a rendered surface, load it, take a snapshot and read the
467
- console and the network log **before the task is marked DONE** — a component can be
468
- correct and land under a fixed header, and a review of the diff cannot see that.
469
- **What the look finds is fixed in this task, or parked with the ruling the GATE below
470
- requires — never parked silently** — a browser finding filed without a ruling is the
471
- diff-review verdict wearing a screenshot; the look was worth taking only if it can
472
- still change the code or is on record as deliberately not doing so. Absent, say the surface was verified by reading
473
- the diff and treat it as the weaker claim it is. **On a surface whose brief names a
474
- `surface_class`, the project linter runs here too**, after each task that changes a
475
- rendered surface — `python3 scripts/visual_gate.py lint <dir>`; an S1 finding is
476
- fixed in the task, and NOT_RUN (exit 3) is recorded as such
477
- ([`browser.md`](browser.md) → *The visual half*). **With Figma on, the token drift
478
- probe runs beside it** after a task that touches the token file or a tokenised
479
- component: `python3 scripts/visual_gate.py tokens --figma <variables.json> --css
480
- <tokens.css>`. A FAIL is fixed in the task, renaming one side to match the other.
481
- No export is NOT_RUN, recorded as such. A component whose API the task changed
482
- updates its Code Connect mapping in the same change
483
- ([`build.md`](build.md) → *Code Connect, kept*). A slop marker caught while the
484
- implementer is dispatched costs a line; caught on the contact sheet it costs a round. Stage 6 repeats this over the whole tree; this one catches it while the
485
- implementer that wrote it is still dispatched. The matrix pointed this companion at
486
- stages 5–6 from the day it was added and **this stage had never named it** — found by
487
- the guard comparing the two, not by a reader.
488
- - **Domain companions, where the task is on their ground** — recommended, never a
489
- gate ([`companion-skills.md`](companion-skills.md)): `sheleg-dev` when the build
490
- wires money, tracking, sign-in or page speed; `agent-stack` when the thing being
491
- built is an agent system; `telegram-dev` when Telegram is the platform rather
492
- than the transport. Absent, the build ships on the host's own doctrine and the
493
- close-out names the seam nobody checked.
494
- - **Integration closes the stage:** sync with the base branch, re-run the full suite
495
- on the result, land it the project's way (merge, or a PR — outward, so it needs a
496
- go), remove the worktree. Stages 7–9 act on the integrated result, so a branch the
497
- operator chose to leave unmerged is recorded as such.
217
+
218
+ **On entry or resume:** read [stage-05-dev.md](stage-05-dev.md) before stage work.
219
+
498
220
  - **GATE (auto):** **the hygiene gate green in diff mode after every task**
499
221
  (`references/build.md`) — six checks over what that task changed, no floor, and a
500
222
  finding fixed in-task or carried over with a reason; all plan tasks DONE (three review verdicts per task: spec
@@ -508,12 +230,9 @@ never that the work was skipped quietly.
508
230
 
509
231
  ## 6 — Tests
510
232
  - **Freedom: low** — green means the full suite, and no skip smuggles a red one past ([`gates.md`](gates.md) → *Axis C*).
511
- - **What:** consolidate test coverage for the change: confirm new functionality
512
- has tests (written test-first in stage 5), update/repair existing tests the
513
- change touched, and add edge-case + failure-path tests per DoD.
514
- - **Invoke:** the host test runner (see `conventions.md` → *Lint + test*); the
515
- built-in [`tdd.md`](tdd.md) cycle for any uncovered gap — failing test first,
516
- same as stage 5.
233
+
234
+ **On entry or resume:** read [stage-06-tests.md](stage-06-tests.md) before stage work.
235
+
517
236
  - **GATE (auto):** **the hygiene gate green over the whole tree**, its six counts
518
237
  printed beside their floors; the **full** suite is green (not just the new tests); new/changed code
519
238
  is covered; **every check this run added or widened has been probed both ways —
@@ -574,22 +293,20 @@ never that the work was skipped quietly.
574
293
 
575
294
  ## 7 — Lint + deploy
576
295
  - **Freedom: low** — outward and irreversible — the authorization floor is exact or the stage stops ([`gates.md`](gates.md) → *Axis C*).
577
- - Read host conventions (`conventions.md`): run the linter; fix failures. The suite
578
- is already green from stage 6 — re-run it if code changed since. For UI projects,
579
- the **super-ux linter** (`python3 docs/ux/lint.py` / `/ux-lint`) is part of lint —
580
- it must pass too (no UX drift merges). Then deploy per the project's convention;
581
- if the project defines release automation (`pipeline.json` → `release`, toggle
582
- on), that is what "deploy" runs here. **No runbook, or one too thin to act on?
583
- Write it first** ([`deploy-targets.md`](deploy-targets.md)) — a deploy performed
584
- from inference about the project is one nobody can repeat or roll back, and the
585
- operator is standing at this gate anyway. That reference also carries the CLI
586
- verbs per target for when the runbook names a platform you have to recall.
296
+
297
+ **On entry or resume:** read [stage-07-lint-deploy.md](stage-07-lint-deploy.md) before stage work.
298
+
587
299
  - **GATE (manual):** lint clean (host linter **and**, for UI projects, the super-ux
588
300
  linter) **and** suite green **before** deploy, **and no REQ is still `open`** — a
589
301
  `partial` ships only with the operator's explicit acceptance. A gap is cheapest to
590
302
  close before it ships, and the operator is already present at this gate. **The
591
303
  carry-over count is printed beside this verdict.** Deploy is outward → explicit
592
- operator go — unless the operator already authorised releases. **Before the tag, read
304
+ operator go, or a specific standing authorization naming that act, cited with its source
305
+ and scope. Authorization to release does not silently authorize a separate deploy. If
306
+ `release.authorized_by` is present, read that source and verify its authority,
307
+ currentness and scope for the tag and publication; the locator is not authorization.
308
+ If absent, inspect existing recorded authority before asking for a missing grant.
309
+ **Before the tag, read
593
310
  the release's approval mode** (`pipeline.json` → `release.approval`; then
594
311
  [`deploy-targets.md`](deploy-targets.md) → *When the release waits for an approval*):
595
312
  `checks` — push the tag, watch the run selected by the tag, report; `reviewers` — the
@@ -617,30 +334,9 @@ never that the work was skipped quietly.
617
334
 
618
335
  ## 8 — Post-deploy
619
336
  - **Freedom: medium** — where the logs live varies; 'clean boot or an honest degradation report' does not ([`gates.md`](gates.md) → *Axis C*).
620
- - Tail deploy logs / health-check per conventions. Confirm clean boot, no error
621
- spike, live subsystems healthy. **All three of the verification trio, not one of
622
- them** ([`deploy-targets.md`](deploy-targets.md) → *The verification trio*):
623
- deployment/process state, runtime logs, and a health-check request from outside.
624
- Where deploy happens in CI, verify the **deploy** job and not only the build —
625
- a green build beside a skipped deploy is the commonest way a run reports success
626
- while nothing shipped.
627
- - **A deployed web target is opened, not curled.** A `200` proves the server
628
- answered; it says nothing about whether the page rendered, whether a bundle 404'd,
629
- or whether the console filled with errors on load — all three ship green past a
630
- health check. Where a browser channel is connected — `playwright` **or**
631
- `chrome-devtools`, either one ([`browser.md`](browser.md)) — load the deployed URL and read
632
- the console and the network log; quote what you read, not that you looked
633
- ([`companion-skills.md`](companion-skills.md)). Absent → say the check was an HTTP
634
- response only, which is the honest name for it.
635
- - **Read the CI verdict for the deploy's own commit** ([`conventions.md`](conventions.md)
636
- → *The CI verdict*): the run's conclusion quoted, the **failing step's log quoted**
637
- on anything but `success`, and one of the three states stated — including **`no run
638
- found`**, out loud, because a project without CI is a legitimate state and not a
639
- green one.
640
- - **A public surface a logged-out reader will see** can additionally be audited for
641
- search and answer-engine visibility with `seo-aeo-audit`
642
- ([`companion-skills.md`](companion-skills.md)) — recommended, never a gate;
643
- absent, visibility ships unaudited and the close-out says so.
337
+
338
+ **On entry or resume:** read [stage-08-post-deploy.md](stage-08-post-deploy.md) before stage work.
339
+
644
340
  - **GATE (auto):** clean boot confirmed, or an **honest degradation report** with next
645
341
  steps — never silent success. **The CI verdict is one of the reported facts, with
646
342
  its run id** — "CI is green" written without a command behind it prints the same
@@ -654,46 +350,9 @@ never that the work was skipped quietly.
654
350
 
655
351
  ## 9 — Docs + wiki
656
352
  - **Freedom: low** — the matrix walk and the gate are mechanical; what a doc says is not this stage's call ([`gates.md`](gates.md) → *Axis C*).
657
- - **The propagation sweep runs first** ([`documentation.md`](documentation.md)).
658
- The ledger below names the documents you **read**; the matrix in `docs/DOCMAP.md`
659
- names the documents you **owe**. They are not the same list, and the gap between
660
- them is where documentation rots — the document nobody read is exactly the
661
- document nobody updated. Walk the matrix row for **every** change type this run
662
- produced. Every settled thing gets an id in the register, every answered question
663
- is flipped to `Resolved→<id>`, and every document named in a
664
- `Consequences / affects:` line cites its decision.
665
- - **Then run the documentation gate** (`bash scripts/check-docs.sh`, or whatever
666
- `docs/DOCMAP.md` → *Gates* names) and print its **ratchet counts** beside the
667
- verdict, so "green" reads as *"green, and here is exactly what was not looked
668
- at"* ([`gates.md`](gates.md)). A check that skipped says so.
669
- - **The stage-0 source ledger is the work list** ([`knowledge-sources.md`](knowledge-sources.md)
670
- → *Close the loop*): every source the harvest read gets updated if this run
671
- changed or disproved it. What was worth reading at stage 0 and is wrong now is
672
- the next run's false premise.
673
- - Update host module docs / runbooks per the project's self-update rules, in the
674
- **same change**. For UI tasks, confirm the super-ux layers were updated in this
675
- change and the linter is green (super-ux *same-change* + *no-drift* rules).
676
- - **Sync the knowledge wiki** — `wiki-update` when
677
- [obsidian-wiki](https://github.com/ar9av/obsidian-wiki) is installed (detect:
678
- `~/.obsidian-wiki/config`, or the skill resolves). Not installed → recommend it
679
- once with its install line and continue; a missing wiki never blocks the gate.
680
- Distil the knowledge (decisions, seams, why), not a diff summary.
681
- - **Refresh the code graph** — `/graphify . --update` when one exists
682
- ([`knowledge-graph.md`](knowledge-graph.md)). The close-out has **three**
683
- artifacts, not two: docs, wiki, graph. The graph is the source the *next* run's
684
- harvest queries first, so a stale one is a false premise carrying the authority of
685
- a machine — a wrong doc gets argued with, a wrong graph gets believed. Incremental
686
- and model-free for code; a run that deleted code legitimately rebuilds smaller
687
- (`--force`).
688
- - **Then check the graph against the docs** — the cheap half of the divergence sweep
689
- (`graphify god-nodes`; any doc naming a module the graph no longer has). A hub no
690
- doc names, or an edge the docs deny, is either a leak in the code or a lie in the
691
- docs; a doc naming a node that no longer exists is a stale ledger row found
692
- mechanically. Doc-side findings are fixed here; **absences go to stage 10's ladder
693
- walk as REQ rows** ([`audit.md`](audit.md)).
694
- - **Docs living in another repository** are outward: propose the edit, get an
695
- explicit go, then open a PR there. No go → the exact edit goes in the carry-over
696
- ledger.
353
+
354
+ **On entry or resume:** read [stage-09-docs-wiki.md](stage-09-docs-wiki.md) before stage work.
355
+
697
356
  - **GATE (auto):** **the hygiene gate green**, counts printed; **the propagation matrix walked for every change type this run
698
357
  produced**, with every settled thing recorded under an id and every answered
699
358
  question resolved; **the documentation gate green, its ratchet counts printed and
@@ -711,88 +370,9 @@ never that the work was skipped quietly.
711
370
 
712
371
  ## 10 — Acceptance
713
372
  - **Freedom: medium** — the walk and the evidence rule are fixed; whether it is what was asked for is the operator's ([`gates.md`](gates.md) → *Axis C*).
714
- - **What:** the closing stage — go back to the brief and account for **every**
715
- requirement. Doctrine: [`acceptance.md`](acceptance.md).
716
- - **Every REQ this run shipped has a verification row, and every row names a REQ some
717
- brief carries.** Both directions: a shipped feature that entered no ledger and a
718
- ledger row about nothing are different failures ([`verification.md`](verification.md)).
719
- - **The ledger's open rows are resolved onto the board.** Every carry-over row still
720
- `open` leaves with a `B-NNN` id on `<artifacts>/backlog.md`, and the ledger row
721
- is updated to name it ([`backlog.md`](backlog.md)). Both directions, because they are
722
- different failures: a ledger row pointing at an id nobody issued, and a board row
723
- traceable to nothing. Measured before this was built: across the ledgers in
724
- this repository, **twenty-four rows sat `open` with no home at all** — deferred out
725
- loud and filed nowhere. The first count said sixteen across six ledgers; it read the
726
- status column by position and was wrong wherever a ledger carried two of them. Then the board's priority is re-derived, because `age` moved while the
727
- run was happening. Every earlier gate asks
728
- "is this artifact good?"; none asks "does this still contain everything that was
729
- asked for?" The loss happens on the seams between stages, and this is where it
730
- surfaces.
731
- - **Runs last**, after docs and wiki — those are deliverables too, and a REQ may
732
- name them.
733
- - **The ladder walk runs FIRST** ([`audit.md`](audit.md)). The REQ table can only
734
- find what was named and lost; it cannot find what was never named, because a
735
- comparison needs two sides and an absence has one. So before the table: walk each
736
- REQ bottom-up through its rungs (decision → spec section → contract **and its
737
- failure behavior** → task → change → executed test → surface/docs), check the
738
- seam at each step, and order the findings **by seam, not by file**. On UI work
739
- designed visually, the frame is a **second, parallel statement of the same
740
- surface**: read it against the spec section that covers its `SCR-` id and against
741
- what shipped. The super-ux linter proves a frame link exists, is named right and
742
- is not stale — it cannot read the picture, so a frame promising a limit, a meter
743
- or a tier nobody built passes every lint there is. **Where the VISUAL track ran, the
744
- walk carries one more row: visual intent ↔ final render** — the director record (the
745
- brief's falsifier, the signature moment, the rubric written before any render) read
746
- against the **approved contact sheet**. On a `flagship`, `product` or `ad` surface the
747
- sheet is approved (`visual_gate.py sheet … --require-approval` exits 0), and the last
748
- `review:` line per surface — how many human rounds it took — is copied into the
749
- acceptance file, because `.task-pipeline/run.md` does not outlive the run
750
- ([`audit.md`](audit.md) → the `V→R` seam). An absence
751
- becomes a **new REQ row with its check** and *then* the table is written;
752
- appending after the table is how acceptance goes green over a gap. Findings that
753
- belong to a lower layer go back to that layer (spec → stage 3, plan → stage 4).
754
- Record the pass's two counts — new findings, and findings caused by this run's
755
- own fixes — so the next pass can tell whether the axis is exhausted.
756
- - **How it runs:** built in. Read the brief's REQ table, the carry-over ledger in
757
- full, the plan's task statuses, git log, the final suite output, stage-8 notes and
758
- stage-9 doc changes (plus `docs/ux/scenarios.md` + `/ux-lint` for UI tasks). Write
759
- `<artifacts>/specs/YYYY-MM-DD-<topic>-acceptance.md` — one row per REQ,
760
- status `verified` / `partial` / `deferred` / `dropped`, each with **evidence** (a
761
- passing test name, `file:line`, a command and its output, or a scenario ID).
762
- "Done" without evidence is not done: downgrade to `partial` and say so rather
763
- than upgrading the claim.
764
- - Then ask the operator the closing question out loud, list in hand: *here's what
765
- you asked for, here's what shipped, here's what's deferred and where it lives —
766
- what's missing?* Ask it even when the table is green; the operator holds context
767
- the brief never captured, and this is the cheapest moment in the run to hear it.
768
- - **Several repositories: a submodule is finished when its parent says so.** A
769
- parent records each submodule as a **pointer to one commit**, and moving the
770
- submodule does not move the pointer — so the work is committed, pushed, CI green
771
- and done in its own roadmap, while a clone of the parent still gets the commit
772
- before it. Neither repo looks wrong alone; the disagreement lives between them,
773
- which is why it survives every check that runs inside one. Before closing, this
774
- reports nothing **for the parent as well as every submodule**:
775
- `git submodule status` (no line starting `+`), plus `git -C <repo> status
776
- --porcelain` and `git -C <repo> log @{u}..HEAD --oneline` per repo. With
777
- [agent-sync](https://github.com/ssheleg/agent-sync) installed,
778
- `/agent-sync finish` runs exactly that. The fix is two commands and the second is
779
- the forgotten one: `git -C <submodule> push`, then
780
- `git add <submodule> && git commit`.
781
- - **The retrospective is the run's last act** ([`retrospective.md`](retrospective.md)),
782
- written to `<artifacts>/retro.md` — one file per project, not per run. The
783
- pipeline's gates are good at *this* run and blind across runs: the same class of
784
- failure can be caught, fixed and forgotten five times and nothing in the flow
785
- notices it is the same one. So, in this order: **stamp the run first** (one line,
786
- with its commit — and the only thing that makes the next step computable), **then
787
- prune** (every standing instruction against its three retirement triggers — it
788
- became a check, its surface is gone, it hasn't fired in five run stamps or in sixty days — and the
789
- list held to its cap of ten, every deletion logged **in the archive, with the
790
- commit that retired it**), then **write an entry only if
791
- the run diverged** (symptom · the stage it surfaced at · the stage that *owned* it
792
- · root cause · fix, mechanical before instruction before expiring note · the check
793
- that catches it next time). Every run stamps and prunes; a retro left empty after
794
- a messy run is the failure the file exists to stop. Stage 0 reads the standing
795
- instructions in full next time, which is why the cap is not negotiable.
373
+
374
+ **On entry or resume:** read [stage-10-acceptance.md](stage-10-acceptance.md) before stage work.
375
+
796
376
  - **GATE (manual):** the ladder walk ran and its absences became REQ rows before
797
377
  the table was written; **the hand-back is written** — the request quoted as it was
798
378
  GIVEN, where the run stands against it, what was solved with its evidence, what
@@ -814,7 +394,10 @@ never that the work was skipped quietly.
814
394
  the same archive, and both counts print beside the verdict** (the stamp table is read
815
395
  in full at stage 0, so *one line per run* is a slope the prune has to stop), the run
816
396
  stamped with its commit, every SHA in either file resolvable, and the
817
- counts printed beside this verdict**; **where `pipeline.json` → `retro.publish` is
397
+ counts printed beside this verdict**; **every entry with a `**Lesson:**` line is in the
398
+ local index (`lessons.py add` printed its id) or its refusal is printed, and the shared
399
+ store's state is one ledger line** (`recorded`, `store refused — <code>`, or `shared
400
+ lessons: absent`); **where `pipeline.json` → `retro.publish` is
818
401
  set, the skill-level insight is published as an issue on the skill's repository —
819
402
  its body printed in full first, the printed string and the sent string being one
820
403
  string, and the five redaction rules applied
@@ -941,3 +524,5 @@ every run has turned a settled decision into a prompt, and a pipeline that gates
941
524
  marker count has turned a writing-quality signal into a verdict — the false positives fall
942
525
  hardest on people writing in a second language, and nothing here fails a stage for them.
943
526
  `npx sshlg-skills humanizers` lists what is installed.
527
+
528
+ Entry and resume use the recorded run state ([`continuity.md`](continuity.md)).