task-pipeline-skill 1.94.1 → 1.96.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 (58) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/CONTRIBUTING.md +32 -0
  3. package/HOW-IT-WORKS.md +4 -3
  4. package/README.md +19 -7
  5. package/SKILL-CARD.md +2 -2
  6. package/evals/RESULTS.md +55 -8
  7. package/evals/cases/task-pipeline.json +139 -0
  8. package/evals/fixtures/lessons/expect-match.sh +30 -0
  9. package/evals/fixtures/lessons/index.jsonl +2 -0
  10. package/evals/fixtures/waves-unclaimed/expect-refusal.sh +26 -0
  11. package/evals/fixtures/waves-unclaimed/inventory.json +33 -0
  12. package/evals/fixtures/waves-unclaimed/modules.json +4 -0
  13. package/evals/fixtures/waves-unclaimed/plan.json +5 -0
  14. package/evals/task-pipeline.evals.json +104 -0
  15. package/package.json +1 -1
  16. package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
  17. package/plugins/task-pipeline/agents/verifier.md +1 -1
  18. package/plugins/task-pipeline/commands/task-pipeline.md +3 -2
  19. package/plugins/task-pipeline/hooks/release-gate.sh +1 -1
  20. package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +16 -11
  21. package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +4 -0
  22. package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +19 -0
  23. package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +1 -1
  24. package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +5 -2
  25. package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +1 -1
  26. package/plugins/task-pipeline/skills/task-pipeline/references/browser.md +1 -1
  27. package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +1 -1
  28. package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +3 -2
  29. package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +10 -2
  30. package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +20 -2
  31. package/plugins/task-pipeline/skills/task-pipeline/references/finish-line.md +145 -0
  32. package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +1 -1
  33. package/plugins/task-pipeline/skills/task-pipeline/references/iteration.md +9 -5
  34. package/plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md +5 -0
  35. package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +13 -1
  36. package/plugins/task-pipeline/skills/task-pipeline/references/progress.md +8 -0
  37. package/plugins/task-pipeline/skills/task-pipeline/references/review.md +7 -2
  38. package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +7 -5
  39. package/plugins/task-pipeline/skills/task-pipeline/references/stage-00-intake.md +158 -0
  40. package/plugins/task-pipeline/skills/task-pipeline/references/stage-01-docs-study.md +10 -0
  41. package/plugins/task-pipeline/skills/task-pipeline/references/stage-02-brainstorm.md +52 -0
  42. package/plugins/task-pipeline/skills/task-pipeline/references/stage-03-spec.md +66 -0
  43. package/plugins/task-pipeline/skills/task-pipeline/references/stage-04-plan.md +11 -0
  44. package/plugins/task-pipeline/skills/task-pipeline/references/stage-05-dev.md +55 -0
  45. package/plugins/task-pipeline/skills/task-pipeline/references/stage-06-tests.md +11 -0
  46. package/plugins/task-pipeline/skills/task-pipeline/references/stage-07-lint-deploy.md +15 -0
  47. package/plugins/task-pipeline/skills/task-pipeline/references/stage-08-post-deploy.md +29 -0
  48. package/plugins/task-pipeline/skills/task-pipeline/references/stage-09-docs-wiki.md +45 -0
  49. package/plugins/task-pipeline/skills/task-pipeline/references/stage-10-acceptance.md +91 -0
  50. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +49 -484
  51. package/plugins/task-pipeline/skills/task-pipeline/references/verification.md +1 -1
  52. package/plugins/task-pipeline/skills/task-pipeline/references/waves.md +9 -6
  53. package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +1 -1
  54. package/plugins/task-pipeline/skills/task-pipeline/scripts/stage_checkpoint.py +156 -33
  55. package/plugins/task-pipeline/skills/task-pipeline/scripts/waves.py +219 -3
  56. package/plugins/task-pipeline/skills/task-pipeline/templates/brief.md +14 -0
  57. package/plugins/task-pipeline/skills/task-pipeline/templates/inventory.schema.json +15 -1
  58. package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +26 -2
@@ -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.