@gobing-ai/spur 0.3.60 → 0.3.61

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 (92) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +2 -2
  3. package/config/config.global.yaml +11 -7
  4. package/config/corpus-baseline.json +96 -8
  5. package/config/workflow-composition-baseline.json +1 -1
  6. package/config/workflows/wayfinder-resolution.yaml +4 -6
  7. package/package.json +1 -1
  8. package/plugins/README.md +5 -4
  9. package/plugins/sp/README.md +3 -3
  10. package/plugins/sp/agents/super-planner.md +1 -1
  11. package/plugins/sp/commands/dev-pr-review.md +1 -1
  12. package/plugins/sp/commands/dev-wrap.md +2 -2
  13. package/plugins/sp/commands/dev-wrapall.md +2 -2
  14. package/plugins/sp/plugin.json +1 -1
  15. package/plugins/sp/references/roles.md +12 -9
  16. package/plugins/sp/scripts/surface-drift-inventory.ts +51 -17
  17. package/plugins/sp/scripts/validate-commands.ts +11 -4
  18. package/plugins/sp/skills/code-verification/SKILL.md +1 -1
  19. package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -1
  20. package/plugins/sp/skills/issue-finding/SKILL.md +1 -1
  21. package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
  22. package/plugins/sp/skills/pr-reviewing/SKILL.md +2 -2
  23. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +1 -1
  24. package/plugins/sp/skills/spur-cli/references/init.md +1 -1
  25. package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +1 -1
  26. package/plugins/sp/skills/spur-cli/references/workflows/operations.md +1 -1
  27. package/plugins/sp/skills/spur-cli/references/workflows.md +4 -4
  28. package/plugins/sp/skills/spur-dev/SKILL.md +4 -4
  29. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +4 -4
  30. package/plugins/sp/skills/spur-dev/references/dev-operations.md +9 -9
  31. package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +1 -1
  32. package/plugins/sp/skills/spur-dev/references/execution-batch.md +3 -3
  33. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
  34. package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +3 -2
  35. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +1 -1
  36. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +5 -2
  37. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +2 -2
  38. package/schemas/spur-config.schema.json +1 -1
  39. package/spur.js +203 -83
  40. package/web/_astro/BoardApp.BtRfVADq.js +1 -0
  41. package/web/_astro/{BoardApp.BJs3l7O8.js → BoardApp.CBIzcvqi.js} +100 -101
  42. package/web/_astro/{TaskDetail.B0l1uzsB.js → TaskDetail.D2N60cfE.js} +1 -1
  43. package/web/_astro/{arc.DPruHC3P.js → arc.D-EfJJwf.js} +1 -1
  44. package/web/_astro/{architectureDiagram-3BPJPVTR.CuOqAck6.js → architectureDiagram-3BPJPVTR.CgvTTzqp.js} +1 -1
  45. package/web/_astro/{blockDiagram-GPEHLZMM.Cxb7HDIA.js → blockDiagram-GPEHLZMM.CnOohvvn.js} +1 -1
  46. package/web/_astro/{c4Diagram-AAUBKEIU.Dw7wa-0S.js → c4Diagram-AAUBKEIU.BFcBGUy_.js} +1 -1
  47. package/web/_astro/channel.kIu33Gui.js +1 -0
  48. package/web/_astro/{chunk-2J33WTMH.MECQitzo.js → chunk-2J33WTMH.C-6MR-XY.js} +1 -1
  49. package/web/_astro/{chunk-4BX2VUAB.p3ofhIGE.js → chunk-4BX2VUAB.BN4LP5AR.js} +1 -1
  50. package/web/_astro/{chunk-55IACEB6.BmQGsPZP.js → chunk-55IACEB6.tUJ_CTtZ.js} +1 -1
  51. package/web/_astro/{chunk-727SXJPM.CwrK23OA.js → chunk-727SXJPM.BNCk-sxv.js} +1 -1
  52. package/web/_astro/{chunk-AQP2D5EJ.CUKI_QXp.js → chunk-AQP2D5EJ.BkpFIbNa.js} +1 -1
  53. package/web/_astro/{chunk-FMBD7UC4.7AtDgShM.js → chunk-FMBD7UC4.DcSZ87PN.js} +1 -1
  54. package/web/_astro/{chunk-ND2GUHAM.f_YJbTs3.js → chunk-ND2GUHAM.BkLvHFFf.js} +1 -1
  55. package/web/_astro/{chunk-QZHKN3VN.0q7V3gEg.js → chunk-QZHKN3VN.HOdgszax.js} +1 -1
  56. package/web/_astro/{classDiagram-4FO5ZUOK.C_hG3HMK.js → classDiagram-4FO5ZUOK.CWfRiY6b.js} +1 -1
  57. package/web/_astro/{classDiagram-v2-Q7XG4LA2.C_hG3HMK.js → classDiagram-v2-Q7XG4LA2.CWfRiY6b.js} +1 -1
  58. package/web/_astro/{cose-bilkent-S5V4N54A.vsaaaEMy.js → cose-bilkent-S5V4N54A.C6j4PxoN.js} +1 -1
  59. package/web/_astro/{dagre-BM42HDAG.BN7XFqQ4.js → dagre-BM42HDAG.BATZG1II.js} +1 -1
  60. package/web/_astro/{diagram-2AECGRRQ.ED6AfryZ.js → diagram-2AECGRRQ.B0f5yY6x.js} +1 -1
  61. package/web/_astro/{diagram-5GNKFQAL.Dxllzg8R.js → diagram-5GNKFQAL.Bewupqv0.js} +1 -1
  62. package/web/_astro/{diagram-KO2AKTUF.RuWppieD.js → diagram-KO2AKTUF.C23r1tB2.js} +1 -1
  63. package/web/_astro/{diagram-LMA3HP47.CL32Xn6s.js → diagram-LMA3HP47.DUErdBOR.js} +1 -1
  64. package/web/_astro/{diagram-OG6HWLK6.CUneEhqB.js → diagram-OG6HWLK6.BubmwAjb.js} +1 -1
  65. package/web/_astro/{erDiagram-TEJ5UH35.DI-92Lec.js → erDiagram-TEJ5UH35.BE_Qs5mv.js} +1 -1
  66. package/web/_astro/{flowDiagram-I6XJVG4X.69Aqa1FF.js → flowDiagram-I6XJVG4X.COWdbzon.js} +1 -1
  67. package/web/_astro/{ganttDiagram-6RSMTGT7.DdpClZpa.js → ganttDiagram-6RSMTGT7.5EGYC4MK.js} +1 -1
  68. package/web/_astro/{gitGraphDiagram-PVQCEYII.xqWfkvB4.js → gitGraphDiagram-PVQCEYII.bUUV7iEw.js} +1 -1
  69. package/web/_astro/index.Cestp9nh.css +1 -0
  70. package/web/_astro/{infoDiagram-5YYISTIA.B3G5sfKm.js → infoDiagram-5YYISTIA.CbiInFvz.js} +1 -1
  71. package/web/_astro/{ishikawaDiagram-YF4QCWOH.ahVNsoAQ.js → ishikawaDiagram-YF4QCWOH.CB7lrSsJ.js} +1 -1
  72. package/web/_astro/{journeyDiagram-JHISSGLW.PmFHLc-X.js → journeyDiagram-JHISSGLW.rhGZgWt8.js} +1 -1
  73. package/web/_astro/{kanban-definition-UN3LZRKU.Co1qOPTd.js → kanban-definition-UN3LZRKU.DPeZD_lP.js} +1 -1
  74. package/web/_astro/{linear.DoHZ-iRt.js → linear.l60Nyp5b.js} +1 -1
  75. package/web/_astro/{mermaid.core.DNRElYN2.js → mermaid.core.DmtMJcmL.js} +4 -4
  76. package/web/_astro/{mindmap-definition-RKZ34NQL.CdfJZidJ.js → mindmap-definition-RKZ34NQL.Cc47AcCn.js} +1 -1
  77. package/web/_astro/{pieDiagram-4H26LBE5.C1A8dby4.js → pieDiagram-4H26LBE5.B8cN-S9g.js} +1 -1
  78. package/web/_astro/{quadrantDiagram-W4KKPZXB.NmZqjG_c.js → quadrantDiagram-W4KKPZXB.DY1FN89L.js} +1 -1
  79. package/web/_astro/{requirementDiagram-4Y6WPE33.tY36zYtK.js → requirementDiagram-4Y6WPE33.CnM6VbV8.js} +1 -1
  80. package/web/_astro/{sankeyDiagram-5OEKKPKP.rOEGZYjo.js → sankeyDiagram-5OEKKPKP.B9DcGfNV.js} +1 -1
  81. package/web/_astro/{sequenceDiagram-3UESZ5HK.Dpnw3S9J.js → sequenceDiagram-3UESZ5HK.ymxaNlAY.js} +1 -1
  82. package/web/_astro/{stateDiagram-AJRCARHV.DGpvQ3Wz.js → stateDiagram-AJRCARHV.DDOJ3d8P.js} +1 -1
  83. package/web/_astro/{stateDiagram-v2-BHNVJYJU.CbwQdEfu.js → stateDiagram-v2-BHNVJYJU.Ck0Nb_KY.js} +1 -1
  84. package/web/_astro/{timeline-definition-PNZ67QCA.DAYUpUJT.js → timeline-definition-PNZ67QCA.BNOvZwAN.js} +1 -1
  85. package/web/_astro/{vennDiagram-CIIHVFJN.C7JCCd6-.js → vennDiagram-CIIHVFJN.D3k5ivSF.js} +1 -1
  86. package/web/_astro/{wardley-L42UT6IY.BGgwOH5_.js → wardley-L42UT6IY.BylaxVqn.js} +1 -1
  87. package/web/_astro/{wardleyDiagram-YWT4CUSO.oIZqzI2l.js → wardleyDiagram-YWT4CUSO.HLNtFUm9.js} +1 -1
  88. package/web/_astro/{xychartDiagram-2RQKCTM6.DohcJzqm.js → xychartDiagram-2RQKCTM6.B-WooKSU.js} +1 -1
  89. package/web/index.html +2 -2
  90. package/web/_astro/BoardApp.D8InuCYx.js +0 -1
  91. package/web/_astro/channel.XCf1DcsL.js +0 -1
  92. package/web/_astro/index.DJl2RAVZ.css +0 -1
@@ -146,7 +146,7 @@ blank Design before implement (`/sp:dev-refine` / `dev-refineall`).
146
146
 
147
147
  The `template` field is the **single variant axis** (TASK_VARIANTS): it selects the section
148
148
  layout (the `section-matrix.yaml` variant), the scaffold body file
149
- (`.spur/templates/task/<variant>.md`), and is written to the task's `template:` frontmatter.
149
+ (`.spur/tasks/templates/<variant>.md`), and is written to the task's `template:` frontmatter.
150
150
  Which sections actually appear is **status-driven** by the runtime matrix — query
151
151
  `spur task sections <wbs> list --json` rather than assuming a fixed list — pick the variant by
152
152
  *purpose*, not by a section checklist.
@@ -64,7 +64,7 @@ fails, STOP and report the gap rather than papering over it with customization:
64
64
  ```
65
65
  spur status
66
66
  spur task create "__probe__" --template standard # confirms task template + matrix resolve
67
- spur workflow validate .spur/workflows/task-pipeline.yaml
67
+ spur workflow validate task-pipeline.yaml
68
68
  ```
69
69
 
70
70
  ### Phase 1.6 — Rule glob adaptation (LLM-as-judge)
@@ -12,7 +12,7 @@ Read this before writing `Solution`, `Testing`, or `Review`. Section **writers**
12
12
  evidence section (F92 0593 R1): implement owns `Solution`, the review coordinator
13
13
  (`/sp:dev-review`) owns `Review`, and `spur task record` owns `Testing` (bare-`## Review`
14
14
  backfill is fallback-only). The owning implementations are
15
- `.spur/workflows/task-lifecycle.yaml`, `hasPopulatedPriorityTable()` in
15
+ `task-lifecycle.yaml`, `hasPopulatedPriorityTable()` in
16
16
  `packages/app/src/services/task-check.ts`, the verdict normalizers in
17
17
  `packages/app/src/services/task-record.ts`, and `TASK_CANONICAL_SECTIONS` in
18
18
  `packages/domain/src/planning/markdown-document.ts`.
@@ -29,7 +29,7 @@ Authored workflows default to a project-local directory, grouped by purpose:
29
29
 
30
30
  A `--file <path>` argument overrides the default. Keep one workflow per file, named for what it does
31
31
  (`approval.yaml`, `import-file.yaml`), not for its mode. The canonical example
32
- (`.spur/workflows/basic.yaml`) lives here; copy real schema shapes from it rather than from a
32
+ (`basic.yaml`) lives here; copy real schema shapes from it rather than from a
33
33
  half-remembered snippet.
34
34
 
35
35
  ## Sub-procedure: mode-selection gate
@@ -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
 
@@ -143,7 +143,7 @@ must not be changed without updating the backing skill.
143
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.
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
  ```
@@ -120,7 +120,7 @@ VARS=$(jq -nc --arg wbs "$WBS" --arg profile auto '{wbs:$wbs, profile:$profile}'
120
120
  # optional, when --agent <name|auto> is set:
121
121
  # VARS=$(jq -nc --arg wbs "$WBS" --arg profile auto --arg agent "$AGENT" \
122
122
  # '{wbs:$wbs, profile:$profile, agent:$agent}')
123
- RUN=$(spur workflow run .spur/workflows/task-pipeline.yaml --vars "$VARS" --async --json | jq -r '.runId')
123
+ RUN=$(spur workflow run task-pipeline.yaml --vars "$VARS" --async --json | jq -r '.runId')
124
124
  spur workflow trace "$RUN" --follow --output # streams the run; --output shows the agent log surface
125
125
  ```
126
126
 
@@ -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
 
@@ -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",