@gobing-ai/spur 0.4.0 → 0.4.2
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 +4 -2
- package/config/decisions/gates.yaml +36 -0
- package/config/decisions/history-anatomy.yaml +35 -0
- package/config/decisions/idea-pipeline.yaml +38 -0
- package/config/plugin-scripts.json +15 -0
- package/config/rules/docs/sourced-api-claims.yaml +60 -0
- package/config/rules/recommended-pre-check.yaml +8 -3
- package/config/rules/structure/scratch-evidence-pointer.yaml +35 -0
- package/config/script-placement-baseline.json +2 -2
- package/config/templates/AGENTS.md +1 -1
- package/config/workflows/feature-lifecycle.yaml +9 -2
- package/config/workflows/history-anatomy.yaml +22 -0
- package/config/workflows/idea-pipeline.yaml +75 -0
- package/config/workflows/task-pipeline.yaml +216 -57
- package/config/workflows/wrapup-pipeline.yaml +107 -14
- package/package.json +10 -10
- package/plugins/sp/README.md +12 -3
- package/plugins/sp/agents/super-planner.md +16 -6
- package/plugins/sp/agents/super-reviewer.md +14 -0
- package/plugins/sp/bunfig.toml +8 -0
- package/plugins/sp/commands/dev-brainstorm.md +29 -16
- package/plugins/sp/commands/dev-find-way.md +80 -0
- package/plugins/sp/commands/dev-idea.md +6 -0
- package/plugins/sp/commands/dev-plan.md +6 -0
- package/plugins/sp/commands/dev-review-session.md +4 -1
- package/plugins/sp/commands/dev-run.md +12 -2
- package/plugins/sp/commands/dev-runall.md +32 -15
- package/plugins/sp/hooks/context-owner.ts +56 -0
- package/plugins/sp/hooks/context-post-tool.ts +23 -0
- package/plugins/sp/hooks/context-session-start.ts +49 -27
- package/plugins/sp/hooks/context-session-stop.ts +131 -30
- package/plugins/sp/hooks/pi/guard-extension.ts +21 -8
- package/plugins/sp/lib/idea-handoff.generated.mjs +43 -5
- package/plugins/sp/lib/inline-run-app.ts +28 -0
- package/plugins/sp/lib/inline-run.generated.d.mts +5 -0
- package/plugins/sp/lib/inline-run.generated.mjs +351 -46
- package/plugins/sp/lib/plan-projection.generated.d.mts +47 -0
- package/plugins/sp/lib/plan-projection.generated.mjs +368 -0
- package/plugins/sp/lib/quality-gate.generated.d.mts +35 -1
- package/plugins/sp/lib/quality-gate.generated.mjs +30296 -71
- package/plugins/sp/lib/residual-scan.generated.d.mts +19 -0
- package/plugins/sp/lib/residual-scan.generated.mjs +66 -0
- package/plugins/sp/lib/run-summary-core.ts +561 -0
- package/plugins/sp/lib/transcript.ts +150 -7
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +1 -1
- package/plugins/sp/scripts/batch-plan.mjs +488 -0
- package/plugins/sp/scripts/batch-plan.ts +145 -0
- package/plugins/sp/scripts/batch-preflight.mjs +51 -3
- package/plugins/sp/scripts/batch-preflight.ts +72 -1
- package/plugins/sp/scripts/commit-guard.mjs +216 -0
- package/plugins/sp/scripts/commit-guard.ts +249 -0
- package/plugins/sp/scripts/inline-run-dispatch.mjs +130 -0
- package/plugins/sp/scripts/inline-run-dispatch.ts +135 -0
- package/plugins/sp/scripts/inline-run-setup.mjs +562 -80
- package/plugins/sp/scripts/inline-run-setup.ts +52 -78
- package/plugins/sp/scripts/persist-out-check.mjs +90 -41
- package/plugins/sp/scripts/persist-out-check.ts +112 -57
- package/plugins/sp/scripts/pr-reviewing.mjs +19 -5
- package/plugins/sp/scripts/pr-reviewing.ts +34 -9
- package/plugins/sp/scripts/quality-gate.mjs +30213 -61
- package/plugins/sp/scripts/quality-gate.ts +21 -5
- package/plugins/sp/scripts/residual-scan.mjs +86 -31
- package/plugins/sp/scripts/residual-scan.ts +28 -30
- package/plugins/sp/scripts/run-summary.mjs +432 -14
- package/plugins/sp/scripts/run-summary.ts +41 -177
- package/plugins/sp/scripts/session-timeline.mjs +109 -11
- package/plugins/sp/scripts/session-timeline.ts +57 -19
- package/plugins/sp/scripts/task-diffstat.mjs +32 -29
- package/plugins/sp/scripts/task-diffstat.ts +34 -34
- package/plugins/sp/scripts/wrapup-steps.mjs +150 -2
- package/plugins/sp/scripts/wrapup-steps.ts +203 -1
- package/plugins/sp/skills/brainstorm/SKILL.md +9 -47
- package/plugins/sp/skills/branch-workflow/SKILL.md +1 -0
- package/plugins/sp/skills/branch-workflow/references/worktree-patterns.md +1 -0
- package/plugins/sp/skills/code-implementation/SKILL.md +48 -1
- package/plugins/sp/skills/code-verification/SKILL.md +3 -4
- package/plugins/sp/skills/code-verification/references/secu-review.md +3 -0
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +68 -0
- package/plugins/sp/skills/fleet-join/SKILL.md +1 -1
- package/plugins/sp/skills/indexed-context/SKILL.md +14 -7
- package/plugins/sp/skills/parallel-execution/SKILL.md +2 -2
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
- package/plugins/sp/skills/parallel-execution/references/fan-out-patterns.md +2 -2
- package/plugins/sp/skills/pr-reviewing/SKILL.md +7 -3
- package/plugins/sp/skills/session-review/SKILL.md +40 -7
- package/plugins/sp/skills/source-driven-development/SKILL.md +5 -0
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +5 -3
- package/plugins/sp/skills/spur-cli/SKILL.md +5 -2
- package/plugins/sp/skills/spur-cli/references/agent.md +20 -15
- package/plugins/sp/skills/spur-cli/references/decision.md +16 -8
- package/plugins/sp/skills/spur-cli/references/message.md +7 -7
- package/plugins/sp/skills/spur-cli/references/projects.md +7 -5
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +19 -3
- package/plugins/sp/skills/spur-cli/references/tasks.md +10 -7
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +7 -0
- package/plugins/sp/skills/spur-cli/references/workflows.md +7 -2
- package/plugins/sp/skills/spur-composer/SKILL.md +1 -1
- package/plugins/sp/skills/spur-dev/SKILL.md +20 -14
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +33 -3
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +49 -14
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +37 -17
- package/plugins/sp/skills/spur-dev/references/execution-batch-continuation.md +68 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +199 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +156 -1024
- package/plugins/sp/skills/spur-dev/references/execution-parallel-isolation.md +133 -0
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +6 -0
- package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +471 -0
- package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +379 -0
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +44 -12
- package/plugins/sp/skills/spur-dev/references/glossary.md +2 -2
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +340 -165
- package/plugins/sp/skills/spur-dev/references/structured-trace-emission.md +178 -0
- package/plugins/sp/skills/wayfinder/SKILL.md +10 -14
- package/schemas/state-machine-workflow.schema.json +23 -0
- package/spur.js +42402 -26889
- package/web/_astro/{BoardApp.VeoxxLBy.js → BoardApp.B3GQZvj8.js} +1 -1
- package/web/_astro/BoardApp.BT7L2kSb.js +324 -0
- package/web/_astro/TaskDetail.Cxov1_N_.js +1 -0
- package/web/_astro/{arc.f4e0OYLg.js → arc.vaT7tPOB.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.SSIvxi-Z.js → architectureDiagram-3BPJPVTR.DRMmTjkN.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.DSXIHOFf.js → blockDiagram-GPEHLZMM.cla0LO_q.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DG9Ubu85.js → c4Diagram-AAUBKEIU.D4YAIBKn.js} +1 -1
- package/web/_astro/channel.D4nG9YLf.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.C7QU88Qh.js → chunk-2J33WTMH.BrSJbMRZ.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.26Z94xBj.js → chunk-4BX2VUAB.CuLMgKF5.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.DYRiBkqw.js → chunk-55IACEB6.zkvgu54F.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.D5Vfv5pe.js → chunk-727SXJPM.DxWkACh8.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.DXHV47bN.js → chunk-AQP2D5EJ.42XrmIlH.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.D1suAfOs.js → chunk-FMBD7UC4.Bao2wMK9.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.D6BmdHEY.js → chunk-ND2GUHAM.BhydojD1.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.rnPU-Ak-.js → chunk-QZHKN3VN.CmZ82g-H.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CvEfXIo1.js → classDiagram-4FO5ZUOK.Blr83Gt_.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CvEfXIo1.js → classDiagram-v2-Q7XG4LA2.Blr83Gt_.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.DkMisLSm.js → cose-bilkent-S5V4N54A.qmfv0SPn.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.C77Q-pF6.js → cynefin-OW5HDTMX.BtELhXPR.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.YaV8ce27.js → dagre-BM42HDAG.AWmaAvXo.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.CUyGEKge.js → diagram-2AECGRRQ.DdH34KDi.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.CRgd8dgj.js → diagram-5GNKFQAL.BmNPix1k.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.Bmzys9hq.js → diagram-KO2AKTUF.BNQd_Ppo.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.BvmJY4Lw.js → diagram-LMA3HP47.BAPgDi0e.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.0hEhD30d.js → diagram-OG6HWLK6.DZ4zyLdC.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.Bjt8lrnm.js → erDiagram-TEJ5UH35.Q1TySMmw.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.CJZTjRDV.js → flowDiagram-I6XJVG4X.BXhFBicG.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7._VqoVafc.js → ganttDiagram-6RSMTGT7.vHSgcuo2.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.CEDb7tVo.js → gitGraphDiagram-PVQCEYII.Bi1f73C7.js} +1 -1
- package/web/_astro/index.BhSwN8yY.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.CgwifPpK.js → infoDiagram-5YYISTIA.DPvXZEWm.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.B99wx2J1.js → ishikawaDiagram-YF4QCWOH.Cz829fsV.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.2hRwJbEo.js → journeyDiagram-JHISSGLW.enRnB9Me.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.BahJkKNC.js → kanban-definition-UN3LZRKU.DnTNk6d2.js} +1 -1
- package/web/_astro/{linear.DguUUe6V.js → linear.BzGnBwNL.js} +1 -1
- package/web/_astro/{mermaid.core.CvgfmqVr.js → mermaid.core.CSbTpIVz.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.B3qEA3x9.js → mindmap-definition-RKZ34NQL.DGJDy8zT.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.FlWA-_ru.js → pieDiagram-4H26LBE5.HSPdi5_8.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.9bVn35X7.js → quadrantDiagram-W4KKPZXB.6Gv8mz2Y.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.ChykIhct.js → requirementDiagram-4Y6WPE33.CnBCtFwa.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.Z2Y3hkYb.js → sankeyDiagram-5OEKKPKP.5M8VWAu8.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.J7JsHWDt.js → sequenceDiagram-3UESZ5HK.DN41XN-U.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DAPbiCSS.js → stateDiagram-AJRCARHV.ErOO3W8j.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.D2jvSi0q.js → stateDiagram-v2-BHNVJYJU.B_ZHICM-.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.psW2ci29.js → timeline-definition-PNZ67QCA.CWdosr07.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.DlILYVmg.js → vennDiagram-CIIHVFJN.BHzYjNV5.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.xNWwLJnn.js → wardleyDiagram-YWT4CUSO.h8x4IwPX.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.EU_BuH7V.js → xychartDiagram-2RQKCTM6.RTapW2X8.js} +1 -1
- package/web/index.html +2 -2
- package/plugins/sp/commands/dev-parallel.md +0 -31
- package/web/_astro/BoardApp.Bzr4OXrW.js +0 -324
- package/web/_astro/TaskDetail.LAyR_Pvn.js +0 -1
- package/web/_astro/channel.CUFdtWhm.js +0 -1
- package/web/_astro/index.Dg_3bOaJ.css +0 -1
|
@@ -157,8 +157,10 @@ workflows:
|
|
|
157
157
|
# project-relative); the first layer wins per file basename (ADR-113 style).
|
|
158
158
|
# `maker` selects the default DecisionMaker for every decision point, and
|
|
159
159
|
# `makers` overrides it per decision id. Built-in makers: typesafe, fm-local,
|
|
160
|
-
# laya-local (laya-local needs Apple Silicon)
|
|
161
|
-
#
|
|
160
|
+
# laya-local (laya-local needs Apple Silicon) and clef (hosted Cloudflare
|
|
161
|
+
# Workers AI, registered only when CLOUDFLARE_ACCOUNT_ID and
|
|
162
|
+
# CLOUDFLARE_AUTH_TOKEN are both set). An unregistered name is a config error,
|
|
163
|
+
# never a silent fallback. Inspect the effective choice with
|
|
162
164
|
# `spur decision status`. `init` never overwrites this file — until you add the
|
|
163
165
|
# keys, the shipped catalog's maker applies (see `status`).
|
|
164
166
|
decisions:
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
$schema: "@gobing-ai/spur/schemas/decision-catalog.schema.json"
|
|
2
|
+
# Decision catalog for evidence-mode operator gates (feature P1 / task 1099,
|
|
3
|
+
# decision-observability-and-adoption.md §4, class keep-human).
|
|
4
|
+
#
|
|
5
|
+
# `gate-evidence` serves `hitl.confirm` actions overridden to
|
|
6
|
+
# `decision.mode: evidence`: the workflow gate responder decides through it
|
|
7
|
+
# instead of the legacy inline maker, so operator gates get catalog maker
|
|
8
|
+
# resolution, the catalog min-confidence floor and `decision.*` lifecycle
|
|
9
|
+
# events with caller `gate` (task 1099 R2). Bundled workflows keep
|
|
10
|
+
# `mode: never` and always pause for the operator (task 1099 R4); no shipped
|
|
11
|
+
# workflow YAML references this id.
|
|
12
|
+
#
|
|
13
|
+
# Resolution: this file ships in the shared layer (the installed package's
|
|
14
|
+
# config/decisions/). A project can override it per basename through
|
|
15
|
+
# .spur/decisions/ or decisions.paths (first layer wins, ADR-113 style).
|
|
16
|
+
version: 1
|
|
17
|
+
|
|
18
|
+
decisions:
|
|
19
|
+
gate-evidence:
|
|
20
|
+
type: choice
|
|
21
|
+
description: Should an evidence-mode operator gate proceed, stop, or defer to the operator?
|
|
22
|
+
parameters:
|
|
23
|
+
prompt:
|
|
24
|
+
type: string
|
|
25
|
+
description: The gate question that would have been asked to the operator.
|
|
26
|
+
evidence:
|
|
27
|
+
type: json
|
|
28
|
+
description: Bounded, redacted producer-node evidence recorded for this run.
|
|
29
|
+
node:
|
|
30
|
+
type: string
|
|
31
|
+
description: The workflow node that raised the gate.
|
|
32
|
+
criteria:
|
|
33
|
+
yes: The recorded evidence establishes that the gate should proceed.
|
|
34
|
+
no: The recorded evidence establishes that the gate should not proceed.
|
|
35
|
+
defer: The evidence is insufficient or conflicting; defer to the operator.
|
|
36
|
+
fallback: defer
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
$schema: "@gobing-ai/spur/schemas/decision-catalog.schema.json"
|
|
2
|
+
# Decision catalog for the history-anatomy workflow (feature P1 / task 1098).
|
|
3
|
+
#
|
|
4
|
+
# `anatomy-validation-verdict` backs the rescue-only classification of an
|
|
5
|
+
# ambiguous validation artifact in config/workflows/history-anatomy.yaml
|
|
6
|
+
# (validate state, verdict-normalization step): the deterministic parse stays
|
|
7
|
+
# first, and the catalog decision runs only when the artifact's final line is
|
|
8
|
+
# not exactly `Verdict: PASS` and the file holds zero exact `Verdict: FAIL`
|
|
9
|
+
# lines. Any exact `Verdict: FAIL` line short-circuits to FAIL without calling
|
|
10
|
+
# a maker, so a deterministic FAIL can never be overturned (AC1). The fallback
|
|
11
|
+
# is FAIL — an ambiguous verdict with no model answer fails the 0771 guard,
|
|
12
|
+
# the same routing as before the rescue existed.
|
|
13
|
+
#
|
|
14
|
+
# Resolution: this file ships in the shared layer (the installed package's
|
|
15
|
+
# config/decisions/). A project can override it per basename through
|
|
16
|
+
# .spur/decisions/ or decisions.paths (first layer wins, ADR-113 style).
|
|
17
|
+
version: 1
|
|
18
|
+
|
|
19
|
+
defaults:
|
|
20
|
+
# ADR-125 value, kept over the upstream 0.7 default.
|
|
21
|
+
minConfidence: 0.8
|
|
22
|
+
|
|
23
|
+
decisions:
|
|
24
|
+
anatomy-validation-verdict:
|
|
25
|
+
type: choice
|
|
26
|
+
description: >
|
|
27
|
+
Does the history-anatomy validation artifact certify the candidate
|
|
28
|
+
report? The evidence file is the full validation artifact; the
|
|
29
|
+
answer decides which verdict line the 0771 guard reads.
|
|
30
|
+
criteria:
|
|
31
|
+
PASS: The artifact substantively certifies the candidate report —
|
|
32
|
+
its only plausible reading is a PASS verdict.
|
|
33
|
+
FAIL: The artifact does not certify the candidate report, or its
|
|
34
|
+
verdict cannot be determined from the text.
|
|
35
|
+
fallback: FAIL
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
$schema: "@gobing-ai/spur/schemas/decision-catalog.schema.json"
|
|
2
|
+
# Decision catalogs for the idea pipeline (feature P1 / task 1097, design §5 S5).
|
|
3
|
+
#
|
|
4
|
+
# Rescue-only adoption (design §4): the deterministic parses in
|
|
5
|
+
# config/workflows/idea-pipeline.yaml stay FIRST — the awk derivation over
|
|
6
|
+
# `## Recommendation` and the needs_design JSON read. These entries serve only
|
|
7
|
+
# the output those parses cannot classify: recommendation `unknown`, or a
|
|
8
|
+
# missing/corrupt needs_design JSON. Fallbacks reproduce today's routing
|
|
9
|
+
# (`unknown` keeps the idea-eval pause; `design` keeps the system-design pass),
|
|
10
|
+
# so no default can auto-create a feature.
|
|
11
|
+
#
|
|
12
|
+
# Resolution: this file ships in the shared layer (the installed package's
|
|
13
|
+
# config/decisions/). A project can override it per basename through
|
|
14
|
+
# .spur/decisions/ or decisions.paths (first layer wins, ADR-113 style).
|
|
15
|
+
version: 1
|
|
16
|
+
|
|
17
|
+
defaults:
|
|
18
|
+
# ADR-125 value, kept over the upstream 0.7 default.
|
|
19
|
+
minConfidence: 0.8
|
|
20
|
+
|
|
21
|
+
decisions:
|
|
22
|
+
idea-recommendation:
|
|
23
|
+
type: choice
|
|
24
|
+
description: Which route does the idea evaluation report recommend?
|
|
25
|
+
criteria:
|
|
26
|
+
proceed: Build as evaluated — create the feature.
|
|
27
|
+
reshape: Build with the evaluation's reshaping — create the feature and fold it in.
|
|
28
|
+
drop: Do not build — cancel without creating a feature.
|
|
29
|
+
unknown: The report states no clear recommendation.
|
|
30
|
+
fallback: unknown
|
|
31
|
+
|
|
32
|
+
needs-design:
|
|
33
|
+
type: choice
|
|
34
|
+
description: Does this idea need a system-design pass before decomposition?
|
|
35
|
+
criteria:
|
|
36
|
+
design: Run the system-design stage before decomposition.
|
|
37
|
+
skip: Decompose directly — no system-design pass needed.
|
|
38
|
+
fallback: design
|
|
@@ -7,6 +7,16 @@
|
|
|
7
7
|
"contract": "standard",
|
|
8
8
|
"twin": "batch-preflight.mjs"
|
|
9
9
|
},
|
|
10
|
+
{
|
|
11
|
+
"rel": "batch-plan.ts",
|
|
12
|
+
"contract": "standard",
|
|
13
|
+
"twin": "batch-plan.mjs"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"rel": "commit-guard.ts",
|
|
17
|
+
"contract": "standard",
|
|
18
|
+
"twin": "commit-guard.mjs"
|
|
19
|
+
},
|
|
10
20
|
{
|
|
11
21
|
"rel": "daily-summary/daily-summary.ts",
|
|
12
22
|
"contract": "standard",
|
|
@@ -51,6 +61,11 @@
|
|
|
51
61
|
"contract": "standard",
|
|
52
62
|
"twin": "inline-run-setup.mjs"
|
|
53
63
|
},
|
|
64
|
+
{
|
|
65
|
+
"rel": "inline-run-dispatch.ts",
|
|
66
|
+
"contract": "standard",
|
|
67
|
+
"twin": "inline-run-dispatch.mjs"
|
|
68
|
+
},
|
|
54
69
|
{
|
|
55
70
|
"rel": "feature-verification-steps.ts",
|
|
56
71
|
"contract": "standard",
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
$schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
|
|
2
|
+
# Sourced-claims rules (docs corpus) — API/library claims in markdown must be
|
|
3
|
+
# verifiable. A bare version string or a time-anchored API claim ("deprecated
|
|
4
|
+
# since", "added in 0.5.x") on a line with no citation anchor (http(s) URL or a
|
|
5
|
+
# repo path:line reference) is an unverifyable claim: readers cannot tell
|
|
6
|
+
# measured fact from model memory. The deterministic scan is line-level and
|
|
7
|
+
# heuristic — code fences and command examples can legitimately carry bare
|
|
8
|
+
# versions, so severity is info (advisory visibility; the recommended-pre-check
|
|
9
|
+
# gate runs --fail-on warning, so this rule surfaces findings for review without
|
|
10
|
+
# reddening gates — changed-file enforcement happens in SECUA review).
|
|
11
|
+
#
|
|
12
|
+
# The semantic contract — every external API/library claim carries a source
|
|
13
|
+
# citation (URL or path:line) AND a confidence level (HIGH/MEDIUM/LOW) — is
|
|
14
|
+
# owned by the sp-source-driven-development skill and verified in SECUA review
|
|
15
|
+
# (code-verification secu-review checklist). Generic "supports/requires" prose
|
|
16
|
+
# is deliberately out of scope here: in this corpus it is structural writing,
|
|
17
|
+
# not external API assertion, and would drown the signal.
|
|
18
|
+
include:
|
|
19
|
+
- "docs/**/*.md"
|
|
20
|
+
- "plugins/sp/skills/**/references/**/*.md"
|
|
21
|
+
exclude:
|
|
22
|
+
# Legacy task archives are historical records — retro-citing ~900 closed
|
|
23
|
+
# lines is make-work; the tripwire targets active authoring surfaces.
|
|
24
|
+
- "docs/tasks/"
|
|
25
|
+
- "docs/tasks2/"
|
|
26
|
+
- "docs/tasks3/"
|
|
27
|
+
- "docs/tasks4/"
|
|
28
|
+
- "drizzle/**"
|
|
29
|
+
- "**/node_modules/**"
|
|
30
|
+
rules:
|
|
31
|
+
- id: cited-version-strings
|
|
32
|
+
description: >
|
|
33
|
+
A markdown line asserting a version string (x.y.z) without a citation
|
|
34
|
+
anchor on the same line — http(s) URL or repo path reference like
|
|
35
|
+
packages/app/src/foo.ts:123 — is unverifyable. Add the anchor, or drop
|
|
36
|
+
the version if it is not load-bearing. Confidence level (HIGH/MEDIUM/LOW)
|
|
37
|
+
is part of the claim contract; see sp-source-driven-development.
|
|
38
|
+
severity: info
|
|
39
|
+
evaluator:
|
|
40
|
+
type: regex
|
|
41
|
+
config:
|
|
42
|
+
mode: forbid
|
|
43
|
+
# Fire when the line has NO citation anchor (no URL, no path:line) AND
|
|
44
|
+
# contains a semver-ish token. Lookarounds exclude IPs (127.0.0.1) and
|
|
45
|
+
# longer dotted numerics; fenced-code lines are out of regex reach —
|
|
46
|
+
# that residual noise is why this is warning, not error.
|
|
47
|
+
pattern: "^(?!.*(?:https?://|(?:[\\w.-]+/)+[\\w.-]+:\\d+)).*(?<![\\d.])\\d+\\.\\d+\\.\\d+(?!\\.\\d)"
|
|
48
|
+
- id: cited-api-claims
|
|
49
|
+
description: >
|
|
50
|
+
A markdown line making a time- or version-anchored external API claim
|
|
51
|
+
("deprecated since 1.2", "introduced in v3", "available since 0.9") must
|
|
52
|
+
carry a citation anchor on the same line — URL or repo path:line. Add the
|
|
53
|
+
source (URL or path:line) and the confidence level (HIGH/MEDIUM/LOW);
|
|
54
|
+
contract in sp-source-driven-development.
|
|
55
|
+
severity: info
|
|
56
|
+
evaluator:
|
|
57
|
+
type: regex
|
|
58
|
+
config:
|
|
59
|
+
mode: forbid
|
|
60
|
+
pattern: "^(?!.*(?:https?://|(?:[\\w.-]+/)+[\\w.-]+:\\d+)).*\\b(?:deprecated (?:since|in|as of)|introduced in|added in|available since|stable since)\\b"
|
|
@@ -2,9 +2,14 @@ $schema: "@gobing-ai/spur/schemas/preset.schema.json"
|
|
|
2
2
|
# Recommended pre-check preset — portable rule categories bundled with the catalog.
|
|
3
3
|
# Use with: spur rule run --preset recommended-pre-check
|
|
4
4
|
#
|
|
5
|
-
# Runs BEFORE tests (test-pre-check). Extends
|
|
6
|
-
# structure, boundary, surface, ui,
|
|
7
|
-
# 79186391). TSDoc exports run in
|
|
5
|
+
# Runs BEFORE tests (test-pre-check). Extends categories: typescript,
|
|
6
|
+
# structure, boundary, surface, ui, strict (ui since bc267cc8, strict since
|
|
7
|
+
# 79186391), and docs (sourced-api-claims, 2026-10-07). TSDoc exports run in
|
|
8
|
+
# post-check alongside coverage-gate.
|
|
9
|
+
#
|
|
10
|
+
# TEMPORARY (2026-10-08): `docs` removed from extends to unblock the gate —
|
|
11
|
+
# restore it (add `- docs` back) once sourced-api-claims finding noise is
|
|
12
|
+
# triaged. Recapture the raw-json-baseline fixtures in the same change.
|
|
8
13
|
name: recommended-pre-check
|
|
9
14
|
extends:
|
|
10
15
|
- typescript
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
$schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
|
|
2
|
+
# ADR-131 consumer invariant: `.spur/run/` may be absent in any later run, so a
|
|
3
|
+
# durable record must not cite it as evidence. `done_reason` is the one
|
|
4
|
+
# machine-consumed pointer with a fixed shape, so this rule anchors there: a task's
|
|
5
|
+
# close rationale must name `.spur/memory/evidence/<wbs>-verdict.json` (or the
|
|
6
|
+
# tracked `## Testing` section), never the scratch copy.
|
|
7
|
+
#
|
|
8
|
+
# Scope — the pointer field, not the directory string. 600+ tracked documents
|
|
9
|
+
# legitimately mention `.spur/run/` while documenting what the pipeline writes
|
|
10
|
+
# there (that is the mechanism the ADR governs); only a `done_reason:` value that
|
|
11
|
+
# points at a scratch verdict is a citation of record. Prose mentions in any
|
|
12
|
+
# section, design doc or source file never match, so no allowlist is needed.
|
|
13
|
+
#
|
|
14
|
+
# Out of scope, and this rule makes no claim to cover it: executable source under
|
|
15
|
+
# the gitignored `.spur/run/` (a hook or script loader registered from scratch).
|
|
16
|
+
# No loader registers from there — verified 2026-10-09, and the runtime-guard task
|
|
17
|
+
# that would have covered the class (1145) was cancelled. The rule engine reads
|
|
18
|
+
# tracked files only, so that class is invisible here by construction.
|
|
19
|
+
#
|
|
20
|
+
# Repair: `spur task migrate-anchors --wbs <wbs>` retargets the pointer (1140).
|
|
21
|
+
include:
|
|
22
|
+
- "docs/tasks*/**/*.md"
|
|
23
|
+
rules:
|
|
24
|
+
- id: no-scratch-verdict-pointer
|
|
25
|
+
description: >
|
|
26
|
+
done_reason cites a .spur/run verdict, which ADR-131 makes disposable: the
|
|
27
|
+
directory may be absent in any later run, so a consumer resolving this pointer
|
|
28
|
+
reads a broken reference. Cite .spur/memory/evidence/<wbs>-verdict.json, or the
|
|
29
|
+
tracked Testing section when no durable copy was retained; repair with
|
|
30
|
+
`spur task migrate-anchors --wbs <wbs>`.
|
|
31
|
+
severity: error
|
|
32
|
+
evaluator:
|
|
33
|
+
type: rg
|
|
34
|
+
config:
|
|
35
|
+
pattern: "^done_reason:.*\\.spur/run/[0-9]{4}(-|/)verdict\\.json"
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
"reason": "Keep, sp-owned git/gh loop; cited exemption (plan \u00a72)"
|
|
8
8
|
},
|
|
9
9
|
"plugins/sp/scripts/wrapup-steps.ts": {
|
|
10
|
-
"kinds": ["budget"],
|
|
11
|
-
"reason": "Keep (budget exemption), W2 (plan \u00a72)",
|
|
10
|
+
"kinds": ["budget", "corpus-parse"],
|
|
11
|
+
"reason": "Keep (budget exemption), W2 (plan \u00a72). corpus-parse: the 1147 R1 doc-sync write-scope guard excludes the task/feature corpus by path prefix -- a scope exclusion, not corpus parsing (same class as wrapup-drift-probe.ts).",
|
|
12
12
|
"exempt": true
|
|
13
13
|
},
|
|
14
14
|
"plugins/sp/scripts/batch-preflight.ts": {
|
|
@@ -36,7 +36,7 @@ All product development work goes through the harness by default.
|
|
|
36
36
|
| ------ | ---------- | -------- |
|
|
37
37
|
| Plan a feature (intake → AC → tasks) | `/sp:dev-plan`, `/sp:dev-idea` | Freeform feature files without gates |
|
|
38
38
|
| Drive one task end-to-end | `/sp:dev-run <wbs>` or **`sp:super-planner`** | Implement with no task / no pipeline |
|
|
39
|
-
| Batch or parallel task runs | `/sp:dev-runall` (host sequential; **`sp:super-planner`**
|
|
39
|
+
| Batch or parallel task runs | `/sp:dev-runall` (host sequential; `--mode parallel\|auto` → **`sp:super-planner`**) | Unordered multi-task thrash |
|
|
40
40
|
| Batch-refine tasks under a feature | `/sp:dev-refineall --feature <id> --auto` | Hand-looping `/sp:dev-refine` per WBS |
|
|
41
41
|
| Multi-step corpus CLI (tasks/features/rules/workflows) | **`sp:expert-spur`** | Raw Write/Edit on corpus files |
|
|
42
42
|
| Look up `spur` verbs / flags / `--json` | Skill **`sp:spur-cli`** | Inventing flags from memory |
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
|
|
10
10
|
kind: state-machine
|
|
11
11
|
name: feature-lifecycle
|
|
12
|
-
version: "
|
|
12
|
+
version: "2"
|
|
13
13
|
description: >
|
|
14
14
|
Feature lifecycle FSM (design §2.3, §5.1, DD-13). States are the canonical
|
|
15
15
|
FeatureStatus vocabulary; transitions encode the §2.3 graph including the
|
|
@@ -50,7 +50,14 @@ states:
|
|
|
50
50
|
# applied as a replacement, so the inner run lost spurBin and loadModule
|
|
51
51
|
# fell into source mode (0948 R1). The nested JSON is shell-expanded:
|
|
52
52
|
# $spurBin inside the double quotes keeps a multi-word invocation intact.
|
|
53
|
-
|
|
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\"}"'
|
|
54
61
|
- id: blocked
|
|
55
62
|
description: Impediment; work suspended.
|
|
56
63
|
- id: done
|
|
@@ -250,6 +250,28 @@ states:
|
|
|
250
250
|
grep -vx 'Verdict: PASS' "$f" > "$f.tmp" && printf 'Verdict: PASS\n' >> "$f.tmp" && mv "$f.tmp" "$f";
|
|
251
251
|
fi;
|
|
252
252
|
fi
|
|
253
|
+
- kind: shell
|
|
254
|
+
options:
|
|
255
|
+
# 1098 ambiguous-verdict rescue (design §5 S6, rescue-only): runs AFTER the
|
|
256
|
+
# normalization step and only when the artifact is still undecidable — final
|
|
257
|
+
# line not `Verdict: PASS` and ZERO exact `Verdict: FAIL` lines (zero PASS
|
|
258
|
+
# lines or several). The catalog decision `anatomy-validation-verdict`
|
|
259
|
+
# classifies the artifact. `Verdict: PASS` is appended ONLY from a model
|
|
260
|
+
# answer (source == "model" and value == "PASS"; the jq `// .data.*` arms
|
|
261
|
+
# also accept the ADR-091 envelope shape); a fallback, a non-model source,
|
|
262
|
+
# a jq failure or any maker failure appends `Verdict: FAIL`. The zero-FAIL
|
|
263
|
+
# guard short-circuits BEFORE the maker call, so a deterministic FAIL is
|
|
264
|
+
# never overturned (AC1) and the 0771 guard/assert-clean stay the
|
|
265
|
+
# authorities. Separate action from normalization to stay inside the
|
|
266
|
+
# ADR-115 composition budget (§1.2 shell tier).
|
|
267
|
+
command: >-
|
|
268
|
+
f=.spur/run/$__runId-validation.txt;
|
|
269
|
+
if [ -f "$f" ] && [ "$(grep -cx 'Verdict: FAIL' "$f")" = 0 ] && ! tail -n 1 "$f" | grep -qx 'Verdict: PASS'; then
|
|
270
|
+
d=$("$spurBin" decision run anatomy-validation-verdict --evidence "$f" --json || true);
|
|
271
|
+
v=$(printf '%s' "$d" | jq -r 'if (.source // .data.source) == "model" and (.value // .data.value) == "PASS" then "PASS" else "FAIL" end' 2>/dev/null);
|
|
272
|
+
[ "$v" = "PASS" ] || v="FAIL";
|
|
273
|
+
printf 'Verdict: %s\n' "$v" >> "$f";
|
|
274
|
+
fi
|
|
253
275
|
- kind: shell
|
|
254
276
|
options:
|
|
255
277
|
command: >-
|
|
@@ -79,6 +79,10 @@ vars:
|
|
|
79
79
|
|
|
80
80
|
states:
|
|
81
81
|
- id: start
|
|
82
|
+
display:
|
|
83
|
+
phase: discover
|
|
84
|
+
phaseTitle: Discover
|
|
85
|
+
title: Check inputs
|
|
82
86
|
description: >
|
|
83
87
|
Pipeline start. The idea text arrives as vars.idea. The pipeline stops at
|
|
84
88
|
handoff — no task execution. Soft agent doctor (status file) so doctor red
|
|
@@ -113,6 +117,10 @@ states:
|
|
|
113
117
|
printf 'FAIL\n' > ".spur/run/$__runId-idea-precheck-doctor.status"
|
|
114
118
|
|
|
115
119
|
- id: discovery
|
|
120
|
+
display:
|
|
121
|
+
phase: discover
|
|
122
|
+
phaseTitle: Discover
|
|
123
|
+
title: Discovery interview
|
|
116
124
|
description: >
|
|
117
125
|
Dispatch sp:brainstorm to explore the idea, generate approaches with trade-offs,
|
|
118
126
|
and record a design summary. The brainstorm ALWAYS records a design summary
|
|
@@ -146,8 +154,35 @@ states:
|
|
|
146
154
|
awk '/^## Recommendation/{f=1;next} f&&NF{r=tolower($0);exit}
|
|
147
155
|
END{print (match(r,/^[*_ ]*(proceed|reshape|drop)/) ? substr(r,RSTART,RLENGTH) : "unknown")}'
|
|
148
156
|
".spur/run/$__runId-idea-eval-report.md" | tr -d '*_ ' > ".spur/run/$__runId-idea-recommendation.txt"
|
|
157
|
+
# 1097 R2 (design §4 rescue-only): the awk parse stays first; this rescue runs ONLY when
|
|
158
|
+
# the derived file is `unknown`. A model answer is written only when `source == "model"`
|
|
159
|
+
# and it lands in the closed vocabulary (proceed|reshape|drop) — every other outcome
|
|
160
|
+
# (spur missing/non-zero, unparseable output, model `unknown`) leaves `unknown` in place,
|
|
161
|
+
# which is today's idea-eval pause route. Exits 0 on every path (default onError: fail).
|
|
162
|
+
- kind: shell
|
|
163
|
+
options:
|
|
164
|
+
command: >-
|
|
165
|
+
f=".spur/run/$__runId-idea-recommendation.txt";
|
|
166
|
+
[ "$(cat "$f" 2>/dev/null)" = unknown ] || exit 0;
|
|
167
|
+
v="$($spurBin decision run idea-recommendation --evidence ".spur/run/$__runId-idea-eval-report.md" --json 2>/dev/null | jq -r 'if .source=="model" then .value else "unknown" end' 2>/dev/null)";
|
|
168
|
+
case "$v" in proceed|reshape|drop) printf '%s\n' "$v" > "$f" ;; esac
|
|
169
|
+
# 1097 R3 (same rescue-only pattern): a valid needs_design boolean short-circuits — no
|
|
170
|
+
# decision is called. On a missing/corrupt/non-boolean file the catalog decision decides:
|
|
171
|
+
# `{"needs_design": false}` only when `source == "model"` AND `value == "skip"`; otherwise
|
|
172
|
+
# `{"needs_design": true}` — today's behavior for a missing or corrupt file. The
|
|
173
|
+
# ac-generate route writer (:274) consumes this file unchanged. Exits 0 on every path.
|
|
174
|
+
- kind: shell
|
|
175
|
+
options:
|
|
176
|
+
command: >-
|
|
177
|
+
f=".spur/run/$__runId-idea-needs-design.json";
|
|
178
|
+
jq -e '.needs_design|type=="boolean"' "$f" >/dev/null 2>&1 && exit 0;
|
|
179
|
+
$spurBin decision run needs-design --evidence ".spur/run/$__runId-idea-eval-report.md" --json 2>/dev/null | jq -e '.source=="model" and .value=="skip"' >/dev/null 2>&1 && printf '{"needs_design": false}\n' > "$f" || printf '{"needs_design": true}\n' > "$f"
|
|
149
180
|
|
|
150
181
|
- id: idea-eval
|
|
182
|
+
display:
|
|
183
|
+
phase: discover
|
|
184
|
+
phaseTitle: Discover
|
|
185
|
+
title: Evaluate idea
|
|
151
186
|
description: >
|
|
152
187
|
HITL taste gate. Discovery has produced the idea-evaluation report
|
|
153
188
|
(.spur/run/${vars.__runId}-idea-eval-report.md) with urgency/necessity scores, premises,
|
|
@@ -164,6 +199,10 @@ states:
|
|
|
164
199
|
mode: never
|
|
165
200
|
|
|
166
201
|
- id: feature-create
|
|
202
|
+
display:
|
|
203
|
+
phase: define
|
|
204
|
+
phaseTitle: "Define feature"
|
|
205
|
+
title: Create feature
|
|
167
206
|
description: >
|
|
168
207
|
Create a feature via spur feature create, or select an existing feature id.
|
|
169
208
|
The agent writes the feature id to .spur/run/${vars.__runId}-idea-feature-id.txt and body-only
|
|
@@ -203,6 +242,10 @@ states:
|
|
|
203
242
|
$spurBin feature update "$featureId" --section Scope --from-file .spur/run/$__runId-idea-scope.md
|
|
204
243
|
|
|
205
244
|
- id: ac-generate
|
|
245
|
+
display:
|
|
246
|
+
phase: define
|
|
247
|
+
phaseTitle: "Define feature"
|
|
248
|
+
title: Generate AC
|
|
206
249
|
description: >
|
|
207
250
|
Generate acceptance criteria per ac-style-guide.md. Write AC scenarios to the
|
|
208
251
|
feature file via `spur feature update --section "Acceptance Criteria"
|
|
@@ -279,6 +322,10 @@ states:
|
|
|
279
322
|
printf 'FAIL\n' > .spur/run/$__runId-idea-ac-ready.status; }
|
|
280
323
|
|
|
281
324
|
- id: feature-check
|
|
325
|
+
display:
|
|
326
|
+
phase: define
|
|
327
|
+
phaseTitle: "Define feature"
|
|
328
|
+
title: Check feature
|
|
282
329
|
description: >
|
|
283
330
|
HITL gate over the recorded `idea-ac-check` result (measured at the ac-generate
|
|
284
331
|
boundary — this gate never re-runs the CLI). Deliberately NOT --strict: before
|
|
@@ -306,6 +353,10 @@ states:
|
|
|
306
353
|
# JSON, recorded ac-check status) cannot change across hitl.confirm.
|
|
307
354
|
|
|
308
355
|
- id: system-design
|
|
356
|
+
display:
|
|
357
|
+
phase: design
|
|
358
|
+
phaseTitle: Design
|
|
359
|
+
title: System design
|
|
309
360
|
description: >
|
|
310
361
|
Dispatch sp:sys-architecture to produce the system design. This state runs
|
|
311
362
|
only when needs_design=true (design=auto signal path). The agent creates ADR
|
|
@@ -356,6 +407,10 @@ states:
|
|
|
356
407
|
timeoutMs: 120000
|
|
357
408
|
|
|
358
409
|
- id: design-approval
|
|
410
|
+
display:
|
|
411
|
+
phase: design
|
|
412
|
+
phaseTitle: Design
|
|
413
|
+
title: Approve design
|
|
359
414
|
description: >
|
|
360
415
|
HITL taste gate. The operator reviews the system design and approves or
|
|
361
416
|
rejects it. Routed around only when profile=auto AND vars.design_approved=true
|
|
@@ -383,6 +438,10 @@ states:
|
|
|
383
438
|
mode: never
|
|
384
439
|
|
|
385
440
|
- id: decompose
|
|
441
|
+
display:
|
|
442
|
+
phase: decompose
|
|
443
|
+
phaseTitle: Decompose
|
|
444
|
+
title: Decompose into tasks
|
|
386
445
|
description: >
|
|
387
446
|
Dispatch sp:spec-decomposition with the brainstorm artifact, feature AC, and
|
|
388
447
|
design doc as input. The agent produces a task-batch JSON file at
|
|
@@ -427,6 +486,10 @@ states:
|
|
|
427
486
|
' "$ORDER" >/dev/null
|
|
428
487
|
|
|
429
488
|
- id: batch-create
|
|
489
|
+
display:
|
|
490
|
+
phase: decompose
|
|
491
|
+
phaseTitle: Decompose
|
|
492
|
+
title: Approve task batch
|
|
430
493
|
description: >
|
|
431
494
|
HITL gate: runs spur task batch-create with the batch JSON from the
|
|
432
495
|
decompose state. The check is objective (schema validation) and
|
|
@@ -443,6 +506,10 @@ states:
|
|
|
443
506
|
mode: never
|
|
444
507
|
|
|
445
508
|
- id: batch-create-run
|
|
509
|
+
display:
|
|
510
|
+
phase: decompose
|
|
511
|
+
phaseTitle: Decompose
|
|
512
|
+
title: Create tasks
|
|
446
513
|
description: >
|
|
447
514
|
Executes task batch creation exactly once per decomposition attempt. The
|
|
448
515
|
side effect lives in onEnter and records a sentinel; transition guards only
|
|
@@ -472,6 +539,10 @@ states:
|
|
|
472
539
|
fi
|
|
473
540
|
|
|
474
541
|
- id: ready-prepare
|
|
542
|
+
display:
|
|
543
|
+
phase: handoff
|
|
544
|
+
phaseTitle: "Hand off"
|
|
545
|
+
title: Prepare ready set
|
|
475
546
|
description: >
|
|
476
547
|
Ready-by-default preparation (0788): the planning owner applies the
|
|
477
548
|
ready-refinement checklist to each created task (requirements, design,
|
|
@@ -521,6 +592,10 @@ states:
|
|
|
521
592
|
jq -e 'type == "object" and (.tasks | type == "array") and (all(.tasks[]; (.wbs | type == "string") and (.status == "ready" or .status == "failed" or .status == "skipped") and (.planningDigest | type == "string") and (.checks | type == "array") and (all(.checks[]; (.id | type == "string") and (.pass | type == "boolean") and (.evidence | type == "string")))))' "$READY" >/dev/null
|
|
522
593
|
|
|
523
594
|
- id: handoff-finalize
|
|
595
|
+
display:
|
|
596
|
+
phase: handoff
|
|
597
|
+
phaseTitle: "Hand off"
|
|
598
|
+
title: Finalize handoff
|
|
524
599
|
description: >
|
|
525
600
|
Post-create finalization (0518): zip batch item names to the created WBS
|
|
526
601
|
values from the captured batch-create result (equal-length/unique-name
|