task-pipeline-skill 1.94.1 → 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 (37) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/CONTRIBUTING.md +32 -0
  3. package/HOW-IT-WORKS.md +4 -3
  4. package/README.md +18 -7
  5. package/SKILL-CARD.md +2 -2
  6. package/package.json +1 -1
  7. package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
  8. package/plugins/task-pipeline/agents/verifier.md +1 -1
  9. package/plugins/task-pipeline/commands/task-pipeline.md +3 -2
  10. package/plugins/task-pipeline/hooks/release-gate.sh +1 -1
  11. package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +11 -9
  12. package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +1 -1
  13. package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +1 -1
  14. package/plugins/task-pipeline/skills/task-pipeline/references/browser.md +1 -1
  15. package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +1 -1
  16. package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +3 -2
  17. package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +3 -1
  18. package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +19 -2
  19. package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +1 -1
  20. package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +12 -1
  21. package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +7 -5
  22. package/plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md +158 -0
  23. package/plugins/task-pipeline/skills/task-pipeline/references/stage-01-docs-study.md +10 -0
  24. package/plugins/task-pipeline/skills/task-pipeline/references/stage-02-brainstorm.md +52 -0
  25. package/plugins/task-pipeline/skills/task-pipeline/references/stage-03-spec.md +66 -0
  26. package/plugins/task-pipeline/skills/task-pipeline/references/stage-04-plan.md +11 -0
  27. package/plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md +55 -0
  28. package/plugins/task-pipeline/skills/task-pipeline/references/stage-06-tests.md +11 -0
  29. package/plugins/task-pipeline/skills/task-pipeline/references/stage-07-lint-deploy.md +15 -0
  30. package/plugins/task-pipeline/skills/task-pipeline/references/stage-08-post-deploy.md +29 -0
  31. package/plugins/task-pipeline/skills/task-pipeline/references/stage-09-docs-wiki.md +45 -0
  32. package/plugins/task-pipeline/skills/task-pipeline/references/stage-10-acceptance.md +91 -0
  33. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +43 -482
  34. package/plugins/task-pipeline/skills/task-pipeline/references/verification.md +1 -1
  35. package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +1 -1
  36. package/plugins/task-pipeline/skills/task-pipeline/scripts/stage_checkpoint.py +156 -33
  37. package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +2 -2
@@ -0,0 +1,10 @@
1
+ # Stage 1 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## 1 — Docs study
6
+ - **What:** ground every external library / API / SDK the task touches on the
7
+ *current* docs, before locking any contract.
8
+ - **Invoke:** the `context7` MCP — `context7:resolve-library-id` → `context7:query-docs`,
9
+ scoped by topic or the `context7-docs` skill. Web-search fallback for libs context7
10
+ can't resolve.
@@ -0,0 +1,52 @@
1
+ # Stage 2 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## 2 — Brainstorm + decompose
6
+ - **How it runs: [`brainstorm.md`](brainstorm.md)** — built into this skill. Read
7
+ the brief first (stage 0 already answered scope/constraints/done-criteria), then
8
+ explore the codebase, scope-check for decomposition, the open questions in one
9
+ batch, 2–3 approaches with a recommendation, design presented in sections and
10
+ approved section by section. **Hard gate:** no code, no scaffolding, no implementation
11
+ skill before the operator approves the design — including on "obviously simple"
12
+ tasks.
13
+ - **UI detection (mandatory check):** decide whether the task touches any
14
+ user-facing surface (web, mobile, CLI, TUI — new feature, new screen/command,
15
+ or a change to user-visible behavior). Record the verdict; it arms the UX
16
+ track in stage 3.
17
+ - **Decomposition (platforms only): [`decomposition.md`](decomposition.md).** If
18
+ the brief describes a platform rather than a change — several independent
19
+ capabilities, several surfaces that could ship separately, REQs no single
20
+ deliverable satisfies — cut it into **modules** before any spec is written, and
21
+ commit the module map (`specs/<topic>-modules.md`): what each module delivers,
22
+ the entities it owns, what it depends on, the contracts it exposes, its REQs and
23
+ its status, in build order with the walking skeleton first. Single-module work
24
+ records `single module: <name>` in the design and moves on — a skipped
25
+ decomposition is a decision, never an omission.
26
+ - **Where the queue is a work graph, it is WRITTEN here**
27
+ ([`work-graph.md`](work-graph.md)): `.task-pipeline/graph.json`, carrying the frozen REQ
28
+ ids so `serves` resolves, one node per unit of work with its owner, what it touches and
29
+ **the check that will close it**, and an edge per dependency **naming what it hands
30
+ over**. The check is the planner's job and not the verifier's: a node whose completion
31
+ test is decided by whoever happens to close it is a node two closes will disagree about,
32
+ and `validate` refuses one that names none. Then
33
+ `python3 scripts/graph.py validate` — a graph that does not validate is not a queue, and
34
+ `next` refuses to walk one. The reason to prefer it over a prose plan is measured, not
35
+ aesthetic: a 400-node graph and a 4-node graph produce the same 27-byte frontier, so the
36
+ cost of knowing what is next does not grow with the programme.
37
+ - **And the check is what THREE readings will run, not one**
38
+ ([`certification.md`](certification.md)). A node is closed by `unit`, `seam` and `product`
39
+ reports, dispatched blind and in parallel, and `certify` refuses the close until all three
40
+ pass. That is a planning fact, not only a verification one: a node whose blast radius nobody
41
+ can name is a node the seam and product tiers cannot scope, so `touches` and `serves` are
42
+ what make the two outer readings possible at all.
43
+ - **The queue exists here, so the loop arms here** ([`continuity.md`](continuity.md) →
44
+ *Part 1a*). Where the loop is armed — `run.loop` with `arm: after-decomposition`, the
45
+ operator's preflight answer, or a standing instruction the host carries (which arms here
46
+ unless it says otherwise) — and the map holds more than one module, arm the mode at the
47
+ close of this stage, cite the source as `loop: armed by <source:line>`, and print one
48
+ line: the mode, and
49
+ either the job id and its cancel command (`interval`) or the delay chosen and why
50
+ (`dynamic`). Arming collapses no gate and authorizes no outward act; it decides only
51
+ that the run does not stop to ask *"shall I take the next one?"*. Single-module work
52
+ arms nothing and says so — a loop with one item is a timer.
@@ -0,0 +1,66 @@
1
+ # Stage 3 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## 3 — Spec — with UX track for user-facing tasks
6
+ - **How it runs: [`spec.md`](spec.md)** — built into this skill: the UX-track order,
7
+ what the spec must lock (types, schemas, signatures, file layout, the **Global
8
+ Constraints** block stages 4–5 depend on), the self-review pass and the operator
9
+ review gate.
10
+ - **UX track (runs FIRST when stage 2 flagged UI; skip entirely otherwise).**
11
+ Apply [the artifact-provider contract](companion-skills.md): super-ux is the
12
+ preferred provider; equivalent artifacts or the inline fallback remain valid.
13
+ Missing or invalid scenario artifacts stop the gate, regardless of provider.
14
+ Record each unavailable check by name as NOT_RUN; do not claim a linter ran.
15
+ The following chain describes the super-ux provider when available. Other
16
+ providers owe the same scenario quality and traces, not these package commands.
17
+ When using super-ux, walk its chain top-down (see its `system-map.md`):
18
+ 0. **Destination first, when Figma is on.** The brief already names the team/org
19
+ and the files — **one per surface** (App, Web, ASO: store screenshots, icon and
20
+ logo), never one file for every frame; `docs/ux/foundation.md` → *Design tooling*
21
+ is the canonical record. Confirm each **resolves** before drawing. **Never create a file while a
22
+ recorded one resolves; if it doesn't resolve, stop and ask — never create a
23
+ replacement** (that is the duplicate, and it hides a permissions problem).
24
+ A creation happens at most once, in the named team, and its URL is written to
25
+ the canonical record before the first frame.
26
+ 1. `/ux` (the only super-ux entry) — reports which `docs/ux/` layers exist,
27
+ repairs the skeleton, records the Figma on/off choice, recommends the next
28
+ action. Never make the operator pick skills.
29
+ 2. `ux-foundation` → `docs/ux/foundation.md` — the **WHY**: personas, Jobs to
30
+ Be Done, **customer journey maps (CJM)**, user stories (Given/When/Then).
31
+ 3. `ux-flows` → `docs/ux/flows.md` + `docs/ux/screens.md` — the **HOW + UI
32
+ map**: task analysis, user-flow diagrams (branches, error paths), every
33
+ screen + state with wireframe and (Figma on) a Figma frame link.
34
+ 4. `ux-scenarios` → `docs/ux/scenarios.md` — the **WHAT** (source of truth for
35
+ behavior): scenarios validated against the scenario-format contract super-ux
36
+ itself ships (`scenario-format.md` — read its current version there, never
37
+ pin one here) — IDs, statuses, `Traces:` to stories/journey stages/flows,
38
+ edge/error states enumerated.
39
+ 5. **Run the super-ux linter** (`/ux-lint` or `python3 docs/ux/lint.py`) — it
40
+ must pass: no drift, no orphans, no broken traces or stale Figma links.
41
+ These skills are **idempotent** — reuse and extend existing `docs/ux/` layers,
42
+ never rebuild from scratch. If the chain already exists and is validated (e.g.
43
+ the task entered from super-ux), just verify (linter green) and embed it into
44
+ the spec; only build the parts that are missing.
45
+ - **COPY track and VISUAL track — a parallel layer after UX, and their
46
+ convergence.** Three tracks, three questions, none substituting for another:
47
+ super-ux decides what the interface must **do**, `copywriting` how it
48
+ **sounds** (every string a product's user will read, against the brand pack),
49
+ `sheleg-design` how it **looks** (tokens, themes, typography, motion). COPY and
50
+ VISUAL are **parallel** — both consume the UX track's scenarios, neither
51
+ consumes the other — and where both ran, **their convergence check is run and
52
+ recorded before the spec is committed**: each can be right alone and the two
53
+ disagree together on one screen. The full doctrine — each track's scope and
54
+ out-of-scope, the refusal sentences, the four contradictions the check
55
+ catches — is [`spec.md`](spec.md) → *The COPY and VISUAL tracks, and their
56
+ convergence*, its one home. **The VISUAL track leaves a trace, not a fact**: a
57
+ director record at `docs/design/<surface>/director-record.md`, whose fields the gate
58
+ reads by the brief's `surface_class` (`python3 scripts/visual_gate.py record <file>
59
+ --class <c>`), and a refusal is that same file saying `Mode: declined` and why.
60
+ - **Spec:** write the approved design to
61
+ `<artifacts>/specs/YYYY-MM-DD-<topic>-design.md` and commit it. Lock all
62
+ shared contracts (types, schemas, signatures, file layout). For UI tasks the
63
+ spec **embeds the UX layer**: links the validated scenario IDs, the flows and
64
+ `SCR-` screens, the CJM stages the feature serves, and the UX
65
+ patterns/principles from super-ux that apply (`best-practices.md`,
66
+ `ux-design-principles.md`, `component-guidelines.md`).
@@ -0,0 +1,11 @@
1
+ # Stage 4 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## 4 — Plan
6
+ - **How it runs: [`planning.md`](planning.md)** — built into this skill →
7
+ `<artifacts>/plans/YYYY-MM-DD-<topic>.md` (same slug as the brief and the
8
+ spec). Zero-context tasks, exact
9
+ paths, complete code in every step, TDD steps with expected output, DoD each,
10
+ dependency graph + parallel groups, non-overlapping file ownership, and the
11
+ Global Constraints block copied verbatim from the spec.
@@ -0,0 +1,55 @@
1
+ # Stage 5 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## 5 — Dev
6
+ - **How it runs: [`build.md`](build.md)** — built into this skill: isolate the
7
+ workspace (native worktree tool first, git fallback, baseline tests), keep a
8
+ ledger under `.task-pipeline/build/<plan>/` so a compacted context can resume,
9
+ then one fresh implementer subagent per task with a file-based brief and report,
10
+ a review after every task ([`review.md`](review.md)), and a five-round fix loop
11
+ with an explicit breaker. TDD per task ([`tdd.md`](tdd.md)): failing test →
12
+ watch it fail → minimal impl → watch it pass → commit. Pin subagents to the
13
+ run's confirmed model (`model-tiering.md`). The plan's parallel groups fan out
14
+ **only when all three hold** — the tasks share no `depends:`, their file ownership
15
+ is exclusive per the plan, and each implementer gets its own worktree; otherwise
16
+ sequential. A group that did fan out gets **one convergence check over all its
17
+ reports and diffs together, before the first worktree is integrated**
18
+ ([`build.md`](build.md) §4.2a) — a per-task review reads one diff and cannot see a
19
+ contradiction that exists only between two of them.
20
+ - **Web front end? The task's own surface is checked in a browser, not in the diff.**
21
+ Where a browser channel is connected — `playwright` **or** `chrome-devtools`, either
22
+ one, whichever answers first (**how**: [`browser.md`](browser.md); which:
23
+ [`companion-skills.md`](companion-skills.md)): after a
24
+ task that changes a rendered surface, load it, take a snapshot and read the
25
+ console and the network log **before the task is marked DONE** — a component can be
26
+ correct and land under a fixed header, and a review of the diff cannot see that.
27
+ **What the look finds is fixed in this task, or parked with the ruling the GATE below
28
+ requires — never parked silently** — a browser finding filed without a ruling is the
29
+ diff-review verdict wearing a screenshot; the look was worth taking only if it can
30
+ still change the code or is on record as deliberately not doing so. Absent, say the surface was verified by reading
31
+ the diff and treat it as the weaker claim it is. **On a surface whose brief names a
32
+ `surface_class`, the project linter runs here too**, after each task that changes a
33
+ rendered surface — `python3 scripts/visual_gate.py lint <dir>`; an S1 finding is
34
+ fixed in the task, and NOT_RUN (exit 3) is recorded as such
35
+ ([`browser.md`](browser.md) → *The visual half*). **With Figma on, the token drift
36
+ probe runs beside it** after a task that touches the token file or a tokenised
37
+ component: `python3 scripts/visual_gate.py tokens --figma <variables.json> --css
38
+ <tokens.css>`. A FAIL is fixed in the task, renaming one side to match the other.
39
+ No export is NOT_RUN, recorded as such. A component whose API the task changed
40
+ updates its Code Connect mapping in the same change
41
+ ([`build.md`](build.md) → *Code Connect, kept*). A slop marker caught while the
42
+ 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
43
+ implementer that wrote it is still dispatched. The matrix pointed this companion at
44
+ stages 5–6 from the day it was added and **this stage had never named it** — found by
45
+ the guard comparing the two, not by a reader.
46
+ - **Domain companions, where the task is on their ground** — recommended, never a
47
+ gate ([`companion-skills.md`](companion-skills.md)): `sheleg-dev` when the build
48
+ wires money, tracking, sign-in or page speed; `agent-stack` when the thing being
49
+ built is an agent system; `telegram-dev` when Telegram is the platform rather
50
+ than the transport. Absent, the build ships on the host's own doctrine and the
51
+ close-out names the seam nobody checked.
52
+ - **Integration closes the stage:** sync with the base branch, re-run the full suite
53
+ on the result, land it the project's way (merge, or a PR — outward, so it needs a
54
+ go), remove the worktree. Stages 7–9 act on the integrated result, so a branch the
55
+ operator chose to leave unmerged is recorded as such.
@@ -0,0 +1,11 @@
1
+ # Stage 6 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## 6 — Tests
6
+ - **What:** consolidate test coverage for the change: confirm new functionality
7
+ has tests (written test-first in stage 5), update/repair existing tests the
8
+ change touched, and add edge-case + failure-path tests per DoD.
9
+ - **Invoke:** the host test runner (see `conventions.md` → *Lint + test*); the
10
+ built-in [`tdd.md`](tdd.md) cycle for any uncovered gap — failing test first,
11
+ same as stage 5.
@@ -0,0 +1,15 @@
1
+ # Stage 7 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## 7 — Lint + deploy
6
+ - Read host conventions (`conventions.md`): run the linter; fix failures. The suite
7
+ is already green from stage 6 — re-run it if code changed since. For UI projects,
8
+ the **super-ux linter** (`python3 docs/ux/lint.py` / `/ux-lint`) is part of lint —
9
+ it must pass too (no UX drift merges). Then deploy per the project's convention;
10
+ if the project defines release automation (`pipeline.json` → `release`, toggle
11
+ on), that is what "deploy" runs here. **No runbook, or one too thin to act on?
12
+ Write it first** ([`deploy-targets.md`](deploy-targets.md)) — a deploy performed
13
+ from inference about the project is one nobody can repeat or roll back, and the
14
+ operator is standing at this gate anyway. That reference also carries the CLI
15
+ verbs per target for when the runbook names a platform you have to recall.
@@ -0,0 +1,29 @@
1
+ # Stage 8 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## 8 — Post-deploy
6
+ - Tail deploy logs / health-check per conventions. Confirm clean boot, no error
7
+ spike, live subsystems healthy. **All three of the verification trio, not one of
8
+ them** ([`deploy-targets.md`](deploy-targets.md) → *The verification trio*):
9
+ deployment/process state, runtime logs, and a health-check request from outside.
10
+ Where deploy happens in CI, verify the **deploy** job and not only the build —
11
+ a green build beside a skipped deploy is the commonest way a run reports success
12
+ while nothing shipped.
13
+ - **A deployed web target is opened, not curled.** A `200` proves the server
14
+ answered; it says nothing about whether the page rendered, whether a bundle 404'd,
15
+ or whether the console filled with errors on load — all three ship green past a
16
+ health check. Where a browser channel is connected — `playwright` **or**
17
+ `chrome-devtools`, either one ([`browser.md`](browser.md)) — load the deployed URL and read
18
+ the console and the network log; quote what you read, not that you looked
19
+ ([`companion-skills.md`](companion-skills.md)). Absent → say the check was an HTTP
20
+ response only, which is the honest name for it.
21
+ - **Read the CI verdict for the deploy's own commit** ([`conventions.md`](conventions.md)
22
+ → *The CI verdict*): the run's conclusion quoted, the **failing step's log quoted**
23
+ on anything but `success`, and one of the three states stated — including **`no run
24
+ found`**, out loud, because a project without CI is a legitimate state and not a
25
+ green one.
26
+ - **A public surface a logged-out reader will see** can additionally be audited for
27
+ search and answer-engine visibility with `seo-aeo-audit`
28
+ ([`companion-skills.md`](companion-skills.md)) — recommended, never a gate;
29
+ absent, visibility ships unaudited and the close-out says so.
@@ -0,0 +1,45 @@
1
+ # Stage 9 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## 9 — Docs + wiki
6
+ - **The propagation sweep runs first** ([`documentation.md`](documentation.md)).
7
+ The ledger below names the documents you **read**; the matrix in `docs/DOCMAP.md`
8
+ names the documents you **owe**. They are not the same list, and the gap between
9
+ them is where documentation rots — the document nobody read is exactly the
10
+ document nobody updated. Walk the matrix row for **every** change type this run
11
+ produced. Every settled thing gets an id in the register, every answered question
12
+ is flipped to `Resolved→<id>`, and every document named in a
13
+ `Consequences / affects:` line cites its decision.
14
+ - **Then run the documentation gate** (`bash scripts/check-docs.sh`, or whatever
15
+ `docs/DOCMAP.md` → *Gates* names) and print its **ratchet counts** beside the
16
+ verdict, so "green" reads as *"green, and here is exactly what was not looked
17
+ at"* ([`gates.md`](gates.md)). A check that skipped says so.
18
+ - **The stage-0 source ledger is the work list** ([`knowledge-sources.md`](knowledge-sources.md)
19
+ → *Close the loop*): every source the harvest read gets updated if this run
20
+ changed or disproved it. What was worth reading at stage 0 and is wrong now is
21
+ the next run's false premise.
22
+ - Update host module docs / runbooks per the project's self-update rules, in the
23
+ **same change**. For UI tasks, confirm the super-ux layers were updated in this
24
+ change and the linter is green (super-ux *same-change* + *no-drift* rules).
25
+ - **Sync the knowledge wiki** — `wiki-update` when
26
+ [obsidian-wiki](https://github.com/ar9av/obsidian-wiki) is installed (detect:
27
+ `~/.obsidian-wiki/config`, or the skill resolves). Not installed → recommend it
28
+ once with its install line and continue; a missing wiki never blocks the gate.
29
+ Distil the knowledge (decisions, seams, why), not a diff summary.
30
+ - **Refresh the code graph** — `/graphify . --update` when one exists
31
+ ([`knowledge-graph.md`](knowledge-graph.md)). The close-out has **three**
32
+ artifacts, not two: docs, wiki, graph. The graph is the source the *next* run's
33
+ harvest queries first, so a stale one is a false premise carrying the authority of
34
+ a machine — a wrong doc gets argued with, a wrong graph gets believed. Incremental
35
+ and model-free for code; a run that deleted code legitimately rebuilds smaller
36
+ (`--force`).
37
+ - **Then check the graph against the docs** — the cheap half of the divergence sweep
38
+ (`graphify god-nodes`; any doc naming a module the graph no longer has). A hub no
39
+ doc names, or an edge the docs deny, is either a leak in the code or a lie in the
40
+ docs; a doc naming a node that no longer exists is a stale ledger row found
41
+ mechanically. Doc-side findings are fixed here; **absences go to stage 10's ladder
42
+ walk as REQ rows** ([`audit.md`](audit.md)).
43
+ - **Docs living in another repository** are outward: propose the edit, get an
44
+ explicit go, then open a PR there. No go → the exact edit goes in the carry-over
45
+ ledger.
@@ -0,0 +1,91 @@
1
+ # Stage 10 detail
2
+
3
+ The full gate and freedom level remain in [stages.md](stages.md).
4
+
5
+ ## 10 — Acceptance
6
+ - **What:** the closing stage — go back to the brief and account for **every**
7
+ requirement. Doctrine: [`acceptance.md`](acceptance.md).
8
+ - **Every REQ this run shipped has a verification row, and every row names a REQ some
9
+ brief carries.** Both directions: a shipped feature that entered no ledger and a
10
+ ledger row about nothing are different failures ([`verification.md`](verification.md)).
11
+ - **The ledger's open rows are resolved onto the board.** Every carry-over row still
12
+ `open` leaves with a `B-NNN` id on `<artifacts>/backlog.md`, and the ledger row
13
+ is updated to name it ([`backlog.md`](backlog.md)). Both directions, because they are
14
+ different failures: a ledger row pointing at an id nobody issued, and a board row
15
+ traceable to nothing. Measured before this was built: across the ledgers in
16
+ this repository, **twenty-four rows sat `open` with no home at all** — deferred out
17
+ loud and filed nowhere. The first count said sixteen across six ledgers; it read the
18
+ 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
19
+ run was happening. Every earlier gate asks
20
+ "is this artifact good?"; none asks "does this still contain everything that was
21
+ asked for?" The loss happens on the seams between stages, and this is where it
22
+ surfaces.
23
+ - **Runs last**, after docs and wiki — those are deliverables too, and a REQ may
24
+ name them.
25
+ - **The ladder walk runs FIRST** ([`audit.md`](audit.md)). The REQ table can only
26
+ find what was named and lost; it cannot find what was never named, because a
27
+ comparison needs two sides and an absence has one. So before the table: walk each
28
+ REQ bottom-up through its rungs (decision → spec section → contract **and its
29
+ failure behavior** → task → change → executed test → surface/docs), check the
30
+ seam at each step, and order the findings **by seam, not by file**. On UI work
31
+ designed visually, the frame is a **second, parallel statement of the same
32
+ surface**: read it against the spec section that covers its `SCR-` id and against
33
+ what shipped. The super-ux linter proves a frame link exists, is named right and
34
+ is not stale — it cannot read the picture, so a frame promising a limit, a meter
35
+ or a tier nobody built passes every lint there is. **Where the VISUAL track ran, the
36
+ walk carries one more row: visual intent ↔ final render** — the director record (the
37
+ brief's falsifier, the signature moment, the rubric written before any render) read
38
+ against the **approved contact sheet**. On a `flagship`, `product` or `ad` surface the
39
+ sheet is approved (`visual_gate.py sheet … --require-approval` exits 0), and the last
40
+ `review:` line per surface — how many human rounds it took — is copied into the
41
+ acceptance file, because `.task-pipeline/run.md` does not outlive the run
42
+ ([`audit.md`](audit.md) → the `V→R` seam). An absence
43
+ becomes a **new REQ row with its check** and *then* the table is written;
44
+ appending after the table is how acceptance goes green over a gap. Findings that
45
+ belong to a lower layer go back to that layer (spec → stage 3, plan → stage 4).
46
+ Record the pass's two counts — new findings, and findings caused by this run's
47
+ own fixes — so the next pass can tell whether the axis is exhausted.
48
+ - **How it runs:** built in. Read the brief's REQ table, the carry-over ledger in
49
+ full, the plan's task statuses, git log, the final suite output, stage-8 notes and
50
+ stage-9 doc changes (plus `docs/ux/scenarios.md` + `/ux-lint` for UI tasks). Write
51
+ `<artifacts>/specs/YYYY-MM-DD-<topic>-acceptance.md` — one row per REQ,
52
+ status `verified` / `partial` / `deferred` / `dropped`, each with **evidence** (a
53
+ passing test name, `file:line`, a command and its output, or a scenario ID).
54
+ "Done" without evidence is not done: downgrade to `partial` and say so rather
55
+ than upgrading the claim.
56
+ - Then ask the operator the closing question out loud, list in hand: *here's what
57
+ you asked for, here's what shipped, here's what's deferred and where it lives —
58
+ what's missing?* Ask it even when the table is green; the operator holds context
59
+ the brief never captured, and this is the cheapest moment in the run to hear it.
60
+ - **Several repositories: a submodule is finished when its parent says so.** A
61
+ parent records each submodule as a **pointer to one commit**, and moving the
62
+ submodule does not move the pointer — so the work is committed, pushed, CI green
63
+ and done in its own roadmap, while a clone of the parent still gets the commit
64
+ before it. Neither repo looks wrong alone; the disagreement lives between them,
65
+ which is why it survives every check that runs inside one. Before closing, this
66
+ reports nothing **for the parent as well as every submodule**:
67
+ `git submodule status` (no line starting `+`), plus `git -C <repo> status
68
+ --porcelain` and `git -C <repo> log @{u}..HEAD --oneline` per repo. With
69
+ [agent-sync](https://github.com/ssheleg/agent-sync) installed,
70
+ `/agent-sync finish` runs exactly that. The fix is two commands and the second is
71
+ the forgotten one: `git -C <submodule> push`, then
72
+ `git add <submodule> && git commit`.
73
+ - **The retrospective is the run's last act** ([`retrospective.md`](retrospective.md)),
74
+ written to `<artifacts>/retro.md` — one file per project, not per run. The
75
+ pipeline's gates are good at *this* run and blind across runs: the same class of
76
+ failure can be caught, fixed and forgotten five times and nothing in the flow
77
+ notices it is the same one. So, in this order: **stamp the run first** (one line,
78
+ with its commit — and the only thing that makes the next step computable), **then
79
+ prune** (every standing instruction against its three retirement triggers — it
80
+ became a check, its surface is gone, it hasn't fired in five run stamps or in sixty days — and the
81
+ list held to its cap of ten, every deletion logged **in the archive, with the
82
+ commit that retired it**), then **write an entry only if
83
+ the run diverged** (symptom · the stage it surfaced at · the stage that *owned* it
84
+ · root cause · fix, mechanical before instruction before expiring note · the check
85
+ that catches it next time). An entry whose class would be true in another project
86
+ carries a `**Lesson:**` line, and **`scripts/lessons.py add --retro <retro> --entry
87
+ <anchor>` puts it in the local lesson index** — and, where the session lists a shared
88
+ store, `emit-observatory` → the tool → `record` ([`iteration.md`](iteration.md) → *The
89
+ learning loop*). Every run stamps and prunes; a retro left empty after
90
+ a messy run is the failure the file exists to stop. Stage 0 reads the standing
91
+ instructions in full next time, which is why the cap is not negotiable.