@gobing-ai/spur 0.4.14 → 0.4.16

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 (121) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.global.yaml +21 -8
  3. package/config/decisions/executor.yaml +53 -0
  4. package/config/decisions/task-pipeline.yaml +44 -28
  5. package/config/pipeline-budgets.json +0 -14
  6. package/config/workflow-candidates.json +18 -0
  7. package/config/workflows/feature-lifecycle.yaml +9 -16
  8. package/config/workflows/idea-pipeline.yaml +158 -740
  9. package/config/workflows/task-pipeline.yaml +66 -54
  10. package/config/workflows/wrapup-pipeline.yaml +91 -623
  11. package/package.json +11 -10
  12. package/plugins/sp/README.md +9 -5
  13. package/plugins/sp/agents/expert-spur.md +3 -0
  14. package/plugins/sp/agents/super-planner.md +5 -1
  15. package/plugins/sp/agents/super-reviewer.md +43 -12
  16. package/plugins/sp/commands/dev-fixall.md +7 -2
  17. package/plugins/sp/commands/dev-idea.md +15 -6
  18. package/plugins/sp/commands/dev-plan.md +1 -1
  19. package/plugins/sp/commands/dev-pr-review.md +6 -6
  20. package/plugins/sp/commands/dev-run.md +3 -0
  21. package/plugins/sp/commands/dev-runall.md +6 -3
  22. package/plugins/sp/commands/dev-verify.md +1 -1
  23. package/plugins/sp/commands/dev-wrap.md +1 -1
  24. package/plugins/sp/commands/dev-wrapall.md +4 -4
  25. package/plugins/sp/plugin.json +1 -1
  26. package/plugins/sp/skills/code-implementation/SKILL.md +8 -8
  27. package/plugins/sp/skills/code-improvement/SKILL.md +3 -3
  28. package/plugins/sp/skills/code-review/references/verification-before-completion.md +5 -4
  29. package/plugins/sp/skills/code-verification/SKILL.md +4 -4
  30. package/plugins/sp/skills/code-verification/references/verdict-schema.md +27 -11
  31. package/plugins/sp/skills/functional-review/SKILL.md +1 -1
  32. package/plugins/sp/skills/functional-review/references/verdict-schema.md +1 -1
  33. package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
  34. package/plugins/sp/skills/pr-reviewing/SKILL.md +36 -18
  35. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +2 -1
  36. package/plugins/sp/skills/spur-check/SKILL.md +1 -1
  37. package/plugins/sp/skills/spur-cli/SKILL.md +23 -2
  38. package/plugins/sp/skills/spur-cli/references/agent.md +12 -0
  39. package/plugins/sp/skills/spur-cli/references/builder.md +2 -2
  40. package/plugins/sp/skills/spur-cli/references/decision/lifecycle.md +166 -0
  41. package/plugins/sp/skills/spur-cli/references/decision.md +146 -16
  42. package/plugins/sp/skills/spur-cli/references/features.md +19 -0
  43. package/plugins/sp/skills/spur-cli/references/rules.md +2 -0
  44. package/plugins/sp/skills/spur-cli/references/tasks.md +14 -1
  45. package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +1 -1
  46. package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +3 -2
  47. package/plugins/sp/skills/spur-cli/references/workflows.md +9 -0
  48. package/plugins/sp/skills/spur-composer/SKILL.md +20 -1
  49. package/plugins/sp/skills/spur-dev/SKILL.md +16 -16
  50. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +2 -1
  51. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +2 -2
  52. package/plugins/sp/skills/spur-dev/references/decision-points.md +97 -0
  53. package/plugins/sp/skills/spur-dev/references/dev-operations.md +18 -18
  54. package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +1 -1
  55. package/plugins/sp/skills/spur-dev/references/execution-batch.md +19 -10
  56. package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +4 -4
  57. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +41 -29
  58. package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +34 -2
  59. package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +4 -4
  60. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +3 -3
  61. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +3 -2
  62. package/plugins/sp/skills/spur-dev/references/glossary.md +12 -3
  63. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +7 -6
  64. package/plugins/sp/skills/spur-doctor/SKILL.md +23 -0
  65. package/plugins/sp/skills/wayfinder/SKILL.md +11 -1
  66. package/spur.js +25617 -24290
  67. package/web/_astro/{BoardApp.Bjdp3XWV.js → BoardApp.CC7Mwswv.js} +65 -65
  68. package/web/_astro/{BoardApp.DCDZxLlQ.js → BoardApp.mWyrWCAR.js} +1 -1
  69. package/web/_astro/{TaskDetail.B3vBxynO.js → TaskDetail.CtAXuiv8.js} +1 -1
  70. package/web/_astro/{arc.DcuHTB_T.js → arc.Duf4u60i.js} +1 -1
  71. package/web/_astro/{architectureDiagram-3BPJPVTR.ClOFWBON.js → architectureDiagram-3BPJPVTR.JoymtqxN.js} +1 -1
  72. package/web/_astro/{blockDiagram-GPEHLZMM.otYyr7Zb.js → blockDiagram-GPEHLZMM.BvmhcioC.js} +1 -1
  73. package/web/_astro/{c4Diagram-AAUBKEIU.BCjpc9LP.js → c4Diagram-AAUBKEIU.CfaWkgoQ.js} +1 -1
  74. package/web/_astro/channel.DtEPXXcH.js +1 -0
  75. package/web/_astro/{chunk-2J33WTMH.D5Wpnpt_.js → chunk-2J33WTMH.B7uR02cD.js} +1 -1
  76. package/web/_astro/{chunk-4BX2VUAB.DkQGtWNz.js → chunk-4BX2VUAB.SwiEauYR.js} +1 -1
  77. package/web/_astro/{chunk-55IACEB6.B7dqjAip.js → chunk-55IACEB6.6ZRCK8PO.js} +1 -1
  78. package/web/_astro/{chunk-727SXJPM.BDQvnKE2.js → chunk-727SXJPM.Cxra_G3N.js} +1 -1
  79. package/web/_astro/{chunk-AQP2D5EJ.D92doBX5.js → chunk-AQP2D5EJ.Cxd7gZeX.js} +1 -1
  80. package/web/_astro/{chunk-FMBD7UC4.C968oI5G.js → chunk-FMBD7UC4.DCLhFkVc.js} +1 -1
  81. package/web/_astro/{chunk-ND2GUHAM.AkkYC1bY.js → chunk-ND2GUHAM.B9AmKcv6.js} +1 -1
  82. package/web/_astro/{chunk-QZHKN3VN.sCc-rKKo.js → chunk-QZHKN3VN.DOjCvl6S.js} +1 -1
  83. package/web/_astro/{classDiagram-4FO5ZUOK.pOQ9u0mY.js → classDiagram-4FO5ZUOK.BMiT_mNf.js} +1 -1
  84. package/web/_astro/{classDiagram-v2-Q7XG4LA2.pOQ9u0mY.js → classDiagram-v2-Q7XG4LA2.BMiT_mNf.js} +1 -1
  85. package/web/_astro/{cose-bilkent-S5V4N54A.CRaeD6FY.js → cose-bilkent-S5V4N54A.mLBCEGjI.js} +1 -1
  86. package/web/_astro/{cynefin-OW5HDTMX.BiCPBu54.js → cynefin-OW5HDTMX.CjDAY0qn.js} +1 -1
  87. package/web/_astro/{dagre-BM42HDAG.C1-q3vkT.js → dagre-BM42HDAG._G_sP8fP.js} +1 -1
  88. package/web/_astro/{diagram-2AECGRRQ.BSVOv30O.js → diagram-2AECGRRQ.39OcfSuz.js} +1 -1
  89. package/web/_astro/{diagram-5GNKFQAL.CHMkjJ-V.js → diagram-5GNKFQAL.D7v_eNC4.js} +1 -1
  90. package/web/_astro/{diagram-KO2AKTUF.CKY9M564.js → diagram-KO2AKTUF.Da1x-lhg.js} +1 -1
  91. package/web/_astro/{diagram-LMA3HP47.B9yNJiTP.js → diagram-LMA3HP47.C8EnzbEb.js} +1 -1
  92. package/web/_astro/{diagram-OG6HWLK6.Dk8AUGsk.js → diagram-OG6HWLK6.DPnBj69F.js} +1 -1
  93. package/web/_astro/{erDiagram-TEJ5UH35.BQHR89TZ.js → erDiagram-TEJ5UH35.CXMu2TIh.js} +1 -1
  94. package/web/_astro/{flowDiagram-I6XJVG4X.oNkWVgoK.js → flowDiagram-I6XJVG4X.ZklePVtQ.js} +1 -1
  95. package/web/_astro/{ganttDiagram-6RSMTGT7.Kz2U2nu9.js → ganttDiagram-6RSMTGT7.BhYOkdqk.js} +1 -1
  96. package/web/_astro/{gitGraphDiagram-PVQCEYII.DHIZ_wPq.js → gitGraphDiagram-PVQCEYII.CADyX8a1.js} +1 -1
  97. package/web/_astro/{infoDiagram-5YYISTIA.D0NJLcv9.js → infoDiagram-5YYISTIA.BsdmwjHt.js} +1 -1
  98. package/web/_astro/{ishikawaDiagram-YF4QCWOH.CFEfTWRG.js → ishikawaDiagram-YF4QCWOH.CzjZ3Crd.js} +1 -1
  99. package/web/_astro/{journeyDiagram-JHISSGLW.Dc7IE7I4.js → journeyDiagram-JHISSGLW.Bxj-ZH_t.js} +1 -1
  100. package/web/_astro/{kanban-definition-UN3LZRKU.D5v0xO9k.js → kanban-definition-UN3LZRKU.Cbg3wVvX.js} +1 -1
  101. package/web/_astro/{linear.wR5KzXnE.js → linear.DJNUrBI9.js} +1 -1
  102. package/web/_astro/{mermaid.core.BDQ2FoPd.js → mermaid.core.DVHQV3SF.js} +4 -4
  103. package/web/_astro/{mindmap-definition-RKZ34NQL.W6_INsia.js → mindmap-definition-RKZ34NQL.DyomosRU.js} +1 -1
  104. package/web/_astro/{pieDiagram-4H26LBE5.61ihbgkK.js → pieDiagram-4H26LBE5.DajtFknN.js} +1 -1
  105. package/web/_astro/{quadrantDiagram-W4KKPZXB.B5lEpFLo.js → quadrantDiagram-W4KKPZXB.Bjq6SjGe.js} +1 -1
  106. package/web/_astro/{requirementDiagram-4Y6WPE33.CmhVBVX0.js → requirementDiagram-4Y6WPE33.ubBVqGLP.js} +1 -1
  107. package/web/_astro/{sankeyDiagram-5OEKKPKP.D7Vvj9Wf.js → sankeyDiagram-5OEKKPKP.I4q46xd-.js} +1 -1
  108. package/web/_astro/{sequenceDiagram-3UESZ5HK.B1vPLixM.js → sequenceDiagram-3UESZ5HK.DsCgZIa8.js} +1 -1
  109. package/web/_astro/{stateDiagram-AJRCARHV.BnACmrGi.js → stateDiagram-AJRCARHV.DcYjYSqT.js} +1 -1
  110. package/web/_astro/{stateDiagram-v2-BHNVJYJU.CW4pnmc3.js → stateDiagram-v2-BHNVJYJU.Dt8yPqiS.js} +1 -1
  111. package/web/_astro/{timeline-definition-PNZ67QCA.CkzMCPnC.js → timeline-definition-PNZ67QCA.0YTkoa5F.js} +1 -1
  112. package/web/_astro/{vennDiagram-CIIHVFJN.CY4aNdAR.js → vennDiagram-CIIHVFJN.BNl0l1hs.js} +1 -1
  113. package/web/_astro/{wardleyDiagram-YWT4CUSO.BtoU9UFk.js → wardleyDiagram-YWT4CUSO.BYSX6cfn.js} +1 -1
  114. package/web/_astro/{xychartDiagram-2RQKCTM6._9ijUUAs.js → xychartDiagram-2RQKCTM6.DzxxpixK.js} +1 -1
  115. package/web/index.html +1 -1
  116. package/worker/laya_worker.py +219 -0
  117. package/config/workflows/feature-verification.yaml +0 -98
  118. package/config/workflows/pr-review.yaml +0 -209
  119. package/config/workflows/wayfinder-resolution.yaml +0 -302
  120. package/plugins/sp/skills/wayfinder/references/pipeline-resolution.md +0 -30
  121. package/web/_astro/channel.qgOLXjI_.js +0 -1
@@ -7,7 +7,7 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sp",
10
- "version": "0.4.14",
10
+ "version": "0.4.16",
11
11
  "source": "./plugins/sp"
12
12
  }
13
13
  ]
@@ -155,15 +155,28 @@ workflows:
155
155
  # catalogs. `paths` registers extra catalog folders (absolute or
156
156
  # project-relative); the first layer wins per file basename (ADR-113 style).
157
157
  # `maker` selects the default DecisionMaker for every decision point, and
158
- # `makers` overrides it per decision id. Built-in makers: typesafe, fm-local,
159
- # laya-local (laya-local needs Apple Silicon) and clef (hosted Cloudflare
160
- # Workers AI, registered only when CLOUDFLARE_ACCOUNT_ID and
161
- # CLOUDFLARE_AUTH_TOKEN are both set). An unregistered name is a config error,
162
- # never a silent fallback. Inspect the effective choice with
163
- # `spur decision status`. `init` never overwrites this file — until you add the
164
- # keys, the shipped catalog's maker applies (see `status`).
158
+ # `makers` overrides it per decision id. The value is any maker name the
159
+ # registry currently registers — the list lives in the CLI, not here, so
160
+ # `spur decision status` (registeredMakers) is the authority, together with each
161
+ # maker's own prerequisites (a local maker needs its local stack; a hosted maker
162
+ # registers only when its credentials are set). An unregistered name is a config
163
+ # error, never a silent fallback. Inspect the effective choice per decision with
164
+ # the same command. `init` never overwrites this file — until you add the keys,
165
+ # the shipped catalog's maker applies (see `status`).
165
166
  decisions:
166
167
  paths: []
167
168
  maker: typesafe
168
169
  # makers:
169
- # task-triage: laya-local
170
+ # task-semantic-risk: laya-local
171
+ # What "the decision was right" means (task 1263 R5): per decision id, the recorded outcomes
172
+ # that count as correct for each served value. `String(value)` keys, so a yes/no decision uses
173
+ # "true"/"false". The outcome verb records them (`spur decision outcome <invocation-id> ...`);
174
+ # `spur decision status --reliability` scores accuracy against this map and reports null for a
175
+ # decision with no entry, rather than guessing.
176
+ outcomeMap:
177
+ failure-class:
178
+ fix: [fixed]
179
+ stop: [not-fixed]
180
+ task-semantic-risk:
181
+ "false": [none, p4, p3]
182
+ "true": [p1, p2]
@@ -0,0 +1,53 @@
1
+ $schema: "@gobing-ai/spur/schemas/decision-catalog.schema.json"
2
+ # Executor-failure rescue catalog (feature P1, task 1264).
3
+ #
4
+ # The executor loop escalates on `FAILURE_RULES` matches only (0407 precision bias). Anything the
5
+ # rules miss — a reworded rate limit, "credits depleted", a proxy error body — ends the run as a
6
+ # task defect. This decision classifies ONLY that residue, after the rules and the terminal checks
7
+ # (timeout, permission denial, confirmed quota) have had their say, and only while
8
+ # `workflows.executorFailureDecisionMaker` is on. It ships off by default: shipping off routes
9
+ # nothing, and turning it on is an operator call backed by replay evidence in task 1264's Q&A.
10
+ #
11
+ # Resolution: shared layer, overridable per basename through `.spur/decisions/` or
12
+ # `decisions.paths` (first layer wins, ADR-113 style).
13
+ version: 1
14
+
15
+ defaults:
16
+ # Higher than the catalog floor: a false `resource-exhaustion` costs a failover attempt, and a
17
+ # false `task-defect` equals today's behaviour — so the uncertainty must resolve downward.
18
+ minConfidence: 0.85
19
+
20
+ decisions:
21
+ executor-failure-class:
22
+ type: choice
23
+ description: Is an unmatched agent-dispatch failure resource exhaustion, an auth failure, or a task defect?
24
+ instructions: |
25
+ You are classifying why one agent dispatch exited non-zero, after every deterministic
26
+ rule already declined to classify it.
27
+ Failure output: ${params.instructions}
28
+ Answer `resource-exhaustion` only when the output states a provider-side capacity or
29
+ billing limit: a quota/credit/billing message, a 429 or rate-limit body, a token or
30
+ request budget, or an "overloaded"/"capacity" error. Answer `auth` only when the
31
+ output states a credential or authorization fault: an invalid/expired key or token, a
32
+ 401/403 body, or a missing credential for the provider. Answer `task-defect` for
33
+ everything else: a compile or test failure, a missing file, a malformed prompt, a
34
+ socket/proxy error, or output that does not name a provider limit at all.
35
+ Classify only what the output says. Do not infer a vendor, and do not guess.
36
+ parameters:
37
+ wbs:
38
+ type: string
39
+ description: Task WBS the failing dispatch belongs to, when known.
40
+ # Optional: the executor seam knows only the run id, and a required param would
41
+ # reject every rescue before it reached a maker.
42
+ default: ""
43
+ criteria:
44
+ resource-exhaustion: >
45
+ The output names a provider-side limit — quota, credits, billing period, rate
46
+ limit, 429, token budget, or capacity.
47
+ auth: >
48
+ The output names a credential or authorization fault — invalid or expired key or
49
+ token, 401/403, or a missing credential.
50
+ task-defect: >
51
+ The output names no provider limit or credential fault — a code/test/file error, a
52
+ prompt problem, or a transport error that is not a provider quota.
53
+ fallback: task-defect
@@ -1,11 +1,11 @@
1
1
  $schema: "@gobing-ai/spur/schemas/decision-catalog.schema.json"
2
- # Decision catalogs for the task pipeline (feature P / task 1092, ADR-134).
2
+ # Decision catalogs for the task pipeline (feature P1, ADR-134).
3
3
  #
4
- # These entries mirror the inline decide actions that ship in
5
- # config/workflows/task-pipeline.yaml today — same questions, choices and
6
- # fallbacks — so their reliability can be measured with `spur decision run`
7
- # before feature P1 migrates the workflow actions onto them (design §3.5).
8
- # No workflow references this catalog yet.
4
+ # The shipped `config/workflows/task-pipeline.yaml` decide actions reference these ids
5
+ # (`failure-class`, and `task-semantic-risk` once its evidence bar is met). Each entry's
6
+ # reliability is measured from recorded `decision.*` events — `spur decision status
7
+ # --reliability` — and an adoption slice only keeps a decision point while that evidence
8
+ # shows it adds information the deterministic guards do not.
9
9
  #
10
10
  # Resolution: this file ships in the shared layer (the installed package's
11
11
  # config/decisions/). A project can override it per basename through
@@ -17,39 +17,55 @@ defaults:
17
17
  minConfidence: 0.8
18
18
 
19
19
  decisions:
20
- task-triage:
21
- type: choice
22
- description: Which verification lane does a green-gate diff deserve?
20
+ task-semantic-risk:
21
+ type: noul
22
+ description: >
23
+ Does this task's change set change behaviour a reviewer must reason about beyond what
24
+ the diffstat already shows? (false projects the fast lane, true or a fallback the
25
+ standard lane.)
26
+ instructions: |
27
+ You are classifying one Spur task's change set for review depth.
28
+ Change set: ${params.instructions}
29
+ Answer true when the change alters behaviour a reviewer must reason about: control
30
+ flow, a data shape, persistence, security, an external contract, or error handling.
31
+ Answer false only when the change is mechanical — docs, comments, formatting, renames,
32
+ test-only edits, or a dependency bump with no source edit.
33
+ Judge the change set only; do not score its quality or estimate its size.
23
34
  parameters:
24
35
  wbs:
25
36
  type: string
26
- description: Task WBS the diff belongs to.
37
+ description: Task WBS whose change set is being classified.
27
38
  criteria:
28
- low: Small, contained diff — the fast lane is enough.
29
- standard: Ordinary diff — the standard verification lane applies.
30
- high: Broad or risky diff — verify with high caution.
31
- fallback: standard
39
+ "true": >
40
+ The change set touches executable behaviour — a branch, a boundary, a stored
41
+ schema, a public signature, or a failure path — so a reviewer must read the diff,
42
+ not only its diffstat.
43
+ "false": >
44
+ The change set is mechanical — docs, comments, formatting, renames, test-only
45
+ edits, or a version bump with no executable change — so the diffstat is enough.
46
+ fallback: true
32
47
 
33
48
  failure-class:
34
49
  type: choice
35
50
  description: Is a failed quality gate fixable by the repair agent, or should the run stop?
51
+ instructions: |
52
+ You are classifying one failed quality-gate run for Spur's task pipeline.
53
+ Gate output: ${params.instructions}
54
+ Answer `fix` when the output names a concrete defect inside this repository that the
55
+ repair agent can act on: a failing test with an expected/actual diff, a type error
56
+ naming a file and symbol, a lint rule id with a file:line, or a missing export or
57
+ import. Answer `stop` when the failure is environmental or not repairable by editing
58
+ this tree: a missing tool or binary, a permission or disk error, a network or registry
59
+ failure, a gate timeout, or output that names no in-tree file.
36
60
  parameters:
37
61
  wbs:
38
62
  type: string
39
63
  description: Task WBS whose gate failed.
40
64
  criteria:
41
- fix: The failure looks fixable — send it to the repair agent.
42
- stop: The failure is not mechanically fixable — stop the run for the operator.
43
- fallback: fix
44
-
45
- review-failure-class:
46
- type: choice
47
- description: Is a non-PASS review fixable by the repair agent, or should the run stop?
48
- parameters:
49
- wbs:
50
- type: string
51
- description: Task WBS whose review did not certify PASS.
52
- criteria:
53
- fix: The findings look fixable — send them to the repair agent.
54
- stop: The findings are not mechanically fixable — stop the run for the operator.
65
+ fix: >
66
+ The output names an in-tree defect — a failing test, a type error with a file and
67
+ symbol, a lint rule id with a file:line, or a missing import.
68
+ stop: >
69
+ The output names no in-tree defect — a missing tool, a permission or disk error,
70
+ a network or registry failure, or a timeout — so editing the tree cannot fix it.
55
71
  fallback: fix
@@ -28,26 +28,12 @@
28
28
  "source": "Post-merge count (0607 R2: doc-sync + learning-capture consolidated, 2 -> 1). Real-run reading (R5): median 253s, max-sane 2319s (n=44). Budget = 60 min ceiling.",
29
29
  "decision": null
30
30
  },
31
- "pr-review": {
32
- "modelQueries": 0,
33
- "wallClockMs": null,
34
- "tokenCostUsd": null,
35
- "source": "Zero-query pipeline (the live definition declares no model queries); query budget trivially 0 — the gate handles an empty list (0607 R3). No real full run recorded; wall-clock unenforced.",
36
- "decision": null
37
- },
38
31
  "history-anatomy": {
39
32
  "modelQueries": 3,
40
33
  "wallClockMs": null,
41
34
  "tokenCostUsd": null,
42
35
  "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. 0920 recount 2026-09-23: 4 -> 3 — the resolve-scope model hop was removed; scope/window validation is deterministic in the `spur history anatomy paths` op (history-anatomy-cache before script-absorption PR-6).",
43
36
  "decision": null
44
- },
45
- "wayfinder-resolution": {
46
- "modelQueries": 2,
47
- "wallClockMs": null,
48
- "tokenCostUsd": null,
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
- "decision": null
51
37
  }
52
38
  }
53
39
  }
@@ -68,6 +68,24 @@
68
68
  }
69
69
  ],
70
70
  "retirements": [
71
+ {
72
+ "name": "feature-verification",
73
+ "recordedBy": "1246/1252 (D66, ADR-142)",
74
+ "date": "2026-10-18",
75
+ "rationale": "The wrapper was retired by the D66 consolidation decision; feature-lifecycle's verifying entry calls spur feature verify directly. Existing run history is retained."
76
+ },
77
+ {
78
+ "name": "pr-review",
79
+ "recordedBy": "1251/1252 (D66, ADR-142)",
80
+ "date": "2026-10-18",
81
+ "rationale": "The sequencing workflow was retired by the D66 consolidation decision; the PR review skill calls the flat spur builder pr-* verbs directly. Existing run history is retained."
82
+ },
83
+ {
84
+ "name": "wayfinder-resolution",
85
+ "recordedBy": "1251/1252 (D66, ADR-142)",
86
+ "date": "2026-10-18",
87
+ "rationale": "The workflow was retired by the D66 consolidation decision; investigation remains a wayfinder skill procedure. Existing run history is retained."
88
+ },
71
89
  {
72
90
  "name": "planning-pipeline",
73
91
  "recordedBy": "0872 (ADR-072/075 composition-baseline pass 2dc86579a)",
@@ -40,24 +40,17 @@ states:
40
40
  onEnter:
41
41
  # Caller wiring (task 0880, ADR-119): entering verification RUNS the
42
42
  # feature-scoped pass instead of only passively reading its status file.
43
- # 0948 R1: pass BOTH vars the inner workflow needs. `--vars` was documented as
44
- # replace-not-merge and a partial override silently blanked `spurBin`; the engine
45
- # merges declared defaults today (0948 R2), but the caller stays explicit so the
46
- # nested run is self-sufficient under either semantic.
43
+ # 1246 R1: the pass is the verb itself — no nested `spur workflow run`, no
44
+ # recursion-marker clearing. Without `--run-id` the verb opens and finalizes
45
+ # its own run row bound to this definition (1246 R2), so the done gate's
46
+ # receipt-integrity rule (recording run terminal `done`) holds.
47
+ # `env -u __runId`: the verb's `--run-id` falls back to the `__runId` env name, and a hop
48
+ # driven from inside another workflow run (a pipeline step, the quality gate) inherits that
49
+ # run's id. Without the unset the pass silently binds its receipt to the OUTER run instead of
50
+ # opening its own — which is still `running` at verifying→done, so the done gate fails closed.
47
51
  - kind: shell
48
52
  options:
49
- # Pass featureId and spurBin together. A partial --vars map used to be
50
- # applied as a replacement, so the inner run lost spurBin and loadModule
51
- # fell into source mode (0948 R1). The nested JSON is shell-expanded:
52
- # $spurBin inside the double quotes keeps a multi-word invocation intact.
53
- # 1147 R4: clear the inherited nested-run marker for this ONE child. The
54
- # bounded, definition-pinned feature-verification pass (no agent.run, no
55
- # further nested run) is a legitimate child, but the outer run's
56
- # SPUR_WORKFLOW_RUN_ACTIVE marker rides every child env — so the CLI's
57
- # nested-run refusal (0610 R4) rejected it and the same pass that passes
58
- # standalone failed here with a bare exit 1. The recursion guard stays
59
- # binding for every other nested invocation.
60
- command: 'env -u SPUR_WORKFLOW_RUN_ACTIVE $spurBin workflow run feature-verification.yaml --vars "{\"featureId\":\"$featureId\",\"spurBin\":\"$spurBin\"}"'
53
+ command: 'env -u __runId $spurBin feature verify $featureId --no-logo'
61
54
  - id: blocked
62
55
  description: Impediment; work suspended.
63
56
  - id: done