@gobing-ai/spur 0.4.31 → 0.4.34
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.global.yaml +1 -4
- package/config/decisions/task-pipeline.yaml +1 -29
- package/config/rules/boundary/sp-runtime-path.yaml +0 -2
- package/config/rules/strict/runtime-boundaries.yaml +2 -12
- package/config/rules/structure/protected-files.yaml +0 -3
- package/config/rules/surface/check-cli-surface.yaml +1 -2
- package/config/workflow-candidates.json +1 -1
- package/config/workflows/idea-pipeline.yaml +1 -1
- package/config/workflows/task-pipeline.yaml +53 -185
- package/package.json +1 -1
- package/plugins/sp/agents/super-reviewer.md +18 -60
- package/plugins/sp/commands/dev-fixall.md +0 -7
- package/plugins/sp/commands/dev-review.md +1 -1
- package/plugins/sp/commands/dev-run.md +8 -3
- package/plugins/sp/commands/dev-runall.md +7 -4
- package/plugins/sp/commands/dev-verify.md +0 -10
- package/plugins/sp/commands/dev-verifyall.md +0 -5
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/skills/code-implementation/SKILL.md +1 -3
- package/plugins/sp/skills/code-verification/SKILL.md +11 -41
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +18 -119
- package/plugins/sp/skills/issue-finding/SKILL.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +0 -7
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +1 -6
- package/plugins/sp/skills/spur-cli/references/decision.md +3 -6
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +0 -28
- package/plugins/sp/skills/spur-cli/references/tasks.md +9 -7
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +5 -12
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +2 -3
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +4 -4
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +4 -5
- package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +9 -5
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +4 -5
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
- package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +34 -0
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +14 -1
- package/spur.js +1437 -4409
- package/web/_astro/{BoardApp.CuCuw0lw.js → BoardApp.BzY_krKQ.js} +1 -1
- package/web/_astro/{BoardApp.BGGDrfHl.js → BoardApp.CIImQFjG.js} +3 -3
- package/web/_astro/{TaskDetail.DWXct9_X.js → TaskDetail.c48Pnba6.js} +1 -1
- package/web/_astro/{arc.BxG3NS1o.js → arc.CpU6Cddr.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.BxaiM2Hv.js → architectureDiagram-3BPJPVTR.CaXT9ZEz.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.DJ3r6SdD.js → blockDiagram-GPEHLZMM.Cnv3IsW9.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.BkzpXBQs.js → c4Diagram-AAUBKEIU.VO_hjv9n.js} +1 -1
- package/web/_astro/channel.DrtdR7d_.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.DI7UanTc.js → chunk-2J33WTMH.BOunhbrU.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.C2uLhAlQ.js → chunk-4BX2VUAB.Brg-Gmb2.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.KwNI2kxL.js → chunk-55IACEB6.BqF9dxiC.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.CHZUthkg.js → chunk-727SXJPM.CEIGJZdc.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.DLr4QNJo.js → chunk-AQP2D5EJ.BxXI0bx9.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.B1G8WrnE.js → chunk-FMBD7UC4.CveXCF83.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.CzsA-SkD.js → chunk-ND2GUHAM.DwKjp403.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.DAvBQYli.js → chunk-QZHKN3VN.DgwjHrXx.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.Cddmz8Ze.js → classDiagram-4FO5ZUOK.BcVv8Qmo.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.Cddmz8Ze.js → classDiagram-v2-Q7XG4LA2.BcVv8Qmo.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CKEu7KRX.js → cose-bilkent-S5V4N54A.28xfMBER.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.-B4Cy_Vl.js → cynefin-OW5HDTMX.BAFHBcJj.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.bLxFvI-t.js → dagre-BM42HDAG.DzR6wa9Z.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DAHU0t5h.js → diagram-2AECGRRQ.IpFlr4yd.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.DFciwCNk.js → diagram-5GNKFQAL.DGNU2pOL.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.BvH0dGId.js → diagram-KO2AKTUF.D_wP6t4w.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.BgVlskRO.js → diagram-LMA3HP47.B0DMC97s.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.BpurMISo.js → diagram-OG6HWLK6.DQXmNEBs.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.SDj5bUMU.js → erDiagram-TEJ5UH35.BZ0VPjjp.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.Bm5U58FE.js → flowDiagram-I6XJVG4X.zu5gJs9Z.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.CnMnds77.js → ganttDiagram-6RSMTGT7.DYy6LDqD.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.BQUwwyWo.js → gitGraphDiagram-PVQCEYII.C6c_wPdO.js} +1 -1
- package/web/_astro/index.C4tUn4AU.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.BiSKdORH.js → infoDiagram-5YYISTIA.C3bQPQl8.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.Br69sBTI.js → ishikawaDiagram-YF4QCWOH.Cc1D58oG.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.C39WX1W8.js → journeyDiagram-JHISSGLW.CY51-lNM.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.DppWcbSX.js → kanban-definition-UN3LZRKU.D_3v92y6.js} +1 -1
- package/web/_astro/{linear.DeivTDuc.js → linear.C6BrJ38s.js} +1 -1
- package/web/_astro/{mermaid.core.Dixrjrnj.js → mermaid.core.DO9lF20B.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.BWIQ2MWG.js → mindmap-definition-RKZ34NQL.BMiM91P6.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.vvtHpfT7.js → pieDiagram-4H26LBE5.CcgIgRlR.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.9c-T6qCy.js → quadrantDiagram-W4KKPZXB.CM1CzrHl.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.9ZuRw-kn.js → requirementDiagram-4Y6WPE33.CQvQ1E8r.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.CTIWteEl.js → sankeyDiagram-5OEKKPKP.D-b1ONCV.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.DEvu4vLL.js → sequenceDiagram-3UESZ5HK.BQzFGYtH.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.Bxvsgk-_.js → stateDiagram-AJRCARHV.DiCukZ7I.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.CVuog5yY.js → stateDiagram-v2-BHNVJYJU.4Iut-DMk.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.CpPItB3E.js → timeline-definition-PNZ67QCA.BKQiLF24.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.C7eKaLRK.js → vennDiagram-CIIHVFJN.CyeSCofx.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.DWXHT_CW.js → wardleyDiagram-YWT4CUSO.B140ei48.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DOsrNQOF.js → xychartDiagram-2RQKCTM6.DjPyVoO1.js} +1 -1
- package/web/index.html +2 -2
- package/config/rules/structure/scratch-evidence-pointer.yaml +0 -35
- package/web/_astro/channel.CYWRkoDI.js +0 -1
- package/web/_astro/index.CKtaGArK.css +0 -1
|
@@ -126,14 +126,8 @@ scenario, it matches by title. Rules:
|
|
|
126
126
|
Registered user can log in with email and password" is traceable.
|
|
127
127
|
- **No synonyms in cross-references.** The title in the feature file and the title in the
|
|
128
128
|
task's AC reference must be byte-identical.
|
|
129
|
-
- **Avoid gate vocabulary in titles
|
|
130
|
-
|
|
131
|
-
case (dotted action kinds such as `hitl.confirm` are fine);
|
|
132
|
-
ambiguous words (`approval`, `approved`, `merged`) warn only when the same sentence also carries
|
|
133
|
-
a gating cue (`until`, `after`, `once`, `before`, `pending`, `blocked`, `wait for`, `requires`)
|
|
134
|
-
— plain composition prose like "the stages merged back into one step" stays silent. Task AC
|
|
135
|
-
bullets copy scenario titles verbatim, so a title using the unconditional tokens fails every
|
|
136
|
-
child task. Write "pause for an operator answer" instead of "HITL approval".
|
|
129
|
+
- **Avoid gate vocabulary in titles** (`HITL`, `merge event`, `GATED`, `capstone`): it reads as a
|
|
130
|
+
dependency nothing declares. Convention only — nothing checks it. Write "pause for an operator answer" instead of "HITL approval".
|
|
137
131
|
|
|
138
132
|
## Verdict AC ↔ feature scenario linkage
|
|
139
133
|
|
|
@@ -174,7 +168,7 @@ Any of the four may additionally carry a **bracket tag** in any position — `[d
|
|
|
174
168
|
`Scenario: [advisory] Foo`. Tags are stripped before matching (0398 R7), so tagging never breaks
|
|
175
169
|
the linkage.
|
|
176
170
|
|
|
177
|
-
Task-side,
|
|
171
|
+
Task-side, a fifth declared id source is accepted — a **bold-trajectory
|
|
178
172
|
paragraph**: a whole-line `**AC id…**` paragraph inside the task's `### Acceptance Criteria`
|
|
179
173
|
block (task 0817 R3). The id up to its first `:` and the paragraph's full spelling are both
|
|
180
174
|
declared; two bold spans on one line are not a declaration (an interpolated bold id stays
|
|
@@ -190,13 +184,12 @@ unmatchable):
|
|
|
190
184
|
|
|
191
185
|
### A bullet's bold head is its id
|
|
192
186
|
|
|
193
|
-
|
|
187
|
+
`spur task verdict` treats the bold span of a single-line criterion bullet
|
|
194
188
|
(`- **AC2 — The roster runtime is gone (R3).** Given …, when …, then …`) and its head before the
|
|
195
189
|
first ` — ` or `:` — so answer rows may key `AC2` or `AC2 — The roster runtime is gone (R3).`. Keep
|
|
196
190
|
at least one answer row keyed to the verbatim feature scenario title the task graduates, and keep
|
|
197
191
|
requirement ids in the template-taught corpus form, `- [ ] R1. <text>`: that (or an unbolded `R1.`
|
|
198
|
-
variant) is what the task-local binding loop parses — bold wrapping (`**R1**`)
|
|
199
|
-
`L3.requirements-format` ratio but binds nothing — and a colon after the bold span still silently
|
|
192
|
+
variant) is what the task-local binding loop parses — bold wrapping (`**R1**`) binds nothing — and a colon after the bold span still silently
|
|
200
193
|
drops the whole section to a warning. Bold AC heads are likewise a verdict-table id form, not the AC
|
|
201
194
|
authoring form: author new AC rows in the plain `- [ ] AC1 —` / `Scenario: AC1 —` shapes.
|
|
202
195
|
|
|
@@ -412,9 +412,8 @@ loop?**
|
|
|
412
412
|
|
|
413
413
|
- **External evidence** — evidence that lives outside `spur`'s working tree uses the frozen non-anchor
|
|
414
414
|
form `origin`path`line N` (line OUTSIDE the backticks), e.g.
|
|
415
|
-
`@gobing-ai/ts-llm-jsonl-importer`src/mappers.ts`line 481`.
|
|
416
|
-
|
|
417
|
-
citing an in-repo file in the external form still reports (R1/R2). See `ac-style-guide.md` and the
|
|
415
|
+
`@gobing-ai/ts-llm-jsonl-importer`src/mappers.ts`line 481`. In-repo evidence uses the repo-relative backtick form `path:line`. Reviewer-facing convention —
|
|
416
|
+
nothing resolves anchors mechanically. See `ac-style-guide.md` and the
|
|
418
417
|
`code-verification` skill for when each applies.
|
|
419
418
|
|
|
420
419
|
**Why this is a rule and not a preference.** A decision filed as a task sits in `spur task list` and
|
|
@@ -73,7 +73,7 @@ each would be scope creep for one-liner procedures.
|
|
|
73
73
|
| 2 | review | `dev-review` | `Skill()` | `sp:code-verification` (`review`) + `sp:functional-review` + `sp:code-improvement` | `[--tasks <selector> \| --feature <id>[,<id>] \| --scope <path>[,<path>]] [--agent <inline\|auto\|name>] [--focus <dims>] [--triage] [--worktree [<name>]] [--auto]` |
|
|
74
74
|
| 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]` |
|
|
75
75
|
| 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>]]` |
|
|
76
|
-
| 4 | run | `dev-run` | `Skill()` | `sp:spur-dev` (`run` / `implement`) | `<wbs> [--mode <full\|implement>] [--agent <inline\|auto\|name>] [--auto] [--next] [--wrap] [--continue] [--worktree [<name>]] [--no-summary]` |
|
|
76
|
+
| 4 | run | `dev-run` | `Skill()` | `sp:spur-dev` (`run` / `implement`) | `<wbs> [--mode <full\|implement>] [--agent <inline\|auto\|name>] [--auto] [--next] [--wrap] [--wrap-pr] [--continue] [--worktree [<name>]] [--no-summary]` |
|
|
77
77
|
| 5 | refine | `dev-refine` | `Skill()` | `sp:spur-dev` (`refine`) | `<wbs> [--focus <mode>] [--description <text>] [--depth <standard\|ready>] [--agent <inline\|auto\|name>] [--auto] [--next]` |
|
|
78
78
|
| 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>]]` |
|
|
79
79
|
| 6 | plan | `dev-plan` | `Skill()` | host executor (`idea-pipeline`) or async workflow | `"<description>" [--feature <id>] [--parent <feature-id>] [--skip-design] [--agent <inline\|auto\|name>] [--auto]` |
|
|
@@ -86,7 +86,7 @@ each would be scope creep for one-liner procedures.
|
|
|
86
86
|
| 11b | job-resume | `dev-job-resume` | `Skill()` | `sp:spur-dev` (`job-resume`) | `--file <path>` |
|
|
87
87
|
| 12 | brainstorm | `dev-brainstorm` | `Skill()` | `sp:brainstorm` (`dev-brainstorm`) | `<topic> [--depth <basic\|detailed\|comprehensive>] [--options <n>] [--agent <inline\|auto\|name>] [--skip-discovery] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]` |
|
|
88
88
|
| 12a | find-way | `dev-find-way` | `Skill()` | `sp:wayfinder` (worktree-isolated) | `<idea> \| <feature-id> [<wbs>] [--agent <inline\|auto\|name>] [--auto] [--worktree [<name>]] [--wrap]` |
|
|
89
|
-
| 13 | runall | `dev-runall` | `Skill()` → agent | `sp:spur-dev` (`runall`) → `sp:super-planner` | `--tasks <selector> [--feature <id>] [--mode <sequential\|parallel\|auto>] [--concurrency <n>] [--keep-going] [--auto] [--agent <inline\|auto\|name>] [--json] [--wrap] [--next] [--continue] [--worktree [<name>]] [--no-summary] [--defer-gate]` |
|
|
89
|
+
| 13 | runall | `dev-runall` | `Skill()` → agent | `sp:spur-dev` (`runall`) → `sp:super-planner` | `--tasks <selector> [--feature <id>] [--mode <sequential\|parallel\|auto>] [--concurrency <n>] [--keep-going] [--auto] [--agent <inline\|auto\|name>] [--json] [--wrap] [--wrap-pr] [--next] [--continue] [--worktree [<name>]] [--no-summary] [--defer-gate]` |
|
|
90
90
|
| 14 | wrap | `dev-wrap` | `Skill()` | `spur workflow run` (wrapup-pipeline) | `<wbs> [--agent <inline\|auto\|name>] [--auto] [--merge] [--dry-run]` |
|
|
91
91
|
| 15 | wrapall | `dev-wrapall` | `Skill()` | `spur workflow run` (wrapup-pipeline) | `[--since <iso>] [--feature <id>] [--status <s>] [--agent <inline\|auto\|name>] [--auto] [--merge] [--dry-run]` |
|
|
92
92
|
| 16 | idea | `dev-idea` | `Skill()` | host executor (`idea-pipeline`) or async workflow | `"<idea>" \| --from-file <path> [--skip-design] [--agent <inline\|auto\|name>] [--auto]` |
|
|
@@ -156,7 +156,7 @@ must not be changed without updating the backing skill.
|
|
|
156
156
|
### 4. run
|
|
157
157
|
|
|
158
158
|
- **Purpose:** Run a task through the execution pipeline (full) or execute a single pipeline step (implement).
|
|
159
|
-
- **Inputs:** `<wbs>` (required). `--mode <full|implement>` selects the execution mode. `implement` invokes `sp:code-implementation` inline by default. Interactive `full` resolves the selector uniformly (task 0687): omit ≡ explicit `--agent inline`; full mode runs `task-pipeline.yaml` on the host executor (`spur workflow run … executor=host` → work item → `spur workflow continue`) — host-controlled and non-subprocess, with 0508 eligibility applying to the resolved-inline selector (eligible `agent.run` stages dispatch once to a native subagent, host fallback)). `--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`. `--no-summary` skips the [execution summary](#execution-summary) printed after a full-mode run. `--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.
|
|
159
|
+
- **Inputs:** `<wbs>` (required). `--mode <full|implement>` selects the execution mode. `implement` invokes `sp:code-implementation` inline by default. Interactive `full` resolves the selector uniformly (task 0687): omit ≡ explicit `--agent inline`; full mode runs `task-pipeline.yaml` on the host executor (`spur workflow run … executor=host` → work item → `spur workflow continue`) — host-controlled and non-subprocess, with 0508 eligibility applying to the resolved-inline selector (eligible `agent.run` stages dispatch once to a native subagent, host fallback)). `--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`. `--no-summary` skips the [execution summary](#execution-summary) printed after a full-mode run. `--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. `--wrap-pr` runs the wrap hop on `$BRANCH`, commits close-out writes, pushes the branch to `origin`, and opens a Pull Request targeting `$BASE_REF` via `gh pr create` (`WT-PR`); mutually exclusive with `--wrap`.
|
|
160
160
|
- **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).
|
|
161
161
|
- **Modes:**
|
|
162
162
|
- **`full`** (default): Drive the full pipeline — precheck → implement → gate ⇄ remediate → review → done, with the repair, stop and approval routes taken from decision rows ([decision-points.md](decision-points.md)). Interactive omit/inline runs `spur workflow run task-pipeline.yaml --vars '{"wbs":"<wbs>","executor":"host"}'` and performs each returned work item (eligible stages may use a native subagent); explicit/headless executor selection runs the same definition without the `executor` var (with `profile: auto` when `--auto`). Both monitor/surface HITL and preserve the YAML gates. `--next` never changes this mode.
|
|
@@ -481,7 +481,7 @@ gate commands, pending questions and approval requirements.>
|
|
|
481
481
|
### 13. runall
|
|
482
482
|
|
|
483
483
|
- **Purpose:** Run a batch of tasks through their pipelines in dependency-correct order — resolve a set, topo-sort, run each via `task-pipeline.yaml`, inspect verdicts, apply the failure policy, emit a batch report.
|
|
484
|
-
- **Inputs:** `--tasks <selector>` (required — explicit WBS list, status pseudo-list, `feature:<id>`, or `ready`). `--mode <sequential|parallel>` (default `sequential`; `parallel` fans out a proven-independent subset per `execution-batch.md` § Parallel Execution). `--keep-going` skips a failed task's in-batch dependents and continues independents (default off; `--auto` implies `--keep-going`, so an unattended batch never stops for a human — 1318 R1). `--auto` sets `profile=auto` on each per-task run (skips the HITL approve gate). `--feature <id>` is sugar for `--tasks feature:<id>`; when the effective selector is feature-derived, the batch runs `spur feature check <id> --fix --json` then `spur feature check <id> --strict --json` **once** before task resolution — a non-zero strict check aborts with verdict `aborted`, zero attempted tasks, and the structured findings (task 0510 R2); scoped: `L4.scenario-unverified` and `L4.verifying-incomplete-tasks` (expected pre-run states of a not-yet-run or reopened feature) are reported verbatim but do not abort — the non-aborting set is `NON_ABORTING_PREFLIGHT_CODES` behind `spur task preflight --classify-feature` and `--fix` repairs are listed under `autoRepairs` — any other strict error aborts. Explicit WBS/status/`ready` selectors add no feature check. The orchestrator loop itself continues in this session; interactive sequential omit/`inline` uses the host driver — host-controlled with eligible `agent.run` stages dispatching once to a native subagent and host fallback (task 0508) — while `--agent auto`/a name, parallel mode, and headless invocation keep the isolated per-task workflow subprocess boundary. `--agent <inline|auto|name>` pins the executor for the per-task stages (see [SSOT](cross-cutting.md#inline-default-execution-surface)); the value crosses into per-task `vars.agent`, not the orchestrator. `--json` emits the report as JSON. `--wrap` triggers `wrapup-pipeline.yaml` **once for the batch** over the `done` subset only (execution-batch.md Step 6: `vars.feature` only when every frozen task is `done`/`cancelled`; empty done subset skips with a reason), `--next` chains each task to terminal status then runs the same batch-once wrap, `--continue` resumes from checkpoint. `--no-summary` skips the [execution summary](#execution-summary) printed after the batch report (one row per attempted run).
|
|
484
|
+
- **Inputs:** `--tasks <selector>` (required — explicit WBS list, status pseudo-list, `feature:<id>`, or `ready`). `--mode <sequential|parallel>` (default `sequential`; `parallel` fans out a proven-independent subset per `execution-batch.md` § Parallel Execution). `--keep-going` skips a failed task's in-batch dependents and continues independents (default off; `--auto` implies `--keep-going`, so an unattended batch never stops for a human — 1318 R1). `--auto` sets `profile=auto` on each per-task run (skips the HITL approve gate). `--feature <id>` is sugar for `--tasks feature:<id>`; when the effective selector is feature-derived, the batch runs `spur feature check <id> --fix --json` then `spur feature check <id> --strict --json` **once** before task resolution — a non-zero strict check aborts with verdict `aborted`, zero attempted tasks, and the structured findings (task 0510 R2); scoped: `L4.scenario-unverified` and `L4.verifying-incomplete-tasks` (expected pre-run states of a not-yet-run or reopened feature) are reported verbatim but do not abort — the non-aborting set is `NON_ABORTING_PREFLIGHT_CODES` behind `spur task preflight --classify-feature` and `--fix` repairs are listed under `autoRepairs` — any other strict error aborts. Explicit WBS/status/`ready` selectors add no feature check. The orchestrator loop itself continues in this session; interactive sequential omit/`inline` uses the host driver — host-controlled with eligible `agent.run` stages dispatching once to a native subagent and host fallback (task 0508) — while `--agent auto`/a name, parallel mode, and headless invocation keep the isolated per-task workflow subprocess boundary. `--agent <inline|auto|name>` pins the executor for the per-task stages (see [SSOT](cross-cutting.md#inline-default-execution-surface)); the value crosses into per-task `vars.agent`, not the orchestrator. `--json` emits the report as JSON. `--wrap` triggers `wrapup-pipeline.yaml` **once for the batch** over the `done` subset only (execution-batch.md Step 6: `vars.feature` only when every frozen task is `done`/`cancelled`; empty done subset skips with a reason), `--wrap-pr` runs the batch-once wrap hop, pushes to `origin`, and creates a Pull Request via `gh pr create` (`WT-PR`; mutually exclusive with `--wrap`), `--next` chains each task to terminal status then runs the same batch-once wrap, `--continue` resumes from checkpoint. `--no-summary` skips the [execution summary](#execution-summary) printed after the batch report (one row per attempted run).
|
|
485
485
|
- **Three orthogonal axes (do not confuse):** `--keep-going` = batch failure policy (halt vs skip dependents); `--continue` = resume from checkpoint against the batch's original frozen identity (execution-batch.md § Batch continuation, task 0919); `--next` = per-task lifecycle chaining (advance status on a verdict — `dev-verify`/`dev-verifyall` only). `routing-table.md` offers `--continue` and `--next` as competing options for the same situation only when the batch was interrupted mid-run; otherwise they address different problems.
|
|
486
486
|
- **Backing:** `sp:spur-dev` skill, `runall` operation → delegates the driver loop to the **`sp:super-planner`** agent (the batch orchestrator).
|
|
487
487
|
- **Behavior:** The orchestrator reads [execution-batch.md](execution-batch.md) and drives: resolve selector → freeze set → topo-sort by `dependencies[]` (Kahn, WBS-ascending tie-break; cycle aborts) → resolve out-of-set deps by status (done → allow, else → block subtree) → run each task via `spur workflow run task-pipeline.yaml --async` + `spur workflow trace` polling → inspect terminal state + `.spur/run/<wbs>-verdict.json` → stop-the-batch default or `--keep-going` subtree skip → emit batch report. Per-task pipeline is invoked **verbatim** — no new FSM, no step edits. `--auto`/`--agent` are the only flags that cross the orchestrator→pipeline boundary (both into per-task `--vars`).
|
|
@@ -102,8 +102,7 @@ restricted sandbox - port-binding and `ps` denials produce failures that are not
|
|
|
102
102
|
project's sandbox notes). Real regressions are *additional* failures.
|
|
103
103
|
|
|
104
104
|
**3. Finish the work the step abandoned.** Write the sections the killed step would have written
|
|
105
|
-
(`## Solution`, `## Testing`, and the `## Review` P1-P4 table
|
|
106
|
-
gate will reject the task without it). Use the normal `--section --from-file` contract.
|
|
105
|
+
(`## Solution`, `## Testing`, and the `## Review` P1-P4 table). Use the normal `--section --from-file` contract.
|
|
107
106
|
|
|
108
107
|
**4. Force-done with an honest reason.**
|
|
109
108
|
|
|
@@ -131,13 +130,13 @@ silently incomplete (H6 shipped at 23/48 that way, with one verdict carrying an
|
|
|
131
130
|
`acceptanceCriteria` array and still reading PASS). See `ac-style-guide.md` §
|
|
132
131
|
"Verdict AC ↔ feature scenario linkage" for the id forms and evidence vocabulary.
|
|
133
132
|
|
|
134
|
-
**Parser contract (`spur task verdict
|
|
133
|
+
**Parser contract (`spur task verdict --from-answer`; nothing lints — a malformed row is silently dropped):**
|
|
135
134
|
|
|
136
135
|
1. The requirement id cell must be the **bare** id — `| R1 | MET | … |`. Suffixes (`R1 (AC1)`) or
|
|
137
|
-
decoration (`**R1**`)
|
|
136
|
+
decoration (`**R1**`) do not match the requirement and the row is dropped.
|
|
138
137
|
2. The AC table only opens when the header's **third** cell contains the word "evidence" — use
|
|
139
138
|
`| AC | Status | Evidence Type | Evidence |`. `| AC | Status | Type | Evidence |` silently
|
|
140
|
-
parses zero AC rows
|
|
139
|
+
parses zero AC rows.
|
|
141
140
|
3. A behavioral AC marked `MET` with a non-executable evidence type (`static-ref`,
|
|
142
141
|
`manual-review`, `llm-judge`) is **downgraded to PARTIAL** by `task verdict`, making the whole
|
|
143
142
|
verdict PARTIAL. Use `test`/`command` (grep-based verification counts as `command`). Only the
|
|
@@ -51,13 +51,11 @@ runs, which have no executor to pin.
|
|
|
51
51
|
```
|
|
52
52
|
| WBS | Status | Recovery |
|
|
53
53
|
|-----|--------|--------|
|
|
54
|
-
| 0042 | failed |
|
|
54
|
+
| 0042 | failed | /sp:dev-run 0042 |
|
|
55
55
|
| 0050 | not-attempted | /sp:dev-next 0050 |
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
C6 recovery line (re-run the pipeline); every other excluded task uses the next-router A-row
|
|
60
|
-
command for its status (F96 task 0952 R2).
|
|
58
|
+
Every excluded task uses the next-router A-row command for its status (task 0952 R2).
|
|
61
59
|
|
|
62
60
|
The per-task outcome vocabulary: `done` | `failed` | `blocked` | `skipped` | `not-attempted`,
|
|
63
61
|
plus the resume-only `recheck` (stale/mismatched evidence — pipeline re-run), `not-admitted`
|
|
@@ -154,10 +152,11 @@ spur workflow summary --rollup <runId>-summary.json --rollup <runId2>-summary.js
|
|
|
154
152
|
One row per run carrying that run's own Total, a bold total of the sums, and — when run windows overlap —
|
|
155
153
|
a wall-span line from the first start to the last end. No run block reuses a batch-wide window.
|
|
156
154
|
|
|
157
|
-
## Step 6 — Batch wrap (`--wrap` / `--next`) (F96 task 0952 R1)
|
|
155
|
+
## Step 6 — Batch wrap (`--wrap` / `--wrap-pr` / `--next`) (F96 task 0952 R1)
|
|
158
156
|
|
|
159
157
|
Run **once for the batch**, after the Step 5 report — never per task (dev-operations.md §runall
|
|
160
158
|
agrees; the old "per task" flag-row wording in dev-runall.md was a contradiction, now fixed).
|
|
159
|
+
`--wrap` and `--wrap-pr` are mutually exclusive; passing both is rejected.
|
|
161
160
|
|
|
162
161
|
The wrap receives only what it would accept:
|
|
163
162
|
|
|
@@ -202,5 +201,10 @@ spur workflow commit-guard-stage --run "$RUN_ID" -- <files the wrap wrote> \
|
|
|
202
201
|
git commit -m "chore(wrap): <command> <selector> close-out writes"
|
|
203
202
|
```
|
|
204
203
|
|
|
204
|
+
**PR landing (`--wrap-pr`):** Under `--wrap-pr`, the wrap hop and close-out commit execute identically
|
|
205
|
+
on `$BRANCH`, but instead of fast-forward merging into the base ref (`WT-4`), the branch is pushed to
|
|
206
|
+
remote origin and a Pull Request is opened targeting `$BASE_REF` via `gh pr create` (`WT-PR`,
|
|
207
|
+
`execution-worktree-landing.md`).
|
|
208
|
+
|
|
205
209
|
> **Forbidden:** `git add -A` and `git add .` — here as in every driver commit step. In the
|
|
206
210
|
> worktree batch the same rule rides in the WT-3b block above.
|
|
@@ -445,8 +445,8 @@ Each pipeline run ends in one of two terminal states:
|
|
|
445
445
|
`.spur/run/<wbs>-verify-answer.txt` AC table is exactly four columns:
|
|
446
446
|
`| AC | Status | Evidence Type | Evidence |`. The evidence-type token
|
|
447
447
|
(`test`, `command`, `static-ref`, `manual-review`, `llm-judge`, `n/a`, or a `+`
|
|
448
|
-
compound) is isolated in cell 3. A token merged into the evidence cell
|
|
449
|
-
|
|
448
|
+
compound) is isolated in cell 3. A token merged into the evidence cell is not parsed as an
|
|
449
|
+
evidence type.
|
|
450
450
|
|
|
451
451
|
**Driver acceptance (0930 R3).** The trace row and `.spur/run/<wbs>-verdict.json` are accepted as
|
|
452
452
|
terminal evidence only if BOTH hold:
|
|
@@ -661,9 +661,8 @@ Before launching a full `spur-check:full`:
|
|
|
661
661
|
`console.*`), spawn processes via `NodeProcessExecutor` (no `Bun.spawnSync`), get a
|
|
662
662
|
`runtime-boundaries` fs-io exemption for sync reads (mirrors `commands/task/shared.ts`), and a non-command helper
|
|
663
663
|
must not live in `apps/cli/src/commands/` (the noun scan treats every file there as a noun).
|
|
664
|
-
4. **Doc/TSDoc edits shift `file:line` anchors** cited by other tasks —
|
|
665
|
-
|
|
666
|
-
on touched tasks). Repoint the shifted citations (via `spur task update --section`)
|
|
664
|
+
4. **Doc/TSDoc edits shift `file:line` anchors** cited by other tasks — nothing
|
|
665
|
+
detects the drift mechanically. Repoint the shifted citations (via `spur task update --section`)
|
|
667
666
|
|
|
668
667
|
## AC traceability
|
|
669
668
|
|
|
@@ -194,7 +194,7 @@ by this session's judgment:
|
|
|
194
194
|
Every decision point, its fallback and its consumer are listed in
|
|
195
195
|
[decision-points.md](decision-points.md); read the rows it names instead of re-judging them.
|
|
196
196
|
|
|
197
|
-
The completion gate reads deterministic evidence only: the review stage's **verdict artifact** (`.spur/run/<wbs>-verdict.json`, derived by `spur task verdict --from-answer`) and the **tree-hash gate receipt** (`.spur/run/<wbs>-check-receipt.json`, reused while the tree is unchanged). The ADR-071 proof chain this paragraph used to describe — proof digests, `verify → record`, review-inside-the-bracket — was deleted by the D65 pipeline rewrite; `record` now runs inside `done`'s onEnter and `verify` merged into `review`.
|
|
197
|
+
The completion gate reads deterministic evidence only: the review stage's **verdict artifact** (`.spur/run/<wbs>-verdict.json`, derived by `spur task verdict --from-answer`) and the **tree-hash gate receipt** (`.spur/run/<wbs>-check-receipt.json`, reused while the tree is unchanged). The ADR-071 proof chain this paragraph used to describe — proof digests, `verify → record`, review-inside-the-bracket — was deleted by the D65 pipeline rewrite; `record` now runs inside `done`'s onEnter and `verify` merged into `review`. No confidence grade is stated or read anywhere, and nothing lints the answer: the reviewer's `Verdict:` line is the only review authority, so a review with an open P1–P3 finding must carry a non-PASS verdict. Nothing grades the *verifier's* opinion: what protects a hand-driven `task update <wbs> done` is unchanged — the gate must show a PASS receipt for this tree and a recorded review artifact.
|
|
198
198
|
|
|
199
199
|
Agentic steps use the pure slash inputs declared by each YAML `agent.run` action (ADR-043). The
|
|
200
200
|
workflow engine dispatches them; the interactive driver invokes their backing skills in-session.
|
|
@@ -352,6 +352,40 @@ merge. One contract, no alternatives:
|
|
|
352
352
|
This is a deliberate choice over auto-migrating DB state: the committed corpus files are the durable
|
|
353
353
|
record and the persisted run artifacts are the evidence record.
|
|
354
354
|
|
|
355
|
+
### WT-PR — Remote PR landing path (`--wrap-pr`)
|
|
356
|
+
|
|
357
|
+
When `--wrap-pr` is supplied instead of `--wrap`:
|
|
358
|
+
The batch/task completes verification with no failed task, and Step 6 wrap completes its close-out commit
|
|
359
|
+
directly on `$BRANCH` in the execution tree.
|
|
360
|
+
Instead of checking out `$BASE_REF` and fast-forward merging locally (`WT-4`), the driver pushes the branch
|
|
361
|
+
to the remote repository and opens a GitHub Pull Request:
|
|
362
|
+
|
|
363
|
+
1. **Preflight checks (fail-closed):**
|
|
364
|
+
```bash
|
|
365
|
+
git remote get-url origin >/dev/null 2>&1 \
|
|
366
|
+
|| { echo "WT-PR halt: git remote 'origin' is not configured" >&2; exit 1; }
|
|
367
|
+
gh auth status >/dev/null 2>&1 \
|
|
368
|
+
|| { echo "WT-PR halt: gh CLI is not authenticated; run 'gh auth login'" >&2; exit 1; }
|
|
369
|
+
```
|
|
370
|
+
2. **Push branch to origin:**
|
|
371
|
+
```bash
|
|
372
|
+
git push -u origin "$BRANCH" \
|
|
373
|
+
|| { echo "WT-PR halt: git push origin $BRANCH failed" >&2; exit 1; }
|
|
374
|
+
```
|
|
375
|
+
3. **Open Pull Request via `gh pr create`:**
|
|
376
|
+
```bash
|
|
377
|
+
# Compose PR title and body from task / batch metadata:
|
|
378
|
+
# For single task (dev-run): title="feat(<wbs>): <title>", body cites verification PASS & Solution.
|
|
379
|
+
# For batch (dev-runall): title="feat(<feature-id>): <feature-summary>" or "feat(batch): <selector> (<n> tasks)".
|
|
380
|
+
PR_URL=$(gh pr create --base "$BASE_REF" --head "$BRANCH" --title "$PR_TITLE" --body "$PR_BODY") \
|
|
381
|
+
|| { echo "WT-PR halt: gh pr create failed" >&2; exit 1; }
|
|
382
|
+
echo "WT-PR: Pull Request opened at $PR_URL"
|
|
383
|
+
```
|
|
384
|
+
4. **Marker transition & worktree disposition:**
|
|
385
|
+
- Record in the worktree marker: `.status = "pr-created" | .prUrl = "$PR_URL"`.
|
|
386
|
+
- Local base branch (`$BASE_REF`) remains untouched.
|
|
387
|
+
- The local worktree and branch are retained (or worktree cleaned up in create mode, while preserving the branch on origin).
|
|
388
|
+
|
|
355
389
|
### WT-4r — rebasing a retained branch in a linked worktree
|
|
356
390
|
|
|
357
391
|
When a pre-merge halt is resolved by rebasing the retained branch (rather than landing as-is), two
|
|
@@ -174,7 +174,8 @@ Two properties are load-bearing and are asserted structurally:
|
|
|
174
174
|
unconditional single end-of-run gate).
|
|
175
175
|
- **The full tier is still the only `PASS` writer.** Only the integrated run can claim a green
|
|
176
176
|
project gate; the per-task token is `DEFERRED`, and the deferred `gate → review`
|
|
177
|
-
guard accepts it only while `deferQualityGate = "true"
|
|
177
|
+
guard accepts it only while `deferQualityGate = "true"` (the pipeline default since the
|
|
178
|
+
incremental gate; pass `"false"` for a full gate on every task).
|
|
178
179
|
|
|
179
180
|
`--defer-gate` with `--mode sequential` (or omitted `--mode`) is rejected — the flag exists to move
|
|
180
181
|
one full gate from N worktrees to the one place the integrated tree exists. Under `--mode auto` it
|
|
@@ -212,6 +213,18 @@ with `--next`, wrap runs **once for the batch** after every task reaches termina
|
|
|
212
213
|
the batch-once shippable gate `dev-verifyall` uses. Without `--next`, `--wrap` is wrap-without-
|
|
213
214
|
chaining — the single task or batch wraps without advancing the lifecycle. On `dev-find-way` it
|
|
214
215
|
wraps the one resolved ticket inside the worktree before the merge, and is skipped in chart mode.
|
|
216
|
+
Mutually exclusive with `--wrap-pr`.
|
|
217
|
+
|
|
218
|
+
### `--wrap-pr` — run wrap hop, push branch, and create a Pull Request
|
|
219
|
+
|
|
220
|
+
**Anchor:** `#flag-wrap-pr`.
|
|
221
|
+
|
|
222
|
+
After the main step completes, run the wrap hop (learnings, metrics, doc-sync) and close-out commit,
|
|
223
|
+
then push the worktree or dedicated task branch to `origin` and open a Pull Request targeting the base ref using
|
|
224
|
+
`gh pr create`. Mutually exclusive with `--wrap` (specifying both exits 2). Full mode only; requires
|
|
225
|
+
`--worktree` or execution on a dedicated non-base branch (refuses execution directly on `main`).
|
|
226
|
+
On `dev-runall`, PR creation runs **once for the batch** over the `done` subset. When used with
|
|
227
|
+
`--worktree`, leaves the local base branch unmodified and records the PR URL in the worktree marker.
|
|
215
228
|
|
|
216
229
|
### `--force` — bypass a named guard
|
|
217
230
|
|