@gobing-ai/spur 0.3.99 → 0.4.1

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 (172) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.global.yaml +17 -0
  3. package/config/decisions/gates.yaml +36 -0
  4. package/config/decisions/history-anatomy.yaml +35 -0
  5. package/config/decisions/idea-pipeline.yaml +38 -0
  6. package/config/decisions/task-pipeline.yaml +55 -0
  7. package/config/plugin-scripts.json +25 -0
  8. package/config/rules/boundary/sp-runtime-path.yaml +2 -0
  9. package/config/rules/docs/sourced-api-claims.yaml +60 -0
  10. package/config/rules/quality/coverage-gate.yaml +5 -3
  11. package/config/rules/recommended-pre-check.yaml +8 -3
  12. package/config/rules/strict/runtime-boundaries.yaml +11 -0
  13. package/config/rules/structure/protected-files.yaml +3 -0
  14. package/config/rules/structure/scratch-evidence-pointer.yaml +35 -0
  15. package/config/script-placement-baseline.json +2 -2
  16. package/config/workflows/feature-lifecycle.yaml +9 -2
  17. package/config/workflows/history-anatomy.yaml +22 -0
  18. package/config/workflows/idea-pipeline.yaml +75 -0
  19. package/config/workflows/task-pipeline.yaml +368 -49
  20. package/config/workflows/wrapup-pipeline.yaml +106 -13
  21. package/package.json +9 -9
  22. package/plugins/sp/README.md +25 -2
  23. package/plugins/sp/agents/super-planner.md +11 -0
  24. package/plugins/sp/agents/super-reviewer.md +39 -11
  25. package/plugins/sp/bunfig.toml +8 -0
  26. package/plugins/sp/commands/dev-brainstorm.md +29 -16
  27. package/plugins/sp/commands/dev-changelog.md +5 -4
  28. package/plugins/sp/commands/dev-find-way.md +80 -0
  29. package/plugins/sp/commands/dev-idea.md +6 -0
  30. package/plugins/sp/commands/dev-parallel.md +8 -2
  31. package/plugins/sp/commands/dev-plan.md +6 -0
  32. package/plugins/sp/commands/dev-review-session.md +14 -7
  33. package/plugins/sp/commands/dev-run.md +17 -4
  34. package/plugins/sp/commands/dev-runall.md +21 -10
  35. package/plugins/sp/hooks/agent-lifecycle.ts +155 -0
  36. package/plugins/sp/hooks/context-session-start.ts +1 -1
  37. package/plugins/sp/hooks/fleet-guest-stop.ts +180 -0
  38. package/plugins/sp/hooks/hooks.json +45 -1
  39. package/plugins/sp/hooks/pi/guard-extension.ts +21 -0
  40. package/plugins/sp/lib/history-anatomy.generated.mjs +5 -0
  41. package/plugins/sp/lib/idea-handoff.generated.mjs +72 -11
  42. package/plugins/sp/lib/inline-run-app.ts +28 -0
  43. package/plugins/sp/lib/inline-run.generated.d.mts +6 -0
  44. package/plugins/sp/lib/inline-run.generated.mjs +364 -46
  45. package/plugins/sp/lib/plan-projection.generated.d.mts +28 -0
  46. package/plugins/sp/lib/plan-projection.generated.mjs +255 -0
  47. package/plugins/sp/lib/quality-gate.generated.d.mts +47 -1
  48. package/plugins/sp/lib/quality-gate.generated.mjs +30489 -82
  49. package/plugins/sp/lib/residual-scan.generated.d.mts +19 -0
  50. package/plugins/sp/lib/residual-scan.generated.mjs +66 -0
  51. package/plugins/sp/lib/run-summary-core.ts +561 -0
  52. package/plugins/sp/lib/transcript.ts +275 -0
  53. package/plugins/sp/plugin.json +1 -1
  54. package/plugins/sp/references/roles.md +1 -1
  55. package/plugins/sp/scripts/batch-plan.mjs +335 -0
  56. package/plugins/sp/scripts/batch-plan.ts +100 -0
  57. package/plugins/sp/scripts/batch-preflight.mjs +51 -3
  58. package/plugins/sp/scripts/batch-preflight.ts +72 -1
  59. package/plugins/sp/scripts/commit-guard.mjs +216 -0
  60. package/plugins/sp/scripts/commit-guard.ts +249 -0
  61. package/plugins/sp/scripts/history-anatomy-cache.mjs +5 -0
  62. package/plugins/sp/scripts/inline-run-dispatch.mjs +130 -0
  63. package/plugins/sp/scripts/inline-run-dispatch.ts +135 -0
  64. package/plugins/sp/scripts/inline-run-setup.mjs +563 -91
  65. package/plugins/sp/scripts/inline-run-setup.ts +65 -97
  66. package/plugins/sp/scripts/persist-out-check.mjs +90 -41
  67. package/plugins/sp/scripts/persist-out-check.ts +112 -57
  68. package/plugins/sp/scripts/quality-gate.mjs +30407 -73
  69. package/plugins/sp/scripts/quality-gate.ts +21 -5
  70. package/plugins/sp/scripts/residual-scan.mjs +88 -38
  71. package/plugins/sp/scripts/residual-scan.ts +35 -38
  72. package/plugins/sp/scripts/run-summary.mjs +693 -0
  73. package/plugins/sp/scripts/run-summary.ts +105 -0
  74. package/plugins/sp/scripts/session-timeline.mjs +331 -0
  75. package/plugins/sp/scripts/session-timeline.ts +204 -0
  76. package/plugins/sp/scripts/wrapup-steps.mjs +150 -2
  77. package/plugins/sp/scripts/wrapup-steps.ts +203 -1
  78. package/plugins/sp/skills/brainstorm/SKILL.md +9 -47
  79. package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
  80. package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +1 -0
  81. package/plugins/sp/skills/code-implementation/SKILL.md +48 -1
  82. package/plugins/sp/skills/code-verification/SKILL.md +8 -4
  83. package/plugins/sp/skills/code-verification/references/secu-review.md +3 -0
  84. package/plugins/sp/skills/code-verification/references/verdict-schema.md +68 -0
  85. package/plugins/sp/skills/fleet-join/SKILL.md +63 -0
  86. package/plugins/sp/skills/session-review/SKILL.md +77 -24
  87. package/plugins/sp/skills/source-driven-development/SKILL.md +5 -0
  88. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +5 -3
  89. package/plugins/sp/skills/spur-cli/SKILL.md +6 -2
  90. package/plugins/sp/skills/spur-cli/references/agent.md +124 -17
  91. package/plugins/sp/skills/spur-cli/references/decision.md +98 -0
  92. package/plugins/sp/skills/spur-cli/references/message.md +7 -7
  93. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +41 -3
  94. package/plugins/sp/skills/spur-cli/references/tasks.md +10 -7
  95. package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +7 -0
  96. package/plugins/sp/skills/spur-cli/references/workflows.md +7 -2
  97. package/plugins/sp/skills/spur-composer/SKILL.md +28 -2
  98. package/plugins/sp/skills/spur-dev/SKILL.md +18 -14
  99. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +6 -3
  100. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +49 -14
  101. package/plugins/sp/skills/spur-dev/references/dev-operations.md +51 -18
  102. package/plugins/sp/skills/spur-dev/references/execution-batch-continuation.md +68 -0
  103. package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +194 -0
  104. package/plugins/sp/skills/spur-dev/references/execution-batch.md +113 -963
  105. package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +130 -0
  106. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +20 -0
  107. package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +471 -0
  108. package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +379 -0
  109. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +51 -9
  110. package/plugins/sp/skills/spur-dev/references/glossary.md +2 -2
  111. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +361 -156
  112. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +6 -0
  113. package/plugins/sp/skills/spur-dev/references/structured-trace-emission.md +178 -0
  114. package/plugins/sp/skills/wayfinder/SKILL.md +10 -14
  115. package/schemas/decision-catalog.schema.json +226 -0
  116. package/schemas/spur-config.schema.json +25 -0
  117. package/schemas/state-machine-workflow.schema.json +23 -0
  118. package/spur.js +28165 -19051
  119. package/web/_astro/{BoardApp.i4eh_fHA.js → BoardApp.D66k_s_T.js} +1 -1
  120. package/web/_astro/BoardApp.D6sjAJr_.js +324 -0
  121. package/web/_astro/{TaskDetail.C5Cu8LdB.js → TaskDetail.BynLnMNc.js} +1 -1
  122. package/web/_astro/{arc.Bu5XpBEz.js → arc._BUadrdH.js} +1 -1
  123. package/web/_astro/{architectureDiagram-3BPJPVTR.9vHQTvhF.js → architectureDiagram-3BPJPVTR.Dh7xS1Pp.js} +1 -1
  124. package/web/_astro/{blockDiagram-GPEHLZMM.Cn2Xl7D6.js → blockDiagram-GPEHLZMM.DFDVpfXm.js} +1 -1
  125. package/web/_astro/{c4Diagram-AAUBKEIU.7o0P_QDo.js → c4Diagram-AAUBKEIU.V7_3_glh.js} +1 -1
  126. package/web/_astro/channel.DZVfto-r.js +1 -0
  127. package/web/_astro/{chunk-2J33WTMH.C3zZFsNt.js → chunk-2J33WTMH.De1yx7Jz.js} +1 -1
  128. package/web/_astro/{chunk-4BX2VUAB.CNy_M7fO.js → chunk-4BX2VUAB.BDhHFuxx.js} +1 -1
  129. package/web/_astro/{chunk-55IACEB6.2TiPnLBL.js → chunk-55IACEB6.DDLkWnmC.js} +1 -1
  130. package/web/_astro/{chunk-727SXJPM.5CGSyKAp.js → chunk-727SXJPM.CwfiLnA7.js} +1 -1
  131. package/web/_astro/{chunk-AQP2D5EJ.w-ZIgfsK.js → chunk-AQP2D5EJ.CtGDmUnM.js} +1 -1
  132. package/web/_astro/{chunk-FMBD7UC4.BkcEyhKa.js → chunk-FMBD7UC4.BOLjpw73.js} +1 -1
  133. package/web/_astro/{chunk-ND2GUHAM.mxKKbBG4.js → chunk-ND2GUHAM.BDhQls6O.js} +1 -1
  134. package/web/_astro/{chunk-QZHKN3VN.cyA0z9aT.js → chunk-QZHKN3VN.76qBynDF.js} +1 -1
  135. package/web/_astro/{classDiagram-4FO5ZUOK.CqtUzwhX.js → classDiagram-4FO5ZUOK.N0mpPHT0.js} +1 -1
  136. package/web/_astro/{classDiagram-v2-Q7XG4LA2.CqtUzwhX.js → classDiagram-v2-Q7XG4LA2.N0mpPHT0.js} +1 -1
  137. package/web/_astro/{cose-bilkent-S5V4N54A.BExPTopI.js → cose-bilkent-S5V4N54A.CKknFfjB.js} +1 -1
  138. package/web/_astro/{cynefin-OW5HDTMX.Bq2i10Cn.js → cynefin-OW5HDTMX.Cw3ZWBAh.js} +1 -1
  139. package/web/_astro/{dagre-BM42HDAG.By_HsOuv.js → dagre-BM42HDAG.D3yIKCRD.js} +1 -1
  140. package/web/_astro/{diagram-2AECGRRQ.BtU0b7hz.js → diagram-2AECGRRQ.D51dO83Z.js} +1 -1
  141. package/web/_astro/{diagram-5GNKFQAL.D00ztMdT.js → diagram-5GNKFQAL.Bb-FViDj.js} +1 -1
  142. package/web/_astro/{diagram-KO2AKTUF.DMVJWaUN.js → diagram-KO2AKTUF.D3mN8S6x.js} +1 -1
  143. package/web/_astro/{diagram-LMA3HP47.Cxqrjg5-.js → diagram-LMA3HP47.dMMyPcbJ.js} +1 -1
  144. package/web/_astro/{diagram-OG6HWLK6.2lz_1B5h.js → diagram-OG6HWLK6.AzbvzY4C.js} +1 -1
  145. package/web/_astro/{erDiagram-TEJ5UH35.BVQEuJ3T.js → erDiagram-TEJ5UH35.BR5I4OZb.js} +1 -1
  146. package/web/_astro/{flowDiagram-I6XJVG4X.Qlyo90ky.js → flowDiagram-I6XJVG4X.DFqvhGkn.js} +1 -1
  147. package/web/_astro/{ganttDiagram-6RSMTGT7.DRwb8HHZ.js → ganttDiagram-6RSMTGT7.ByJbhH6J.js} +1 -1
  148. package/web/_astro/{gitGraphDiagram-PVQCEYII.YfoPthfS.js → gitGraphDiagram-PVQCEYII.CInHjQR3.js} +1 -1
  149. package/web/_astro/index.COh_kBxN.css +1 -0
  150. package/web/_astro/{infoDiagram-5YYISTIA.DvFREck1.js → infoDiagram-5YYISTIA.Cm0dGVjJ.js} +1 -1
  151. package/web/_astro/{ishikawaDiagram-YF4QCWOH.BzCj9Q0-.js → ishikawaDiagram-YF4QCWOH.C3nOP6Sj.js} +1 -1
  152. package/web/_astro/{journeyDiagram-JHISSGLW.BDMT_AFb.js → journeyDiagram-JHISSGLW.4IvLa2MW.js} +1 -1
  153. package/web/_astro/{kanban-definition-UN3LZRKU.D6Fh3gj9.js → kanban-definition-UN3LZRKU.DS87Cl-k.js} +1 -1
  154. package/web/_astro/{linear.Dxw00fGQ.js → linear.MzmRrNER.js} +1 -1
  155. package/web/_astro/{mermaid.core.CsoxUWa0.js → mermaid.core.fK-WNswS.js} +4 -4
  156. package/web/_astro/{mindmap-definition-RKZ34NQL.CN8oeHLu.js → mindmap-definition-RKZ34NQL.BqipOHhY.js} +1 -1
  157. package/web/_astro/{pieDiagram-4H26LBE5.C7ADqQ_7.js → pieDiagram-4H26LBE5.0nBiPqFG.js} +1 -1
  158. package/web/_astro/{quadrantDiagram-W4KKPZXB.Cw9lKyHP.js → quadrantDiagram-W4KKPZXB.Szj7Zpx5.js} +1 -1
  159. package/web/_astro/{requirementDiagram-4Y6WPE33.B1ni-z4q.js → requirementDiagram-4Y6WPE33.D4UR6TWo.js} +1 -1
  160. package/web/_astro/{sankeyDiagram-5OEKKPKP.BhexdjVr.js → sankeyDiagram-5OEKKPKP.DAE7BdOs.js} +1 -1
  161. package/web/_astro/{sequenceDiagram-3UESZ5HK.C3Rm7dpQ.js → sequenceDiagram-3UESZ5HK.BP9ZVq25.js} +1 -1
  162. package/web/_astro/{stateDiagram-AJRCARHV.CkuMt27u.js → stateDiagram-AJRCARHV.BQW7mIxk.js} +1 -1
  163. package/web/_astro/{stateDiagram-v2-BHNVJYJU.Dc_aazUA.js → stateDiagram-v2-BHNVJYJU.PbK4nDih.js} +1 -1
  164. package/web/_astro/{timeline-definition-PNZ67QCA.ja7sUFhH.js → timeline-definition-PNZ67QCA.Ci_GvUpo.js} +1 -1
  165. package/web/_astro/{vennDiagram-CIIHVFJN.BxIshX_K.js → vennDiagram-CIIHVFJN.DNw1Y5qx.js} +1 -1
  166. package/web/_astro/{wardleyDiagram-YWT4CUSO.DfHlC0sh.js → wardleyDiagram-YWT4CUSO.CwlkaaNe.js} +1 -1
  167. package/web/_astro/{xychartDiagram-2RQKCTM6.DSnhHwCh.js → xychartDiagram-2RQKCTM6.MI6ZuiH_.js} +1 -1
  168. package/web/board-runtime.json +1 -1
  169. package/web/index.html +2 -2
  170. package/web/_astro/BoardApp.BVp-LYi6.js +0 -322
  171. package/web/_astro/channel.6IFIKBhu.js +0 -1
  172. package/web/_astro/index.CbNz17Sx.css +0 -1
@@ -23,6 +23,18 @@
23
23
  # -> done
24
24
  # doc-sync routes a contract violation to `repair` (cheap, no
25
25
  # re-dispatch — ADR-118 pilot) and an executor failure to `failed`;
26
+ # 1147 adds two deterministic post-doc-sync checks that fail the step
27
+ # BEFORE the tripwire backstop and name doc-sync. Those edges are
28
+ # declared before the contract-violation edge, so a doc-sync that both
29
+ # misses its learnings post-condition and trips a deterministic check
30
+ # fails the step instead of taking repair. The checks are: the write-scope check
31
+ # (the entry snapshot diffed against the working listing; allowed paths
32
+ # are docs/** minus docs/tasks*/docs/features* plus the declared learnings
33
+ # capture — a violation writes scope-violation: <paths> and is reported,
34
+ # never auto-reverted) and the supersession-pin re-run
35
+ # (repo-wide-tests/adr-supersession.test.ts), so a resurrected delinked
36
+ # index row is attributable to doc-sync; doc-tripwire stays the full
37
+ # backstop and is never weakened;
26
38
  # learnings-validate (0986) rejects a nonempty narration-only capture to
27
39
  # the same `repair` edge with a distinct invalid-learnings-shape status —
28
40
  # expectFile proves existence, never shape — while empty/missing captures
@@ -86,7 +98,7 @@
86
98
  "$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
87
99
  kind: state-machine
88
100
  name: wrapup-pipeline
89
- version: "7"
101
+ version: "9"
90
102
  description: "Post-execution wrap-up: doc-sync (doc drift + learning capture), metrics, feature-transition, branch-cleanup"
91
103
  iterationBound: 10
92
104
  initialState: start
@@ -232,8 +244,26 @@ states:
232
244
  (a clean exit that missed its declared answerFile/expectFile post-condition)
233
245
  routes to the cheap `repair` edge instead of a full re-dispatch (ADR-118
234
246
  pilot, 0871) — `onError: continue` lets the transition guards read the
235
- agent's result instead of halting the run.
247
+ agent's result instead of halting the run. 1147 R1/R2 wrap it with a
248
+ deterministic write-scope guard (entry snapshot before the query, diff after
249
+ it; a violation writes scope-violation: <paths> and routes to `failed`, the
250
+ edits are reported and never auto-reverted) and a supersession-pin re-run, so
251
+ an out-of-scope or delinked-row write is attributed here instead of surfacing
252
+ late at doc-tripwire.
236
253
  onEnter:
254
+ # (1147 R1) entry snapshot: the working listing is recorded BEFORE the model
255
+ # query so the post-doc-sync check can attribute only this step's writes. Never
256
+ # aborts; a git failure or a missing script leaves the snapshot absent and the
257
+ # check fails closed rather than guessing.
258
+ - kind: shell
259
+ options:
260
+ command: >-
261
+ mkdir -p .spur/run &&
262
+ eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/wrapup-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/wrapup-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; if [ -f "$S" ]; then
263
+ "$RUNNER" "$S" doc-sync-snapshot;
264
+ else
265
+ echo "wrapup-steps failed closed — script not found — run 'superskill install sp --marketplace gobing-ai/spur'" >&2;
266
+ fi
237
267
  # (warn) free-form prompt: no /sp:doc-evolve command surface yet (ADR-043
238
268
  # residual, 0607 R2 one-query merge); capture is bounded by expectFile.
239
269
  - kind: agent.run
@@ -243,7 +273,10 @@ states:
243
273
  input: >-
244
274
  First run Skill(skill="sp:doc-evolve", args="wrapup") to repair drift in
245
275
  docs/00_ADR.md, docs/03_ARCHITECTURE.md, docs/04_DESIGN.md, docs/design/* per constitution edit
246
- rules; do not write task/feature corpus. The batch task list is the normalized, validated
276
+ rules; do not write task/feature corpus. Write ONLY inside docs/ (never docs/tasks* or
277
+ docs/features*) — any other changed path fails the wrap step with a scope violation. A row
278
+ absent from docs/04_DESIGN.md for a superseded satellite is intentional: do NOT re-add it.
279
+ The batch task list is the normalized, validated
247
280
  capture at .spur/run/${vars.__runId}-wrapup-tasks.json — read it for the WBS ids; never
248
281
  re-parse raw input. THEN extract working learnings from those tasks —
249
282
  conventions, errors fixed, patterns, gotchas, grouped by date and task WBS — as raw markdown
@@ -255,6 +288,34 @@ states:
255
288
  answerFile: .spur/run/${vars.__runId}-wrapup-learnings.md
256
289
  expectFile: .spur/run/${vars.__runId}-wrapup-learnings.md
257
290
  timeoutMs: ${vars.stepTimeoutMs}
291
+ # (1147 R1) post-doc-sync write-scope guard: the script diffs the working listing
292
+ # against the entry snapshot and writes PASS or `scope-violation: <paths>` — the
293
+ # action always exits 0 so status truth lives in the file (0783 R4) and the
294
+ # declared guard routes. Violating edits are reported, never reverted.
295
+ - kind: shell
296
+ options:
297
+ command: >-
298
+ mkdir -p .spur/run &&
299
+ eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/wrapup-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/wrapup-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; if [ -f "$S" ]; then
300
+ "$RUNNER" "$S" doc-sync-scope;
301
+ else
302
+ echo "wrapup-steps failed closed — script not found — run 'superskill install sp --marketplace gobing-ai/spur'" >&2;
303
+ printf 'scope-violation: wrapup-steps script not found\n' > ".spur/run/$__runId-wrapup-doc-sync-scope.status";
304
+ fi
305
+ # (1147 R2) supersession pins re-run: a doc-sync that resurrects a deliberately
306
+ # delinked index row (`repo-wide-tests/adr-supersession.test.ts`, g2) fails HERE,
307
+ # named with the pin, instead of being attributed to the later doc-tripwire
308
+ # backstop. Skips in a project without the pin; always exits 0 (0783 R4).
309
+ - kind: shell
310
+ options:
311
+ command: >-
312
+ mkdir -p .spur/run &&
313
+ eval "$(jq -r 'if .mode=="source-repo" then "S="+@sh"\(.dir)/wrapup-steps.ts"+" RUNNER=bun" elif .mode=="installed" then "S="+@sh"\(.dir)/wrapup-steps.mjs"+" RUNNER=node" else empty end' ".spur/run/$__runId-script-root.json" 2>/dev/null)"; if [ -f "$S" ]; then
314
+ "$RUNNER" "$S" doc-supersession;
315
+ else
316
+ echo "wrapup-steps failed closed — script not found — run 'superskill install sp --marketplace gobing-ai/spur'" >&2;
317
+ printf 'supersession-pin-failed: wrapup-steps script not found\n' > ".spur/run/$__runId-wrapup-doc-supersession.status";
318
+ fi
258
319
 
259
320
  - id: learnings-validate
260
321
  description: >
@@ -463,7 +524,8 @@ states:
463
524
  description: >
464
525
  Terminal — wrap-up failed (0770): invalid wrap input, an unresolved or
465
526
  non-completed task, a failed metrics capture, a failed required sync, a
466
- failed repo-wide tripwire (1037), or a failed feature gate.
527
+ failed repo-wide tripwire (1037), a failed feature gate, or one of the
528
+ deterministic post-doc-sync checks (1147: write scope, supersession pins).
467
529
  Already-written artifacts (learnings, metrics rows, route reason) are
468
530
  preserved; nothing is rolled back.
469
531
 
@@ -521,17 +583,47 @@ transitions:
521
583
  guard:
522
584
  kind: always
523
585
 
524
- # ── doc-sync: contract-first routing (ADR-118 pilot, 0871) ──
525
- # Declaration order matters: the contract-violation edge is tried first, then
526
- # success (action-ok), then the executor-failure defense (always) — a failed
527
- # agent.run reaches these guards because doc-sync's agent.run declares
528
- # onError: continue.
586
+ # ── doc-sync: deterministic checks, then contract repair (ADR-118; 1147 R1/R2) ──
587
+ # Declaration order matters. The engine takes the first passing guard. The two
588
+ # deterministic post-doc-sync checks (write scope, supersession pins) are tried
589
+ # first, so a doc-sync that both misses its learnings post-condition and writes
590
+ # out of scope (or resurrects a delinked row) fails the step. A violation they
591
+ # recorded can never be absorbed by repair or by the success edge. Contract
592
+ # violation is next (repair only when neither deterministic check fired), then
593
+ # success (action-ok), then the executor-failure defense (always). A failed
594
+ # agent.run reaches these guards because doc-sync's agent.run declares onError: continue.
595
+ - from: doc-sync
596
+ to: failed
597
+ terminalReason: failed-check
598
+ description: >
599
+ Write-scope violation (1147 R1): the post-doc-sync check found a changed path
600
+ outside docs/** minus the task/feature corpus (and the declared learnings
601
+ capture) — the status file names the paths and the failing step is doc-sync
602
+ itself. The edits are reported, never auto-reverted; already-written artifacts
603
+ stay on disk. Declared before contract-violation so a compound miss fails here.
604
+ guard:
605
+ kind: shell
606
+ options:
607
+ command: 'grep -q "^scope-violation:" .spur/run/$__runId-wrapup-doc-sync-scope.status 2>/dev/null'
608
+ - from: doc-sync
609
+ to: failed
610
+ terminalReason: failed-check
611
+ description: >
612
+ Supersession drift (1147 R2): the post-doc-sync re-run of
613
+ repo-wide-tests/adr-supersession.test.ts failed — doc-sync re-added a
614
+ deliberately delinked index row. Attributed here (named with the pin) rather
615
+ than at the later doc-tripwire backstop, which stays unchanged. Declared
616
+ before contract-violation so a compound miss fails here.
617
+ guard:
618
+ kind: shell
619
+ options:
620
+ command: 'grep -q "^supersession-pin-failed:" .spur/run/$__runId-wrapup-doc-supersession.status 2>/dev/null'
529
621
  - from: doc-sync
530
622
  to: repair
531
623
  description: >
532
624
  Contract violation (ADR-118): the agent exited 0 but missed its declared
533
- post-condition. Route to the cheap repair edge — never re-dispatch the
534
- full agent.run on this attempt.
625
+ post-condition, and neither deterministic check fired. Route to the cheap
626
+ repair edge — never re-dispatch the full agent.run on this attempt.
535
627
  trigger: contract-violation
536
628
  guard:
537
629
  kind: contract-violation
@@ -545,8 +637,9 @@ transitions:
545
637
  terminalReason: failed-check
546
638
  description: >
547
639
  Executor failure (non-zero exit, signal, or dispatch error) — keep the
548
- existing fail semantics; a contract violation never falls through here
549
- because the contract-violation edge is declared first.
640
+ existing fail semantics. A scope or supersession violation is declared
641
+ earlier and fails the step; a contract violation never falls through here
642
+ because its edge is declared before this defense.
550
643
  trigger: executor-failure
551
644
  guard:
552
645
  kind: always
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.99",
3
+ "version": "0.4.1",
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",
@@ -57,14 +57,14 @@
57
57
  },
58
58
  "devDependencies": {
59
59
  "@commander-js/extra-typings": "^14.0.0",
60
- "@gobing-ai/ts-db": "^0.5.12",
61
- "@gobing-ai/ts-ai-runner": "^0.5.12",
62
- "@gobing-ai/ts-dual-workflow-engine": "^0.5.12",
63
- "@gobing-ai/ts-infra": "^0.5.12",
64
- "@gobing-ai/ts-llm-jsonl-importer": "^0.5.12",
65
- "@gobing-ai/ts-rule-engine": "^0.5.12",
66
- "@gobing-ai/ts-runtime": "^0.5.12",
67
- "@gobing-ai/ts-utils": "^0.5.12",
60
+ "@gobing-ai/ts-db": "^0.5.21",
61
+ "@gobing-ai/ts-ai-runner": "^0.5.21",
62
+ "@gobing-ai/ts-dual-workflow-engine": "^0.5.21",
63
+ "@gobing-ai/ts-infra": "^0.5.21",
64
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.5.21",
65
+ "@gobing-ai/ts-rule-engine": "^0.5.21",
66
+ "@gobing-ai/ts-runtime": "^0.5.21",
67
+ "@gobing-ai/ts-utils": "^0.5.21",
68
68
  "@types/bun": "1.3.14",
69
69
  "@types/figlet": "^1.7.0",
70
70
  "@types/node-notifier": "8.0.5",
@@ -98,6 +98,7 @@ list this README is checked against.
98
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
99
  | `dev-plan` | Plan a feature from a written description — intake → feature create → AC generation → feature check gate → decomposition → batch-create |
100
100
  | `dev-brainstorm` | Interactive solution design — heuristic discovery interview followed by structured ideation with trade-offs and confidence scoring |
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`) |
101
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 |
102
103
 
103
104
  #### Lifecycle — execution
@@ -273,6 +274,7 @@ plugins/sp/
273
274
  ├── commands/ # Slash-command wrappers — the SSOT (hand-editable thin wrappers; see Commands below)
274
275
  ├── agents/ # 4 specialist subagents (expert-spur, super-coder, super-planner, super-reviewer)
275
276
  ├── hooks/ # hooks.json + task-write-guard.{ts,test.ts} + context-{session-start,post-tool,session-stop}.ts
277
+ │ # + agent-lifecycle.{ts,test.ts} + fleet-guest-stop.{ts,test.ts} (fleet member/guest hooks)
276
278
  │ # + careful-guard.{ts,test.ts} + context-hooks.test.ts + token-estimate.test.ts
277
279
  │ # + shared policy modules: agent-hint.ts, destructive-policy.{ts,test.ts}, task-file-policy.{ts,test.ts}
278
280
  │ # + pi/guard-extension.{ts,test.ts} (plugin.json `extensions.pi` entry point)
@@ -342,6 +344,7 @@ surface or run one workflow. All skills target the same five core platforms: `cl
342
344
  | `reverse-engineering` | 1.1 | Codebase analysis / HLD generation / audit — depth-driven reverse engineering with orthogonal mode, focus, and format controls; backs `/sp:dev-reverse` |
343
345
  | `issue-finding` | 2.0 | Session-log forensics — multi-source discovery, bottleneck ranking, optional topic focus, CLI-gated fix task generation; **legacy path** — superseded by `history-anatomy` for indexed reporting; backs no current command; directly invocable as sp:issue-finding |
344
346
  | `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` |
347
+ | `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) |
345
348
  | `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` |
346
349
  | `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` + `scripts/pr-reviewing.ts`; backs `/sp:dev-pr-review` |
347
350
  | `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 |
@@ -391,7 +394,7 @@ index above lists the live inventory, organized by the surface they wrap:
391
394
 
392
395
  | Prefix | Count | Delegates to | Purpose |
393
396
  | ------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
394
- | `dev-*` | 33 | `sp:spur-dev`, `sp:spur-cli`, `sp:next-router`, `sp:next-feature`, `sp:brainstorm`, `sp:wayfinder`, `sp:sys-architecture`, `sp:code-implementation`, `sp:code-testing`, `sp:code-verification`, `sp:functional-review`, `sp:code-improvement`, `sp:code-simplification`, `sp:sys-debugging`, `sp:dogfood-testing`, `sp:parallel-execution`, `sp:history-anatomy`, `sp:session-review`, `sp:conflict-finding`, `sp:reverse-engineering`, `sp:pr-reviewing`, inline | The dev-workflow surface — planning, execution, batch, wrap-up, review/verify, hygiene |
397
+ | `dev-*` | 38 | `sp:spur-dev`, `sp:spur-cli`, `sp:next-router`, `sp:next-feature`, `sp:brainstorm`, `sp:wayfinder`, `sp:sys-architecture`, `sp:code-implementation`, `sp:code-testing`, `sp:code-verification`, `sp:functional-review`, `sp:code-improvement`, `sp:code-simplification`, `sp:sys-debugging`, `sp:dogfood-testing`, `sp:parallel-execution`, `sp:history-anatomy`, `sp:session-review`, `sp:conflict-finding`, `sp:reverse-engineering`, `sp:pr-reviewing`, inline | The dev-workflow surface — planning, execution, batch, wrap-up, review/verify, hygiene |
395
398
  | `rule-*` | 3 | `sp:spur-cli` | The rule surface — `rule-add`, `rule-refine`, `rule-scan` |
396
399
  | `workflow-*` | 2 | `sp:spur-cli` | The workflow surface — `workflow-add`, `workflow-refine` |
397
400
  | `spur-init` | 1 | `sp:doc-evolve` | Project bootstrap (`spur init`) with doc-evolve integration |
@@ -406,6 +409,15 @@ hand-editable source for the operator command surface. Per-platform adapters are
406
409
  output** owned by `superskill` (`superskill install sp`) and never committed here. Plugin `sp` ships
407
410
  no per-platform artifacts — only the platform-independent thin wrappers.
408
411
 
412
+ **Install-time `lib/` ownership (1120).** Staging and refreshing the plugin's sibling
413
+ `lib/inline-run.generated.mjs` app bundle into the shared scripts root is `superskill`'s install
414
+ contract (superskill commit `b42961b`, first release after 0.3.35): spur ships the bundle, superskill
415
+ places it. The inline scripts carry a skew guard for the window where the installed bundle is older
416
+ than its scripts (e.g. superskill ≤ 0.3.35): they fail with a named version-skew error — bundle
417
+ path, missing exports, and both remedies — instead of an `is not a function` TypeError. Until a
418
+ superskill release containing `b42961b` is installed and `sp` reinstalled, pass
419
+ `--spur-bin <spur checkout>/apps/cli/src/index.ts`.
420
+
409
421
  **Thin-wrapper contract** is enforced by `scripts/commands/validate-commands.ts`:
410
422
 
411
423
  ```bash
@@ -473,13 +485,16 @@ the agent provides an isolated context window.
473
485
  #### 4. Hooks (`hooks/`)
474
486
 
475
487
  Event-driven enforcement that runs automatically without user invocation. `hooks.json` registers
476
- four handlers:
488
+ six handlers across seven events:
477
489
 
478
490
  | Event | Matcher | Handler | Timeout |
479
491
  | -------------- | ------------------------------------- | ---------------------------------------------- | ------- |
480
492
  | `PreToolUse` | `Write\|Edit` | `superskill hook run sp task-write-guard` | 10s |
481
493
  | `PostToolUse` | `Bash\|Grep\|Glob\|Read\|Write\|Edit` | `superskill hook run sp context-post-tool` | 10s |
482
494
  | `SessionStart` | — | `superskill hook run sp context-session-start` | 15s |
495
+ | `SessionStart`, `UserPromptSubmit`, `Stop` | — | `superskill hook run sp agent-lifecycle` | 5s |
496
+ | `Notification` | `permission_prompt` | `superskill hook run sp agent-lifecycle` | 5s |
497
+ | `Stop` | — | `superskill hook run sp fleet-guest-stop` | 10s |
483
498
  | `SessionEnd` | — | `superskill hook run sp context-session-stop` | 15s |
484
499
 
485
500
  **Write guard.** The `PreToolUse` hook fires on every `Write`/`Edit` tool call and checks whether
@@ -493,6 +508,11 @@ estimates the token cost of each matched tool call and appends it to `.spur/cont
493
508
  (with redaction of sensitive argument fields), `context-session-start` seeds the indexed-context
494
509
  hint on first launch, and `context-session-stop` closes out the session record.
495
510
 
511
+ **Fleet hooks (1080/1081).** `agent-lifecycle` reports member state in the background via
512
+ `spur agent report --state working|idle|blocked` (a permission prompt is `blocked`) — only when
513
+ `SPUR_SPEC_ID` is set, so outside a fleet it makes no call. `fleet-guest-stop` delivers pending
514
+ inbox work to a session joined as a fleet guest at turn end; any other session passes through.
515
+
496
516
  **Available but unwired:** `careful-guard.ts` ships in `hooks/` (with tests) as an opt-in
497
517
  `PreToolUse` guard that asks before destructive shell commands (`rm -rf`, `DROP TABLE`,
498
518
  `git push --force`, …) — it is **not** registered in `hooks.json`. Fail-open by contract; escape
@@ -511,6 +531,7 @@ hold `SKILL.md` and prompt-side companions only.
511
531
  | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
512
532
  | `hooks/task-write-guard.ts` | Compatibility shim for older installs that still execute the script path directly. Forwards stdin to the stable PATH command `superskill hook run sp task-write-guard`, mirrors parseable PreToolUse decisions, and fails open if the runtime is unavailable. Performs no source-tree CLI lookup. |
513
533
  | `hooks/context-*.ts` | Runtime for the three registered context hooks (session-start, post-tool, session-stop) — token-cost estimation + ledger append for `sp:indexed-context` |
534
+ | `hooks/{agent-lifecycle,fleet-guest-stop}.ts` | Fleet hooks (1080/1081): member lifecycle reports via `spur agent report`; turn-end inbox delivery to joined guests |
514
535
  | `hooks/careful-guard.ts` | Opt-in destructive-command guard (unwired — see Hooks above) |
515
536
  | `scripts/batch-preflight.ts` | Pure TABLE A STOP evaluation for `super-planner` — skip doomed pipeline launches without spawning a Skill subprocess; recovery hints map stuck statuses to a single `/sp:dev-*` hop |
516
537
  | `scripts/workflow-step-profile.ts` | Thin glue over the generated lib bundle (`lib/step-profile.generated.mjs` from `packages/app/src/workflow/step-profile.ts`) — read-only step profile from `spur workflow trace`: per node and action-kind durations, idle gaps, session mode and `cacheHit` coverage, plus the ADR-115 cache-window flags `sp:spur-doctor` turns into workflow-optimization proposals |
@@ -518,6 +539,8 @@ hold `SKILL.md` and prompt-side companions only.
518
539
  | `scripts/dogfood-testing/validate-report.ts` | Pure `validateReport(md)` — footer-mandatory + 7-check finalize-or-abort contract with stable error codes |
519
540
  | `scripts/daily-summary/{daily-summary,logger}.ts` | ccusage + git-history orchestration helpers for `sp:daily-summary` |
520
541
  | `scripts/task-diffstat.ts` | 0943 triage-lane diffstat producer — numstat + untracked scan vs the run base; writes `<wbs>-diffstat.json` with the sensitive-path flag; fails safe (sensitive) |
542
+ | `scripts/run-summary.ts` | Measured execution summary `/sp:dev-run` / `/sp:dev-runall` print by default (`--no-summary` skips) — windows the host transcript by `spur workflow progress` attempt timestamps; per stage/run time, wait, tool calls, total / non-cached tokens; `n/a` for subprocess windows |
543
+ | `scripts/session-timeline.ts` | Measured Time/Wait/Token evidence for `sp:session-review` — reads the active Claude Code transcript read-only, one segment per operator prompt, usage deduplicated by message id, tokens split total / non-cached; `{available:false}` exit 0 when no transcript |
521
544
  | `scripts/commands/validate-flag-contracts.ts` | Mechanical consistency gate — compares flag claims across command files, flag-glossary, cross-cutting, dev-operations, and ADR; reports disagreements |
522
545
  | `*.test.ts` | Unit suites — in `hooks/` for guards, in `tests/<skill>/` per ADR-031 pairing |
523
546
 
@@ -285,6 +285,17 @@ With `--json`, emit the same shape as a JSON object for machine consumption.
285
285
  `spur workflow continue --answer-text` and the run resumes implement with the Q/A transcript
286
286
  (bounded by `maxEscalations`). See [execution-batch.md Step 3](../skills/spur-dev/references/execution-batch.md#step-3--the-driver-loop-r3-r4).
287
287
 
288
+ ## Parent-host ownership of the visible plan (1105 R4)
289
+
290
+ The parent host owns the visible plan: apply the § 2.7 Visible batch plan updates in the parent
291
+ session's native todo list (`execution-batch.md` § 2.7; the frozen status mapping lives in
292
+ [inline-pipeline-driver.md](../skills/spur-dev/references/inline-pipeline-driver.md) § Host todo
293
+ update styles). Subagents own code and evidence — subagents never render the visible list and todo
294
+ tools are not available to them; at each **stage boundary** (implement, test, review, verify) a
295
+ subagent returns `{wbs, state, outcome}` (+ optional `next`), and the parent marks the matching rows
296
+ with the reported outcome. Keep letters/digits from the projection identical across both layers so
297
+ row identity stays stable.
298
+
288
299
  ## Platform Notes
289
300
 
290
301
  - **Claude Code:** native - `Bash` runs `spur` CLI for deterministic verbs; `Skill()` is available
@@ -123,6 +123,12 @@ HITL gate unless `--auto` was passed.
123
123
  - [ ] Dispatch each requested dimension to its owning skill — do not inline the review logic.
124
124
  - [ ] Merge findings into a single ranked report, emitting native priority cells
125
125
  (`P1 (blocker)` > `P2 (major)` > `P3 (minor)` > `P4 (advisory)` — see Output Format).
126
+ - [ ] Sweep a finding's **class** in the same round. When a defect is one instance of a repeated
127
+ pattern (the same rule misapplied on two surfaces, a signature stale in both a generator and
128
+ its output), grep for the siblings and report every instance now. A half-found class costs a
129
+ full gate + review cycle when the next round finds the other half — H1 batch 2026-10-08:
130
+ review round 1 of task 1129 named one runbook's fingerprint/commit mismatch, round 2 found
131
+ the same mismatch on the sibling runbook.
126
132
  - [ ] With a WBS target (standalone or pipeline), write the merged report to that task's
127
133
  `## Review` section via `spur task update <wbs> --section Review --from-file` — per task
128
134
  under a task set, then the combined summary table; with a path target, emit as advisory
@@ -165,6 +171,24 @@ fails it. One explicit mapping, no transcription step anywhere downstream:
165
171
  Severity words stay visible in the same cell — the mapping adds the machine-readable label, it does
166
172
  not replace the semantics.
167
173
 
174
+ **Disposition column (1089, E71).** The findings table carries a `Disposition` cell. It is not
175
+ cosmetic: the record stage's residual sweep reads these rows (`parseReviewFindings` in
176
+ `packages/app/src/services/residual-scan.ts`), and a `P1`–`P3` row with no disposition classifies as
177
+ **blocking**, which downgrades a PASS verdict to PARTIAL and closes the `done` gate. A finding you
178
+ resolved inside the same task therefore says so in that cell — `RESOLVED`/`FIXED`/`DONE` (optionally
179
+ with the commit) drops the row from the sweep; `DEFER(<reason>)` reclassifies a P3 as deferrable
180
+ (never P1/P2). Prose such as "Closed." inside the *Finding* cell does not count — the sweep reads
181
+ the cell, not the sentence. `OPEN` states "still live", and `ACCEPTED` marks a non-blocking P4
182
+ observation you are deliberately not acting on; both behave as an ordinary open row.
183
+
184
+ **Pipeline cost of an open finding (1122).** The review PASS edges run this same classification
185
+ before verify (`residual-scan 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
189
+ its cell now, while you hold the context, instead of leaving the cost to be rediscovered after a
190
+ full cycle.
191
+
168
192
  **Section-relative headings.** In WBS mode (standalone or pipeline) the report body is written
169
193
  *into* the task's `### Review` section, so every heading inside it MUST be `####` or deeper. A
170
194
  `##`/`###` heading in the body becomes a new top-level task section and corrupts the document. With
@@ -173,19 +197,17 @@ shallower.
173
197
 
174
198
  ```markdown
175
199
  #### Review Report — <wbs|path>
176
-
177
200
  **Scope:** <wbs diff | path glob>
178
201
  **Dimensions:** functional, security, efficiency, correctness, usability, architecture
179
202
  **Verdict:** PASS | PARTIAL | FAIL
180
-
181
203
  ##### Findings (ranked)
182
204
 
183
- | # | Priority | Dimension | Finding | Location |
184
- |---|----------|-----------|---------|----------|
185
- | 1 | P1 (blocker) | security | SQL injection in query builder | `src/api/users.ts:42` |
186
- | 2 | P2 (major) | architecture | Shallow pass-through UserService | `src/services/users.ts:15` |
187
- | 3 | P3 (minor) | correctness | Missing error branch in createUser | `src/api/users.ts:48` |
188
- | 4 | P4 (advisory) | usability | `createUser` error text omits the field name | `src/api/users.ts:51` |
205
+ | # | Priority | Dimension | Finding | Location | Disposition |
206
+ |---|----------|-----------|---------|----------|-------------|
207
+ | 1 | P1 (blocker) | security | SQL injection in query builder | `src/api/users.ts:42` | OPEN |
208
+ | 2 | P2 (major) | architecture | Shallow pass-through UserService | `src/services/users.ts:15` | OPEN |
209
+ | 3 | P3 (minor) | correctness | Missing error branch in createUser | `src/api/users.ts:48` | RESOLVED (fixed in <sha>) |
210
+ | 4 | P4 (advisory) | usability | `createUser` error text omits the field name | `src/api/users.ts:51` | ACCEPTED |
189
211
 
190
212
  ##### Functional Traceability
191
213
 
@@ -197,14 +219,20 @@ shallower.
197
219
  **Next:** <one-line action>
198
220
  ```
199
221
 
222
+ 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
226
+ review answer; never restate it as prose only.
227
+
200
228
  **No findings.** Never invent a defect to populate the table. Emit one substantive `P4 (advisory)`
201
229
  row that states what was reviewed and what was found — placeholder cells (empty, `—`, `n/a`) are
202
230
  rejected by the checker, and so they should be:
203
231
 
204
232
  ```markdown
205
- | # | Priority | Dimension | Finding | Location |
206
- |---|----------|-----------|---------|----------|
207
- | 1 | P4 (advisory) | — | No P1–P3 findings: 6 changed files reviewed across all six dimensions; R1–R3 traceable to tests | `packages/app/src/workflow/proof-input-fingerprint.ts:102-160` |
233
+ | # | Priority | Dimension | Finding | Location | Disposition |
234
+ |---|----------|-----------|---------|----------|-------------|
235
+ | 1 | P4 (advisory) | — | No P1–P3 findings: 6 changed files reviewed across all six dimensions; R1–R3 traceable to tests | `packages/app/src/workflow/proof-input-fingerprint.ts:102-160` | ACCEPTED |
208
236
  ```
209
237
 
210
238
  ## Out of scope
@@ -0,0 +1,8 @@
1
+ # Workspace-local test config (task 1127 R8/AC7, mirroring apps/cli's 0699 R3 precedent): without
2
+ # it, `cd plugins/sp && bun test` — the run AGENTS.md prescribes — skipped the root preload and
3
+ # resolved the operator's real ~/.config/spur/run/full-gate.lock. These suites then waited silently
4
+ # behind any live host-wide gate holder (their holder line is swallowed by `silenceStdout`), which
5
+ # is the dispatch-budget burn this task exists to remove. Coverage stays gated by the root bunfig
6
+ # (bun run test).
7
+ [test]
8
+ preload = ["../../tests/setup.ts"]
@@ -1,41 +1,54 @@
1
1
  ---
2
2
  description: Interactive solution design — heuristic discovery interview followed by structured ideation with trade-offs and confidence scoring
3
3
  role: planner
4
- argument-hint: "<topic> [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--wayfind] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]"
4
+ argument-hint: "<topic> [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]"
5
5
  allowed-tools: ["Bash", "Read", "Skill", "AskUserQuestion"]
6
6
  ---
7
7
 
8
8
  # Dev Brainstorm
9
9
 
10
- Wraps the **sp:brainstorm** and **sp:wayfinder** skills.
10
+ Wraps the **sp:brainstorm** skill.
11
11
 
12
12
  ## Argument Flags
13
13
 
14
14
  | Flag | Description | Default |
15
15
  | --- | --- | --- |
16
16
  | `<topic>` | Topic or problem statement to explore. | required |
17
- | `--depth` `<basic\|detailed\|comprehensive>` | Breadth vs. depth of the exploration. | detailed |
18
- | `--options` `<n>` | Number of solution options to generate. | 3 |
17
+ | `--depth` `<basic\|detailed\|comprehensive>` | How deep the discovery interview walks the decision tree. | detailed |
18
+ | `--options` `<n>` | Number of solution approaches to generate. | 3 |
19
19
  | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing ideation. | omit |
20
20
  | `--skip-discovery` | Skip the discovery interview; ideate immediately. | off |
21
- | `--wayfind` | Spawn a wayfinder feature for multi-session routing. | off |
22
- | `--task` `[<feature-id>]` | Create a tracking task under a feature. | omitted |
23
- | `--feature` `[<parent-id>]` | Attach the result to a parent feature. | omitted |
24
- | `--next` | Hand off to the next-router on success. | off |
21
+ | `--task` `[<feature-id>]` | Artifact exit: create one `todo` task from the chosen approach, optionally under `<feature-id>`. | omitted |
22
+ | `--feature` `[<parent-id>]` | Artifact exit: create a validated feature (Goal/Scope/BDD AC) from the chosen approach, optionally under `<parent-id>`. | omitted |
23
+ | `--next` | With `--feature` only: on a clean `feature check`, chain into `/sp:dev-plan --feature <ID>`. | off |
25
24
 
26
25
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
27
26
 
28
27
  ## Usage
29
28
 
30
- /sp:dev-brainstorm <topic> [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--wayfind] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]
29
+ ```
30
+ /sp:dev-brainstorm "<topic>" [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]
31
+ ```
32
+
33
+ Two phases:
34
+
35
+ 1. **Discovery** — a grilling interview, one question at a time, each with a recommended answer;
36
+ the codebase is explored before the operator is asked. Produces a resolved decision tree.
37
+ `--skip-discovery` replaces it with the skill's lightweight clarification step.
38
+ 2. **Ideation** — `--options` approaches, each with trade-offs, implementation notes, confidence
39
+ and the decisions it depends on; one is marked recommended.
40
+
41
+ Without an exit flag the brainstorm output is the result. `--task` and `--feature` are mutually
42
+ exclusive (passing both is an error); the operator confirms the chosen approach before either
43
+ writes to the corpus. `--next` is ignored without `--feature`.
44
+
45
+ If discovery shows the destination itself is too foggy to spec in one session, stop and recommend
46
+ `/sp:dev-find-way "<topic>"` with the resolved decision tree as its starting notes. Never chart a
47
+ multi-session map from this command.
31
48
 
32
49
  ## Implementation
33
50
 
34
51
  - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
35
- - Default: `Skill(skill="sp:brainstorm", args="dev-brainstorm --context <decision-tree> --options <n>")`
36
- - `--wayfind`: `Skill(skill="sp:wayfinder", args="chart --destination <destination> --context <decision-tree>")`
37
-
38
- `--next`: chain-to-completion with
39
- propagation. Only meaningful with `--feature` (the front-half artifact exit): on a clean
40
- `feature check`, chain into `/sp:dev-plan --feature <ID>` so the planning half runs end-to-end.
41
- Ignored without `--feature` (there is no task in a lifecycle to advance). **was: `--next` declared but never defined.**
52
+ - Discovery protocol: [grilling-interview.md](../skills/brainstorm/references/grilling-interview.md).
53
+ - Ideation: `Skill(skill="sp:brainstorm", args="dev-brainstorm --context <decision-tree> --options <n>")`
54
+ - Artifact exits and `--next`: [dev-operations.md § 12. brainstorm](../skills/spur-dev/references/dev-operations.md#12-brainstorm).
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  description: Generate changelog from git commits
3
3
  role: scribe
4
- argument-hint: "[--since <tag|commit>] [--until <tag|commit>] [--version <version>]"
5
- allowed-tools: ["Bash", "Read"]
4
+ argument-hint: "[<file>] [--since <tag|commit>] [--until <tag|commit>] [--version <version>]"
5
+ allowed-tools: ["Bash", "Read", "Edit"]
6
6
  ---
7
7
 
8
8
  # Dev Changelog
@@ -13,6 +13,7 @@ Implements an inline procedure — see [dev-operations.md](../skills/spur-dev/re
13
13
 
14
14
  | Flag | Description | Default |
15
15
  | --- | --- | --- |
16
+ | `<file>` | Optional positional target (e.g. `CHANGELOG.md`); the new section is inserted above its newest release. | stdout |
16
17
  | `--since` `<tag\|commit>` | Start of the commit range. | latest tag |
17
18
  | `--until` `<tag\|commit>` | End of the commit range. | HEAD |
18
19
  | `--version` `<version>` | Override the detected release version. | detected |
@@ -21,9 +22,9 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
21
22
 
22
23
  ## Usage
23
24
 
24
- /sp:dev-changelog [--since <tag|commit>] [--until <tag|commit>] [--version <version>]
25
+ /sp:dev-changelog [<file>] [--since <tag|commit>] [--until <tag|commit>] [--version <version>]
25
26
 
26
27
  ## Implementation
27
28
 
28
- Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog).
29
+ Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#8-changelog) (changelog). This is a docs-only generator: run no quality gates (lint, tests, `spur-check`, rules, citation checks).
29
30
 
@@ -0,0 +1,80 @@
1
+ ---
2
+ description: Wayfinder — chart a multi-session investigation map for a foggy destination, or resolve one map ticket, always inside an isolated git worktree + branch
3
+ role: planner
4
+ argument-hint: "<idea> | <feature-id> [<wbs>] [--agent <inline|auto|name>] [--auto] [--worktree [<name>]] [--wrap]"
5
+ allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill", "AskUserQuestion"]
6
+ ---
7
+
8
+ # Dev Find Way
9
+
10
+ Wraps the **sp:wayfinder** skill.
11
+
12
+ ## Argument Flags
13
+
14
+ | Flag | Description | Default |
15
+ | --- | --- | --- |
16
+ | `<idea>` | Loose idea whose destination is too foggy to spec in one session. Enters **chart** mode. | required (one of `<idea>` / `<feature-id>`) |
17
+ | `<feature-id>` | Existing wayfinder map (feature tagged `wayfinder-map`). Enters **work** mode. | required (one of `<idea>` / `<feature-id>`) |
18
+ | `<wbs>` | Work mode only: the ticket to resolve. Omit to take the first unclaimed frontier ticket. | first frontier ticket |
19
+ | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing charting/resolution. | omit |
20
+ | `--auto` | Skip objective HITL confirmations. Never skips the map's open-question decisions. | off |
21
+ | `--worktree` `[<name>]` | Isolation mode. Bare (or omitted) creates a fresh worktree + branch; `--worktree <name>` adopts an existing worktree by name/path/branch. FF-merge on success, retain on failure. There is no in-place mode. | create |
22
+ | `--wrap` | Work mode only: after the ticket reaches `done`, run `/sp:dev-wrap <wbs>` inside the worktree before the merge. | off |
23
+
24
+ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
25
+
26
+ ## Usage
27
+
28
+ ```
29
+ /sp:dev-find-way "<idea>" [--agent <inline|auto|name>] [--auto] [--worktree [<name>]]
30
+ /sp:dev-find-way <feature-id> [<wbs>] [--agent <inline|auto|name>] [--auto] [--worktree [<name>]] [--wrap]
31
+ ```
32
+
33
+ A first argument that resolves as a feature id (`spur feature show <id> --json`) is work mode;
34
+ anything else is a chart-mode idea. Chart mode charts the map and stops; work mode resolves
35
+ **exactly one** ticket (one ticket per session).
36
+
37
+ **Always a worktree + branch.** Every invocation runs in an isolated git worktree on its own branch —
38
+ never in the invoking tree, and never as a branch switch (`git checkout -b`) in the invoking tree.
39
+ A branch-only session mutates the operator's checkout under every other agent sharing it, and its
40
+ `wayfind/*` branches pile up on the main tree. Omitting `--worktree` behaves exactly like bare
41
+ `--worktree`.
42
+
43
+ **Lifecycle.** `execution-batch.md` § Worktree isolation applied to a run of one (WT-1…WT-5):
44
+
45
+ - WT-1 dirty-tree precheck on the invoking tree (abort on dirty — name the files).
46
+ - WT-2 create (sibling dir, `bun install --frozen-lockfile --ignore-scripts`) or adopt by name.
47
+ - WT-3 marker in the invoking tree's `.spur/run/`: `command` = `dev-find-way`, `selector` =
48
+ `chart:<destination-slug>` or `<feature-id>:<wbs>`.
49
+ - Derived branch: `sp/wayfind-<destination-slug>-<short-id>` (chart) or
50
+ `sp/wayfind-<wbs>-<short-id>` (work).
51
+ - WT-3b commit the session's corpus writes on the branch, then WT-4 FF-merge onto the base ref
52
+ (create mode removes the tree and deletes the branch; reuse mode retains both).
53
+ - WT-5 retain intact on any failure, HITL pause, unresolved open question that ends the session,
54
+ or non-FF base — report path, branch and the resume command (`--worktree <name>`).
55
+
56
+ Success is: **chart** — map feature created, tagged `wayfinder-map`, `spur feature check <id>`
57
+ clean, child tickets wired; **work** — the ticket reached `done`, its line is in
58
+ **## Decisions so far**, and graduated fog became tickets.
59
+
60
+ **Ticket selection across parallel sessions (work mode).** Corpus writes — including the `wip`
61
+ claim — land in the worktree copy until the merge, so a claim is invisible to sibling worktrees.
62
+ Before choosing a frontier ticket, read every `.spur/run/worktree-*.json` marker in the invoking
63
+ tree with `command: dev-find-way` and `status: active`/`retained`, and exclude their `<wbs>`. A named
64
+ `<wbs>` held by such a marker aborts before any tree is created; resume it with
65
+ `--worktree <name>` instead.
66
+
67
+ **`--wrap`.** Runs after the ticket reaches `done` and before WT-3b, so the wrap's writes merge with
68
+ the resolution. `--agent` is preserved into the `/sp:dev-wrap <wbs>` handoff when supplied. In chart
69
+ mode nothing is resolved: `--wrap` is skipped with the reason `wrap skipped: chart mode resolves no
70
+ ticket`.
71
+
72
+ **Corpus visibility.** Until the FF-merge, the map and ticket writes exist only in the worktree; the
73
+ invoking tree shows the pre-session state. Expected, not a bug.
74
+
75
+ ## Implementation
76
+
77
+ - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
78
+ - Worktree lifecycle: [execution-batch.md § Worktree isolation](../skills/spur-dev/references/execution-batch.md#worktree-isolation---worktree-name) — every host call pins the execution tree per its per-call tree-pin rule.
79
+ - Inside the worktree: `Skill(skill="sp:wayfinder", args="$ARGUMENTS")` — the skill owns charting, ticket resolution, fog graduation and the one-ticket-per-session rule.
80
+ - `--wrap` (work mode): `/sp:dev-wrap <wbs> [--agent <value>]` inside the worktree before WT-3b.