@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/pipeline-budgets.json +2 -9
- package/config/plugin-scripts.json +27 -1
- package/config/templates/AGENTS.md +4 -0
- package/config/templates/docs/02_ROADMAP.md +2 -0
- package/config/templates/docs/03_ARCHITECTURE.md +3 -1
- package/config/templates/docs/04_DESIGN.md +2 -0
- package/config/templates/docs/99_PROJECT_CONSTITUTION.md +10 -2
- package/config/workflow-candidates.json +72 -1
- package/config/workflows/feature-lifecycle.yaml +14 -5
- package/config/workflows/feature-verification.yaml +36 -27
- package/config/workflows/history-anatomy.yaml +16 -25
- package/config/workflows/idea-pipeline.yaml +76 -23
- package/config/workflows/pr-review.yaml +8 -0
- package/config/workflows/task-pipeline.yaml +362 -40
- package/config/workflows/wayfinder-resolution.yaml +5 -0
- package/config/workflows/wrapup-pipeline.yaml +102 -19
- package/package.json +9 -9
- package/plugins/sp/README.md +7 -2
- package/plugins/sp/agents/super-planner.md +14 -5
- package/plugins/sp/commands/dev-dogfood.md +4 -4
- package/plugins/sp/commands/dev-fixall.md +8 -5
- package/plugins/sp/commands/dev-run.md +8 -2
- package/plugins/sp/commands/dev-runall.md +14 -8
- package/plugins/sp/commands/dev-verify.md +9 -0
- package/plugins/sp/commands/dev-verifyall.md +5 -0
- package/plugins/sp/lib/idea-handoff.generated.mjs +306 -301
- package/plugins/sp/lib/inline-run.generated.d.mts +18 -0
- package/plugins/sp/lib/inline-run.generated.mjs +1468 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/environment-lens.md +1 -1
- package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +136 -0
- package/plugins/sp/scripts/dogfood-testing/validate-report.ts +196 -2
- package/plugins/sp/scripts/feature-verification-steps.mjs +174 -0
- package/plugins/sp/scripts/feature-verification-steps.ts +275 -0
- package/plugins/sp/scripts/history-anatomy-cache.mjs +104 -4
- package/plugins/sp/scripts/history-anatomy-cache.ts +137 -13
- package/plugins/sp/scripts/inline-pipeline-parity-check.ts +2 -1
- package/plugins/sp/scripts/inline-run-setup.mjs +421 -0
- package/plugins/sp/scripts/inline-run-setup.ts +325 -78
- package/plugins/sp/scripts/quality-gate.mjs +248 -6
- package/plugins/sp/scripts/quality-gate.ts +410 -9
- package/plugins/sp/scripts/record-feature-sync.mjs +63 -0
- package/plugins/sp/scripts/record-feature-sync.ts +84 -0
- package/plugins/sp/scripts/residual-scan.mjs +484 -0
- package/plugins/sp/scripts/residual-scan.ts +640 -0
- package/plugins/sp/scripts/task-diffstat.mjs +156 -0
- package/plugins/sp/scripts/task-diffstat.ts +229 -0
- package/plugins/sp/scripts/task-evidence-precheck.ts +8 -3
- package/plugins/sp/scripts/task-size-precheck.ts +8 -3
- package/plugins/sp/scripts/wrapup-drift-probe.mjs +181 -0
- package/plugins/sp/scripts/wrapup-drift-probe.ts +258 -0
- package/plugins/sp/scripts/wrapup-steps.mjs +60 -1
- package/plugins/sp/scripts/wrapup-steps.ts +89 -4
- package/plugins/sp/skills/brainstorm/SKILL.md +2 -0
- package/plugins/sp/skills/brainstorm/references/workflows.md +17 -2
- package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
- package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +2 -0
- package/plugins/sp/skills/code-implementation/SKILL.md +17 -0
- package/plugins/sp/skills/code-verification/SKILL.md +21 -0
- package/plugins/sp/skills/code-verification/references/secu-review.md +3 -2
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -0
- package/plugins/sp/skills/dogfood-testing/SKILL.md +5 -3
- package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +63 -26
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +33 -10
- package/plugins/sp/skills/history-anatomy/references/modes.md +5 -3
- package/plugins/sp/skills/next-feature/references/ranking-rubric.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +7 -0
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
- package/plugins/sp/skills/session-review/SKILL.md +12 -2
- package/plugins/sp/skills/spur-check/SKILL.md +112 -0
- package/plugins/sp/skills/spur-cli/references/features.md +1 -1
- package/plugins/sp/skills/spur-cli/references/projects.md +3 -1
- package/plugins/sp/skills/spur-cli/references/workflows.md +39 -19
- package/plugins/sp/skills/spur-dev/SKILL.md +13 -5
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +18 -3
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -2
- package/plugins/sp/skills/spur-dev/references/document-authoring.md +85 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +286 -58
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +27 -4
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +3 -2
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +61 -16
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +10 -5
- package/plugins/sp/skills/spur-dev/templates/design.md +31 -0
- package/plugins/sp/skills/spur-dev/templates/plan.md +32 -0
- package/plugins/sp/skills/spur-doctor/SKILL.md +60 -14
- package/schemas/state-machine-workflow.schema.json +4 -0
- package/spur.js +22501 -19644
- package/web/_astro/BoardApp.CerSBgis.js +192 -0
- package/web/_astro/BoardApp.eoTz0pZs.js +1 -0
- package/web/_astro/{TaskDetail.CXGltuT_.js → TaskDetail.DCqiC-OZ.js} +1 -1
- package/web/_astro/arc.CPwg6Rw0.js +1 -0
- package/web/_astro/{architectureDiagram-3BPJPVTR.DJ8DHkWE.js → architectureDiagram-3BPJPVTR.DM_vp_hO.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.D8DHK3Jl.js → blockDiagram-GPEHLZMM.DXVIiv0p.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.BugQbX9u.js → c4Diagram-AAUBKEIU.BbF_zCxW.js} +1 -1
- package/web/_astro/channel.MYZLKNwy.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.Mv26KlVn.js → chunk-2J33WTMH.CAgQHpPC.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.CD51JoT_.js → chunk-4BX2VUAB.BN-5tpw4.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.D_PFaIEe.js → chunk-55IACEB6.CnPkEEr0.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.DemMW1ao.js → chunk-727SXJPM.BQzQeMVm.js} +4 -4
- package/web/_astro/{chunk-AQP2D5EJ.Iu2V5-ex.js → chunk-AQP2D5EJ.B6xNyDnL.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.MsNgSP-E.js → chunk-FMBD7UC4.C7f9Ih78.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.DfbRaAlm.js → chunk-ND2GUHAM.CNV1dFXT.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.BbJAQ4h-.js → chunk-QZHKN3VN.Cudn2TkJ.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CPurtiC2.js → classDiagram-4FO5ZUOK.D1NwP50q.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CPurtiC2.js → classDiagram-v2-Q7XG4LA2.D1NwP50q.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CKKdx1bM.js → cose-bilkent-S5V4N54A.B1wSL-Xb.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.CoKMTg-R.js → cynefin-OW5HDTMX.BmK52w8G.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.D4h4_k56.js → dagre-BM42HDAG.Bfy5CTDT.js} +2 -2
- package/web/_astro/diagram-2AECGRRQ.DhNnvUvX.js +43 -0
- package/web/_astro/diagram-5GNKFQAL.lTX5KwnS.js +10 -0
- package/web/_astro/{diagram-KO2AKTUF.BFoCkiCr.js → diagram-KO2AKTUF.CW_vMJ4z.js} +3 -3
- package/web/_astro/{diagram-LMA3HP47.exHn9OVx.js → diagram-LMA3HP47.B_8ZGF67.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.CeqO34nN.js → diagram-OG6HWLK6.BppnHsdS.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.D_v7HqxR.js → erDiagram-TEJ5UH35.BEuHXcjJ.js} +5 -5
- package/web/_astro/{flowDiagram-I6XJVG4X.EUmrpbwh.js → flowDiagram-I6XJVG4X.CH-UlnGr.js} +4 -4
- package/web/_astro/{ganttDiagram-6RSMTGT7.BOCF5lII.js → ganttDiagram-6RSMTGT7.BO81S85v.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.Di7otYZD.js → gitGraphDiagram-PVQCEYII.XnPxPPZN.js} +1 -1
- package/web/_astro/index.Hjbr15fG.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.TcBkCAJk.js → infoDiagram-5YYISTIA.JyjYRu_T.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.D-2y4M0c.js → ishikawaDiagram-YF4QCWOH.BBRBF-Fo.js} +5 -5
- package/web/_astro/{journeyDiagram-JHISSGLW.DPbJI_n2.js → journeyDiagram-JHISSGLW.C_iymSyp.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.EFxhQ9Fj.js → kanban-definition-UN3LZRKU.DdfW-Oqt.js} +7 -7
- package/web/_astro/{linear.DSAsQLzs.js → linear.C2_IkbZT.js} +1 -1
- package/web/_astro/mermaid.core.GAOYeSR0.js +303 -0
- package/web/_astro/{mindmap-definition-RKZ34NQL.CJY1N_7V.js → mindmap-definition-RKZ34NQL.DAZIxQSK.js} +2 -2
- package/web/_astro/{pieDiagram-4H26LBE5.567ZNoL2.js → pieDiagram-4H26LBE5.CN8sIhKM.js} +3 -3
- package/web/_astro/{quadrantDiagram-W4KKPZXB.mqfz9-MY.js → quadrantDiagram-W4KKPZXB.3dGcX5GP.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.Bv1Gv9In.js → requirementDiagram-4Y6WPE33.BV2y4dd6.js} +3 -3
- package/web/_astro/{sankeyDiagram-5OEKKPKP.B6Gs4X4r.js → sankeyDiagram-5OEKKPKP.Cqo15Tvo.js} +4 -4
- package/web/_astro/{sequenceDiagram-3UESZ5HK.BhYj4v-m.js → sequenceDiagram-3UESZ5HK.CROCPMJB.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.BPbBnkpw.js → stateDiagram-AJRCARHV.RfXZrkFE.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.C4squMNK.js → stateDiagram-v2-BHNVJYJU.CPXmbBs9.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.C_SwIHgl.js → timeline-definition-PNZ67QCA.DdgKTiO8.js} +3 -3
- package/web/_astro/{vennDiagram-CIIHVFJN.Bz4NZGpQ.js → vennDiagram-CIIHVFJN.CPNVSHF1.js} +5 -5
- package/web/_astro/{wardleyDiagram-YWT4CUSO.CozMVZ3i.js → wardleyDiagram-YWT4CUSO.CQhA0Jyr.js} +3 -3
- package/web/_astro/{xychartDiagram-2RQKCTM6.BwMGBwjB.js → xychartDiagram-2RQKCTM6.n61BWyy4.js} +1 -1
- package/web/index.html +2 -2
- package/config/workflows/decision-routing-example.yaml +0 -134
- package/web/_astro/BoardApp.BEDWpzsr.js +0 -188
- package/web/_astro/BoardApp.DQG2xfEz.js +0 -1
- package/web/_astro/arc.C0rrflm_.js +0 -1
- package/web/_astro/channel.SRrg1P-w.js +0 -1
- package/web/_astro/diagram-2AECGRRQ.DJ0h9zgw.js +0 -43
- package/web/_astro/diagram-5GNKFQAL.DvPk1jYd.js +0 -10
- package/web/_astro/index.Bx6GY4RH.css +0 -1
- 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
|
|
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
|
|
166
|
-
|
|
167
|
-
|
|
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`.
|
|
786
|
-
|
|
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`
|
|
356
|
-
- **Three orthogonal axes (do not confuse):** `--keep-going` = batch failure policy (halt vs skip dependents); `--continue` = resume from checkpoint (
|
|
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.
|