@gobing-ai/spur 0.3.46 → 0.3.48

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 (137) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +42 -11
  3. package/config/templates/docs/99_PROJECT_CONSTITUTION.md +16 -4
  4. package/config/transition-shims.json +33 -0
  5. package/config/workflows/basic.yaml +2 -0
  6. package/config/workflows/docs-pipeline.yaml +2 -0
  7. package/config/workflows/feature-dev.yaml +8 -0
  8. package/config/workflows/idea-pipeline.yaml +10 -0
  9. package/config/workflows/planning-pipeline.yaml +4 -0
  10. package/config/workflows/task-pipeline.yaml +8 -0
  11. package/config/workflows/wayfinder-resolution.yaml +4 -0
  12. package/config/workflows/wrapup-pipeline.yaml +18 -1
  13. package/package.json +2 -2
  14. package/plugins/sp/agents/expert-spur.md +1 -0
  15. package/plugins/sp/commands/dev-arch.md +2 -1
  16. package/plugins/sp/commands/dev-brainstorm.md +2 -1
  17. package/plugins/sp/commands/dev-changelog.md +1 -0
  18. package/plugins/sp/commands/dev-daily.md +1 -0
  19. package/plugins/sp/commands/dev-debug.md +2 -1
  20. package/plugins/sp/commands/dev-dogfood.md +2 -1
  21. package/plugins/sp/commands/dev-featurechange.md +1 -0
  22. package/plugins/sp/commands/dev-find-conflict.md +2 -1
  23. package/plugins/sp/commands/dev-find-issue.md +20 -32
  24. package/plugins/sp/commands/dev-find-next.md +2 -1
  25. package/plugins/sp/commands/dev-fixall.md +1 -0
  26. package/plugins/sp/commands/dev-gitmsg.md +1 -0
  27. package/plugins/sp/commands/dev-gtd.md +1 -0
  28. package/plugins/sp/commands/dev-handover.md +1 -0
  29. package/plugins/sp/commands/dev-idea.md +1 -0
  30. package/plugins/sp/commands/dev-next.md +2 -1
  31. package/plugins/sp/commands/dev-parallel.md +2 -1
  32. package/plugins/sp/commands/dev-plan.md +2 -1
  33. package/plugins/sp/commands/dev-refine.md +5 -3
  34. package/plugins/sp/commands/dev-refineall.md +2 -1
  35. package/plugins/sp/commands/dev-refresh.md +2 -1
  36. package/plugins/sp/commands/dev-reverse.md +2 -1
  37. package/plugins/sp/commands/dev-review.md +2 -1
  38. package/plugins/sp/commands/dev-run.md +3 -2
  39. package/plugins/sp/commands/dev-runall.md +3 -2
  40. package/plugins/sp/commands/dev-simplify.md +2 -1
  41. package/plugins/sp/commands/dev-unit.md +2 -1
  42. package/plugins/sp/commands/dev-verify.md +2 -1
  43. package/plugins/sp/commands/dev-verifyall.md +2 -1
  44. package/plugins/sp/commands/dev-wrap.md +7 -5
  45. package/plugins/sp/commands/dev-wrapall.md +7 -5
  46. package/plugins/sp/commands/rule-add.md +1 -0
  47. package/plugins/sp/commands/rule-refine.md +1 -0
  48. package/plugins/sp/commands/rule-scan.md +1 -0
  49. package/plugins/sp/commands/spur-init.md +1 -0
  50. package/plugins/sp/commands/workflow-add.md +1 -0
  51. package/plugins/sp/commands/workflow-refine.md +1 -0
  52. package/plugins/sp/hooks/careful-guard.ts +5 -80
  53. package/plugins/sp/hooks/destructive-policy.ts +146 -0
  54. package/plugins/sp/hooks/pi/guard-extension.ts +33 -46
  55. package/plugins/sp/hooks/task-file-policy.ts +31 -0
  56. package/plugins/sp/hooks/task-write-guard.ts +4 -0
  57. package/plugins/sp/plugin.json +1 -1
  58. package/plugins/sp/references/roles.md +93 -0
  59. package/plugins/sp/scripts/feature-sync-bounded.ts +28 -2
  60. package/plugins/sp/scripts/stage-registry-adapter.ts +66 -31
  61. package/plugins/sp/scripts/surface-drift-inventory.ts +908 -0
  62. package/plugins/sp/scripts/task-size-precheck.ts +30 -4
  63. package/plugins/sp/scripts/transition-shim-check.ts +238 -0
  64. package/plugins/sp/scripts/validate-flag-contracts.ts +5 -2
  65. package/plugins/sp/skills/code-verification/SKILL.md +2 -0
  66. package/plugins/sp/skills/issue-finding/SKILL.md +124 -143
  67. package/plugins/sp/skills/issue-finding/examples/expected-findings.json +1 -1
  68. package/plugins/sp/skills/issue-finding/references/session-formats.md +85 -83
  69. package/plugins/sp/skills/next-router/SKILL.md +1 -1
  70. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +40 -2
  71. package/plugins/sp/skills/spur-cli/SKILL.md +3 -0
  72. package/plugins/sp/skills/spur-cli/references/agent.md +12 -7
  73. package/plugins/sp/skills/spur-cli/references/features.md +3 -0
  74. package/plugins/sp/skills/spur-cli/references/tasks.md +3 -0
  75. package/plugins/sp/skills/spur-cli/references/team.md +10 -3
  76. package/plugins/sp/skills/spur-dev/SKILL.md +2 -0
  77. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +17 -0
  78. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +44 -23
  79. package/plugins/sp/skills/spur-dev/references/dev-operations.md +14 -11
  80. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +14 -12
  81. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +14 -3
  82. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +2 -0
  83. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +12 -2
  84. package/schemas/spur-config.schema.json +27 -3
  85. package/spur.js +11648 -7595
  86. package/web/_astro/BoardApp.8hiqShQn.js +1 -0
  87. package/web/_astro/{BoardApp.DKyrGxdo.js → BoardApp.BjQUNhuj.js} +74 -74
  88. package/web/_astro/{TaskDetail.6-27_LMa.js → TaskDetail.CVBuD6dF.js} +1 -1
  89. package/web/_astro/{arc.Df-9AQvS.js → arc.BMMjdODi.js} +1 -1
  90. package/web/_astro/{architectureDiagram-3BPJPVTR.VAI_-paS.js → architectureDiagram-3BPJPVTR.BU5ShzXf.js} +1 -1
  91. package/web/_astro/{blockDiagram-GPEHLZMM.DFpUY1ue.js → blockDiagram-GPEHLZMM.Bj1iEqPD.js} +1 -1
  92. package/web/_astro/{c4Diagram-AAUBKEIU.CF8doOpg.js → c4Diagram-AAUBKEIU.vX8wepCL.js} +1 -1
  93. package/web/_astro/channel.EwdSemIC.js +1 -0
  94. package/web/_astro/{chunk-2J33WTMH.BnjK3fjt.js → chunk-2J33WTMH.BKAipTym.js} +1 -1
  95. package/web/_astro/{chunk-4BX2VUAB.x6ZDnJKq.js → chunk-4BX2VUAB.B68XkPG7.js} +1 -1
  96. package/web/_astro/{chunk-55IACEB6.zY-0uu7w.js → chunk-55IACEB6.BmeDLcrc.js} +1 -1
  97. package/web/_astro/{chunk-727SXJPM.BZxKg_Vi.js → chunk-727SXJPM.PDuBA3Kw.js} +1 -1
  98. package/web/_astro/{chunk-AQP2D5EJ.Cpi9G9Td.js → chunk-AQP2D5EJ.C7A044za.js} +1 -1
  99. package/web/_astro/{chunk-FMBD7UC4.DWTB-Pif.js → chunk-FMBD7UC4.BtzKKFqR.js} +1 -1
  100. package/web/_astro/{chunk-ND2GUHAM.BPDQbiOG.js → chunk-ND2GUHAM.BJuDeeOy.js} +1 -1
  101. package/web/_astro/{chunk-QZHKN3VN.BRWIcuoM.js → chunk-QZHKN3VN.DSeMDgcQ.js} +1 -1
  102. package/web/_astro/{classDiagram-4FO5ZUOK.mGTCZsDO.js → classDiagram-4FO5ZUOK.D53Q4tCw.js} +1 -1
  103. package/web/_astro/{classDiagram-v2-Q7XG4LA2.mGTCZsDO.js → classDiagram-v2-Q7XG4LA2.D53Q4tCw.js} +1 -1
  104. package/web/_astro/{cose-bilkent-S5V4N54A.D1GEut-z.js → cose-bilkent-S5V4N54A.c712AFRH.js} +1 -1
  105. package/web/_astro/{dagre-BM42HDAG.BV0XG9Do.js → dagre-BM42HDAG.D-idisph.js} +1 -1
  106. package/web/_astro/{diagram-2AECGRRQ.DzpYxsjo.js → diagram-2AECGRRQ.DLgnsJCU.js} +1 -1
  107. package/web/_astro/{diagram-5GNKFQAL.Cm9YzJh4.js → diagram-5GNKFQAL.BiaxBVqx.js} +1 -1
  108. package/web/_astro/{diagram-KO2AKTUF.BjhottUj.js → diagram-KO2AKTUF.C8HX1vd8.js} +1 -1
  109. package/web/_astro/{diagram-LMA3HP47.BFsQW5kb.js → diagram-LMA3HP47.CfqDLLes.js} +1 -1
  110. package/web/_astro/{diagram-OG6HWLK6.8pdpzSWO.js → diagram-OG6HWLK6.15SDiEed.js} +1 -1
  111. package/web/_astro/{erDiagram-TEJ5UH35.Bd7KUJmJ.js → erDiagram-TEJ5UH35.DksYtOYM.js} +1 -1
  112. package/web/_astro/{flowDiagram-I6XJVG4X.7LWffkaE.js → flowDiagram-I6XJVG4X.DR_Au-HV.js} +1 -1
  113. package/web/_astro/{ganttDiagram-6RSMTGT7.BeDcO5tI.js → ganttDiagram-6RSMTGT7.CHhHrffI.js} +1 -1
  114. package/web/_astro/{gitGraphDiagram-PVQCEYII.Ca4n730A.js → gitGraphDiagram-PVQCEYII.B2Xehvam.js} +1 -1
  115. package/web/_astro/{index.Dbvuw6d4.css → index.DAxu50UF.css} +1 -1
  116. package/web/_astro/{infoDiagram-5YYISTIA.B0OakQYb.js → infoDiagram-5YYISTIA.C9c3CNNN.js} +1 -1
  117. package/web/_astro/{ishikawaDiagram-YF4QCWOH.DSmNQe-1.js → ishikawaDiagram-YF4QCWOH.BibUHkh8.js} +1 -1
  118. package/web/_astro/{journeyDiagram-JHISSGLW.Cy5ruEUu.js → journeyDiagram-JHISSGLW.BYoVHiyO.js} +1 -1
  119. package/web/_astro/{kanban-definition-UN3LZRKU.CUJXub0p.js → kanban-definition-UN3LZRKU.CM1K5wHE.js} +1 -1
  120. package/web/_astro/{linear.DC1jCCXn.js → linear.SPpjJUb-.js} +1 -1
  121. package/web/_astro/{mermaid.core.DxVP99Ab.js → mermaid.core.BAgx3nnb.js} +4 -4
  122. package/web/_astro/{mindmap-definition-RKZ34NQL.D0MaV6sJ.js → mindmap-definition-RKZ34NQL.D35oPG1R.js} +1 -1
  123. package/web/_astro/{pieDiagram-4H26LBE5.DCC6_q32.js → pieDiagram-4H26LBE5.DiWuRwk7.js} +1 -1
  124. package/web/_astro/{quadrantDiagram-W4KKPZXB.BeUOAM7C.js → quadrantDiagram-W4KKPZXB.B9PBzTWn.js} +1 -1
  125. package/web/_astro/{requirementDiagram-4Y6WPE33.Dbl4MASO.js → requirementDiagram-4Y6WPE33.CYuuamFN.js} +1 -1
  126. package/web/_astro/{sankeyDiagram-5OEKKPKP.HsLg0VS4.js → sankeyDiagram-5OEKKPKP.W24UhhtD.js} +1 -1
  127. package/web/_astro/{sequenceDiagram-3UESZ5HK.DT7DJTnZ.js → sequenceDiagram-3UESZ5HK.BpbNjA51.js} +1 -1
  128. package/web/_astro/{stateDiagram-AJRCARHV.d_ju1Vr1.js → stateDiagram-AJRCARHV.DqVsHudf.js} +1 -1
  129. package/web/_astro/{stateDiagram-v2-BHNVJYJU.DMCAjMJ4.js → stateDiagram-v2-BHNVJYJU.CzwHYX81.js} +1 -1
  130. package/web/_astro/{timeline-definition-PNZ67QCA.DNOHr62_.js → timeline-definition-PNZ67QCA.Bc3B6djw.js} +1 -1
  131. package/web/_astro/{vennDiagram-CIIHVFJN.B7dUy-1W.js → vennDiagram-CIIHVFJN.C-D5rh8O.js} +1 -1
  132. package/web/_astro/{wardley-L42UT6IY.DEqOXvBh.js → wardley-L42UT6IY.D7PdYCqn.js} +1 -1
  133. package/web/_astro/{wardleyDiagram-YWT4CUSO.BCRb2p6x.js → wardleyDiagram-YWT4CUSO.CwmJKXF3.js} +1 -1
  134. package/web/_astro/{xychartDiagram-2RQKCTM6.NxVQLdBh.js → xychartDiagram-2RQKCTM6.avDYnLsb.js} +1 -1
  135. package/web/index.html +2 -2
  136. package/web/_astro/BoardApp.Ce6zJYAH.js +0 -1
  137. package/web/_astro/channel.Uhm9O3UV.js +0 -1
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "plugins": [
8
8
  {
9
- "version": "0.3.46",
9
+ "version": "0.3.48",
10
10
  "name": "sp",
11
11
  "source": "./plugins/sp",
12
12
  "description": "Spur - my harness toolkits"
@@ -1,15 +1,18 @@
1
1
  # Spur project configuration example
2
- # Seeded by `spur init` as ~/.config/spur/config.yaml on first run (never overwritten).
2
+ # Seeded by `spur init` as ~/.config/spur/config.yaml on first run
3
+ # (never overwritten).
3
4
  # Copy / adapt into a project as `.spur/config.yaml`.
4
5
 
5
6
  $schema: "@gobing-ai/spur/schemas/spur-config.schema.json"
6
7
  # Config schema version (string). Current recommended: "1.1".
7
- # "1" remains accepted; there is no hard migrator yet. Prefer "1.1" for new projects
8
- # so editors and operators know the file targets the ADR-033 + planning shape.
8
+ # "1" remains accepted; there is no hard migrator yet. Prefer "1.1" for
9
+ # new projects so editors and operators know the file targets the ADR-033
10
+ # + planning shape.
9
11
  version: "1.1"
10
12
  name: my-project
11
13
 
12
- # ── Portable bootstrap (consumed by @gobing-ai/ts-infra runNodeApplication) ──
14
+ # ── Portable bootstrap (consumed by @gobing-ai/ts-infra
15
+ # runNodeApplication) ──
13
16
  # Shared across spur and (future) spur-server. Keys map 1:1 to ts-infra's
14
17
  # LoggingOptions / TelemetryOptions / database / SchedulerOptions.
15
18
  # Not validated by spurConfigSchema (bootstrap is owned by runNodeApplication).
@@ -33,18 +36,24 @@ bootstrap:
33
36
  scheduler:
34
37
  enabled: false # CLI is run-once; no scheduler
35
38
 
36
- # ── Spur app section (validated by spurConfigSchema in @gobing-ai/spur-config) ──
39
+ # ── Spur app section (validated by spurConfigSchema in
40
+ # @gobing-ai/spur-config) ──
37
41
  # Server runtime (port/host/openBrowser) is env-backed via PORT/HOST — not a
38
42
  # project-config key. See design §2.2.
39
43
  agent:
40
- # `default` is the executor selector for `--agent auto` when stage-registry
41
- # routing does not apply (or as a fallback). Resolved as an executor name
42
- # first, then a legacy agent name.
43
- default: omp
44
+ # `default` is the role used for `--agent auto` when the caller declares
45
+ # nothing (task 0542 R2 the value domain moved from executor names to
46
+ # roles). A role id selects its tier's cheapest eligible executor; a
47
+ # configured executor name still resolves during the transition with a
48
+ # one-time warning (shim agent-default-executor); any other value fails
49
+ # naming both accepted sets.
50
+ default: coder
44
51
 
45
52
  # Canonical coding-agent ids (ts-ai-runner DISPLAY_ORDER, 0.4.8+):
46
- # claude, codex, gemini, pi, omp, opencode, antigravity-cli, openclaw, hermes, grok
47
- # Grok auth: non-empty XAI_API_KEY and/or ~/.grok/auth.json (no CLI auth-status verb).
53
+ # claude, codex, gemini, pi, omp, opencode, antigravity-cli,
54
+ # openclaw, hermes, grok
55
+ # Grok auth: non-empty XAI_API_KEY and/or ~/.grok/auth.json (no CLI
56
+ # auth-status verb).
48
57
 
49
58
  # Named executor profiles (ADR-033 / 0343). Each pairs a canonical agent with
50
59
  # an optional opaque model override and an explicit capability tier.
@@ -92,6 +101,13 @@ agent:
92
101
  # purpose: "Lead — planning & review"
93
102
  # - executor: omp
94
103
  # purpose: "Implementer"
104
+ # # Role is the primary axis (0543): a role-only member resolves an
105
+ # # executor through the tier ladder at materialization; the resolved
106
+ # # executor and the role are both recorded on the materialized spec.
107
+ # - role: reviewer
108
+ # - role: coder
109
+ # executor: omp
110
+ # purpose: "Pinned executor, role recorded alongside (pin beats policy)"
95
111
 
96
112
  rules:
97
113
  paths:
@@ -116,3 +132,18 @@ tasks:
116
132
 
117
133
  features:
118
134
  dir: docs/features
135
+
136
+ # ── History (task 0549 — completion-triggered refresh) ──
137
+ # Opt-in: when work completes (task → done, pipeline run reaching
138
+ # terminal status), enqueue ONE coalesced `history.refresh` job on the
139
+ # embedded job queue (never inline). Bursts inside debounce_ms join the
140
+ # pending job; the covered window spans all completions. The job reuses
141
+ # `spur history daily` semantics (import-all fan-out with per-source
142
+ # isolation + analyze + artifact write) and is consumed by `spur serve`'s
143
+ # job worker. Debounce default 600000 ms (10 min) follows
144
+ # docs/tasks4/0548-import-cost-measurement.md (steady-state all-fanout
145
+ # import ≈ 20.6 s; 10 min comfortably bounds burst coalescing).
146
+ # history:
147
+ # refresh:
148
+ # on_completion: false # set true to enable; disable with no code edits
149
+ # debounce_ms: 600000 # coalescing window; floor 1000 ms
@@ -3,7 +3,7 @@ name: Project Constitution
3
3
  doc: 99_PROJECT_CONSTITUTION
4
4
  owns: PROCESS — how the key files are maintained
5
5
  authority: authoritative-on-process
6
- version: 1.3.0
6
+ version: 1.4.0
7
7
  created_at: {{init-date}}
8
8
  updated_at: {{init-date}}
9
9
  edit_rules: 99 §6.8
@@ -148,6 +148,10 @@ Rules:
148
148
  same change.
149
149
  - `AGENTS.md` may **add** project facts; it may never **contradict** the numbered docs. On
150
150
  contradiction, the numbered doc wins — fix `AGENTS.md`.
151
+ - In a monorepo, subdirectory `AGENTS.md` files merge with the root: the agent reads the root
152
+ first, then the file for the package it is working in. Each level carries only its own scope —
153
+ the root holds what spans packages, a package file holds what is true of that package alone.
154
+ Never restate one level's facts at another.
151
155
 
152
156
  ### 4.5 Index + satellite docs (`04`/`05` and their folders)
153
157
 
@@ -344,11 +348,19 @@ with raw file writes.
344
348
  1. Factual blocks that mirror code — the command surface, the workspace layout, tool versions —
345
349
  are **regenerated from code**, never edited from memory. Verify with the actual registrations
346
350
  (e.g. list the CLI's registered nouns/verbs) before writing the block.
347
- 2. Keep it lean: link to the owning doc instead of restating its facts. `AGENTS.md` repeats only
351
+ 2. File structure is the most perishable thing you can write down: paths move, and a stale path
352
+ sends an agent confidently to a file that is not there. Prefer capabilities and domain
353
+ vocabulary — which outlive layout — over directory listings; where a concrete path is genuinely
354
+ needed, regenerate it from code per rule 1.
355
+ 3. Keep it lean: link to the owning doc instead of restating its facts. `AGENTS.md` repeats only
348
356
  what an agent needs in the first 30 seconds of a session.
349
- 3. Surfaces that are decided-but-unbuilt are flagged as planned with their ADR pointer, and
357
+ 4. Keep the instruction count inside a budget: roughly 150–200 instructions, beyond which an agent
358
+ attends to them unevenly and the marginal rule buys nothing (MEDIUM confidence — secondary
359
+ citation, not measured here). Over budget, cut the rule or move it to its owning doc and link
360
+ per rule 3.
361
+ 5. Surfaces that are decided-but-unbuilt are flagged as planned with their ADR pointer, and
350
362
  marked "do not invoke as if they exist".
351
- 4. Re-synced whenever this file changes the map or process (§4.4).
363
+ 6. Re-synced whenever this file changes the map or process (§4.4).
352
364
 
353
365
  ### 6.8 This file (`99`)
354
366
 
@@ -0,0 +1,33 @@
1
+ {
2
+ "note": "Transition-shim manifest (task 0541, feature B2). Each entry records one compatibility path marked @transition-shim(<id>) in source. Every field is required. The gate (bun run transition-shim-check, inside `spur-check`) is two-sided: an unregistered marker fails, and a listed entry whose marker is gone fails. Emptying this file is the definition of the transition being complete (docs/04_DESIGN.md §2.5). Removal conditions must be objectively checkable against the repository, not 'when convenient'. Shims are registered by the tasks that create them (0536/0537/0538/0542).",
3
+ "entries": [
4
+ {
5
+ "id": "agent-bare-binary-name",
6
+ "wbs": "0536",
7
+ "file": "packages/app/src/services/agent-service.ts",
8
+ "keepsWorking": "a bare coding-agent binary name (codex, omp, claude with no matching agent.executors entry) remains a valid --agent value during the role transition, with a one-time warning emitted by warnBareBinaryOnce",
9
+ "removalCondition": "no bare-binary --agent value remains in docs/, config/workflows/, or plugins/sp/ (scan for --agent <binary-name> usages against agent.executors names)"
10
+ },
11
+ {
12
+ "id": "spec-without-executor-field",
13
+ "wbs": "0537",
14
+ "file": "apps/cli/src/commands/agent.ts",
15
+ "keepsWorking": "a pre-existing agent spec carrying only type (no executor field) still drains: --agent <specId> falls back to the spec's coding-agent type instead of resolving a missing executor",
16
+ "removalCondition": "every spec under .spur/agents/ records an executor field (scan .spur/agents/*.yaml for the key; re-materialize the demo team first)"
17
+ },
18
+ {
19
+ "id": "agent-flag-spec-id",
20
+ "wbs": "0542",
21
+ "file": "apps/cli/src/commands/agent.ts",
22
+ "keepsWorking": "a team spec id passed to --agent <spec-id> still addresses the spec and drives the drain path, warned once by warnAgentSpecIdOnce; --spec <id> is the canonical carrier",
23
+ "removalCondition": "no --agent <spec-id> usage remains in config/workflows/, plugins/sp/, or docs/ (scan for --agent values that match a .spur/agents/ spec id)"
24
+ },
25
+ {
26
+ "id": "agent-default-executor",
27
+ "wbs": "0542",
28
+ "file": "packages/app/src/services/agent-service.ts",
29
+ "keepsWorking": "a configured executor name in agent.default still resolves during the transition, warned once by warnAgentDefaultExecutorOnce; the value domain moved to roles (recommended default: coder)",
30
+ "removalCondition": "no agent.default value names an agent.executors entry (scan .spur/config.yaml and config/config.example.yaml against the agent.executors names)"
31
+ }
32
+ ]
33
+ }
@@ -80,6 +80,8 @@ states:
80
80
  options:
81
81
  agent: ${vars.agent}
82
82
  input: /sp:dev-fixall "${vars.qualityGateCmd}"
83
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
84
+ role: coder
83
85
  timeoutMs: ${vars.stepTimeoutMs}
84
86
 
85
87
  - id: done
@@ -67,6 +67,8 @@ states:
67
67
  options:
68
68
  agent: ${vars.agent}
69
69
  # Pure slash only (ADR-043). Do not bolt docs-only prose onto the input line.
70
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
71
+ role: coder
70
72
  input: /sp:dev-run --mode implement ${vars.wbs} --auto
71
73
  timeoutMs: ${vars.stepTimeoutMs}
72
74
  # Fail a silent no-op draft (same empty-implement class as task-pipeline R3).
@@ -84,6 +84,8 @@ states:
84
84
  options:
85
85
  agent: ${vars.agent}
86
86
  input: /sp:dev-brainstorm --feature ${vars.featureId}
87
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
88
+ role: planner
87
89
  timeoutMs: ${vars.stepTimeoutMs}
88
90
 
89
91
  - id: plan
@@ -95,6 +97,8 @@ states:
95
97
  options:
96
98
  agent: ${vars.agent}
97
99
  input: /sp:dev-plan --feature ${vars.featureId}
100
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
101
+ role: planner
98
102
  timeoutMs: ${vars.stepTimeoutMs}
99
103
 
100
104
  # Two pure-slash execute hops so vars.profile actually controls --auto (ADR-043).
@@ -109,6 +113,8 @@ states:
109
113
  options:
110
114
  agent: ${vars.agent}
111
115
  input: /sp:dev-runall --feature ${vars.featureId} --auto
116
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
117
+ role: planner
112
118
  timeoutMs: ${vars.stepTimeoutMs}
113
119
 
114
120
  - id: execute-tasks
@@ -120,6 +126,8 @@ states:
120
126
  options:
121
127
  agent: ${vars.agent}
122
128
  input: /sp:dev-runall --feature ${vars.featureId}
129
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
130
+ role: planner
123
131
  timeoutMs: ${vars.stepTimeoutMs}
124
132
 
125
133
  - id: feature-verify
@@ -108,6 +108,8 @@ states:
108
108
  options:
109
109
  agent: ${vars.agent}
110
110
  input: "Run sp:brainstorm for the idea: ${vars.idea}. The skill owns the approach-generation, design summary, and `needs_design` signal criteria; emit .spur/run/${vars.__runId}-idea-needs-design.json ({\"needs_design\": true|false}) and the design summary per the skill's `Design Approval Gate` and `The needs_design signal` sections. Also emit the idea-evaluation report to .spur/run/${vars.__runId}-idea-eval-report.md per plugins/sp/skills/spur-dev/references/idea-evaluation.md (urgency/necessity 0–5, premises, pros/cons, alternatives, enhanced idea, recommendation). At the END of the report, append a provenance footer block of the exact form: `---\\nrun_id: ${vars.__runId}\\ngenerated_at: <RFC3339 timestamp>\\n---` (omit the footer only if run_id is empty)."
111
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
112
+ role: planner
111
113
  expectFile: .spur/run/${vars.__runId}-idea-eval-report.md
112
114
  timeoutMs: ${vars.stepTimeoutMs}
113
115
 
@@ -140,6 +142,8 @@ states:
140
142
  options:
141
143
  agent: ${vars.agent}
142
144
  input: "Create a feature for the idea: ${vars.idea}. Read .spur/run/${vars.__runId}-idea-eval-report.md if present for the enhanced idea and scores. Use 'spur feature create \"<name>\" --json' to create it. Write the feature id to .spur/run/${vars.__runId}-idea-feature-id.txt. If an existing feature is appropriate, use its id instead. Also write two body-only intent artifacts: .spur/run/${vars.__runId}-idea-goal.md with concise Goal intent only (a short statement of what the feature achieves; never task breakdowns, checklists, or how-to steps), and .spur/run/${vars.__runId}-idea-scope.md with explicit in-scope and out-of-scope boundary bullets."
145
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
146
+ role: planner
143
147
  expectFile: .spur/run/${vars.__runId}-idea-feature-id.txt
144
148
  timeoutMs: ${vars.stepTimeoutMs}
145
149
  - kind: file.read.into-var
@@ -179,6 +183,8 @@ states:
179
183
  options:
180
184
  agent: ${vars.agent}
181
185
  input: "Generate acceptance criteria for feature ${vars.featureId}. Read the feature file and author R-numbered BDD Gherkin scenarios per ac-style-guide.md. Output only the complete Acceptance Criteria section body, including the gherkin code fence, with no surrounding commentary and no section heading."
186
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
187
+ role: planner
182
188
  answerFile: .spur/run/${vars.__runId}-idea-ac-content.md
183
189
  expectFile: .spur/run/${vars.__runId}-idea-ac-content.md
184
190
  timeoutMs: ${vars.stepTimeoutMs}
@@ -239,6 +245,8 @@ states:
239
245
  options:
240
246
  agent: ${vars.agent}
241
247
  input: "Run sp:sys-architecture for feature ${vars.featureId}. Read the brainstorm artifact, feature AC, and .spur/run/${vars.__runId}-idea-design-review.md. Produce ADR entries, architecture updates, and design satellites (docs/design/<slug>.md) following the constitution edit rules. Do not write task or feature corpus files directly. Design-review contract (.spur/run/${vars.__runId}-idea-design-review.md, fixed headings `## Proposed design`, `## Operator feedback`, `## Reconciliation`): on the first pass write the proposed design summary under `## Proposed design` and leave `## Operator feedback` empty; on retry with operator feedback present, revise the design/ADR artifacts, document the changes under `## Reconciliation`, and when the feedback invalidates an Acceptance Criteria scenario write the revised AC section body to a file and persist it via `$spurBin feature update \"$featureId\" --section \"Acceptance Criteria\" --from-file <file>` — never edit feature corpus files directly."
248
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
249
+ role: planner
242
250
  expectFile: .spur/run/${vars.__runId}-idea-design-review.md
243
251
  timeoutMs: ${vars.stepTimeoutMs}
244
252
  # expectFile proves existence only, and the onEnter skeleton pre-creates the file — so an
@@ -293,6 +301,8 @@ states:
293
301
  options:
294
302
  agent: ${vars.agent}
295
303
  input: "Run sp:spec-decomposition for feature ${vars.featureId}. Read the brainstorm artifact, feature AC, and design doc. SIZING FIRST, before any JSON: apply the skill's `Default to NOT decomposing` rubric to the whole unit of work — if it scores 0-2 the correct output is a ONE-entry batch, not many. Scenario count is not task count: merge scenarios that one task delivers (same file surface, same subsystem, or unreadable apart in review), and list every scenario a task covers in its background. Merging never costs AC coverage — one task may carry several scenarios. Do not emit one entry per scenario or per requirement by reflex. Then produce a task-batch JSON array at .spur/run/${vars.__runId}-idea-task-batch.json, validated against apps/cli/schemas/task-batch.schema.json. Schema-permitted fields per entry: `name`, `background`, `requirements`, `feature_id`, `parent_wbs`, `priority`, `tags`, `template` — schema validation rejects anything else. Acceptance Criteria, Design, and Plan sections are filled in by the per-task refine step after batch-create, NOT at decompose time. Validate locally against the schema before emitting. Also emit the private task-order sidecar at .spur/run/${vars.__runId}-idea-task-order.json: a JSON array (one entry per batch item) of `{ name: <exact batch item name>, depends_on_names: [<batch item names>] }` declaring ordering/dependencies between the batch items; use `[]` when no ordering exists. Every `name` and every dependency must match exactly one batch item `name` — it is private workflow data, not part of task-batch.schema.json."
304
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
305
+ role: planner
296
306
  expectFile: .spur/run/${vars.__runId}-idea-task-batch.json
297
307
  timeoutMs: ${vars.stepTimeoutMs}
298
308
  # R1 (0518): the task-order sidecar is the ordering contract for handoff-finalize.
@@ -102,6 +102,8 @@ states:
102
102
  options:
103
103
  agent: ${vars.agent}
104
104
  # `vars.feature` is optional and defaults to "" — the parent flag must be
105
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
106
+ role: planner
105
107
  # described conditionally, never interpolated bare. `--parent <empty> --json`
106
108
  # makes commander swallow `--json` as the parent value.
107
109
  input: "Skill(skill=\"sp:spur-cli\", args=\"feature create for slug ${vars.slug}\"). Run `${vars.spurBin} feature create \"${vars.slug}\" --json` (or reuse an existing id); append `--parent \"${vars.feature}\"` ONLY if the parent id between those quotes is non-empty — if it is empty, omit the --parent flag entirely. Write the feature id alone to .spur/run/${vars.__runId}-plan-feature-id.txt."
@@ -118,6 +120,8 @@ states:
118
120
  options:
119
121
  agent: ${vars.agent}
120
122
  input: "Skill(skill=\"sp:doc-evolve\", args=\"design-gen slug=${vars.slug}\"). Author docs/design/${vars.slug}.md from docs/plans/${vars.slug}-drafted.md; stage 04_DESIGN index edit only."
123
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
124
+ role: planner
121
125
  expectFile: docs/design/${vars.slug}.md
122
126
  timeoutMs: ${vars.stepTimeoutMs}
123
127
 
@@ -262,6 +262,8 @@ states:
262
262
  options:
263
263
  agent: ${vars.implementAgent}
264
264
  # Pure slash command only (ADR-043). Anti-recursion / implement discipline
265
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
266
+ role: coder
265
267
  # lives in /sp:dev-run --mode implement → sp:code-implementation, not YAML prose.
266
268
  input: /sp:dev-run --mode implement ${vars.wbs} --auto
267
269
  timeoutMs: ${vars.implementTimeoutMs}
@@ -374,6 +376,8 @@ states:
374
376
  options:
375
377
  agent: ${vars.agent}
376
378
  # R3 (0482): `--findings` names the failing anchors inline; `--gate-log` remains
379
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
380
+ role: coder
377
381
  # the full-context escape hatch when the digest is not enough.
378
382
  input: /sp:dev-fixall "${vars.qualityGateCmd}" --gate-log .spur/run/${vars.wbs}-test-gate.log --findings "${vars.gateFindings}"
379
383
  timeoutMs: ${vars.stepTimeoutMs}
@@ -422,6 +426,8 @@ states:
422
426
  options:
423
427
  agent: ${vars.agent}
424
428
  input: /sp:dev-review ${vars.wbs} --auto
429
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
430
+ role: reviewer
425
431
  timeoutMs: ${vars.stepTimeoutMs}
426
432
 
427
433
  - id: approve
@@ -452,6 +458,8 @@ states:
452
458
  options:
453
459
  agent: ${vars.agent}
454
460
  input: /sp:dev-verify ${vars.wbs} --auto --fix all --focus all
461
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
462
+ role: reviewer
455
463
  timeoutMs: ${vars.stepTimeoutMs}
456
464
  answerFile: .spur/run/${vars.wbs}-verify-answer.txt
457
465
  - kind: shell
@@ -82,6 +82,8 @@ states:
82
82
  options:
83
83
  agent: ${vars.agent}
84
84
  capture: true
85
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
86
+ role: planner
85
87
  mode: text
86
88
  input: >-
87
89
  Resolve task ${vars.wbs} in resolution mode ${vars.resolutionMode} using the prepared
@@ -115,6 +117,8 @@ states:
115
117
  options:
116
118
  agent: ${vars.agent}
117
119
  capture: true
120
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
121
+ role: reviewer
118
122
  mode: text
119
123
  input: >-
120
124
  Verify resolved task ${vars.wbs} using only local reads and `spur` CLI. Check its
@@ -80,7 +80,9 @@ states:
80
80
  - kind: agent.run
81
81
  options:
82
82
  agent: ${vars.agent}
83
- input: "Skill(skill=\"sp:doc-evolve\", args=\"wrapup tasks=${vars.tasks}\"). Repair drift in docs/00_ADR.md, docs/03_ARCHITECTURE.md, docs/04_DESIGN.md, docs/design/* per constitution edit rules. Do not write task/feature corpus."
83
+ input: 'Skill(skill="sp:doc-evolve", args="wrapup tasks=${vars.tasks}"). Repair drift in docs/00_ADR.md, docs/03_ARCHITECTURE.md, docs/04_DESIGN.md, docs/design/* per constitution edit rules. Do not write task/feature corpus.'
84
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
85
+ role: coder
84
86
  timeoutMs: ${vars.stepTimeoutMs}
85
87
 
86
88
  - id: learning-capture
@@ -93,6 +95,8 @@ states:
93
95
  options:
94
96
  agent: ${vars.agent}
95
97
  input: "Extract working learnings from tasks ${vars.tasks}. Output raw markdown (no fences) grouped by date and task WBS: conventions, errors fixed, patterns, gotchas. Captured to .spur/run/wrapup-learnings.md."
98
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
99
+ role: coder
96
100
  answerFile: .spur/run/wrapup-learnings.md
97
101
  expectFile: .spur/run/wrapup-learnings.md
98
102
  timeoutMs: ${vars.stepTimeoutMs}
@@ -103,6 +107,8 @@ states:
103
107
  if test -s .spur/run/wrapup-learnings.md; then
104
108
  cat .spur/run/wrapup-learnings.md >> .spur/memory/learnings.md &&
105
109
  printf '\n' >> .spur/memory/learnings.md;
110
+ else
111
+ echo "wrapup: learning capture missing or empty at $PWD/.spur/run/wrapup-learnings.md - append skipped" >&2;
106
112
  fi &&
107
113
  exit 0
108
114
 
@@ -115,6 +121,8 @@ states:
115
121
  options:
116
122
  agent: ${vars.agent}
117
123
  input: "For each task in ${vars.tasks}, output one JSONL line (no fences) with fields: wbs, feature_id, status, verdict, timestamp. Captured to .spur/run/wrapup-metrics.jsonl."
124
+ # Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
125
+ role: scribe
118
126
  answerFile: .spur/run/wrapup-metrics.jsonl
119
127
  expectFile: .spur/run/wrapup-metrics.jsonl
120
128
  timeoutMs: ${vars.stepTimeoutMs}
@@ -124,6 +132,8 @@ states:
124
132
  mkdir -p .spur/memory &&
125
133
  if test -s .spur/run/wrapup-metrics.jsonl; then
126
134
  cat .spur/run/wrapup-metrics.jsonl >> .spur/memory/wrapup-metrics.jsonl;
135
+ else
136
+ echo "wrapup: metrics capture missing or empty at $PWD/.spur/run/wrapup-metrics.jsonl - append skipped" >&2;
127
137
  fi &&
128
138
  exit 0
129
139
 
@@ -131,6 +141,9 @@ states:
131
141
  description: >
132
142
  If vars.feature is set, sync feature status via bounded feature-sync-bounded
133
143
  (0411). Soft shell — blocked/failed sync must not abort wrap-up after metrics.
144
+ Empty vars.feature is NOT a blocked sync but a mis-invocation (the engine only
145
+ enters this state when vars.feature is set) and fails loud (dogfood 2026-08-15,
146
+ feature I3: a silent exit 0 made the wrap look complete with no transition).
134
147
  onEnter:
135
148
  # Genuinely soft: the terminating `exit 0` must be reached on BOTH branches, so
136
149
  # the sync is chained with `;` — with `&&` a non-zero sync skipped `exit 0` and
@@ -142,6 +155,10 @@ states:
142
155
  - kind: shell
143
156
  options:
144
157
  command: >-
158
+ if [ -z "$feature" ]; then
159
+ echo "feature-transition: vars.feature is empty — refusing no-op feature sync (mis-invocation, not a blocked sync)" >&2;
160
+ exit 1;
161
+ fi;
145
162
  if [ -f plugins/sp/scripts/feature-sync-bounded.ts ]; then
146
163
  bun plugins/sp/scripts/feature-sync-bounded.ts "$feature" --spur-bin "$spurBin" --json;
147
164
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.46",
3
+ "version": "0.3.48",
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",
@@ -54,7 +54,7 @@
54
54
  "devDependencies": {
55
55
  "@commander-js/extra-typings": "^14.0.0",
56
56
  "@gobing-ai/ts-db": "^0.4.31",
57
- "@gobing-ai/ts-ai-runner": "^0.4.31",
57
+ "@gobing-ai/ts-ai-runner": "^0.4.32",
58
58
  "@gobing-ai/ts-dual-workflow-engine": "^0.4.31",
59
59
  "@gobing-ai/ts-infra": "^0.4.31",
60
60
  "@gobing-ai/ts-llm-jsonl-importer": "^0.4.31",
@@ -66,6 +66,7 @@ Invoke `sp:spur-cli` for verb guidance and per-noun conventions:
66
66
 
67
67
  - [ ] Delegate verb guidance to `sp:spur-cli`; use the `spur` CLI for all mutations.
68
68
  - [ ] Run the noun's `check`/`validate` verb before and after editing (e.g. `spur task check <wbs> --json`).
69
+ - [ ] Run the corpus-wide sweep after batch edits: `spur task check --corpus --json` (fails on structural errors outside `config/corpus-baseline.json`).
69
70
  - [ ] Use `spur task update --section --from-file` for all task section edits.
70
71
  - [ ] Run the noun's `refresh` after batch operations where one exists (`spur task refresh`, `spur feature refresh`).
71
72
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Survey a codebase (or module tree) for shallow modules and deepening opportunities — emit a ranked MARKDOWN candidate report that feeds the planning half; never auto-refactors
3
+ role: planner
3
4
  argument-hint: "[<module-path>] [--scope <all|path>] [--agent <inline|auto|name>] [--json]"
4
5
  allowed-tools: ["Bash", "Read", "Grep", "Glob", "Skill"]
5
6
  ---
@@ -14,7 +15,7 @@ Wraps the **sp:sys-architecture** skill.
14
15
  | --- | --- | --- |
15
16
  | `[<module-path>]` | Module path to scope the architecture survey. | omitted (whole repo) |
16
17
  | `--scope` `<all\|path>` | Limit the survey to a path or expand to the whole repo. | all |
17
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing survey work. | inline |
18
+ | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing survey work. | omit |
18
19
  | `--json` | Emit structured JSON instead of markdown. | off |
19
20
 
20
21
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Interactive solution design — heuristic discovery interview followed by structured ideation with trade-offs and confidence scoring
3
+ role: planner
3
4
  argument-hint: "<topic> [--depth <basic|detailed|comprehensive>] [--options <n>] [--agent <inline|auto|name>] [--skip-discovery] [--wayfind] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]"
4
5
  allowed-tools: ["Bash", "Read", "Skill", "AskUserQuestion"]
5
6
  ---
@@ -15,7 +16,7 @@ Wraps the **sp:brainstorm** and **sp:wayfinder** skills.
15
16
  | `<topic>` | Topic or problem statement to explore. | required |
16
17
  | `--depth` `<basic\|detailed\|comprehensive>` | Breadth vs. depth of the exploration. | detailed |
17
18
  | `--options` `<n>` | Number of solution options to generate. | 3 |
18
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing ideation. | inline |
19
+ | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing ideation. | omit |
19
20
  | `--skip-discovery` | Skip the discovery interview; ideate immediately. | off |
20
21
  | `--wayfind` | Spawn a wayfinder feature for multi-session routing. | off |
21
22
  | `--task` `[<feature-id>]` | Create a tracking task under a feature. | omitted |
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Generate changelog from git commits
3
+ role: scribe
3
4
  argument-hint: "[--since <tag|commit>] [--until <tag|commit>] [--version <version>]"
4
5
  allowed-tools: ["Bash", "Read"]
5
6
  ---
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: "Generate a daily summary report from agent usage data, git history, and notes"
3
+ role: scribe
3
4
  argument-hint: "[--date <YYYY-MM-DD>] [--dry-run] [--output <path>] [--no-git] [--no-ccusage]"
4
5
  allowed-tools: ["Bash", "Read"]
5
6
  ---
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: "Systematic debugging protocol — reproduce, isolate, diagnose root cause, apply minimal fix, and verify with regression tests"
3
+ role: coder
3
4
  argument-hint: "\"<symptom | failing command>\" [--scope <path>] [--task [<wbs>]] [--agent <inline|auto|name>]"
4
5
  allowed-tools: ["Bash", "Read", "Write", "Skill"]
5
6
  ---
@@ -15,7 +16,7 @@ Wraps the **sp:sys-debugging** skill.
15
16
  | `"<symptom \| failing command>"` | Symptom or failing command to diagnose. | required |
16
17
  | `--scope` `<path>` | Scope the reproduction/isolation to a path. | cwd |
17
18
  | `--task` `[<wbs>]` | Attach findings to a task. | omitted |
18
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing diagnosis. | inline |
19
+ | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing diagnosis. | omit |
19
20
 
20
21
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
21
22
 
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: Dogfood an agent skill/command/CLI — drive it end-to-end with bounded auto-fix, self-monitor, and emit a comprehensive report
3
+ role: reviewer
3
4
  argument-hint: "<testee> [--agent <inline|auto|name>] [--max-retry <n>] [--save] [--task] [--chain-follow] [--full]"
4
5
  allowed-tools: ["Bash", "Read", "Write", "Edit", "Grep", "Glob", "Skill"]
5
6
  ---
@@ -13,7 +14,7 @@ Wraps the **sp:dogfood-testing** skill.
13
14
  | Flag | Description | Default |
14
15
  | --- | --- | --- |
15
16
  | `<testee>` | Skill / command / CLI to exercise end-to-end. | required |
16
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing dogfood work. | inline |
17
+ | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing dogfood work. | omit |
17
18
  | `--max-retry` `<n>` | Max auto-fix retries per stage. | 3 |
18
19
  | `--save` | Compatibility no-op; saving is now default. Retained until evidenced retirement. | off |
19
20
  | `--task` | Record outcomes against a task. | omitted |
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: >-
3
+ role: planner
3
4
  Restructure the feature tree from a mapping file — dry-run then apply via
4
5
  spur feature move / task feature_id edges / root docs/*.md reference rewrites
5
6
  (CLI-gated; no raw Write on docs/features or docs/tasks)
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: "Authority-aware semantic audit across source, task files, feature files, and project authority files — discover conflicts, resolve claim-specific authority, collect reproducible evidence, and route confirmed repairs through owner surfaces. Triggers: find conflict, conflict audit, semantic conflict, authority mismatch, stale projection."
3
+ role: reviewer
3
4
  argument-hint: "[<scope>] [--pillar <source|tasks|features|authority|all>] [--mode <adaptive|full>] [--resolve] [--agent <inline|auto|name>] [--json]"
4
5
  allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob", "Skill"]
5
6
  ---
@@ -18,7 +19,7 @@ owner-routed remediation.
18
19
  | `--pillar` `<source\|tasks\|features\|authority\|all>` | Limit the internal audit to one pillar; the minimum authorities needed to judge it still load. | all |
19
20
  | `--mode` `<adaptive\|full>` | Scan protocol — adaptive reuses fresh indexed context and discloses skipped areas; full forces a cold comprehensive scan. | adaptive |
20
21
  | `--resolve` | Enable the proposal, confirmation, and owner-routed remediation workflow. Its absence guarantees no source/corpus/numbered-doc mutation. | off |
21
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | inline |
22
+ | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | omit |
22
23
  | `--json` | Emit the same result envelope as Markdown as JSON. | off |
23
24
 
24
25
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).