@gobing-ai/spur 0.4.25 → 0.4.27
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 +7 -0
- package/config/rules/boundary/dao-boundary.yaml +2 -0
- package/config/rules/structure/test-location.yaml +2 -0
- package/package.json +2 -2
- package/plugins/sp/commands/dev-runall.md +6 -5
- package/plugins/sp/lib/destructive-policy.ts +521 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/hooks/careful-guard.ts +5 -0
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +1 -1
- package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +16 -8
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +29 -5
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +9 -0
- package/spur.js +2423 -1387
- package/web/_astro/BoardApp.BpVPF1yi.js +1 -0
- package/web/_astro/{BoardApp.CNBpKuB6.js → BoardApp.H0GHCpML.js} +157 -157
- package/web/_astro/TaskDetail.C3fD4iNx.js +1 -0
- package/web/_astro/{arc.CLFbvaU4.js → arc.CwmuZ1Pw.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.YYrMKtrm.js → architectureDiagram-3BPJPVTR.D2r2pAtD.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.D-Xzu32A.js → blockDiagram-GPEHLZMM.LRgyDihu.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.Cv7EV8QD.js → c4Diagram-AAUBKEIU.OscV13G7.js} +1 -1
- package/web/_astro/channel.OpZyofHt.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.CkAKN-fF.js → chunk-2J33WTMH.BcbENXnC.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.D-xu2Tgi.js → chunk-4BX2VUAB.CcRidR01.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.yNQibVGY.js → chunk-55IACEB6.DxAFaIIp.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.DlVIFHHZ.js → chunk-727SXJPM.Cjvuc3en.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.C-LGFaeS.js → chunk-AQP2D5EJ.B3GSEPXo.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.Df2n26zT.js → chunk-FMBD7UC4.DbpwRXpL.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.CV_k83Gj.js → chunk-ND2GUHAM.CdiLgZ9z.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.BQQDO3h3.js → chunk-QZHKN3VN.DT_2ovxF.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.DkSMdA84.js → classDiagram-4FO5ZUOK.B4Y_Byb0.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.DkSMdA84.js → classDiagram-v2-Q7XG4LA2.B4Y_Byb0.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CCN7GwAZ.js → cose-bilkent-S5V4N54A.0UOSbCRW.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.CqQCttkM.js → cynefin-OW5HDTMX.iaVw7KUy.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.CCn6iftc.js → dagre-BM42HDAG.DzBLfYbl.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DImUVZK-.js → diagram-2AECGRRQ.CtoO_RXO.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.BYNywZwV.js → diagram-5GNKFQAL.C1ah--0o.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.LJZ9DjsJ.js → diagram-KO2AKTUF.DAawwAoM.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.CJ3YpVED.js → diagram-LMA3HP47.kC7Zg0ru.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.CnVtq5_j.js → diagram-OG6HWLK6.B3dSXJ9m.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.SdmuzZwT.js → erDiagram-TEJ5UH35.cVJXYJkv.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.C9V-B-nO.js → flowDiagram-I6XJVG4X.CwD6KgFD.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.DT5v7SL5.js → ganttDiagram-6RSMTGT7.UB88xr_u.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.B3qURYBL.js → gitGraphDiagram-PVQCEYII.C4B3FNOY.js} +1 -1
- package/web/_astro/index.CKtaGArK.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.CHO0xT8l.js → infoDiagram-5YYISTIA.6QC564C4.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.buALAOGh.js → ishikawaDiagram-YF4QCWOH.sQBtM0gc.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.DvKuIdbX.js → journeyDiagram-JHISSGLW.Dslglgu2.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.Dvoi9jdN.js → kanban-definition-UN3LZRKU.CPKaPyzi.js} +1 -1
- package/web/_astro/{linear.EsEfz8Ex.js → linear.DNHY6BCF.js} +1 -1
- package/web/_astro/{mermaid.core.Vk3ryVC7.js → mermaid.core.VoW0rvGv.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.DG1pkymq.js → mindmap-definition-RKZ34NQL.jYZ-jCh7.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.DAUmIdd6.js → pieDiagram-4H26LBE5.DQ0fapSh.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.Du3QUozl.js → quadrantDiagram-W4KKPZXB.CWF406ut.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.neRi5GrQ.js → requirementDiagram-4Y6WPE33.BmUiiY0p.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.CMUtxA70.js → sankeyDiagram-5OEKKPKP.CzUeGGUK.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.CfYFLmYH.js → sequenceDiagram-3UESZ5HK.DKvkUeEk.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.Bn4dmAad.js → stateDiagram-AJRCARHV.ByedXnFB.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.BMNezvp-.js → stateDiagram-v2-BHNVJYJU.Bx7wyAlv.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.ByaDwsBX.js → timeline-definition-PNZ67QCA.Chzu_dUX.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.CUYU1Mc9.js → vennDiagram-CIIHVFJN.PuxG68DI.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.DpZZeJr2.js → wardleyDiagram-YWT4CUSO.C9ZKxfsC.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.CWwI33U0.js → xychartDiagram-2RQKCTM6.B7qR-3HU.js} +1 -1
- package/web/index.html +2 -2
- package/web/_astro/BoardApp.DVWLxHcV.js +0 -1
- package/web/_astro/TaskDetail.BY6jO_3P.js +0 -1
- package/web/_astro/channel.DzHZuqj0.js +0 -1
- package/web/_astro/index.C8LjH5ri.css +0 -1
|
@@ -20,21 +20,29 @@ results). A `paused` task is non-terminal — the report marks it `paused` (neve
|
|
|
20
20
|
the resume command. Unless `--no-summary`, follow it with the measured
|
|
21
21
|
[execution summary](dev-operations.md#execution-summary), one `--progress <wbs>=<file>` per attempted run.
|
|
22
22
|
|
|
23
|
+
Under `--auto` the report's mode field reads `Mode: --auto (keep-going)`, and `--auto` implies `--keep-going`:
|
|
24
|
+
an unattended batch never stops for a human (1318 R1). For an `--agent auto` or
|
|
25
|
+
`--agent <name>` batch, print the header `Executor pin: <name> (from <wbs>|--agent)` and fill the
|
|
26
|
+
per-task `Executor` column with the pinned executor, or `A → B (failed-agent)` for a run that was
|
|
27
|
+
re-dispatched once on a new executor (1318 R2–R4). Leave that line and column out for host-inline
|
|
28
|
+
runs, which have no executor to pin.
|
|
29
|
+
|
|
23
30
|
```
|
|
24
31
|
## Batch Report — <selector>
|
|
25
32
|
|
|
26
33
|
**Selector:** <value>
|
|
27
34
|
**Plan:** <n> tasks (ordered: <wbs-list>) · <m> blocked · <p> not-attempted
|
|
28
|
-
**Mode:** stop-the-batch | --keep-going | --auto
|
|
35
|
+
**Mode:** stop-the-batch | --keep-going | --auto (keep-going)
|
|
36
|
+
**Executor pin:** <name> (from <wbs>|--agent) ← `--agent auto`/`--agent <name>` runs only
|
|
29
37
|
**Verdict:** clean | halted | aborted
|
|
30
38
|
|
|
31
|
-
| WBS | Status | Reason |
|
|
32
|
-
|
|
33
|
-
| 0040 | done | — |
|
|
34
|
-
| 0042 | failed | verify verdict PARTIAL (see .spur/run/0042-verdict.json) |
|
|
35
|
-
| 0050 | not-attempted | batch halted after 0042 (stop-the-batch) |
|
|
36
|
-
| 0051 | skipped | dependency 0040 failed (--keep-going) |
|
|
37
|
-
| 0060 | blocked | unmet out-of-set dep: 0099 is wip |
|
|
39
|
+
| WBS | Status | Executor | Reason |
|
|
40
|
+
|-----|--------|----------|--------|
|
|
41
|
+
| 0040 | done | claude | — |
|
|
42
|
+
| 0042 | failed | codex-a → codex-b (failed-agent) | verify verdict PARTIAL (see .spur/run/0042-verdict.json) |
|
|
43
|
+
| 0050 | not-attempted | — | batch halted after 0042 (stop-the-batch) |
|
|
44
|
+
| 0051 | skipped | — | dependency 0040 failed (--keep-going) |
|
|
45
|
+
| 0060 | blocked | — | unmet out-of-set dep: 0099 is wip |
|
|
38
46
|
|
|
39
47
|
**Next:** <one-line action — pick up halted run / resolve 0099 / all green, feature H1 complete>
|
|
40
48
|
|
|
@@ -23,6 +23,9 @@ see_also:
|
|
|
23
23
|
[execution-batch-continuation.md](execution-batch-continuation.md) for `--continue`.
|
|
24
24
|
- **Never re-derive the plan** — the frozen plan is the persisted report; a new selector match is
|
|
25
25
|
`not-admitted`, not a plan change.
|
|
26
|
+
- **Fresh session per segment** — when host context nears its limit, stop after a task terminal and
|
|
27
|
+
resume in a new session with `--continue`; the persisted report and markers carry the state. A
|
|
28
|
+
near-full context slows every later turn and degrades judgment.
|
|
26
29
|
|
|
27
30
|
## What this file owns
|
|
28
31
|
|
|
@@ -146,6 +149,13 @@ recorded in the batch report, and independent tasks keep running. The batch does
|
|
|
146
149
|
- **without `--auto`:** unchanged halt behavior — the batch stops on the failing task (`--keep-going`
|
|
147
150
|
still skips only its in-batch dependents).
|
|
148
151
|
|
|
152
|
+
**`--auto` implies `--keep-going` (1318 R1).** An unattended batch never stops for a human: under
|
|
153
|
+
`--auto` every per-task failure follows §4.2 whether or not the flag is passed — a failed,
|
|
154
|
+
cancelled, `stale-evidence` or worker-lost (1317) task is recorded `failed`, its in-batch
|
|
155
|
+
dependents are `skipped` with `dependency <wbs> failed`, and independent tasks keep running. The
|
|
156
|
+
refine pass above is only the extra step before that, not an exception. Without `--auto` the §4.1
|
|
157
|
+
stop-the-batch default is unchanged. No new flag.
|
|
158
|
+
|
|
149
159
|
`--tasks <value>` (or the effective value after normalization) resolves to a frozen set of task WBS numbers. Resolution happens **once, at
|
|
150
160
|
kickoff** — the driver never re-queries `spur task list` to recompute membership mid-batch (R2.1).
|
|
151
161
|
|
|
@@ -408,6 +418,18 @@ The host session remains the orchestrator for interactive sequential omit/inline
|
|
|
408
418
|
owns explicit-executor and parallel paths; there the flag pins the per-task step executor, not the
|
|
409
419
|
orchestrator.
|
|
410
420
|
|
|
421
|
+
**Executor pin (1318 R2/R3).** `--agent auto` is resolved **once per batch**, not once per task:
|
|
422
|
+
after the first task run, read the resolved implement executor from that run's implement `agent.run`
|
|
423
|
+
trace event — `spur workflow trace <run> --json` → `.events[] | select(.node=="implement" and
|
|
424
|
+
.actionKind=="agent.run") | .result.executor` — and dispatch every later task with
|
|
425
|
+
`--agent <that executor>`. The report's header records `Executor pin: <name> (from <wbs>)`; an
|
|
426
|
+
explicit `--agent <name>` records `(from --agent)` and needs no resolution. A task whose run ends
|
|
427
|
+
with `terminalReason == "failed-agent"` is re-dispatched **exactly once** with `--agent auto`; a
|
|
428
|
+
different resolved executor then becomes the pin for the remaining tasks, and a second
|
|
429
|
+
`failed-agent` records the task `failed` under the failure policy with the pin kept. No other terminal reason
|
|
430
|
+
is ever retried on a new executor. `--agent inline` (host driver) has no executor
|
|
431
|
+
to pin, so R2/R3 do not apply.
|
|
432
|
+
|
|
411
433
|
### 3.3 Terminal-state inspection
|
|
412
434
|
|
|
413
435
|
Each pipeline run ends in one of two terminal states:
|
|
@@ -525,10 +547,11 @@ belongs to a subagent or the operator, not to the batch controller's report loop
|
|
|
525
547
|
|
|
526
548
|
## Step 4 — Failure policy (R3)
|
|
527
549
|
|
|
528
|
-
### 4.1 Stop-the-batch (default) (R3.1)
|
|
550
|
+
### 4.1 Stop-the-batch (default unless `--auto`) (R3.1)
|
|
529
551
|
|
|
530
|
-
By default
|
|
531
|
-
as `not-attempted`. The report lists succeeded, failed,
|
|
552
|
+
By default — i.e. without `--auto` (1318 R1) — the **first** pipeline failure halts the batch.
|
|
553
|
+
Remaining tasks in the plan are reported as `not-attempted`. The report lists succeeded, failed,
|
|
554
|
+
and not-attempted tasks.
|
|
532
555
|
|
|
533
556
|
**Run-failed / task-done (observed 2026-10-19, feature P1).** A run can fail *after* the task is
|
|
534
557
|
already finished: the `done` state's close commands run last, and a lint or anchor rule can refuse
|
|
@@ -540,9 +563,10 @@ contract, not to a run whose last recorded state was superseded. Surface it in t
|
|
|
540
563
|
way (never silently continue), and never re-run the pipeline just to flip a run row from `failed` to
|
|
541
564
|
`done` — a second run re-executes model stages for a task that is already closed.
|
|
542
565
|
|
|
543
|
-
### 4.2 `--keep-going` (R3.2)
|
|
566
|
+
### 4.2 `--keep-going` (R3.2), or implied by `--auto`
|
|
544
567
|
|
|
545
|
-
With `--keep-going
|
|
568
|
+
With `--keep-going` — passed explicitly, or implied by `--auto` (1318 R1) — a failed task does
|
|
569
|
+
**not** halt the batch. Instead:
|
|
546
570
|
|
|
547
571
|
- The failed task's **in-batch dependents** (tasks in the plan that transitively depend on it) are
|
|
548
572
|
marked `skipped` with the failed dependency as the reason — they cannot run because their dep did
|
|
@@ -138,6 +138,11 @@ Only declared where the command already has at least one HITL gate the flag can
|
|
|
138
138
|
taste gates (idea-eval, design-approval) — every gate there is reversible corpus writes. A gate
|
|
139
139
|
without an actionable recommendation (missing eval recommendation, FAIL design check) still pauses.
|
|
140
140
|
|
|
141
|
+
**Batch policy** (`dev-runall`): `--auto` implies `--keep-going` — an unattended batch never stops
|
|
142
|
+
for a human. With `--agent auto` the driver also pins ONE executor for the batch — `Executor pin:
|
|
143
|
+
<name>`, read from the first run's implement `result.executor` — and only a `failed-agent` ending
|
|
144
|
+
re-resolves it, exactly once (1318 R1–R3).
|
|
145
|
+
|
|
141
146
|
### `--keep-going` — batch failure policy: skip dependents, continue independents
|
|
142
147
|
|
|
143
148
|
**Anchor:** `#flag-keep-going`.
|
|
@@ -146,6 +151,10 @@ Batch operation only (`dev-refineall`, `dev-runall`). When a task in the batch
|
|
|
146
151
|
fails, skip its in-batch dependents and continue the independent ones, instead of the default
|
|
147
152
|
halt-on-first-failure. Never silently retried; the failure is still reported.
|
|
148
153
|
|
|
154
|
+
**Default:** off, except under `--auto` — `--auto` implies `--keep-going` (1318 R1), because an
|
|
155
|
+
unattended batch that stops to wait for a human is the defect it was supposed to avoid. To stop at
|
|
156
|
+
the first failure, run without `--auto`.
|
|
157
|
+
|
|
149
158
|
### `--defer-gate` — opt-in parallel-batch gate policy (task 1111 / H15)
|
|
150
159
|
|
|
151
160
|
**Applies to:** `/sp-dev-runall --mode parallel`, and `--mode auto` when it resolves to parallel.
|