@gobing-ai/spur 0.3.91 → 0.3.92

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 (120) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/pipeline-budgets.json +2 -2
  3. package/config/plugin-scripts.json +17 -1
  4. package/config/workflows/feature-lifecycle.yaml +14 -5
  5. package/config/workflows/feature-verification.yaml +35 -27
  6. package/config/workflows/history-anatomy.yaml +14 -25
  7. package/config/workflows/idea-pipeline.yaml +9 -5
  8. package/config/workflows/task-pipeline.yaml +185 -4
  9. package/config/workflows/wrapup-pipeline.yaml +47 -5
  10. package/package.json +9 -9
  11. package/plugins/sp/agents/super-planner.md +14 -5
  12. package/plugins/sp/commands/dev-dogfood.md +4 -4
  13. package/plugins/sp/commands/dev-fixall.md +8 -5
  14. package/plugins/sp/commands/dev-run.md +6 -0
  15. package/plugins/sp/commands/dev-runall.md +12 -6
  16. package/plugins/sp/commands/dev-verify.md +9 -0
  17. package/plugins/sp/commands/dev-verifyall.md +5 -0
  18. package/plugins/sp/lib/idea-handoff.generated.mjs +301 -300
  19. package/plugins/sp/lib/inline-run.generated.d.mts +17 -0
  20. package/plugins/sp/lib/inline-run.generated.mjs +1460 -0
  21. package/plugins/sp/plugin.json +1 -1
  22. package/plugins/sp/references/environment-lens.md +1 -1
  23. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +136 -0
  24. package/plugins/sp/scripts/dogfood-testing/validate-report.ts +196 -2
  25. package/plugins/sp/scripts/feature-verification-steps.mjs +174 -0
  26. package/plugins/sp/scripts/feature-verification-steps.ts +275 -0
  27. package/plugins/sp/scripts/history-anatomy-cache.mjs +104 -4
  28. package/plugins/sp/scripts/history-anatomy-cache.ts +137 -13
  29. package/plugins/sp/scripts/inline-pipeline-parity-check.ts +1 -0
  30. package/plugins/sp/scripts/inline-run-setup.mjs +349 -0
  31. package/plugins/sp/scripts/inline-run-setup.ts +192 -75
  32. package/plugins/sp/scripts/record-feature-sync.mjs +63 -0
  33. package/plugins/sp/scripts/record-feature-sync.ts +84 -0
  34. package/plugins/sp/scripts/residual-scan.mjs +476 -0
  35. package/plugins/sp/scripts/residual-scan.ts +614 -0
  36. package/plugins/sp/scripts/task-evidence-precheck.ts +8 -3
  37. package/plugins/sp/scripts/task-size-precheck.ts +8 -3
  38. package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
  39. package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +2 -0
  40. package/plugins/sp/skills/code-implementation/SKILL.md +17 -0
  41. package/plugins/sp/skills/code-verification/SKILL.md +21 -0
  42. package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -0
  43. package/plugins/sp/skills/dogfood-testing/SKILL.md +5 -3
  44. package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +63 -26
  45. package/plugins/sp/skills/dogfood-testing/references/report-template.md +33 -10
  46. package/plugins/sp/skills/history-anatomy/references/modes.md +5 -3
  47. package/plugins/sp/skills/next-feature/references/ranking-rubric.md +1 -1
  48. package/plugins/sp/skills/next-router/references/routing-table.md +7 -0
  49. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
  50. package/plugins/sp/skills/session-review/SKILL.md +12 -2
  51. package/plugins/sp/skills/spur-cli/references/features.md +1 -1
  52. package/plugins/sp/skills/spur-cli/references/projects.md +3 -1
  53. package/plugins/sp/skills/spur-cli/references/workflows.md +39 -19
  54. package/plugins/sp/skills/spur-dev/SKILL.md +11 -4
  55. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +4 -1
  56. package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -2
  57. package/plugins/sp/skills/spur-dev/references/execution-batch.md +285 -57
  58. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
  59. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +19 -4
  60. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +43 -16
  61. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +5 -0
  62. package/spur.js +21827 -19615
  63. package/web/_astro/BoardApp.CerSBgis.js +192 -0
  64. package/web/_astro/BoardApp.eoTz0pZs.js +1 -0
  65. package/web/_astro/{TaskDetail.CXGltuT_.js → TaskDetail.DCqiC-OZ.js} +1 -1
  66. package/web/_astro/arc.CPwg6Rw0.js +1 -0
  67. package/web/_astro/{architectureDiagram-3BPJPVTR.DJ8DHkWE.js → architectureDiagram-3BPJPVTR.DM_vp_hO.js} +1 -1
  68. package/web/_astro/{blockDiagram-GPEHLZMM.D8DHK3Jl.js → blockDiagram-GPEHLZMM.DXVIiv0p.js} +1 -1
  69. package/web/_astro/{c4Diagram-AAUBKEIU.BugQbX9u.js → c4Diagram-AAUBKEIU.BbF_zCxW.js} +1 -1
  70. package/web/_astro/channel.MYZLKNwy.js +1 -0
  71. package/web/_astro/{chunk-2J33WTMH.Mv26KlVn.js → chunk-2J33WTMH.CAgQHpPC.js} +1 -1
  72. package/web/_astro/{chunk-4BX2VUAB.CD51JoT_.js → chunk-4BX2VUAB.BN-5tpw4.js} +1 -1
  73. package/web/_astro/{chunk-55IACEB6.D_PFaIEe.js → chunk-55IACEB6.CnPkEEr0.js} +1 -1
  74. package/web/_astro/{chunk-727SXJPM.DemMW1ao.js → chunk-727SXJPM.BQzQeMVm.js} +4 -4
  75. package/web/_astro/{chunk-AQP2D5EJ.Iu2V5-ex.js → chunk-AQP2D5EJ.B6xNyDnL.js} +1 -1
  76. package/web/_astro/{chunk-FMBD7UC4.MsNgSP-E.js → chunk-FMBD7UC4.C7f9Ih78.js} +1 -1
  77. package/web/_astro/{chunk-ND2GUHAM.DfbRaAlm.js → chunk-ND2GUHAM.CNV1dFXT.js} +1 -1
  78. package/web/_astro/{chunk-QZHKN3VN.BbJAQ4h-.js → chunk-QZHKN3VN.Cudn2TkJ.js} +1 -1
  79. package/web/_astro/{classDiagram-4FO5ZUOK.CPurtiC2.js → classDiagram-4FO5ZUOK.D1NwP50q.js} +1 -1
  80. package/web/_astro/{classDiagram-v2-Q7XG4LA2.CPurtiC2.js → classDiagram-v2-Q7XG4LA2.D1NwP50q.js} +1 -1
  81. package/web/_astro/{cose-bilkent-S5V4N54A.CKKdx1bM.js → cose-bilkent-S5V4N54A.B1wSL-Xb.js} +1 -1
  82. package/web/_astro/{cynefin-OW5HDTMX.CoKMTg-R.js → cynefin-OW5HDTMX.BmK52w8G.js} +1 -1
  83. package/web/_astro/{dagre-BM42HDAG.D4h4_k56.js → dagre-BM42HDAG.Bfy5CTDT.js} +2 -2
  84. package/web/_astro/diagram-2AECGRRQ.DhNnvUvX.js +43 -0
  85. package/web/_astro/diagram-5GNKFQAL.lTX5KwnS.js +10 -0
  86. package/web/_astro/{diagram-KO2AKTUF.BFoCkiCr.js → diagram-KO2AKTUF.CW_vMJ4z.js} +3 -3
  87. package/web/_astro/{diagram-LMA3HP47.exHn9OVx.js → diagram-LMA3HP47.B_8ZGF67.js} +1 -1
  88. package/web/_astro/{diagram-OG6HWLK6.CeqO34nN.js → diagram-OG6HWLK6.BppnHsdS.js} +1 -1
  89. package/web/_astro/{erDiagram-TEJ5UH35.D_v7HqxR.js → erDiagram-TEJ5UH35.BEuHXcjJ.js} +5 -5
  90. package/web/_astro/{flowDiagram-I6XJVG4X.EUmrpbwh.js → flowDiagram-I6XJVG4X.CH-UlnGr.js} +4 -4
  91. package/web/_astro/{ganttDiagram-6RSMTGT7.BOCF5lII.js → ganttDiagram-6RSMTGT7.BO81S85v.js} +1 -1
  92. package/web/_astro/{gitGraphDiagram-PVQCEYII.Di7otYZD.js → gitGraphDiagram-PVQCEYII.XnPxPPZN.js} +1 -1
  93. package/web/_astro/index.Hjbr15fG.css +1 -0
  94. package/web/_astro/{infoDiagram-5YYISTIA.TcBkCAJk.js → infoDiagram-5YYISTIA.JyjYRu_T.js} +1 -1
  95. package/web/_astro/{ishikawaDiagram-YF4QCWOH.D-2y4M0c.js → ishikawaDiagram-YF4QCWOH.BBRBF-Fo.js} +5 -5
  96. package/web/_astro/{journeyDiagram-JHISSGLW.DPbJI_n2.js → journeyDiagram-JHISSGLW.C_iymSyp.js} +1 -1
  97. package/web/_astro/{kanban-definition-UN3LZRKU.EFxhQ9Fj.js → kanban-definition-UN3LZRKU.DdfW-Oqt.js} +7 -7
  98. package/web/_astro/{linear.DSAsQLzs.js → linear.C2_IkbZT.js} +1 -1
  99. package/web/_astro/mermaid.core.GAOYeSR0.js +303 -0
  100. package/web/_astro/{mindmap-definition-RKZ34NQL.CJY1N_7V.js → mindmap-definition-RKZ34NQL.DAZIxQSK.js} +2 -2
  101. package/web/_astro/{pieDiagram-4H26LBE5.567ZNoL2.js → pieDiagram-4H26LBE5.CN8sIhKM.js} +3 -3
  102. package/web/_astro/{quadrantDiagram-W4KKPZXB.mqfz9-MY.js → quadrantDiagram-W4KKPZXB.3dGcX5GP.js} +1 -1
  103. package/web/_astro/{requirementDiagram-4Y6WPE33.Bv1Gv9In.js → requirementDiagram-4Y6WPE33.BV2y4dd6.js} +3 -3
  104. package/web/_astro/{sankeyDiagram-5OEKKPKP.B6Gs4X4r.js → sankeyDiagram-5OEKKPKP.Cqo15Tvo.js} +4 -4
  105. package/web/_astro/{sequenceDiagram-3UESZ5HK.BhYj4v-m.js → sequenceDiagram-3UESZ5HK.CROCPMJB.js} +1 -1
  106. package/web/_astro/{stateDiagram-AJRCARHV.BPbBnkpw.js → stateDiagram-AJRCARHV.RfXZrkFE.js} +1 -1
  107. package/web/_astro/{stateDiagram-v2-BHNVJYJU.C4squMNK.js → stateDiagram-v2-BHNVJYJU.CPXmbBs9.js} +1 -1
  108. package/web/_astro/{timeline-definition-PNZ67QCA.C_SwIHgl.js → timeline-definition-PNZ67QCA.DdgKTiO8.js} +3 -3
  109. package/web/_astro/{vennDiagram-CIIHVFJN.Bz4NZGpQ.js → vennDiagram-CIIHVFJN.CPNVSHF1.js} +5 -5
  110. package/web/_astro/{wardleyDiagram-YWT4CUSO.CozMVZ3i.js → wardleyDiagram-YWT4CUSO.CQhA0Jyr.js} +3 -3
  111. package/web/_astro/{xychartDiagram-2RQKCTM6.BwMGBwjB.js → xychartDiagram-2RQKCTM6.n61BWyy4.js} +1 -1
  112. package/web/index.html +2 -2
  113. package/web/_astro/BoardApp.BEDWpzsr.js +0 -188
  114. package/web/_astro/BoardApp.DQG2xfEz.js +0 -1
  115. package/web/_astro/arc.C0rrflm_.js +0 -1
  116. package/web/_astro/channel.SRrg1P-w.js +0 -1
  117. package/web/_astro/diagram-2AECGRRQ.DJ0h9zgw.js +0 -43
  118. package/web/_astro/diagram-5GNKFQAL.DvPk1jYd.js +0 -10
  119. package/web/_astro/index.Bx6GY4RH.css +0 -1
  120. package/web/_astro/mermaid.core.kAZjgJHG.js +0 -301
@@ -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
@@ -295,6 +296,30 @@ states:
295
296
  printf 'FAIL\n' > ".spur/run/$__runId-wrapup-sync.status";
296
297
  fi
297
298
 
299
+ - id: feature-verify
300
+ description: >
301
+ Post-feature-transition verification hop (D63 task 0915, review finding
302
+ F1): wrapup's doc-sync and the feature transition mutate the corpus AFTER
303
+ the feature-scoped verification pass ran. The proof digest deliberately
304
+ excludes docs/tasks*/docs/features* (shared evidence, concurrent writers),
305
+ so the bound receipt stays valid — but the feature's completion boundary
306
+ must still observe the post-wrapup state. This hop re-runs the feature
307
+ check gate (`featureGateCmd`). When the configured command is the done-
308
+ boundary variant (`feature check --as done`), it validates the bound
309
+ evidence receipt (feature identity, verifier definition digest, terminal
310
+ recording run, artifact registration, checked-input digest) against the
311
+ current feature contract; a plain gate command observes the post-wrapup
312
+ corpus state but does not enforce the receipt (0915 re-review P3). A FAIL
313
+ fails the wrapup loudly instead of letting a stale PASS ride; only a
314
+ verified gate writes PASS (0783 R4).
315
+ onEnter:
316
+ - kind: shell
317
+ options:
318
+ command: >-
319
+ sh -c "$featureGateCmd" &&
320
+ printf 'PASS\n' > ".spur/run/$__runId-wrapup-feature-verify.status" ||
321
+ printf 'FAIL\n' > ".spur/run/$__runId-wrapup-feature-verify.status"
322
+
298
323
  - id: branch-cleanup
299
324
  description: >
300
325
  Irreversible-operation HITL gate, consent-only (0770). If vars.merge=true,
@@ -474,19 +499,36 @@ transitions:
474
499
  options:
475
500
  command: 'test "$(cat .spur/run/$__runId-wrapup-sync.status 2>/dev/null)" = FAIL'
476
501
  - from: feature-transition
502
+ to: feature-verify
503
+ description: Sync PASS — re-run the feature check gate against the post-wrapup state.
504
+ guard:
505
+ kind: shell
506
+ options:
507
+ command: 'test "$(cat .spur/run/$__runId-wrapup-sync.status 2>/dev/null)" = PASS'
508
+ - from: feature-verify
509
+ to: failed
510
+ description: >
511
+ Post-wrapup feature check failed (0915 F1): the bound receipt no longer
512
+ validates against the current feature contract. Already-written
513
+ learnings/metrics stay on disk.
514
+ guard:
515
+ kind: shell
516
+ options:
517
+ command: 'test "$(cat .spur/run/$__runId-wrapup-feature-verify.status 2>/dev/null)" = FAIL'
518
+ - from: feature-verify
477
519
  to: branch-cleanup
478
- description: Sync PASS — merge is requested.
520
+ description: Post-wrapup feature check PASS — merge is requested.
479
521
  guard:
480
522
  kind: shell
481
523
  options:
482
- command: 'test "$(cat .spur/run/$__runId-wrapup-sync.status 2>/dev/null)" = PASS && test "$merge" = true'
483
- - from: feature-transition
524
+ command: 'test "$(cat .spur/run/$__runId-wrapup-feature-verify.status 2>/dev/null)" = PASS && test "$merge" = true'
525
+ - from: feature-verify
484
526
  to: done
485
- description: Sync PASS — no merge requested.
527
+ description: Post-wrapup feature check PASS — no merge requested.
486
528
  guard:
487
529
  kind: shell
488
530
  options:
489
- command: 'test "$(cat .spur/run/$__runId-wrapup-sync.status 2>/dev/null)" = PASS && test "$merge" != true'
531
+ command: 'test "$(cat .spur/run/$__runId-wrapup-feature-verify.status 2>/dev/null)" = PASS && test "$merge" != true'
490
532
 
491
533
  # ── branch-cleanup: HITL exhaustive routing (yes / no / cancel → done) ──
492
534
  # 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.92",
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.5",
57
+ "@gobing-ai/ts-ai-runner": "^0.5.5",
58
+ "@gobing-ai/ts-dual-workflow-engine": "^0.5.5",
59
+ "@gobing-ai/ts-infra": "^0.5.5",
60
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.5.5",
61
+ "@gobing-ai/ts-rule-engine": "^0.5.5",
62
+ "@gobing-ai/ts-runtime": "^0.5.5",
63
+ "@gobing-ai/ts-utils": "^0.5.5",
64
64
  "@types/bun": "1.3.14",
65
65
  "@types/figlet": "^1.7.0",
66
66
  "@types/node-notifier": "8.0.5",
@@ -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
 
@@ -41,6 +41,12 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
41
41
  **Flags:**
42
42
 
43
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).
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,
@@ -20,10 +20,11 @@ Wraps the **sp:spur-dev** skill.
20
20
  | `--auto` | Skip objective HITL gates. | off |
21
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 |
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,7 +42,9 @@ 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>`
@@ -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).