@gobing-ai/spur 0.3.47 → 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 (134) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +42 -11
  3. package/config/transition-shims.json +33 -0
  4. package/config/workflows/basic.yaml +2 -0
  5. package/config/workflows/docs-pipeline.yaml +2 -0
  6. package/config/workflows/feature-dev.yaml +8 -0
  7. package/config/workflows/idea-pipeline.yaml +10 -0
  8. package/config/workflows/planning-pipeline.yaml +4 -0
  9. package/config/workflows/task-pipeline.yaml +8 -0
  10. package/config/workflows/wayfinder-resolution.yaml +4 -0
  11. package/config/workflows/wrapup-pipeline.yaml +18 -1
  12. package/package.json +2 -2
  13. package/plugins/sp/agents/expert-spur.md +1 -0
  14. package/plugins/sp/commands/dev-arch.md +2 -1
  15. package/plugins/sp/commands/dev-brainstorm.md +2 -1
  16. package/plugins/sp/commands/dev-changelog.md +1 -0
  17. package/plugins/sp/commands/dev-daily.md +1 -0
  18. package/plugins/sp/commands/dev-debug.md +2 -1
  19. package/plugins/sp/commands/dev-dogfood.md +2 -1
  20. package/plugins/sp/commands/dev-featurechange.md +1 -0
  21. package/plugins/sp/commands/dev-find-conflict.md +2 -1
  22. package/plugins/sp/commands/dev-find-issue.md +20 -32
  23. package/plugins/sp/commands/dev-find-next.md +2 -1
  24. package/plugins/sp/commands/dev-fixall.md +1 -0
  25. package/plugins/sp/commands/dev-gitmsg.md +1 -0
  26. package/plugins/sp/commands/dev-gtd.md +1 -0
  27. package/plugins/sp/commands/dev-handover.md +1 -0
  28. package/plugins/sp/commands/dev-idea.md +1 -0
  29. package/plugins/sp/commands/dev-next.md +2 -1
  30. package/plugins/sp/commands/dev-parallel.md +2 -1
  31. package/plugins/sp/commands/dev-plan.md +2 -1
  32. package/plugins/sp/commands/dev-refine.md +5 -3
  33. package/plugins/sp/commands/dev-refineall.md +2 -1
  34. package/plugins/sp/commands/dev-refresh.md +2 -1
  35. package/plugins/sp/commands/dev-reverse.md +2 -1
  36. package/plugins/sp/commands/dev-review.md +2 -1
  37. package/plugins/sp/commands/dev-run.md +3 -2
  38. package/plugins/sp/commands/dev-runall.md +3 -2
  39. package/plugins/sp/commands/dev-simplify.md +2 -1
  40. package/plugins/sp/commands/dev-unit.md +2 -1
  41. package/plugins/sp/commands/dev-verify.md +2 -1
  42. package/plugins/sp/commands/dev-verifyall.md +2 -1
  43. package/plugins/sp/commands/dev-wrap.md +7 -5
  44. package/plugins/sp/commands/dev-wrapall.md +7 -5
  45. package/plugins/sp/commands/rule-add.md +1 -0
  46. package/plugins/sp/commands/rule-refine.md +1 -0
  47. package/plugins/sp/commands/rule-scan.md +1 -0
  48. package/plugins/sp/commands/spur-init.md +1 -0
  49. package/plugins/sp/commands/workflow-add.md +1 -0
  50. package/plugins/sp/commands/workflow-refine.md +1 -0
  51. package/plugins/sp/hooks/careful-guard.ts +5 -80
  52. package/plugins/sp/hooks/destructive-policy.ts +146 -0
  53. package/plugins/sp/hooks/pi/guard-extension.ts +33 -46
  54. package/plugins/sp/hooks/task-file-policy.ts +31 -0
  55. package/plugins/sp/hooks/task-write-guard.ts +4 -0
  56. package/plugins/sp/plugin.json +1 -1
  57. package/plugins/sp/references/roles.md +93 -0
  58. package/plugins/sp/scripts/feature-sync-bounded.ts +28 -2
  59. package/plugins/sp/scripts/stage-registry-adapter.ts +66 -31
  60. package/plugins/sp/scripts/surface-drift-inventory.ts +908 -0
  61. package/plugins/sp/scripts/task-size-precheck.ts +30 -4
  62. package/plugins/sp/scripts/transition-shim-check.ts +238 -0
  63. package/plugins/sp/scripts/validate-flag-contracts.ts +5 -2
  64. package/plugins/sp/skills/code-verification/SKILL.md +2 -0
  65. package/plugins/sp/skills/issue-finding/SKILL.md +123 -142
  66. package/plugins/sp/skills/issue-finding/examples/expected-findings.json +1 -1
  67. package/plugins/sp/skills/issue-finding/references/session-formats.md +85 -90
  68. package/plugins/sp/skills/next-router/SKILL.md +1 -1
  69. package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +40 -2
  70. package/plugins/sp/skills/spur-cli/SKILL.md +3 -0
  71. package/plugins/sp/skills/spur-cli/references/agent.md +12 -7
  72. package/plugins/sp/skills/spur-cli/references/team.md +10 -3
  73. package/plugins/sp/skills/spur-dev/SKILL.md +2 -0
  74. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +17 -0
  75. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +44 -23
  76. package/plugins/sp/skills/spur-dev/references/dev-operations.md +14 -11
  77. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +14 -12
  78. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +14 -3
  79. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +2 -0
  80. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +12 -2
  81. package/schemas/spur-config.schema.json +27 -3
  82. package/spur.js +11637 -7590
  83. package/web/_astro/BoardApp.8hiqShQn.js +1 -0
  84. package/web/_astro/{BoardApp.DKyrGxdo.js → BoardApp.BjQUNhuj.js} +74 -74
  85. package/web/_astro/{TaskDetail.6-27_LMa.js → TaskDetail.CVBuD6dF.js} +1 -1
  86. package/web/_astro/{arc.Df-9AQvS.js → arc.BMMjdODi.js} +1 -1
  87. package/web/_astro/{architectureDiagram-3BPJPVTR.VAI_-paS.js → architectureDiagram-3BPJPVTR.BU5ShzXf.js} +1 -1
  88. package/web/_astro/{blockDiagram-GPEHLZMM.DFpUY1ue.js → blockDiagram-GPEHLZMM.Bj1iEqPD.js} +1 -1
  89. package/web/_astro/{c4Diagram-AAUBKEIU.CF8doOpg.js → c4Diagram-AAUBKEIU.vX8wepCL.js} +1 -1
  90. package/web/_astro/channel.EwdSemIC.js +1 -0
  91. package/web/_astro/{chunk-2J33WTMH.BnjK3fjt.js → chunk-2J33WTMH.BKAipTym.js} +1 -1
  92. package/web/_astro/{chunk-4BX2VUAB.x6ZDnJKq.js → chunk-4BX2VUAB.B68XkPG7.js} +1 -1
  93. package/web/_astro/{chunk-55IACEB6.zY-0uu7w.js → chunk-55IACEB6.BmeDLcrc.js} +1 -1
  94. package/web/_astro/{chunk-727SXJPM.BZxKg_Vi.js → chunk-727SXJPM.PDuBA3Kw.js} +1 -1
  95. package/web/_astro/{chunk-AQP2D5EJ.Cpi9G9Td.js → chunk-AQP2D5EJ.C7A044za.js} +1 -1
  96. package/web/_astro/{chunk-FMBD7UC4.DWTB-Pif.js → chunk-FMBD7UC4.BtzKKFqR.js} +1 -1
  97. package/web/_astro/{chunk-ND2GUHAM.BPDQbiOG.js → chunk-ND2GUHAM.BJuDeeOy.js} +1 -1
  98. package/web/_astro/{chunk-QZHKN3VN.BRWIcuoM.js → chunk-QZHKN3VN.DSeMDgcQ.js} +1 -1
  99. package/web/_astro/{classDiagram-4FO5ZUOK.mGTCZsDO.js → classDiagram-4FO5ZUOK.D53Q4tCw.js} +1 -1
  100. package/web/_astro/{classDiagram-v2-Q7XG4LA2.mGTCZsDO.js → classDiagram-v2-Q7XG4LA2.D53Q4tCw.js} +1 -1
  101. package/web/_astro/{cose-bilkent-S5V4N54A.D1GEut-z.js → cose-bilkent-S5V4N54A.c712AFRH.js} +1 -1
  102. package/web/_astro/{dagre-BM42HDAG.BV0XG9Do.js → dagre-BM42HDAG.D-idisph.js} +1 -1
  103. package/web/_astro/{diagram-2AECGRRQ.DzpYxsjo.js → diagram-2AECGRRQ.DLgnsJCU.js} +1 -1
  104. package/web/_astro/{diagram-5GNKFQAL.Cm9YzJh4.js → diagram-5GNKFQAL.BiaxBVqx.js} +1 -1
  105. package/web/_astro/{diagram-KO2AKTUF.BjhottUj.js → diagram-KO2AKTUF.C8HX1vd8.js} +1 -1
  106. package/web/_astro/{diagram-LMA3HP47.BFsQW5kb.js → diagram-LMA3HP47.CfqDLLes.js} +1 -1
  107. package/web/_astro/{diagram-OG6HWLK6.8pdpzSWO.js → diagram-OG6HWLK6.15SDiEed.js} +1 -1
  108. package/web/_astro/{erDiagram-TEJ5UH35.Bd7KUJmJ.js → erDiagram-TEJ5UH35.DksYtOYM.js} +1 -1
  109. package/web/_astro/{flowDiagram-I6XJVG4X.7LWffkaE.js → flowDiagram-I6XJVG4X.DR_Au-HV.js} +1 -1
  110. package/web/_astro/{ganttDiagram-6RSMTGT7.BeDcO5tI.js → ganttDiagram-6RSMTGT7.CHhHrffI.js} +1 -1
  111. package/web/_astro/{gitGraphDiagram-PVQCEYII.Ca4n730A.js → gitGraphDiagram-PVQCEYII.B2Xehvam.js} +1 -1
  112. package/web/_astro/{index.Dbvuw6d4.css → index.DAxu50UF.css} +1 -1
  113. package/web/_astro/{infoDiagram-5YYISTIA.B0OakQYb.js → infoDiagram-5YYISTIA.C9c3CNNN.js} +1 -1
  114. package/web/_astro/{ishikawaDiagram-YF4QCWOH.DSmNQe-1.js → ishikawaDiagram-YF4QCWOH.BibUHkh8.js} +1 -1
  115. package/web/_astro/{journeyDiagram-JHISSGLW.Cy5ruEUu.js → journeyDiagram-JHISSGLW.BYoVHiyO.js} +1 -1
  116. package/web/_astro/{kanban-definition-UN3LZRKU.CUJXub0p.js → kanban-definition-UN3LZRKU.CM1K5wHE.js} +1 -1
  117. package/web/_astro/{linear.DC1jCCXn.js → linear.SPpjJUb-.js} +1 -1
  118. package/web/_astro/{mermaid.core.DxVP99Ab.js → mermaid.core.BAgx3nnb.js} +4 -4
  119. package/web/_astro/{mindmap-definition-RKZ34NQL.D0MaV6sJ.js → mindmap-definition-RKZ34NQL.D35oPG1R.js} +1 -1
  120. package/web/_astro/{pieDiagram-4H26LBE5.DCC6_q32.js → pieDiagram-4H26LBE5.DiWuRwk7.js} +1 -1
  121. package/web/_astro/{quadrantDiagram-W4KKPZXB.BeUOAM7C.js → quadrantDiagram-W4KKPZXB.B9PBzTWn.js} +1 -1
  122. package/web/_astro/{requirementDiagram-4Y6WPE33.Dbl4MASO.js → requirementDiagram-4Y6WPE33.CYuuamFN.js} +1 -1
  123. package/web/_astro/{sankeyDiagram-5OEKKPKP.HsLg0VS4.js → sankeyDiagram-5OEKKPKP.W24UhhtD.js} +1 -1
  124. package/web/_astro/{sequenceDiagram-3UESZ5HK.DT7DJTnZ.js → sequenceDiagram-3UESZ5HK.BpbNjA51.js} +1 -1
  125. package/web/_astro/{stateDiagram-AJRCARHV.d_ju1Vr1.js → stateDiagram-AJRCARHV.DqVsHudf.js} +1 -1
  126. package/web/_astro/{stateDiagram-v2-BHNVJYJU.DMCAjMJ4.js → stateDiagram-v2-BHNVJYJU.CzwHYX81.js} +1 -1
  127. package/web/_astro/{timeline-definition-PNZ67QCA.DNOHr62_.js → timeline-definition-PNZ67QCA.Bc3B6djw.js} +1 -1
  128. package/web/_astro/{vennDiagram-CIIHVFJN.B7dUy-1W.js → vennDiagram-CIIHVFJN.C-D5rh8O.js} +1 -1
  129. package/web/_astro/{wardley-L42UT6IY.DEqOXvBh.js → wardley-L42UT6IY.D7PdYCqn.js} +1 -1
  130. package/web/_astro/{wardleyDiagram-YWT4CUSO.BCRb2p6x.js → wardleyDiagram-YWT4CUSO.CwmJKXF3.js} +1 -1
  131. package/web/_astro/{xychartDiagram-2RQKCTM6.NxVQLdBh.js → xychartDiagram-2RQKCTM6.avDYnLsb.js} +1 -1
  132. package/web/index.html +2 -2
  133. package/web/_astro/BoardApp.Ce6zJYAH.js +0 -1
  134. package/web/_astro/channel.Uhm9O3UV.js +0 -1
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "plugins": [
8
8
  {
9
- "version": "0.3.47",
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
@@ -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.47",
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).
@@ -1,13 +1,15 @@
1
1
  ---
2
- description: "Review agent session logs, identify performance bottlenecks and behavioral anti-patterns, and generate a structured task file with proposed fixes. Triggers: post-mortem, performance analysis, session review, find issues, identify bottlenecks"
3
- argument-hint: "[<topic>] [--sessions <glob>] [--source <auto|omp|claude|codex|gemini|opencode|antigravity|openclaw|pi>] [--feature <id>] [--template <meta|issue|standard>] [--priority <P0|P1|P2|P3>] [--severity <S0|S1|S2>] [--category <list>] [--since <iso>] [--until <iso>] [--top <n>] [--min-cost <duration>] [--strict-topic] [--use-history] [--no-task] [--agent <inline|auto|name>] [--json]"
2
+ description: "Render the session-forensics report from imported history data (8 CLI-derivable sections plus 6 model-authored), identify bottlenecks and behavioral anti-patterns, and optionally create a structured fix task behind --create-task. Triggers: post-mortem, performance analysis, session review, find issues, identify bottlenecks"
3
+ role: reviewer
4
+ argument-hint: "[<topic>] [--sessions <glob>] [--source <auto|omp|claude|codex|gemini|opencode|antigravity|openclaw|pi>] [--feature <id>] [--template <meta|issue|standard>] [--priority <P0|P1|P2|P3>] [--severity <S0|S1|S2>] [--category <list>] [--since <iso>] [--until <iso>] [--top <n>] [--min-cost <duration>] [--strict-topic] [--create-task] [--agent <inline|auto|name>] [--json]"
4
5
  allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob", "Skill"]
5
6
  ---
6
7
 
7
8
  # Dev Find Issue
8
9
 
9
- Wraps the **sp:issue-finding** skill — forensic session log analysis that identifies performance
10
- bottlenecks, ranks root causes by time cost, proposes targeted fixes, and generates a structured
10
+ Wraps the **sp:issue-finding** skill — report-first session forensics over the history data plane.
11
+ The CLI renders the 8 derivable report sections (`spur history report --mode forensics`); the skill
12
+ identifies bottlenecks, proposes fixes, and — only with `--create-task` — generates a structured
11
13
  task file via `spur task create`.
12
14
 
13
15
  ## Argument Flags
@@ -15,21 +17,20 @@ task file via `spur task create`.
15
17
  | Flag | Description | Default |
16
18
  | ------------------------------------------------------------------------------------ | ------------------------------------ | ---------- |
17
19
  | `[<topic>]` | Narrow the analysis to a topic. | omitted |
18
- | `--sessions` `<glob>` | Session log glob to scan. | recent |
20
+ | `--sessions` `<glob>` | Session log glob (fallback input). | recent |
19
21
  | `--source` `<auto\|omp\|claude\|codex\|gemini\|opencode\|antigravity\|openclaw\|pi>` | Agent source to scan. | auto |
20
- | `--feature` `<id>` | Attach findings to a feature. | omitted |
21
- | `--template` `<meta\|issue\|standard>` | Output template shape. | standard |
22
- | `--priority` `<P0\|P1\|P2\|P3>` | Filter / assign priority. | omitted |
23
- | `--severity` `<S0\|S1\|S2>` | Filter / assign severity. | omitted |
22
+ | `--feature` `<id>` | Attach the generated task to a feature. | omitted |
23
+ | `--template` `<meta\|issue\|standard>` | Task template shape (`--create-task` only). | standard |
24
+ | `--priority` `<P0\|P1\|P2\|P3>` | Filter / assign task priority. | P2 |
25
+ | `--severity` `<S0\|S1\|S2>` | Filter / assign severity. | all |
24
26
  | `--category` `<list>` | Comma list of categories to keep. | all |
25
27
  | `--since` `<iso>` | Start of the scan window. | configured |
26
28
  | `--until` `<iso>` | End of the scan window. | now |
27
29
  | `--top` `<n>` | Limit to top N findings. | omitted |
28
30
  | `--min-cost` `<duration>` | Minimum wasted duration to report. | omitted |
29
31
  | `--strict-topic` | Drop findings off-topic. | off |
30
- | `--use-history` | Incorporate indexed history. | off |
31
- | `--no-task` | Do not create a task for findings. | off |
32
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | inline |
32
+ | `--create-task` | Generate a fix task for findings. | off |
33
+ | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | omit |
33
34
  | `--json` | Emit structured JSON. | off |
34
35
 
35
36
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
@@ -41,28 +42,15 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
41
42
  /sp:dev-find-issue "test-loop spinning"
42
43
  /sp:dev-find-issue --sessions "~/.omp/agent/sessions/-xprojects-spur-new/2026-07-29T*"
43
44
  /sp:dev-find-issue "L3 guard format discovery" --feature H51 --priority P1 --severity S1
44
- /sp:dev-find-issue --category test-loop,guard --min-cost 30m --no-task
45
- /sp:dev-find-issue --source claude --since 2026-07-28 --json
46
- /sp:dev-find-issue --sessions plugins/sp/skills/issue-finding/examples/session-test-loop.jsonl --no-task
45
+ /sp:dev-find-issue --category test-loop,guard --min-cost 30m
46
+ /sp:dev-find-issue --source claude --since 2026-07-28 --create-task --json
47
47
  ```
48
48
 
49
- | Argument | Description | Default |
50
- | ----------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------- |
51
- | `[topic]` | Optional focus text or smart positional (path/glob sessions; category phrase filter) | (full taxonomy) |
52
- | `--sessions <glob>` | Session JSONL file(s) or directory | most recent for resolved source |
53
- | `--source <name>` | `auto`, `omp`, `claude`, `codex`, `gemini`, `opencode`, `antigravity`, `openclaw`, `pi` | `auto` |
54
- | `--feature <id>` | Feature ID to link the generated task to | (none) |
55
- | `--template <name>` | `meta` (umbrella), `issue` (single), or `standard` | `meta` |
56
- | `--priority <P0\|P1\|P2\|P3>` | Task frontmatter priority (not bottleneck severity) | `P2` |
57
- | `--severity <S0\|S1\|S2>` | Minimum bottleneck severity to keep | (all) |
58
- | `--category <list>` | Comma-separated category ids (`test-loop`, `guard`, …) | `all` |
59
- | `--since` / `--until` | Session start time bounds | (none) |
60
- | `--top <n>` | Cap number of fixes/requirements | (no cap) |
61
- | `--min-cost <duration>` | Drop findings under this waste floor (`30m`, `2h`) | (none) |
62
- | `--strict-topic` | Drop off-topic findings even if severe | off |
63
- | `--use-history` | Optional `spur history` import/analyze for cost aggregates | off |
64
- | `--no-task` | Markdown report only | off |
65
- | `--json` | JSON findings only (no task) | off |
49
+ **Report-first (task 0556).** Default output is the markdown report to stdout; no task file is
50
+ written. Task creation moved behind `--create-task`. `--use-history` and `--no-task` are removed:
51
+ the history data plane is now the primary source (no flag needed), and the old report-only behavior
52
+ is the new default. Raw JSONL remains a fallback under the three conditions documented in
53
+ `sp:issue-finding`.
66
54
 
67
55
  **See also:** skill `sp:issue-finding` (SSOT), `/sp:dev-runall`, `/sp:dev-dogfood`,
68
56
  `sp:daily-summary`, `sp:reverse-engineering`.
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: "Prompt-first feature frontier prioritizer — answers 'which feature should we work on now?' with a ranked, evidence-carrying frontier, and emits rank-distorting tree defects as proposals /sp:dev-featurechange consumes. Triggers: find next, which feature, feature ranking, frontier priority, what should I work on."
3
+ role: planner
3
4
  argument-hint: "[--task [<feature-id>]] [--agent <inline|auto|name>] [--auto] [--json]"
4
5
  allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob", "Skill"]
5
6
  ---
@@ -19,7 +20,7 @@ Answers *"which X"* — the question `/sp:dev-next` deliberately does not (next-
19
20
  | Flag | Description | Default |
20
21
  | --- | --- | --- |
21
22
  | `--task` `[<feature-id>]` | After the report, confirm one target and dispatch the planning half to produce implement-ready tasks. | omitted |
22
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | inline |
23
+ | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | omit |
23
24
  | `--auto` | Skip the `--task` confirm (accept the offered target) and forward into dispatched children. | off |
24
25
  | `--json` | Emit the ranked frontier, gated list, and proposals as a JSON envelope. | off |
25
26