@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/config.example.yaml +2 -2
- package/config/config.global.yaml +11 -7
- package/config/corpus-baseline.json +96 -8
- package/config/workflow-composition-baseline.json +1 -1
- package/config/workflows/wayfinder-resolution.yaml +4 -6
- package/package.json +1 -1
- package/plugins/README.md +5 -4
- package/plugins/sp/README.md +3 -3
- package/plugins/sp/agents/super-planner.md +1 -1
- package/plugins/sp/commands/dev-pr-review.md +1 -1
- package/plugins/sp/commands/dev-wrap.md +2 -2
- package/plugins/sp/commands/dev-wrapall.md +2 -2
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +12 -9
- package/plugins/sp/scripts/surface-drift-inventory.ts +51 -17
- package/plugins/sp/scripts/validate-commands.ts +11 -4
- package/plugins/sp/skills/code-verification/SKILL.md +1 -1
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -1
- package/plugins/sp/skills/issue-finding/SKILL.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
- package/plugins/sp/skills/pr-reviewing/SKILL.md +2 -2
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +1 -1
- package/plugins/sp/skills/spur-cli/references/init.md +1 -1
- package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows/operations.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows.md +4 -4
- package/plugins/sp/skills/spur-dev/SKILL.md +4 -4
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +4 -4
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +9 -9
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +1 -1
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +3 -3
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
- package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +3 -2
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +1 -1
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +5 -2
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +2 -2
- package/schemas/spur-config.schema.json +1 -1
- package/spur.js +203 -83
- package/web/_astro/BoardApp.BtRfVADq.js +1 -0
- package/web/_astro/{BoardApp.BJs3l7O8.js → BoardApp.CBIzcvqi.js} +100 -101
- package/web/_astro/{TaskDetail.B0l1uzsB.js → TaskDetail.D2N60cfE.js} +1 -1
- package/web/_astro/{arc.DPruHC3P.js → arc.D-EfJJwf.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.CuOqAck6.js → architectureDiagram-3BPJPVTR.CgvTTzqp.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.Cxb7HDIA.js → blockDiagram-GPEHLZMM.CnOohvvn.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.Dw7wa-0S.js → c4Diagram-AAUBKEIU.BFcBGUy_.js} +1 -1
- package/web/_astro/channel.kIu33Gui.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.MECQitzo.js → chunk-2J33WTMH.C-6MR-XY.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.p3ofhIGE.js → chunk-4BX2VUAB.BN4LP5AR.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.BmQGsPZP.js → chunk-55IACEB6.tUJ_CTtZ.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.CwrK23OA.js → chunk-727SXJPM.BNCk-sxv.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.CUKI_QXp.js → chunk-AQP2D5EJ.BkpFIbNa.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.7AtDgShM.js → chunk-FMBD7UC4.DcSZ87PN.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.f_YJbTs3.js → chunk-ND2GUHAM.BkLvHFFf.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.0q7V3gEg.js → chunk-QZHKN3VN.HOdgszax.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.C_hG3HMK.js → classDiagram-4FO5ZUOK.CWfRiY6b.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.C_hG3HMK.js → classDiagram-v2-Q7XG4LA2.CWfRiY6b.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.vsaaaEMy.js → cose-bilkent-S5V4N54A.C6j4PxoN.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.BN7XFqQ4.js → dagre-BM42HDAG.BATZG1II.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.ED6AfryZ.js → diagram-2AECGRRQ.B0f5yY6x.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.Dxllzg8R.js → diagram-5GNKFQAL.Bewupqv0.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.RuWppieD.js → diagram-KO2AKTUF.C23r1tB2.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.CL32Xn6s.js → diagram-LMA3HP47.DUErdBOR.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.CUneEhqB.js → diagram-OG6HWLK6.BubmwAjb.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.DI-92Lec.js → erDiagram-TEJ5UH35.BE_Qs5mv.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.69Aqa1FF.js → flowDiagram-I6XJVG4X.COWdbzon.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.DdpClZpa.js → ganttDiagram-6RSMTGT7.5EGYC4MK.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.xqWfkvB4.js → gitGraphDiagram-PVQCEYII.bUUV7iEw.js} +1 -1
- package/web/_astro/index.Cestp9nh.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.B3G5sfKm.js → infoDiagram-5YYISTIA.CbiInFvz.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.ahVNsoAQ.js → ishikawaDiagram-YF4QCWOH.CB7lrSsJ.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.PmFHLc-X.js → journeyDiagram-JHISSGLW.rhGZgWt8.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.Co1qOPTd.js → kanban-definition-UN3LZRKU.DPeZD_lP.js} +1 -1
- package/web/_astro/{linear.DoHZ-iRt.js → linear.l60Nyp5b.js} +1 -1
- package/web/_astro/{mermaid.core.DNRElYN2.js → mermaid.core.DmtMJcmL.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.CdfJZidJ.js → mindmap-definition-RKZ34NQL.Cc47AcCn.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.C1A8dby4.js → pieDiagram-4H26LBE5.B8cN-S9g.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.NmZqjG_c.js → quadrantDiagram-W4KKPZXB.DY1FN89L.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.tY36zYtK.js → requirementDiagram-4Y6WPE33.CnM6VbV8.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.rOEGZYjo.js → sankeyDiagram-5OEKKPKP.B9DcGfNV.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.Dpnw3S9J.js → sequenceDiagram-3UESZ5HK.ymxaNlAY.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DGpvQ3Wz.js → stateDiagram-AJRCARHV.DDOJ3d8P.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.CbwQdEfu.js → stateDiagram-v2-BHNVJYJU.Ck0Nb_KY.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.DAYUpUJT.js → timeline-definition-PNZ67QCA.BNOvZwAN.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.C7JCCd6-.js → vennDiagram-CIIHVFJN.D3k5ivSF.js} +1 -1
- package/web/_astro/{wardley-L42UT6IY.BGgwOH5_.js → wardley-L42UT6IY.BylaxVqn.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.oIZqzI2l.js → wardleyDiagram-YWT4CUSO.HLNtFUm9.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DohcJzqm.js → xychartDiagram-2RQKCTM6.B-WooKSU.js} +1 -1
- package/web/index.html +2 -2
- package/web/_astro/BoardApp.D8InuCYx.js +0 -1
- package/web/_astro/channel.XCf1DcsL.js +0 -1
- 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
|
|
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
|
|
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
|
-
|
|
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
|
-
(
|
|
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 (
|
|
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
|
-
|
|
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
|
-
-
|
|
375
|
+
- `basic.yaml` — the canonical state-machine implement→soft-check→fixall loop
|
|
376
376
|
(status-file branching + `qualityGateMaxFixAttempts`); copy real shapes from here.
|
|
377
|
-
-
|
|
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
|
|
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
|
-
-
|
|
222
|
-
-
|
|
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
|
-
-
|
|
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
|
|
151
|
+
### What a done advance requires
|
|
152
152
|
|
|
153
|
-
`spur feature advance <id> --to done
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
311
|
+
spur workflow run wrapup-pipeline.yaml --vars "$VARS"
|
|
312
312
|
```
|
|
313
313
|
|
|
314
|
-
- **Delegation:** Direct `spur workflow run
|
|
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
|
|
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
|
|
327
|
+
spur workflow run wrapup-pipeline.yaml --vars "$VARS"
|
|
328
328
|
```
|
|
329
329
|
|
|
330
|
-
- **Delegation:** Direct `spur workflow run
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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** —
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
|
@@ -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
|
|
18
|
-
|
|
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
|
-
(
|
|
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
|
-
(
|
|
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.
|
|
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",
|