@gobing-ai/spur 0.3.89 → 0.3.91

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 (79) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/pipeline-budgets.json +7 -0
  3. package/config/rules/boundary/sp-plugin-standalone.yaml +37 -0
  4. package/config/workflows/decision-routing-example.yaml +134 -0
  5. package/config/workflows/idea-pipeline.yaml +8 -0
  6. package/config/workflows/task-pipeline.yaml +2 -0
  7. package/config/workflows/wayfinder-resolution.yaml +2 -0
  8. package/config/workflows/wrapup-pipeline.yaml +2 -0
  9. package/package.json +9 -9
  10. package/plugins/sp/README.md +1 -0
  11. package/plugins/sp/agents/expert-spur.md +2 -2
  12. package/plugins/sp/lib/idea-handoff.generated.mjs +157 -150
  13. package/plugins/sp/plugin.json +1 -1
  14. package/plugins/sp/scripts/inline-pipeline-parity-check.ts +1 -0
  15. package/plugins/sp/scripts/script-contract-check.ts +58 -0
  16. package/plugins/sp/scripts/surface-drift-inventory.ts +71 -6
  17. package/plugins/sp/scripts/validate-flag-contracts.ts +3 -3
  18. package/plugins/sp/skills/spur-cli/references/agent.md +11 -2
  19. package/plugins/sp/skills/spur-cli/references/self.md +5 -1
  20. package/plugins/sp/skills/spur-cli/references/workflows.md +11 -4
  21. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +21 -2
  22. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +13 -4
  23. package/plugins/sp/skills/spur-dev/references/glossary.md +9 -1
  24. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +9 -1
  25. package/plugins/sp/skills/wayfinder/SKILL.md +1 -1
  26. package/spur.js +3100 -959
  27. package/web/_astro/{BoardApp.CDUcHlTJ.js → BoardApp.BEDWpzsr.js} +82 -82
  28. package/web/_astro/BoardApp.DQG2xfEz.js +1 -0
  29. package/web/_astro/{TaskDetail.DwTmbQp5.js → TaskDetail.CXGltuT_.js} +1 -1
  30. package/web/_astro/{arc.BzF71EFI.js → arc.C0rrflm_.js} +1 -1
  31. package/web/_astro/{architectureDiagram-3BPJPVTR.jvdDahWM.js → architectureDiagram-3BPJPVTR.DJ8DHkWE.js} +1 -1
  32. package/web/_astro/{blockDiagram-GPEHLZMM.zSg4AmFD.js → blockDiagram-GPEHLZMM.D8DHK3Jl.js} +1 -1
  33. package/web/_astro/{c4Diagram-AAUBKEIU.BkUIUQWH.js → c4Diagram-AAUBKEIU.BugQbX9u.js} +1 -1
  34. package/web/_astro/channel.SRrg1P-w.js +1 -0
  35. package/web/_astro/{chunk-2J33WTMH.DvfQ_f50.js → chunk-2J33WTMH.Mv26KlVn.js} +1 -1
  36. package/web/_astro/{chunk-4BX2VUAB.DuI4gQqX.js → chunk-4BX2VUAB.CD51JoT_.js} +1 -1
  37. package/web/_astro/{chunk-55IACEB6.D3BWBOpF.js → chunk-55IACEB6.D_PFaIEe.js} +1 -1
  38. package/web/_astro/{chunk-727SXJPM.3QSi0a9M.js → chunk-727SXJPM.DemMW1ao.js} +1 -1
  39. package/web/_astro/{chunk-AQP2D5EJ.xazCQrAF.js → chunk-AQP2D5EJ.Iu2V5-ex.js} +1 -1
  40. package/web/_astro/{chunk-FMBD7UC4.B2g6u4rA.js → chunk-FMBD7UC4.MsNgSP-E.js} +1 -1
  41. package/web/_astro/{chunk-ND2GUHAM.wWwWs99t.js → chunk-ND2GUHAM.DfbRaAlm.js} +1 -1
  42. package/web/_astro/{chunk-QZHKN3VN.BD5g3qa9.js → chunk-QZHKN3VN.BbJAQ4h-.js} +1 -1
  43. package/web/_astro/{classDiagram-4FO5ZUOK.C7CzCdsX.js → classDiagram-4FO5ZUOK.CPurtiC2.js} +1 -1
  44. package/web/_astro/{classDiagram-v2-Q7XG4LA2.C7CzCdsX.js → classDiagram-v2-Q7XG4LA2.CPurtiC2.js} +1 -1
  45. package/web/_astro/{cose-bilkent-S5V4N54A.Xyiau0gw.js → cose-bilkent-S5V4N54A.CKKdx1bM.js} +1 -1
  46. package/web/_astro/{cynefin-OW5HDTMX.BeC5MWas.js → cynefin-OW5HDTMX.CoKMTg-R.js} +1 -1
  47. package/web/_astro/{dagre-BM42HDAG.yZbMN9vc.js → dagre-BM42HDAG.D4h4_k56.js} +1 -1
  48. package/web/_astro/{diagram-2AECGRRQ.Cmo2zQM-.js → diagram-2AECGRRQ.DJ0h9zgw.js} +1 -1
  49. package/web/_astro/{diagram-5GNKFQAL.D033eSVi.js → diagram-5GNKFQAL.DvPk1jYd.js} +1 -1
  50. package/web/_astro/{diagram-KO2AKTUF.CR6k3Y3G.js → diagram-KO2AKTUF.BFoCkiCr.js} +1 -1
  51. package/web/_astro/{diagram-LMA3HP47.x7mwu8jz.js → diagram-LMA3HP47.exHn9OVx.js} +1 -1
  52. package/web/_astro/{diagram-OG6HWLK6.D8aTTvUr.js → diagram-OG6HWLK6.CeqO34nN.js} +1 -1
  53. package/web/_astro/{erDiagram-TEJ5UH35.BoBqcKXQ.js → erDiagram-TEJ5UH35.D_v7HqxR.js} +1 -1
  54. package/web/_astro/{flowDiagram-I6XJVG4X.D3mTQdrU.js → flowDiagram-I6XJVG4X.EUmrpbwh.js} +1 -1
  55. package/web/_astro/{ganttDiagram-6RSMTGT7.H-cqgIh-.js → ganttDiagram-6RSMTGT7.BOCF5lII.js} +1 -1
  56. package/web/_astro/{gitGraphDiagram-PVQCEYII.B6s9zbfC.js → gitGraphDiagram-PVQCEYII.Di7otYZD.js} +1 -1
  57. package/web/_astro/index.Bx6GY4RH.css +1 -0
  58. package/web/_astro/{infoDiagram-5YYISTIA.BzgCoV6P.js → infoDiagram-5YYISTIA.TcBkCAJk.js} +1 -1
  59. package/web/_astro/{ishikawaDiagram-YF4QCWOH.BZzVhy1-.js → ishikawaDiagram-YF4QCWOH.D-2y4M0c.js} +1 -1
  60. package/web/_astro/{journeyDiagram-JHISSGLW.BV3195Py.js → journeyDiagram-JHISSGLW.DPbJI_n2.js} +1 -1
  61. package/web/_astro/{kanban-definition-UN3LZRKU.BjRd2DWz.js → kanban-definition-UN3LZRKU.EFxhQ9Fj.js} +1 -1
  62. package/web/_astro/{linear.BILTgS5N.js → linear.DSAsQLzs.js} +1 -1
  63. package/web/_astro/{mermaid.core.DBy_WKeW.js → mermaid.core.kAZjgJHG.js} +4 -4
  64. package/web/_astro/{mindmap-definition-RKZ34NQL.BiEjaI4-.js → mindmap-definition-RKZ34NQL.CJY1N_7V.js} +1 -1
  65. package/web/_astro/{pieDiagram-4H26LBE5.i_8V5pIn.js → pieDiagram-4H26LBE5.567ZNoL2.js} +1 -1
  66. package/web/_astro/{quadrantDiagram-W4KKPZXB.BWaW3MHn.js → quadrantDiagram-W4KKPZXB.mqfz9-MY.js} +1 -1
  67. package/web/_astro/{requirementDiagram-4Y6WPE33.CzddBbtg.js → requirementDiagram-4Y6WPE33.Bv1Gv9In.js} +1 -1
  68. package/web/_astro/{sankeyDiagram-5OEKKPKP.X2ww0e-D.js → sankeyDiagram-5OEKKPKP.B6Gs4X4r.js} +1 -1
  69. package/web/_astro/{sequenceDiagram-3UESZ5HK.DSA4kTcc.js → sequenceDiagram-3UESZ5HK.BhYj4v-m.js} +1 -1
  70. package/web/_astro/{stateDiagram-AJRCARHV.D0DtFSpR.js → stateDiagram-AJRCARHV.BPbBnkpw.js} +1 -1
  71. package/web/_astro/{stateDiagram-v2-BHNVJYJU.BfQq0zQv.js → stateDiagram-v2-BHNVJYJU.C4squMNK.js} +1 -1
  72. package/web/_astro/{timeline-definition-PNZ67QCA.Dmlrgi1m.js → timeline-definition-PNZ67QCA.C_SwIHgl.js} +1 -1
  73. package/web/_astro/{vennDiagram-CIIHVFJN.D5mpl00Z.js → vennDiagram-CIIHVFJN.Bz4NZGpQ.js} +1 -1
  74. package/web/_astro/{wardleyDiagram-YWT4CUSO.Df4BdzO4.js → wardleyDiagram-YWT4CUSO.CozMVZ3i.js} +1 -1
  75. package/web/_astro/{xychartDiagram-2RQKCTM6.DiTRreKN.js → xychartDiagram-2RQKCTM6.BwMGBwjB.js} +1 -1
  76. package/web/index.html +2 -2
  77. package/web/_astro/BoardApp.CaCGU_uX.js +0 -1
  78. package/web/_astro/channel.SSVY0JPQ.js +0 -1
  79. package/web/_astro/index.CcU5weKX.css +0 -1
@@ -7,7 +7,7 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sp",
10
- "version": "0.3.89",
10
+ "version": "0.3.91",
11
11
  "source": "./plugins/sp"
12
12
  }
13
13
  ]
@@ -48,6 +48,13 @@
48
48
  "tokenCostUsd": null,
49
49
  "source": "Coverage entry (0826 R2): the live definition's model-query count (extractResolvedWorkflowFacts, 2026-09-11). No real-run measurement yet: wall-clock and cost are unenforced until measured, never 0.",
50
50
  "decision": null
51
+ },
52
+ "decision-routing-example": {
53
+ "modelQueries": 0,
54
+ "wallClockMs": null,
55
+ "tokenCostUsd": null,
56
+ "source": "Coverage entry (0911): authoring example (config/workflows/decision-routing-example.yaml) enumerating `decision:` modes. Measured 0 model queries — the producer is a shell action, so the example runs with no provider (live count via loadQueryCounts, 2026-09-20). Not a pipeline humans run; wall-clock and cost unenforced, never 0.",
57
+ "decision": null
51
58
  }
52
59
  }
53
60
  }
@@ -0,0 +1,37 @@
1
+ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
2
+ # Plugin standalone contract — bundled plugin surfaces import only node:* or relative paths.
3
+ #
4
+ # WHY: `superskill install` bundles plugins/sp hooks and scripts on targets (and from
5
+ # marketplace snapshots) with NO node_modules. A bare `@gobing-ai/*` value import only
6
+ # converts if the host superskill happens to carry that package in its private dep tree
7
+ # (superskill 0.3.28+ bundles ts-utils/ts-runtime; older versions do not). When it does
8
+ # not: "Error: Bundle failed" and the plugin cannot install — this broke releases
9
+ # 0.3.81–0.3.88 (task 0669; regression commit 84c87a9ac).
10
+ #
11
+ # Contract:
12
+ # - plugins/sp/hooks/**, plugins/sp/scripts/**, plugins/sp/lib/** may value-import
13
+ # only `node:*` builtins and relative paths (vendored helpers live in plugins/sp/lib/).
14
+ # - `import type` / `export type` from any package is fine — erased before bundling
15
+ # (e.g. inline-run-setup.ts's type-only import from @gobing-ai/app).
16
+ # - This rule is the author-time tripwire over DIRECT imports; the transitive closure
17
+ # and the real `superskill install` path are checked by `bun run plugin-smoke`, and
18
+ # script-contract-check Rule 5 (manifest-aware) fails the spur-check gate.
19
+ #
20
+ # Scope: plugins/sp bundled surfaces only. apps/packages follow the normal workspace
21
+ # import rules and are not affected.
22
+ include:
23
+ - "plugins/sp/hooks/**/*.ts"
24
+ - "plugins/sp/scripts/**/*.ts"
25
+ - "plugins/sp/lib/**/*.ts"
26
+ rules:
27
+ - id: sp-plugin-standalone
28
+ description: >
29
+ No value imports of workspace packages (`@gobing-ai/*` or any bare specifier)
30
+ in plugin bundled surfaces — superskill bundles them onto targets with no
31
+ node_modules. Vendor the helper into plugins/sp/lib/ (see lib/env.ts) or use a
32
+ relative import. `import type` is exempt.
33
+ severity: error
34
+ evaluator:
35
+ type: rg
36
+ config:
37
+ pattern: "^import \\{[^}]*\\} from ['\\\"]@gobing-ai/|^import ['\\\"]@gobing-ai/|^import\\(['\\\"]@gobing-ai/|^} from ['\\\"]@gobing-ai/"
@@ -0,0 +1,134 @@
1
+ # DecisionMaker routing example (task 0911, D7). Demonstrates the three `decision:` modes
2
+ # on hitl.* actions; copy the pattern into your own workflow instead of running this file.
3
+ #
4
+ # never — the action always asks the human (DecisionMaker is bypassed even when
5
+ # `workflow.hitlDecisionMaker: true`). Used for gates that must stay human-only.
6
+ # evidence — the DecisionMaker answers from recorded action evidence of the listed producer
7
+ # states: it picks one of the offered choices when confidence >= 0.9, or defers
8
+ # (answer var is cleared, status var records `deferred`) when evidence is missing,
9
+ # stale, or inconclusive. Requires a non-paused state, a statusVar distinct from
10
+ # the answer var, and producer states that exist in this workflow.
11
+ # (omitted) — legacy 0910 semantics: DecisionMaker may confirm/select without evidence and
12
+ # without provenance. Kept for compatibility; prefer an explicit mode.
13
+ #
14
+ # The run is safe and local: one shell producer emits a fixed failure summary, the choose step
15
+ # reads it as evidence, and the operator gate has no side effects. No provider is required —
16
+ # without `workflow.hitlDecisionMaker: true` (or without a key) the evidence step defers and
17
+ # `never` behaves exactly like an unconfigured gate. See `spur self status` -> `decisionMaker`
18
+ # for offline readiness. Optional registered-summary evidence (`summaryArtifact`) is documented
19
+ # in docs/help/how_to_enable_jev_in_spur.md; this example deliberately creates no artifact.
20
+ "$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
21
+ kind: state-machine
22
+ name: decision-routing-example
23
+ version: "1"
24
+ initialState: assess
25
+ description: >
26
+ Worked example of DecisionMaker decision routing (0911 D7): a shell producer records a fixed
27
+ recovery summary as action evidence, a non-pausing hitl.select lets the DecisionMaker choose
28
+ retry or stop from that evidence (deferring with provenance when it is inconclusive), an
29
+ accepted retry runs exactly one attempt and then escalates, and the never-mode pause=true
30
+ hitl.confirm gate always waits for the operator with explicit yes/no/cancel branches.
31
+ Illustrative only — copy the patterns rather than running this file.
32
+ vars:
33
+ recoveryChoice: ""
34
+ decisionStatus: ""
35
+ # Default answer var the never-mode gate's yes/no/cancel branches read (matches the stock gates).
36
+ __hitlAnswer: ""
37
+ states:
38
+ - id: assess
39
+ description: >
40
+ Producer state: one shell action whose redacted output becomes the evidence the decide
41
+ state's DecisionMaker reads. One producer state carries one evidence-bearing action.
42
+ onEnter:
43
+ - kind: shell
44
+ options:
45
+ command: >-
46
+ printf 'Failure summary: verification failed twice on the flaky fixture; no data loss;
47
+ retry is safe, or stop and hand the decision to the operator.'
48
+ - id: decide
49
+ description: >
50
+ Evidence-mode select (non-paused): DecisionMaker picks a recovery step from the assess
51
+ state's recorded evidence. Low confidence, missing or stale evidence defers and writes the
52
+ status variable instead of answering, so no implicit approval is ever produced.
53
+ onEnter:
54
+ - kind: hitl.select
55
+ options:
56
+ prompt: "Choose the next safe recovery step using the recorded failure summary."
57
+ options: [retry, stop]
58
+ var: recoveryChoice
59
+ decision:
60
+ mode: evidence
61
+ statusVar: decisionStatus
62
+ evidenceNodes: [assess]
63
+ - id: retry
64
+ description: >
65
+ The single bounded retry an accepted `retry` choice buys: this state runs once and routes
66
+ to the operator gate, so an accepted answer can never loop back into the decision.
67
+ onEnter:
68
+ - kind: shell
69
+ options:
70
+ command: "printf 'retry attempt: re-running the failed verification step once'"
71
+ - id: humanGate
72
+ description: >
73
+ Never-mode confirm (paused): always waits for the operator, whichever branch reached it.
74
+ `spur workflow continue --answer yes|no|cancel` records the explicit operator answer.
75
+ pause: true
76
+ onEnter:
77
+ - kind: hitl.confirm
78
+ options:
79
+ prompt: "Publish the recovered result, stop, or cancel the run?"
80
+ decision:
81
+ mode: never
82
+ - id: published
83
+ description: Operator approved the recovered result; terminal marker state.
84
+ - id: stop
85
+ description: Recovery stopped deliberately — requested by the decision or rejected by the operator.
86
+ - id: cancelled
87
+ description: Operator cancelled the run at the gate; terminal marker state.
88
+ transitions:
89
+ # Accepted decision branches first: the state machine takes the first passing edge.
90
+ - from: assess
91
+ to: decide
92
+ guard: { kind: always }
93
+ - from: decide
94
+ to: retry
95
+ guard:
96
+ kind: shell
97
+ options:
98
+ command: 'test "$recoveryChoice" = "retry"'
99
+ - from: decide
100
+ to: stop
101
+ guard:
102
+ kind: shell
103
+ options:
104
+ command: 'test "$recoveryChoice" = "stop"'
105
+ # Declared defer edge: evidence mode wrote `deferred` and cleared the answer var.
106
+ - from: decide
107
+ to: humanGate
108
+ guard:
109
+ kind: shell
110
+ options:
111
+ command: 'test "$decisionStatus" = "deferred"'
112
+ - from: retry
113
+ to: humanGate
114
+ guard: { kind: always }
115
+ # Explicit yes / no / cancel branches on the default answer var, matching the stock gates.
116
+ - from: humanGate
117
+ to: published
118
+ guard:
119
+ kind: shell
120
+ options:
121
+ command: 'test "$__hitlAnswer" = "yes"'
122
+ - from: humanGate
123
+ to: stop
124
+ guard:
125
+ kind: shell
126
+ options:
127
+ command: 'test "$__hitlAnswer" = "no"'
128
+ - from: humanGate
129
+ to: cancelled
130
+ guard:
131
+ kind: shell
132
+ options:
133
+ command: 'test "$__hitlAnswer" = "cancel"'
134
+ terminalStates: [published, stop, cancelled]
@@ -145,6 +145,8 @@ states:
145
145
  - kind: hitl.confirm
146
146
  options:
147
147
  prompt: "Review the idea evaluation report (.spur/run/${vars.__runId}-idea-eval-report.md). Approve to create a feature, or reject to cancel? (Reject creates no feature.)"
148
+ decision:
149
+ mode: never
148
150
 
149
151
  - id: feature-create
150
152
  description: >
@@ -282,6 +284,8 @@ states:
282
284
  - kind: hitl.confirm
283
285
  options:
284
286
  prompt: "Feature check for ${vars.featureId}. Review the AC and confirm to proceed? Requirement coverage status: $(cat .spur/run/${vars.__runId}-idea-coverage.status 2>/dev/null || echo unknown) — reason: $(cat .spur/run/${vars.__runId}-idea-coverage.reason 2>/dev/null || echo n/a) (.spur/run/${vars.__runId}-idea-coverage.status[.reason]). (Failures route back to ac-generate for revision, capped at 3 retries.)"
287
+ decision:
288
+ mode: never
285
289
 
286
290
  - id: system-design
287
291
  description: >
@@ -358,6 +362,8 @@ states:
358
362
  - kind: hitl.confirm
359
363
  options:
360
364
  prompt: "Review the system design for feature ${vars.featureId}. Approve to proceed to decomposition? To reject, first record your feedback in .spur/run/${vars.__runId}-idea-design-review.md under the `## Operator feedback` heading, then answer no."
365
+ decision:
366
+ mode: never
361
367
 
362
368
  - id: decompose
363
369
  description: >
@@ -416,6 +422,8 @@ states:
416
422
  - kind: hitl.confirm
417
423
  options:
418
424
  prompt: "Batch-create for feature ${vars.featureId}. Review the task batch and confirm to proceed? (Failures route back to decompose for revision, capped at 3 retries.)"
425
+ decision:
426
+ mode: never
419
427
 
420
428
  - id: batch-create-run
421
429
  description: >
@@ -464,6 +464,8 @@ states:
464
464
  - kind: hitl.confirm
465
465
  options:
466
466
  prompt: "Approve task ${vars.wbs} to proceed to verification?"
467
+ decision:
468
+ mode: never
467
469
 
468
470
  - id: verify
469
471
  description: >
@@ -163,6 +163,8 @@ states:
163
163
  - kind: hitl.confirm
164
164
  options:
165
165
  prompt: "Approve research resolution for task ${vars.wbs}?"
166
+ decision:
167
+ mode: never
166
168
 
167
169
  - id: record
168
170
  description: >
@@ -308,6 +308,8 @@ states:
308
308
  - kind: hitl.confirm
309
309
  options:
310
310
  prompt: "Branch cleanup for the validated task list (.spur/run/${vars.__runId}-wrapup-tasks.json). This is IRREVERSIBLE (merge or delete). Confirm to proceed?"
311
+ decision:
312
+ mode: never
311
313
 
312
314
  - id: done
313
315
  description: >
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.89",
3
+ "version": "0.3.91",
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",
@@ -53,14 +53,14 @@
53
53
  },
54
54
  "devDependencies": {
55
55
  "@commander-js/extra-typings": "^14.0.0",
56
- "@gobing-ai/ts-db": "^0.4.69",
57
- "@gobing-ai/ts-ai-runner": "^0.4.69",
58
- "@gobing-ai/ts-dual-workflow-engine": "^0.4.69",
59
- "@gobing-ai/ts-infra": "^0.4.69",
60
- "@gobing-ai/ts-llm-jsonl-importer": "^0.4.69",
61
- "@gobing-ai/ts-rule-engine": "^0.4.69",
62
- "@gobing-ai/ts-runtime": "^0.4.69",
63
- "@gobing-ai/ts-utils": "^0.4.69",
56
+ "@gobing-ai/ts-db": "^0.5.2",
57
+ "@gobing-ai/ts-ai-runner": "^0.5.2",
58
+ "@gobing-ai/ts-dual-workflow-engine": "^0.5.2",
59
+ "@gobing-ai/ts-infra": "^0.5.2",
60
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.5.2",
61
+ "@gobing-ai/ts-rule-engine": "^0.5.2",
62
+ "@gobing-ai/ts-runtime": "^0.5.2",
63
+ "@gobing-ai/ts-utils": "^0.5.2",
64
64
  "@types/bun": "1.3.14",
65
65
  "@types/figlet": "^1.7.0",
66
66
  "@types/node-notifier": "8.0.5",
@@ -629,6 +629,7 @@ pipeline owns one lifecycle phase:
629
629
  | `idea-pipeline.yaml` | Idea/planning → feature + tasks | `/sp:dev-idea`, `/sp:dev-plan` |
630
630
  | `wrapup-pipeline.yaml` | Post-execution wrap-up | `/sp:dev-wrap`, `/sp:dev-wrapall` |
631
631
  | `wayfinder-resolution.yaml` | Wayfinder ticket resolution loop | `spur workflow run` (free-form) |
632
+ | `decision-routing-example.yaml` | DecisionMaker routing example (never / evidence / omitted modes, defer → operator pause) | `spur workflow run` (authoring sample) |
632
633
 
633
634
  ### Lifecycle operations
634
635
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: expert-spur
3
- description: |
4
- Use PROACTIVELY for "create tasks for this feature", "update all task statuses", "audit task traceability", "create a feature with acceptance criteria", "harden the rule catalog", "author a batch of workflows", "compose a workflow", "tune a rule", "apply accepted doctor proposals", "evaluate spur artifact health", "reflect over history findings", or "expert-spur". Multi-step corpus work across `spur task`, `feature`, `rule`, `workflow`, and agent specs: batch creation, status sweeps, section campaigns, traceability audits, rule hardening, workflow authoring/refactoring, composition and tuning (sp:spur-composer), and evaluation/reflection proposal passes (sp:spur-doctor). For one deterministic operation, run the CLI directly. Recurring evolution loops and multi-agent coordination belong to sp:super-planner — never this agent.
3
+ description: |-
4
+ Use PROACTIVELY for "create tasks for this feature", "update all task statuses", "audit task traceability", or "expert-spur". Runs multi-step corpus campaigns across tasks, features, rules, workflows, and agent specs: creation, status/section updates, audits, and hardening. Uses sp:spur-composer for workflow composition, rule tuning, and accepted proposals; sp:spur-doctor for artifact evaluation and history reflection. Run single operations via CLI; recurring loops and multi-agent coordination belong to sp:super-planner.
5
5
 
6
6
  <example>
7
7
  Context: Batch task status update across a feature.