@gobing-ai/spur 0.4.14 → 0.4.16

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 (121) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.global.yaml +21 -8
  3. package/config/decisions/executor.yaml +53 -0
  4. package/config/decisions/task-pipeline.yaml +44 -28
  5. package/config/pipeline-budgets.json +0 -14
  6. package/config/workflow-candidates.json +18 -0
  7. package/config/workflows/feature-lifecycle.yaml +9 -16
  8. package/config/workflows/idea-pipeline.yaml +158 -740
  9. package/config/workflows/task-pipeline.yaml +66 -54
  10. package/config/workflows/wrapup-pipeline.yaml +91 -623
  11. package/package.json +11 -10
  12. package/plugins/sp/README.md +9 -5
  13. package/plugins/sp/agents/expert-spur.md +3 -0
  14. package/plugins/sp/agents/super-planner.md +5 -1
  15. package/plugins/sp/agents/super-reviewer.md +43 -12
  16. package/plugins/sp/commands/dev-fixall.md +7 -2
  17. package/plugins/sp/commands/dev-idea.md +15 -6
  18. package/plugins/sp/commands/dev-plan.md +1 -1
  19. package/plugins/sp/commands/dev-pr-review.md +6 -6
  20. package/plugins/sp/commands/dev-run.md +3 -0
  21. package/plugins/sp/commands/dev-runall.md +6 -3
  22. package/plugins/sp/commands/dev-verify.md +1 -1
  23. package/plugins/sp/commands/dev-wrap.md +1 -1
  24. package/plugins/sp/commands/dev-wrapall.md +4 -4
  25. package/plugins/sp/plugin.json +1 -1
  26. package/plugins/sp/skills/code-implementation/SKILL.md +8 -8
  27. package/plugins/sp/skills/code-improvement/SKILL.md +3 -3
  28. package/plugins/sp/skills/code-review/references/verification-before-completion.md +5 -4
  29. package/plugins/sp/skills/code-verification/SKILL.md +4 -4
  30. package/plugins/sp/skills/code-verification/references/verdict-schema.md +27 -11
  31. package/plugins/sp/skills/functional-review/SKILL.md +1 -1
  32. package/plugins/sp/skills/functional-review/references/verdict-schema.md +1 -1
  33. package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
  34. package/plugins/sp/skills/pr-reviewing/SKILL.md +36 -18
  35. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +2 -1
  36. package/plugins/sp/skills/spur-check/SKILL.md +1 -1
  37. package/plugins/sp/skills/spur-cli/SKILL.md +23 -2
  38. package/plugins/sp/skills/spur-cli/references/agent.md +12 -0
  39. package/plugins/sp/skills/spur-cli/references/builder.md +2 -2
  40. package/plugins/sp/skills/spur-cli/references/decision/lifecycle.md +166 -0
  41. package/plugins/sp/skills/spur-cli/references/decision.md +146 -16
  42. package/plugins/sp/skills/spur-cli/references/features.md +19 -0
  43. package/plugins/sp/skills/spur-cli/references/rules.md +2 -0
  44. package/plugins/sp/skills/spur-cli/references/tasks.md +14 -1
  45. package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +1 -1
  46. package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +3 -2
  47. package/plugins/sp/skills/spur-cli/references/workflows.md +9 -0
  48. package/plugins/sp/skills/spur-composer/SKILL.md +20 -1
  49. package/plugins/sp/skills/spur-dev/SKILL.md +16 -16
  50. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +2 -1
  51. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +2 -2
  52. package/plugins/sp/skills/spur-dev/references/decision-points.md +97 -0
  53. package/plugins/sp/skills/spur-dev/references/dev-operations.md +18 -18
  54. package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +1 -1
  55. package/plugins/sp/skills/spur-dev/references/execution-batch.md +19 -10
  56. package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +4 -4
  57. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +41 -29
  58. package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +34 -2
  59. package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +4 -4
  60. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +3 -3
  61. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +3 -2
  62. package/plugins/sp/skills/spur-dev/references/glossary.md +12 -3
  63. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +7 -6
  64. package/plugins/sp/skills/spur-doctor/SKILL.md +23 -0
  65. package/plugins/sp/skills/wayfinder/SKILL.md +11 -1
  66. package/spur.js +25617 -24290
  67. package/web/_astro/{BoardApp.Bjdp3XWV.js → BoardApp.CC7Mwswv.js} +65 -65
  68. package/web/_astro/{BoardApp.DCDZxLlQ.js → BoardApp.mWyrWCAR.js} +1 -1
  69. package/web/_astro/{TaskDetail.B3vBxynO.js → TaskDetail.CtAXuiv8.js} +1 -1
  70. package/web/_astro/{arc.DcuHTB_T.js → arc.Duf4u60i.js} +1 -1
  71. package/web/_astro/{architectureDiagram-3BPJPVTR.ClOFWBON.js → architectureDiagram-3BPJPVTR.JoymtqxN.js} +1 -1
  72. package/web/_astro/{blockDiagram-GPEHLZMM.otYyr7Zb.js → blockDiagram-GPEHLZMM.BvmhcioC.js} +1 -1
  73. package/web/_astro/{c4Diagram-AAUBKEIU.BCjpc9LP.js → c4Diagram-AAUBKEIU.CfaWkgoQ.js} +1 -1
  74. package/web/_astro/channel.DtEPXXcH.js +1 -0
  75. package/web/_astro/{chunk-2J33WTMH.D5Wpnpt_.js → chunk-2J33WTMH.B7uR02cD.js} +1 -1
  76. package/web/_astro/{chunk-4BX2VUAB.DkQGtWNz.js → chunk-4BX2VUAB.SwiEauYR.js} +1 -1
  77. package/web/_astro/{chunk-55IACEB6.B7dqjAip.js → chunk-55IACEB6.6ZRCK8PO.js} +1 -1
  78. package/web/_astro/{chunk-727SXJPM.BDQvnKE2.js → chunk-727SXJPM.Cxra_G3N.js} +1 -1
  79. package/web/_astro/{chunk-AQP2D5EJ.D92doBX5.js → chunk-AQP2D5EJ.Cxd7gZeX.js} +1 -1
  80. package/web/_astro/{chunk-FMBD7UC4.C968oI5G.js → chunk-FMBD7UC4.DCLhFkVc.js} +1 -1
  81. package/web/_astro/{chunk-ND2GUHAM.AkkYC1bY.js → chunk-ND2GUHAM.B9AmKcv6.js} +1 -1
  82. package/web/_astro/{chunk-QZHKN3VN.sCc-rKKo.js → chunk-QZHKN3VN.DOjCvl6S.js} +1 -1
  83. package/web/_astro/{classDiagram-4FO5ZUOK.pOQ9u0mY.js → classDiagram-4FO5ZUOK.BMiT_mNf.js} +1 -1
  84. package/web/_astro/{classDiagram-v2-Q7XG4LA2.pOQ9u0mY.js → classDiagram-v2-Q7XG4LA2.BMiT_mNf.js} +1 -1
  85. package/web/_astro/{cose-bilkent-S5V4N54A.CRaeD6FY.js → cose-bilkent-S5V4N54A.mLBCEGjI.js} +1 -1
  86. package/web/_astro/{cynefin-OW5HDTMX.BiCPBu54.js → cynefin-OW5HDTMX.CjDAY0qn.js} +1 -1
  87. package/web/_astro/{dagre-BM42HDAG.C1-q3vkT.js → dagre-BM42HDAG._G_sP8fP.js} +1 -1
  88. package/web/_astro/{diagram-2AECGRRQ.BSVOv30O.js → diagram-2AECGRRQ.39OcfSuz.js} +1 -1
  89. package/web/_astro/{diagram-5GNKFQAL.CHMkjJ-V.js → diagram-5GNKFQAL.D7v_eNC4.js} +1 -1
  90. package/web/_astro/{diagram-KO2AKTUF.CKY9M564.js → diagram-KO2AKTUF.Da1x-lhg.js} +1 -1
  91. package/web/_astro/{diagram-LMA3HP47.B9yNJiTP.js → diagram-LMA3HP47.C8EnzbEb.js} +1 -1
  92. package/web/_astro/{diagram-OG6HWLK6.Dk8AUGsk.js → diagram-OG6HWLK6.DPnBj69F.js} +1 -1
  93. package/web/_astro/{erDiagram-TEJ5UH35.BQHR89TZ.js → erDiagram-TEJ5UH35.CXMu2TIh.js} +1 -1
  94. package/web/_astro/{flowDiagram-I6XJVG4X.oNkWVgoK.js → flowDiagram-I6XJVG4X.ZklePVtQ.js} +1 -1
  95. package/web/_astro/{ganttDiagram-6RSMTGT7.Kz2U2nu9.js → ganttDiagram-6RSMTGT7.BhYOkdqk.js} +1 -1
  96. package/web/_astro/{gitGraphDiagram-PVQCEYII.DHIZ_wPq.js → gitGraphDiagram-PVQCEYII.CADyX8a1.js} +1 -1
  97. package/web/_astro/{infoDiagram-5YYISTIA.D0NJLcv9.js → infoDiagram-5YYISTIA.BsdmwjHt.js} +1 -1
  98. package/web/_astro/{ishikawaDiagram-YF4QCWOH.CFEfTWRG.js → ishikawaDiagram-YF4QCWOH.CzjZ3Crd.js} +1 -1
  99. package/web/_astro/{journeyDiagram-JHISSGLW.Dc7IE7I4.js → journeyDiagram-JHISSGLW.Bxj-ZH_t.js} +1 -1
  100. package/web/_astro/{kanban-definition-UN3LZRKU.D5v0xO9k.js → kanban-definition-UN3LZRKU.Cbg3wVvX.js} +1 -1
  101. package/web/_astro/{linear.wR5KzXnE.js → linear.DJNUrBI9.js} +1 -1
  102. package/web/_astro/{mermaid.core.BDQ2FoPd.js → mermaid.core.DVHQV3SF.js} +4 -4
  103. package/web/_astro/{mindmap-definition-RKZ34NQL.W6_INsia.js → mindmap-definition-RKZ34NQL.DyomosRU.js} +1 -1
  104. package/web/_astro/{pieDiagram-4H26LBE5.61ihbgkK.js → pieDiagram-4H26LBE5.DajtFknN.js} +1 -1
  105. package/web/_astro/{quadrantDiagram-W4KKPZXB.B5lEpFLo.js → quadrantDiagram-W4KKPZXB.Bjq6SjGe.js} +1 -1
  106. package/web/_astro/{requirementDiagram-4Y6WPE33.CmhVBVX0.js → requirementDiagram-4Y6WPE33.ubBVqGLP.js} +1 -1
  107. package/web/_astro/{sankeyDiagram-5OEKKPKP.D7Vvj9Wf.js → sankeyDiagram-5OEKKPKP.I4q46xd-.js} +1 -1
  108. package/web/_astro/{sequenceDiagram-3UESZ5HK.B1vPLixM.js → sequenceDiagram-3UESZ5HK.DsCgZIa8.js} +1 -1
  109. package/web/_astro/{stateDiagram-AJRCARHV.BnACmrGi.js → stateDiagram-AJRCARHV.DcYjYSqT.js} +1 -1
  110. package/web/_astro/{stateDiagram-v2-BHNVJYJU.CW4pnmc3.js → stateDiagram-v2-BHNVJYJU.Dt8yPqiS.js} +1 -1
  111. package/web/_astro/{timeline-definition-PNZ67QCA.CkzMCPnC.js → timeline-definition-PNZ67QCA.0YTkoa5F.js} +1 -1
  112. package/web/_astro/{vennDiagram-CIIHVFJN.CY4aNdAR.js → vennDiagram-CIIHVFJN.BNl0l1hs.js} +1 -1
  113. package/web/_astro/{wardleyDiagram-YWT4CUSO.BtoU9UFk.js → wardleyDiagram-YWT4CUSO.BYSX6cfn.js} +1 -1
  114. package/web/_astro/{xychartDiagram-2RQKCTM6._9ijUUAs.js → xychartDiagram-2RQKCTM6.DzxxpixK.js} +1 -1
  115. package/web/index.html +1 -1
  116. package/worker/laya_worker.py +219 -0
  117. package/config/workflows/feature-verification.yaml +0 -98
  118. package/config/workflows/pr-review.yaml +0 -209
  119. package/config/workflows/wayfinder-resolution.yaml +0 -302
  120. package/plugins/sp/skills/wayfinder/references/pipeline-resolution.md +0 -30
  121. package/web/_astro/channel.qgOLXjI_.js +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.4.14",
3
+ "version": "0.4.16",
4
4
  "description": "Spur CLI — local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
5
5
  "keywords": [
6
6
  "spur",
@@ -32,6 +32,7 @@
32
32
  "files": [
33
33
  "spur.js",
34
34
  "config",
35
+ "worker",
35
36
  "schemas",
36
37
  "board",
37
38
  "web",
@@ -49,7 +50,7 @@
49
50
  "dev": "bun run src/index.ts",
50
51
  "build": "bun run ../../scripts/spur-dev.ts build-cli",
51
52
  "build:binaries": "bun run ../../scripts/spur-dev.ts build-binaries",
52
- "build:bundle": "bun run ../../scripts/spur-dev.ts bundle-web && bun run ../../scripts/spur-dev.ts emit-board-types && bun build src/index.ts --target=bun --outfile spur.js --external @johnhenry/backend-webgpu && bun run ../../scripts/spur-dev.ts bundle-config config && bun run ../../scripts/spur-dev.ts bundle-plugins",
53
+ "build:bundle": "bun run ../../scripts/spur-dev.ts bundle-web && bun run ../../scripts/spur-dev.ts emit-board-types && bun build src/index.ts --target=bun --outfile spur.js --external @johnhenry/backend-webgpu && bun run ../../scripts/spur-dev.ts bundle-config config && bun run ../../scripts/spur-dev.ts bundle-laya-worker && bun run ../../scripts/spur-dev.ts bundle-plugins",
53
54
  "test": "bun test tests --coverage --coverage-dir=../../.coverage --pass-with-no-tests",
54
55
  "typecheck": "tsc --noEmit",
55
56
  "prepack": "bun run build:bundle",
@@ -57,14 +58,14 @@
57
58
  },
58
59
  "devDependencies": {
59
60
  "@commander-js/extra-typings": "^14.0.0",
60
- "@gobing-ai/ts-db": "^0.5.28",
61
- "@gobing-ai/ts-ai-runner": "^0.5.28",
62
- "@gobing-ai/ts-dual-workflow-engine": "^0.5.28",
63
- "@gobing-ai/ts-infra": "^0.5.28",
64
- "@gobing-ai/ts-llm-jsonl-importer": "^0.5.28",
65
- "@gobing-ai/ts-rule-engine": "^0.5.28",
66
- "@gobing-ai/ts-runtime": "^0.5.28",
67
- "@gobing-ai/ts-utils": "^0.5.28",
61
+ "@gobing-ai/ts-db": "^0.5.32",
62
+ "@gobing-ai/ts-ai-runner": "^0.5.32",
63
+ "@gobing-ai/ts-dual-workflow-engine": "^0.5.32",
64
+ "@gobing-ai/ts-infra": "^0.5.32",
65
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.5.32",
66
+ "@gobing-ai/ts-rule-engine": "^0.5.32",
67
+ "@gobing-ai/ts-runtime": "^0.5.32",
68
+ "@gobing-ai/ts-utils": "^0.5.32",
68
69
  "@types/bun": "1.4.3",
69
70
  "@types/figlet": "^1.7.0",
70
71
  "@types/node-notifier": "8.0.5",
@@ -29,7 +29,7 @@ One feature, start to finish — see the Command index below for exact command n
29
29
  ```
30
30
  idea/plan vague description → feature + AC + decomposed task batch
31
31
  ↓
32
- run <wbs> → pipeline: precheck → implement → test → review → approve(HITL) → verify → record → done
32
+ run <wbs> → pipeline: precheck → implement → gate ⇄ remediate → review → done (decision points route repair, stop and approval)
33
33
  ↓
34
34
  verify <wbs> → traceability + AC verdict (PASS clears the gate; this also runs inside the run step)
35
35
  ↓
@@ -95,8 +95,8 @@ list this README is checked against.
95
95
 
96
96
  | Command | What it does |
97
97
  | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
98
- | `dev-idea` | Turn a vague idea into a feature with AC and a decomposed task batch — discovery, idea-eval, feature-create, AC, feature-check, system-design, decompose, batch-create, handoff |
99
- | `dev-plan` | Plan a feature from a written description — intake → feature create → AC generation → feature check gate → decomposition → batch-create |
98
+ | `dev-idea` | Turn a vague idea into a feature with AC and a decomposed task batch — discovery, idea-eval, feature-create, AC, system-design, decompose, batch-create, handoff |
99
+ | `dev-plan` | Plan a feature from a written description — intake → feature create → AC generation → decomposition → batch-create |
100
100
  | `dev-brainstorm` | Interactive solution design — heuristic discovery interview followed by structured ideation with trade-offs and confidence scoring |
101
101
  | `dev-find-way` | Wayfinder — chart a multi-session investigation map, or resolve one map ticket; always in an isolated git worktree + branch (`--worktree`, `--wrap`) |
102
102
  | `dev-refine` | Refine task requirements via structured Q&A — clarify scope, elicit missing details, tighten acceptance criteria; `--depth ready` audits and corrects existing claims, freezes the spec, promotes to todo |
@@ -348,7 +348,7 @@ surface or run one workflow. All skills target the same five core platforms: `cl
348
348
  | `conflict-finding` | 1.0 | Authority-aware semantic audit — four-pillar (source/task/feature/authority) conflict discovery, claim-specific authority resolution, reproducible evidence, confirmed owner-routed remediation; backs `/sp:dev-find-conflict` |
349
349
  | `fleet-join` | 1.0 | Guest fleet occupancy — join as a live guest occupant, loop `spur agent wait --inbox` to pull work, reply through `spur message reply`, then leave; G73 (task 1081) |
350
350
  | `next-feature` | 1.0 | Prompt-first feature frontier prioritizer — sync-first precondition, B3 actionability gate (cited, never restated), tiered rubric over measured signals, D1–D4 defect proposals conforming to the restructure map schema; backs `/sp:dev-find-next` |
351
- | `pr-reviewing` | 1.0 | GitHub Codex PR review — PR prepare/reuse, `@codex review` request with per-HEAD dedupe, bounded polling, findings normalization, validated fix + re-review; spine SSOT `pr-review.yaml` + `spur builder pr`; backs `/sp:dev-pr-review` |
351
+ | `pr-reviewing` | 1.0 | GitHub Codex PR review — PR prepare/reuse, `@codex review` request with per-HEAD dedupe, bounded polling, findings normalization, validated fix + re-review; direct `spur builder pr-status`/`pr-check`/`pr-open`/`pr-review` sequence; backs `/sp:dev-pr-review` |
352
352
  | `indexed-context` | 1.0 | Cross-agent project context — anatomy/learnings/pitfalls/buglog/memory in `.spur/context/`; hook-tracked token-ledger; graceful degradation on agents without hooks |
353
353
  | `history-anatomy` | 1.0 | Diagnostic interpretation owner over already-imported history — daily/ad-hoc mode contract, closed finding taxonomy, twelve-section report contract, `enrich`/`validate` rubrics; no workflow launch, no JSONL fallback, no corpus mutation |
354
354
  | `session-review` | 1.1 | Inline review of the active coding-agent session — compact outcomes, evidence-backed resolved/open issue classification, proposal-only improvements, and next actions; no workflow, import, delegation, or mutation |
@@ -695,7 +695,11 @@ pipeline owns one lifecycle phase:
695
695
  | `task-pipeline.yaml` | Single-task execution | `/sp:dev-run` |
696
696
  | `idea-pipeline.yaml` | Idea/planning → feature + tasks | `/sp:dev-idea`, `/sp:dev-plan` |
697
697
  | `wrapup-pipeline.yaml` | Post-execution wrap-up | `/sp:dev-wrap`, `/sp:dev-wrapall` |
698
- | `wayfinder-resolution.yaml` | Wayfinder ticket resolution loop | `spur workflow run` (free-form) |
698
+
699
+ > 1251 (D66): the PR-review and wayfinder-investigate spines were retired — the PR sequencing
700
+ > lives in the `spur builder pr-status | pr-check | pr-open | pr-review` verbs, and the wayfinder
701
+ > investigate hop is a skill procedure in `sp:wayfinder`. 1246 retired the feature-verification
702
+ > wrapper the same way: `feature-lifecycle`'s `verifying` entry calls `spur feature verify`.
699
703
 
700
704
  > 0946 (D64): the `decision-routing-example.yaml` authoring sample was retired from the catalogue
701
705
  > (zero runs, example-only — `docs/design/workflow-catalogue-refactor.md` §10); the pattern lives on
@@ -42,6 +42,9 @@ Use for:
42
42
  ladder, trace-driven rule tuning, and applying accepted doctor proposals.
43
43
  - Evaluation and reflection campaigns via `sp:spur-doctor`: read-only evidence, history-finding
44
44
  reflection, and a proposal table.
45
+ - Decision campaigns: catalog health and reliability audits (`spur decision status --json`,
46
+ `--reliability`, `--probe`) through `sp:spur-doctor`'s decision flags, and new or tuned decision
47
+ points through the decision lifecycle and `sp:spur-composer` (shared ids need operator consent).
45
48
 
46
49
  One bounded campaign per dispatch. Do not use for one CLI invocation. Do not use for
47
50
  planning→implementation→verification lifecycle or batch task execution; `sp:spur-dev` owns that
@@ -89,6 +89,9 @@ You own the spaces **between** task runs:
89
89
  timeout prints one checkpoint and exits 1; the run continues, never cancelled or relaunched) plus
90
90
  `.spur/run/<wbs>-verdict.json`, accepted only when the trace's `.run.runId` equals the dispatched
91
91
  run and the verdict's mtime ≥ the trace's `.run.startedAt` — otherwise `stale-evidence` (Step 3.3).
92
+ A `failed` run's cause is its decision row (`failure-class` / `review-failure-class` = `stop`, or
93
+ approval `DENIED`); report it per [reporting a run](../skills/spur-dev/references/decision-points.md#reporting-a-run)
94
+ and do not re-judge it before recovery.
92
95
  - **One-shot recovery (optional)** - on non-PASS / stuck status, consult next-router **once** for that
93
96
  WBS (`recoveryHint` / dry-run plan): print the child command, or dispatch once only when the batch
94
97
  was started with `--auto` and cardinality is 1. Never self-loop until done.
@@ -135,7 +138,8 @@ Your decision-autonomy is **at the batch level**, bounded by the global Decision
135
138
  | Continue/halt between task runs | Whether to auto-approve a HITL gate inside a task (only `--auto` does, via `vars.profile`) |
136
139
 
137
140
  Surface blockers/HITL **only at the batch boundary** (between task runs). A pipeline run that pauses
138
- on its internal HITL `approve` gate (under the default profile) is surfaced to the operator as a
141
+ on its `review`-state approval decision point (interactive profiles only; under `profile=auto` the
142
+ decision point answers itself, and a deferred answer is no objection) is surfaced to the operator as a
139
143
  batch-level event: "task 0042 is awaiting approval - `spur workflow continue <run-id> --yes` to
140
144
  approve, or provide feedback". You do not answer the gate from inside a step.
141
145
 
@@ -70,8 +70,10 @@ Only when invoked under the pipeline do blocker/major findings block a gate.
70
70
 
71
71
  Invoked by `task-pipeline.yaml`'s `review` step. The pipeline hands you the task WBS and the
72
72
  `--focus` dimensions. You run the review, write findings to the task's `## Review` section, and
73
- return a PASS/PARTIAL/FAIL verdict to the pipeline's `approve(HITL)` gate. `blocker`/`major`
74
- findings block the gate; `minor`/`advisory` are recorded but do not block.
73
+ return a PASS/PARTIAL/FAIL verdict. `spur task verdict` certifies the answer; a PASS then reaches the
74
+ approval decision point before `done`, and a non-PASS feeds the `review-failure-class` decision
75
+ (`fix` → `remediate`, `stop` → `failed`). `blocker`/`major` findings block certification;
76
+ `minor`/`advisory` are recorded but do not block.
75
77
 
76
78
  ### Multi-target coordination (task 1023)
77
79
 
@@ -181,11 +183,11 @@ with the commit) drops the row from the sweep; `DEFER(<reason>)` reclassifies a
181
183
  the cell, not the sentence. `OPEN` states "still live", and `ACCEPTED` marks a non-blocking P4
182
184
  observation you are deliberately not acting on; both behave as an ordinary open row.
183
185
 
184
- **Pipeline cost of an open finding (1122).** The review PASS edges run this same classification
185
- before verify (`spur task residual <wbs> review-gate`): a PASS whose table still carries an open P1-P3 row
186
- routes into `review-fail-triage` → the bounded repair hop instead of verify. Open P1-P3 findings
187
- block `done`; fixing one invalidates the certified digest and re-runs quality → review → verify on
188
- a fresh digest. Only P4 rows and `DEFER`-ed P3 rows are wrap residuals — disposition the finding in
186
+ **Pipeline cost of an open finding (1122).** The review certification runs this same classification
187
+ (`spur task residual <wbs> review-gate`): a PASS whose table still carries an open P1-P3 row is a
188
+ non-PASS review, so the `review-failure-class` decision routes it to `remediate` instead of `done`.
189
+ Open P1-P3 findings block `done`; fixing one invalidates the certified digest and re-runs
190
+ gate → review on a fresh digest. Only P4 rows and `DEFER`-ed P3 rows are wrap residuals — disposition the finding in
189
191
  its cell now, while you hold the context, instead of leaving the cost to be rediscovered after a
190
192
  full cycle.
191
193
 
@@ -220,9 +222,9 @@ shallower.
220
222
  ```
221
223
 
222
224
  The **Verdict line is machine-read** by the task pipeline (session finding after 1088): `review →
223
- verify|approve` requires a line matching `Verdict: PASS` (plain or bold), and ANYTHING ELSE —
224
- FAIL, PARTIAL, a missing line, a line split across two lines — routes the run into
225
- `review-fail-triage` and its bounded repair hop. Keep it on one line, in that shape, in every
225
+ done` requires a line matching `Verdict: PASS` (plain or bold), and ANYTHING ELSE —
226
+ FAIL, PARTIAL, a missing line, a line split across two lines — routes the run through the
227
+ `review-failure-class` decision into the bounded `remediate` hop. Keep it on one line, in that shape, in every
226
228
  review answer; never restate it as prose only.
227
229
 
228
230
  **State `Confidence: HIGH | MEDIUM | LOW` — the gate derives it from your dispositions (ADR-141).**
@@ -243,6 +245,35 @@ No verdict-artifact field, no receipt level, no per-finding grade, and no operat
243
245
  (ADR-138 stands for every other carrier). Evidence gaps still belong in the report body: name them,
244
246
  then let the dispositions decide the level.
245
247
 
248
+ **Two artifacts, one `Confidence:` line each (1254).** The body you write into `### Review` states
249
+ the disposition-derived level above. When the pipeline also captures your final answer as the
250
+ certification input for `spur task verdict`, that text is a *second* artifact with a *different*
251
+ consumer, and it carries the **evidence-derived** level (`deriveVerifyConfidence`): PASS with every
252
+ AC row MET on executable evidence (`test`/`command`) is HIGH; a citation-only (`static-ref`),
253
+ `manual-review`, `llm-judge` or `N/A` AC is MEDIUM; a non-PASS verdict or any PARTIAL/UNMET row is
254
+ LOW. It ends with exactly one plain `Verdict: PASS|PARTIAL|FAIL` line preceded by both tables, in
255
+ this exact shape:
256
+
257
+ | Req | Status | Evidence |
258
+ | --- | --- | --- |
259
+ | R1 | MET | `src/api/users.ts:42` |
260
+
261
+ | AC | Status | Evidence Type | Evidence |
262
+ | --- | --- | --- | --- |
263
+ | AC1 — the guard rejects an unsafe input | MET | test | `packages/app/tests/guard.test.ts:12` |
264
+
265
+ One row per declared requirement (`MET | PARTIAL | UNMET`, none omitted or merged) and one row per
266
+ acceptance criterion (`MET | PARTIAL | UNMET | N/A`), with the evidence-type token alone in its own
267
+ cell — `test | command | static-ref | manual-review | llm-judge | n/a`, or a `+` compound when more
268
+ than one kind applies. Evidence cells cite a repo-relative `path:line` or a named test/command. AC
269
+ identities stay the task's own (checklist label, title, bold head, `Scenario:` prefix, bracket tag or
270
+ declared `AC-N` alias): a linked feature's scenario title covers the task that implements it, and a
271
+ task-local criterion is legal as-is — it needs no feature credit.
272
+ Never repeat the section's disposition-derived `Confidence:` line here: a second `Confidence:` line is
273
+ a `confidence-duplicate` rejection of the whole answer, and so is a level the rows do not derive. A
274
+ PASS with executable AC and one accepted P4 therefore certifies as `Confidence: HIGH` in the answer
275
+ while the section keeps `Confidence: MEDIUM`.
276
+
246
277
  **Source citations for external claims (one claim contract, 2026-10-12).** A Finding cell or a
247
278
  Functional Traceability `Evidence` cell that asserts an external API/library claim carries a
248
279
  verifiable citation in the SAME cell — a repo `path:line(-end)`, the external named-origin form
@@ -258,8 +289,8 @@ as an explicit gap in the report body (above), so a reader can re-check it.
258
289
 
259
290
  **Machine-checked at the gate (findings table).** `spur task residual <wbs> review-gate` applies the same two
260
291
  predicates to every finding row: a Finding cell carrying one of the verify lint's claim markers with
261
- no citation form becomes a **blocking** `review-contract` item, so `review → verify` stops and the
262
- run enters `review-fail-triage`. The `Location` column is deliberately not consulted as a citation —
292
+ no citation form becomes a **blocking** `review-contract` item, so `review → done` stops and the
293
+ run enters the `review-failure-class` decision. The `Location` column is deliberately not consulted as a citation —
263
294
  that is the rule stated above, and a gate that accepted it would pass every row that has an anchor.
264
295
  Functional Traceability `Evidence` cells stay reviewer-enforced (SECUA review): they are free prose
265
296
  in a table the gate does not parse.
@@ -27,12 +27,17 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
27
27
 
28
28
  ## Implementation
29
29
 
30
- Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#10-fixall) (fixall). Pipeline signal: when `--gate-log` is set (the `test-fix` hop), run no full gate — the `test-recheck` state immediately after is the deciding run (R4, task 0483).
30
+ Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#10-fixall) (fixall). Pipeline signal: when `--gate-log` is set (the `remediate` hop), run no full gate — the `gate` state's recheck immediately after is the deciding run (R4, task 0483).
31
31
 
32
- When dispatched from the pipeline's test-fix stage (F96, task 0950), the gate log carries a
32
+ When dispatched from the pipeline's `remediate` hop (F96, task 0950), the gate log carries a
33
33
  `residual artifact` block (`<wbs>-residuals.json`) and the findings file already
34
34
  contains the merged residual anchors: treat those items as fix targets, in order,
35
35
  alongside gate anchors. The fixer may write `.spur/run/<wbs>-residual-deferrals.json`
36
36
  — one `{id, reason}` entry per item — but only for P3 findings or diff markers it
37
37
  cannot fix inside the task; the done stage settles deferrals into follow-up tasks.
38
38
 
39
+ The `remediate` hop is entered only after a `fix` decision (`failure-class` on a red gate,
40
+ `review-failure-class` on a non-PASS review). A `stop` decision ends the run before this command
41
+ runs, so do not invoke it by hand to overrule a `stop`
42
+ ([decision points](../skills/spur-dev/references/decision-points.md)).
43
+
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Turn a vague idea into a feature with AC and a decomposed task batch — discovery, idea-eval, feature-create, AC, feature-check, system-design, decompose, batch-create (Design by default), handoff
2
+ description: Turn a vague idea into a feature with AC and a decomposed task batch — discovery, idea-eval, feature-create, AC, system-design, decompose, batch-create (Design by default), handoff
3
3
  role: planner
4
4
  argument-hint: "\"<idea>\" | --from-file <path> [--skip-design] [--agent <inline|auto|name>] [--auto]"
5
5
  allowed-tools: ["Bash", "Read", "Skill", "AskUserQuestion"]
@@ -44,10 +44,18 @@ trace records the answering source. `--auto` takes the recommended option at eac
44
44
 
45
45
  | Gate | Pauses when | Recommendation comes from | `--auto` takes |
46
46
  | --- | --- | --- | --- |
47
- | idea-eval | after discovery | eval report `## Recommendation` (`proceed` / `reshape` / `drop`) | `proceed`/`reshape` → continue; `drop` → cancel; missing → still asks |
48
- | feature-check | after AC | recorded AC check + requirement coverage | PASS → continue; FAIL → revise AC (cap 3) |
47
+ | idea-eval | after discovery | eval report `## Recommendation` (`proceed` / `reshape` / `drop`); when unparseable, a model answer from the `idea-recommendation` decision | `proceed`/`reshape` → continue; `drop` → cancel; neither → the gate asks, and under `--auto` its `gate-evidence` decision answers (a deferred answer denies) |
49
48
  | design-approval | after system-design (skipped by `--skip-design`) | recorded design check | PASS → approve; FAIL → still asks |
50
- | batch-create | after decompose | batch schema + task-order sidecar validation | create the batch |
49
+
50
+ The AC check and the batch create are deterministic pipeline steps, not gates: `ac-generate`
51
+ runs `spur feature check` and routes on the recorded result (a FAIL retries the AC loop, cap 3),
52
+ and `batch-create-run` runs `spur task batch-create` and routes on its own recorded result.
53
+ Neither ever pauses, under any profile.
54
+
55
+ The rescue decisions and the gate answers are catalog decision points; their rows and switches
56
+ are in [decision points](../skills/spur-dev/references/decision-points.md). With both switches off
57
+ (the default) no model is called and a `--auto` run with no parseable recommendation stops at
58
+ idea-eval as a denial rather than creating a feature.
51
59
 
52
60
  Flag → vars: `--auto` sets `profile=auto`, `idea_approved=true`, `design_approved=true`;
53
61
  `--skip-design` sets `design=skip`.
@@ -78,5 +86,6 @@ Flag → vars: `--auto` sets `profile=auto`, `idea_approved=true`, `design_appro
78
86
  - The `start` state persists the operator's idea argument (or the `--from-file` contents)
79
87
  **unmodified** to `.spur/run/<run-id>-idea-input.md` (0887 R1); every model-bearing stage prompt
80
88
  treats that file as the authoritative ask, and the precheck fails the run when it is empty or missing.
81
- - Stage contract (discovery → idea-eval → feature-create → AC → feature-check → system-design →
82
- decompose → batch-create → ready-prepare → handoff): `plugins/sp/skills/spur-dev/references/dev-operations.md` § idea.
89
+ - Stage contract (discovery → idea-eval → feature-create → ac-generate → system-design
90
+ (conditional) → design-approval → decompose → batch-create-run → ready-prepare →
91
+ handoff-finalize → handoff): `plugins/sp/skills/spur-dev/references/dev-operations.md` § idea.
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Plan a feature from a description — intake → feature create → AC generation → feature check gate → decomposition → batch-create (Design by default)
2
+ description: Plan a feature from a description — intake → feature create → AC generation → decomposition → batch-create (Design by default)
3
3
  role: planner
4
4
  argument-hint: "\"<description>\" [--feature <id>] [--parent <feature-id>] [--skip-design] [--agent <inline|auto|name>] [--auto]"
5
5
  allowed-tools: ["Bash", "Read", "Skill", "AskUserQuestion"]
@@ -17,9 +17,9 @@ and commits the verified ones. The invoking agent orchestrates.
17
17
  | Flag | Description | Default |
18
18
  | --- | --- | --- |
19
19
  | `<mode>` | `status\|review\|fix` — status: read-only branch + PR state; review: local branch-diff review (or the GitHub Codex spine with `--codex`); fix: validate, fix and commit findings from either reviewer. | status |
20
- | `--codex` | `review` only — route through the GitHub Codex spine (`pr-review.yaml`) instead of the local `/sp:dev-review`. | off |
21
- | `--force` | `review --codex` only — request a fresh review of the current HEAD even when it was already reviewed (`mode=rerun`). | off |
22
- | `--no-wait` | `review --codex` only — post the request and return `pending` without polling (`mode=submit`). | off |
20
+ | `--codex` | `review` only — route through the GitHub Codex spine (`spur builder pr-check` → `pr-open` → `pr-review`) instead of the local `/sp:dev-review`. | off |
21
+ | `--force` | `review --codex` only — request a fresh review of the current HEAD even when it was already reviewed (`pr-review --force`). | off |
22
+ | `--no-wait` | `review --codex` only — post the request and return `pending` without polling (`pr-review --no-wait`). | off |
23
23
  | `--base <branch>` | Base branch for the branch report, the `pr-check` diff and a newly created PR. | existing PR base, else repo default |
24
24
  | `--agent <inline\|auto\|name>` | Who performs the model-bearing triage/fix. Omit uses the current agent, `inline` forbids dispatch, `auto` resolves the declared role, and a name pins that executor. This does not change the deterministic route. | omit |
25
25
  | `<focus>` | Remaining free text — extra review focus for the local review or the Codex request (e.g. `security boundaries and transaction idempotency`). | none |
@@ -36,9 +36,9 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
36
36
 
37
37
  - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
38
38
  - Delegate everything: `Skill(skill="sp:pr-reviewing", args="$ARGUMENTS")`. The skill owns mode
39
- routing, the local `/sp:dev-review` dispatch, the Codex spine and finding triage/fix. On the
40
- Codex path `pr-review.yaml` is the SSOT for state order and guards, and the four flat
41
- `spur builder pr-<verb>` verbs are the deterministic git/gh core every spine step shells out to.
39
+ routing, the local `/sp:dev-review` dispatch, the Codex spine and finding triage/fix. The Codex
40
+ path is a direct sequence of the four flat `spur builder pr-<verb>` verbs — `pr-check` →
41
+ `pr-open` → `pr-review` → `pr-status` — each verb's verdict gating the next.
42
42
  - Retired modes print one notice line and run their replacement: `full` → `review --codex`;
43
43
  `submit` → `review --codex --no-wait`; `rerun` → `review --codex --force`; `collect` → `status`.
44
44
  `rules` prints that `AGENTS.md` review-rule authoring belongs to `cc:cc-magents` (the `cc` plugin)
@@ -50,6 +50,9 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
50
50
  - Implement step only (`--mode implement`): `Skill(skill="sp:code-implementation", args="$ARGUMENTS")`
51
51
  - After a full-mode run settles (done, failed or paused), print the
52
52
  [execution summary](../skills/spur-dev/references/dev-operations.md#execution-summary) unless `--no-summary`.
53
+ - Then report the run's decision points (triage lane, failure classes, approval) from their rows
54
+ ([reporting a run](../skills/spur-dev/references/decision-points.md#reporting-a-run)). A `failed` or `remediate` route is explained by the row
55
+ that chose it; quote its value, source and reason, never a fresh judgment.
53
56
 
54
57
  **Flags:**
55
58
 
@@ -26,7 +26,7 @@ Wraps the **sp:spur-dev** skill.
26
26
  | `--worktree` `[<name>]` | Run the batch in an isolated git worktree; FF-merge on success, retain on failure. Bare `--worktree` creates a fresh tree; `--worktree <name>` adopts an existing worktree by name/path/branch. | off |
27
27
  | `--no-summary` | Skip the measured execution summary (one row per task run: time, wait, tool calls, total / non-cached tokens) printed after the batch report. | off (summary printed) |
28
28
  | `--concurrency` `<n>` | Parallel-mode worker bound: at most `<n>` task pipelines run at once (task 0931); a dependent starts only after its in-set dependencies are integrated onto the base ref. No-op in sequential mode (ignored). | 2 |
29
- | `--defer-gate` | Opt-in parallel-batch gate policy (task 1111): each task's `test` hop runs the light tier and writes `DEFERRED`; the batch runs one integrated full gate on the base ref before the feature sync. Requires `--mode parallel`, or `--mode auto` resolved to parallel (dropped with a note otherwise); default off. | off |
29
+ | `--defer-gate` | Opt-in parallel-batch gate policy (task 1111): each task's `gate` state runs the light tier and writes `DEFERRED`; the batch runs one integrated full gate on the base ref before the feature sync. Requires `--mode parallel`, or `--mode auto` resolved to parallel (dropped with a note otherwise); default off. | off |
30
30
 
31
31
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
32
32
 
@@ -82,8 +82,8 @@ FF-merge on success. This is expected, not a bug.
82
82
 
83
83
  **`--next` (batch-once wrap).** `--next`
84
84
  is chain-to-completion with propagation. On `dev-runall`, each task in the batch runs its
85
- `task-pipeline.yaml` to terminal status (the pipeline already drives precheck → implement → test →
86
- review → approve → verify → record → done); when the batch is complete, the wrap hop runs **once
85
+ `task-pipeline.yaml` to terminal status (the pipeline already drives precheck → implement → gate ⇄ remediate →
86
+ review → done); when the batch is complete, the wrap hop runs **once
87
87
  for the batch** — mirroring the batch-once shippable gate `dev-verifyall` uses — rather than once
88
88
  per task. Without `--next`, `--wrap` is wrap-without-chaining (the single batch wraps without
89
89
  advancing the feature lifecycle). **was: `--next` deliberately omitted; the old no-`--next` rationale argued against the old per-task-transition meaning and does not carry.**
@@ -111,3 +111,6 @@ full distinction.
111
111
  - Explicit executor (any mode, including `auto`) or parallel mode: `Skill(skill="sp:spur-dev", args="runall $ARGUMENTS")` → `sp:super-planner` agent.
112
112
  - After the batch report, print the [execution summary](../skills/spur-dev/references/dev-operations.md#execution-summary) over every attempted run unless
113
113
  `--no-summary`.
114
+ - A failed task's report row names the decision row that ended it (`failure-class` or
115
+ `review-failure-class` = `stop`, or approval `DENIED`) per
116
+ [reporting a run](../skills/spur-dev/references/decision-points.md#reporting-a-run); the batch failure policy then applies unchanged.
@@ -45,7 +45,7 @@ See `sp:code-verification` § Shippable readiness gate.
45
45
  run `spur task residual <wbs> scan` + `fold` (observe-only; folds the verdict's `residual-sweep` check,
46
46
  PASS → PARTIAL when a blocking residual exists) — under every `--fix` mode — then, only on a
47
47
  downgrade, re-run `spur task record <wbs> --verdict-file .spur/run/<wbs>-verdict.json` so Testing
48
- carries the final verdict. Same order as the pipeline `record` state (0983): scanning before
48
+ carries the final verdict. Same order as the pipeline `done` state's record close (0983): scanning before
49
49
  record reads unticked-but-proven boxes and folds a clean PASS to PARTIAL. When the task reaches
50
50
  `done` through `--next`, run `spur task residual <wbs> settle` (best-effort). On a folded PARTIAL: the bounded remediation loop has
51
51
  already run — a residual-failed task is routed to router C6 (HITL STOP), never another
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Wrap up a single completed task — learnings, metrics, doc-sync, optional feature transition and branch cleanup
2
+ description: Wrap up a single completed task — learnings, metrics, doc-sync, optional branch cleanup
3
3
  role: coder
4
4
  argument-hint: "<wbs> [--agent <inline|auto|name>] [--auto] [--merge] [--dry-run]"
5
5
  allowed-tools: ["Bash", "Read", "AskUserQuestion"]
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Wrap up a batch of completed tasks — learnings, metrics, doc-sync, feature transition, optional branch cleanup
2
+ description: Wrap up a batch of completed tasks — learnings, metrics, doc-sync, optional branch cleanup
3
3
  role: coder
4
4
  argument-hint: "[--since <iso-date>] [--feature <id>] [--status <s>] [--agent <inline|auto|name>] [--auto] [--merge] [--dry-run]"
5
5
  allowed-tools: ["Bash", "Read", "AskUserQuestion"]
@@ -14,7 +14,7 @@ Wraps the **wrapup-pipeline.yaml** workflow.
14
14
  | Flag | Description | Default |
15
15
  | --- | --- | --- |
16
16
  | `--since` `<iso-date>` | Wrap tasks completed since a date. | configured |
17
- | `--feature` `<id>` | Wrap tasks in a feature. | omitted |
17
+ | `--feature` `<id>` | Select tasks in a feature (selection only — it no longer advances the feature; follow up with `spur feature sync <id>`). | omitted |
18
18
  | `--status` `<s>` | Only wrap tasks in a status. | done |
19
19
  | `--agent` `<inline\|auto\|name>` | Who runs the wrap's model-bearing steps. Wrap is workflow-backed (headless): `omit` and `--agent inline` resolve identically per task 0687 — tier substitution under objective trigger 3 (durable auditable run record required) with a warning naming the substituted executor; `auto` tier-resolves an executor; a name pins that executor into `vars.agent`. | inline |
20
20
  | `--auto` | Skip objective HITL gates. | off |
@@ -42,8 +42,8 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
42
42
  ```bash
43
43
  AGENT=… # omit≡inline → tier-substituted executor + warning; auto tier-resolved; <name> unchanged
44
44
  echo "execution surface: subprocess; reason: trigger 3 — durable auditable run record required; requested agent: <inline|auto|name>; executor: $AGENT"
45
- VARS=$(jq -nc --arg tasks "$TASKS" --arg feature "$FEATURE" --arg agent "$AGENT" --arg profile "$PROFILE" --arg merge "$MERGE" \
46
- '{tasks:$tasks, feature:$feature, agent:$agent, profile:$profile, merge:$merge}')
45
+ VARS=$(jq -nc --arg tasks "$TASKS" --arg agent "$AGENT" --arg profile "$PROFILE" --arg merge "$MERGE" \
46
+ '{tasks:$tasks, agent:$agent, profile:$profile, merge:$merge}')
47
47
  spur workflow run wrapup-pipeline.yaml --vars "$VARS" [--dry-run]
48
48
  ```
49
49
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.4.14",
3
+ "version": "0.4.16",
4
4
  "description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics."
5
5
  }
@@ -103,7 +103,7 @@ surfaces is what keeps that gate quiet.
103
103
 
104
104
  ## Implement scope: do not run the project quality gate
105
105
 
106
- During implement, the pipeline's `test` hop runs `${vars.qualityGateCmd}` (the full project gate:
106
+ During implement, the pipeline's `gate` state runs `${vars.qualityGateCmd}` (the full project gate:
107
107
  `spur self exec check`) immediately after this step and is the gate that actually
108
108
  decides pass/fail. Running it inside implement is pure redundancy — it cannot change the outcome and
109
109
  only burns wall clock and context budget.
@@ -118,9 +118,9 @@ only burns wall clock and context budget.
118
118
  re-select the execution tree inside the call (`cd -- "$TREE"` plus the identity check) instead of
119
119
  relying on a `cd` a previous call left behind.
120
120
  - **NEVER run** `spur self exec test`, `spur self exec check`, `bun run check`, or any other full-suite /
121
- project-gate command from inside implement. These belong to the pipeline's `test` hop.
121
+ project-gate command from inside implement. These belong to the pipeline's `gate` state.
122
122
  - **Full-suite budget: at most 2 per task** (task 0436 R2) — counted across the whole task run
123
- (implement probes + the pipeline `test` hop + verify/recheck), not per step. When a check fails,
123
+ (implement probes + the pipeline `gate` state and its rechecks), not per step. When a check fails,
124
124
  run the narrow target (`bun test <file> --test-name-pattern <test>`) to green before any full
125
125
  suite; reach for the second full run only when the narrow target cannot reproduce the failure.
126
126
  - **Consolidate dogfood runs**: one combined real-data execution that exercises all scenarios,
@@ -128,7 +128,7 @@ only burns wall clock and context budget.
128
128
  rerunning the same dogfood command with one flag changed, stop and fold the variants into a
129
129
  single run — repeated identical commands are loop-detector findings and pure cost.
130
130
  - If a targeted probe reveals a failure you cannot fix within implement scope, note it in
131
- `## Solution` and let the `test` hop's fixall handle it — do not pre-empt the gate.
131
+ `## Solution` and let the `gate` state's `remediate` hop handle it — do not pre-empt the gate.
132
132
 
133
133
  ### Public-surface probe (task 1135 R1/R6/R8)
134
134
 
@@ -155,7 +155,7 @@ changed no public surface, report the single line
155
155
  - the paired-script parity test when `package.json` changed (a half-updated `spur-check` /
156
156
  `spur-check:full` chain).
157
157
 
158
- The single full project check stays the pipeline `test` hop's job (see the section above); these are
158
+ The single full project check stays the pipeline `gate` state's job (see the section above); these are
159
159
  changed-path checks, not that gate.
160
160
 
161
161
  ## Changed-path targeted checks (dependency-aware verification, task 0510 R3 / task 1142 R3)
@@ -164,14 +164,14 @@ changed-path checks, not that gate.
164
164
  surface can break a downstream consumer. The matrix below is dependency-aware — domain → app →
165
165
  CLI — so a shared change verifies its consumers without recreating the full project check inside
166
166
  implement. **It augments narrow behavior tests; it never authorizes `spur self exec check`,
167
- `spur self exec test`, or another full project check inside implement** — the pipeline's `test` hop owns
167
+ `spur self exec test`, or another full project check inside implement** — the pipeline's `gate` state owns
168
168
  that single full gate.
169
169
 
170
170
  **Worker iteration check order (task 1142 R3):**
171
171
  1. The **changed-path matrix** below (narrow behavior tests + affected consumers);
172
172
  2. `spur task gate <wbs> light` (biome on changed files, per-workspace typecheck, rule presets `rules:pre`/`rules:post`, related tests).
173
173
 
174
- Neither step takes the full project gate. The full gate is named only for the pipeline's `test` and `test-recheck` hops.
174
+ Neither step takes the full project gate. The full gate is named only for the pipeline's `gate` state (first visit and rechecks).
175
175
 
176
176
  | Changed surface | Required targeted tests | Required typechecks |
177
177
  | --- | --- | --- |
@@ -189,7 +189,7 @@ Neither step takes the full project gate. The full gate is named only for the pi
189
189
  (a flag the plugin layer consumes) actually changes, so an unconditional parity suite does not
190
190
  creep into every plugin edit.
191
191
  - Run the applicable rows, then stop: the single full project check belongs to the pipeline's
192
- `test` hop (`task-pipeline.yaml` `${vars.qualityGateCmd}`).
192
+ `gate` state (`task-pipeline.yaml` `${vars.qualityGateCmd}`).
193
193
  - **Mirrored surfaces: an edit lands on all of them.** When the change is one instance of a repeated
194
194
  pattern — the same wiring rule on two runbooks, a signature in both a generator and its generated
195
195
  `.d.mts`, a command chain in both `spur-check` and `spur-check:full` — grep for the siblings and
@@ -89,8 +89,8 @@ and the deepening direction. Full definitions and examples in
89
89
  | **minor** | advisory | Local friction: a module slightly too shallow, coupling that's awkward but not coordinated. |
90
90
  | **advisory** | advisory | Deepening opportunity: the code works and is testable, but would be cleaner with a deeper module. Always non-blocking. |
91
91
 
92
- **Under the pipeline** (`/sp:dev-review` in a task run), `blocker` and `major` block the
93
- `approve(HITL)` gate. `minor` and `advisory` are recorded but do not block. **Standalone** reviews
92
+ **Under the pipeline** (`/sp:dev-review` in a task run), `blocker` and `major` block review
93
+ certification (a non-PASS review goes to the `review-failure-class` decision). `minor` and `advisory` are recorded but do not block. **Standalone** reviews
94
94
  are advisory-only — the operator decides what to act on.
95
95
 
96
96
  ---
@@ -185,7 +185,7 @@ Each candidate is a structured finding:
185
185
  When invoked as the `--focus architecture` dimension of `/sp:dev-review`:
186
186
 
187
187
  - The scope is the task's diff (pipeline) or the `path` arg (standalone).
188
- - `blocker`/`major` candidates block the `approve(HITL)` gate alongside any SECUA blockers from
188
+ - `blocker`/`major` candidates block review certification alongside any SECUA blockers from
189
189
  `sp:code-verification`.
190
190
  - The candidate list is returned as a **review fragment**; the review coordinator
191
191
  (`sp:super-reviewer` — the invoking session under `/sp:dev-review`) merges it into the combined
@@ -42,10 +42,11 @@ Before reporting a task as complete, a test as passing, a bug as fixed, or a fea
42
42
 
43
43
  ## Under the pipeline
44
44
 
45
- `task-pipeline.yaml`'s `verify` step (Phase 8) and `record` step enforce this gate. The `verify`
46
- step runs `sp:code-verification` verify mode, which produces a `VerifyVerdict` artifact; the
47
- `record` step transcribes it to the task's `## Testing` section. A `done` transition requires a
48
- PASS verdict.
45
+ `task-pipeline.yaml` enforces this gate deterministically. The `gate` state runs `spur task gate`
46
+ and a red result goes through the `failure-class` decision to `remediate`; the `review` state
47
+ certifies the review answer with `spur task verdict`, which writes the `VerifyVerdict` artifact.
48
+ `review → done` requires that PASS plus the approval decision point, and `done`'s `spur task record`
49
+ close transcribes the verdict to the task's `## Testing` section.
49
50
 
50
51
  Under manual execution (no pipeline), the agent must still run the gates and paste the evidence.
51
52
  "Manual" is not an exemption — it just means the agent, not the pipeline, runs the commands.
@@ -29,7 +29,7 @@ The **verifier** in the Spur execution loop. A coding agent reports "done" with
29
29
  this skill is the deterministic counterweight that proves — or disproves — the claim against the
30
30
  task's own requirements and Acceptance Criteria, then emits the canonical verdict artifact
31
31
  through CLI verbs (section writes are owned by the review coordinator and the deterministic
32
- `record` step — F92 0593 R1).
32
+ `spur task record` close in `done` — F92 0593 R1).
33
33
 
34
34
  It backs two commands:
35
35
 
@@ -321,7 +321,7 @@ spur task residual <wbs> fold
321
321
  > **Do not write `## Review` directly, ever.** The `## Review` section is owned by the
322
322
  > `review` coordinator (`/sp:dev-review` → `sp:super-reviewer`), which merges
323
323
  > `functional-review` + `code-verification` review mode + `code-improvement` fragments. The
324
- > `record` step backfills `## Review` from the verdict artifact **only** if the section is bare
324
+ > `spur task record` close backfills `## Review` from the verdict artifact **only** if the section is bare
325
325
  > (`sectionIsBare` guard, `task-section-bodies.ts`) — a standalone compatibility fallback, never an
326
326
  > overwrite of authored Review. Writing `## Review` here destroys the review step's
327
327
  > three-dimensional findings.
@@ -546,7 +546,7 @@ Flags: `--agent <inline|auto|name>` (execution surface — inline default, with
546
546
 
547
547
  ## When to use
548
548
 
549
- - **Verify a task before `done`** — the pipeline's `verify` step, or a manual `/sp:dev-verify`.
549
+ - **Verify a task before `done`** — the pipeline's `review` state certifies it (`spur task verdict`), or a manual `/sp:dev-verify`.
550
550
  - **Audit completed work** — `--force` re-verifies a `done` task (compliance, post-merge).
551
551
  - **Focused code review** — `/sp:dev-review` for SECUA findings on a diff.
552
552
 
@@ -581,7 +581,7 @@ Do **not** use this skill for:
581
581
  rubric.
582
582
  - `plugins/sp/references/roles.md` — the Layer-1 role→tier table; this skill's verify/review modes
583
583
  run under the `reviewer` role (0538 R4: this file points at roles.md, it does not restate tiers).
584
- - `task-pipeline.yaml` — the `verify → record` gate that consumes the verdict.
584
+ - `task-pipeline.yaml` — the `review → done` gate that consumes the verdict.
585
585
  - **`sp:spur-dev`** — the execution-half umbrella that drives the pipeline this skill gates.
586
586
  - [references/code-improvement.md](references/code-improvement.md) — architecture-improvement lens
587
587
  for module depth, seam placement, locality, coupling, and testability.