@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
|
@@ -26,7 +26,6 @@ metadata:
|
|
|
26
26
|
see_also:
|
|
27
27
|
- sp:source-driven-development
|
|
28
28
|
- sp:spur-cli
|
|
29
|
-
- sp:wayfinder
|
|
30
29
|
---
|
|
31
30
|
|
|
32
31
|
# sp:brainstorm — Structured Ideation Workflow
|
|
@@ -35,7 +34,6 @@ Generate solution options with trade-offs, recommendations, and confidence scori
|
|
|
35
34
|
|
|
36
35
|
**Key distinction:**
|
|
37
36
|
- **`sp:brainstorm`** = Ideation: generate approaches with trade-offs
|
|
38
|
-
- **`sp:wayfinder`** = Wayfinding: chart a multi-session map when the destination itself is foggy
|
|
39
37
|
- **research** = verify and synthesize information (delegate inline by default — see [inline-default contract](../spur-dev/references/cross-cutting.md#inline-default-execution-surface))
|
|
40
38
|
- **`sp:spur-dev`** = Task creation: structured task breakdown (planning half)
|
|
41
39
|
- **`sp:source-driven-development`** = Verification: source-first claim validation
|
|
@@ -65,14 +63,13 @@ Activate sp:brainstorm when:
|
|
|
65
63
|
| "research approaches" | User wants evidence-backed options |
|
|
66
64
|
| "what are my options?" | User wants multiple solutions |
|
|
67
65
|
| "how should I approach X?" | User wants recommendation with reasoning |
|
|
68
|
-
| "wayfind" / "chart a course" | User needs a multi-session investigation map — escalate to `sp:wayfinder` (Phase 2) |
|
|
69
66
|
|
|
70
67
|
**NOT for:**
|
|
71
68
|
- Pure research (delegate to research skills inline by default; escalate via `spur agent run` only on a subprocess trigger)
|
|
72
69
|
- Task creation without ideation (use `sp:spur-dev` instead)
|
|
73
70
|
- Fact-checking or verification only (use `sp:source-driven-development` instead)
|
|
74
71
|
- Task file operations (use `sp:spur-cli` instead)
|
|
75
|
-
- Multi-session investigation when the destination itself is foggy (
|
|
72
|
+
- Multi-session investigation when the destination itself is foggy (recommend `/sp:dev-find-way`; see [Scope Check](#scope-check-end-of-phase-1))
|
|
76
73
|
|
|
77
74
|
## Core Principles
|
|
78
75
|
|
|
@@ -317,51 +314,16 @@ non-deterministic intent into a reliable sequence, not bare forwarders (ADR-016)
|
|
|
317
314
|
|
|
318
315
|
---
|
|
319
316
|
|
|
320
|
-
##
|
|
317
|
+
## Scope Check (end of Phase 1)
|
|
321
318
|
|
|
322
|
-
|
|
319
|
+
Before ideation, ask: **"Can this be spec'd in one session, or is the destination itself still foggy?"**
|
|
323
320
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
**Signals that wayfinding is needed:**
|
|
331
|
-
- The topic touches ≥3 subsystems or unknown boundaries
|
|
332
|
-
- Key decisions depend on research not yet done
|
|
333
|
-
- The operator can describe the goal but not the shape of the solution
|
|
334
|
-
- Multiple "it depends" answers in the discovery interview
|
|
335
|
-
- The operator uses fog language: "I'm not sure yet", "we need to explore", "it depends on what we find"
|
|
336
|
-
|
|
337
|
-
**Signals that standard ideation suffices:**
|
|
338
|
-
- The destination is clear; only the approach is in question
|
|
339
|
-
- All key decisions can be made from existing knowledge
|
|
340
|
-
- The operator can enumerate the constraints and trade-offs
|
|
341
|
-
|
|
342
|
-
### Escalation Path
|
|
343
|
-
|
|
344
|
-
When the scope check indicates a foggy destination, offer the escalation:
|
|
345
|
-
|
|
346
|
-
> *"This is a multi-session investigation. Want me to chart a wayfinder map so we can work through it one decision at a time?"*
|
|
347
|
-
|
|
348
|
-
The operator **confirms** before wayfinding begins — never silently escalate. A 30-minute quick-answer need might touch a big domain without requiring a multi-session map.
|
|
349
|
-
|
|
350
|
-
On confirmation, delegate to `sp:wayfinder` for the "Chart the map" mode. The resolved decision tree from Phase 1 seeds the map's **## Notes** and initial **## Not yet specified** sections.
|
|
351
|
-
|
|
352
|
-
### `--wayfind` Flag
|
|
353
|
-
|
|
354
|
-
When `/sp:dev-brainstorm` is invoked with `--wayfind`, the scope check is **skipped** — the operator has pre-approved the escalation. After the discovery interview, proceed directly to `sp:wayfinder` charting without the confirmation prompt.
|
|
355
|
-
|
|
356
|
-
Use `--wayfind` when:
|
|
357
|
-
- The operator already knows this is a multi-session investigation
|
|
358
|
-
- A previous session recommended wayfinding
|
|
359
|
-
- The topic is explicitly exploratory ("explore the solution space for X")
|
|
360
|
-
|
|
361
|
-
### Integration with the Design Approval Gate
|
|
362
|
-
|
|
363
|
-
A wayfinding escalation **replaces** the standard ideation output. The map feature (with its destination, notes, fog, and child tickets) is the artifact. The `needs_design` signal is not emitted — wayfinding defers design until the route to the destination is clear. When the last ticket resolves, the final session hands off to standard `sp:brainstorm` → `sp:spec-decomposition` with a now-clear destination.
|
|
321
|
+
Fog signals: the topic touches ≥3 subsystems or unknown boundaries; key decisions depend on research
|
|
322
|
+
not yet done; the operator can name the goal but not the solution's shape; repeated "it depends"
|
|
323
|
+
answers. When they dominate, **stop** — do not ideate toward a destination that isn't there. Report
|
|
324
|
+
the resolved decision tree and recommend `/sp:dev-find-way "<topic>"`, which owns multi-session
|
|
325
|
+
investigation maps. Brainstorm never charts a map itself.
|
|
364
326
|
|
|
365
327
|
---
|
|
366
328
|
|
|
367
|
-
**Remember:** Ideation ≠ Research. Generate approaches with trade-offs. Delegate verification to `sp:source-driven-development`. Delegate synthesis/research inline (escalate to `spur agent run` only on a subprocess trigger). Delegate task creation to `sp:spur-dev`. When the destination itself is foggy,
|
|
329
|
+
**Remember:** Ideation ≠ Research. Generate approaches with trade-offs. Delegate verification to `sp:source-driven-development`. Delegate synthesis/research inline (escalate to `spur agent run` only on a subprocess trigger). Delegate task creation to `sp:spur-dev`. When the destination itself is foggy, stop and recommend `/sp:dev-find-way` — never force a spec that isn't ready.
|
|
@@ -40,6 +40,7 @@ A git worktree gives you an isolated working directory for a branch without stas
|
|
|
40
40
|
```bash
|
|
41
41
|
git worktree add ../<project>-<branch> <branch>
|
|
42
42
|
cd ../<project>-<branch>
|
|
43
|
+
spur projects add . 2>/dev/null || true # Register in projects.json for the Board project switcher
|
|
43
44
|
```
|
|
44
45
|
|
|
45
46
|
**When to use worktrees:**
|
|
@@ -28,6 +28,7 @@ A git worktree gives you an isolated working directory linked to the same reposi
|
|
|
28
28
|
```bash
|
|
29
29
|
git worktree add ../project-hotfix hotfix/critical-fix
|
|
30
30
|
cd ../project-hotfix && bun install --frozen-lockfile
|
|
31
|
+
spur projects add . 2>/dev/null || true # list it in the Board project switcher
|
|
31
32
|
```
|
|
32
33
|
|
|
33
34
|
The worktree directory is created alongside the main project. Name it `<project>-<branch>` for clarity.
|
|
@@ -104,6 +104,13 @@ only burns wall clock and context budget.
|
|
|
104
104
|
|
|
105
105
|
- **Run only targeted probes** to validate your changes: `bun test <file>`,
|
|
106
106
|
`bun test <file> --test-name-pattern "<test>"`, or `bunx tsc --noEmit` on a single package.
|
|
107
|
+
- **Run Spur through this tree's own entry point, never a bare `spur` (task 1110 R2).** Use the
|
|
108
|
+
invocation the pipeline supplies (`${vars.spurBin}`, e.g. `bun apps/cli/src/index.ts`) from the
|
|
109
|
+
execution tree — a bare `spur` on `PATH` resolves to the published bundle in `~/.bun/bin` or
|
|
110
|
+
`~/node_modules`, so a guard, a `task check` or a `task record` silently runs a different build
|
|
111
|
+
against a different tree. Same rule for the working directory: each shell call starts fresh, so
|
|
112
|
+
re-select the execution tree inside the call (`cd -- "$TREE"` plus the identity check) instead of
|
|
113
|
+
relying on a `cd` a previous call left behind.
|
|
107
114
|
- **NEVER run** `bun run test`, `bun run spur-check`, `bun run check`, or any other full-suite /
|
|
108
115
|
project-gate command from inside implement. These belong to the pipeline's `test` hop.
|
|
109
116
|
- **Full-suite budget: at most 2 per task** (task 0436 R2) — counted across the whole task run
|
|
@@ -117,7 +124,35 @@ only burns wall clock and context budget.
|
|
|
117
124
|
- If a targeted probe reveals a failure you cannot fix within implement scope, note it in
|
|
118
125
|
`## Solution` and let the `test` hop's fixall handle it — do not pre-empt the gate.
|
|
119
126
|
|
|
120
|
-
|
|
127
|
+
### Public-surface probe (task 1135 R1/R6/R8)
|
|
128
|
+
|
|
129
|
+
Narrow unit tests prove the seam you refactored, not the surface a user calls. Before this stage
|
|
130
|
+
reports done it runs **one end-to-end probe per new or changed public surface** — a CLI verb/flag,
|
|
131
|
+
an HTTP route, or a plugin script entry:
|
|
132
|
+
|
|
133
|
+
- against a **throwaway project root** (a temp dir), never the repo corpus or the execution tree's
|
|
134
|
+
tracked files;
|
|
135
|
+
- bounded: 120 s per invocation, output capped at 8 KiB, no network beyond the CLI under test;
|
|
136
|
+
- recorded as acceptance evidence: the **exact command** and its **observed output**;
|
|
137
|
+
- a failing probe is evidence, never a reason to mutate the corpus.
|
|
138
|
+
|
|
139
|
+
A service-layer test suite does **not** satisfy this. The gap it closes is measured: 19 service tests
|
|
140
|
+
green while `task create --feature <verifying>` failed end-to-end (task 1135 Background). If the stage
|
|
141
|
+
changed no public surface, report the single line
|
|
142
|
+
`probe: not-applicable (no public surface changed)` instead.
|
|
143
|
+
|
|
144
|
+
**Changed-path static self-check (R8)** — over the changed paths only, before reporting done:
|
|
145
|
+
|
|
146
|
+
- `spur rule run` with the configured pre-check preset (catches a direct `process.env` read, the
|
|
147
|
+
`env-var-hygiene` rule, and its siblings);
|
|
148
|
+
- `bun run script-contract-check` when a plugin script was touched (a stale generated `.mjs` twin);
|
|
149
|
+
- the paired-script parity test when `package.json` changed (a half-updated `spur-check` /
|
|
150
|
+
`spur-check-new` chain).
|
|
151
|
+
|
|
152
|
+
The single full project check stays the pipeline `test` hop's job (see the section above); these are
|
|
153
|
+
changed-path checks, not that gate.
|
|
154
|
+
|
|
155
|
+
## Changed-path targeted checks (dependency-aware verification, task 0510 R3 / task 1142 R3)
|
|
121
156
|
|
|
122
157
|
"Run the narrow test first" needs a second half: *which* narrow tests, when a change to a shared
|
|
123
158
|
surface can break a downstream consumer. The matrix below is dependency-aware — domain → app →
|
|
@@ -126,6 +161,12 @@ implement. **It augments narrow behavior tests; it never authorizes `bun run spu
|
|
|
126
161
|
`bun run test`, or another full project check inside implement** — the pipeline's `test` hop owns
|
|
127
162
|
that single full gate.
|
|
128
163
|
|
|
164
|
+
**Worker iteration check order (task 1142 R3):**
|
|
165
|
+
1. The **changed-path matrix** below (narrow behavior tests + affected consumers);
|
|
166
|
+
2. the resolved `quality-gate` script in `light` mode (source-repo probe, else the installed twin) (biome on changed files, per-workspace typecheck, rule presets `rules:pre`/`rules:post`, related tests).
|
|
167
|
+
|
|
168
|
+
Neither step takes the host-wide full-gate lock. The full gate is named only for the pipeline's `test` and `test-recheck` hops.
|
|
169
|
+
|
|
129
170
|
| Changed surface | Required targeted tests | Required typechecks |
|
|
130
171
|
| --- | --- | --- |
|
|
131
172
|
| `packages/domain/src/**` public type/query | affected domain test; affected app service test; affected CLI command test | `@gobing-ai/spur-domain`, `@gobing-ai/spur-app`, `@gobing-ai/spur` |
|
|
@@ -143,6 +184,12 @@ that single full gate.
|
|
|
143
184
|
creep into every plugin edit.
|
|
144
185
|
- Run the applicable rows, then stop: the single full project check belongs to the pipeline's
|
|
145
186
|
`test` hop (`task-pipeline.yaml` `${vars.qualityGateCmd}`).
|
|
187
|
+
- **Mirrored surfaces: an edit lands on all of them.** When the change is one instance of a repeated
|
|
188
|
+
pattern — the same wiring rule on two runbooks, a signature in both a generator and its generated
|
|
189
|
+
`.d.mts`, a command chain in both `spur-check` and `spur-check-new` — grep for the siblings and
|
|
190
|
+
update each in this pass. Two H1-batch cycles (2026-10-08) were spent re-finding exactly this:
|
|
191
|
+
task 1129 fixed the guard wiring on one runbook and left its sibling, and task 1127 changed
|
|
192
|
+
`spur-check` while `spur-check-new`'s chain-parity assertion still expected the old chain.
|
|
146
193
|
|
|
147
194
|
## Behavior
|
|
148
195
|
|
|
@@ -165,7 +165,7 @@ classifies it as external and never raises `L4.stale-line-anchor` for it (R1). D
|
|
|
165
165
|
that lives in this repo — in-repo evidence MUST use the repo-relative backtick form
|
|
166
166
|
`` `path:line` `` / `` `path:start-end` ``, and citing it in the external form still reports (R2).
|
|
167
167
|
|
|
168
|
-
**Concrete anchors (0804 R9):**
|
|
168
|
+
**Concrete anchors (0804 R9):** existing `file:line`s only, never globs, always repo-root-relative — a basename is `L4.anchor-unresolved` at the `--as done` gate (`references/verdict-schema.md`).
|
|
169
169
|
|
|
170
170
|
### Step 5 — Acceptance Criteria guard
|
|
171
171
|
|
|
@@ -362,9 +362,8 @@ Confidence: HIGH
|
|
|
362
362
|
The per-requirement traceability table MUST use `| Req | Status | Evidence |` (exactly this header, no `R#`/`R`/`Requirement` variant — `Status` in column 2 — and no extra columns between Req and Status). The Acceptance Criteria table MUST use `| AC | Status | Evidence Type | Evidence |`.
|
|
363
363
|
The answer MUST carry exactly one `Confidence: HIGH|MEDIUM|LOW` line (task 1068): the verifier's stated confidence in the verdict — HIGH = fresh executable evidence + re-read anchors this run; MEDIUM = partial reliance on prior evidence, external/delegated outcomes, or an unstable tree; LOW = key evidence not re-executed. A missing or out-of-vocabulary line fails lint (`confidence-missing` / `confidence-value`) and blocks derivation; the value lands in the verdict artifact's `confidence` field and the recorded `## Testing` section.
|
|
364
364
|
The answer MUST cite a source for external API/library claims in Requirement/AC evidence cells: a cell asserting a scoped-package (`@scope/name`), `node_modules/`, semver-version (`x.y.z`), or backticked function-call (`` `name(args)` ``) claim is rejected with `evidence-citation` unless the SAME cell carries a citation — a repo `path:line(-end)` (backticked or bare), the external named-origin form (@origin `path` line N), or a URL. Cross-cell references ("receipt above") do not count; marker-free receipts ("bun test 398 pass / 0 fail") need no citation.
|
|
365
|
-
**MUST NOT:** place a `Severity` column between `Req` and `Status
|
|
366
|
-
|
|
367
|
-
canonical.
|
|
365
|
+
**MUST NOT:** place a `Severity` column between `Req` and `Status`. The parser tolerates variants
|
|
366
|
+
as defense-in-depth; this contract is canonical.
|
|
368
367
|
|
|
369
368
|
Under the pipeline, the verifier owns the answer file `.spur/run/<wbs>-verify-answer.txt` (0726
|
|
370
369
|
R3): `Verdict: PARTIAL` first, append one row at a time, replace the verdict line only when all
|
|
@@ -90,6 +90,9 @@ Before declaring a task `done`, run this lightweight checklist. It catches the m
|
|
|
90
90
|
- [ ] No `console.log` / `console.error` in production code (use the project logger).
|
|
91
91
|
- [ ] No `--no-verify`, `--force`, or new suppression comments added to bypass gates.
|
|
92
92
|
- [ ] Solution section contains `file:line` citations for every changed file.
|
|
93
|
+
- [ ] API/library claims in changed docs carry a source citation (URL or `path:line`) and an honest
|
|
94
|
+
confidence level (HIGH/MEDIUM/LOW) per source-driven-development; the deterministic advisory backstop is
|
|
95
|
+
the `cited-version-strings` / `cited-api-claims` rules (`.spur/rules/docs/sourced-api-claims.yaml`).
|
|
93
96
|
- [ ] Review section has P1–P4 findings table (even if all rows are empty — the table itself proves review happened).
|
|
94
97
|
|
|
95
98
|
This checklist runs as part of the verify step when the task reaches `testing` status. It does not replace the formal gates — it augments them with between-pipeline hygiene checks.
|
|
@@ -35,9 +35,43 @@ interface VerifyVerdict {
|
|
|
35
35
|
status: 'pass' | 'fail' | 'warn';
|
|
36
36
|
evidence: string;
|
|
37
37
|
}>;
|
|
38
|
+
/** Verifier confidence (task 1068 R3). REQUIRED for PASS — the done gate denies
|
|
39
|
+
* a confidence-less PASS. Accepted case-insensitively, normalized to uppercase. */
|
|
40
|
+
confidence?: 'HIGH' | 'MEDIUM' | 'LOW';
|
|
38
41
|
}
|
|
39
42
|
```
|
|
40
43
|
|
|
44
|
+
## Confidence level (task 1068 R3)
|
|
45
|
+
|
|
46
|
+
A PASS verdict must state the verifier's confidence: `"confidence": "HIGH" | "MEDIUM" | "LOW"`.
|
|
47
|
+
The value is case-insensitive on read (normalized to uppercase), but a present value outside the
|
|
48
|
+
enum invalidates the artifact, and a PASS with the field absent is denied at the `* → done`
|
|
49
|
+
transition with a remediation naming the field (`--force-done` remains the documented escape).
|
|
50
|
+
The verify answer's `Confidence:` lint rule (producer side) already guarantees the field for
|
|
51
|
+
pipeline-produced artifacts; this closes the hand-authored / pre-1068 artifact hole.
|
|
52
|
+
|
|
53
|
+
### Coherence: the level must be earned (task 1133)
|
|
54
|
+
|
|
55
|
+
Presence and vocabulary are not enough — the level has to match the rows in the same answer, so the
|
|
56
|
+
lint rejects a level that contradicts its own evidence. Two rejection classes, both addressed to the
|
|
57
|
+
`Confidence:` line and both capped by the shared `ANSWER_LINT_MAX_FINDINGS` budget:
|
|
58
|
+
|
|
59
|
+
- `confidence-unwarranted` — `HIGH` while any requirement row normalizes to `PARTIAL`/`UNMET`, any
|
|
60
|
+
acceptance-criteria row does not normalize to `MET`, or any `MET` row's evidence is hedged.
|
|
61
|
+
A `HIGH` claim says the evidence needs no re-check; a non-MET or hedged row says the opposite.
|
|
62
|
+
- `confidence-understated` — `LOW` while at least one requirement row exists and every requirement
|
|
63
|
+
and acceptance-criteria row normalizes to `MET`. The evidence already did the work, so `LOW`
|
|
64
|
+
misreports the state as unproven.
|
|
65
|
+
|
|
66
|
+
`MEDIUM` carries no coherence rule in either direction: it is the level a verifier uses for a caveat
|
|
67
|
+
with no row to point at, and closing it would force either an overclaimed `HIGH` or an unusable
|
|
68
|
+
`LOW`. The level is normalized to uppercase before the decision, so `high` is judged as `HIGH`.
|
|
69
|
+
|
|
70
|
+
Set the level from the rows, not the mood: all rows `MET` with fresh evidence is `HIGH`; a
|
|
71
|
+
`PARTIAL`/`UNMET` row or a hedge means `MEDIUM`, not `HIGH`. An unwarranted level does not merely
|
|
72
|
+
warn — the lint rejects the answer and no verdict artifact is written, so the level is worth
|
|
73
|
+
choosing deliberately before the verdict line is finalized.
|
|
74
|
+
|
|
41
75
|
## Compatibility alias: `scenario` row key
|
|
42
76
|
|
|
43
77
|
Task 0410 hardened the verdict reader. Producers SHOULD use the canonical `id` field for every
|
|
@@ -138,6 +172,23 @@ the run actually verified. Since 0804 R9 the checker ignores complete parsed cit
|
|
|
138
172
|
scanning for subjects, so a citation's filename (including snake_case paths) can never become a
|
|
139
173
|
false subject — a real absent symbol, nonexistent file, or invalid range still reports.
|
|
140
174
|
|
|
175
|
+
## Basename-only anchors are unresolved anchors (task 1110 R1)
|
|
176
|
+
|
|
177
|
+
`spur task verdict --from-answer` accepts the citation *shape*, but the `--as done` gate resolves
|
|
178
|
+
every Testing/Solution anchor against the repo root. A basename citation — `decision-events.ts:83`,
|
|
179
|
+
`task.test.ts:42` — reports `L4.anchor-unresolved` at **error** and blocks
|
|
180
|
+
`spur task update <wbs> done`, because the gate cannot tell which file the row meant. Write the
|
|
181
|
+
repo-root-relative form from the first pass:
|
|
182
|
+
|
|
183
|
+
- Right: `packages/app/src/decision/decision-events.ts:83`, `apps/cli/tests/commands/task.test.ts:42`
|
|
184
|
+
- Wrong: `decision-events.ts:83`, `../services/foo.ts:12`, `@gobing-ai/ts-x/src/persistence.ts:108`
|
|
185
|
+
(a scoped package is never repo-relative — use the external named-origin form below)
|
|
186
|
+
|
|
187
|
+
The pipeline's implement stage also runs a scoped `spur task migrate-anchors --wbs <wbs>` pass
|
|
188
|
+
before the proof capture (task 1109), but it qualifies **unique** basenames only: an ambiguous
|
|
189
|
+
basename (two tracked files share it) is reported and left untouched, and line drift and
|
|
190
|
+
`L4.anchor-subject-mismatch` are never repaired by that pass — those remain the author's rows.
|
|
191
|
+
|
|
141
192
|
## Source citations for external claims (task 1070)
|
|
142
193
|
|
|
143
194
|
A Requirement/AC evidence cell that asserts an external API/library claim must carry a verifiable
|
|
@@ -152,6 +203,23 @@ citation in the SAME cell, or lint rejects the row with `evidence-citation` (blo
|
|
|
152
203
|
satisfy it. Marker-free receipts (test counts, reviewed-log notes) need no citation. The check is
|
|
153
204
|
presence-only — which citation proves which claim is not deterministically decidable.
|
|
154
205
|
|
|
206
|
+
## Hedged evidence is rejected on MET rows
|
|
207
|
+
|
|
208
|
+
A MET row asserts the requirement is satisfied; evidence that hedges ("the guard likely prevents
|
|
209
|
+
the leak") contradicts the assertion the row is making. The lint rejects such rows with
|
|
210
|
+
`evidence-hedged`, naming the detected phrase, with two remedies: state the deterministic fact
|
|
211
|
+
with a concrete anchor, or downgrade the row to PARTIAL (which is what suspected-but-unproven
|
|
212
|
+
behavior actually is).
|
|
213
|
+
|
|
214
|
+
- Detected phrases (closed set, word-anchored, case-insensitive): `likely`, `unlikely`,
|
|
215
|
+
`probably`, `presumably`, `apparently`, `seems/seeming/seemingly to`, `appears to`. Modal verbs
|
|
216
|
+
(`might`/`may`/`could`/`should`) are deliberately out of set — they are constant in remediation
|
|
217
|
+
prose and would drown the signal.
|
|
218
|
+
- Only MET rows are scanned. Hedging a gap in an UNMET row ("the stale path likely still loads
|
|
219
|
+
the old bundle") is honest reporting and stays clean.
|
|
220
|
+
- Citation spans are stripped before scanning, so a filename or test name containing a hedge
|
|
221
|
+
word (`likely-match.test.ts`) cannot fire.
|
|
222
|
+
|
|
155
223
|
## Checks evidence
|
|
156
224
|
|
|
157
225
|
Wave C verification can emit the following additive `checks[]` rows:
|
|
@@ -11,7 +11,7 @@ description: >-
|
|
|
11
11
|
A guest is a session that **pulls** work: it is neither supervised nor restarted, it is addressed
|
|
12
12
|
by concrete id only, and it never receives a stage (`requiresCapabilities` stages can never route
|
|
13
13
|
to it — a guest carries no attestation). Joining registers an occupant row plus a heartbeat lease;
|
|
14
|
-
leaving (or an expired lease) releases it and returns any claimed messages to `
|
|
14
|
+
leaving (or an expired lease) releases it and returns any claimed messages to `queued`.
|
|
15
15
|
|
|
16
16
|
## Join
|
|
17
17
|
|
|
@@ -144,14 +144,21 @@ an explicit allowlist entry.
|
|
|
144
144
|
env dumps. Token estimates for Bash/Grep/Glob use response size **after a 4 KiB cap** and secret
|
|
145
145
|
scrub; omit `tokens` when unknown (never `0`).
|
|
146
146
|
|
|
147
|
+
**Session lifecycle:** `.spur/context/.session.json` is a private pointer to the in-flight session.
|
|
148
|
+
It records the creating host's owner identity (`{host, sessionId}` — Claude's hook `session_id`, Pi's
|
|
149
|
+
session-manager id) and only that owner's `SessionEnd` / `session_shutdown` may write the rollup and
|
|
150
|
+
remove the pointer. A nested run reuses the parent's ledger for tool recording but cannot finalize
|
|
151
|
+
or delete it; an ownerless (legacy) pointer is never finalized and expires under the existing
|
|
152
|
+
idle-start window instead.
|
|
153
|
+
|
|
147
154
|
```jsonl
|
|
148
|
-
{"ts":"2026-07-09T14:23:01Z","session":"session-2026-07-09-
|
|
149
|
-
{"ts":"2026-07-09T14:23:15Z","session":"session-2026-07-09-
|
|
150
|
-
{"ts":"2026-07-09T14:24:00Z","session":"session-2026-07-09-
|
|
151
|
-
{"ts":"2026-07-12T15:00:00Z","session":"session-2026-07-12-
|
|
152
|
-
{"ts":"2026-07-12T15:00:01Z","session":"session-2026-07-12-
|
|
153
|
-
{"ts":"2026-07-12T15:00:02Z","session":"session-2026-07-12-
|
|
154
|
-
{"ts":"2026-07-09T14:30:00Z","session":"session-2026-07-09-
|
|
155
|
+
{"ts":"2026-07-09T14:23:01Z","session":"session-2026-07-09-142318-a1b2c3d4","type":"session_start"}
|
|
156
|
+
{"ts":"2026-07-09T14:23:15Z","session":"session-2026-07-09-142318-a1b2c3d4","type":"read","file":"src/dao.ts","tokens":648}
|
|
157
|
+
{"ts":"2026-07-09T14:24:00Z","session":"session-2026-07-09-142318-a1b2c3d4","type":"write","file":"src/dao.ts","tokens":222,"action":"edit"}
|
|
158
|
+
{"ts":"2026-07-12T15:00:00Z","session":"session-2026-07-12-150007-e5f6a7b8","type":"bash","summary":"ls -la","tokens":12}
|
|
159
|
+
{"ts":"2026-07-12T15:00:01Z","session":"session-2026-07-12-150007-e5f6a7b8","type":"grep","summary":"/TODO/ src"}
|
|
160
|
+
{"ts":"2026-07-12T15:00:02Z","session":"session-2026-07-12-150007-e5f6a7b8","type":"glob","summary":"**/*.test.ts"}
|
|
161
|
+
{"ts":"2026-07-09T14:30:00Z","session":"session-2026-07-09-142318-a1b2c3d4","type":"session_end","totals":{"reads":5,"writes":19,"tokens":2783}}
|
|
155
162
|
```
|
|
156
163
|
|
|
157
164
|
**Never edit `token-ledger.jsonl` by hand.** It feeds the Board **Observability → Tool Using** tab.
|
|
@@ -104,7 +104,7 @@ was meant to avoid. Let the reviewer reach its own conclusion.
|
|
|
104
104
|
|
|
105
105
|
- **`sp:spur-dev`** owns task selection and lifecycle. When a batch contains independent tasks, the spine consults this skill for the fan-out pattern.
|
|
106
106
|
- **`sp:super-planner`** is the orchestrator that executes the fan-out. Its parallel mode (documented in its agent definition) applies the patterns from this skill.
|
|
107
|
-
- **`/sp:dev-parallel`** is the
|
|
107
|
+
- **`/sp:dev-runall --mode parallel|auto`** is the task-batch entry point; its `batch-plan.mjs order` schedule applies this skill's dependency and file-overlap rows deterministically.
|
|
108
108
|
|
|
109
109
|
## When to use
|
|
110
110
|
|
|
@@ -135,7 +135,7 @@ Do **not** use this skill for:
|
|
|
135
135
|
|
|
136
136
|
- **`sp:spur-dev`** — the orchestration spine that consults this skill for fan-out decisions.
|
|
137
137
|
- **`sp:super-planner`** — the batch orchestrator that executes fan-out patterns.
|
|
138
|
-
- **`/sp:dev-parallel`** — the slash command entry point for parallel
|
|
138
|
+
- **`/sp:dev-runall --mode parallel|auto`** — the slash command entry point for parallel task batches.
|
|
139
139
|
|
|
140
140
|
## Platform Notes
|
|
141
141
|
|
|
@@ -70,7 +70,7 @@ own axis.
|
|
|
70
70
|
Surface choice and model choice stay separate axes, but the invocation surface is where the
|
|
71
71
|
cheap-model hint is applied. On hosts whose native subagent invocation accepts a per-call model
|
|
72
72
|
override (Claude Code: the Agent tool's `model` parameter), dispatch read-only fan-out workers —
|
|
73
|
-
|
|
73
|
+
N-way investigation and competency-lens review's read-only lenses — with the host's
|
|
74
74
|
cheapest capable model. The rule is owned by
|
|
75
75
|
[fan-out-patterns.md § Cheap-model hint for read-only fan-out](fan-out-patterns.md#cheap-model-hint-for-read-only-fan-out)
|
|
76
76
|
and carries two prohibitions and one exemption: invocation-side only, **never** a subagent
|
|
@@ -134,13 +134,13 @@ blocker** — never a permission-probing subsystem:
|
|
|
134
134
|
[Keep a durable progress ledger](../SKILL.md#keep-a-durable-progress-ledger)).
|
|
135
135
|
|
|
136
136
|
Read-only investigation fan-out avoids the write-permission class by construction:
|
|
137
|
-
|
|
137
|
+
N-way investigation and competency-lens review's read-only lenses dispatch
|
|
138
138
|
**read-only worker shapes** — search/read tools only, with no write surface declared.
|
|
139
139
|
|
|
140
140
|
## Cheap-model hint for read-only fan-out
|
|
141
141
|
|
|
142
142
|
On hosts whose native subagent invocation accepts a per-call model override (Claude Code: the Agent
|
|
143
|
-
tool's `model` parameter), dispatch read-only fan-out workers —
|
|
143
|
+
tool's `model` parameter), dispatch read-only fan-out workers — N-way investigation
|
|
144
144
|
and competency-lens review's read-only lenses — with the host's cheapest capable model. The rule is
|
|
145
145
|
invocation-side, with two prohibitions and one exemption:
|
|
146
146
|
|
|
@@ -112,9 +112,13 @@ unrelated uncommitted changes make safe editing or committing ambiguous.
|
|
|
112
112
|
**Current-HEAD invariant.** Treat the PR's pushed `headRefOid` as the review identity. After every
|
|
113
113
|
preflight, push, commit, and request, record the returned HEAD and require `wait`, `collect`, and
|
|
114
114
|
the report to match that exact HEAD. A result for an older commit is stale; a result absent for the
|
|
115
|
-
current HEAD is pending, not clean.
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
current HEAD is pending, not clean. `wait` re-asserts this at two points, not one: at the start of
|
|
116
|
+
every poll, and again immediately before it emits FOUND/CLEAN/TIMEOUT — a head that moved while the
|
|
117
|
+
review was being fetched, or between polls, fails the wait (exit 2) instead of accepting an old-head
|
|
118
|
+
result. The pinned identity is the PR number AND the expected head, so a different PR appearing on
|
|
119
|
+
the branch is also a failure, never a silent retarget. Reject uncorrelated issue/conversation
|
|
120
|
+
comments rather than using them to manufacture a current-HEAD result. In `fix` mode, discard the old
|
|
121
|
+
result after the fix commit and judge only the forced re-review for the new pushed HEAD.
|
|
118
122
|
|
|
119
123
|
**Reviewer authority.** Codex is an independent reviewer, not an authority. For every finding that
|
|
120
124
|
may lead to a code change: inspect the referenced code, verify reachability and intended behavior,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: session-review
|
|
3
3
|
description: "Review the active coding-agent session: separate resolved from open issues with evidence, propose bounded improvements. With --fix auto (alias --triage), apply pure-doc / 1–2-line fixes inline and file the rest as tasks; with --fix all, fix every actionable finding inline and file none. Triggers: review this session, wrap-up, triage findings."
|
|
4
4
|
license: Apache-2.0
|
|
5
|
-
version: 1.
|
|
5
|
+
version: 1.3.0
|
|
6
6
|
metadata:
|
|
7
7
|
author: spur
|
|
8
8
|
platforms: "claude-code,codex,openclaw,opencode,antigravity,pi"
|
|
@@ -24,7 +24,9 @@ compact, evidence-backed report of outcomes, resolved issues, remaining risks, a
|
|
|
24
24
|
|
|
25
25
|
Use this skill immediately after focused operations when the operator asks what happened, what was
|
|
26
26
|
resolved, or how the session could improve. Use imported-history analysis for ended sessions,
|
|
27
|
-
cross-agent windows, recurrence, trends, or quantitative performance forensics
|
|
27
|
+
cross-agent windows, recurrence, trends, or quantitative performance forensics: on pi, run
|
|
28
|
+
`spur history analyze --source pi --session <file-stem>` where `<file-stem>` is the transcript
|
|
29
|
+
basename without `.jsonl` (e.g. `2026-10-07T22-44-33-625Z_01a1188a-…`), not the bare uuid.
|
|
28
30
|
|
|
29
31
|
## Arguments
|
|
30
32
|
|
|
@@ -92,7 +94,18 @@ issues with its evidence. Notes stay report-only.
|
|
|
92
94
|
operator prompt, read-only from the host transcript. Run it once without `--group` to list the
|
|
93
95
|
segments, then map them to stages (`"1-3,4,5-6"`). It splits each segment into `work` and
|
|
94
96
|
operator `wait` (idle before the next prompt plus AskUserQuestion answer time) and counts tokens
|
|
95
|
-
once per message id.
|
|
97
|
+
once per message id. On pi the transcript is `$PI_SESSION_FILE` (pass it as `--transcript` when
|
|
98
|
+
the run reports no host session id). **A measurement that returns `segments: []` with zero totals
|
|
99
|
+
while the session had operator prompts is an unreadable or stale adapter, not an empty session:**
|
|
100
|
+
compare the installed copy against this tree's `plugins/sp/scripts/session-timeline.mjs` and
|
|
101
|
+
refresh it with `superskill install sp` before reporting numbers; report `n/a` until then.
|
|
102
|
+
The transcript resolves from `--transcript`, else `CLAUDE_CODE_SESSION_ID`, else `PI_SESSION_FILE`
|
|
103
|
+
(the pi host sets it and no Claude session id); with none of them the measurement reports
|
|
104
|
+
`available:false` with a reason and the table renders `n/a` instead of guessing. A pi
|
|
105
|
+
`<skill name="…">` wrapper row is the OPERATOR'S own `/skill` invocation, not an injected body:
|
|
106
|
+
it opens a segment rendered `/<name> <args>` (or `/<name>` when no arguments follow the closing
|
|
107
|
+
tag), and the wrapper body never appears in the prompt excerpt. Only the operator's prompts
|
|
108
|
+
segment the session.
|
|
96
109
|
2. **Inventory outcomes.** List requested outcomes and classify each as completed, partial, blocked,
|
|
97
110
|
or not attempted. Collapse repeated attempts into one outcome.
|
|
98
111
|
3. **Classify issues.** For every material issue, distinguish resolved, open, or attempted. Record
|
|
@@ -140,10 +153,30 @@ step 4 excludes. Use `n/a` for any value not supported by the measurement.
|
|
|
140
153
|
| --- | --- | --- | --- | --- |
|
|
141
154
|
|
|
142
155
|
Evidence names the tool result, verification command, or concrete repository state visible in the
|
|
143
|
-
session. Do not list ordinary implementation steps as issues.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
156
|
+
session. Do not list ordinary implementation steps as issues.
|
|
157
|
+
|
|
158
|
+
**Confidence** is `HIGH`, `MEDIUM`, or `LOW` for that row's claim. The level is **derived from the
|
|
159
|
+
check that produced the claim, never assessed from how the row reads**, and the cell carries that
|
|
160
|
+
verifier (e.g. `HIGH — gate exit 0, /tmp/g0.log re-run this session`). Add the row's **falsifier**
|
|
161
|
+
when the level is not `HIGH`: what would have made it fail, or what moves it up. The same ladder
|
|
162
|
+
grades this report's Open-issues table.
|
|
163
|
+
|
|
164
|
+
| Level | Verifies when | Not this |
|
|
165
|
+
| --- | --- | --- |
|
|
166
|
+
| `HIGH` | An executed check in this session produced the result and its raw output is reachable (command + exit code, test counts, query row, gate log). Re-runnable now. | The code or change "looks correct"; a claim asserted only in prose. |
|
|
167
|
+
| `MEDIUM` | The claim is inferred from observed facts, rests on prior-session or delegated evidence, or names state that moved after the check (stale by construction). Name which of the three. | Presenting an inference as an observation. |
|
|
168
|
+
| `LOW` | No executable check was run. Name the missing evidence **and** the command that would ground it. | Dropping the row instead of marking it. |
|
|
169
|
+
|
|
170
|
+
Two guards against level inflation:
|
|
171
|
+
|
|
172
|
+
- Evidence that cannot be re-run, or that is only the agent's own summary, **caps the row at
|
|
173
|
+
`MEDIUM`** — a re-run is what promotes it.
|
|
174
|
+
- An all-`HIGH` multi-finding review is a signal the ladder was not applied, not a clean session.
|
|
175
|
+
Where every row genuinely is `HIGH`, the cells show distinct check results rather than repeated
|
|
176
|
+
phrasing.
|
|
177
|
+
|
|
178
|
+
Any API/library statement in a row cites the installed source as `path:line` or a URL, and a claim
|
|
179
|
+
the session could not ground is written `LOW` with the missing evidence named.
|
|
147
180
|
|
|
148
181
|
### Open issues and risks
|
|
149
182
|
|
|
@@ -101,6 +101,11 @@ line: `Verification: HIGH|MEDIUM|LOW — <first failing check and deviation, or
|
|
|
101
101
|
- **Honest confidence** — the stated HIGH/MEDIUM/LOW matches the evidence: HIGH requires a check against the pinned source this session; MEDIUM/LOW items are labeled, and LOW is never presented as fact.
|
|
102
102
|
- **HIGH** — all three checks pass. **MEDIUM** — coverage intact but some citations are off-version (latest docs for a pinned dependency) or secondary-source only. **LOW** — an API/library claim lacks any citation, or a LOW-confidence claim was asserted as fact.
|
|
103
103
|
|
|
104
|
+
Deterministic backstop: the `cited-version-strings` / `cited-api-claims` rules
|
|
105
|
+
(`.spur/rules/docs/sourced-api-claims.yaml`, run in `recommended-pre-check`) flag markdown lines that
|
|
106
|
+
assert version strings or time-anchored API claims with no citation anchor on the same line. They
|
|
107
|
+
are an info-severity advisory backstop for this contract (they do not gate; the checks above and the SECUA checklist are the enforcement points).
|
|
108
|
+
|
|
104
109
|
## Common Rationalizations
|
|
105
110
|
|
|
106
111
|
| Rationalization | Reality |
|
|
@@ -562,9 +562,11 @@ schema before emitting.
|
|
|
562
562
|
|
|
563
563
|
**Pass the deterministic task check.** Each `acceptance_criteria` bullet must be an exact feature
|
|
564
564
|
scenario title (L4.uncovered-task-scenario); add task-local checks as prose after the bullets, not
|
|
565
|
-
as extra bullets. No section body may use `HITL`, `
|
|
566
|
-
`
|
|
567
|
-
|
|
565
|
+
as extra bullets. No section body may use `HITL`, `merge event`, `content-gate`, `GATED`, or
|
|
566
|
+
`capstone` as standalone words (L4.gate-language); ambiguous words (`approval`, `approved`,
|
|
567
|
+
`merged`) warn only with a gating cue (`until`, `after`, `once`, `before`, `pending`, `blocked`,
|
|
568
|
+
`wait for`, `requires`) in the same sentence, so plain composition prose stays silent — say
|
|
569
|
+
"operator answer" / "accepted" instead, and keep enum values out of that list too.
|
|
568
570
|
|
|
569
571
|
**The order sidecar.** Also emit the private task-order sidecar at
|
|
570
572
|
`.spur/run/<runId>-idea-task-order.json`: a JSON array (one entry per batch item) of
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-cli
|
|
3
|
-
description: "Reference and operate the complete `spur` CLI surface: task, feature, rule, workflow, builder, agent, message, self, history, and projects. Use for verb or flag lookup, machine-readable output and exit contracts, or CLI-gated corpus writes. Triggers: \"spur task\", \"spur history\", \"spur projects\", \"create a task\", \"task check\", and any Spur CLI convention. Not for planning or execution lifecycle orchestration (`sp:spur-dev`)."
|
|
3
|
+
description: "Reference and operate the complete `spur` CLI surface: task, feature, rule, workflow, builder, agent, message, decision, self, history, and projects. Use for verb or flag lookup, machine-readable output and exit contracts, or CLI-gated corpus writes. Triggers: \"spur task\", \"spur history\", \"spur projects\", \"spur decision\", \"spur agent join\", \"create a task\", \"task check\", and any Spur CLI convention. Not for planning or execution lifecycle orchestration (`sp:spur-dev`)."
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: spur
|
|
@@ -17,6 +17,7 @@ metadata:
|
|
|
17
17
|
- builder
|
|
18
18
|
- agent
|
|
19
19
|
- message
|
|
20
|
+
- decision
|
|
20
21
|
- self
|
|
21
22
|
- history
|
|
22
23
|
- projects
|
|
@@ -44,7 +45,7 @@ Pick the noun, read its reference. Each Tier A and Tier B reference owns that no
|
|
|
44
45
|
| **Tier A** | **rule** | Constraint quality gate: run presets, author rules, fine-tune, validate rule files/presets, extend engine | [references/rules.md](references/rules.md) |
|
|
45
46
|
| **Tier A** | **workflow** | Dual-mode workflow runtime: author state-machine / transition-flow workflows, validate, run, read traces | [references/workflows.md](references/workflows.md) |
|
|
46
47
|
| **Tier A** | **builder** | Release plumbing: bump a package (or the `workspace:`-pinned set) with `bump-ver`, delete release tags with `drop-tags`, commit + tag + optional push | [references/builder.md](references/builder.md) |
|
|
47
|
-
| **Tier B** | **agent** | Coding-agent execution surface: run prompts via detected/named agents, list agent specs, start/stop supervised processes, readiness check | [references/agent.md](references/agent.md) |
|
|
48
|
+
| **Tier B** | **agent** | Coding-agent execution surface: run prompts via detected/named agents, list agent specs (incl. `agent.fleet` members), start/stop supervised processes, fleet `report`/`join`/`leave`/`wait`/`trace`, readiness check | [references/agent.md](references/agent.md) |
|
|
48
49
|
| **Tier B** | **message** | Durable inter-agent messaging: send, inbox, reply, watch | [references/message.md](references/message.md) |
|
|
49
50
|
| **Tier B** | **self** | Self-management verbs: scaffold (`init`), database maintenance (`maintain`), schema migrations (`migrate`), local web server (`serve`), status overview (`status`); `self init` runs post-scaffold validation probes & layout classification | [references/self.md](references/self.md) |
|
|
50
51
|
| **Tier B** | **history** | Import agent histories, aggregate forensic artifacts, render reports, and run the checkpoint-resumed daily pipeline | [references/history.md](references/history.md) |
|
|
@@ -142,6 +143,8 @@ and spreading it; full contract in `docs/04_DESIGN.md` §1.0.1.
|
|
|
142
143
|
[dispatch-surface rule](../parallel-execution/references/dispatch-surface.md).
|
|
143
144
|
- **[references/message.md](references/message.md)** - durable inter-agent messaging (`send`,
|
|
144
145
|
`inbox`, `reply`, `watch`).
|
|
146
|
+
- **[references/decision.md](references/decision.md)** - decision catalog (`list`, `show`, `run`,
|
|
147
|
+
`status`); offline by default via the built-in `typesafe` maker.
|
|
145
148
|
- **[references/self.md](references/self.md)** - `spur self init|maintain|migrate|serve|status` CLI verbs
|
|
146
149
|
(the five legacy top-level nouns remain hidden aliases). `self init` runs post-scaffold init
|
|
147
150
|
validation (Phase 1.5/1.6 probes).
|