@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.
Files changed (68) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +7 -0
  3. package/config/rules/boundary/dao-boundary.yaml +2 -0
  4. package/config/rules/structure/test-location.yaml +2 -0
  5. package/package.json +2 -2
  6. package/plugins/sp/commands/dev-runall.md +6 -5
  7. package/plugins/sp/lib/destructive-policy.ts +521 -0
  8. package/plugins/sp/plugin.json +1 -1
  9. package/plugins/sp/scripts/hooks/careful-guard.ts +5 -0
  10. package/plugins/sp/skills/spur-dev/references/dev-operations.md +1 -1
  11. package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +16 -8
  12. package/plugins/sp/skills/spur-dev/references/execution-batch.md +29 -5
  13. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +9 -0
  14. package/spur.js +2423 -1387
  15. package/web/_astro/BoardApp.BpVPF1yi.js +1 -0
  16. package/web/_astro/{BoardApp.CNBpKuB6.js → BoardApp.H0GHCpML.js} +157 -157
  17. package/web/_astro/TaskDetail.C3fD4iNx.js +1 -0
  18. package/web/_astro/{arc.CLFbvaU4.js → arc.CwmuZ1Pw.js} +1 -1
  19. package/web/_astro/{architectureDiagram-3BPJPVTR.YYrMKtrm.js → architectureDiagram-3BPJPVTR.D2r2pAtD.js} +1 -1
  20. package/web/_astro/{blockDiagram-GPEHLZMM.D-Xzu32A.js → blockDiagram-GPEHLZMM.LRgyDihu.js} +1 -1
  21. package/web/_astro/{c4Diagram-AAUBKEIU.Cv7EV8QD.js → c4Diagram-AAUBKEIU.OscV13G7.js} +1 -1
  22. package/web/_astro/channel.OpZyofHt.js +1 -0
  23. package/web/_astro/{chunk-2J33WTMH.CkAKN-fF.js → chunk-2J33WTMH.BcbENXnC.js} +1 -1
  24. package/web/_astro/{chunk-4BX2VUAB.D-xu2Tgi.js → chunk-4BX2VUAB.CcRidR01.js} +1 -1
  25. package/web/_astro/{chunk-55IACEB6.yNQibVGY.js → chunk-55IACEB6.DxAFaIIp.js} +1 -1
  26. package/web/_astro/{chunk-727SXJPM.DlVIFHHZ.js → chunk-727SXJPM.Cjvuc3en.js} +1 -1
  27. package/web/_astro/{chunk-AQP2D5EJ.C-LGFaeS.js → chunk-AQP2D5EJ.B3GSEPXo.js} +1 -1
  28. package/web/_astro/{chunk-FMBD7UC4.Df2n26zT.js → chunk-FMBD7UC4.DbpwRXpL.js} +1 -1
  29. package/web/_astro/{chunk-ND2GUHAM.CV_k83Gj.js → chunk-ND2GUHAM.CdiLgZ9z.js} +1 -1
  30. package/web/_astro/{chunk-QZHKN3VN.BQQDO3h3.js → chunk-QZHKN3VN.DT_2ovxF.js} +1 -1
  31. package/web/_astro/{classDiagram-4FO5ZUOK.DkSMdA84.js → classDiagram-4FO5ZUOK.B4Y_Byb0.js} +1 -1
  32. package/web/_astro/{classDiagram-v2-Q7XG4LA2.DkSMdA84.js → classDiagram-v2-Q7XG4LA2.B4Y_Byb0.js} +1 -1
  33. package/web/_astro/{cose-bilkent-S5V4N54A.CCN7GwAZ.js → cose-bilkent-S5V4N54A.0UOSbCRW.js} +1 -1
  34. package/web/_astro/{cynefin-OW5HDTMX.CqQCttkM.js → cynefin-OW5HDTMX.iaVw7KUy.js} +1 -1
  35. package/web/_astro/{dagre-BM42HDAG.CCn6iftc.js → dagre-BM42HDAG.DzBLfYbl.js} +1 -1
  36. package/web/_astro/{diagram-2AECGRRQ.DImUVZK-.js → diagram-2AECGRRQ.CtoO_RXO.js} +1 -1
  37. package/web/_astro/{diagram-5GNKFQAL.BYNywZwV.js → diagram-5GNKFQAL.C1ah--0o.js} +1 -1
  38. package/web/_astro/{diagram-KO2AKTUF.LJZ9DjsJ.js → diagram-KO2AKTUF.DAawwAoM.js} +1 -1
  39. package/web/_astro/{diagram-LMA3HP47.CJ3YpVED.js → diagram-LMA3HP47.kC7Zg0ru.js} +1 -1
  40. package/web/_astro/{diagram-OG6HWLK6.CnVtq5_j.js → diagram-OG6HWLK6.B3dSXJ9m.js} +1 -1
  41. package/web/_astro/{erDiagram-TEJ5UH35.SdmuzZwT.js → erDiagram-TEJ5UH35.cVJXYJkv.js} +1 -1
  42. package/web/_astro/{flowDiagram-I6XJVG4X.C9V-B-nO.js → flowDiagram-I6XJVG4X.CwD6KgFD.js} +1 -1
  43. package/web/_astro/{ganttDiagram-6RSMTGT7.DT5v7SL5.js → ganttDiagram-6RSMTGT7.UB88xr_u.js} +1 -1
  44. package/web/_astro/{gitGraphDiagram-PVQCEYII.B3qURYBL.js → gitGraphDiagram-PVQCEYII.C4B3FNOY.js} +1 -1
  45. package/web/_astro/index.CKtaGArK.css +1 -0
  46. package/web/_astro/{infoDiagram-5YYISTIA.CHO0xT8l.js → infoDiagram-5YYISTIA.6QC564C4.js} +1 -1
  47. package/web/_astro/{ishikawaDiagram-YF4QCWOH.buALAOGh.js → ishikawaDiagram-YF4QCWOH.sQBtM0gc.js} +1 -1
  48. package/web/_astro/{journeyDiagram-JHISSGLW.DvKuIdbX.js → journeyDiagram-JHISSGLW.Dslglgu2.js} +1 -1
  49. package/web/_astro/{kanban-definition-UN3LZRKU.Dvoi9jdN.js → kanban-definition-UN3LZRKU.CPKaPyzi.js} +1 -1
  50. package/web/_astro/{linear.EsEfz8Ex.js → linear.DNHY6BCF.js} +1 -1
  51. package/web/_astro/{mermaid.core.Vk3ryVC7.js → mermaid.core.VoW0rvGv.js} +4 -4
  52. package/web/_astro/{mindmap-definition-RKZ34NQL.DG1pkymq.js → mindmap-definition-RKZ34NQL.jYZ-jCh7.js} +1 -1
  53. package/web/_astro/{pieDiagram-4H26LBE5.DAUmIdd6.js → pieDiagram-4H26LBE5.DQ0fapSh.js} +1 -1
  54. package/web/_astro/{quadrantDiagram-W4KKPZXB.Du3QUozl.js → quadrantDiagram-W4KKPZXB.CWF406ut.js} +1 -1
  55. package/web/_astro/{requirementDiagram-4Y6WPE33.neRi5GrQ.js → requirementDiagram-4Y6WPE33.BmUiiY0p.js} +1 -1
  56. package/web/_astro/{sankeyDiagram-5OEKKPKP.CMUtxA70.js → sankeyDiagram-5OEKKPKP.CzUeGGUK.js} +1 -1
  57. package/web/_astro/{sequenceDiagram-3UESZ5HK.CfYFLmYH.js → sequenceDiagram-3UESZ5HK.DKvkUeEk.js} +1 -1
  58. package/web/_astro/{stateDiagram-AJRCARHV.Bn4dmAad.js → stateDiagram-AJRCARHV.ByedXnFB.js} +1 -1
  59. package/web/_astro/{stateDiagram-v2-BHNVJYJU.BMNezvp-.js → stateDiagram-v2-BHNVJYJU.Bx7wyAlv.js} +1 -1
  60. package/web/_astro/{timeline-definition-PNZ67QCA.ByaDwsBX.js → timeline-definition-PNZ67QCA.Chzu_dUX.js} +1 -1
  61. package/web/_astro/{vennDiagram-CIIHVFJN.CUYU1Mc9.js → vennDiagram-CIIHVFJN.PuxG68DI.js} +1 -1
  62. package/web/_astro/{wardleyDiagram-YWT4CUSO.DpZZeJr2.js → wardleyDiagram-YWT4CUSO.C9ZKxfsC.js} +1 -1
  63. package/web/_astro/{xychartDiagram-2RQKCTM6.CWwI33U0.js → xychartDiagram-2RQKCTM6.B7qR-3HU.js} +1 -1
  64. package/web/index.html +2 -2
  65. package/web/_astro/BoardApp.DVWLxHcV.js +0 -1
  66. package/web/_astro/TaskDetail.BY6jO_3P.js +0 -1
  67. package/web/_astro/channel.DzHZuqj0.js +0 -1
  68. 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, the **first** pipeline failure halts the batch. Remaining tasks in the plan are reported
531
- as `not-attempted`. The report lists succeeded, failed, and not-attempted tasks.
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`, a failed task does **not** halt the batch. Instead:
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.