@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/config.global.yaml +21 -8
- package/config/decisions/executor.yaml +53 -0
- package/config/decisions/task-pipeline.yaml +44 -28
- package/config/pipeline-budgets.json +0 -14
- package/config/workflow-candidates.json +18 -0
- package/config/workflows/feature-lifecycle.yaml +9 -16
- package/config/workflows/idea-pipeline.yaml +158 -740
- package/config/workflows/task-pipeline.yaml +66 -54
- package/config/workflows/wrapup-pipeline.yaml +91 -623
- package/package.json +11 -10
- package/plugins/sp/README.md +9 -5
- package/plugins/sp/agents/expert-spur.md +3 -0
- package/plugins/sp/agents/super-planner.md +5 -1
- package/plugins/sp/agents/super-reviewer.md +43 -12
- package/plugins/sp/commands/dev-fixall.md +7 -2
- package/plugins/sp/commands/dev-idea.md +15 -6
- package/plugins/sp/commands/dev-plan.md +1 -1
- package/plugins/sp/commands/dev-pr-review.md +6 -6
- package/plugins/sp/commands/dev-run.md +3 -0
- package/plugins/sp/commands/dev-runall.md +6 -3
- package/plugins/sp/commands/dev-verify.md +1 -1
- package/plugins/sp/commands/dev-wrap.md +1 -1
- package/plugins/sp/commands/dev-wrapall.md +4 -4
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/skills/code-implementation/SKILL.md +8 -8
- package/plugins/sp/skills/code-improvement/SKILL.md +3 -3
- package/plugins/sp/skills/code-review/references/verification-before-completion.md +5 -4
- package/plugins/sp/skills/code-verification/SKILL.md +4 -4
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +27 -11
- package/plugins/sp/skills/functional-review/SKILL.md +1 -1
- package/plugins/sp/skills/functional-review/references/verdict-schema.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
- package/plugins/sp/skills/pr-reviewing/SKILL.md +36 -18
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +2 -1
- package/plugins/sp/skills/spur-check/SKILL.md +1 -1
- package/plugins/sp/skills/spur-cli/SKILL.md +23 -2
- package/plugins/sp/skills/spur-cli/references/agent.md +12 -0
- package/plugins/sp/skills/spur-cli/references/builder.md +2 -2
- package/plugins/sp/skills/spur-cli/references/decision/lifecycle.md +166 -0
- package/plugins/sp/skills/spur-cli/references/decision.md +146 -16
- package/plugins/sp/skills/spur-cli/references/features.md +19 -0
- package/plugins/sp/skills/spur-cli/references/rules.md +2 -0
- package/plugins/sp/skills/spur-cli/references/tasks.md +14 -1
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +3 -2
- package/plugins/sp/skills/spur-cli/references/workflows.md +9 -0
- package/plugins/sp/skills/spur-composer/SKILL.md +20 -1
- package/plugins/sp/skills/spur-dev/SKILL.md +16 -16
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +2 -1
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +2 -2
- package/plugins/sp/skills/spur-dev/references/decision-points.md +97 -0
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +18 -18
- package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +1 -1
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +19 -10
- package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +4 -4
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +41 -29
- package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +34 -2
- package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +4 -4
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +3 -3
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +3 -2
- package/plugins/sp/skills/spur-dev/references/glossary.md +12 -3
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +7 -6
- package/plugins/sp/skills/spur-doctor/SKILL.md +23 -0
- package/plugins/sp/skills/wayfinder/SKILL.md +11 -1
- package/spur.js +25617 -24290
- package/web/_astro/{BoardApp.Bjdp3XWV.js → BoardApp.CC7Mwswv.js} +65 -65
- package/web/_astro/{BoardApp.DCDZxLlQ.js → BoardApp.mWyrWCAR.js} +1 -1
- package/web/_astro/{TaskDetail.B3vBxynO.js → TaskDetail.CtAXuiv8.js} +1 -1
- package/web/_astro/{arc.DcuHTB_T.js → arc.Duf4u60i.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.ClOFWBON.js → architectureDiagram-3BPJPVTR.JoymtqxN.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.otYyr7Zb.js → blockDiagram-GPEHLZMM.BvmhcioC.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.BCjpc9LP.js → c4Diagram-AAUBKEIU.CfaWkgoQ.js} +1 -1
- package/web/_astro/channel.DtEPXXcH.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.D5Wpnpt_.js → chunk-2J33WTMH.B7uR02cD.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.DkQGtWNz.js → chunk-4BX2VUAB.SwiEauYR.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.B7dqjAip.js → chunk-55IACEB6.6ZRCK8PO.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.BDQvnKE2.js → chunk-727SXJPM.Cxra_G3N.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.D92doBX5.js → chunk-AQP2D5EJ.Cxd7gZeX.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.C968oI5G.js → chunk-FMBD7UC4.DCLhFkVc.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.AkkYC1bY.js → chunk-ND2GUHAM.B9AmKcv6.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.sCc-rKKo.js → chunk-QZHKN3VN.DOjCvl6S.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.pOQ9u0mY.js → classDiagram-4FO5ZUOK.BMiT_mNf.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.pOQ9u0mY.js → classDiagram-v2-Q7XG4LA2.BMiT_mNf.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CRaeD6FY.js → cose-bilkent-S5V4N54A.mLBCEGjI.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.BiCPBu54.js → cynefin-OW5HDTMX.CjDAY0qn.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.C1-q3vkT.js → dagre-BM42HDAG._G_sP8fP.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.BSVOv30O.js → diagram-2AECGRRQ.39OcfSuz.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.CHMkjJ-V.js → diagram-5GNKFQAL.D7v_eNC4.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.CKY9M564.js → diagram-KO2AKTUF.Da1x-lhg.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.B9yNJiTP.js → diagram-LMA3HP47.C8EnzbEb.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.Dk8AUGsk.js → diagram-OG6HWLK6.DPnBj69F.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.BQHR89TZ.js → erDiagram-TEJ5UH35.CXMu2TIh.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.oNkWVgoK.js → flowDiagram-I6XJVG4X.ZklePVtQ.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.Kz2U2nu9.js → ganttDiagram-6RSMTGT7.BhYOkdqk.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.DHIZ_wPq.js → gitGraphDiagram-PVQCEYII.CADyX8a1.js} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.D0NJLcv9.js → infoDiagram-5YYISTIA.BsdmwjHt.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.CFEfTWRG.js → ishikawaDiagram-YF4QCWOH.CzjZ3Crd.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.Dc7IE7I4.js → journeyDiagram-JHISSGLW.Bxj-ZH_t.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.D5v0xO9k.js → kanban-definition-UN3LZRKU.Cbg3wVvX.js} +1 -1
- package/web/_astro/{linear.wR5KzXnE.js → linear.DJNUrBI9.js} +1 -1
- package/web/_astro/{mermaid.core.BDQ2FoPd.js → mermaid.core.DVHQV3SF.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.W6_INsia.js → mindmap-definition-RKZ34NQL.DyomosRU.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.61ihbgkK.js → pieDiagram-4H26LBE5.DajtFknN.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.B5lEpFLo.js → quadrantDiagram-W4KKPZXB.Bjq6SjGe.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.CmhVBVX0.js → requirementDiagram-4Y6WPE33.ubBVqGLP.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.D7Vvj9Wf.js → sankeyDiagram-5OEKKPKP.I4q46xd-.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.B1vPLixM.js → sequenceDiagram-3UESZ5HK.DsCgZIa8.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.BnACmrGi.js → stateDiagram-AJRCARHV.DcYjYSqT.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.CW4pnmc3.js → stateDiagram-v2-BHNVJYJU.Dt8yPqiS.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.CkzMCPnC.js → timeline-definition-PNZ67QCA.0YTkoa5F.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.CY4aNdAR.js → vennDiagram-CIIHVFJN.BNl0l1hs.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.BtoU9UFk.js → wardleyDiagram-YWT4CUSO.BYSX6cfn.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6._9ijUUAs.js → xychartDiagram-2RQKCTM6.DzxxpixK.js} +1 -1
- package/web/index.html +1 -1
- package/worker/laya_worker.py +219 -0
- package/config/workflows/feature-verification.yaml +0 -98
- package/config/workflows/pr-review.yaml +0 -209
- package/config/workflows/wayfinder-resolution.yaml +0 -302
- package/plugins/sp/skills/wayfinder/references/pipeline-resolution.md +0 -30
- package/web/_astro/channel.qgOLXjI_.js +0 -1
|
@@ -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.
|
|
159
|
-
#
|
|
160
|
-
#
|
|
161
|
-
#
|
|
162
|
-
#
|
|
163
|
-
#
|
|
164
|
-
#
|
|
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-
|
|
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
|
|
2
|
+
# Decision catalogs for the task pipeline (feature P1, ADR-134).
|
|
3
3
|
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
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-
|
|
21
|
-
type:
|
|
22
|
-
description:
|
|
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
|
|
37
|
+
description: Task WBS whose change set is being classified.
|
|
27
38
|
criteria:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
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
|
-
|
|
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
|