@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
@@ -92,9 +92,15 @@ pick task (spur task list --json)
92
92
  The pipeline (`kind: state-machine`) runs the work loop:
93
93
 
94
94
  ```
95
- precheck → implement → test → review → approve(HITL) → verify → record → done
95
+ precheck → implement[→escalate(HITL)] → test → review → approve(HITL) → verify → record → done
96
96
  ```
97
97
 
98
+ **Escalation contract (0933).** The implement agent may pause on an operator question: it writes
99
+ `.spur/run/<wbs>-question.md` and exits 0; the `escalate` hop surfaces it via HITL and pauses the
100
+ run. Resume with `spur workflow continue --answer-text <answer>` — the guard appends the Q/A to
101
+ `.spur/run/<wbs>-escalation.md` and re-enters implement (transcript via `--escalation-file`).
102
+ `maxEscalations` (default 2) bounds the loop; exhausted or empty answer → `failed`. Implement only.
103
+
98
104
  Full procedure: **[references/execution-workflow.md](references/execution-workflow.md)**.
99
105
  Host-session procedure: **[references/inline-pipeline-driver.md](references/inline-pipeline-driver.md)**.
100
106
 
@@ -110,7 +116,7 @@ reference for the half you're operating; do not duplicate its content here.
110
116
  | Feature check gate | planning | `spur feature check` | [planning-workflow.md](references/planning-workflow.md) |
111
117
  | Decomposition (dispatch) | planning | `task-batch.schema.json` | `sp:spec-decomposition` competency — the spine dispatches, does not inline |
112
118
  | Batch-create gate | planning | `spur task batch-create` | [planning-workflow.md](references/planning-workflow.md) |
113
- | Design doc | planning | — (prompt work; §4.5/T9) | [planning-workflow.md](references/planning-workflow.md) |
119
+ | Design doc | planning | — (§4.5/T9) | [document-authoring.md](references/document-authoring.md) |
114
120
  | Refine | planning | `spur task update --section` | [planning-workflow.md](references/planning-workflow.md) |
115
121
  | Batch refine | planning | `sp:dev-refineall` → per-task `refine` | [dev-operations.md](references/dev-operations.md) § refineall · [planning-workflow.md](references/planning-workflow.md) |
116
122
  | Task selection | execution | `spur task list` | [execution-workflow.md](references/execution-workflow.md) |
@@ -162,9 +168,10 @@ CLI does.
162
168
  - Before accepting a child/watcher result, compare its run ID with the dispatched run ID and check
163
169
  current trace state through Spur. If using a run log as evidence, require its mtime to be at least
164
170
  the dispatch time. A mismatch or stale timestamp is not completion evidence. Do not scrape terminals.
165
- Bound each watch invocation to 10 minutes or 20 polls, whichever comes first; persist the last
166
- confirmed identity/state and report a checkpoint before continuing. A watcher timeout does not
167
- cancel the owned run or authorize launching a replacement.
171
+ Bound each watch invocation to `spur workflow trace <run-id> --follow --timeout 600000` — one
172
+ bounded call, no hand-rolled poll loop; a timeout prints one checkpoint line and exits 1 while the
173
+ run continues, so persist the last confirmed identity/state and report the checkpoint before
174
+ continuing. A watcher timeout does not cancel the owned run or authorize launching a replacement.
168
175
  - Mark superseded scratch with `SUPERSEDED` and a pointer to the authoritative task Design. Never
169
176
  let a scratch instruction override the live task, even when its old run is still readable.
170
177
  - Checker-policy changes require one explicit unsuppressed audit (T10); ordinary corpus commit
@@ -239,6 +246,7 @@ for "what's actually in file Y" or for resources that sit outside the step seque
239
246
  - `idea-pipeline.yaml` — the front-half state machine (absorbed the retired
240
247
  planning-pipeline in D5-K; `/sp:dev-plan` routes here, ADR-072).
241
248
  - `templates/bdd/gherkin.md` — the BDD scenario template.
249
+ - `templates/plan.md` and `templates/design.md` — plan and design starting points.
242
250
 
243
251
  ## Platform Notes
244
252
 
@@ -120,6 +120,14 @@ This is **the same rule, not an exception**: `--agent` names who does the thinki
120
120
  the thinking happens in the stages. Selecting an executor for a loop that runs no prompts would be
121
121
  meaningless.
122
122
 
123
+ **Fleet executor (0942, ADR-126, opt-in).** A workflow run may opt its `agent.run` stages into the
124
+ agent fleet control plane by mapping the pipeline selector to `executor: 'fleet'` (dev-run /
125
+ dev-runall `--agent fleet`). The stage dispatches to a fleet member through the fleet coordination
126
+ surface instead of spawning a subprocess; a subprocess fallback happens only when the run declares
127
+ `executorFallback: 'traditional'`, and an unavailable fleet otherwise fails the stage explicitly
128
+ (0937 `failed-agent`). This is an additional `agent.run` transport — it does not change the
129
+ `--agent` selector semantics documented above, and the interactive driver never resolves to it.
130
+
123
131
  **Interactive task pipelines invert control into the host session (ADR-047 amendment).**
124
132
  `dev-run --mode full` and sequential `dev-runall` with omitted `--agent` or explicit `--agent
125
133
  inline` interpret the existing `task-pipeline.yaml` in the host session; they do not launch `spur
@@ -512,7 +520,10 @@ iterating one task).
512
520
 
513
521
  **The rule.** When a test fails and you are iterating to green:
514
522
 
515
- 1. Run the narrow target first: `bun test <file> --test-name-pattern <test>`.
523
+ 1. Run the narrow target first: `bun test <file> --test-name-pattern <test>`. Workspace tests need
524
+ the workspace `bunfig.toml` preload — invoke them as a subshell `(cd <workspace> && bun test …)`
525
+ or with absolute paths, because the shell's cwd persists between calls and a bare `cd` breaks
526
+ later relative-path commands (verifyall session friction, 2026-09-23).
516
527
  2. Loop on that narrow target until green.
517
528
  3. **Then** run the single full `spur-check` (or `bun run check`) as the final gate.
518
529
 
@@ -782,8 +793,12 @@ The Design Approval Gate is the taste gate between system design and decompositi
782
793
  **The `needs_design` signal routing:**
783
794
 
784
795
  The signal is emitted by the `discovery` state's brainstorm dispatch and written to
785
- `.spur/run/idea-needs-design.json`. The `feature-check` state's transition guards read it to
786
- determine routing:
796
+ `.spur/run/idea-needs-design.json`. A deterministic shell action at the end of the `ac-generate`
797
+ and `feature-check` onEnter lists (0945 R2) folds `design` × `needs_design` once into
798
+ `.spur/run/<runId>-idea-design-route.txt` (`design` | `skip`; missing/corrupt JSON fails safe to
799
+ `design`) and the two recorded check statuses into `.spur/run/<runId>-idea-ac-ready.status`
800
+ (`PASS` only when both are PASS). The transition guards read those derived files to determine
801
+ routing — they never re-derive the signal inline (0769):
787
802
 
788
803
  | `design` var | `needs_design` signal | Route |
789
804
  | --- | --- | --- |
@@ -352,8 +352,8 @@ must not be changed without updating the backing skill.
352
352
  ### 13. runall
353
353
 
354
354
  - **Purpose:** Run a batch of tasks through their pipelines in dependency-correct order — resolve a set, topo-sort, run each via `task-pipeline.yaml`, inspect verdicts, apply the failure policy, emit a batch report.
355
- - **Inputs:** `--tasks <selector>` (required — explicit WBS list, status pseudo-list, `feature:<id>`, or `ready`). `--mode <sequential|parallel>` (default `sequential`; `parallel` fans out a proven-independent subset per `execution-batch.md` § Parallel Execution). `--keep-going` skips a failed task's in-batch dependents and continues independents (default halts on first failure). `--auto` sets `profile=auto` on each per-task run (skips the HITL approve gate). `--feature <id>` is sugar for `--tasks feature:<id>`; when the effective selector is feature-derived, the batch runs `spur feature check <id> --strict --json` **once** before task resolution — a non-zero strict check aborts with verdict `aborted`, zero attempted tasks, and the structured findings (task 0510 R2); scoped: `L4.scenario-unverified` (expected pre-run state of any not-yet-run feature) is reported verbatim but does not abort — any other strict error aborts. Explicit WBS/status/`ready` selectors add no feature check. The orchestrator loop itself continues in this session; interactive sequential omit/`inline` uses the host driver — host-controlled with eligible `agent.run` stages dispatching once to a native subagent and host fallback (task 0508) — while `--agent auto`/a name, parallel mode, and headless invocation keep the isolated per-task workflow subprocess boundary. `--agent <inline|auto|name>` pins the executor for the per-task stages (see [SSOT](cross-cutting.md#inline-default-execution-surface)); the value crosses into per-task `vars.agent`, not the orchestrator. `--json` emits the report as JSON. `--wrap` triggers `wrapup-pipeline.yaml` after the batch completes, `--next` chains each task to terminal status then runs the wrap hop **once for the batch**, `--continue` resumes from checkpoint.
356
- - **Three orthogonal axes (do not confuse):** `--keep-going` = batch failure policy (halt vs skip dependents); `--continue` = resume from checkpoint (pick up an interrupted batch); `--next` = per-task lifecycle chaining (advance status on a verdict — `dev-verify`/`dev-verifyall` only). `routing-table.md` offers `--continue` and `--next` as competing options for the same situation only when the batch was interrupted mid-run; otherwise they address different problems.
355
+ - **Inputs:** `--tasks <selector>` (required — explicit WBS list, status pseudo-list, `feature:<id>`, or `ready`). `--mode <sequential|parallel>` (default `sequential`; `parallel` fans out a proven-independent subset per `execution-batch.md` § Parallel Execution). `--keep-going` skips a failed task's in-batch dependents and continues independents (default halts on first failure). `--auto` sets `profile=auto` on each per-task run (skips the HITL approve gate). `--feature <id>` is sugar for `--tasks feature:<id>`; when the effective selector is feature-derived, the batch runs `spur feature check <id> --strict --json` **once** before task resolution — a non-zero strict check aborts with verdict `aborted`, zero attempted tasks, and the structured findings (task 0510 R2); scoped: `L4.scenario-unverified` (expected pre-run state of any not-yet-run feature) is reported verbatim but does not abort — any other strict error aborts. Explicit WBS/status/`ready` selectors add no feature check. The orchestrator loop itself continues in this session; interactive sequential omit/`inline` uses the host driver — host-controlled with eligible `agent.run` stages dispatching once to a native subagent and host fallback (task 0508) — while `--agent auto`/a name, parallel mode, and headless invocation keep the isolated per-task workflow subprocess boundary. `--agent <inline|auto|name>` pins the executor for the per-task stages (see [SSOT](cross-cutting.md#inline-default-execution-surface)); the value crosses into per-task `vars.agent`, not the orchestrator. `--json` emits the report as JSON. `--wrap` triggers `wrapup-pipeline.yaml` **once for the batch** over the `done` subset only (execution-batch.md Step 6: `vars.feature` only when every frozen task is `done`/`cancelled`; empty done subset skips with a reason), `--next` chains each task to terminal status then runs the same batch-once wrap, `--continue` resumes from checkpoint.
356
+ - **Three orthogonal axes (do not confuse):** `--keep-going` = batch failure policy (halt vs skip dependents); `--continue` = resume from checkpoint against the batch's original frozen identity (execution-batch.md § Batch continuation, task 0919); `--next` = per-task lifecycle chaining (advance status on a verdict — `dev-verify`/`dev-verifyall` only). `routing-table.md` offers `--continue` and `--next` as competing options for the same situation only when the batch was interrupted mid-run; otherwise they address different problems.
357
357
  - **Backing:** `sp:spur-dev` skill, `runall` operation → delegates the driver loop to the **`sp:super-planner`** agent (the batch orchestrator).
358
358
  - **Behavior:** The orchestrator reads [execution-batch.md](execution-batch.md) and drives: resolve selector → freeze set → topo-sort by `dependencies[]` (Kahn, WBS-ascending tie-break; cycle aborts) → resolve out-of-set deps by status (done → allow, else → block subtree) → run each task via `spur workflow run task-pipeline.yaml --async` + `spur workflow trace` polling → inspect terminal state + `.spur/run/<wbs>-verdict.json` → stop-the-batch default or `--keep-going` subtree skip → emit batch report. Per-task pipeline is invoked **verbatim** — no new FSM, no step edits. `--auto`/`--agent` are the only flags that cross the orchestrator→pipeline boundary (both into per-task `--vars`).
359
359
  - **Delegation:** `Skill(skill="sp:spur-dev", args="runall $ARGUMENTS")` → `sp:super-planner` agent.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: document-authoring
3
+ description: Light Markdown contracts for plan records and non-UI design satellites.
4
+ see_also:
5
+ - spur-dev
6
+ - planning-workflow
7
+ - doc-evolve
8
+ ---
9
+
10
+ # Plan and design document authoring
11
+
12
+ Use [plan.md](../templates/plan.md) for a new `docs/plans/*.md` working record and
13
+ [design.md](../templates/design.md) for a new `docs/design/*.md` non-UI contract satellite.
14
+ The project constitution owns their authority and maintenance; these templates are writing aids,
15
+ not parser schemas. Keep Markdown readable even when frontmatter is absent in a legacy file.
16
+
17
+ | Document | Job | Authority |
18
+ | --- | --- | --- |
19
+ | `docs/plans/` | Ordered work: intended outcome, premises, dependencies, execution sequence, verification, and follow-up. Older proposals and investigations remain working records. | Working record. Accepted conclusions take effect in their owner, such as an ADR, feature, roadmap, or design satellite. |
20
+ | `docs/design/` | Issue, context, solution, and its observable non-UI contract | Governed satellite of `docs/04_DESIGN.md`; label proposals and current behavior separately. |
21
+
22
+ ## Compose a new file
23
+
24
+ 1. Choose the owner before writing. Reuse an existing satellite when it already owns the surface.
25
+ Keep root `DESIGN.md` for UI rules and `03_ARCHITECTURE.md` for current system topology.
26
+ 2. Copy the relevant template. Replace placeholders. Keep `kind`, a descriptive `title`, a
27
+ truthful `status`, `created_at`, `updated_at`, `related` links, and `tags` for categorization.
28
+ Use ISO dates; leave `related` or `tags` empty when none apply. Keep one H1 matching the title.
29
+ 3. Use headings for the reader's question. The template's prompts are a starting shape: remove
30
+ inapplicable sections and keep specialized sections required by the producing workflow, such as
31
+ a brainstorm's `## Design Summary`. Number new sections in reading order. Plans make the
32
+ execution sequence and its premises usable; designs explain the issue, context, solution, and
33
+ observable contract. Never fill empty boilerplate.
34
+ 4. For a design satellite, write detail first, then add its pointer to `04_DESIGN.md` if missing.
35
+ Update an existing index row only when its indexed facts change. Do not put task receipts there.
36
+
37
+ ## Frontmatter vocabulary
38
+
39
+ Soft conventions for consistency and tag filtering, not a validator. Unknown values stay readable.
40
+
41
+ | Field | Values |
42
+ | --- | --- |
43
+ | `kind` | `plan` for any `docs/plans/` record, `design` for any `docs/design/` satellite. Nothing else. |
44
+ | `status` (plan) | `draft`, `proposed`, `approved`, `in-progress`, `done`, `superseded` |
45
+ | `status` (design) | `proposed`, `accepted`, `implemented`, `superseded` |
46
+ | `tags` | Ordered: one record-type tag, then owning feature ids (for example `H14`), then at most two area tags. |
47
+ | `related` | Repo-relative paths or feature/task ids; no prose. |
48
+
49
+ Record-type tags — plan: `brainstorm`, `proposal`, `investigation`, `audit`, `map`, `execution`,
50
+ `evidence`; design: `contract` (observable surface) or `system` (internal mechanism). Area tags:
51
+ `cli`, `server`, `web`, `workflow`, `planning`, `history`, `observability`, `agent`, `plugin`,
52
+ `docs`, `config`. A project may extend the area list; reuse a tag already in the corpus
53
+ (`rg -n '^tags:' docs/plans docs/design`) before adding one.
54
+
55
+ A producing workflow may keep its own keys beside these, such as a brainstorm's `needs_design` and
56
+ `run_id`, and its own section shape. The shared fields still apply.
57
+
58
+ ## Revise an existing file
59
+
60
+ Read the whole file and its inbound links first. Preserve the filename, meaningful headings,
61
+ anchors, dates, decisions, and historical status. Add missing metadata from evidence; label
62
+ unknowns instead of guessing. Restructure only where clarity improves, and keep a forwarding
63
+ heading when an anchor cannot be migrated safely. Update `updated_at` only for a substantive edit.
64
+ Do not turn an old proposal into a claim about current behavior without checking the owning source.
65
+
66
+ Legacy metadata upgrade:
67
+
68
+ - **Map** `date` → `created_at` and `feature`/`feature_id`/`task_wbs`/`parent_task` → `related`.
69
+ `title` is the H1 text; `topic` maps to `title` only when the file has no H1, otherwise drop it.
70
+ - **Owners:** when no owner key exists, a feature or task record that links the file
71
+ (`rg -l <filename> docs/features <task dir>`) is evidence for `related`. Ids found only in body
72
+ prose are not; requirement and priority labels look like feature ids.
73
+ - **Keep** workflow and provenance keys unchanged (`needs_design`, `run_id`, `doc`, `authority`,
74
+ `owns`, `read_before`, `edit_rules`, `version`, `derived_from`).
75
+ - **Dates:** `created_at` comes from a legacy `date`, else the filename date prefix, else the first commit
76
+ (`git log --follow --diff-filter=A --format=%as -- <file> | tail -1`), else leave it out and flag it.
77
+ `updated_at` is the existing value or the last commit date; do not bump it for a metadata-only edit.
78
+ - **Status:** use the vocabulary value only when the legacy value or body states it unambiguously
79
+ (`shipped`/`implemented`/`built …` → `implemented`; `approved-with-feedback` → `approved`).
80
+ Otherwise keep the legacy value and flag it for the operator. No status is better than a guessed one.
81
+ - **Headings:** never renumber or rename legacy headings; numbering applies to new files only.
82
+
83
+ For a bounded, read-only review of legacy files, use `sp:spur-doctor`. Apply accepted document
84
+ proposals in place using this guide, then use `sp:doc-evolve` to check affected key-document sync.
85
+ No bulk conversion or strict format check is required to read or maintain existing documents.