@gobing-ai/spur 0.3.91 → 0.3.93

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 (148) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/pipeline-budgets.json +2 -9
  3. package/config/plugin-scripts.json +27 -1
  4. package/config/templates/AGENTS.md +4 -0
  5. package/config/templates/docs/02_ROADMAP.md +2 -0
  6. package/config/templates/docs/03_ARCHITECTURE.md +3 -1
  7. package/config/templates/docs/04_DESIGN.md +2 -0
  8. package/config/templates/docs/99_PROJECT_CONSTITUTION.md +10 -2
  9. package/config/workflow-candidates.json +72 -1
  10. package/config/workflows/feature-lifecycle.yaml +14 -5
  11. package/config/workflows/feature-verification.yaml +36 -27
  12. package/config/workflows/history-anatomy.yaml +16 -25
  13. package/config/workflows/idea-pipeline.yaml +76 -23
  14. package/config/workflows/pr-review.yaml +8 -0
  15. package/config/workflows/task-pipeline.yaml +362 -40
  16. package/config/workflows/wayfinder-resolution.yaml +5 -0
  17. package/config/workflows/wrapup-pipeline.yaml +102 -19
  18. package/package.json +9 -9
  19. package/plugins/sp/README.md +7 -2
  20. package/plugins/sp/agents/super-planner.md +14 -5
  21. package/plugins/sp/commands/dev-dogfood.md +4 -4
  22. package/plugins/sp/commands/dev-fixall.md +8 -5
  23. package/plugins/sp/commands/dev-run.md +8 -2
  24. package/plugins/sp/commands/dev-runall.md +14 -8
  25. package/plugins/sp/commands/dev-verify.md +9 -0
  26. package/plugins/sp/commands/dev-verifyall.md +5 -0
  27. package/plugins/sp/lib/idea-handoff.generated.mjs +306 -301
  28. package/plugins/sp/lib/inline-run.generated.d.mts +18 -0
  29. package/plugins/sp/lib/inline-run.generated.mjs +1468 -0
  30. package/plugins/sp/plugin.json +1 -1
  31. package/plugins/sp/references/environment-lens.md +1 -1
  32. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +136 -0
  33. package/plugins/sp/scripts/dogfood-testing/validate-report.ts +196 -2
  34. package/plugins/sp/scripts/feature-verification-steps.mjs +174 -0
  35. package/plugins/sp/scripts/feature-verification-steps.ts +275 -0
  36. package/plugins/sp/scripts/history-anatomy-cache.mjs +104 -4
  37. package/plugins/sp/scripts/history-anatomy-cache.ts +137 -13
  38. package/plugins/sp/scripts/inline-pipeline-parity-check.ts +2 -1
  39. package/plugins/sp/scripts/inline-run-setup.mjs +421 -0
  40. package/plugins/sp/scripts/inline-run-setup.ts +325 -78
  41. package/plugins/sp/scripts/quality-gate.mjs +248 -6
  42. package/plugins/sp/scripts/quality-gate.ts +410 -9
  43. package/plugins/sp/scripts/record-feature-sync.mjs +63 -0
  44. package/plugins/sp/scripts/record-feature-sync.ts +84 -0
  45. package/plugins/sp/scripts/residual-scan.mjs +484 -0
  46. package/plugins/sp/scripts/residual-scan.ts +640 -0
  47. package/plugins/sp/scripts/task-diffstat.mjs +156 -0
  48. package/plugins/sp/scripts/task-diffstat.ts +229 -0
  49. package/plugins/sp/scripts/task-evidence-precheck.ts +8 -3
  50. package/plugins/sp/scripts/task-size-precheck.ts +8 -3
  51. package/plugins/sp/scripts/wrapup-drift-probe.mjs +181 -0
  52. package/plugins/sp/scripts/wrapup-drift-probe.ts +258 -0
  53. package/plugins/sp/scripts/wrapup-steps.mjs +60 -1
  54. package/plugins/sp/scripts/wrapup-steps.ts +89 -4
  55. package/plugins/sp/skills/brainstorm/SKILL.md +2 -0
  56. package/plugins/sp/skills/brainstorm/references/workflows.md +17 -2
  57. package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
  58. package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +2 -0
  59. package/plugins/sp/skills/code-implementation/SKILL.md +17 -0
  60. package/plugins/sp/skills/code-verification/SKILL.md +21 -0
  61. package/plugins/sp/skills/code-verification/references/secu-review.md +3 -2
  62. package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -0
  63. package/plugins/sp/skills/dogfood-testing/SKILL.md +5 -3
  64. package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +63 -26
  65. package/plugins/sp/skills/dogfood-testing/references/report-template.md +33 -10
  66. package/plugins/sp/skills/history-anatomy/references/modes.md +5 -3
  67. package/plugins/sp/skills/next-feature/references/ranking-rubric.md +1 -1
  68. package/plugins/sp/skills/next-router/references/routing-table.md +7 -0
  69. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
  70. package/plugins/sp/skills/session-review/SKILL.md +12 -2
  71. package/plugins/sp/skills/spur-check/SKILL.md +112 -0
  72. package/plugins/sp/skills/spur-cli/references/features.md +1 -1
  73. package/plugins/sp/skills/spur-cli/references/projects.md +3 -1
  74. package/plugins/sp/skills/spur-cli/references/workflows.md +39 -19
  75. package/plugins/sp/skills/spur-dev/SKILL.md +13 -5
  76. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +18 -3
  77. package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -2
  78. package/plugins/sp/skills/spur-dev/references/document-authoring.md +85 -0
  79. package/plugins/sp/skills/spur-dev/references/execution-batch.md +286 -58
  80. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
  81. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +27 -4
  82. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +3 -2
  83. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +61 -16
  84. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +10 -5
  85. package/plugins/sp/skills/spur-dev/templates/design.md +31 -0
  86. package/plugins/sp/skills/spur-dev/templates/plan.md +32 -0
  87. package/plugins/sp/skills/spur-doctor/SKILL.md +60 -14
  88. package/schemas/state-machine-workflow.schema.json +4 -0
  89. package/spur.js +22501 -19644
  90. package/web/_astro/BoardApp.CerSBgis.js +192 -0
  91. package/web/_astro/BoardApp.eoTz0pZs.js +1 -0
  92. package/web/_astro/{TaskDetail.CXGltuT_.js → TaskDetail.DCqiC-OZ.js} +1 -1
  93. package/web/_astro/arc.CPwg6Rw0.js +1 -0
  94. package/web/_astro/{architectureDiagram-3BPJPVTR.DJ8DHkWE.js → architectureDiagram-3BPJPVTR.DM_vp_hO.js} +1 -1
  95. package/web/_astro/{blockDiagram-GPEHLZMM.D8DHK3Jl.js → blockDiagram-GPEHLZMM.DXVIiv0p.js} +1 -1
  96. package/web/_astro/{c4Diagram-AAUBKEIU.BugQbX9u.js → c4Diagram-AAUBKEIU.BbF_zCxW.js} +1 -1
  97. package/web/_astro/channel.MYZLKNwy.js +1 -0
  98. package/web/_astro/{chunk-2J33WTMH.Mv26KlVn.js → chunk-2J33WTMH.CAgQHpPC.js} +1 -1
  99. package/web/_astro/{chunk-4BX2VUAB.CD51JoT_.js → chunk-4BX2VUAB.BN-5tpw4.js} +1 -1
  100. package/web/_astro/{chunk-55IACEB6.D_PFaIEe.js → chunk-55IACEB6.CnPkEEr0.js} +1 -1
  101. package/web/_astro/{chunk-727SXJPM.DemMW1ao.js → chunk-727SXJPM.BQzQeMVm.js} +4 -4
  102. package/web/_astro/{chunk-AQP2D5EJ.Iu2V5-ex.js → chunk-AQP2D5EJ.B6xNyDnL.js} +1 -1
  103. package/web/_astro/{chunk-FMBD7UC4.MsNgSP-E.js → chunk-FMBD7UC4.C7f9Ih78.js} +1 -1
  104. package/web/_astro/{chunk-ND2GUHAM.DfbRaAlm.js → chunk-ND2GUHAM.CNV1dFXT.js} +1 -1
  105. package/web/_astro/{chunk-QZHKN3VN.BbJAQ4h-.js → chunk-QZHKN3VN.Cudn2TkJ.js} +1 -1
  106. package/web/_astro/{classDiagram-4FO5ZUOK.CPurtiC2.js → classDiagram-4FO5ZUOK.D1NwP50q.js} +1 -1
  107. package/web/_astro/{classDiagram-v2-Q7XG4LA2.CPurtiC2.js → classDiagram-v2-Q7XG4LA2.D1NwP50q.js} +1 -1
  108. package/web/_astro/{cose-bilkent-S5V4N54A.CKKdx1bM.js → cose-bilkent-S5V4N54A.B1wSL-Xb.js} +1 -1
  109. package/web/_astro/{cynefin-OW5HDTMX.CoKMTg-R.js → cynefin-OW5HDTMX.BmK52w8G.js} +1 -1
  110. package/web/_astro/{dagre-BM42HDAG.D4h4_k56.js → dagre-BM42HDAG.Bfy5CTDT.js} +2 -2
  111. package/web/_astro/diagram-2AECGRRQ.DhNnvUvX.js +43 -0
  112. package/web/_astro/diagram-5GNKFQAL.lTX5KwnS.js +10 -0
  113. package/web/_astro/{diagram-KO2AKTUF.BFoCkiCr.js → diagram-KO2AKTUF.CW_vMJ4z.js} +3 -3
  114. package/web/_astro/{diagram-LMA3HP47.exHn9OVx.js → diagram-LMA3HP47.B_8ZGF67.js} +1 -1
  115. package/web/_astro/{diagram-OG6HWLK6.CeqO34nN.js → diagram-OG6HWLK6.BppnHsdS.js} +1 -1
  116. package/web/_astro/{erDiagram-TEJ5UH35.D_v7HqxR.js → erDiagram-TEJ5UH35.BEuHXcjJ.js} +5 -5
  117. package/web/_astro/{flowDiagram-I6XJVG4X.EUmrpbwh.js → flowDiagram-I6XJVG4X.CH-UlnGr.js} +4 -4
  118. package/web/_astro/{ganttDiagram-6RSMTGT7.BOCF5lII.js → ganttDiagram-6RSMTGT7.BO81S85v.js} +1 -1
  119. package/web/_astro/{gitGraphDiagram-PVQCEYII.Di7otYZD.js → gitGraphDiagram-PVQCEYII.XnPxPPZN.js} +1 -1
  120. package/web/_astro/index.Hjbr15fG.css +1 -0
  121. package/web/_astro/{infoDiagram-5YYISTIA.TcBkCAJk.js → infoDiagram-5YYISTIA.JyjYRu_T.js} +1 -1
  122. package/web/_astro/{ishikawaDiagram-YF4QCWOH.D-2y4M0c.js → ishikawaDiagram-YF4QCWOH.BBRBF-Fo.js} +5 -5
  123. package/web/_astro/{journeyDiagram-JHISSGLW.DPbJI_n2.js → journeyDiagram-JHISSGLW.C_iymSyp.js} +1 -1
  124. package/web/_astro/{kanban-definition-UN3LZRKU.EFxhQ9Fj.js → kanban-definition-UN3LZRKU.DdfW-Oqt.js} +7 -7
  125. package/web/_astro/{linear.DSAsQLzs.js → linear.C2_IkbZT.js} +1 -1
  126. package/web/_astro/mermaid.core.GAOYeSR0.js +303 -0
  127. package/web/_astro/{mindmap-definition-RKZ34NQL.CJY1N_7V.js → mindmap-definition-RKZ34NQL.DAZIxQSK.js} +2 -2
  128. package/web/_astro/{pieDiagram-4H26LBE5.567ZNoL2.js → pieDiagram-4H26LBE5.CN8sIhKM.js} +3 -3
  129. package/web/_astro/{quadrantDiagram-W4KKPZXB.mqfz9-MY.js → quadrantDiagram-W4KKPZXB.3dGcX5GP.js} +1 -1
  130. package/web/_astro/{requirementDiagram-4Y6WPE33.Bv1Gv9In.js → requirementDiagram-4Y6WPE33.BV2y4dd6.js} +3 -3
  131. package/web/_astro/{sankeyDiagram-5OEKKPKP.B6Gs4X4r.js → sankeyDiagram-5OEKKPKP.Cqo15Tvo.js} +4 -4
  132. package/web/_astro/{sequenceDiagram-3UESZ5HK.BhYj4v-m.js → sequenceDiagram-3UESZ5HK.CROCPMJB.js} +1 -1
  133. package/web/_astro/{stateDiagram-AJRCARHV.BPbBnkpw.js → stateDiagram-AJRCARHV.RfXZrkFE.js} +1 -1
  134. package/web/_astro/{stateDiagram-v2-BHNVJYJU.C4squMNK.js → stateDiagram-v2-BHNVJYJU.CPXmbBs9.js} +1 -1
  135. package/web/_astro/{timeline-definition-PNZ67QCA.C_SwIHgl.js → timeline-definition-PNZ67QCA.DdgKTiO8.js} +3 -3
  136. package/web/_astro/{vennDiagram-CIIHVFJN.Bz4NZGpQ.js → vennDiagram-CIIHVFJN.CPNVSHF1.js} +5 -5
  137. package/web/_astro/{wardleyDiagram-YWT4CUSO.CozMVZ3i.js → wardleyDiagram-YWT4CUSO.CQhA0Jyr.js} +3 -3
  138. package/web/_astro/{xychartDiagram-2RQKCTM6.BwMGBwjB.js → xychartDiagram-2RQKCTM6.n61BWyy4.js} +1 -1
  139. package/web/index.html +2 -2
  140. package/config/workflows/decision-routing-example.yaml +0 -134
  141. package/web/_astro/BoardApp.BEDWpzsr.js +0 -188
  142. package/web/_astro/BoardApp.DQG2xfEz.js +0 -1
  143. package/web/_astro/arc.C0rrflm_.js +0 -1
  144. package/web/_astro/channel.SRrg1P-w.js +0 -1
  145. package/web/_astro/diagram-2AECGRRQ.DJ0h9zgw.js +0 -43
  146. package/web/_astro/diagram-5GNKFQAL.DvPk1jYd.js +0 -10
  147. package/web/_astro/index.Bx6GY4RH.css +0 -1
  148. package/web/_astro/mermaid.core.kAZjgJHG.js +0 -301
@@ -209,6 +209,7 @@ transitions:
209
209
  command: 'test "$(cat .spur/run/$__runId-wayfinder-precheck.status 2>/dev/null)" = PASS'
210
210
  - from: precheck
211
211
  to: failed
212
+ terminalReason: failed-check
212
213
  description: "Precheck FAIL — stop before delegation."
213
214
  guard:
214
215
  kind: always
@@ -221,6 +222,7 @@ transitions:
221
222
  command: 'test -s .spur/run/$__runId-wayfinder-answer.md'
222
223
  - from: investigate
223
224
  to: failed
225
+ terminalReason: failed-agent
224
226
  description: "Empty answer capture — investigate produced nothing to verify; stop rather than certify hollow evidence."
225
227
  guard:
226
228
  kind: shell
@@ -254,6 +256,7 @@ transitions:
254
256
  command: 'test "$__hitlAnswer" = yes'
255
257
  - from: approve
256
258
  to: cancelled
259
+ terminalReason: cancelled
257
260
  description: "Operator cancelled the research resolution."
258
261
  guard:
259
262
  kind: shell
@@ -261,6 +264,7 @@ transitions:
261
264
  command: 'test "$__hitlAnswer" = cancel'
262
265
  - from: approve
263
266
  to: failed
267
+ terminalReason: cancelled
264
268
  description: "Operator rejected the research resolution."
265
269
  guard:
266
270
  kind: shell
@@ -275,6 +279,7 @@ transitions:
275
279
  command: 'test "$(cat .spur/run/$__runId-wayfinder-final.status 2>/dev/null)" = PASS && test "$(cat .spur/run/$__runId-wayfinder-status.txt 2>/dev/null)" = done'
276
280
  - from: record
277
281
  to: failed
282
+ terminalReason: failed-check
278
283
  description: "Recording failed, was denied, or the task never reached done — stop without claiming completion."
279
284
  guard:
280
285
  kind: always
@@ -15,6 +15,7 @@
15
15
  #
16
16
  # Shape: start -> task-resolve -> doc-sync -> learnings-append -> metrics-record
17
17
  # -> feature-transition (conditional: if vars.feature set)
18
+ # -> feature-verify (post-transition feature check gate, 0915 F1)
18
19
  # -> branch-cleanup (conditional: if vars.merge=true)
19
20
  # -> done
20
21
  # doc-sync routes a contract violation to `repair` (cheap, no
@@ -74,7 +75,7 @@
74
75
  "$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
75
76
  kind: state-machine
76
77
  name: wrapup-pipeline
77
- version: "4"
78
+ version: "5"
78
79
  description: "Post-execution wrap-up: doc-sync (doc drift + learning capture), metrics, feature-transition, branch-cleanup"
79
80
  iterationBound: 10
80
81
  initialState: start
@@ -127,7 +128,10 @@ states:
127
128
  missing or corrupted capture refuses progression. A validated empty list
128
129
  -> skipped; length > 0 && mode == fast -> fast-path (metrics-record,
129
130
  bypassing doc-sync); missing/unknown/conflict -> doc-sync (safety-path).
130
- Writes bounded machine-readable reason to reasonFile.
131
+ Writes bounded machine-readable reason to reasonFile. When the caller leaves
132
+ mode empty, a deterministic drift probe (0944) projects mode=fast only when
133
+ no changed path matches a doc-owned surface and every task's Solution
134
+ change map parsed — any doubt stays on the safety path.
131
135
  onEnter:
132
136
  - kind: note
133
137
  options:
@@ -147,21 +151,53 @@ states:
147
151
  echo "wrapup-steps failed closed — script not found — run 'superskill install sp'" >&2;
148
152
  printf 'FAIL\n' > ".spur/run/$__runId-wrapup-resolve.status";
149
153
  fi
150
- # (e) route-reason writer: one jq table lookup over the mode var over the
151
- # validated capture; workflow-local routing glue (0824). Runs AFTER validation
152
- # and reads ONLY .spur/run/<runId>-wrapup-tasks.json — never raw vars.tasks
153
- # (0783 R2/R5). A FAIL resolve exits without writing: the failed reason written
154
- # by validation stands, and the skip reason can never mask it. A missing or
155
- # corrupted capture fails the jq lookup (no skipped claim can be invented);
156
- # the failed defense edge owns the run.
154
+ # (0944 R1-R3) deterministic drift probe — runs ONLY when the caller left mode
155
+ # empty (a caller-set mode is projected verbatim and the probe never runs). It
156
+ # writes <runId>-drift-probe.json {clean,reasons,paths} and projects the wrapup
157
+ # mode by writing <runId>-mode.txt: caller mode verbatim, `fast` when the probe
158
+ # is clean, empty when dirty (the probe script fails safe on any lookup or parse
159
+ # problem; a missing script writes a dirty probe + empty mode here). The next
160
+ # action reads the mode file into vars.mode via file.read.into-var.
157
161
  - kind: shell
158
162
  options:
159
163
  command: >-
160
- mkdir -p .spur/run .spur/memory; RUN_ID="$__runId"; case "$RUN_ID" in '') echo "task-resolve: __runId is empty — refusing to write a route reason" >&2; exit 1 ;; esac;
161
- REASON_FILE=".spur/run/$RUN_ID-route-reason.txt"; case "$(cat ".spur/run/$RUN_ID-wrapup-resolve.status" 2>/dev/null)" in FAIL) exit 0 ;; esac;
162
- N=$(jq length ".spur/run/$RUN_ID-wrapup-tasks.json" 2>/dev/null);
163
- jq -rn --arg m "$mode" --arg n "$N" 'if $n == "0" then "skipped:empty task list" else {"fast":"fast:evidence complete+consistent","":"safety:missing evidence (mode empty)","unknown":"safety:unknown evidence quality","conflict":"safety:conflicting evidence"}[$m] // "safety:unrecognized evidence (mode=\($m))" end' > "$REASON_FILE";
164
- printf '%s %s\n' "$RUN_ID" "$(cat "$REASON_FILE")" >> .spur/memory/wrapup-routes.log
164
+ if [ -n "$mode" ]; then
165
+ printf '%s\n' "$mode" > ".spur/run/$__runId-mode.txt";
166
+ elif [ -f plugins/sp/scripts/wrapup-drift-probe.ts ]; then
167
+ bun plugins/sp/scripts/wrapup-drift-probe.ts;
168
+ elif W="$(superskill script path sp wrapup-drift-probe.mjs 2>/dev/null)" && [ -f "$W" ]; then
169
+ node "$W";
170
+ else
171
+ printf '{"clean":false,"reasons":["probe script not found"],"paths":[]}' > ".spur/run/$__runId-drift-probe.json";
172
+ printf '\n' > ".spur/run/$__runId-mode.txt";
173
+ fi
174
+ - kind: file.read.into-var
175
+ options:
176
+ path: .spur/run/${vars.__runId}-mode.txt
177
+ var: mode
178
+ # (e) route-reason writer: one table lookup over the projected mode var over
179
+ # the validated capture and the drift probe verdict; workflow-local routing
180
+ # glue (0824, moved behind the wrapup-steps locator in 0944 to stay inside the
181
+ # ADR-115 shell caps). Runs AFTER the probe/projection so the reason reflects
182
+ # the projected mode. Reads ONLY .spur/run/<runId>-wrapup-tasks.json and the
183
+ # probe verdict — never raw vars.tasks (0783 R2/R5). A FAIL resolve exits
184
+ # without writing: the failed reason written by validation stands, and the
185
+ # skip reason can never mask it. A clean probe yields `fast:drift-probe-clean`
186
+ # (0944); mode `safety` claims `safety:operator-forced doc-sync`; a missing or
187
+ # corrupted capture fails the lookup (no skipped or clean claim can be
188
+ # invented); the failed defense edge owns the run.
189
+ - kind: shell
190
+ options:
191
+ command: >-
192
+ mkdir -p .spur/run .spur/memory &&
193
+ if [ -f plugins/sp/scripts/wrapup-steps.ts ]; then
194
+ bun plugins/sp/scripts/wrapup-steps.ts route-reason;
195
+ elif W="$(superskill script path sp wrapup-steps.mjs 2>/dev/null)" && [ -f "$W" ]; then
196
+ node "$W" route-reason;
197
+ else
198
+ echo "wrapup-steps failed closed — script not found — run 'superskill install sp'" >&2;
199
+ printf 'FAIL\n' > ".spur/run/$__runId-wrapup-resolve.status";
200
+ fi
165
201
 
166
202
  - id: doc-sync
167
203
  description: >
@@ -295,6 +331,30 @@ states:
295
331
  printf 'FAIL\n' > ".spur/run/$__runId-wrapup-sync.status";
296
332
  fi
297
333
 
334
+ - id: feature-verify
335
+ description: >
336
+ Post-feature-transition verification hop (D63 task 0915, review finding
337
+ F1): wrapup's doc-sync and the feature transition mutate the corpus AFTER
338
+ the feature-scoped verification pass ran. The proof digest deliberately
339
+ excludes docs/tasks*/docs/features* (shared evidence, concurrent writers),
340
+ so the bound receipt stays valid — but the feature's completion boundary
341
+ must still observe the post-wrapup state. This hop re-runs the feature
342
+ check gate (`featureGateCmd`). When the configured command is the done-
343
+ boundary variant (`feature check --as done`), it validates the bound
344
+ evidence receipt (feature identity, verifier definition digest, terminal
345
+ recording run, artifact registration, checked-input digest) against the
346
+ current feature contract; a plain gate command observes the post-wrapup
347
+ corpus state but does not enforce the receipt (0915 re-review P3). A FAIL
348
+ fails the wrapup loudly instead of letting a stale PASS ride; only a
349
+ verified gate writes PASS (0783 R4).
350
+ onEnter:
351
+ - kind: shell
352
+ options:
353
+ command: >-
354
+ sh -c "$featureGateCmd" &&
355
+ printf 'PASS\n' > ".spur/run/$__runId-wrapup-feature-verify.status" ||
356
+ printf 'FAIL\n' > ".spur/run/$__runId-wrapup-feature-verify.status"
357
+
298
358
  - id: branch-cleanup
299
359
  description: >
300
360
  Irreversible-operation HITL gate, consent-only (0770). If vars.merge=true,
@@ -342,6 +402,7 @@ transitions:
342
402
  # ── task-resolve: validation fail + proportional route table (0758 R1-R4, 0770) ──
343
403
  - from: task-resolve
344
404
  to: failed
405
+ terminalReason: failed-check
345
406
  description: >
346
407
  Validation FAIL (0770): malformed wrap input, a non-string/empty entry, an
347
408
  unresolved or non-completed task, or an empty __runId. Declared before the
@@ -377,6 +438,7 @@ transitions:
377
438
  command: 'test "$(jq length .spur/run/$__runId-wrapup-tasks.json 2>/dev/null || echo -1)" -gt 0 && test "$mode" != fast'
378
439
  - from: task-resolve
379
440
  to: failed
441
+ terminalReason: failed-check
380
442
  description: >
381
443
  Defense (0770) — no PASS/FAIL resolve status (shell crashed or never ran):
382
444
  route to `failed` rather than claiming a skip.
@@ -404,6 +466,7 @@ transitions:
404
466
  kind: action-ok
405
467
  - from: doc-sync
406
468
  to: failed
469
+ terminalReason: failed-check
407
470
  description: >
408
471
  Executor failure (non-zero exit, signal, or dispatch error) — keep the
409
472
  existing fail semantics; a contract violation never falls through here
@@ -433,6 +496,7 @@ transitions:
433
496
  # the metrics status PASS so a missing status can never claim success.
434
497
  - from: metrics-record
435
498
  to: failed
499
+ terminalReason: failed-check
436
500
  description: >
437
501
  Metrics capture failed for at least one task — a missing metrics row is
438
502
  recorded as failure, never silently omitted as success (0770).
@@ -465,6 +529,7 @@ transitions:
465
529
  # ── feature-transition: fail edge, then branch-cleanup (if merge) or done ──
466
530
  - from: feature-transition
467
531
  to: failed
532
+ terminalReason: failed-check
468
533
  description: >
469
534
  Required synchronization failed (0770): non-zero sync exit, an invalid
470
535
  sync result, or a failed feature gate. The failed status carries the
@@ -474,19 +539,37 @@ transitions:
474
539
  options:
475
540
  command: 'test "$(cat .spur/run/$__runId-wrapup-sync.status 2>/dev/null)" = FAIL'
476
541
  - from: feature-transition
542
+ to: feature-verify
543
+ description: Sync PASS — re-run the feature check gate against the post-wrapup state.
544
+ guard:
545
+ kind: shell
546
+ options:
547
+ command: 'test "$(cat .spur/run/$__runId-wrapup-sync.status 2>/dev/null)" = PASS'
548
+ - from: feature-verify
549
+ to: failed
550
+ terminalReason: failed-check
551
+ description: >
552
+ Post-wrapup feature check failed (0915 F1): the bound receipt no longer
553
+ validates against the current feature contract. Already-written
554
+ learnings/metrics stay on disk.
555
+ guard:
556
+ kind: shell
557
+ options:
558
+ command: 'test "$(cat .spur/run/$__runId-wrapup-feature-verify.status 2>/dev/null)" = FAIL'
559
+ - from: feature-verify
477
560
  to: branch-cleanup
478
- description: Sync PASS — merge is requested.
561
+ description: Post-wrapup feature check PASS — merge is requested.
479
562
  guard:
480
563
  kind: shell
481
564
  options:
482
- command: 'test "$(cat .spur/run/$__runId-wrapup-sync.status 2>/dev/null)" = PASS && test "$merge" = true'
483
- - from: feature-transition
565
+ command: 'test "$(cat .spur/run/$__runId-wrapup-feature-verify.status 2>/dev/null)" = PASS && test "$merge" = true'
566
+ - from: feature-verify
484
567
  to: done
485
- description: Sync PASS — no merge requested.
568
+ description: Post-wrapup feature check PASS — no merge requested.
486
569
  guard:
487
570
  kind: shell
488
571
  options:
489
- command: 'test "$(cat .spur/run/$__runId-wrapup-sync.status 2>/dev/null)" = PASS && test "$merge" != true'
572
+ command: 'test "$(cat .spur/run/$__runId-wrapup-feature-verify.status 2>/dev/null)" = PASS && test "$merge" != true'
490
573
 
491
574
  # ── branch-cleanup: HITL exhaustive routing (yes / no / cancel → done) ──
492
575
  # No irreversible git op is wired yet; confirmation is recorded, then wrap
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.91",
3
+ "version": "0.3.93",
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",
@@ -53,14 +53,14 @@
53
53
  },
54
54
  "devDependencies": {
55
55
  "@commander-js/extra-typings": "^14.0.0",
56
- "@gobing-ai/ts-db": "^0.5.2",
57
- "@gobing-ai/ts-ai-runner": "^0.5.2",
58
- "@gobing-ai/ts-dual-workflow-engine": "^0.5.2",
59
- "@gobing-ai/ts-infra": "^0.5.2",
60
- "@gobing-ai/ts-llm-jsonl-importer": "^0.5.2",
61
- "@gobing-ai/ts-rule-engine": "^0.5.2",
62
- "@gobing-ai/ts-runtime": "^0.5.2",
63
- "@gobing-ai/ts-utils": "^0.5.2",
56
+ "@gobing-ai/ts-db": "^0.5.7",
57
+ "@gobing-ai/ts-ai-runner": "^0.5.7",
58
+ "@gobing-ai/ts-dual-workflow-engine": "^0.5.7",
59
+ "@gobing-ai/ts-infra": "^0.5.7",
60
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.5.7",
61
+ "@gobing-ai/ts-rule-engine": "^0.5.7",
62
+ "@gobing-ai/ts-runtime": "^0.5.7",
63
+ "@gobing-ai/ts-utils": "^0.5.7",
64
64
  "@types/bun": "1.3.14",
65
65
  "@types/figlet": "^1.7.0",
66
66
  "@types/node-notifier": "8.0.5",
@@ -186,7 +186,7 @@ pipeline step.
186
186
 
187
187
  ```
188
188
  plugins/sp/
189
- ├── skills/ # Domain knowledge + workflow docs (38 skills)
189
+ ├── skills/ # Domain knowledge + workflow docs (39 skills)
190
190
  │ ├── brainstorm/ # Structured ideation workflow
191
191
  │ │ ├── agents/openai.yaml
192
192
  │ │ ├── examples/ideation-example.md
@@ -342,6 +342,7 @@ surface or run one workflow. All skills target the same five core platforms: `cl
342
342
  | `session-review` | 1.1 | Inline review of the active coding-agent session — compact outcomes, evidence-backed resolved/open issue classification, proposal-only improvements, and next actions; no workflow, import, delegation, or mutation |
343
343
  | `spur-composer` | 1.0 | Cross-noun composition — workflow catalog selection, the ephemeral→project→shared ladder, ADR-115 budgets, trace-driven rule tuning; applies accepted `spur-doctor` proposals through `spur` verbs; never judges its own output and never runs a recurring loop |
344
344
  | `spur-doctor` | 1.0 | Cross-noun evaluation — read-only CLI evidence per noun (task/feature/rule/workflow/agent spec), reflection over `history-anatomy` findings through a closed action-class map, and a proposal table; writes nothing; diagnoses artifacts, not runtime environments (`spur agent doctor`'s job) |
345
+ | `spur-check` | 1.0 | Two-tier check primitive (ADR-124) — light changed-scope checks during development, the full `bun run spur-check` chain at the quality boundary, and the fingerprint-bound `<wbs>-check-receipt.json` with the `status` reuse rule; composes with `/sp:dev-fixall --gate-log` |
345
346
  | `redesign-web-ui` | 1.0 | Existing-UI visual upgrade — audit generic AI fingerprints, apply in-stack polish against `DESIGN.md` / live tokens, verify behavior and viewports; does not migrate frameworks |
346
347
  | `taste-refactoring-api` | 1.0 | API design and refactoring for REST/HTTP, RPC/gRPC, GraphQL, event contracts, and CLI surfaces; compatibility, security, and migration review |
347
348
  | `taste-refactoring-ui` | 1.0 | UI design and refactoring with visual hierarchy, typography, spacing, color, and interaction review |
@@ -512,6 +513,7 @@ hold `SKILL.md` and prompt-side companions only.
512
513
  | `scripts/feature-sync-bounded.ts` | Bounded retry-suppression wrapper for `spur feature sync` during batch/wrap-up runs — suppresses identical L4-blocked repeats |
513
514
  | `scripts/stage-registry-adapter.ts` | dev-next golden-path adapter over the canonical stage registry — TABLE A/B/C resolution bridge for the status-aware facade |
514
515
  | `scripts/task-size-precheck.ts` | Pipeline size precheck guard (R2) — evaluates R-item/Plan-count limits to PASS/FAIL |
516
+ | `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) |
515
517
  | `scripts/validate-flag-contracts.ts` | Mechanical consistency gate — compares flag claims across command files, flag-glossary, cross-cutting, dev-operations, and ADR; reports disagreements |
516
518
  | `*.test.ts` | Unit suites — in `hooks/` for guards, in `tests/<skill>/` per ADR-031 pairing |
517
519
 
@@ -629,7 +631,10 @@ pipeline owns one lifecycle phase:
629
631
  | `idea-pipeline.yaml` | Idea/planning → feature + tasks | `/sp:dev-idea`, `/sp:dev-plan` |
630
632
  | `wrapup-pipeline.yaml` | Post-execution wrap-up | `/sp:dev-wrap`, `/sp:dev-wrapall` |
631
633
  | `wayfinder-resolution.yaml` | Wayfinder ticket resolution loop | `spur workflow run` (free-form) |
632
- | `decision-routing-example.yaml` | DecisionMaker routing example (never / evidence / omitted modes, defer → operator pause) | `spur workflow run` (authoring sample) |
634
+
635
+ > 0946 (D64): the `decision-routing-example.yaml` authoring sample was retired from the catalogue
636
+ > (zero runs, example-only — `docs/design/workflow-catalogue-refactor.md` §10); the pattern lives on
637
+ > as a test fixture (`packages/app/tests/services/fixtures/decision-routing-example.yaml`).
633
638
 
634
639
  ### Lifecycle operations
635
640
 
@@ -86,7 +86,10 @@ You own the spaces **between** task runs:
86
86
  - **Parallelize only when requested** by applying `sp:parallel-execution` to a proven-independent
87
87
  subset (Step 3 optional path). Serialize when dependency, file-overlap, or budget checks fail.
88
88
  Preflight still runs per WBS before fan-out; recovery stays sequential.
89
- - **Inspect** each terminal state + `.spur/run/<wbs>-verdict.json` (Step 3.3).
89
+ - **Inspect** each terminal state via `spur workflow trace "$RUN" --follow --timeout 600000` (a
90
+ timeout prints one checkpoint and exits 1; the run continues, never cancelled or relaunched) plus
91
+ `.spur/run/<wbs>-verdict.json`, accepted only when the trace's `.run.runId` equals the dispatched
92
+ run and the verdict's mtime ≥ the trace's `.run.startedAt` — otherwise `stale-evidence` (Step 3.3).
90
93
  - **One-shot recovery (optional)** - on non-PASS / stuck status, consult next-router **once** for that
91
94
  WBS (`recoveryHint` / dry-run plan): print the child command, or dispatch once only when the batch
92
95
  was started with `--auto` and cardinality is 1. Never self-loop until done.
@@ -264,7 +267,10 @@ Report using the batch-report template from execution-batch.md §5:
264
267
  **Next:** <one-line action>
265
268
  ```
266
269
 
267
- Per-task outcome vocabulary: `done` | `failed` | `blocked` | `skipped` | `not-attempted`.
270
+ Per-task outcome vocabulary: `done` | `failed` | `blocked` | `skipped` | `paused` (0933: parked on
271
+ an operator question — escalate hop — or an approval gate; non-terminal, never `done`) |
272
+ `not-attempted`, plus the parallel-only `integration-conflict`
273
+ ([execution-batch.md § Parallel isolation](../skills/spur-dev/references/execution-batch.md#parallel-isolation---mode-parallel)).
268
274
  Batch verdict: `clean` (all attempted tasks `done`) | `halted` (a failure stopped the batch) |
269
275
  `aborted` (cycle or selector error before any run).
270
276
 
@@ -272,9 +278,12 @@ With `--json`, emit the same shape as a JSON object for machine consumption.
272
278
 
273
279
  ## Out of scope (deferred)
274
280
 
275
- - **Parallel execution** - needs git-worktree isolation; v1 is sequential.
276
- - **Interactive within-step escalation** - waits for the workspace module + inbox module +
277
- `spur agent` team mode. You surface blockers only at the batch boundary.
281
+ - **Parallel execution** - `--mode parallel` isolates each task in its own worktree with
282
+ rebase-and-FF integration; see [execution-batch.md § Parallel isolation](../skills/spur-dev/references/execution-batch.md#parallel-isolation---mode-parallel).
283
+ - **Interactive within-step escalation** — implemented (0933): the pipeline's `escalate` hop
284
+ pauses on the implement agent's operator question; the operator answers via
285
+ `spur workflow continue --answer-text` and the run resumes implement with the Q/A transcript
286
+ (bounded by `maxEscalations`). See [execution-batch.md Step 3](../skills/spur-dev/references/execution-batch.md#step-3--the-driver-loop-r3-r4).
278
287
 
279
288
  ## Platform Notes
280
289
 
@@ -14,11 +14,11 @@ Wraps the **sp:dogfood-testing** skill.
14
14
  | Flag | Description | Default |
15
15
  | --- | --- | --- |
16
16
  | `<testee>` | Skill / command / CLI to exercise end-to-end. | required |
17
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing dogfood work. | omit |
18
- | `--max-retry` `<n>` | Max auto-fix retries per stage. | 3 |
17
+ | `--agent` `<inline\|auto\|name>` | **Testee-scoped** agent the testee runs under — forwarded into the testee invocation; the dogfood driver always runs in the current session. | omit (forward nothing) |
18
+ | `--max-retry` `<n>` | Max auto-fix retries per step. `0` = observe-only. Mandatory (as `0` or `N`) for pipeline-driving testees and testees with a mutating `--fix` mode. | 2 |
19
19
  | `--save` | Compatibility no-op; saving is now default. Retained until evidenced retirement. | off |
20
- | `--task` | Record outcomes against a task. | omitted |
21
- | `--chain-follow` | Follow the testee's chained follow-ups. | off |
20
+ | `--task` | **Creates** a new review-template task for the findings (`spur task create --template review`) — it does not attach to or update the task under test. | off |
21
+ | `--chain-follow` | **Reads existing chained-leg evidence** (verdict artifacts, task-file diffs, review tables) after a chained leg completes, for attribution — it never executes the chained leg itself. Without it the driver stops at the testing boundary. | off |
22
22
  | `--full` | Full report verbosity (all sections). | off |
23
23
 
24
24
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
@@ -27,9 +27,12 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
27
27
 
28
28
  ## Implementation
29
29
 
30
- Under the pipeline, the `test-recheck` state runs the full gate immediately after this hop — that is
31
- the deciding run. When `--gate-log` is set (the pipeline signal), fixall runs **no full gate at
32
- all**: targeted probes (`bun test <file> --test-name-pattern <test>`) during fix loops, then one
33
- `bun run lint` before returning. Invoked standalone, it keeps the single confirming run (R4, task
34
- 0483). `qualityGateCmd` itself is unchanged so `test-recheck` still runs the full gate.
30
+ Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#10-fixall) (fixall). Pipeline signal: when `--gate-log` is set (the `test-fix` hop), run no full gate — the `test-recheck` state immediately after is the deciding run (R4, task 0483).
31
+
32
+ When dispatched from the pipeline's test-fix stage (F96, task 0950), the gate log carries a
33
+ `residual artifact` block (`<wbs>-residuals.json`) and the findings file already
34
+ contains the merged residual anchors: treat those items as fix targets, in order,
35
+ alongside gate anchors. The fixer may write `.spur/run/<wbs>-residual-deferrals.json`
36
+ — one `{id, reason}` entry per item — but only for P3 findings or diff markers it
37
+ cannot fix inside the task; the done stage settles deferrals into follow-up tasks.
35
38
 
@@ -15,7 +15,7 @@ Wraps the **sp:spur-dev** and **sp:code-implementation** skills.
15
15
  | --- | --- | --- |
16
16
  | `<wbs>` | Task WBS to run. | required |
17
17
  | `--mode` `<full\|implement>` | Full pipeline or single implement step. | full |
18
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing stages. omit and explicit `--agent inline` resolve identically (task 0687): eligible stages dispatch once to a native subagent with host-session fallback (0508 eligibility); otherwise every stage executes in the invoking session. `auto` or a name keeps subprocess dispatch.. | omit |
18
+ | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing stages. omit and explicit `--agent inline` resolve identically (task 0687): eligible stages dispatch once to a native subagent with host-session fallback (0508 eligibility); otherwise every stage executes in the invoking session. `auto` or a name keeps subprocess dispatch.. The opt-in `fleet` selector (0942) maps the run to `executor: 'fleet'` so `agent.run` stages dispatch through the fleet control plane (ADR-126) instead of a subprocess. | omit |
19
19
  | `--auto` | Skip objective HITL confirmations. | off |
20
20
  | `--next` | Chain-to-completion via the next-router. | off |
21
21
  | `--wrap` | Run the wrap hop after the main step. The `--agent` selector is preserved into the `/sp:dev-wrap <wbs>` handoff when supplied; omission remains omission. The wrap hop is workflow-backed and reports its trigger-3 subprocess override. | off |
@@ -40,7 +40,13 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
40
40
 
41
41
  **Flags:**
42
42
 
43
- - `--auto` | `--agent <inline|auto|name>` — Skip objective HITL confirmations (taste/irreversible gates still pause). `--agent` names who does the model-bearing work. Interactive omit/`inline` keeps the controller and implement-only stages in this session; full mode reads `task-pipeline.yaml` as the SSOT and interprets its actions/guards through the inline driver, whose eligible `agent.run` stages dispatch once to a native subagent and otherwise run in the host (0508 eligibility — task 0687 resolved-inline) It records `stage <id> executed inline in session <session-id>` or `stage <id> executed via subagent <agent-id> (host session <session-id>)` in the run log. `auto` or a name is merged into `vars.agent` and `vars.implementAgent` and keeps the existing subprocess workflow. Headless `spur workflow run` / `spur agent run` is unchanged. See the [execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
43
+ - `--auto` | `--agent <inline|auto|name>` — Skip objective HITL confirmations (taste/irreversible gates still pause). `--agent` names who does the model-bearing work. Interactive omit/`inline` keeps the controller and implement-only stages in this session; full mode reads `task-pipeline.yaml` as the SSOT and interprets its actions/guards through the inline driver, whose eligible `agent.run` stages dispatch once to a native subagent and otherwise run in the host (0508 eligibility — task 0687 resolved-inline) It records `stage <id> executed inline in session <session-id>` or `stage <id> executed via subagent <agent-id> (host session <session-id>)` in the run log. `auto` or a name is merged into `vars.agent` and `vars.implementAgent` and keeps the existing subprocess workflow; `--agent fleet` maps the run to `vars.executor: 'fleet'` instead (fleet dispatch, 0942). Headless `spur workflow run` / `spur agent run` is unchanged. See the [execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
44
+ - `--escalation-file <path>` (implement step only, 0933) — names the Q/A escalation transcript
45
+ (default `.spur/run/<wbs>-escalation.md`). Absent on a first attempt means "no prior
46
+ escalations". When the implement agent needs an operator decision it appends its question to
47
+ `.spur/run/<wbs>-question.md` and exits 0 — the pipeline's `escalate` hop surfaces the question,
48
+ the operator answers via `spur workflow continue --answer-text`, and the guard appends the Q/A
49
+ pair to this transcript before re-entering implement, where the agent reads it and resumes.
44
50
 
45
51
  `--worktree` `[<name>]` (run the task's pipeline in an isolated git worktree — FF-merge onto the
46
52
  base ref on full success, retain intact on any failure/halt/non-FF; bare form creates a fresh tree,
@@ -18,12 +18,13 @@ Wraps the **sp:spur-dev** skill.
18
18
  | `--mode` `<sequential\|parallel>` | Batch execution order. | sequential |
19
19
  | `--keep-going` | Continue past per-task failures. | off |
20
20
  | `--auto` | Skip objective HITL gates. | off |
21
- | `--agent` `<inline\|auto\|name>` | Who runs each task's pipeline stages. Interactive sequential omit/`inline` uses the host-session driver with unified inline semantics (task 0687 — see below)). `auto`, a name, parallel mode, and headless invocation use subprocesses. | omit |
21
+ | `--agent` `<inline\|auto\|name>` | Who runs each task's pipeline stages. Interactive sequential omit/`inline` uses the host-session driver with unified inline semantics (task 0687 — see below)). `auto`, a name, parallel mode, and headless invocation use subprocesses. The opt-in `fleet` selector (0942) maps each task run to `executor: 'fleet'` so `agent.run` stages dispatch through the fleet control plane (ADR-126) instead of a subprocess. | omit |
22
22
  | `--json` | Emit structured JSON. | off |
23
- | `--wrap` | Run the wrap hop per task. The `--agent` selector is preserved into each `/sp:dev-wrap <wbs>` handoff when supplied; omission remains omission. | off |
23
+ | `--wrap` | Run the wrap hop **once for the batch** over the `done` subset only (Step 6 of execution-batch.md): `vars.feature` is passed only when every frozen task is `done`/`cancelled`; an empty done subset skips the wrap with a reason. The `--agent` selector is preserved into the `/sp:dev-wrap` handoff when supplied; omission remains omission. | off |
24
24
  | `--next` | Chain-to-completion via the next-router. | off |
25
25
  | `--continue` | Resume an interrupted batch. | off |
26
26
  | `--worktree` `[<name>]` | Run the batch in an isolated git worktree; FF-merge on success, retain on failure. Bare `--worktree` creates a fresh tree; `--worktree <name>` adopts an existing worktree by name/path/branch. | off |
27
+ | `--concurrency` `<n>` | Parallel-mode worker bound: at most `<n>` task pipelines run at once (task 0931); a dependent starts only after its in-set dependencies are integrated onto the base ref. No-op in sequential mode (ignored). | 2 |
27
28
 
28
29
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
29
30
 
@@ -41,12 +42,14 @@ structured findings, before any task pipeline action, task 0510 R2; scoped: `L4.
41
42
  (the expected pre-run state of any not-yet-run feature) is reported verbatim but does not abort —
42
43
  any other strict error aborts), `--mode`
43
44
  `<sequential|parallel>` (default `sequential`; `parallel` fans out a proven-independent subset —
44
- see `execution-batch.md` § Parallel Execution), `--keep-going`
45
+ see `execution-batch.md` § Parallel isolation), `--concurrency <n>`
46
+ (parallel-mode worker bound — at most <n> task pipelines at once, default 2; a dependent task starts
47
+ only after its in-set dependencies are **integrated** onto the base ref), `--keep-going`
45
48
  (batch failure policy — skip a failed task's in-batch dependents, continue independents; default
46
49
  halts on first failure), `--auto`
47
50
  (sets `profile=auto` on each per-task run, skipping the HITL approve gate), `--agent <inline|auto|name>`
48
51
  (names who runs the pipeline's stages — interactive sequential omit/`inline` uses the host driver;
49
- `auto` or a name is merged into each per-task `vars.agent` and `vars.implementAgent`; parallel mode
52
+ `auto` or a name is merged into each per-task `vars.agent` and `vars.implementAgent`; `fleet` maps each task run to `executor: 'fleet'` instead (fleet dispatch, 0942); parallel mode
50
53
  retains isolated subprocesses, ADR-047), `--json` (emit the
51
54
  report as JSON), `--wrap` (trigger
52
55
  `wrapup-pipeline.yaml` after the batch completes), `--next`
@@ -56,9 +59,10 @@ FF-merge onto the base ref on full success, retain intact on any failure/halt/no
56
59
  creates a fresh tree, `<name>` form adopts an existing worktree by name/path/branch; see
57
60
  `execution-batch.md` § Worktree isolation).
58
61
 
59
- **`--worktree` is sequential-only.** `--worktree --mode parallel` is **rejected**. This flag gives
60
- the batch *one* worktree for the whole run; per-task worktrees and parallel isolation remain task
61
- 0142 Slice A. Run parallel batches without `--worktree`, or run them sequentially with it.
62
+ **`--worktree` and parallel mode.** `--worktree --mode parallel` is **rejected** — parallel mode
63
+ already isolates each task in its own worktree (see `execution-batch.md` § Parallel isolation), and
64
+ reuse mode (`--worktree <name>`) has no per-task meaning. Run parallel batches without
65
+ `--worktree`, or run them sequentially with it.
62
66
 
63
67
  **`--worktree` corpus visibility.** While the batch runs in a worktree, corpus writes (task
64
68
  statuses, kanban) land in the worktree copy; your main tree still shows pre-run statuses until the
@@ -75,7 +79,9 @@ advancing the feature lifecycle). **was: `--next` deliberately omitted; the old
75
79
  **Three orthogonal axes** (do not confuse): `--keep-going`
76
80
  = batch failure policy (does a failure halt the batch or skip dependents?);
77
81
  `--continue` = resume from
78
- checkpoint (pick up an interrupted batch); `--next`
82
+ checkpoint against the batch's original frozen identity — persisted plan membership, worktree
83
+ marker, identity-filtered checkpoints as hints (execution-batch.md § Batch continuation, task
84
+ 0919); `--next`
79
85
  = chain each task to terminal status + batch-once wrap. See `dev-operations.md` § runall for the
80
86
  full distinction.
81
87
 
@@ -40,6 +40,15 @@ See `sp:code-verification` § Shippable readiness gate.
40
40
 
41
41
  - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
42
42
  - `Skill(skill="sp:code-verification", args="verify $ARGUMENTS")`
43
+ - **Residual sweep (F96 R1):** after the verify answer is written and `task verdict` derives
44
+ `.spur/run/<wbs>-verdict.json`, run `residual-scan scan` + `fold` (observe-only; folds the
45
+ verdict's `residual-sweep` check, PASS → PARTIAL when a blocking residual exists) — under every
46
+ `--fix` mode — before `spur task record`. Resolve the script via `superskill script path sp
47
+ residual-scan.mjs`; never reference `plugins/sp/scripts/` in shipped surfaces
48
+ (script-contract-check rule 4). When the task reaches `done` through `--next`, run
49
+ `residual-scan settle` (best-effort). On a folded PARTIAL: the bounded remediation loop has
50
+ already run — a residual-failed task is routed to router C6 (HITL STOP), never another
51
+ automatic fix loop.
43
52
 
44
53
  **Flags:**
45
54
 
@@ -72,3 +72,8 @@ Without `--fix all`, shippable is not evaluated (optional note: use `--fix all`
72
72
  - Batch orchestration: `Skill(skill="sp:spur-dev", args="verifyall $ARGUMENTS")`
73
73
  - Per-task verification (inner): `Skill(skill="sp:code-verification", args="verify <wbs> $SHARED_FLAGS")`
74
74
  - Shippable gate: once after the batch (same skill § Shippable readiness gate)
75
+ - **Residual sweep (F96 R1, per task):** same contract as `/sp:dev-verify` — after each task's
76
+ verdict artifact is derived, run `residual-scan scan` + `fold` (under every `--fix` mode) before
77
+ `spur task record`; on reaching `done` via `--next`, run `settle`. Script resolution:
78
+ `superskill script path sp residual-scan.mjs` (never `plugins/sp/scripts/` —
79
+ script-contract-check rule 4).