@gobing-ai/spur 0.3.43 → 0.3.45

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 (76) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/rules/README.md +12 -4
  3. package/config/rules/recommended-pre-check.yaml +4 -4
  4. package/config/rules/strict-check.yaml +7 -4
  5. package/config/templates/AGENTS.md +5 -0
  6. package/config/workflows/idea-pipeline.yaml +205 -33
  7. package/config/workflows/task-pipeline.yaml +1 -1
  8. package/package.json +9 -9
  9. package/plugins/sp/commands/dev-find-next.md +20 -12
  10. package/plugins/sp/commands/dev-runall.md +3 -1
  11. package/plugins/sp/plugin.json +1 -1
  12. package/plugins/sp/skills/next-feature/SKILL.md +17 -13
  13. package/plugins/sp/skills/next-feature/references/handoff-routing.md +12 -7
  14. package/plugins/sp/skills/next-feature/references/signal-derivation.md +39 -2
  15. package/plugins/sp/skills/spur-cli/SKILL.md +3 -0
  16. package/plugins/sp/skills/spur-cli/references/features/hierarchy-mece.md +8 -3
  17. package/plugins/sp/skills/spur-cli/references/tasks.md +22 -0
  18. package/plugins/sp/skills/spur-dev/SKILL.md +12 -4
  19. package/plugins/sp/skills/spur-dev/references/dev-operations.md +1 -1
  20. package/plugins/sp/skills/spur-dev/references/execution-batch.md +12 -3
  21. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +6 -5
  22. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +53 -0
  23. package/spur.js +1866 -544
  24. package/web/_astro/BoardApp.Ce6zJYAH.js +1 -0
  25. package/web/_astro/BoardApp.DKyrGxdo.js +179 -0
  26. package/web/_astro/{TaskDetail.DOKJP-Kp.js → TaskDetail.6-27_LMa.js} +1 -1
  27. package/web/_astro/{arc.CTqmqspU.js → arc.Df-9AQvS.js} +1 -1
  28. package/web/_astro/{architectureDiagram-3BPJPVTR.B0iBdehs.js → architectureDiagram-3BPJPVTR.VAI_-paS.js} +1 -1
  29. package/web/_astro/{blockDiagram-GPEHLZMM.BHE5UFj5.js → blockDiagram-GPEHLZMM.DFpUY1ue.js} +1 -1
  30. package/web/_astro/{c4Diagram-AAUBKEIU.DQApkgGM.js → c4Diagram-AAUBKEIU.CF8doOpg.js} +1 -1
  31. package/web/_astro/channel.Uhm9O3UV.js +1 -0
  32. package/web/_astro/{chunk-2J33WTMH.fPrKLM8v.js → chunk-2J33WTMH.BnjK3fjt.js} +1 -1
  33. package/web/_astro/{chunk-4BX2VUAB.DExvwBhn.js → chunk-4BX2VUAB.x6ZDnJKq.js} +1 -1
  34. package/web/_astro/{chunk-55IACEB6.EjNkjuD6.js → chunk-55IACEB6.zY-0uu7w.js} +1 -1
  35. package/web/_astro/{chunk-727SXJPM.Dl8xy5rT.js → chunk-727SXJPM.BZxKg_Vi.js} +1 -1
  36. package/web/_astro/{chunk-AQP2D5EJ.BSzMBgBs.js → chunk-AQP2D5EJ.Cpi9G9Td.js} +1 -1
  37. package/web/_astro/{chunk-FMBD7UC4.CAeOHpbb.js → chunk-FMBD7UC4.DWTB-Pif.js} +1 -1
  38. package/web/_astro/{chunk-ND2GUHAM.Bbeu_ZOH.js → chunk-ND2GUHAM.BPDQbiOG.js} +1 -1
  39. package/web/_astro/{chunk-QZHKN3VN.Da_GaIAZ.js → chunk-QZHKN3VN.BRWIcuoM.js} +1 -1
  40. package/web/_astro/{classDiagram-4FO5ZUOK.sMfFYSQp.js → classDiagram-4FO5ZUOK.mGTCZsDO.js} +1 -1
  41. package/web/_astro/{classDiagram-v2-Q7XG4LA2.sMfFYSQp.js → classDiagram-v2-Q7XG4LA2.mGTCZsDO.js} +1 -1
  42. package/web/_astro/{cose-bilkent-S5V4N54A.PS3IwOH4.js → cose-bilkent-S5V4N54A.D1GEut-z.js} +1 -1
  43. package/web/_astro/{dagre-BM42HDAG.EQCx8a6D.js → dagre-BM42HDAG.BV0XG9Do.js} +1 -1
  44. package/web/_astro/{diagram-2AECGRRQ.aEFQl8v8.js → diagram-2AECGRRQ.DzpYxsjo.js} +1 -1
  45. package/web/_astro/{diagram-5GNKFQAL.jyN4tqFX.js → diagram-5GNKFQAL.Cm9YzJh4.js} +1 -1
  46. package/web/_astro/{diagram-KO2AKTUF.DaTVHnme.js → diagram-KO2AKTUF.BjhottUj.js} +1 -1
  47. package/web/_astro/{diagram-LMA3HP47.DWsGRLAN.js → diagram-LMA3HP47.BFsQW5kb.js} +1 -1
  48. package/web/_astro/{diagram-OG6HWLK6.DYxmOViu.js → diagram-OG6HWLK6.8pdpzSWO.js} +1 -1
  49. package/web/_astro/{erDiagram-TEJ5UH35.BKM75coa.js → erDiagram-TEJ5UH35.Bd7KUJmJ.js} +1 -1
  50. package/web/_astro/{flowDiagram-I6XJVG4X.B7qpqDW5.js → flowDiagram-I6XJVG4X.7LWffkaE.js} +1 -1
  51. package/web/_astro/{ganttDiagram-6RSMTGT7.CYBL-hwy.js → ganttDiagram-6RSMTGT7.BeDcO5tI.js} +1 -1
  52. package/web/_astro/{gitGraphDiagram-PVQCEYII.Cz4ly3Kq.js → gitGraphDiagram-PVQCEYII.Ca4n730A.js} +1 -1
  53. package/web/_astro/{index.yAse9IaO.css → index.Dbvuw6d4.css} +1 -1
  54. package/web/_astro/{infoDiagram-5YYISTIA.CIS7cXrJ.js → infoDiagram-5YYISTIA.B0OakQYb.js} +1 -1
  55. package/web/_astro/{ishikawaDiagram-YF4QCWOH.DQ-pmaOG.js → ishikawaDiagram-YF4QCWOH.DSmNQe-1.js} +1 -1
  56. package/web/_astro/{journeyDiagram-JHISSGLW.DVS6F7UM.js → journeyDiagram-JHISSGLW.Cy5ruEUu.js} +1 -1
  57. package/web/_astro/{kanban-definition-UN3LZRKU.D8t-G-U6.js → kanban-definition-UN3LZRKU.CUJXub0p.js} +1 -1
  58. package/web/_astro/{linear.IO8rTd_n.js → linear.DC1jCCXn.js} +1 -1
  59. package/web/_astro/{mermaid.core.CjVnvFNf.js → mermaid.core.DxVP99Ab.js} +4 -4
  60. package/web/_astro/{mindmap-definition-RKZ34NQL.DZoEMTnU.js → mindmap-definition-RKZ34NQL.D0MaV6sJ.js} +1 -1
  61. package/web/_astro/{pieDiagram-4H26LBE5.86r1QWnX.js → pieDiagram-4H26LBE5.DCC6_q32.js} +1 -1
  62. package/web/_astro/{quadrantDiagram-W4KKPZXB.DzFA9uPk.js → quadrantDiagram-W4KKPZXB.BeUOAM7C.js} +1 -1
  63. package/web/_astro/{requirementDiagram-4Y6WPE33.dQvdvfMr.js → requirementDiagram-4Y6WPE33.Dbl4MASO.js} +1 -1
  64. package/web/_astro/{sankeyDiagram-5OEKKPKP.BvC-VNI8.js → sankeyDiagram-5OEKKPKP.HsLg0VS4.js} +1 -1
  65. package/web/_astro/{sequenceDiagram-3UESZ5HK.DDQNwHs8.js → sequenceDiagram-3UESZ5HK.DT7DJTnZ.js} +1 -1
  66. package/web/_astro/{stateDiagram-AJRCARHV.BKwYy-tQ.js → stateDiagram-AJRCARHV.d_ju1Vr1.js} +1 -1
  67. package/web/_astro/{stateDiagram-v2-BHNVJYJU.KxCiRYYf.js → stateDiagram-v2-BHNVJYJU.DMCAjMJ4.js} +1 -1
  68. package/web/_astro/{timeline-definition-PNZ67QCA.Bh9NDjOx.js → timeline-definition-PNZ67QCA.DNOHr62_.js} +1 -1
  69. package/web/_astro/{vennDiagram-CIIHVFJN.DIM-n6us.js → vennDiagram-CIIHVFJN.B7dUy-1W.js} +1 -1
  70. package/web/_astro/{wardley-L42UT6IY.DW15qOFQ.js → wardley-L42UT6IY.DEqOXvBh.js} +1 -1
  71. package/web/_astro/{wardleyDiagram-YWT4CUSO.UTIvjsG9.js → wardleyDiagram-YWT4CUSO.BCRb2p6x.js} +1 -1
  72. package/web/_astro/{xychartDiagram-2RQKCTM6.CQYhkVDS.js → xychartDiagram-2RQKCTM6.NxVQLdBh.js} +1 -1
  73. package/web/index.html +2 -2
  74. package/web/_astro/BoardApp.8sc6Rb1t.js +0 -179
  75. package/web/_astro/BoardApp.ChKnY1JD.js +0 -1
  76. package/web/_astro/channel.B0q9WGrH.js +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.3.43",
3
+ "version": "0.3.45",
4
4
  "description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics.",
5
5
  "extensions": {
6
6
  "pi": ["./hooks/pi/guard-extension.ts"]
@@ -40,9 +40,9 @@ in this corpus it is 76% one value (0493 measurement).
40
40
  **Propose, never apply.** This skill performs no `spur feature move` and writes nothing under
41
41
  `docs/features/**`. The only path from a structure proposal to a changed tree is
42
42
  `/sp:dev-featurechange` (dry-run → confirm → apply). Ranking runs are read-only; the sole exception is
43
- `--task`, which after an **explicit operator confirm** dispatches `/sp:dev-plan` and
44
- `/sp:dev-refineall` — commands that write `docs/tasks*/` through their own gates. This skill still
45
- creates no tasks itself.
43
+ `--task`, which after an **operator confirm** (interactive, or auto-accepted under `--auto`)
44
+ dispatches `/sp:dev-plan` and `/sp:dev-refineall` — commands that write `docs/tasks*/` through their
45
+ own gates. This skill still creates no tasks itself.
46
46
 
47
47
  ## When to Use
48
48
 
@@ -89,13 +89,16 @@ Run the steps in order. Each step's depth lives in its reference; this file is t
89
89
  at the ranking; advancing a chosen feature is `/sp:dev-next`'s job.
90
90
  7. **`--task` only — confirm, then dispatch the planning half.** Offer the rank-1 candidate (or the
91
91
  id passed as `--task <feature-id>` — which may name a **gated** feature, since T2/T3/T4 are tiers
92
- the rubric assigns to the gated list and only T1 comes from the ranked frontier), take an
93
- **explicit** operator confirmation, then route on the
94
- tier step 4 already assigned: T3 with zero tasks `/sp:dev-plan --feature <id>` then
95
- `/sp:dev-refineall --feature <id> --auto --depth ready`; T1 refineall only; T3 with invalid AC,
96
- T2, and T4 stop with their reason. **This skill creates no tasks itself** the dispatched
97
- commands own decomposition and its schema gate. The confirm pauses regardless of `--auto`. Full
98
- contract: [references/handoff-routing.md](references/handoff-routing.md).
92
+ the rubric assigns to the gated list and only T1 comes from the ranked frontier). **Without
93
+ `--auto`:** take an explicit operator confirmation (accept the offer, name another candidate, or
94
+ decline). **With `--auto`:** auto-accept the offered target (rank-1 for bare `--task`, or the
95
+ explicit id) the flag is operator pre-consent to take the ranking's recommendation — then
96
+ proceed without a HITL pause. Route on the tier step 4 already assigned: T3 with zero tasks →
97
+ `/sp:dev-plan --feature <id>` then `/sp:dev-refineall --feature <id> --auto --depth ready`; T1
98
+ refineall only; T3 with invalid AC, T2, and T4 stop with their reason. **This skill creates no
99
+ tasks itself** — the dispatched commands own decomposition and its schema gate. Forward `--auto`
100
+ into the dispatched children. Full contract:
101
+ [references/handoff-routing.md](references/handoff-routing.md).
99
102
 
100
103
  ## Anti-patterns — do not do these
101
104
 
@@ -105,9 +108,10 @@ Run the steps in order. Each step's depth lives in its reference; this file is t
105
108
  - Copying the B3 predicate into this skill. Cite it; read it at runtime.
106
109
  - Any `spur feature move`, or writing proposals anywhere `docs/features/**` — featurechange owns apply.
107
110
  - Decomposing a feature here, or calling `spur task create` / `spur task batch-create` under `--task`.
108
- Dispatch `/sp:dev-plan`; it owns decomposition and the batch-create schema gate. Equally: skipping
109
- the `--task` confirm because `--auto` was passed, or decomposing a T1 feature that already has a
110
- live task frontier.
111
+ Dispatch `/sp:dev-plan`; it owns decomposition and the batch-create schema gate. Equally:
112
+ dispatching under `--auto` without `--task` (there is no confirm to skip), auto-accepting a target
113
+ other than the offer / named `--task <id>`, or decomposing a T1 feature that already has a live
114
+ task frontier.
111
115
  - Padding the defect list with tidiness findings that move no rank.
112
116
  - Re-proposing F31's rejected merges (B∪H, J∪K body-merge) or reading
113
117
  `## Applied mapping` as current state — letters are recycled; resolve against live features.
@@ -65,15 +65,20 @@ survivors would make its primary case unreachable. Offer the rank-1 ranked candi
65
65
  | **T2 — unblock first** | gated on a blocker | **Refuse.** Name the blocker and its owner. Tasks created under a blocked feature cannot run. |
66
66
  | **T4 — stale-done** | post-sync status would be `done` | **Refuse.** Route to `/sp:dev-wrapall --feature <id>` or the sync-first block; the work is finished, not startable. |
67
67
 
68
- ### The confirmation is unconditional
68
+ ### The confirmation interactive by default, auto-accepted under `--auto`
69
69
 
70
70
  | Rule | Detail |
71
71
  | --- | --- |
72
- | Default offer | The rank-1 candidate. The operator may confirm it, name another candidate from the report, or decline. |
73
- | `--task <feature-id>` | An explicit id skips the *default-offer* step. It does **not** skip the confirm. |
74
- | `--auto` | Forwarded to the dispatched children (`dev-plan --auto`, `dev-refineall --auto`). It **never** answers the confirm choosing what to invest in is a taste decision (Auto-Decision Principle #5), and `ranking-rubric.md` already states the operator overrides the ranking. |
75
- | No escape | There is no `--yes` / `--force` bypass. No path exists from `--task` to a created task file without an explicit operator decision. |
76
- | Refusal | Declining ends the run at the report. Nothing is written. |
72
+ | Default offer | The rank-1 candidate. Without `--auto`, the operator may confirm it, name another candidate from the report, or decline. |
73
+ | `--task <feature-id>` | An explicit id becomes the offered target (skips the *default-offer* step). Without `--auto` it still requires confirm; with `--auto` the named id is auto-accepted. |
74
+ | `--auto` | **Two effects:** (1) auto-accept the offered target — rank-1 for bare `--task`, or the explicit `--task <feature-id>` — without a HITL pause; (2) forward into the dispatched children (`dev-plan --auto`, `dev-refineall --auto`). Passing `--auto` is operator **pre-consent** to take the ranking's recommendation (streamline path); it does **not** invent a different target, and it does **not** bypass T2/T4 refuse or invalid-AC stop. Without `--task`, `--auto` is a no-op (ranking-only has no HITL). |
75
+ | Report the accept | When `--auto` accepts, print a one-line note: `auto-accepted target <id> (tier <Tn>) via --auto` so the transcript records the decision. |
76
+ | Refusal | Declining (interactive path only) ends the run at the report. Nothing is written. |
77
+
78
+ **Why this is not a Principle #5 taste auto-click.** The ranking already produced the recommendation;
79
+ `--auto` only skips the *proceed-with-offer* pause. Overriding the ranking (picking a non-offered
80
+ candidate) still requires the interactive confirm path. Architecture / design-approval taste gates
81
+ inside dispatched children remain governed by their own contracts (`--approve-taste` where applicable).
77
82
 
78
83
  ### What `--task` does not change
79
84
 
@@ -89,4 +94,4 @@ adds one gated path to `docs/tasks*/`, through commands that own their own gates
89
94
  | Defect proposals | stdout; optionally appended to `docs/plans/feature-tree-restructure-map.md` |
90
95
  | "Sync first" block | top of report when the dry-run proposes frontier changes |
91
96
  | Winner handoff | printed `/sp:dev-next <id>` hint — operator runs it |
92
- | `--task` dispatch | after an explicit confirm: `/sp:dev-plan` and/or `/sp:dev-refineall`, which write `docs/tasks*/` through their own gates |
97
+ | `--task` dispatch | after confirm (interactive) or auto-accept (`--auto`): `/sp:dev-plan` and/or `/sp:dev-refineall`, which write `docs/tasks*/` through their own gates |
@@ -19,6 +19,11 @@ status on sync). Rules:
19
19
  - Urgency signals premised on raw `status` (sunk-work decay, WIP pressure, staleness) are computed
20
20
  only against the post-sync view — 0493 rejected all three as standalone signals; post-sync they
21
21
  survive only as tie-break texture (see ranking-rubric.md).
22
+ - The dry run is captured **exactly once per run**; the captured result is the sole source of the
23
+ post-sync status view for protocol steps 1–4 (gating, roster completion, and signal derivation
24
+ all read the same in-memory capture). This is a prompt-run capture, not a cache/state file: the
25
+ run never issues a second `spur feature sync --all --dry-run --json` call, and no other verb
26
+ reproduces it in this run.
22
27
 
23
28
  ## §1 — Actionability gate (runtime citation, never restated)
24
29
 
@@ -32,11 +37,34 @@ Inputs per candidate feature:
32
37
  spur task list --feature <id> --json
33
38
  ```
34
39
 
35
- Apply B3 over the feature's tasks. **Zero actionable tasks gated, not ranked.** Record the gating
40
+ `task list --feature` is **active-folder-only**: it enumerates tasks in the active task folder
41
+ (`.spur/config.yaml`) and omits linked tasks archived in the other configured folders. Apply B3 over
42
+ that list. **Zero actionable tasks ⇒ gated, not ranked.** Record the gating
36
43
  reason verbatim for the report's gated list: `all tasks terminal` / `blocked: <task wbs> — <reason>`
37
44
  / `no tasks`. A blocked task with no corpus dependency is an **external** block (approval, trigger) —
38
45
  report it as such; it is not satisfiable by ranking other work first.
39
46
 
47
+ **Complete the roster before declaring terminal or empty.** If the active view yields no B3
48
+ frontier candidate and the tentative reason is `all tasks terminal` or `no tasks`, the active view
49
+ is not authoritative — a frontier task may be archived outside it. Run the fallback once:
50
+
51
+ 1. Consult the §0 capture (the run's single `spur feature sync --all --dry-run --json` result) for
52
+ the feature's row as an **anomaly hint** only: it may flag the feature without naming a WBS. The
53
+ sync reason is never treated as a WBS source — no WBS is ever inferred from sync prose.
54
+ 2. Scan the whole corpus for linked tasks:
55
+ ```bash
56
+ rg -l '^feature_id: "?<id>"?$' docs/tasks*/
57
+ ```
58
+ Corpus ids are `[A-Z][0-9]+`-shaped, so `<id>` is regex-safe as-is; escape metacharacters if a
59
+ non-conforming id ever appears.
60
+ 3. Parse the leading WBS from each matched basename; resolve every corpus-only WBS (not present in
61
+ the active list) with `spur task show <wbs> --json`.
62
+ 4. Union the active-list records with the resolved corpus records, deduplicate by WBS, and reapply
63
+ runtime B3 to the complete set.
64
+ 5. Record the gating reason from the complete roster. If the union exposes a blocked task that the
65
+ active view omitted, the classification is `blocked: <task wbs> — <reason>` — never `all tasks
66
+ terminal` — with the blocker text taken from the resolved task body, not from sync prose.
67
+
40
68
  ## §2 — The four surviving signals
41
69
 
42
70
  0493 measured eight candidate signals over this corpus; exactly four discriminate. Derivation
@@ -44,11 +72,20 @@ commands (per candidate feature `<id>`):
44
72
 
45
73
  | Signal | Derivation | Notes |
46
74
  | --- | --- | --- |
47
- | **AC coverage** (readiness proxy) | `spur feature show <id> --json` → count `Scenario:` in body; `spur feature check <id> --json` for validity findings | 0 scenarios ⇒ "specify next", not "work next" (routes toward B4/B5 territory; see handoff-routing.md) |
75
+ | **AC coverage** (readiness proxy) | `spur feature show <id> --json` → count `Scenario:` in the frozen response's `.content` (the JSON carries the full body as `.content`); `spur feature check <id> --json` for validity findings | 0 scenarios ⇒ "specify next", not "work next" (routes toward B4/B5 territory; see handoff-routing.md) |
48
76
  | **Churn exposure** (urgency proxy — WSJF cost-of-delay, numerator only) | `git rev-list --count --since="<40 days ago>" HEAD -- <dirs the feature's scope touches>` | 40d window is 0493's measured default; tune on dogfood. Scope = the paths named in the feature's Goal/Scope |
49
77
  | **Dogfood proximity** (compound leverage) | `rg -c 'plugins/sp | apps/cli | task-pipeline | sp:' docs/features/<id>_*.md` + child task bodies | Degenerate-high in this harness (everything touches itself); discriminates mainly at **zero** — a 0-hit feature is "specify, don't ship" |
50
78
  | **Authority pull** (declared intent) | `rg -n '\b<id>\b' docs/02_ROADMAP.md docs/00_ADR.md` | Presence is positive evidence; absence is not negative |
51
79
 
80
+ **Freeze each candidate input once.** Per candidate `<id>`, capture at most one
81
+ `spur feature show <id> --json` and at most one `spur feature check <id> --json`; reuse those
82
+ captures wherever the four-signal pass needs feature metadata, body, or AC validity. Count
83
+ `Scenario:` in the frozen show response's `.content` — the body is carried as `.content`, so no
84
+ `.filePath` re-read is required (read the file only when the response does not carry the corpus text
85
+ needed). No signal re-invokes a frozen capture. Churn, dogfood, and authority pull continue using
86
+ their own prescribed `git`/`rg` derivations above — they do not derive from the feature show/check
87
+ captures.
88
+
52
89
  **Degenerate-spread rule.** After deriving a signal across the candidate set, check its spread. One
53
90
  dominant value (as `priority` was at 76% P2) ⇒ the signal does not discriminate on this frontier:
54
91
  report it as **rejected with its measured spread** for this run, and proceed without it. A rejected
@@ -101,6 +101,9 @@ the whole point of this facade is that the CLI surface has a single, scalable ho
101
101
  prose checks here.
102
102
  - **Not a competency.** Design, implementation, testing, and review are competency skills, not CLI
103
103
  verbs — they are not documented here.
104
+ - **Not the orchestration owner.** The ADR-054 boundary: this facade owns CLI noun/verb/flag
105
+ semantics — including task and feature status-transition verbs — while multi-step lifecycle
106
+ orchestration belongs to `sp:spur-dev`.
104
107
 
105
108
  ## See also
106
109
 
@@ -117,15 +117,15 @@ If any check fails → **child of best parent** or **task under existing feature
117
117
  | --- | --- | --- |
118
118
  | Board module + UX slice as child | `F8` Features board → `F81` detail action group | **Good** — same product surface, finer grain |
119
119
  | Restructure tooling under Feature CLI | `F3` Feature management CLI → `F31` restructure kit | **Good** — not a new root letter (was root `S`, moved) |
120
- | Runner vs plugin integration | `B` Agent execution (`spur agent`) vs `H` Agent integration (`plugins/sp`) | **Keep separate** — Goals at `B_agent-execution.md:14` vs `H_agent-integration.md:14`; **reject merge on “agent” alone** |
120
+ | Runtime vs plugin harness | `B` Agent execution (`spur agent`) vs `I` sp plugin (`plugins/sp`) | **Keep separate** — B owns runner/process/session/executor behavior; I owns skills, commands, subagents, hooks, and orchestration guidance. H is frozen history. |
121
121
  | Observability UX as sibling roots | `J` board + `K` System Events table redesign + `L` payload enrichment | **Reparent K,L under J** — not body-merge; not peer roots (audit 0356) |
122
- | Plugin epics as new letters | `N` dev-next UX, `O` token architecture as roots beside `H` | **Reparent under H** — same plugin plane, finer grain |
122
+ | Plugin epics as new letters | Historical `N` dev-next UX and `O` token architecture | **Historical move under H is retained; new plugin work goes under I** — do not extend frozen H |
123
123
  | Workflow observability as board root | `P` workflow run observability as peer of `D` Workflows | **Reparent under D** — object is `spur workflow run`, not board J |
124
124
  | Planning validation as root | `Q` AC-verifiable gates as peer of `F` Planning | **Reparent under F** |
125
125
  | Status feedback as root | `R` feature status loop as peer of `F` | **Reparent under F** (corpus status is planning) |
126
126
  | CLI backbone vs board product | `G` Collaboration (message/team CLI) vs `M` Teams board | **Keep both** — different surfaces; do not merge |
127
127
  | One-off polish as root | New letter for “fix button loading” | **Bad** — task under existing feature |
128
- | Done historical epic as root | `I` sp plugin hands-off ready (`done`) | **Keep** as historical root OK; optional later neatness under H |
128
+ | Done plugin epic as root | `I1` sp plugin hands-off ready (`done`) | **Good after reparent** completed delivery under durable plugin root I |
129
129
 
130
130
  ### Audit 0356 snapshot (A–R dispositions)
131
131
 
@@ -144,6 +144,11 @@ Authoritative seed for restructure mapping lives in task 0356 Solution and
144
144
 
145
145
  **Rejected merges:** B∪H (name-only overlap); J∪K body-merge (use reparent for K/L).
146
146
 
147
+ **Ownership amendment (2026-08-11):** audit 0356 is a historical snapshot. The current active
148
+ boundary is B = runtime agent execution, I = `sp` plugin harness, H = frozen mixed history. The
149
+ applied map is `docs/plans/2026-08-11-sp-plugin-feature-tree-restructure-map.md`; do not place new
150
+ work under H.
151
+
147
152
  ---
148
153
 
149
154
  ## Checklist: before `spur feature create`
@@ -18,6 +18,21 @@ pipeline run) lives in **`sp:spur-dev`** — do not reimplement that loop here.
18
18
  *drive* a task through its lifecycle, reach for `sp:spur-dev`; when you need to know *which verb
19
19
  does what*, this skill.
20
20
 
21
+ ## WBS lookup fast path
22
+
23
+ Start from the WBS, not the corpus layout:
24
+
25
+ ```bash
26
+ spur task show <wbs> --json # metadata + full content + filePath
27
+ spur task path <wbs> --json # absolute path only
28
+ ```
29
+
30
+ Do not search `docs/tasks*` or guess `--folder` to locate a known WBS. `show` is the default when an
31
+ agent needs to read a task; use `path` only when another filesystem command needs the absolute path.
32
+ Both commands resolve across configured task folders. Add `--folder` only when deliberately limiting
33
+ the lookup to one non-default corpus. Capture `show` once per run and reuse its response instead of
34
+ re-reading or re-tokenizing the task.
35
+
21
36
  ## Verb map
22
37
 
23
38
  | Verb | Purpose | Key flags |
@@ -219,6 +234,13 @@ spur task check --strict --json # elevate ALL warnings to failures
219
234
  spur task check 0040 --strict-core # the testing→done gate variant
220
235
  ```
221
236
 
237
+ **Folder resolution (task 0522):** a WBS-targeted check (`<wbs>` present, no `--folder`) resolves
238
+ the task across **all configured task folders** — the same resolution as `task show` / `task path` /
239
+ `task update` — so a task in an inactive configured folder is checked, not reported missing. An
240
+ explicit `--folder <path>` is normalized to an absolute path and restricts lookup to that single
241
+ directory (relative and absolute spellings are equivalent). Unscoped checks (no WBS) and
242
+ `task list` remain active-folder-only.
243
+
222
244
  `--json` emits the structured matrix — per-task findings (missing sections, broken feature edges,
223
245
  AC-coverage orphans via L4 traceability) keyed by WBS, plus a per-task `pass` verdict. **Query this,
224
246
  do not re-derive it**: parse the JSON to answer "which tasks are ready?", "what's blocking 0040?",
@@ -45,6 +45,10 @@ the lifecycle*; the competency skills know *how to do each job*; the CLI knows *
45
45
  The skill was decomposed **by function** (ADR-028): design, decomposition, implementation, testing,
46
46
  and verification each became a standalone competency skill, leaving this spine to orchestrate them.
47
47
 
48
+ **Ownership (ADR-054).** This spine owns multi-step lifecycle orchestration — intake, gates,
49
+ decomposition, pipeline runs, HITL pauses. CLI noun/verb/flag semantics, including
50
+ status-transition verbs, are the facade's (`sp:spur-cli`), never this skill's.
51
+
48
52
  **The competencies the spine dispatches:**
49
53
 
50
54
  | Unit of work | Competency skill |
@@ -154,13 +158,17 @@ CLI does.
154
158
  you ship corrupted corpus.
155
159
  2. **The pipeline, not you, writes results.** `## Testing` and `## Review` sections are
156
160
  filled by the pipeline's `record` step. Do not edit them directly during execution.
157
- 3. **Check before every write.** Run `spur task check <wbs> --json` to know what sections
161
+ 3. **Resolve task IDs through the CLI.** Read a known WBS with `spur task show <wbs> --json`; it
162
+ returns metadata, full content, and `filePath` across configured task folders. Use `spur task
163
+ path <wbs> --json` only when another tool needs the absolute path. Never search `docs/tasks*` or
164
+ guess `--folder`; reuse the first `show` response throughout the run.
165
+ 4. **Check before every write.** Run `spur task check <wbs> --json` to know what sections
158
166
  the task needs at its current status. Guessing produces matrix violations.
159
- 4. **AC titles are identity keys.** Renaming a scenario after tasks are created breaks
167
+ 5. **AC titles are identity keys.** Renaming a scenario after tasks are created breaks
160
168
  traceability edges. If you must rename, update the task's scenario references too.
161
- 5. **Batch-create is atomic.** A single schema violation rejects the entire batch. Validate
169
+ 6. **Batch-create is atomic.** A single schema violation rejects the entire batch. Validate
162
170
  locally against `task-batch.schema.json` before invoking the CLI.
163
- 6. **Two-halves seam.** The planning and execution halves share this skill today but are
171
+ 7. **Two-halves seam.** The planning and execution halves share this skill today but are
164
172
  designed to split cleanly. Keep new logic in one half or the other — never straddle the
165
173
  seam with cross-half dependencies.
166
174
 
@@ -288,7 +288,7 @@ must not be changed without updating the backing skill.
288
288
  ### 13. runall
289
289
 
290
290
  - **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.
291
- - **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 halts on first failure). `--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> --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). 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` after the batch completes, `--next` chains each task to terminal status then runs the wrap hop **once for the batch**, `--continue` resumes from checkpoint.
291
+ - **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 halts on first failure). `--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> --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` (expected pre-run state of any not-yet-run feature) is reported verbatim but does not abort — 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` after the batch completes, `--next` chains each task to terminal status then runs the wrap hop **once for the batch**, `--continue` resumes from checkpoint.
292
292
  - **Three orthogonal axes (do not confuse):** `--keep-going` = batch failure policy (halt vs skip dependents); `--continue` = resume from checkpoint (pick up an interrupted batch); `--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.
293
293
  - **Backing:** `sp:spur-dev` skill, `runall` operation → delegates the driver loop to the **`sp:super-planner`** agent (the batch orchestrator).
294
294
  - **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`).
@@ -76,7 +76,13 @@ bun run apps/cli/src/index.ts feature check <id> --strict --json
76
76
 
77
77
  - **Abort shape.** A non-zero check aborts the batch immediately: verdict `aborted`, zero attempted
78
78
  tasks, and the structured feature findings (the `--json` finding list) reported verbatim. This is
79
- the same abort vocabulary as cycle / unknown selector (Step 4/Step 5).
79
+ the same abort vocabulary as cycle / unknown selector (Step 4/Step 5). **Scoped to structural
80
+ findings:** `L4.scenario-unverified` is the expected state of any not-yet-run feature (its
81
+ covering tasks have no PASS verdicts yet) and `--strict` elevates it to error, so it is reported
82
+ verbatim but does **not** abort the batch; every other error finding (L1–L3 structural,
83
+ `L4.malformed-verdict-artifact`, `L4.uncovered-feature-scenario`) still aborts. The terminal
84
+ feature-transition gate enforces scenario verification after the batch runs, so pre-run unverified
85
+ scenarios are transient, not defects (dogfood 2026-08-11, feature I2).
80
86
  - **Exactly once.** The check runs once per batch, before `task list`; it is not re-run per task.
81
87
  - **Non-feature exclusion.** Explicit WBS lists, status pseudo-lists, and `ready` selectors add no
82
88
  feature check — only an effective `feature:<id>` selector is feature-derived. When explicit
@@ -84,7 +90,10 @@ bun run apps/cli/src/index.ts feature check <id> --strict --json
84
90
  - **Why.** `FeatureCheckService` emits `L3.scope-delineation` (Scope lacking an In/Out split) as a
85
91
  **warning**; feature-scoped batches never ran a strict check before freezing, so the late feature
86
92
  transition became the first blocking check. A selector-local strict preflight catches a known
87
- strict finding before any task pipeline action without changing corpus-wide severity.
93
+ strict finding before any task pipeline action without changing corpus-wide severity. A not-yet-run
94
+ feature always fails `L4.scenario-unverified` under `--strict`, so that class is
95
+ reported-not-aborting per the Abort shape above — the preflight targets defects, not the
96
+ expected pre-run state.
88
97
  - **Scope.** This preflight is advisory to severity policy: it does not alter `FeatureCheckService`,
89
98
  `L3.scope-delineation` severity, `feature sync`, or batch-create.
90
99
 
@@ -672,7 +681,7 @@ Resume, merge, or discard:
672
681
  discard: git worktree remove <worktree-path> && git branch -D <branch>
673
682
  ```
674
683
 
675
- The report reuses the [`--next` chain contract](flag-glossary.md#-next-chain-contract) halt-report
684
+ The report reuses the [`--next` chain contract](flag-glossary.md#--next-chain-contract) halt-report
676
685
  shape (halt cause + where + why), not new vocabulary. Retention is the right default: these batches
677
686
  are long and already resumable via `--continue`; auto-deleting is data loss, auto-merging is a
678
687
  partial result presented as a whole. The answer to "what happens if it fails" is "nothing happens,
@@ -203,10 +203,11 @@ behavior:
203
203
 
204
204
  - `dev-brainstorm` `[<feature-id>]` — **creates** one task from the chosen approach, landing at
205
205
  `todo` ready for refine. Optional feature id scopes it.
206
- - `dev-find-next` `[<feature-id>]` — after an **explicit operator confirm**, dispatches the planning
207
- half on the ranked winner (`/sp:dev-plan` to decompose, then `/sp:dev-refineall --depth ready` to
208
- freeze implement-ready). Creates no task itself; the confirm pauses regardless of `--auto`.
209
- Optional feature id names the target instead of offering rank 1.
206
+ - `dev-find-next` `[<feature-id>]` — after confirm, dispatches the planning half on the ranked
207
+ winner (`/sp:dev-plan` to decompose, then `/sp:dev-refineall --depth ready` to freeze
208
+ implement-ready). Creates no task itself. Interactive by default; with `--auto`, auto-accepts the
209
+ offered target (rank-1 or the explicit id) and forwards `--auto` to the children. Optional feature
210
+ id names the target instead of offering rank 1.
210
211
  - `dev-debug` `[<wbs>]` — **attaches** findings to an existing task. Optional WBS names it.
211
212
  - `dev-dogfood` (no value) — **records** run outcomes against the task under test.
212
213
 
@@ -366,7 +367,7 @@ swallowed as the name. `--worktree=<name>` is the unambiguous spelling. `/sp:dev
366
367
  the flag (single step; not worth the worktree cost), and `--worktree --mode parallel` is rejected
367
368
  (per-task parallel isolation stays task 0142). The full lifecycle — name resolution, dirty-tree
368
369
  precheck, creation or adoption, crash-safe marker, merge-or-retain, and `--continue` re-entry — is
369
- specified in [execution-batch.md § Worktree isolation](execution-batch.md#worktree-isolation---worktree).
370
+ specified in [execution-batch.md § Worktree isolation](execution-batch.md#worktree-isolation---worktree-name).
370
371
  Portable `git worktree` commands only; the git mechanics are reused from
371
372
  [worktree-patterns.md](../../branch-workflow/references/worktree-patterns.md).
372
373
 
@@ -217,6 +217,59 @@ fires, author the doc and **report** the chosen slug and a one-line rationale ("
217
217
  `docs/design/<slug>.md` — new `spur <noun>` command + config key"); when it does not fire, report the
218
218
  skip and why. Do not pause to ask; the operator reviews the satellite afterward.
219
219
 
220
+ ## Step 5.6: Idea pipeline (sp:dev-idea) — planning handoff contracts
221
+
222
+ `/sp:dev-idea` runs the same planning half through the idea-pipeline workflow definition
223
+ (`.spur/workflows/idea-pipeline.yaml` — symlinked to the tracked SSOT). Two
224
+ artifacts are the contract between the workflow states and the operator:
225
+
226
+ **Goal/Scope intent (feature-create).** The agent writes body-only intent files
227
+ `.spur/run/<runId>-idea-goal.md` and `.spur/run/<runId>-idea-scope.md`, then persists both through
228
+ the corpus CLI (a missing/empty artifact stops the state before decomposition can begin):
229
+
230
+ ```bash
231
+ spur feature update <id> --section Goal --from-file .spur/run/<runId>-idea-goal.md
232
+ spur feature update <id> --section Scope --from-file .spur/run/<runId>-idea-scope.md
233
+ ```
234
+
235
+ - **Goal is intent only** — a short statement of what the feature achieves. Task breakdowns,
236
+ checklists, and how-to steps **never** enter Goal.
237
+ - **Scope carries explicit boundaries** — in-scope and out-of-scope bullets.
238
+
239
+ **Design review artifact (system-design / design-approval).** One run-scoped file,
240
+ `.spur/run/<runId>-idea-design-review.md`, with fixed headings `## Proposed design`,
241
+ `## Operator feedback`, and `## Reconciliation`:
242
+
243
+ - **First pass:** system-design writes the proposed design under `## Proposed design`.
244
+ - **Rejection:** before answering `no` at the design-approval gate, the operator edits
245
+ `## Operator feedback` with the concrete issue(s).
246
+ - **Retry:** system-design reads that feedback, revises the design/ADR artifacts, records the
247
+ changes under `## Reconciliation`, and — when the feedback invalidates an Acceptance Criteria
248
+ scenario — updates the feature AC through `spur feature update <id> --section
249
+ "Acceptance Criteria" --from-file <file>` (never direct feature-file edits).
250
+ - **Exit gate:** every design exit into decomposition (auto-approved and interactive-approved)
251
+ re-runs `spur feature check <id>`, so stale or invalidated AC cannot proceed.
252
+
253
+ **Task ordering (decompose / handoff-finalize).** Decomposition also emits the private
254
+ run-scoped order sidecar `.spur/run/<runId>-idea-task-order.json` — a JSON array of
255
+ `{ name, depends_on_names[] }` (one entry per batch item, names matching batch item `name`s
256
+ exactly; `[]` when no ordering exists). It is private workflow data, not part of
257
+ `task-batch.schema.json`. A post-decompose validation fails the run on any ambiguous or
258
+ missing title match. After batch creation, `handoff-finalize`:
259
+
260
+ 1. Zips batch item names to the created WBS values from the captured
261
+ `.spur/run/<runId>-idea-batch-create-result.json` (`task batch-create --json` output;
262
+ `wbs[]` is in input order).
263
+ 2. Applies every non-empty `depends_on_names` list through
264
+ `spur task deps <wbs> set <dep-wbs...> --json` — a mapping or CLI error fails the run
265
+ before handoff.
266
+ 3. Refreshes the feature roster with `spur feature refresh --feature <id> --json`.
267
+ 4. Checks each created task (`spur task check <wbs> --json`) and writes
268
+ `.spur/run/<runId>-idea-handoff.md` with exactly **one** next command:
269
+ `/sp:dev-refineall --feature <id> --auto --depth ready` when any task is unready
270
+ (runall is then omitted), otherwise `/sp:dev-runall --feature <id> --auto`. The terminal
271
+ handoff note points at this report.
272
+
220
273
  ## Step 6: Refine before execute (the spec-completion gate)
221
274
 
222
275
  `batch-create` accepts optional `design` / `plan` / `acceptance_criteria` fields (plus