@gobing-ai/spur 0.4.0 → 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 (154) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/decisions/gates.yaml +36 -0
  3. package/config/decisions/history-anatomy.yaml +35 -0
  4. package/config/decisions/idea-pipeline.yaml +38 -0
  5. package/config/plugin-scripts.json +15 -0
  6. package/config/rules/docs/sourced-api-claims.yaml +60 -0
  7. package/config/rules/recommended-pre-check.yaml +8 -3
  8. package/config/rules/structure/scratch-evidence-pointer.yaml +35 -0
  9. package/config/script-placement-baseline.json +2 -2
  10. package/config/workflows/feature-lifecycle.yaml +9 -2
  11. package/config/workflows/history-anatomy.yaml +22 -0
  12. package/config/workflows/idea-pipeline.yaml +75 -0
  13. package/config/workflows/task-pipeline.yaml +216 -57
  14. package/config/workflows/wrapup-pipeline.yaml +106 -13
  15. package/package.json +9 -9
  16. package/plugins/sp/README.md +11 -1
  17. package/plugins/sp/agents/super-planner.md +11 -0
  18. package/plugins/sp/agents/super-reviewer.md +14 -0
  19. package/plugins/sp/bunfig.toml +8 -0
  20. package/plugins/sp/commands/dev-brainstorm.md +29 -16
  21. package/plugins/sp/commands/dev-find-way.md +80 -0
  22. package/plugins/sp/commands/dev-idea.md +6 -0
  23. package/plugins/sp/commands/dev-parallel.md +8 -2
  24. package/plugins/sp/commands/dev-plan.md +6 -0
  25. package/plugins/sp/commands/dev-review-session.md +3 -1
  26. package/plugins/sp/commands/dev-run.md +12 -2
  27. package/plugins/sp/commands/dev-runall.md +18 -10
  28. package/plugins/sp/hooks/context-session-start.ts +1 -1
  29. package/plugins/sp/lib/idea-handoff.generated.mjs +41 -5
  30. package/plugins/sp/lib/inline-run-app.ts +28 -0
  31. package/plugins/sp/lib/inline-run.generated.d.mts +5 -0
  32. package/plugins/sp/lib/inline-run.generated.mjs +333 -45
  33. package/plugins/sp/lib/plan-projection.generated.d.mts +28 -0
  34. package/plugins/sp/lib/plan-projection.generated.mjs +255 -0
  35. package/plugins/sp/lib/quality-gate.generated.d.mts +47 -1
  36. package/plugins/sp/lib/quality-gate.generated.mjs +30489 -82
  37. package/plugins/sp/lib/residual-scan.generated.d.mts +19 -0
  38. package/plugins/sp/lib/residual-scan.generated.mjs +66 -0
  39. package/plugins/sp/lib/run-summary-core.ts +561 -0
  40. package/plugins/sp/lib/transcript.ts +121 -6
  41. package/plugins/sp/plugin.json +1 -1
  42. package/plugins/sp/references/roles.md +1 -1
  43. package/plugins/sp/scripts/batch-plan.mjs +335 -0
  44. package/plugins/sp/scripts/batch-plan.ts +100 -0
  45. package/plugins/sp/scripts/batch-preflight.mjs +51 -3
  46. package/plugins/sp/scripts/batch-preflight.ts +72 -1
  47. package/plugins/sp/scripts/commit-guard.mjs +216 -0
  48. package/plugins/sp/scripts/commit-guard.ts +249 -0
  49. package/plugins/sp/scripts/inline-run-dispatch.mjs +130 -0
  50. package/plugins/sp/scripts/inline-run-dispatch.ts +135 -0
  51. package/plugins/sp/scripts/inline-run-setup.mjs +551 -80
  52. package/plugins/sp/scripts/inline-run-setup.ts +52 -78
  53. package/plugins/sp/scripts/persist-out-check.mjs +90 -41
  54. package/plugins/sp/scripts/persist-out-check.ts +112 -57
  55. package/plugins/sp/scripts/quality-gate.mjs +30407 -73
  56. package/plugins/sp/scripts/quality-gate.ts +21 -5
  57. package/plugins/sp/scripts/residual-scan.mjs +86 -31
  58. package/plugins/sp/scripts/residual-scan.ts +28 -30
  59. package/plugins/sp/scripts/run-summary.mjs +421 -14
  60. package/plugins/sp/scripts/run-summary.ts +41 -177
  61. package/plugins/sp/scripts/session-timeline.mjs +109 -12
  62. package/plugins/sp/scripts/session-timeline.ts +71 -19
  63. package/plugins/sp/scripts/wrapup-steps.mjs +150 -2
  64. package/plugins/sp/scripts/wrapup-steps.ts +203 -1
  65. package/plugins/sp/skills/brainstorm/SKILL.md +9 -47
  66. package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
  67. package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +1 -0
  68. package/plugins/sp/skills/code-implementation/SKILL.md +48 -1
  69. package/plugins/sp/skills/code-verification/SKILL.md +3 -4
  70. package/plugins/sp/skills/code-verification/references/secu-review.md +3 -0
  71. package/plugins/sp/skills/code-verification/references/verdict-schema.md +68 -0
  72. package/plugins/sp/skills/fleet-join/SKILL.md +1 -1
  73. package/plugins/sp/skills/session-review/SKILL.md +38 -7
  74. package/plugins/sp/skills/source-driven-development/SKILL.md +5 -0
  75. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +5 -3
  76. package/plugins/sp/skills/spur-cli/SKILL.md +5 -2
  77. package/plugins/sp/skills/spur-cli/references/agent.md +20 -15
  78. package/plugins/sp/skills/spur-cli/references/decision.md +7 -6
  79. package/plugins/sp/skills/spur-cli/references/message.md +7 -7
  80. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +19 -3
  81. package/plugins/sp/skills/spur-cli/references/tasks.md +10 -7
  82. package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +7 -0
  83. package/plugins/sp/skills/spur-cli/references/workflows.md +7 -2
  84. package/plugins/sp/skills/spur-composer/SKILL.md +1 -1
  85. package/plugins/sp/skills/spur-dev/SKILL.md +18 -14
  86. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +6 -3
  87. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +49 -14
  88. package/plugins/sp/skills/spur-dev/references/dev-operations.md +37 -16
  89. package/plugins/sp/skills/spur-dev/references/execution-batch-continuation.md +68 -0
  90. package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +194 -0
  91. package/plugins/sp/skills/spur-dev/references/execution-batch.md +113 -1020
  92. package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +130 -0
  93. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +6 -0
  94. package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +471 -0
  95. package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +379 -0
  96. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +35 -5
  97. package/plugins/sp/skills/spur-dev/references/glossary.md +2 -2
  98. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +343 -163
  99. package/plugins/sp/skills/spur-dev/references/structured-trace-emission.md +178 -0
  100. package/plugins/sp/skills/wayfinder/SKILL.md +10 -14
  101. package/schemas/state-machine-workflow.schema.json +23 -0
  102. package/spur.js +20728 -16630
  103. package/web/_astro/{BoardApp.VeoxxLBy.js → BoardApp.D66k_s_T.js} +1 -1
  104. package/web/_astro/{BoardApp.Bzr4OXrW.js → BoardApp.D6sjAJr_.js} +173 -173
  105. package/web/_astro/{TaskDetail.LAyR_Pvn.js → TaskDetail.BynLnMNc.js} +1 -1
  106. package/web/_astro/{arc.f4e0OYLg.js → arc._BUadrdH.js} +1 -1
  107. package/web/_astro/{architectureDiagram-3BPJPVTR.SSIvxi-Z.js → architectureDiagram-3BPJPVTR.Dh7xS1Pp.js} +1 -1
  108. package/web/_astro/{blockDiagram-GPEHLZMM.DSXIHOFf.js → blockDiagram-GPEHLZMM.DFDVpfXm.js} +1 -1
  109. package/web/_astro/{c4Diagram-AAUBKEIU.DG9Ubu85.js → c4Diagram-AAUBKEIU.V7_3_glh.js} +1 -1
  110. package/web/_astro/channel.DZVfto-r.js +1 -0
  111. package/web/_astro/{chunk-2J33WTMH.C7QU88Qh.js → chunk-2J33WTMH.De1yx7Jz.js} +1 -1
  112. package/web/_astro/{chunk-4BX2VUAB.26Z94xBj.js → chunk-4BX2VUAB.BDhHFuxx.js} +1 -1
  113. package/web/_astro/{chunk-55IACEB6.DYRiBkqw.js → chunk-55IACEB6.DDLkWnmC.js} +1 -1
  114. package/web/_astro/{chunk-727SXJPM.D5Vfv5pe.js → chunk-727SXJPM.CwfiLnA7.js} +1 -1
  115. package/web/_astro/{chunk-AQP2D5EJ.DXHV47bN.js → chunk-AQP2D5EJ.CtGDmUnM.js} +1 -1
  116. package/web/_astro/{chunk-FMBD7UC4.D1suAfOs.js → chunk-FMBD7UC4.BOLjpw73.js} +1 -1
  117. package/web/_astro/{chunk-ND2GUHAM.D6BmdHEY.js → chunk-ND2GUHAM.BDhQls6O.js} +1 -1
  118. package/web/_astro/{chunk-QZHKN3VN.rnPU-Ak-.js → chunk-QZHKN3VN.76qBynDF.js} +1 -1
  119. package/web/_astro/{classDiagram-4FO5ZUOK.CvEfXIo1.js → classDiagram-4FO5ZUOK.N0mpPHT0.js} +1 -1
  120. package/web/_astro/{classDiagram-v2-Q7XG4LA2.CvEfXIo1.js → classDiagram-v2-Q7XG4LA2.N0mpPHT0.js} +1 -1
  121. package/web/_astro/{cose-bilkent-S5V4N54A.DkMisLSm.js → cose-bilkent-S5V4N54A.CKknFfjB.js} +1 -1
  122. package/web/_astro/{cynefin-OW5HDTMX.C77Q-pF6.js → cynefin-OW5HDTMX.Cw3ZWBAh.js} +1 -1
  123. package/web/_astro/{dagre-BM42HDAG.YaV8ce27.js → dagre-BM42HDAG.D3yIKCRD.js} +1 -1
  124. package/web/_astro/{diagram-2AECGRRQ.CUyGEKge.js → diagram-2AECGRRQ.D51dO83Z.js} +1 -1
  125. package/web/_astro/{diagram-5GNKFQAL.CRgd8dgj.js → diagram-5GNKFQAL.Bb-FViDj.js} +1 -1
  126. package/web/_astro/{diagram-KO2AKTUF.Bmzys9hq.js → diagram-KO2AKTUF.D3mN8S6x.js} +1 -1
  127. package/web/_astro/{diagram-LMA3HP47.BvmJY4Lw.js → diagram-LMA3HP47.dMMyPcbJ.js} +1 -1
  128. package/web/_astro/{diagram-OG6HWLK6.0hEhD30d.js → diagram-OG6HWLK6.AzbvzY4C.js} +1 -1
  129. package/web/_astro/{erDiagram-TEJ5UH35.Bjt8lrnm.js → erDiagram-TEJ5UH35.BR5I4OZb.js} +1 -1
  130. package/web/_astro/{flowDiagram-I6XJVG4X.CJZTjRDV.js → flowDiagram-I6XJVG4X.DFqvhGkn.js} +1 -1
  131. package/web/_astro/{ganttDiagram-6RSMTGT7._VqoVafc.js → ganttDiagram-6RSMTGT7.ByJbhH6J.js} +1 -1
  132. package/web/_astro/{gitGraphDiagram-PVQCEYII.CEDb7tVo.js → gitGraphDiagram-PVQCEYII.CInHjQR3.js} +1 -1
  133. package/web/_astro/index.COh_kBxN.css +1 -0
  134. package/web/_astro/{infoDiagram-5YYISTIA.CgwifPpK.js → infoDiagram-5YYISTIA.Cm0dGVjJ.js} +1 -1
  135. package/web/_astro/{ishikawaDiagram-YF4QCWOH.B99wx2J1.js → ishikawaDiagram-YF4QCWOH.C3nOP6Sj.js} +1 -1
  136. package/web/_astro/{journeyDiagram-JHISSGLW.2hRwJbEo.js → journeyDiagram-JHISSGLW.4IvLa2MW.js} +1 -1
  137. package/web/_astro/{kanban-definition-UN3LZRKU.BahJkKNC.js → kanban-definition-UN3LZRKU.DS87Cl-k.js} +1 -1
  138. package/web/_astro/{linear.DguUUe6V.js → linear.MzmRrNER.js} +1 -1
  139. package/web/_astro/{mermaid.core.CvgfmqVr.js → mermaid.core.fK-WNswS.js} +4 -4
  140. package/web/_astro/{mindmap-definition-RKZ34NQL.B3qEA3x9.js → mindmap-definition-RKZ34NQL.BqipOHhY.js} +1 -1
  141. package/web/_astro/{pieDiagram-4H26LBE5.FlWA-_ru.js → pieDiagram-4H26LBE5.0nBiPqFG.js} +1 -1
  142. package/web/_astro/{quadrantDiagram-W4KKPZXB.9bVn35X7.js → quadrantDiagram-W4KKPZXB.Szj7Zpx5.js} +1 -1
  143. package/web/_astro/{requirementDiagram-4Y6WPE33.ChykIhct.js → requirementDiagram-4Y6WPE33.D4UR6TWo.js} +1 -1
  144. package/web/_astro/{sankeyDiagram-5OEKKPKP.Z2Y3hkYb.js → sankeyDiagram-5OEKKPKP.DAE7BdOs.js} +1 -1
  145. package/web/_astro/{sequenceDiagram-3UESZ5HK.J7JsHWDt.js → sequenceDiagram-3UESZ5HK.BP9ZVq25.js} +1 -1
  146. package/web/_astro/{stateDiagram-AJRCARHV.DAPbiCSS.js → stateDiagram-AJRCARHV.BQW7mIxk.js} +1 -1
  147. package/web/_astro/{stateDiagram-v2-BHNVJYJU.D2jvSi0q.js → stateDiagram-v2-BHNVJYJU.PbK4nDih.js} +1 -1
  148. package/web/_astro/{timeline-definition-PNZ67QCA.psW2ci29.js → timeline-definition-PNZ67QCA.Ci_GvUpo.js} +1 -1
  149. package/web/_astro/{vennDiagram-CIIHVFJN.DlILYVmg.js → vennDiagram-CIIHVFJN.DNw1Y5qx.js} +1 -1
  150. package/web/_astro/{wardleyDiagram-YWT4CUSO.xNWwLJnn.js → wardleyDiagram-YWT4CUSO.CwlkaaNe.js} +1 -1
  151. package/web/_astro/{xychartDiagram-2RQKCTM6.EU_BuH7V.js → xychartDiagram-2RQKCTM6.MI6ZuiH_.js} +1 -1
  152. package/web/index.html +2 -2
  153. package/web/_astro/channel.CUFdtWhm.js +0 -1
  154. package/web/_astro/index.Dg_3bOaJ.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.4.0",
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.16",
61
- "@gobing-ai/ts-ai-runner": "^0.5.16",
62
- "@gobing-ai/ts-dual-workflow-engine": "^0.5.16",
63
- "@gobing-ai/ts-infra": "^0.5.16",
64
- "@gobing-ai/ts-llm-jsonl-importer": "^0.5.16",
65
- "@gobing-ai/ts-rule-engine": "^0.5.16",
66
- "@gobing-ai/ts-runtime": "^0.5.16",
67
- "@gobing-ai/ts-utils": "^0.5.16",
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
@@ -393,7 +394,7 @@ index above lists the live inventory, organized by the surface they wrap:
393
394
 
394
395
  | Prefix | Count | Delegates to | Purpose |
395
396
  | ------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
396
- | `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 |
397
398
  | `rule-*` | 3 | `sp:spur-cli` | The rule surface — `rule-add`, `rule-refine`, `rule-scan` |
398
399
  | `workflow-*` | 2 | `sp:spur-cli` | The workflow surface — `workflow-add`, `workflow-refine` |
399
400
  | `spur-init` | 1 | `sp:doc-evolve` | Project bootstrap (`spur init`) with doc-evolve integration |
@@ -408,6 +409,15 @@ hand-editable source for the operator command surface. Per-platform adapters are
408
409
  output** owned by `superskill` (`superskill install sp`) and never committed here. Plugin `sp` ships
409
410
  no per-platform artifacts — only the platform-independent thin wrappers.
410
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
+
411
421
  **Thin-wrapper contract** is enforced by `scripts/commands/validate-commands.ts`:
412
422
 
413
423
  ```bash
@@ -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
@@ -175,6 +181,14 @@ with the commit) drops the row from the sweep; `DEFER(<reason>)` reclassifies a
175
181
  the cell, not the sentence. `OPEN` states "still live", and `ACCEPTED` marks a non-blocking P4
176
182
  observation you are deliberately not acting on; both behave as an ordinary open row.
177
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
+
178
192
  **Section-relative headings.** In WBS mode (standalone or pipeline) the report body is written
179
193
  *into* the task's `### Review` section, so every heading inside it MUST be `####` or deeper. A
180
194
  `##`/`###` heading in the body becomes a new top-level task section and corrupts the document. With
@@ -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).
@@ -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.
@@ -52,6 +52,12 @@ Flag → vars: `--auto` sets `profile=auto`, `idea_approved=true`, `design_appro
52
52
 
53
53
  ## Implementation
54
54
 
55
+ - **Publish the generated plan first (1105):** your first tool call — before invoking the skill or
56
+ reading any reference — is `spur workflow show idea-pipeline.yaml --no-logo --format todo --json`
57
+ (the CLI resolves the project→registered→shared layer); then publish every `.plan` row's `text`
58
+ verbatim as the host todo list (the `steps[]` inventory when `.plan` is `null`) before the
59
+ pipeline's first stage — [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md)
60
+ run setup step 5.
55
61
  - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
56
62
  - Omitted/`inline`: drive `idea-pipeline.yaml` through the [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md). Do not launch `spur workflow run`, `spur agent run`, or a native subagent unless the operator explicitly requests delegation.
57
63
  - `auto`/name: launch `spur workflow run idea-pipeline.yaml --async`, observe with one `workflow trace --follow`, and only report cancellation as stopped when `workflow cancel --json` returns `killed: true`.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Fan out independent tasks or investigations in parallel via subagents — choose the right pattern and synthesize results
3
3
  role: planner
4
- argument-hint: "--tasks <selector> [--feature <id>] [--mode <fan-out|review-panel|investigation>] [--agent <inline|auto|name>] [--json]"
4
+ argument-hint: "--tasks <selector> [--feature <id>] [--mode <fan-out|review-panel|investigation>] [--agent <inline|auto|name>] [--json] [--defer-gate]"
5
5
  allowed-tools: ["Bash", "Read", "Skill"]
6
6
  ---
7
7
 
@@ -18,14 +18,20 @@ Wraps the **sp:parallel-execution** skill.
18
18
  | `--mode` `<fan-out\|review-panel\|investigation>` | Fan-out pattern. | fan-out |
19
19
  | `--agent` `<inline\|auto\|name>` | Who runs each dispatched slice. Parallel fan-out is dispatch, so explicit `--agent inline` runs the batch **sequentially in the host session** with a printed notice (zero dispatch); omit keeps the default fan-out semantics; `auto` tier-resolves an executor; a name pins that executor. | omit |
20
20
  | `--json` | Emit structured JSON. | off |
21
+ | `--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`; default off. | off |
21
22
 
22
23
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
23
24
 
24
25
  ## Usage
25
26
 
26
- /sp:dev-parallel --tasks <selector> [--feature <id>] [--mode <fan-out|review-panel|investigation>] [--agent <inline|auto|name>] [--json]
27
+ /sp:dev-parallel --tasks <selector> [--feature <id>] [--mode <fan-out|review-panel|investigation>] [--agent <inline|auto|name>] [--json] [--defer-gate]
27
28
 
28
29
  ## Implementation
29
30
 
31
+ - **Publish the visible batch plan first (1105):** as the batch orchestrator, publish `A Prepare
32
+ batch` (A1–A4) and `Z Batch report` before the first task, then one letter per task from
33
+ `batch-plan.mjs waves` after freeze/order and digit children from `batch-plan.mjs task-children` at
34
+ task start — [execution-batch.md](../skills/spur-dev/references/execution-batch.md#27-visible-batch-plan-1105-r3)
35
+ § 2.7 Visible batch plan.
30
36
  - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface) before choosing native subagents or `spur agent run`.
31
37
  - `Skill(skill="sp:parallel-execution", args="$ARGUMENTS")`
@@ -41,6 +41,12 @@ contract as `/sp:dev-idea`). If passed, ignore them with a one-line notice.
41
41
 
42
42
  ## Implementation
43
43
 
44
+ - **Publish the generated plan first (1105):** your first tool call — before invoking the skill or
45
+ reading any reference — is `spur workflow show idea-pipeline.yaml --no-logo --format todo --json`
46
+ (the CLI resolves the project→registered→shared layer); then publish every `.plan` row's `text`
47
+ verbatim as the host todo list (the `steps[]` inventory when `.plan` is `null`) before the
48
+ pipeline's first stage — [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md)
49
+ run setup step 5.
44
50
  - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
45
51
  - Omitted/`inline`: drive `idea-pipeline.yaml` through the [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md). Do not launch `spur workflow run`, `spur agent run`, or a native subagent unless the operator explicitly requests delegation.
46
52
  - `auto`/name: launch `spur workflow run idea-pipeline.yaml --async`, observe with one `workflow trace --follow`, and only report cancellation as stopped when `workflow cancel --json` returns `killed: true`.
@@ -16,7 +16,9 @@ implement-ready tasks for further fixing; `--triage` is an alias of `--fix auto`
16
16
  it defers nothing: every actionable finding is fixed inline and no task is filed. The result includes a non-overlapping time breakdown —
17
17
  work time, operator wait, tool calls and tokens (total / non-cached) per stage, measured from the host transcript by
18
18
  `session-timeline.mjs` — with durations in `M:SS` or `H:MM:SS` form and `n/a` only when that
19
- measurement is unavailable.
19
+ measurement is unavailable. The transcript resolves from `--transcript`, else
20
+ `CLAUDE_CODE_SESSION_ID`, else `PI_SESSION_FILE` (the pi host sets it and no Claude session id); a
21
+ skill-injected `<skill name="…">` body counts as activity in `injectedPrompts`, never as a segment.
20
22
 
21
23
  ## Argument Flags
22
24
 
@@ -31,8 +31,17 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
31
31
 
32
32
  ## Implementation
33
33
 
34
+ - **Bootstrap reads (1128):** before the first dispatch, read [SKILL.md § Bootstrap reads](../skills/spur-dev/SKILL.md#bootstrap-reads) and load only that mode's files — everything else under `references/` is on demand.
35
+ - **Publish the generated plan first (1105):** your first tool call — before invoking the skill,
36
+ reading any reference, or showing the task — is `spur workflow show task-pipeline.yaml --no-logo
37
+ --format todo --json` (the CLI resolves the project→registered→shared layer); then publish every
38
+ `.plan` row's `text` verbatim as the host todo list (the `steps[]` inventory when `.plan` is
39
+ `null`) before readiness, Git, or isolation work —
40
+ [shared startup contract](../skills/spur-dev/references/cross-cutting.md#shared-startup-contract-task-0814-r1r3r4r6r7r8)
41
+ step 1 / [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md) run
42
+ setup step 5.
34
43
  - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
35
- - Apply the [shared startup contract](../skills/spur-dev/references/cross-cutting.md#shared-startup-contract-task-0814-r1r3r4r6r7r8) — bootstrap checklist, quick readiness before isolation, workflow inventory before YAML, comprehensive checks at their owning boundaries (task 0814 R1/R3/R4/R7/R8).
44
+ - Apply the [shared startup contract](../skills/spur-dev/references/cross-cutting.md#shared-startup-contract-task-0814-r1r3r4r6r7r8) — publish the generated plan first, quick readiness before isolation, digest binding, comprehensive checks at their owning boundaries (task 0814 R1/R3/R4/R7/R8; 1105 R1).
36
45
  - Full pipeline (default `--mode full`): interactive omit/`--agent inline` uses the
37
46
  [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md) via
38
47
  `Skill(skill="sp:spur-dev", args="run-inline $ARGUMENTS")`; `--agent auto` or a named executor
@@ -55,7 +64,8 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
55
64
  base ref on full success, retain intact on any failure/halt/non-FF; bare form creates a fresh tree,
56
65
  `<name>` form adopts an existing worktree by name/path/branch). The lifecycle — dirty-tree precheck,
57
66
  creation or adoption, crash-safe `.spur/run/` marker, merge-or-retain, `--continue` re-entry — is
58
- `execution-batch.md` § Worktree isolation applied to a batch of one: marker `command` is `dev-run`
67
+ `execution-worktree-setup.md` (creation/adoption, WT-1…WT-3b) + `execution-worktree-landing.md`
68
+ (WT-4/WT-5) applied to a batch of one: marker `command` is `dev-run`
59
69
  and `selector` is the `<wbs>`, the derived branch is `sp/run-<wbs>-<short-id>`, and the success
60
70
  condition is the task reaching terminal `done` with no failed stage. A failing gate, a non-PASS
61
71
  verify verdict, or a HITL pause that ends the run all take the retention path.