@gobing-ai/spur 0.3.91 → 0.3.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/pipeline-budgets.json +2 -9
- package/config/plugin-scripts.json +27 -1
- package/config/templates/AGENTS.md +4 -0
- package/config/templates/docs/02_ROADMAP.md +2 -0
- package/config/templates/docs/03_ARCHITECTURE.md +3 -1
- package/config/templates/docs/04_DESIGN.md +2 -0
- package/config/templates/docs/99_PROJECT_CONSTITUTION.md +10 -2
- package/config/workflow-candidates.json +72 -1
- package/config/workflows/feature-lifecycle.yaml +14 -5
- package/config/workflows/feature-verification.yaml +36 -27
- package/config/workflows/history-anatomy.yaml +16 -25
- package/config/workflows/idea-pipeline.yaml +76 -23
- package/config/workflows/pr-review.yaml +8 -0
- package/config/workflows/task-pipeline.yaml +362 -40
- package/config/workflows/wayfinder-resolution.yaml +5 -0
- package/config/workflows/wrapup-pipeline.yaml +102 -19
- package/package.json +9 -9
- package/plugins/sp/README.md +7 -2
- package/plugins/sp/agents/super-planner.md +14 -5
- package/plugins/sp/commands/dev-dogfood.md +4 -4
- package/plugins/sp/commands/dev-fixall.md +8 -5
- package/plugins/sp/commands/dev-run.md +8 -2
- package/plugins/sp/commands/dev-runall.md +14 -8
- package/plugins/sp/commands/dev-verify.md +9 -0
- package/plugins/sp/commands/dev-verifyall.md +5 -0
- package/plugins/sp/lib/idea-handoff.generated.mjs +306 -301
- package/plugins/sp/lib/inline-run.generated.d.mts +18 -0
- package/plugins/sp/lib/inline-run.generated.mjs +1468 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/environment-lens.md +1 -1
- package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +136 -0
- package/plugins/sp/scripts/dogfood-testing/validate-report.ts +196 -2
- package/plugins/sp/scripts/feature-verification-steps.mjs +174 -0
- package/plugins/sp/scripts/feature-verification-steps.ts +275 -0
- package/plugins/sp/scripts/history-anatomy-cache.mjs +104 -4
- package/plugins/sp/scripts/history-anatomy-cache.ts +137 -13
- package/plugins/sp/scripts/inline-pipeline-parity-check.ts +2 -1
- package/plugins/sp/scripts/inline-run-setup.mjs +421 -0
- package/plugins/sp/scripts/inline-run-setup.ts +325 -78
- package/plugins/sp/scripts/quality-gate.mjs +248 -6
- package/plugins/sp/scripts/quality-gate.ts +410 -9
- package/plugins/sp/scripts/record-feature-sync.mjs +63 -0
- package/plugins/sp/scripts/record-feature-sync.ts +84 -0
- package/plugins/sp/scripts/residual-scan.mjs +484 -0
- package/plugins/sp/scripts/residual-scan.ts +640 -0
- package/plugins/sp/scripts/task-diffstat.mjs +156 -0
- package/plugins/sp/scripts/task-diffstat.ts +229 -0
- package/plugins/sp/scripts/task-evidence-precheck.ts +8 -3
- package/plugins/sp/scripts/task-size-precheck.ts +8 -3
- package/plugins/sp/scripts/wrapup-drift-probe.mjs +181 -0
- package/plugins/sp/scripts/wrapup-drift-probe.ts +258 -0
- package/plugins/sp/scripts/wrapup-steps.mjs +60 -1
- package/plugins/sp/scripts/wrapup-steps.ts +89 -4
- package/plugins/sp/skills/brainstorm/SKILL.md +2 -0
- package/plugins/sp/skills/brainstorm/references/workflows.md +17 -2
- package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
- package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +2 -0
- package/plugins/sp/skills/code-implementation/SKILL.md +17 -0
- package/plugins/sp/skills/code-verification/SKILL.md +21 -0
- package/plugins/sp/skills/code-verification/references/secu-review.md +3 -2
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -0
- package/plugins/sp/skills/dogfood-testing/SKILL.md +5 -3
- package/plugins/sp/skills/dogfood-testing/references/monitor-ledger.md +63 -26
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +33 -10
- package/plugins/sp/skills/history-anatomy/references/modes.md +5 -3
- package/plugins/sp/skills/next-feature/references/ranking-rubric.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +7 -0
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
- package/plugins/sp/skills/session-review/SKILL.md +12 -2
- package/plugins/sp/skills/spur-check/SKILL.md +112 -0
- package/plugins/sp/skills/spur-cli/references/features.md +1 -1
- package/plugins/sp/skills/spur-cli/references/projects.md +3 -1
- package/plugins/sp/skills/spur-cli/references/workflows.md +39 -19
- package/plugins/sp/skills/spur-dev/SKILL.md +13 -5
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +18 -3
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -2
- package/plugins/sp/skills/spur-dev/references/document-authoring.md +85 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +286 -58
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +27 -4
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +3 -2
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +61 -16
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +10 -5
- package/plugins/sp/skills/spur-dev/templates/design.md +31 -0
- package/plugins/sp/skills/spur-dev/templates/plan.md +32 -0
- package/plugins/sp/skills/spur-doctor/SKILL.md +60 -14
- package/schemas/state-machine-workflow.schema.json +4 -0
- package/spur.js +22501 -19644
- package/web/_astro/BoardApp.CerSBgis.js +192 -0
- package/web/_astro/BoardApp.eoTz0pZs.js +1 -0
- package/web/_astro/{TaskDetail.CXGltuT_.js → TaskDetail.DCqiC-OZ.js} +1 -1
- package/web/_astro/arc.CPwg6Rw0.js +1 -0
- package/web/_astro/{architectureDiagram-3BPJPVTR.DJ8DHkWE.js → architectureDiagram-3BPJPVTR.DM_vp_hO.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.D8DHK3Jl.js → blockDiagram-GPEHLZMM.DXVIiv0p.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.BugQbX9u.js → c4Diagram-AAUBKEIU.BbF_zCxW.js} +1 -1
- package/web/_astro/channel.MYZLKNwy.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.Mv26KlVn.js → chunk-2J33WTMH.CAgQHpPC.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.CD51JoT_.js → chunk-4BX2VUAB.BN-5tpw4.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.D_PFaIEe.js → chunk-55IACEB6.CnPkEEr0.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.DemMW1ao.js → chunk-727SXJPM.BQzQeMVm.js} +4 -4
- package/web/_astro/{chunk-AQP2D5EJ.Iu2V5-ex.js → chunk-AQP2D5EJ.B6xNyDnL.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.MsNgSP-E.js → chunk-FMBD7UC4.C7f9Ih78.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.DfbRaAlm.js → chunk-ND2GUHAM.CNV1dFXT.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.BbJAQ4h-.js → chunk-QZHKN3VN.Cudn2TkJ.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CPurtiC2.js → classDiagram-4FO5ZUOK.D1NwP50q.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CPurtiC2.js → classDiagram-v2-Q7XG4LA2.D1NwP50q.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CKKdx1bM.js → cose-bilkent-S5V4N54A.B1wSL-Xb.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.CoKMTg-R.js → cynefin-OW5HDTMX.BmK52w8G.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.D4h4_k56.js → dagre-BM42HDAG.Bfy5CTDT.js} +2 -2
- package/web/_astro/diagram-2AECGRRQ.DhNnvUvX.js +43 -0
- package/web/_astro/diagram-5GNKFQAL.lTX5KwnS.js +10 -0
- package/web/_astro/{diagram-KO2AKTUF.BFoCkiCr.js → diagram-KO2AKTUF.CW_vMJ4z.js} +3 -3
- package/web/_astro/{diagram-LMA3HP47.exHn9OVx.js → diagram-LMA3HP47.B_8ZGF67.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.CeqO34nN.js → diagram-OG6HWLK6.BppnHsdS.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.D_v7HqxR.js → erDiagram-TEJ5UH35.BEuHXcjJ.js} +5 -5
- package/web/_astro/{flowDiagram-I6XJVG4X.EUmrpbwh.js → flowDiagram-I6XJVG4X.CH-UlnGr.js} +4 -4
- package/web/_astro/{ganttDiagram-6RSMTGT7.BOCF5lII.js → ganttDiagram-6RSMTGT7.BO81S85v.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.Di7otYZD.js → gitGraphDiagram-PVQCEYII.XnPxPPZN.js} +1 -1
- package/web/_astro/index.Hjbr15fG.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.TcBkCAJk.js → infoDiagram-5YYISTIA.JyjYRu_T.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.D-2y4M0c.js → ishikawaDiagram-YF4QCWOH.BBRBF-Fo.js} +5 -5
- package/web/_astro/{journeyDiagram-JHISSGLW.DPbJI_n2.js → journeyDiagram-JHISSGLW.C_iymSyp.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.EFxhQ9Fj.js → kanban-definition-UN3LZRKU.DdfW-Oqt.js} +7 -7
- package/web/_astro/{linear.DSAsQLzs.js → linear.C2_IkbZT.js} +1 -1
- package/web/_astro/mermaid.core.GAOYeSR0.js +303 -0
- package/web/_astro/{mindmap-definition-RKZ34NQL.CJY1N_7V.js → mindmap-definition-RKZ34NQL.DAZIxQSK.js} +2 -2
- package/web/_astro/{pieDiagram-4H26LBE5.567ZNoL2.js → pieDiagram-4H26LBE5.CN8sIhKM.js} +3 -3
- package/web/_astro/{quadrantDiagram-W4KKPZXB.mqfz9-MY.js → quadrantDiagram-W4KKPZXB.3dGcX5GP.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.Bv1Gv9In.js → requirementDiagram-4Y6WPE33.BV2y4dd6.js} +3 -3
- package/web/_astro/{sankeyDiagram-5OEKKPKP.B6Gs4X4r.js → sankeyDiagram-5OEKKPKP.Cqo15Tvo.js} +4 -4
- package/web/_astro/{sequenceDiagram-3UESZ5HK.BhYj4v-m.js → sequenceDiagram-3UESZ5HK.CROCPMJB.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.BPbBnkpw.js → stateDiagram-AJRCARHV.RfXZrkFE.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.C4squMNK.js → stateDiagram-v2-BHNVJYJU.CPXmbBs9.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.C_SwIHgl.js → timeline-definition-PNZ67QCA.DdgKTiO8.js} +3 -3
- package/web/_astro/{vennDiagram-CIIHVFJN.Bz4NZGpQ.js → vennDiagram-CIIHVFJN.CPNVSHF1.js} +5 -5
- package/web/_astro/{wardleyDiagram-YWT4CUSO.CozMVZ3i.js → wardleyDiagram-YWT4CUSO.CQhA0Jyr.js} +3 -3
- package/web/_astro/{xychartDiagram-2RQKCTM6.BwMGBwjB.js → xychartDiagram-2RQKCTM6.n61BWyy4.js} +1 -1
- package/web/index.html +2 -2
- package/config/workflows/decision-routing-example.yaml +0 -134
- package/web/_astro/BoardApp.BEDWpzsr.js +0 -188
- package/web/_astro/BoardApp.DQG2xfEz.js +0 -1
- package/web/_astro/arc.C0rrflm_.js +0 -1
- package/web/_astro/channel.SRrg1P-w.js +0 -1
- package/web/_astro/diagram-2AECGRRQ.DJ0h9zgw.js +0 -43
- package/web/_astro/diagram-5GNKFQAL.DvPk1jYd.js +0 -10
- package/web/_astro/index.Bx6GY4RH.css +0 -1
- package/web/_astro/mermaid.core.kAZjgJHG.js +0 -301
|
@@ -209,6 +209,7 @@ transitions:
|
|
|
209
209
|
command: 'test "$(cat .spur/run/$__runId-wayfinder-precheck.status 2>/dev/null)" = PASS'
|
|
210
210
|
- from: precheck
|
|
211
211
|
to: failed
|
|
212
|
+
terminalReason: failed-check
|
|
212
213
|
description: "Precheck FAIL — stop before delegation."
|
|
213
214
|
guard:
|
|
214
215
|
kind: always
|
|
@@ -221,6 +222,7 @@ transitions:
|
|
|
221
222
|
command: 'test -s .spur/run/$__runId-wayfinder-answer.md'
|
|
222
223
|
- from: investigate
|
|
223
224
|
to: failed
|
|
225
|
+
terminalReason: failed-agent
|
|
224
226
|
description: "Empty answer capture — investigate produced nothing to verify; stop rather than certify hollow evidence."
|
|
225
227
|
guard:
|
|
226
228
|
kind: shell
|
|
@@ -254,6 +256,7 @@ transitions:
|
|
|
254
256
|
command: 'test "$__hitlAnswer" = yes'
|
|
255
257
|
- from: approve
|
|
256
258
|
to: cancelled
|
|
259
|
+
terminalReason: cancelled
|
|
257
260
|
description: "Operator cancelled the research resolution."
|
|
258
261
|
guard:
|
|
259
262
|
kind: shell
|
|
@@ -261,6 +264,7 @@ transitions:
|
|
|
261
264
|
command: 'test "$__hitlAnswer" = cancel'
|
|
262
265
|
- from: approve
|
|
263
266
|
to: failed
|
|
267
|
+
terminalReason: cancelled
|
|
264
268
|
description: "Operator rejected the research resolution."
|
|
265
269
|
guard:
|
|
266
270
|
kind: shell
|
|
@@ -275,6 +279,7 @@ transitions:
|
|
|
275
279
|
command: 'test "$(cat .spur/run/$__runId-wayfinder-final.status 2>/dev/null)" = PASS && test "$(cat .spur/run/$__runId-wayfinder-status.txt 2>/dev/null)" = done'
|
|
276
280
|
- from: record
|
|
277
281
|
to: failed
|
|
282
|
+
terminalReason: failed-check
|
|
278
283
|
description: "Recording failed, was denied, or the task never reached done — stop without claiming completion."
|
|
279
284
|
guard:
|
|
280
285
|
kind: always
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
#
|
|
16
16
|
# Shape: start -> task-resolve -> doc-sync -> learnings-append -> metrics-record
|
|
17
17
|
# -> feature-transition (conditional: if vars.feature set)
|
|
18
|
+
# -> feature-verify (post-transition feature check gate, 0915 F1)
|
|
18
19
|
# -> branch-cleanup (conditional: if vars.merge=true)
|
|
19
20
|
# -> done
|
|
20
21
|
# doc-sync routes a contract violation to `repair` (cheap, no
|
|
@@ -74,7 +75,7 @@
|
|
|
74
75
|
"$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
|
|
75
76
|
kind: state-machine
|
|
76
77
|
name: wrapup-pipeline
|
|
77
|
-
version: "
|
|
78
|
+
version: "5"
|
|
78
79
|
description: "Post-execution wrap-up: doc-sync (doc drift + learning capture), metrics, feature-transition, branch-cleanup"
|
|
79
80
|
iterationBound: 10
|
|
80
81
|
initialState: start
|
|
@@ -127,7 +128,10 @@ states:
|
|
|
127
128
|
missing or corrupted capture refuses progression. A validated empty list
|
|
128
129
|
-> skipped; length > 0 && mode == fast -> fast-path (metrics-record,
|
|
129
130
|
bypassing doc-sync); missing/unknown/conflict -> doc-sync (safety-path).
|
|
130
|
-
Writes bounded machine-readable reason to reasonFile.
|
|
131
|
+
Writes bounded machine-readable reason to reasonFile. When the caller leaves
|
|
132
|
+
mode empty, a deterministic drift probe (0944) projects mode=fast only when
|
|
133
|
+
no changed path matches a doc-owned surface and every task's Solution
|
|
134
|
+
change map parsed — any doubt stays on the safety path.
|
|
131
135
|
onEnter:
|
|
132
136
|
- kind: note
|
|
133
137
|
options:
|
|
@@ -147,21 +151,53 @@ states:
|
|
|
147
151
|
echo "wrapup-steps failed closed — script not found — run 'superskill install sp'" >&2;
|
|
148
152
|
printf 'FAIL\n' > ".spur/run/$__runId-wrapup-resolve.status";
|
|
149
153
|
fi
|
|
150
|
-
# (
|
|
151
|
-
#
|
|
152
|
-
#
|
|
153
|
-
#
|
|
154
|
-
#
|
|
155
|
-
#
|
|
156
|
-
# the
|
|
154
|
+
# (0944 R1-R3) deterministic drift probe — runs ONLY when the caller left mode
|
|
155
|
+
# empty (a caller-set mode is projected verbatim and the probe never runs). It
|
|
156
|
+
# writes <runId>-drift-probe.json {clean,reasons,paths} and projects the wrapup
|
|
157
|
+
# mode by writing <runId>-mode.txt: caller mode verbatim, `fast` when the probe
|
|
158
|
+
# is clean, empty when dirty (the probe script fails safe on any lookup or parse
|
|
159
|
+
# problem; a missing script writes a dirty probe + empty mode here). The next
|
|
160
|
+
# action reads the mode file into vars.mode via file.read.into-var.
|
|
157
161
|
- kind: shell
|
|
158
162
|
options:
|
|
159
163
|
command: >-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
164
|
+
if [ -n "$mode" ]; then
|
|
165
|
+
printf '%s\n' "$mode" > ".spur/run/$__runId-mode.txt";
|
|
166
|
+
elif [ -f plugins/sp/scripts/wrapup-drift-probe.ts ]; then
|
|
167
|
+
bun plugins/sp/scripts/wrapup-drift-probe.ts;
|
|
168
|
+
elif W="$(superskill script path sp wrapup-drift-probe.mjs 2>/dev/null)" && [ -f "$W" ]; then
|
|
169
|
+
node "$W";
|
|
170
|
+
else
|
|
171
|
+
printf '{"clean":false,"reasons":["probe script not found"],"paths":[]}' > ".spur/run/$__runId-drift-probe.json";
|
|
172
|
+
printf '\n' > ".spur/run/$__runId-mode.txt";
|
|
173
|
+
fi
|
|
174
|
+
- kind: file.read.into-var
|
|
175
|
+
options:
|
|
176
|
+
path: .spur/run/${vars.__runId}-mode.txt
|
|
177
|
+
var: mode
|
|
178
|
+
# (e) route-reason writer: one table lookup over the projected mode var over
|
|
179
|
+
# the validated capture and the drift probe verdict; workflow-local routing
|
|
180
|
+
# glue (0824, moved behind the wrapup-steps locator in 0944 to stay inside the
|
|
181
|
+
# ADR-115 shell caps). Runs AFTER the probe/projection so the reason reflects
|
|
182
|
+
# the projected mode. Reads ONLY .spur/run/<runId>-wrapup-tasks.json and the
|
|
183
|
+
# probe verdict — never raw vars.tasks (0783 R2/R5). A FAIL resolve exits
|
|
184
|
+
# without writing: the failed reason written by validation stands, and the
|
|
185
|
+
# skip reason can never mask it. A clean probe yields `fast:drift-probe-clean`
|
|
186
|
+
# (0944); mode `safety` claims `safety:operator-forced doc-sync`; a missing or
|
|
187
|
+
# corrupted capture fails the lookup (no skipped or clean claim can be
|
|
188
|
+
# invented); the failed defense edge owns the run.
|
|
189
|
+
- kind: shell
|
|
190
|
+
options:
|
|
191
|
+
command: >-
|
|
192
|
+
mkdir -p .spur/run .spur/memory &&
|
|
193
|
+
if [ -f plugins/sp/scripts/wrapup-steps.ts ]; then
|
|
194
|
+
bun plugins/sp/scripts/wrapup-steps.ts route-reason;
|
|
195
|
+
elif W="$(superskill script path sp wrapup-steps.mjs 2>/dev/null)" && [ -f "$W" ]; then
|
|
196
|
+
node "$W" route-reason;
|
|
197
|
+
else
|
|
198
|
+
echo "wrapup-steps failed closed — script not found — run 'superskill install sp'" >&2;
|
|
199
|
+
printf 'FAIL\n' > ".spur/run/$__runId-wrapup-resolve.status";
|
|
200
|
+
fi
|
|
165
201
|
|
|
166
202
|
- id: doc-sync
|
|
167
203
|
description: >
|
|
@@ -295,6 +331,30 @@ states:
|
|
|
295
331
|
printf 'FAIL\n' > ".spur/run/$__runId-wrapup-sync.status";
|
|
296
332
|
fi
|
|
297
333
|
|
|
334
|
+
- id: feature-verify
|
|
335
|
+
description: >
|
|
336
|
+
Post-feature-transition verification hop (D63 task 0915, review finding
|
|
337
|
+
F1): wrapup's doc-sync and the feature transition mutate the corpus AFTER
|
|
338
|
+
the feature-scoped verification pass ran. The proof digest deliberately
|
|
339
|
+
excludes docs/tasks*/docs/features* (shared evidence, concurrent writers),
|
|
340
|
+
so the bound receipt stays valid — but the feature's completion boundary
|
|
341
|
+
must still observe the post-wrapup state. This hop re-runs the feature
|
|
342
|
+
check gate (`featureGateCmd`). When the configured command is the done-
|
|
343
|
+
boundary variant (`feature check --as done`), it validates the bound
|
|
344
|
+
evidence receipt (feature identity, verifier definition digest, terminal
|
|
345
|
+
recording run, artifact registration, checked-input digest) against the
|
|
346
|
+
current feature contract; a plain gate command observes the post-wrapup
|
|
347
|
+
corpus state but does not enforce the receipt (0915 re-review P3). A FAIL
|
|
348
|
+
fails the wrapup loudly instead of letting a stale PASS ride; only a
|
|
349
|
+
verified gate writes PASS (0783 R4).
|
|
350
|
+
onEnter:
|
|
351
|
+
- kind: shell
|
|
352
|
+
options:
|
|
353
|
+
command: >-
|
|
354
|
+
sh -c "$featureGateCmd" &&
|
|
355
|
+
printf 'PASS\n' > ".spur/run/$__runId-wrapup-feature-verify.status" ||
|
|
356
|
+
printf 'FAIL\n' > ".spur/run/$__runId-wrapup-feature-verify.status"
|
|
357
|
+
|
|
298
358
|
- id: branch-cleanup
|
|
299
359
|
description: >
|
|
300
360
|
Irreversible-operation HITL gate, consent-only (0770). If vars.merge=true,
|
|
@@ -342,6 +402,7 @@ transitions:
|
|
|
342
402
|
# ── task-resolve: validation fail + proportional route table (0758 R1-R4, 0770) ──
|
|
343
403
|
- from: task-resolve
|
|
344
404
|
to: failed
|
|
405
|
+
terminalReason: failed-check
|
|
345
406
|
description: >
|
|
346
407
|
Validation FAIL (0770): malformed wrap input, a non-string/empty entry, an
|
|
347
408
|
unresolved or non-completed task, or an empty __runId. Declared before the
|
|
@@ -377,6 +438,7 @@ transitions:
|
|
|
377
438
|
command: 'test "$(jq length .spur/run/$__runId-wrapup-tasks.json 2>/dev/null || echo -1)" -gt 0 && test "$mode" != fast'
|
|
378
439
|
- from: task-resolve
|
|
379
440
|
to: failed
|
|
441
|
+
terminalReason: failed-check
|
|
380
442
|
description: >
|
|
381
443
|
Defense (0770) — no PASS/FAIL resolve status (shell crashed or never ran):
|
|
382
444
|
route to `failed` rather than claiming a skip.
|
|
@@ -404,6 +466,7 @@ transitions:
|
|
|
404
466
|
kind: action-ok
|
|
405
467
|
- from: doc-sync
|
|
406
468
|
to: failed
|
|
469
|
+
terminalReason: failed-check
|
|
407
470
|
description: >
|
|
408
471
|
Executor failure (non-zero exit, signal, or dispatch error) — keep the
|
|
409
472
|
existing fail semantics; a contract violation never falls through here
|
|
@@ -433,6 +496,7 @@ transitions:
|
|
|
433
496
|
# the metrics status PASS so a missing status can never claim success.
|
|
434
497
|
- from: metrics-record
|
|
435
498
|
to: failed
|
|
499
|
+
terminalReason: failed-check
|
|
436
500
|
description: >
|
|
437
501
|
Metrics capture failed for at least one task — a missing metrics row is
|
|
438
502
|
recorded as failure, never silently omitted as success (0770).
|
|
@@ -465,6 +529,7 @@ transitions:
|
|
|
465
529
|
# ── feature-transition: fail edge, then branch-cleanup (if merge) or done ──
|
|
466
530
|
- from: feature-transition
|
|
467
531
|
to: failed
|
|
532
|
+
terminalReason: failed-check
|
|
468
533
|
description: >
|
|
469
534
|
Required synchronization failed (0770): non-zero sync exit, an invalid
|
|
470
535
|
sync result, or a failed feature gate. The failed status carries the
|
|
@@ -474,19 +539,37 @@ transitions:
|
|
|
474
539
|
options:
|
|
475
540
|
command: 'test "$(cat .spur/run/$__runId-wrapup-sync.status 2>/dev/null)" = FAIL'
|
|
476
541
|
- from: feature-transition
|
|
542
|
+
to: feature-verify
|
|
543
|
+
description: Sync PASS — re-run the feature check gate against the post-wrapup state.
|
|
544
|
+
guard:
|
|
545
|
+
kind: shell
|
|
546
|
+
options:
|
|
547
|
+
command: 'test "$(cat .spur/run/$__runId-wrapup-sync.status 2>/dev/null)" = PASS'
|
|
548
|
+
- from: feature-verify
|
|
549
|
+
to: failed
|
|
550
|
+
terminalReason: failed-check
|
|
551
|
+
description: >
|
|
552
|
+
Post-wrapup feature check failed (0915 F1): the bound receipt no longer
|
|
553
|
+
validates against the current feature contract. Already-written
|
|
554
|
+
learnings/metrics stay on disk.
|
|
555
|
+
guard:
|
|
556
|
+
kind: shell
|
|
557
|
+
options:
|
|
558
|
+
command: 'test "$(cat .spur/run/$__runId-wrapup-feature-verify.status 2>/dev/null)" = FAIL'
|
|
559
|
+
- from: feature-verify
|
|
477
560
|
to: branch-cleanup
|
|
478
|
-
description:
|
|
561
|
+
description: Post-wrapup feature check PASS — merge is requested.
|
|
479
562
|
guard:
|
|
480
563
|
kind: shell
|
|
481
564
|
options:
|
|
482
|
-
command: 'test "$(cat .spur/run/$__runId-wrapup-
|
|
483
|
-
- from: feature-
|
|
565
|
+
command: 'test "$(cat .spur/run/$__runId-wrapup-feature-verify.status 2>/dev/null)" = PASS && test "$merge" = true'
|
|
566
|
+
- from: feature-verify
|
|
484
567
|
to: done
|
|
485
|
-
description:
|
|
568
|
+
description: Post-wrapup feature check PASS — no merge requested.
|
|
486
569
|
guard:
|
|
487
570
|
kind: shell
|
|
488
571
|
options:
|
|
489
|
-
command: 'test "$(cat .spur/run/$__runId-wrapup-
|
|
572
|
+
command: 'test "$(cat .spur/run/$__runId-wrapup-feature-verify.status 2>/dev/null)" = PASS && test "$merge" != true'
|
|
490
573
|
|
|
491
574
|
# ── branch-cleanup: HITL exhaustive routing (yes / no / cancel → done) ──
|
|
492
575
|
# No irreversible git op is wired yet; confirmation is recorded, then wrap
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gobing-ai/spur",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.93",
|
|
4
4
|
"description": "Spur CLI — local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"spur",
|
|
@@ -53,14 +53,14 @@
|
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
55
|
"@commander-js/extra-typings": "^14.0.0",
|
|
56
|
-
"@gobing-ai/ts-db": "^0.5.
|
|
57
|
-
"@gobing-ai/ts-ai-runner": "^0.5.
|
|
58
|
-
"@gobing-ai/ts-dual-workflow-engine": "^0.5.
|
|
59
|
-
"@gobing-ai/ts-infra": "^0.5.
|
|
60
|
-
"@gobing-ai/ts-llm-jsonl-importer": "^0.5.
|
|
61
|
-
"@gobing-ai/ts-rule-engine": "^0.5.
|
|
62
|
-
"@gobing-ai/ts-runtime": "^0.5.
|
|
63
|
-
"@gobing-ai/ts-utils": "^0.5.
|
|
56
|
+
"@gobing-ai/ts-db": "^0.5.7",
|
|
57
|
+
"@gobing-ai/ts-ai-runner": "^0.5.7",
|
|
58
|
+
"@gobing-ai/ts-dual-workflow-engine": "^0.5.7",
|
|
59
|
+
"@gobing-ai/ts-infra": "^0.5.7",
|
|
60
|
+
"@gobing-ai/ts-llm-jsonl-importer": "^0.5.7",
|
|
61
|
+
"@gobing-ai/ts-rule-engine": "^0.5.7",
|
|
62
|
+
"@gobing-ai/ts-runtime": "^0.5.7",
|
|
63
|
+
"@gobing-ai/ts-utils": "^0.5.7",
|
|
64
64
|
"@types/bun": "1.3.14",
|
|
65
65
|
"@types/figlet": "^1.7.0",
|
|
66
66
|
"@types/node-notifier": "8.0.5",
|
package/plugins/sp/README.md
CHANGED
|
@@ -186,7 +186,7 @@ pipeline step.
|
|
|
186
186
|
|
|
187
187
|
```
|
|
188
188
|
plugins/sp/
|
|
189
|
-
├── skills/ # Domain knowledge + workflow docs (
|
|
189
|
+
├── skills/ # Domain knowledge + workflow docs (39 skills)
|
|
190
190
|
│ ├── brainstorm/ # Structured ideation workflow
|
|
191
191
|
│ │ ├── agents/openai.yaml
|
|
192
192
|
│ │ ├── examples/ideation-example.md
|
|
@@ -342,6 +342,7 @@ surface or run one workflow. All skills target the same five core platforms: `cl
|
|
|
342
342
|
| `session-review` | 1.1 | Inline review of the active coding-agent session — compact outcomes, evidence-backed resolved/open issue classification, proposal-only improvements, and next actions; no workflow, import, delegation, or mutation |
|
|
343
343
|
| `spur-composer` | 1.0 | Cross-noun composition — workflow catalog selection, the ephemeral→project→shared ladder, ADR-115 budgets, trace-driven rule tuning; applies accepted `spur-doctor` proposals through `spur` verbs; never judges its own output and never runs a recurring loop |
|
|
344
344
|
| `spur-doctor` | 1.0 | Cross-noun evaluation — read-only CLI evidence per noun (task/feature/rule/workflow/agent spec), reflection over `history-anatomy` findings through a closed action-class map, and a proposal table; writes nothing; diagnoses artifacts, not runtime environments (`spur agent doctor`'s job) |
|
|
345
|
+
| `spur-check` | 1.0 | Two-tier check primitive (ADR-124) — light changed-scope checks during development, the full `bun run spur-check` chain at the quality boundary, and the fingerprint-bound `<wbs>-check-receipt.json` with the `status` reuse rule; composes with `/sp:dev-fixall --gate-log` |
|
|
345
346
|
| `redesign-web-ui` | 1.0 | Existing-UI visual upgrade — audit generic AI fingerprints, apply in-stack polish against `DESIGN.md` / live tokens, verify behavior and viewports; does not migrate frameworks |
|
|
346
347
|
| `taste-refactoring-api` | 1.0 | API design and refactoring for REST/HTTP, RPC/gRPC, GraphQL, event contracts, and CLI surfaces; compatibility, security, and migration review |
|
|
347
348
|
| `taste-refactoring-ui` | 1.0 | UI design and refactoring with visual hierarchy, typography, spacing, color, and interaction review |
|
|
@@ -512,6 +513,7 @@ hold `SKILL.md` and prompt-side companions only.
|
|
|
512
513
|
| `scripts/feature-sync-bounded.ts` | Bounded retry-suppression wrapper for `spur feature sync` during batch/wrap-up runs — suppresses identical L4-blocked repeats |
|
|
513
514
|
| `scripts/stage-registry-adapter.ts` | dev-next golden-path adapter over the canonical stage registry — TABLE A/B/C resolution bridge for the status-aware facade |
|
|
514
515
|
| `scripts/task-size-precheck.ts` | Pipeline size precheck guard (R2) — evaluates R-item/Plan-count limits to PASS/FAIL |
|
|
516
|
+
| `scripts/task-diffstat.ts` | 0943 triage-lane diffstat producer — numstat + untracked scan vs the run base; writes `<wbs>-diffstat.json` with the sensitive-path flag; fails safe (sensitive) |
|
|
515
517
|
| `scripts/validate-flag-contracts.ts` | Mechanical consistency gate — compares flag claims across command files, flag-glossary, cross-cutting, dev-operations, and ADR; reports disagreements |
|
|
516
518
|
| `*.test.ts` | Unit suites — in `hooks/` for guards, in `tests/<skill>/` per ADR-031 pairing |
|
|
517
519
|
|
|
@@ -629,7 +631,10 @@ pipeline owns one lifecycle phase:
|
|
|
629
631
|
| `idea-pipeline.yaml` | Idea/planning → feature + tasks | `/sp:dev-idea`, `/sp:dev-plan` |
|
|
630
632
|
| `wrapup-pipeline.yaml` | Post-execution wrap-up | `/sp:dev-wrap`, `/sp:dev-wrapall` |
|
|
631
633
|
| `wayfinder-resolution.yaml` | Wayfinder ticket resolution loop | `spur workflow run` (free-form) |
|
|
632
|
-
|
|
634
|
+
|
|
635
|
+
> 0946 (D64): the `decision-routing-example.yaml` authoring sample was retired from the catalogue
|
|
636
|
+
> (zero runs, example-only — `docs/design/workflow-catalogue-refactor.md` §10); the pattern lives on
|
|
637
|
+
> as a test fixture (`packages/app/tests/services/fixtures/decision-routing-example.yaml`).
|
|
633
638
|
|
|
634
639
|
### Lifecycle operations
|
|
635
640
|
|
|
@@ -86,7 +86,10 @@ You own the spaces **between** task runs:
|
|
|
86
86
|
- **Parallelize only when requested** by applying `sp:parallel-execution` to a proven-independent
|
|
87
87
|
subset (Step 3 optional path). Serialize when dependency, file-overlap, or budget checks fail.
|
|
88
88
|
Preflight still runs per WBS before fan-out; recovery stays sequential.
|
|
89
|
-
- **Inspect** each terminal state
|
|
89
|
+
- **Inspect** each terminal state via `spur workflow trace "$RUN" --follow --timeout 600000` (a
|
|
90
|
+
timeout prints one checkpoint and exits 1; the run continues, never cancelled or relaunched) plus
|
|
91
|
+
`.spur/run/<wbs>-verdict.json`, accepted only when the trace's `.run.runId` equals the dispatched
|
|
92
|
+
run and the verdict's mtime ≥ the trace's `.run.startedAt` — otherwise `stale-evidence` (Step 3.3).
|
|
90
93
|
- **One-shot recovery (optional)** - on non-PASS / stuck status, consult next-router **once** for that
|
|
91
94
|
WBS (`recoveryHint` / dry-run plan): print the child command, or dispatch once only when the batch
|
|
92
95
|
was started with `--auto` and cardinality is 1. Never self-loop until done.
|
|
@@ -264,7 +267,10 @@ Report using the batch-report template from execution-batch.md §5:
|
|
|
264
267
|
**Next:** <one-line action>
|
|
265
268
|
```
|
|
266
269
|
|
|
267
|
-
Per-task outcome vocabulary: `done` | `failed` | `blocked` | `skipped` | `
|
|
270
|
+
Per-task outcome vocabulary: `done` | `failed` | `blocked` | `skipped` | `paused` (0933: parked on
|
|
271
|
+
an operator question — escalate hop — or an approval gate; non-terminal, never `done`) |
|
|
272
|
+
`not-attempted`, plus the parallel-only `integration-conflict`
|
|
273
|
+
([execution-batch.md § Parallel isolation](../skills/spur-dev/references/execution-batch.md#parallel-isolation---mode-parallel)).
|
|
268
274
|
Batch verdict: `clean` (all attempted tasks `done`) | `halted` (a failure stopped the batch) |
|
|
269
275
|
`aborted` (cycle or selector error before any run).
|
|
270
276
|
|
|
@@ -272,9 +278,12 @@ With `--json`, emit the same shape as a JSON object for machine consumption.
|
|
|
272
278
|
|
|
273
279
|
## Out of scope (deferred)
|
|
274
280
|
|
|
275
|
-
- **Parallel execution** -
|
|
276
|
-
-
|
|
277
|
-
|
|
281
|
+
- **Parallel execution** - `--mode parallel` isolates each task in its own worktree with
|
|
282
|
+
rebase-and-FF integration; see [execution-batch.md § Parallel isolation](../skills/spur-dev/references/execution-batch.md#parallel-isolation---mode-parallel).
|
|
283
|
+
- **Interactive within-step escalation** — implemented (0933): the pipeline's `escalate` hop
|
|
284
|
+
pauses on the implement agent's operator question; the operator answers via
|
|
285
|
+
`spur workflow continue --answer-text` and the run resumes implement with the Q/A transcript
|
|
286
|
+
(bounded by `maxEscalations`). See [execution-batch.md Step 3](../skills/spur-dev/references/execution-batch.md#step-3--the-driver-loop-r3-r4).
|
|
278
287
|
|
|
279
288
|
## Platform Notes
|
|
280
289
|
|
|
@@ -14,11 +14,11 @@ Wraps the **sp:dogfood-testing** skill.
|
|
|
14
14
|
| Flag | Description | Default |
|
|
15
15
|
| --- | --- | --- |
|
|
16
16
|
| `<testee>` | Skill / command / CLI to exercise end-to-end. | required |
|
|
17
|
-
| `--agent` `<inline\|auto\|name>` |
|
|
18
|
-
| `--max-retry` `<n>` | Max auto-fix retries per
|
|
17
|
+
| `--agent` `<inline\|auto\|name>` | **Testee-scoped** agent the testee runs under — forwarded into the testee invocation; the dogfood driver always runs in the current session. | omit (forward nothing) |
|
|
18
|
+
| `--max-retry` `<n>` | Max auto-fix retries per step. `0` = observe-only. Mandatory (as `0` or `N`) for pipeline-driving testees and testees with a mutating `--fix` mode. | 2 |
|
|
19
19
|
| `--save` | Compatibility no-op; saving is now default. Retained until evidenced retirement. | off |
|
|
20
|
-
| `--task` |
|
|
21
|
-
| `--chain-follow` |
|
|
20
|
+
| `--task` | **Creates** a new review-template task for the findings (`spur task create --template review`) — it does not attach to or update the task under test. | off |
|
|
21
|
+
| `--chain-follow` | **Reads existing chained-leg evidence** (verdict artifacts, task-file diffs, review tables) after a chained leg completes, for attribution — it never executes the chained leg itself. Without it the driver stops at the testing boundary. | off |
|
|
22
22
|
| `--full` | Full report verbosity (all sections). | off |
|
|
23
23
|
|
|
24
24
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
@@ -27,9 +27,12 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
27
27
|
|
|
28
28
|
## Implementation
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
`
|
|
34
|
-
|
|
30
|
+
Follow the inline procedure in [dev-operations.md](../skills/spur-dev/references/dev-operations.md#10-fixall) (fixall). Pipeline signal: when `--gate-log` is set (the `test-fix` hop), run no full gate — the `test-recheck` state immediately after is the deciding run (R4, task 0483).
|
|
31
|
+
|
|
32
|
+
When dispatched from the pipeline's test-fix stage (F96, task 0950), the gate log carries a
|
|
33
|
+
`residual artifact` block (`<wbs>-residuals.json`) and the findings file already
|
|
34
|
+
contains the merged residual anchors: treat those items as fix targets, in order,
|
|
35
|
+
alongside gate anchors. The fixer may write `.spur/run/<wbs>-residual-deferrals.json`
|
|
36
|
+
— one `{id, reason}` entry per item — but only for P3 findings or diff markers it
|
|
37
|
+
cannot fix inside the task; the done stage settles deferrals into follow-up tasks.
|
|
35
38
|
|
|
@@ -15,7 +15,7 @@ Wraps the **sp:spur-dev** and **sp:code-implementation** skills.
|
|
|
15
15
|
| --- | --- | --- |
|
|
16
16
|
| `<wbs>` | Task WBS to run. | required |
|
|
17
17
|
| `--mode` `<full\|implement>` | Full pipeline or single implement step. | full |
|
|
18
|
-
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing stages. omit and explicit `--agent inline` resolve identically (task 0687): eligible stages dispatch once to a native subagent with host-session fallback (0508 eligibility); otherwise every stage executes in the invoking session. `auto` or a name keeps subprocess dispatch.. | omit |
|
|
18
|
+
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing stages. omit and explicit `--agent inline` resolve identically (task 0687): eligible stages dispatch once to a native subagent with host-session fallback (0508 eligibility); otherwise every stage executes in the invoking session. `auto` or a name keeps subprocess dispatch.. The opt-in `fleet` selector (0942) maps the run to `executor: 'fleet'` so `agent.run` stages dispatch through the fleet control plane (ADR-126) instead of a subprocess. | omit |
|
|
19
19
|
| `--auto` | Skip objective HITL confirmations. | off |
|
|
20
20
|
| `--next` | Chain-to-completion via the next-router. | off |
|
|
21
21
|
| `--wrap` | Run the wrap hop after the main step. The `--agent` selector is preserved into the `/sp:dev-wrap <wbs>` handoff when supplied; omission remains omission. The wrap hop is workflow-backed and reports its trigger-3 subprocess override. | off |
|
|
@@ -40,7 +40,13 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
40
40
|
|
|
41
41
|
**Flags:**
|
|
42
42
|
|
|
43
|
-
- `--auto` | `--agent <inline|auto|name>` — Skip objective HITL confirmations (taste/irreversible gates still pause). `--agent` names who does the model-bearing work. Interactive omit/`inline` keeps the controller and implement-only stages in this session; full mode reads `task-pipeline.yaml` as the SSOT and interprets its actions/guards through the inline driver, whose eligible `agent.run` stages dispatch once to a native subagent and otherwise run in the host (0508 eligibility — task 0687 resolved-inline) It records `stage <id> executed inline in session <session-id>` or `stage <id> executed via subagent <agent-id> (host session <session-id>)` in the run log. `auto` or a name is merged into `vars.agent` and `vars.implementAgent` and keeps the existing subprocess workflow. Headless `spur workflow run` / `spur agent run` is unchanged. See the [execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
43
|
+
- `--auto` | `--agent <inline|auto|name>` — Skip objective HITL confirmations (taste/irreversible gates still pause). `--agent` names who does the model-bearing work. Interactive omit/`inline` keeps the controller and implement-only stages in this session; full mode reads `task-pipeline.yaml` as the SSOT and interprets its actions/guards through the inline driver, whose eligible `agent.run` stages dispatch once to a native subagent and otherwise run in the host (0508 eligibility — task 0687 resolved-inline) It records `stage <id> executed inline in session <session-id>` or `stage <id> executed via subagent <agent-id> (host session <session-id>)` in the run log. `auto` or a name is merged into `vars.agent` and `vars.implementAgent` and keeps the existing subprocess workflow; `--agent fleet` maps the run to `vars.executor: 'fleet'` instead (fleet dispatch, 0942). Headless `spur workflow run` / `spur agent run` is unchanged. See the [execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
44
|
+
- `--escalation-file <path>` (implement step only, 0933) — names the Q/A escalation transcript
|
|
45
|
+
(default `.spur/run/<wbs>-escalation.md`). Absent on a first attempt means "no prior
|
|
46
|
+
escalations". When the implement agent needs an operator decision it appends its question to
|
|
47
|
+
`.spur/run/<wbs>-question.md` and exits 0 — the pipeline's `escalate` hop surfaces the question,
|
|
48
|
+
the operator answers via `spur workflow continue --answer-text`, and the guard appends the Q/A
|
|
49
|
+
pair to this transcript before re-entering implement, where the agent reads it and resumes.
|
|
44
50
|
|
|
45
51
|
`--worktree` `[<name>]` (run the task's pipeline in an isolated git worktree — FF-merge onto the
|
|
46
52
|
base ref on full success, retain intact on any failure/halt/non-FF; bare form creates a fresh tree,
|
|
@@ -18,12 +18,13 @@ Wraps the **sp:spur-dev** skill.
|
|
|
18
18
|
| `--mode` `<sequential\|parallel>` | Batch execution order. | sequential |
|
|
19
19
|
| `--keep-going` | Continue past per-task failures. | off |
|
|
20
20
|
| `--auto` | Skip objective HITL gates. | off |
|
|
21
|
-
| `--agent` `<inline\|auto\|name>` | Who runs each task's pipeline stages. Interactive sequential omit/`inline` uses the host-session driver with unified inline semantics (task 0687 — see below)). `auto`, a name, parallel mode, and headless invocation use subprocesses. | omit |
|
|
21
|
+
| `--agent` `<inline\|auto\|name>` | Who runs each task's pipeline stages. Interactive sequential omit/`inline` uses the host-session driver with unified inline semantics (task 0687 — see below)). `auto`, a name, parallel mode, and headless invocation use subprocesses. The opt-in `fleet` selector (0942) maps each task run to `executor: 'fleet'` so `agent.run` stages dispatch through the fleet control plane (ADR-126) instead of a subprocess. | omit |
|
|
22
22
|
| `--json` | Emit structured JSON. | off |
|
|
23
|
-
| `--wrap` | Run the wrap hop
|
|
23
|
+
| `--wrap` | Run the wrap hop **once for the batch** over the `done` subset only (Step 6 of execution-batch.md): `vars.feature` is passed only when every frozen task is `done`/`cancelled`; an empty done subset skips the wrap with a reason. The `--agent` selector is preserved into the `/sp:dev-wrap` handoff when supplied; omission remains omission. | off |
|
|
24
24
|
| `--next` | Chain-to-completion via the next-router. | off |
|
|
25
25
|
| `--continue` | Resume an interrupted batch. | off |
|
|
26
26
|
| `--worktree` `[<name>]` | Run the batch in an isolated git worktree; FF-merge on success, retain on failure. Bare `--worktree` creates a fresh tree; `--worktree <name>` adopts an existing worktree by name/path/branch. | off |
|
|
27
|
+
| `--concurrency` `<n>` | Parallel-mode worker bound: at most `<n>` task pipelines run at once (task 0931); a dependent starts only after its in-set dependencies are integrated onto the base ref. No-op in sequential mode (ignored). | 2 |
|
|
27
28
|
|
|
28
29
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
29
30
|
|
|
@@ -41,12 +42,14 @@ structured findings, before any task pipeline action, task 0510 R2; scoped: `L4.
|
|
|
41
42
|
(the expected pre-run state of any not-yet-run feature) is reported verbatim but does not abort —
|
|
42
43
|
any other strict error aborts), `--mode`
|
|
43
44
|
`<sequential|parallel>` (default `sequential`; `parallel` fans out a proven-independent subset —
|
|
44
|
-
see `execution-batch.md` § Parallel
|
|
45
|
+
see `execution-batch.md` § Parallel isolation), `--concurrency <n>`
|
|
46
|
+
(parallel-mode worker bound — at most <n> task pipelines at once, default 2; a dependent task starts
|
|
47
|
+
only after its in-set dependencies are **integrated** onto the base ref), `--keep-going`
|
|
45
48
|
(batch failure policy — skip a failed task's in-batch dependents, continue independents; default
|
|
46
49
|
halts on first failure), `--auto`
|
|
47
50
|
(sets `profile=auto` on each per-task run, skipping the HITL approve gate), `--agent <inline|auto|name>`
|
|
48
51
|
(names who runs the pipeline's stages — interactive sequential omit/`inline` uses the host driver;
|
|
49
|
-
`auto` or a name is merged into each per-task `vars.agent` and `vars.implementAgent`; parallel mode
|
|
52
|
+
`auto` or a name is merged into each per-task `vars.agent` and `vars.implementAgent`; `fleet` maps each task run to `executor: 'fleet'` instead (fleet dispatch, 0942); parallel mode
|
|
50
53
|
retains isolated subprocesses, ADR-047), `--json` (emit the
|
|
51
54
|
report as JSON), `--wrap` (trigger
|
|
52
55
|
`wrapup-pipeline.yaml` after the batch completes), `--next`
|
|
@@ -56,9 +59,10 @@ FF-merge onto the base ref on full success, retain intact on any failure/halt/no
|
|
|
56
59
|
creates a fresh tree, `<name>` form adopts an existing worktree by name/path/branch; see
|
|
57
60
|
`execution-batch.md` § Worktree isolation).
|
|
58
61
|
|
|
59
|
-
**`--worktree`
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
**`--worktree` and parallel mode.** `--worktree --mode parallel` is **rejected** — parallel mode
|
|
63
|
+
already isolates each task in its own worktree (see `execution-batch.md` § Parallel isolation), and
|
|
64
|
+
reuse mode (`--worktree <name>`) has no per-task meaning. Run parallel batches without
|
|
65
|
+
`--worktree`, or run them sequentially with it.
|
|
62
66
|
|
|
63
67
|
**`--worktree` corpus visibility.** While the batch runs in a worktree, corpus writes (task
|
|
64
68
|
statuses, kanban) land in the worktree copy; your main tree still shows pre-run statuses until the
|
|
@@ -75,7 +79,9 @@ advancing the feature lifecycle). **was: `--next` deliberately omitted; the old
|
|
|
75
79
|
**Three orthogonal axes** (do not confuse): `--keep-going`
|
|
76
80
|
= batch failure policy (does a failure halt the batch or skip dependents?);
|
|
77
81
|
`--continue` = resume from
|
|
78
|
-
checkpoint
|
|
82
|
+
checkpoint against the batch's original frozen identity — persisted plan membership, worktree
|
|
83
|
+
marker, identity-filtered checkpoints as hints (execution-batch.md § Batch continuation, task
|
|
84
|
+
0919); `--next`
|
|
79
85
|
= chain each task to terminal status + batch-once wrap. See `dev-operations.md` § runall for the
|
|
80
86
|
full distinction.
|
|
81
87
|
|
|
@@ -40,6 +40,15 @@ See `sp:code-verification` § Shippable readiness gate.
|
|
|
40
40
|
|
|
41
41
|
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
42
42
|
- `Skill(skill="sp:code-verification", args="verify $ARGUMENTS")`
|
|
43
|
+
- **Residual sweep (F96 R1):** after the verify answer is written and `task verdict` derives
|
|
44
|
+
`.spur/run/<wbs>-verdict.json`, run `residual-scan scan` + `fold` (observe-only; folds the
|
|
45
|
+
verdict's `residual-sweep` check, PASS → PARTIAL when a blocking residual exists) — under every
|
|
46
|
+
`--fix` mode — before `spur task record`. Resolve the script via `superskill script path sp
|
|
47
|
+
residual-scan.mjs`; never reference `plugins/sp/scripts/` in shipped surfaces
|
|
48
|
+
(script-contract-check rule 4). When the task reaches `done` through `--next`, run
|
|
49
|
+
`residual-scan settle` (best-effort). On a folded PARTIAL: the bounded remediation loop has
|
|
50
|
+
already run — a residual-failed task is routed to router C6 (HITL STOP), never another
|
|
51
|
+
automatic fix loop.
|
|
43
52
|
|
|
44
53
|
**Flags:**
|
|
45
54
|
|
|
@@ -72,3 +72,8 @@ Without `--fix all`, shippable is not evaluated (optional note: use `--fix all`
|
|
|
72
72
|
- Batch orchestration: `Skill(skill="sp:spur-dev", args="verifyall $ARGUMENTS")`
|
|
73
73
|
- Per-task verification (inner): `Skill(skill="sp:code-verification", args="verify <wbs> $SHARED_FLAGS")`
|
|
74
74
|
- Shippable gate: once after the batch (same skill § Shippable readiness gate)
|
|
75
|
+
- **Residual sweep (F96 R1, per task):** same contract as `/sp:dev-verify` — after each task's
|
|
76
|
+
verdict artifact is derived, run `residual-scan scan` + `fold` (under every `--fix` mode) before
|
|
77
|
+
`spur task record`; on reaching `done` via `--next`, run `settle`. Script resolution:
|
|
78
|
+
`superskill script path sp residual-scan.mjs` (never `plugins/sp/scripts/` —
|
|
79
|
+
script-contract-check rule 4).
|