@gobing-ai/spur 0.3.60 → 0.3.62

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 (110) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +2 -2
  3. package/config/config.global.yaml +68 -57
  4. package/config/corpus-baseline.json +505 -57
  5. package/config/plugin-scripts.json +2 -2
  6. package/config/rules/boundary/config-loading-ownership.yaml +21 -0
  7. package/config/workflow-composition-baseline.json +1 -1
  8. package/config/workflows/history-anatomy.yaml +366 -0
  9. package/config/workflows/wayfinder-resolution.yaml +4 -6
  10. package/package.json +1 -1
  11. package/plugins/README.md +5 -4
  12. package/plugins/sp/README.md +22 -9
  13. package/plugins/sp/agents/super-planner.md +1 -1
  14. package/plugins/sp/commands/dev-find-issue.md +25 -46
  15. package/plugins/sp/commands/dev-pr-review.md +1 -1
  16. package/plugins/sp/commands/dev-run.md +22 -3
  17. package/plugins/sp/commands/dev-wrap.md +2 -2
  18. package/plugins/sp/commands/dev-wrapall.md +2 -2
  19. package/plugins/sp/lib/artifact-digest.generated.d.mts +7 -0
  20. package/plugins/sp/lib/artifact-digest.generated.mjs +48 -0
  21. package/plugins/sp/plugin.json +1 -1
  22. package/plugins/sp/references/roles.md +17 -14
  23. package/plugins/sp/scripts/history-anatomy-cache.mjs +669 -0
  24. package/plugins/sp/scripts/history-anatomy-cache.ts +818 -0
  25. package/plugins/sp/scripts/surface-drift-inventory.ts +51 -17
  26. package/plugins/sp/scripts/validate-commands.ts +11 -4
  27. package/plugins/sp/skills/code-verification/SKILL.md +1 -1
  28. package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -1
  29. package/plugins/sp/skills/history-anatomy/SKILL.md +67 -0
  30. package/plugins/sp/skills/history-anatomy/references/modes.md +82 -0
  31. package/plugins/sp/skills/history-anatomy/references/operations.md +67 -0
  32. package/plugins/sp/skills/history-anatomy/references/report-contract.md +133 -0
  33. package/plugins/sp/skills/issue-finding/SKILL.md +1 -1
  34. package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
  35. package/plugins/sp/skills/pr-reviewing/SKILL.md +2 -2
  36. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +1 -1
  37. package/plugins/sp/skills/spur-cli/references/init.md +1 -1
  38. package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +1 -1
  39. package/plugins/sp/skills/spur-cli/references/workflows/operations.md +1 -1
  40. package/plugins/sp/skills/spur-cli/references/workflows.md +4 -4
  41. package/plugins/sp/skills/spur-dev/SKILL.md +4 -4
  42. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +4 -4
  43. package/plugins/sp/skills/spur-dev/references/dev-operations.md +11 -11
  44. package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +1 -1
  45. package/plugins/sp/skills/spur-dev/references/execution-batch.md +17 -4
  46. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +8 -1
  47. package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +3 -2
  48. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +25 -13
  49. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +1 -1
  50. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +5 -2
  51. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +2 -2
  52. package/schemas/spur-config.schema.json +1 -1
  53. package/spur.js +1278 -890
  54. package/web/_astro/BoardApp.Z9jMwI9G.js +1 -0
  55. package/web/_astro/BoardApp.rkWGVwwK.js +178 -0
  56. package/web/_astro/{TaskDetail.B0l1uzsB.js → TaskDetail.B7ODt_bA.js} +1 -1
  57. package/web/_astro/{arc.DPruHC3P.js → arc.C5QRz6AQ.js} +1 -1
  58. package/web/_astro/{architectureDiagram-3BPJPVTR.CuOqAck6.js → architectureDiagram-3BPJPVTR.CHptn8gZ.js} +1 -1
  59. package/web/_astro/{blockDiagram-GPEHLZMM.Cxb7HDIA.js → blockDiagram-GPEHLZMM.b1nEDkDw.js} +1 -1
  60. package/web/_astro/{c4Diagram-AAUBKEIU.Dw7wa-0S.js → c4Diagram-AAUBKEIU.BWj8S_Qq.js} +1 -1
  61. package/web/_astro/channel.BJtn6CGV.js +1 -0
  62. package/web/_astro/{chunk-2J33WTMH.MECQitzo.js → chunk-2J33WTMH.q0BBuE1n.js} +1 -1
  63. package/web/_astro/{chunk-4BX2VUAB.p3ofhIGE.js → chunk-4BX2VUAB.DP2KDkAU.js} +1 -1
  64. package/web/_astro/{chunk-55IACEB6.BmQGsPZP.js → chunk-55IACEB6.CkCId72p.js} +1 -1
  65. package/web/_astro/{chunk-727SXJPM.CwrK23OA.js → chunk-727SXJPM.oHWzxMot.js} +1 -1
  66. package/web/_astro/{chunk-AQP2D5EJ.CUKI_QXp.js → chunk-AQP2D5EJ.DkkgxfMP.js} +1 -1
  67. package/web/_astro/{chunk-FMBD7UC4.7AtDgShM.js → chunk-FMBD7UC4.lmFJDvRK.js} +1 -1
  68. package/web/_astro/{chunk-ND2GUHAM.f_YJbTs3.js → chunk-ND2GUHAM.52jt0eHK.js} +1 -1
  69. package/web/_astro/{chunk-QZHKN3VN.0q7V3gEg.js → chunk-QZHKN3VN.Cg8KEFoD.js} +1 -1
  70. package/web/_astro/{classDiagram-4FO5ZUOK.C_hG3HMK.js → classDiagram-4FO5ZUOK.BuOUhxcD.js} +1 -1
  71. package/web/_astro/{classDiagram-v2-Q7XG4LA2.C_hG3HMK.js → classDiagram-v2-Q7XG4LA2.BuOUhxcD.js} +1 -1
  72. package/web/_astro/{cose-bilkent-S5V4N54A.vsaaaEMy.js → cose-bilkent-S5V4N54A.BRUU8E_0.js} +1 -1
  73. package/web/_astro/{dagre-BM42HDAG.BN7XFqQ4.js → dagre-BM42HDAG.GDbfFYVV.js} +1 -1
  74. package/web/_astro/{diagram-2AECGRRQ.ED6AfryZ.js → diagram-2AECGRRQ.CvIDBeJF.js} +1 -1
  75. package/web/_astro/{diagram-5GNKFQAL.Dxllzg8R.js → diagram-5GNKFQAL.DMgJjWOX.js} +1 -1
  76. package/web/_astro/{diagram-KO2AKTUF.RuWppieD.js → diagram-KO2AKTUF.njjl-0AP.js} +1 -1
  77. package/web/_astro/{diagram-LMA3HP47.CL32Xn6s.js → diagram-LMA3HP47.CcCqgP8M.js} +1 -1
  78. package/web/_astro/{diagram-OG6HWLK6.CUneEhqB.js → diagram-OG6HWLK6.Btqd-YVE.js} +1 -1
  79. package/web/_astro/{erDiagram-TEJ5UH35.DI-92Lec.js → erDiagram-TEJ5UH35.BbhML_Xo.js} +1 -1
  80. package/web/_astro/{flowDiagram-I6XJVG4X.69Aqa1FF.js → flowDiagram-I6XJVG4X.CkvsIgY8.js} +1 -1
  81. package/web/_astro/{ganttDiagram-6RSMTGT7.DdpClZpa.js → ganttDiagram-6RSMTGT7.m8IWD_wW.js} +1 -1
  82. package/web/_astro/{gitGraphDiagram-PVQCEYII.xqWfkvB4.js → gitGraphDiagram-PVQCEYII.5z87HXO-.js} +1 -1
  83. package/web/_astro/index.nWve6EHS.css +1 -0
  84. package/web/_astro/{infoDiagram-5YYISTIA.B3G5sfKm.js → infoDiagram-5YYISTIA.Bvyvsd7Q.js} +1 -1
  85. package/web/_astro/{ishikawaDiagram-YF4QCWOH.ahVNsoAQ.js → ishikawaDiagram-YF4QCWOH.DdWVYO87.js} +1 -1
  86. package/web/_astro/{journeyDiagram-JHISSGLW.PmFHLc-X.js → journeyDiagram-JHISSGLW.C3kOlYH1.js} +1 -1
  87. package/web/_astro/{kanban-definition-UN3LZRKU.Co1qOPTd.js → kanban-definition-UN3LZRKU.CfKTUHVC.js} +1 -1
  88. package/web/_astro/{linear.DoHZ-iRt.js → linear.CMDHnzgX.js} +1 -1
  89. package/web/_astro/{mermaid.core.DNRElYN2.js → mermaid.core.DN7-WrsP.js} +4 -4
  90. package/web/_astro/{mindmap-definition-RKZ34NQL.CdfJZidJ.js → mindmap-definition-RKZ34NQL.DcQxLvqG.js} +1 -1
  91. package/web/_astro/{pieDiagram-4H26LBE5.C1A8dby4.js → pieDiagram-4H26LBE5.Nu-Inbw6.js} +1 -1
  92. package/web/_astro/{quadrantDiagram-W4KKPZXB.NmZqjG_c.js → quadrantDiagram-W4KKPZXB.Dck2EChs.js} +1 -1
  93. package/web/_astro/{requirementDiagram-4Y6WPE33.tY36zYtK.js → requirementDiagram-4Y6WPE33.C--E5XuW.js} +1 -1
  94. package/web/_astro/{sankeyDiagram-5OEKKPKP.rOEGZYjo.js → sankeyDiagram-5OEKKPKP.B_0iRNna.js} +1 -1
  95. package/web/_astro/{sequenceDiagram-3UESZ5HK.Dpnw3S9J.js → sequenceDiagram-3UESZ5HK.PKuKr9mk.js} +1 -1
  96. package/web/_astro/{stateDiagram-AJRCARHV.DGpvQ3Wz.js → stateDiagram-AJRCARHV.ClhGHb-O.js} +1 -1
  97. package/web/_astro/{stateDiagram-v2-BHNVJYJU.CbwQdEfu.js → stateDiagram-v2-BHNVJYJU.Bv6BBnvg.js} +1 -1
  98. package/web/_astro/{timeline-definition-PNZ67QCA.DAYUpUJT.js → timeline-definition-PNZ67QCA.BZm2ZvAH.js} +1 -1
  99. package/web/_astro/{vennDiagram-CIIHVFJN.C7JCCd6-.js → vennDiagram-CIIHVFJN.Dt6yZXry.js} +1 -1
  100. package/web/_astro/{wardley-L42UT6IY.BGgwOH5_.js → wardley-L42UT6IY.rUs-E00M.js} +1 -1
  101. package/web/_astro/{wardleyDiagram-YWT4CUSO.oIZqzI2l.js → wardleyDiagram-YWT4CUSO.BcWgv4cA.js} +1 -1
  102. package/web/_astro/{xychartDiagram-2RQKCTM6.DohcJzqm.js → xychartDiagram-2RQKCTM6.DH-M-cX9.js} +1 -1
  103. package/web/index.html +2 -2
  104. package/plugins/sp/commands/dev-history-load.md +0 -63
  105. package/plugins/sp/scripts/history-load.mjs +0 -268
  106. package/plugins/sp/scripts/history-load.ts +0 -400
  107. package/web/_astro/BoardApp.BJs3l7O8.js +0 -179
  108. package/web/_astro/BoardApp.D8InuCYx.js +0 -1
  109. package/web/_astro/channel.XCf1DcsL.js +0 -1
  110. package/web/_astro/index.DJl2RAVZ.css +0 -1
@@ -50,7 +50,7 @@ ordered guards, and may loop back on itself (e.g. implement → check → fix
50
50
  | Node typing | none (states are untyped) | `type: action\|gate\|parallel\|decision` |
51
51
  | Required keys | `name, initialState, states, transitions` | `kind, name, initialNode, nodes, edges` |
52
52
  | `kind` field | optional (defaults to state-machine) | **required** — `kind: transition-flow` |
53
- | Canonical example | implement→check→fix loop (`.spur/workflows/basic.yaml` — soft status-file probe + bounded fixall) | read→validate→transform→write pipeline |
53
+ | Canonical example | implement→check→fix loop (`basic.yaml` — soft status-file probe + bounded fixall) | read→validate→transform→write pipeline |
54
54
 
55
55
  **Heuristic:** loops / retries / one-active-state → **state-machine**; pipeline / fan-out / action-per-node → **transition-flow**.
56
56
 
@@ -335,7 +335,7 @@ the workflow's actions (`shell`, custom runners) do that; this skill builds and
335
335
  (transition-flow) wins. Order the specific case before the fallback. Simple shell checks can use
336
336
  `action-ok` before an unconditional retry edge; multi-condition gates prefer a **soft status-file
337
337
  probe** (always exit 0) with ordered shell guards for PASS / FAIL / exhausted (see
338
- `.spur/workflows/basic.yaml` and `task-pipeline.yaml` quality-gate hop).
338
+ `basic.yaml` and `task-pipeline.yaml` quality-gate hop).
339
339
  4. **`env.allow` is an allowlist.** `${env.X}` resolves only if `X` is listed under `env.allow`;
340
340
  otherwise it resolves empty. A workflow that "loses" an environment value usually forgot to allow it.
341
341
  5. **Extensions are fail-closed.** The CLI loads YAML-declared extension modules itself
@@ -372,9 +372,9 @@ the workflow's actions (`shell`, custom runners) do that; this skill builds and
372
372
  custom action/guard runners, the trust-gated extension loader, and CLI-vs-library capability gaps.
373
373
  - `@gobing-ai/ts-dual-workflow-engine` README — authoritative library reference (both drivers,
374
374
  RunLifecycle, persistence, the full event map, every built-in capability).
375
- - `.spur/workflows/basic.yaml` — the canonical state-machine implement→soft-check→fixall loop
375
+ - `basic.yaml` — the canonical state-machine implement→soft-check→fixall loop
376
376
  (status-file branching + `qualityGateMaxFixAttempts`); copy real shapes from here.
377
- - `.spur/workflows/task-pipeline.yaml` — full production pipeline (precheck, quality gate, HITL,
377
+ - `task-pipeline.yaml` — full production pipeline (precheck, quality gate, HITL,
378
378
  verify, record) when you need the complete reliability pattern set.
379
379
 
380
380
  ## Platform Notes
@@ -85,7 +85,7 @@ Full procedure: **[references/planning-workflow.md](references/planning-workflow
85
85
  ```
86
86
  pick task (spur task list --json)
87
87
  → interactive omit/inline: read task-pipeline.yaml → drive actions + guards in host session
88
- → explicit/headless executor: spur workflow run .spur/workflows/task-pipeline.yaml --vars '{"wbs":"<wbs>"}'
88
+ → explicit/headless executor: spur workflow run task-pipeline.yaml --vars '{"wbs":"<wbs>"}'
89
89
  → on HITL pause: surface to operator; resume the selected driver from the paused state
90
90
  ```
91
91
 
@@ -218,10 +218,10 @@ for "what's actually in file Y" or for resources that sit outside the step seque
218
218
 
219
219
  - `plugins/sp/references/roles.md` — the Layer-1 role→tier table (`scribe` / `coder` / `reviewer` /
220
220
  `planner`, one per tier); the role vocabulary this spine's operations route under.
221
- - `.spur/workflows/task-pipeline.yaml` — the execution pipeline definition.
222
- - `.spur/workflows/idea-pipeline.yaml` — the front-half state machine (absorbed the retired
221
+ - `task-pipeline.yaml` — the execution pipeline definition.
222
+ - `idea-pipeline.yaml` — the front-half state machine (absorbed the retired
223
223
  planning-pipeline in D5-K; `/sp:dev-plan` routes here, ADR-072).
224
- - `.spur/templates/bdd/gherkin.md` — the BDD scenario template.
224
+ - `templates/bdd/gherkin.md` — the BDD scenario template.
225
225
 
226
226
  ## Platform Notes
227
227
 
@@ -148,9 +148,9 @@ contract exists to prevent.
148
148
  > Before 0398 R7 this row was unusable: the tag was required to keep `MET`, but the tag also broke
149
149
  > title matching, so the scenario read as unverified. Both halves now hold at once.
150
150
 
151
- ### What `--strict` advance requires
151
+ ### What a done advance requires
152
152
 
153
- `spur feature advance <id> --to done --strict` treats a scenario as verified only when **all** of
153
+ `spur feature advance <id> --to done` treats a scenario as verified only when **all** of
154
154
  these hold:
155
155
 
156
156
  1. A task links to the feature (`feature_id`) and is status `done`.
@@ -169,7 +169,7 @@ Author one row per scenario declared in the task's own `### Acceptance Criteria`
169
169
 
170
170
  ## Gherkin template
171
171
 
172
- Use the canonical BDD template at `.spur/templates/bdd/gherkin.md`. Key rules:
172
+ Use the canonical BDD template at `templates/bdd/gherkin.md`. Key rules:
173
173
 
174
174
  - **Given** establishes preconditions (state, setup).
175
175
  - **When** describes the single action under test.
@@ -210,7 +210,7 @@ Each resolved decision from a grilling interview (Phase 1) becomes one or more G
210
210
  | A **deferred branch** ("out of scope for now") | A `## Scope` **Out** bullet — *not* a scenario |
211
211
 
212
212
  Number scenarios `R1, R2, …` sequentially, stable forever (the title is the traceability identity
213
- key). Use the Gherkin template at `.spur/templates/bdd/gherkin.md`.
213
+ key). Use the Gherkin template at `templates/bdd/gherkin.md`.
214
214
 
215
215
  ## AC altitude (task 0584 / ADR-062)
216
216
 
@@ -68,7 +68,7 @@ each would be scope creep for one-liner procedures.
68
68
  | 2 | review | `dev-review` | `Skill()` | `sp:code-verification` (`review`) + `sp:functional-review` + `sp:code-improvement` | `[<wbs\|path>] [--agent <inline\|auto\|name>] [--focus <dims>] [--fix (deprecated)]` |
69
69
  | 3 | verify | `dev-verify` | `Skill()` | `sp:code-verification` (`verify`) | `<wbs> [--agent <inline\|auto\|name>] [--fix <none\|blockers-first\|all>] [--focus <lens>] [--bdd] [--auto] [--force] [--next] [--skip-shippable]` |
70
70
  | 3a | verifyall | `dev-verifyall` | `Skill()` → agent | `sp:spur-dev` (`verifyall`) | `--tasks <selector> [--feature <id>] [--agent <inline\|auto\|name>] [--fix <none\|blockers-first\|all>] [--focus <lens>] [--bdd] [--auto] [--force] [--next] [--json] [--skip-shippable] [--worktree [<name>]]` |
71
- | 4 | run | `dev-run` | `Skill()` | `sp:spur-dev` (`run` / `implement`) | `<wbs> [--mode <full\|implement>] [--agent <inline\|auto\|name>] [--auto] [--next] [--wrap] [--continue]` |
71
+ | 4 | run | `dev-run` | `Skill()` | `sp:spur-dev` (`run` / `implement`) | `<wbs> [--mode <full\|implement>] [--agent <inline\|auto\|name>] [--auto] [--next] [--wrap] [--continue] [--worktree [<name>]]` |
72
72
  | 5 | refine | `dev-refine` | `Skill()` | `sp:spur-dev` (`refine`) | `<wbs> [--focus <mode>] [--description <text>] [--depth <standard\|ready>] [--agent <inline\|auto\|name>] [--auto] [--next]` |
73
73
  | 5a | refineall | `dev-refineall` | `Skill()` | `sp:spur-dev` (`refineall`) | `--feature <id> \| --tasks <selector> [--focus <mode>] [--description <text>] [--depth <standard\|ready>] [--agent <inline\|auto\|name>] [--auto] [--keep-going] [--status <s>] [--json] [--worktree [<name>]]` |
74
74
  | 6 | plan | `dev-plan` | `Skill()` | `sp:spur-dev` (`plan`) | `"<description>" [--feature <id>] [--parent <feature-id>] [--agent <inline\|auto\|name>] [--skip-design] [--auto] [--approve-taste]` |
@@ -140,10 +140,10 @@ must not be changed without updating the backing skill.
140
140
  ### 4. run
141
141
 
142
142
  - **Purpose:** Run a task through the execution pipeline (full) or execute a single pipeline step (implement).
143
- - **Inputs:** `<wbs>` (required). `--mode <full|implement>` selects the execution mode. `implement` invokes `sp:code-implementation` inline by default. Interactive `full` with omitted `--agent` or explicit `--agent inline` reads `task-pipeline.yaml` and drives its actions/guards in the host session — host-controlled and non-subprocess; **omitted** `--agent` keeps 0508 eligibility (eligible `agent.run` stages dispatch once to a native subagent, host fallback), while explicit `--agent inline` is the zero-dispatch carve-out (every stage executes in the invoking session). `--agent auto`, a name, or headless invocation launches the workflow subprocess. `--agent <inline|auto|name>` selects the execution surface (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--auto` skips the HITL approve gate / confirmations and propagates down the `--next` chain. `--next` controls chaining only and never changes the mode; a pipeline implement stage must invoke `/sp:dev-run <wbs> --mode implement`. On implement success with `--next`, transition `todo → wip → testing` through the FSM (guards honored — no `--no-lifecycle`) + chain to `/sp:dev-verify <wbs> --auto --next`. On a guard failure, stop as review-pending. **Partial-deliverable rule:** if the task ships only part of its requirements (e.g. an R1/R2 split with the rest in a follow-up task), the `## Solution` section must state that explicitly and the verify verdict will record the scope. `--wrap` hands off to `/sp:dev-wrap <wbs>` after the main step; the `--agent` selector is preserved into that handoff when supplied (omission remains omission), and the wrap hop reports its own trigger-3 subprocess override per the wrap contract.
143
+ - **Inputs:** `<wbs>` (required). `--mode <full|implement>` selects the execution mode. `implement` invokes `sp:code-implementation` inline by default. Interactive `full` with omitted `--agent` or explicit `--agent inline` reads `task-pipeline.yaml` and drives its actions/guards in the host session — host-controlled and non-subprocess; **omitted** `--agent` keeps 0508 eligibility (eligible `agent.run` stages dispatch once to a native subagent, host fallback), while explicit `--agent inline` is the zero-dispatch carve-out (every stage executes in the invoking session). `--agent auto`, a name, or headless invocation launches the workflow subprocess. `--agent <inline|auto|name>` selects the execution surface (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--auto` skips the HITL approve gate / confirmations and propagates down the `--next` chain. `--next` controls chaining only and never changes the mode; a pipeline implement stage must invoke `/sp:dev-run <wbs> --mode implement`. On implement success with `--next`, transition `todo → wip → testing` through the FSM (guards honored — no `--no-lifecycle`) + chain to `/sp:dev-verify <wbs> --auto --next`. On a guard failure, stop as review-pending. **Partial-deliverable rule:** if the task ships only part of its requirements (e.g. an R1/R2 split with the rest in a follow-up task), the `## Solution` section must state that explicitly and the verify verdict will record the scope. `--worktree [<name>]` runs the full pipeline inside an isolated git worktree (create or reuse; FF-merge on success, retain on failure) — the batch lifecycle in [execution-batch.md § Worktree isolation](execution-batch.md#worktree-isolation---worktree-name) applied to a batch of one; rejected with `--mode implement`. `--wrap` hands off to `/sp:dev-wrap <wbs>` after the main step; the `--agent` selector is preserved into that handoff when supplied (omission remains omission), and the wrap hop reports its own trigger-3 subprocess override per the wrap contract.
144
144
  - **Backing:** `sp:spur-dev` skill — `run` operation for the full pipeline (the spine drives it); `sp:code-implementation` competency skill for the implement step (the spine dispatches to it).
145
145
  - **Modes:**
146
- - **`full`** (default): Drive the full pipeline — precheck → implement → test → review → approve(HITL) → verify → record → done. Interactive omit/inline uses [inline-pipeline-driver.md](inline-pipeline-driver.md) (host-controlled; eligible stages may use a native subagent); explicit/headless executor selection invokes `spur workflow run .spur/workflows/task-pipeline.yaml --vars '{"wbs":"<wbs>"}'` (with `profile: auto` when `--auto`). Both monitor/surface HITL and preserve the YAML gates. `--next` never changes this mode.
146
+ - **`full`** (default): Drive the full pipeline — precheck → implement → test → review → approve(HITL) → verify → record → done. Interactive omit/inline uses [inline-pipeline-driver.md](inline-pipeline-driver.md) (host-controlled; eligible stages may use a native subagent); explicit/headless executor selection invokes `spur workflow run task-pipeline.yaml --vars '{"wbs":"<wbs>"}'` (with `profile: auto` when `--auto`). Both monitor/surface HITL and preserve the YAML gates. `--next` never changes this mode.
147
147
  - **`implement`** (explicit `--mode implement` only): Execute only the implement step. Read the task's `## Requirements` / `## Design` / `## Plan`, write the code that satisfies them, author the `## Solution` change-map section (file:line + what/why per changed file) via `spur task update <wbs> --section Solution --from-file`. This is the implement step the pipeline calls — it is NOT the pipeline driver. With `--next`: on success, transition `todo → wip → testing` through the FSM (guards honored — no `--no-lifecycle`) + chain to `/sp:dev-verify <wbs> --auto --next`; on a guard failure, stop as review-pending. **Partial-deliverable rule:** if the task ships only part of its requirements (e.g. an R1/R2 split with the rest in a follow-up task), the `## Solution` and `## Review` sections MUST carry a `⚠️ PARTIAL` marker naming the deferred part and the follow-up WBS — see `plugins/sp/commands/dev-run.md` → "Section ownership".
148
148
  - **Delegation:** `Skill(skill="sp:spur-dev", args="run-inline $ARGUMENTS")` for interactive full omit/inline (explicit `inline` = zero-dispatch carve-out); `Skill(skill="sp:spur-dev", args="run $ARGUMENTS")` for explicit/headless full mode; `Skill(skill="sp:code-implementation", args="$ARGUMENTS")` for implement mode.
149
149
 
@@ -301,33 +301,33 @@ must not be changed without updating the backing skill.
301
301
 
302
302
  - **Purpose:** Wrap up a single completed task — capture learnings, record metrics, sync docs, and optionally advance the feature / clean up the branch.
303
303
  - **Inputs:** `<wbs>` (required, positional). `--agent <inline|auto|name>` names the wrap's model-bearing executor (default: `agent.default`); wrap is workflow-backed, so omitted `--agent` resolves to `agent.default` under objective trigger 3 (durable auditable run record required) while explicit `--agent inline` is rejected with the stable special error (headless workflow surface), `auto` tier-resolves an executor, and a name pins that executor into `vars.agent` (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--auto` skips objective confirmations (the branch-cleanup HITL gate still pauses — irreversible). `--merge` triggers branch cleanup (irreversible HITL gate).
304
- - **Backing:** `spur workflow run .spur/workflows/wrapup-pipeline.yaml` — direct workflow invocation (no backing skill; the pipeline IS the procedure).
304
+ - **Backing:** `spur workflow run wrapup-pipeline.yaml` — direct workflow invocation (no backing skill; the pipeline IS the procedure).
305
305
  - **Behavior:** Resolves the executor (`agent.default` for omit/`inline`, tier-resolved for `auto`, unchanged for a name), emits a pre-dispatch notice naming the subprocess override — `execution surface: subprocess`, `reason: trigger 3 — durable auditable run record required`, `requested agent: <selector>`, `executor: <resolved>` — then builds `--vars '{"tasks":"[\"<wbs>\"]","agent":"<resolved>","profile":"interactive|auto","merge":"true|false"}'` and invokes the wrapup pipeline. The pipeline runs: task-resolve → doc-sync → learning-capture → metrics-record → (feature-transition) → (branch-cleanup) → done. Task statuses are NOT mutated. Branch cleanup is an irreversible HITL gate that always pauses, even under `--auto`.
306
306
  - **Vars string typing:** `tasks` is a JSON-encoded **string**, not a JSON array — `spur workflow run --vars` accepts only string values (`--vars values must be strings`); the pipeline's guards parse the string with `jq length`. `jq -nc` guarantees the shape:
307
307
 
308
308
  ```bash
309
309
  VARS=$(jq -nc --arg tasks "[\"$WBS\"]" --arg agent "$AGENT" --arg profile "$PROFILE" --arg merge "$MERGE" \
310
310
  '{tasks:$tasks, agent:$agent, profile:$profile, merge:$merge}')
311
- spur workflow run .spur/workflows/wrapup-pipeline.yaml --vars "$VARS"
311
+ spur workflow run wrapup-pipeline.yaml --vars "$VARS"
312
312
  ```
313
313
 
314
- - **Delegation:** Direct `spur workflow run .spur/workflows/wrapup-pipeline.yaml` (no `Skill()` call — the command builds the vars JSON and invokes the workflow directly via `Bash`).
314
+ - **Delegation:** Direct `spur workflow run wrapup-pipeline.yaml` (no `Skill()` call — the command builds the vars JSON and invokes the workflow directly via `Bash`).
315
315
 
316
316
  ### 15. wrapall
317
317
 
318
318
  - **Purpose:** Wrap up a batch of completed tasks — capture learnings, record metrics, sync docs, advance a feature through legal lifecycle edges, and optionally clean up branches.
319
319
  - **Inputs:** `--since <iso-date>` filters done tasks by frontmatter `updated_at >= date` (v1 approximation). `--feature <id>` selects all tasks under a feature AND advances the feature through legal lifecycle edges (`backlog → active → verifying → done`, guards honored). `--status <s>` (default: `done`) filters by task status. `--agent <inline|auto|name>` names the wrap's model-bearing executor (default: `agent.default`); wrap is workflow-backed, so omitted `--agent` resolves to `agent.default` under objective trigger 3 (durable auditable run record required) while explicit `--agent inline` is rejected with the stable special error (headless workflow surface), `auto` tier-resolves an executor, and a name pins that executor into `vars.agent` (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--auto` skips objective confirmations. `--merge` triggers branch cleanup (irreversible HITL gate).
320
- - **Backing:** `spur workflow run .spur/workflows/wrapup-pipeline.yaml` — direct workflow invocation.
320
+ - **Backing:** `spur workflow run wrapup-pipeline.yaml` — direct workflow invocation.
321
321
  - **Behavior:** Resolves the task list via `spur task list --json` (filtered by `--feature`, `--since`, `--status`), resolves the executor (`agent.default` for omitted `--agent`, tier-resolved for `auto`, unchanged for a name; explicit `--agent inline` is rejected with the stable special error), emits a pre-dispatch notice naming the subprocess override — `execution surface: subprocess`, `reason: trigger 3 — durable auditable run record required`, `requested agent: <selector>`, `executor: <resolved>` — then builds `--vars '{"tasks":"[...]","feature":"<id>","agent":"<resolved>","profile":"interactive|auto","merge":"true|false"}'` and invokes the wrapup pipeline. The pipeline runs the same states as `wrap` but with the full task list and optional feature transition. Task statuses are NOT mutated. Feature transitions go through `spur feature update` so lifecycle guards apply. Branch cleanup is an irreversible HITL gate.
322
322
  - **Vars string typing:** `tasks` is a JSON-encoded **string**, not a JSON array — `--vars` values must be strings (the CLI rejects raw arrays); `jq -nc` passes the array text through as a string value:
323
323
 
324
324
  ```bash
325
325
  VARS=$(jq -nc --arg tasks "$TASKS" --arg feature "$FEATURE" --arg agent "$AGENT" --arg profile "$PROFILE" --arg merge "$MERGE" \
326
326
  '{tasks:$tasks, feature:$feature, agent:$agent, profile:$profile, merge:$merge}')
327
- spur workflow run .spur/workflows/wrapup-pipeline.yaml --vars "$VARS"
327
+ spur workflow run wrapup-pipeline.yaml --vars "$VARS"
328
328
  ```
329
329
 
330
- - **Delegation:** Direct `spur workflow run .spur/workflows/wrapup-pipeline.yaml` (no `Skill()` call — the command resolves tasks and invokes the workflow directly via `Bash`).
330
+ - **Delegation:** Direct `spur workflow run wrapup-pipeline.yaml` (no `Skill()` call — the command resolves tasks and invokes the workflow directly via `Bash`).
331
331
 
332
332
  ### 16. idea
333
333
 
@@ -337,9 +337,9 @@ must not be changed without updating the backing skill.
337
337
  - `--skip-design` — design package off (system-design + task Design).
338
338
  - `--approve-taste` — with `--auto`, skip **all** remaining taste pauses this run (idea-eval + design-approval). Sets `idea_approved=true` and `design_approved=true`.
339
339
  Aliases (prefer `--approve-taste`): `--idea-approved` → `idea_approved`; `--design-approved` → `design_approved`. There is **no** `--design` force flag.
340
- - **Backing:** `spur workflow run .spur/workflows/idea-pipeline.yaml` — direct workflow invocation.
340
+ - **Backing:** `spur workflow run idea-pipeline.yaml` — direct workflow invocation.
341
341
  - **Behavior:** Builds vars from the table above and invokes the idea pipeline. Flow: discovery → **idea-eval** (taste; reject → cancelled) → feature-create → ac-generate → feature-check → system-design (conditional) → design-approval (taste) → decompose → batch-create → handoff. STOPS at handoff — no task execution, no pipeline nesting.
342
- - **Delegation:** Direct `spur workflow run .spur/workflows/idea-pipeline.yaml` (command maps flags → vars, then `Bash`).
342
+ - **Delegation:** Direct `spur workflow run idea-pipeline.yaml` (command maps flags → vars, then `Bash`).
343
343
  - **Idea-evaluation gate:** After discovery, operator reviews `.spur/run/idea-eval-report.md` ([idea-evaluation.md](idea-evaluation.md)). Approve continues; reject/cancel → no feature. Under `--auto`, still pauses unless taste pre-cleared (`--approve-taste` / alias). Enhanced idea is a sidecar — `vars.idea` is not overwritten.
344
344
  - **Design package (`--skip-design` only):**
345
345
 
@@ -27,7 +27,7 @@ Invariant: zero `- [ ]` entries (real or placeholder) anywhere in a `done` task
27
27
  Drive the real `task-pipeline.yaml` FSM where applicable:
28
28
 
29
29
  ```
30
- spur workflow run .spur/workflows/task-pipeline.yaml --vars '{"wbs":"<wbs>"}'
30
+ spur workflow run task-pipeline.yaml --vars '{"wbs":"<wbs>"}'
31
31
  ```
32
32
 
33
33
  If you hand-walk lifecycle statuses (manual `spur task update <wbs> <status>` without the
@@ -16,7 +16,7 @@ report shape.
16
16
 
17
17
  Single-task execution is documented in **[execution-workflow.md](execution-workflow.md)** — this file
18
18
  extends that procedure to the batch case. Read that file first for the single-task pipeline contract;
19
- everything here assumes a task runs through `.spur/workflows/task-pipeline.yaml` unchanged.
19
+ everything here assumes a task runs through `task-pipeline.yaml` unchanged.
20
20
 
21
21
  **Zero engine code, zero schema changes (ADR-022).** The batch is orchestration over existing seams —
22
22
  the status vocabulary (`packages/domain/src/planning/schema.ts`), the `dependencies[]` frontmatter
@@ -232,7 +232,7 @@ invocation in its own subagent/worktree-safe context; synthesize outcomes; recov
232
232
 
233
233
  ### 3.1 Per-task execution reuses the pipeline verbatim (R4)
234
234
 
235
- Each task runs through the **standard single-task pipeline** — `.spur/workflows/task-pipeline.yaml`
235
+ Each task runs through the **standard single-task pipeline** — `task-pipeline.yaml`
236
236
  — with no new FSM and no step edits. Interactive sequential omit/inline invokes the host
237
237
  [inline pipeline driver](inline-pipeline-driver.md), which interprets that file; explicit/parallel
238
238
  execution invokes the workflow engine. The batch loop inspects the result and never redefines a
@@ -242,7 +242,7 @@ step.
242
242
  `agent.run` stages runs for many minutes. Always use `--async` + `spur workflow trace` polling:
243
243
 
244
244
  ```bash
245
- RUN=$(spur workflow run .spur/workflows/task-pipeline.yaml \
245
+ RUN=$(spur workflow run task-pipeline.yaml \
246
246
  --vars '{"wbs":"<wbs>","profile":"auto","agent":"claude"}' --async --json | jq -r '.runId')
247
247
  spur workflow trace "$RUN" --json | jq '{runId, status, terminalState}' # poll until status is terminal (done/failed)
248
248
  ```
@@ -421,6 +421,15 @@ isolated git worktree instead of the operator's working directory. This section
421
421
  lifecycle for the sequential batch loop. Per-task worktrees and `--mode parallel` isolation stay out
422
422
  of scope (task 0142 Slice A); `--worktree --mode parallel` is rejected.
423
423
 
424
+ **Single-task `dev-run` (batch of one).** `/sp:dev-run <wbs> --worktree [<name>]` runs this same
425
+ lifecycle with a one-task loop: WT-1…WT-6 apply unchanged, the marker's `command` is `dev-run` and
426
+ its `selector` is the `<wbs>` (so WT-6's command+selector fallback resolves the resume), and the
427
+ derived branch/directory slug is the WBS — `sp/run-<wbs>-<short-id>`. The WT-4 success condition
428
+ "no failed task" reads as "the task reached terminal `done` with no failed stage"; a failing gate, a
429
+ non-PASS verify verdict, or a HITL pause that ends the run take the WT-5 retention path. Only the
430
+ full pipeline is eligible — `--worktree --mode implement` is rejected (WT-7), because that mode is
431
+ the pipeline's implement stage and already runs in the driver's tree.
432
+
424
433
  One flag, two modes (see the glossary entry for the ownership rule). Bare `--worktree` is **create
425
434
  mode** (cut a fresh branch + sibling tree). `--worktree <name>` is **reuse mode** (attach to a tree
426
435
  that already exists); name resolution (§ WT-2 below) runs before WT-1. The deltas each mode applies
@@ -714,9 +723,13 @@ fallback, because `<name>` was explicit and unambiguous intent.
714
723
  ### WT-7 — Exclusions (R8)
715
724
 
716
725
  - **`dev-next`** does not get `--worktree` — it dispatches a single step; per-step isolation is not
717
- worth the worktree cost.
726
+ worth the worktree cost. `dev-run` is different: it drives a whole task pipeline, so it does get
727
+ the flag.
718
728
  - **`--mode parallel`** is rejected when combined with `--worktree` — per-task worktrees and
719
729
  parallel isolation remain task 0142 Slice A.
730
+ - **`--mode implement`** is rejected when combined with `--worktree` on `dev-run` — that mode *is*
731
+ the pipeline's implement stage (bug-742) and runs in whatever tree the driver set up; a second
732
+ worktree would split one task's evidence across two trees.
720
733
  - **No** create-with-name (`--worktree <name>` never creates; an unresolvable name is an error),
721
734
  no `--worktree-keep` variant, no auto-cleanup of stale worktrees or markers from prior runs.
722
735
 
@@ -100,6 +100,13 @@ cache-conservation discipline (`plugins/sp/skills/dogfood-testing/references/mon
100
100
  > - Without `--auto`: warn the operator before calling `spur workflow run` and prompt for confirmation or a plan-item override via `--vars '{"maxImplementPlanItems":"<count>"}'`.
101
101
  > - With `--auto`: automatically append `"maxImplementPlanItems": "<count>"` to `--vars` and log a single-line notice (e.g. `Notice: task <wbs> has N plan items (>8 default cap); injecting maxImplementPlanItems override`).
102
102
 
103
+ **`--worktree [<name>]` wraps Step 2, on either surface.** When `/sp:dev-run --mode full` carries
104
+ [`--worktree`](flag-glossary.md#flag-worktree), create or adopt the worktree *before* launching the
105
+ pipeline, `cd` into it (`spur workflow run` and the inline driver both resolve cwd from the process),
106
+ and merge-or-retain after the run reports. The lifecycle is
107
+ [execution-batch.md § Worktree isolation](execution-batch.md#worktree-isolation---worktree-name)
108
+ applied to a batch of one. Rejected with `--mode implement`.
109
+
103
110
  **Choose the surface before execution.** In an interactive `/sp:dev-run --mode full` invocation,
104
111
  omit/`--agent inline` selects the [inline pipeline driver](inline-pipeline-driver.md). Read the YAML
105
112
  at invocation time, allocate the inline run id/session provenance, record `task run-link`, and walk
@@ -120,7 +127,7 @@ VARS=$(jq -nc --arg wbs "$WBS" --arg profile auto '{wbs:$wbs, profile:$profile}'
120
127
  # optional, when --agent <name|auto> is set:
121
128
  # VARS=$(jq -nc --arg wbs "$WBS" --arg profile auto --arg agent "$AGENT" \
122
129
  # '{wbs:$wbs, profile:$profile, agent:$agent}')
123
- RUN=$(spur workflow run .spur/workflows/task-pipeline.yaml --vars "$VARS" --async --json | jq -r '.runId')
130
+ RUN=$(spur workflow run task-pipeline.yaml --vars "$VARS" --async --json | jq -r '.runId')
124
131
  spur workflow trace "$RUN" --follow --output # streams the run; --output shows the agent log surface
125
132
  ```
126
133
 
@@ -44,10 +44,11 @@ When `/sp:dev-verify <wbs>` produces a `PASS` verdict:
44
44
  - Confirm with the operator before executing `spur feature sync <id>` (in `--auto` mode, apply forward-only proposals).
45
45
 
46
46
  2. **Task missing `feature_id`**:
47
- - Check if `feature_link_declined: true` is set on the task frontmatter (`spur task show <wbs> --json`).
47
+ - Check the task content for the Q&A marker `feature_link_declined: true` (`spur task show <wbs> --json`).
48
48
  - If `feature_link_declined: true`: skip linking prompt — explicit operator deferral is preserved.
49
49
  - If unlinked and not declined: propose candidate existing features via single-task mode.
50
- - If operator explicitly declines: record `feature_link_declined: true` via `spur task update <wbs> --field feature_link_declined --value true`.
50
+ - If operator explicitly declines: preserve the existing Q&A body, append the marker, and write it through
51
+ `spur task update <wbs> --section Q&A --from-file <body-file>`.
51
52
 
52
53
  ## Single-task mode
53
54
 
@@ -200,16 +200,25 @@ restrictor. On `dev-refineall` it is instead one of a required pair — supply e
200
200
 
201
201
  Select an execution mode: `full|implement` on `dev-run` (full pipeline vs implement-only),
202
202
  `sequential|parallel` on `dev-runall` (serial vs fanned-out-independent-subset),
203
- `fan-out|review-panel|investigation` on `dev-parallel`, and the reconstruction depth
204
- `briefing|structure|architecture|design|full` on `dev-reverse`. Mode selection is explicit and orthogonal
203
+ `fan-out|review-panel|investigation` on `dev-parallel`, the reconstruction depth
204
+ `briefing|structure|architecture|design|full` on `dev-reverse`, and `daily|ad-hoc` on
205
+ `dev-find-issue` (the history-anatomy report mode). Mode selection is explicit and orthogonal
205
206
  to `--next`.
206
207
 
208
+ ### `--date <YYYY-MM-DD>` — local calendar day selection
209
+
210
+ **Anchor:** `#flag-date`.
211
+
212
+ Select a local calendar day on `dev-find-issue` (daily mode) and `dev-daily` (report date). DST-aware:
213
+ `--date <that-date>` spans the full local calendar day including any daylight-saving shift, never a
214
+ fixed 24-hour offset.
215
+
207
216
  ### `--task <wbs>` — task work or task narrowing
208
217
 
209
218
  **Anchor:** `#flag-task`.
210
219
 
211
220
  Connect the current command's result to task work, or narrow a history analysis to one task
212
- (`dev-brainstorm`, `dev-debug`, `dev-dogfood`, `dev-find-next`, `dev-history-load`). The value and
221
+ (`dev-brainstorm`, `dev-debug`, `dev-dogfood`, `dev-find-next`). The value and
213
222
  the effect are per-command — this flag is a family, not one behavior:
214
223
 
215
224
  - `dev-brainstorm` `[<feature-id>]` — **creates** one task from the chosen approach, landing at
@@ -221,7 +230,6 @@ the effect are per-command — this flag is a family, not one behavior:
221
230
  id names the target instead of offering rank 1.
222
231
  - `dev-debug` `[<wbs>]` — **attaches** findings to an existing task. Optional WBS names it.
223
232
  - `dev-dogfood` (no value) — **records** run outcomes against the task under test.
224
- - `dev-history-load` `<wbs>` — narrows the `analyze` step to that task's messages.
225
233
 
226
234
  ### `--since <ref>` — lower bound on a range
227
235
 
@@ -250,10 +258,10 @@ Upper bound on a range: a git ref on `dev-changelog` (defaults to `HEAD`), or an
250
258
 
251
259
  **Anchor:** `#flag-source`.
252
260
 
253
- Scope the operation to one agent source (`dev-find-issue`, `dev-history-load`): one of
254
- `pi|claude|codex|gemini|opencode|antigravity|openclaw|omp|grok|agy` (or `all`). On
255
- `dev-history-load` the value is forwarded to **both** `spur history import` and
256
- `spur history analyze`; on `dev-find-issue` it narrows the report scan to that source's sessions.
261
+ _(Removed 2026-08-24, HA-S1 0661.)_ The only two commands that consumed this flag;
262
+ `dev-find-issue` (now a `sp:history-anatomy` forwarder) and `dev-history-load` (deleted) no
263
+ longer declare it, so the entry is dead and removed. The underlying `spur history` surfaces
264
+ retain their own `--source` handling.
257
265
 
258
266
  ### `--status <s>` — filter by task status
259
267
 
@@ -280,7 +288,8 @@ Omit the design package (system-design satellite + task `### Design`) on plannin
280
288
 
281
289
  **Anchor:** `#flag-output`.
282
290
 
283
- Write the command's result to a file path (`dev-daily`, `dev-reverse`) instead of stdout.
291
+ Write the command's result to a file path (`dev-daily`, `dev-find-issue`, `dev-reverse`) instead of
292
+ stdout. On `dev-find-issue` (ad-hoc mode) an explicit path replaces the default run-directory write.
284
293
 
285
294
  ### `--merge` — trigger branch cleanup
286
295
 
@@ -359,8 +368,9 @@ flag sets both.
359
368
 
360
369
  **Anchor:** `#flag-worktree`.
361
370
 
362
- Batch commands only (`dev-refineall`, `dev-runall`, `dev-verifyall`): run the entire driver loop
363
- inside an isolated git worktree instead of the operator's working directory. One flag, two modes:
371
+ Batch commands plus single-task `dev-run` (`dev-refineall`, `dev-runall`, `dev-verifyall`,
372
+ `dev-run`): run the entire driver loop inside an isolated git worktree instead of the operator's
373
+ working directory. One flag, two modes:
364
374
 
365
375
  - **Create mode** — bare `--worktree` (no value). Cut a fresh branch from the current HEAD's ref,
366
376
  create a sibling worktree with a derived name, run the batch there. On a fully successful batch
@@ -385,8 +395,10 @@ merges but never removes. This keeps the continue-the-work loop stable — after
385
395
  **Value binding.** The following token is consumed as `<name>` **only when it does not begin with
386
396
  `-`**, so `--worktree --auto` is the bare create form and `--agent`/`--feature`/etc. are never
387
397
  swallowed as the name. `--worktree=<name>` is the unambiguous spelling. `/sp:dev-next` does not get
388
- the flag (single step; not worth the worktree cost), and `--worktree --mode parallel` is rejected
389
- (per-task parallel isolation stays task 0142). The full lifecycle — name resolution, dirty-tree
398
+ the flag (single *step*; not worth the worktree cost unlike `dev-run`, which isolates a whole
399
+ task pipeline), `--worktree --mode parallel` is rejected (per-task parallel isolation stays task
400
+ 0142), and `--worktree --mode implement` is rejected on `dev-run` (that mode *is* the pipeline's
401
+ implement stage and runs in the driver's tree). The full lifecycle — name resolution, dirty-tree
390
402
  precheck, creation or adoption, crash-safe marker, merge-or-retain, and `--continue` re-entry — is
391
403
  specified in [execution-batch.md § Worktree isolation](execution-batch.md#worktree-isolation---worktree-name).
392
404
  Portable `git worktree` commands only; the git mechanics are reused from
@@ -23,7 +23,7 @@ Run each checklist as an actual command sequence, not a mental confirmation:
23
23
 
24
24
  ## Task lifecycle transitions
25
25
 
26
- SSOT: `.spur/workflows/task-lifecycle.yaml`.
26
+ SSOT: `task-lifecycle.yaml`.
27
27
 
28
28
  backlog → todo → wip → testing → done
29
29
 
@@ -14,8 +14,9 @@ interactive `/sp:dev-run --mode full` or sequential `/sp:dev-runall` invocation
14
14
  passes `--agent inline`. A named executor, `--agent auto`, parallel batch mode, `spur workflow run`,
15
15
  and `spur agent run` keep the existing subprocess path.
16
16
 
17
- The project runtime definition at `.spur/workflows/task-pipeline.yaml` remains the sole FSM definition.
18
- The driver MUST read that file
17
+ The project runtime definition `task-pipeline.yaml`, resolved through the two-tier
18
+ project→bundled model (task 0648/0650, never an unbundled runtime path) — remains the sole
19
+ FSM definition. The driver MUST read that file
19
20
  at invocation time. It must not copy the state list, actions, guards, or transition order into a
20
21
  command, skill, script, or second workflow.
21
22
 
@@ -134,12 +135,14 @@ tasks (0617, 0619) because the sections were hand-written **before** the verdict
134
135
  **overwrites** a hand-authored `## Testing` with an auto-generated "No requirements recorded" table,
135
136
  plus replaces `## Solution` with a bare auto change-map. Creating the artifact first (PASS, with
136
137
  requirement rows keyed by scenario title) makes `task record` the compliant path.
138
+
137
139
  ```bash
138
140
  # verdict artifact first (shape: {wbs, verdict, requirements:[{id,status,evidence}], checks:[], source})
139
141
  # then the record hop; then re-write Testing/Solution if record's backfill is thinner than intended.
140
142
  spur task update <wbs> wip --no-lifecycle
141
143
  spur task record <wbs> --solution-from-diff --transition testing
142
144
  ```
145
+
143
146
  The engine now preserves an already-authored Testing when the verdict is UNKNOWN (task-service
144
147
  `record` fallback-only, mirroring the Review 0593 precedent) — but the order above is still the
145
148
  contract for the standard pipeline.
@@ -57,7 +57,7 @@ Gherkin template. Conventions:
57
57
  - **Scenario-title mapping:** the scenario title is the identity key for traceability edges
58
58
  to task files — keep them stable and unique.
59
59
  - Generate AC inline (current session) with the BDD template
60
- (`.spur/templates/bdd/gherkin.md`), or escalate to `spur agent run` only when a
60
+ (`templates/bdd/gherkin.md`), or escalate to `spur agent run` only when a
61
61
  [subprocess trigger](cross-cutting.md#inline-default-execution-surface) applies. **Thread
62
62
  `--agent` through** when the command forwarded one. See the
63
63
  [inline-default execution-surface contract](cross-cutting.md#inline-default-execution-surface).
@@ -220,7 +220,7 @@ skip and why. Do not pause to ask; the operator reviews the satellite afterward.
220
220
  ## Step 5.6: Idea pipeline (sp:dev-idea) — planning handoff contracts
221
221
 
222
222
  `/sp:dev-idea` runs the same planning half through the idea-pipeline workflow definition
223
- (`.spur/workflows/idea-pipeline.yaml` — symlinked to the tracked SSOT). Two
223
+ (`idea-pipeline.yaml` — resolved from an explicit project path or the bundled tree). Two
224
224
  artifacts are the contract between the workflow states and the operator:
225
225
 
226
226
  **Goal/Scope intent (feature-create).** The agent writes body-only intent files
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "version": {
13
13
  "type": "string",
14
- "description": "Config schema version (string, not integer). Current recommended: '1.1' (ADR-033 executor tiers + planning blocks). '1' remains accepted for backward compatibility."
14
+ "description": "Config schema version (string, not integer). Current recommended: '1.2' (config-1.2 layered global/project merge, ADR-033 executor tiers + planning blocks). '1' remains accepted for backward compatibility."
15
15
  },
16
16
  "name": {
17
17
  "type": "string",