@gobing-ai/spur 0.3.60 → 0.3.62
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.example.yaml +2 -2
- package/config/config.global.yaml +68 -57
- package/config/corpus-baseline.json +505 -57
- package/config/plugin-scripts.json +2 -2
- package/config/rules/boundary/config-loading-ownership.yaml +21 -0
- package/config/workflow-composition-baseline.json +1 -1
- package/config/workflows/history-anatomy.yaml +366 -0
- package/config/workflows/wayfinder-resolution.yaml +4 -6
- package/package.json +1 -1
- package/plugins/README.md +5 -4
- package/plugins/sp/README.md +22 -9
- package/plugins/sp/agents/super-planner.md +1 -1
- package/plugins/sp/commands/dev-find-issue.md +25 -46
- package/plugins/sp/commands/dev-pr-review.md +1 -1
- package/plugins/sp/commands/dev-run.md +22 -3
- package/plugins/sp/commands/dev-wrap.md +2 -2
- package/plugins/sp/commands/dev-wrapall.md +2 -2
- package/plugins/sp/lib/artifact-digest.generated.d.mts +7 -0
- package/plugins/sp/lib/artifact-digest.generated.mjs +48 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/roles.md +17 -14
- package/plugins/sp/scripts/history-anatomy-cache.mjs +669 -0
- package/plugins/sp/scripts/history-anatomy-cache.ts +818 -0
- package/plugins/sp/scripts/surface-drift-inventory.ts +51 -17
- package/plugins/sp/scripts/validate-commands.ts +11 -4
- package/plugins/sp/skills/code-verification/SKILL.md +1 -1
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -1
- package/plugins/sp/skills/history-anatomy/SKILL.md +67 -0
- package/plugins/sp/skills/history-anatomy/references/modes.md +82 -0
- package/plugins/sp/skills/history-anatomy/references/operations.md +67 -0
- package/plugins/sp/skills/history-anatomy/references/report-contract.md +133 -0
- package/plugins/sp/skills/issue-finding/SKILL.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
- package/plugins/sp/skills/pr-reviewing/SKILL.md +2 -2
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +1 -1
- package/plugins/sp/skills/spur-cli/references/init.md +1 -1
- package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows/operations.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows.md +4 -4
- package/plugins/sp/skills/spur-dev/SKILL.md +4 -4
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +4 -4
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +11 -11
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +1 -1
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +17 -4
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +8 -1
- package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +3 -2
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +25 -13
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +1 -1
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +5 -2
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +2 -2
- package/schemas/spur-config.schema.json +1 -1
- package/spur.js +1278 -890
- package/web/_astro/BoardApp.Z9jMwI9G.js +1 -0
- package/web/_astro/BoardApp.rkWGVwwK.js +178 -0
- package/web/_astro/{TaskDetail.B0l1uzsB.js → TaskDetail.B7ODt_bA.js} +1 -1
- package/web/_astro/{arc.DPruHC3P.js → arc.C5QRz6AQ.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.CuOqAck6.js → architectureDiagram-3BPJPVTR.CHptn8gZ.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.Cxb7HDIA.js → blockDiagram-GPEHLZMM.b1nEDkDw.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.Dw7wa-0S.js → c4Diagram-AAUBKEIU.BWj8S_Qq.js} +1 -1
- package/web/_astro/channel.BJtn6CGV.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.MECQitzo.js → chunk-2J33WTMH.q0BBuE1n.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.p3ofhIGE.js → chunk-4BX2VUAB.DP2KDkAU.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.BmQGsPZP.js → chunk-55IACEB6.CkCId72p.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.CwrK23OA.js → chunk-727SXJPM.oHWzxMot.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.CUKI_QXp.js → chunk-AQP2D5EJ.DkkgxfMP.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.7AtDgShM.js → chunk-FMBD7UC4.lmFJDvRK.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.f_YJbTs3.js → chunk-ND2GUHAM.52jt0eHK.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.0q7V3gEg.js → chunk-QZHKN3VN.Cg8KEFoD.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.C_hG3HMK.js → classDiagram-4FO5ZUOK.BuOUhxcD.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.C_hG3HMK.js → classDiagram-v2-Q7XG4LA2.BuOUhxcD.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.vsaaaEMy.js → cose-bilkent-S5V4N54A.BRUU8E_0.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.BN7XFqQ4.js → dagre-BM42HDAG.GDbfFYVV.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.ED6AfryZ.js → diagram-2AECGRRQ.CvIDBeJF.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.Dxllzg8R.js → diagram-5GNKFQAL.DMgJjWOX.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.RuWppieD.js → diagram-KO2AKTUF.njjl-0AP.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.CL32Xn6s.js → diagram-LMA3HP47.CcCqgP8M.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.CUneEhqB.js → diagram-OG6HWLK6.Btqd-YVE.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.DI-92Lec.js → erDiagram-TEJ5UH35.BbhML_Xo.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.69Aqa1FF.js → flowDiagram-I6XJVG4X.CkvsIgY8.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.DdpClZpa.js → ganttDiagram-6RSMTGT7.m8IWD_wW.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.xqWfkvB4.js → gitGraphDiagram-PVQCEYII.5z87HXO-.js} +1 -1
- package/web/_astro/index.nWve6EHS.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.B3G5sfKm.js → infoDiagram-5YYISTIA.Bvyvsd7Q.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.ahVNsoAQ.js → ishikawaDiagram-YF4QCWOH.DdWVYO87.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.PmFHLc-X.js → journeyDiagram-JHISSGLW.C3kOlYH1.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.Co1qOPTd.js → kanban-definition-UN3LZRKU.CfKTUHVC.js} +1 -1
- package/web/_astro/{linear.DoHZ-iRt.js → linear.CMDHnzgX.js} +1 -1
- package/web/_astro/{mermaid.core.DNRElYN2.js → mermaid.core.DN7-WrsP.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.CdfJZidJ.js → mindmap-definition-RKZ34NQL.DcQxLvqG.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.C1A8dby4.js → pieDiagram-4H26LBE5.Nu-Inbw6.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.NmZqjG_c.js → quadrantDiagram-W4KKPZXB.Dck2EChs.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.tY36zYtK.js → requirementDiagram-4Y6WPE33.C--E5XuW.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.rOEGZYjo.js → sankeyDiagram-5OEKKPKP.B_0iRNna.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.Dpnw3S9J.js → sequenceDiagram-3UESZ5HK.PKuKr9mk.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DGpvQ3Wz.js → stateDiagram-AJRCARHV.ClhGHb-O.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.CbwQdEfu.js → stateDiagram-v2-BHNVJYJU.Bv6BBnvg.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.DAYUpUJT.js → timeline-definition-PNZ67QCA.BZm2ZvAH.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.C7JCCd6-.js → vennDiagram-CIIHVFJN.Dt6yZXry.js} +1 -1
- package/web/_astro/{wardley-L42UT6IY.BGgwOH5_.js → wardley-L42UT6IY.rUs-E00M.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.oIZqzI2l.js → wardleyDiagram-YWT4CUSO.BcWgv4cA.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DohcJzqm.js → xychartDiagram-2RQKCTM6.DH-M-cX9.js} +1 -1
- package/web/index.html +2 -2
- package/plugins/sp/commands/dev-history-load.md +0 -63
- package/plugins/sp/scripts/history-load.mjs +0 -268
- package/plugins/sp/scripts/history-load.ts +0 -400
- package/web/_astro/BoardApp.BJs3l7O8.js +0 -179
- package/web/_astro/BoardApp.D8InuCYx.js +0 -1
- package/web/_astro/channel.XCf1DcsL.js +0 -1
- package/web/_astro/index.DJl2RAVZ.css +0 -1
|
@@ -1,37 +1,32 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "
|
|
2
|
+
description: "Generate the daily or ad-hoc history-anatomy diagnostic report over already-imported history: the eleven-section report contract, closed finding taxonomy, cache branch, bounded correction, and atomic publication. Triggers: find issues, post-mortem, performance analysis, session review, history-anatomy, run the daily report, ad-hoc diagnosis"
|
|
3
3
|
role: reviewer
|
|
4
|
-
argument-hint: "[<
|
|
5
|
-
allowed-tools: ["Bash", "Read", "
|
|
4
|
+
argument-hint: "[<focus>] [--mode <daily|ad-hoc>] [--date <YYYY-MM-DD>] [--since <RFC3339>] [--until <RFC3339>] [--recompute] [--agent <inline|auto|name>] [--output <path>]"
|
|
5
|
+
allowed-tools: ["Bash", "Read", "Skill"]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Dev Find Issue
|
|
9
9
|
|
|
10
|
-
Wraps the **sp:
|
|
11
|
-
The
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
Wraps the **sp:history-anatomy** skill — the independent owner of diagnostic interpretation over
|
|
11
|
+
already-imported history. The skill resolves the mode contract (daily is the default and uses the
|
|
12
|
+
current local calendar day; ad-hoc requires a focus plus two ordered bounds), owns the report
|
|
13
|
+
contract (eleven sections, closed finding taxonomy, evidence rules, recurrence ledger), and
|
|
14
|
+
exposes the `enrich` and `validate` operations the `history-anatomy.yaml` workflow invokes.
|
|
15
|
+
Publication is atomic and gated behind both the deterministic structure gate and independent
|
|
16
|
+
evidence validation. This command never triggers an import.
|
|
14
17
|
|
|
15
18
|
## Argument Flags
|
|
16
19
|
|
|
17
|
-
| Flag
|
|
18
|
-
|
|
|
19
|
-
| `[<
|
|
20
|
-
| `--
|
|
21
|
-
| `--
|
|
22
|
-
| `--
|
|
23
|
-
| `--
|
|
24
|
-
| `--
|
|
25
|
-
| `--
|
|
26
|
-
| `--
|
|
27
|
-
| `--since` `<iso>` | Start of the scan window. | configured |
|
|
28
|
-
| `--until` `<iso>` | End of the scan window. | now |
|
|
29
|
-
| `--top` `<n>` | Limit to top N findings. | omitted |
|
|
30
|
-
| `--min-cost` `<duration>` | Minimum wasted duration to report. | omitted |
|
|
31
|
-
| `--strict-topic` | Drop findings off-topic. | off |
|
|
32
|
-
| `--create-task` | Generate a fix task for findings. | off |
|
|
33
|
-
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | omit |
|
|
34
|
-
| `--json` | Emit structured JSON. | off |
|
|
20
|
+
| Flag | Description | Default |
|
|
21
|
+
| -------------------------------------- | -------------------------------------------------------------------------------------------------- | -------- |
|
|
22
|
+
| `[<focus>]` | Ad-hoc focus string (required in `--mode ad-hoc`; rejected in daily). | omitted |
|
|
23
|
+
| `--mode` `<daily\|ad-hoc>` | Report mode. Daily uses the current local calendar day. | daily |
|
|
24
|
+
| `--date` `<YYYY-MM-DD>` | Selects that local calendar day (daily; DST-aware). | today |
|
|
25
|
+
| `--since` `<RFC3339>` | Inclusive lower bound (ad-hoc; required). | omitted |
|
|
26
|
+
| `--until` `<RFC3339>` | Inclusive upper bound (ad-hoc; required). | omitted |
|
|
27
|
+
| `--recompute` | Force the full analyze/render/enrich/validate path; records disposition forced-recompute. | off |
|
|
28
|
+
| `--agent` `<inline\|auto\|name>` | Execution surface selector. | inline |
|
|
29
|
+
| `--output` `<path>` | Explicit report output path (ad-hoc; default writes to the run directory). | run dir |
|
|
35
30
|
|
|
36
31
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
37
32
|
|
|
@@ -39,31 +34,15 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
39
34
|
|
|
40
35
|
```
|
|
41
36
|
/sp:dev-find-issue
|
|
42
|
-
/sp:dev-find-issue
|
|
43
|
-
/sp:dev-find-issue --
|
|
44
|
-
/sp:dev-find-issue
|
|
45
|
-
/sp:dev-find-issue --category test-loop,guard --min-cost 30m
|
|
46
|
-
/sp:dev-find-issue --source claude --since 2026-07-28 --create-task --json
|
|
37
|
+
/sp:dev-find-issue --date 2026-08-24
|
|
38
|
+
/sp:dev-find-issue --mode ad-hoc --since 2026-08-01T00:00:00Z --until 2026-08-15T00:00:00Z "focus"
|
|
39
|
+
/sp:dev-find-issue --recompute
|
|
47
40
|
```
|
|
48
41
|
|
|
49
|
-
**Report-first (task 0556).** Default output is the markdown report to stdout; no task file is
|
|
50
|
-
written. Task creation moved behind `--create-task`. `--use-history` and `--no-task` are removed:
|
|
51
|
-
the history data plane is now the primary source (no flag needed), and the old report-only behavior
|
|
52
|
-
is the new default. Raw JSONL remains a fallback under the three conditions documented in
|
|
53
|
-
`sp:issue-finding`.
|
|
54
|
-
|
|
55
|
-
**Data-plane preflight.** Forensics read the imported history plane as-is. If findings come back
|
|
56
|
-
empty or stale, run `/sp:dev-history-load` (on-demand cumulative `spur history import` + analyze,
|
|
57
|
-
checkpoint resume — task 0567) before re-running forensics; it owns the interactive preflight, while
|
|
58
|
-
`spur history daily` owns the periodic cadence.
|
|
59
|
-
|
|
60
|
-
**See also:** skill `sp:issue-finding` (SSOT), `/sp:dev-runall`, `/sp:dev-dogfood`,
|
|
61
|
-
`sp:daily-summary`, `sp:reverse-engineering`.
|
|
62
|
-
|
|
63
42
|
## Implementation
|
|
64
43
|
|
|
65
|
-
Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface)
|
|
44
|
+
Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
66
45
|
|
|
67
46
|
```
|
|
68
|
-
Skill(skill="sp:
|
|
47
|
+
Skill(skill="sp:history-anatomy", args="$ARGUMENTS")
|
|
69
48
|
```
|
|
@@ -31,7 +31,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
31
31
|
|
|
32
32
|
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
33
33
|
- Delegate everything: `Skill(skill="sp:pr-reviewing", args="$ARGUMENTS")`. The skill owns mode
|
|
34
|
-
routing, finding triage, fix, and rules authoring;
|
|
34
|
+
routing, finding triage, fix, and rules authoring; `pr-review.yaml` is the SSOT
|
|
35
35
|
for the review spine's state order and guards; the staged `pr-reviewing.ts` is the
|
|
36
36
|
deterministic git/gh core every spine step shells out to.
|
|
37
37
|
- The external review goes through the GitHub PR and an `@codex review` comment only — never local
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Run a task — full pipeline (precheck→implement→test→review→approve→verify→record→done) or single-step (implement)
|
|
3
3
|
role: coder
|
|
4
|
-
argument-hint: "<wbs> [--mode <full|implement>] [--agent <inline|auto|name>] [--auto] [--next] [--wrap] [--continue]"
|
|
4
|
+
argument-hint: "<wbs> [--mode <full|implement>] [--agent <inline|auto|name>] [--auto] [--next] [--wrap] [--continue] [--worktree [<name>]]"
|
|
5
5
|
allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill"]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -20,12 +20,13 @@ Wraps the **sp:spur-dev** and **sp:code-implementation** skills.
|
|
|
20
20
|
| `--next` | Chain-to-completion via the next-router. | off |
|
|
21
21
|
| `--wrap` | Run the wrap hop after the main step. The `--agent` selector is preserved into the `/sp:dev-wrap <wbs>` handoff when supplied; omission remains omission. The wrap hop is workflow-backed and reports its trigger-3 subprocess override. | off |
|
|
22
22
|
| `--continue` | Resume an interrupted task from its checkpoint. | off |
|
|
23
|
+
| `--worktree` `[<name>]` | Run the task pipeline in an isolated git worktree; FF-merge on success, retain on failure. Bare `--worktree` creates a fresh tree; `--worktree <name>` adopts an existing worktree by name/path/branch. Full mode only. | off |
|
|
23
24
|
|
|
24
25
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
25
26
|
|
|
26
27
|
## Usage
|
|
27
28
|
|
|
28
|
-
/sp:dev-run <wbs> [--mode <full|implement>] [--agent <inline|auto|name>] [--auto] [--next] [--wrap] [--continue]
|
|
29
|
+
/sp:dev-run <wbs> [--mode <full|implement>] [--agent <inline|auto|name>] [--auto] [--next] [--wrap] [--continue] [--worktree [<name>]]
|
|
29
30
|
|
|
30
31
|
## Implementation
|
|
31
32
|
|
|
@@ -40,12 +41,30 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
40
41
|
|
|
41
42
|
- `--auto` | `--agent <inline|auto|name>` — Skip objective HITL confirmations (taste/irreversible gates still pause). `--agent` names who does the model-bearing work. Interactive omit/`inline` keeps the controller and implement-only stages in this session; full mode reads `task-pipeline.yaml` as the SSOT and interprets its actions/guards through the inline driver, where **omitted** `--agent`'s eligible `agent.run` stages may dispatch once to a native subagent and otherwise run in the host (task 0508); explicit `--agent inline` is the zero-dispatch carve-out — every stage executes in the invoking session. It records `stage <id> executed inline in session <session-id>` or `stage <id> executed via subagent <agent-id> (host session <session-id>)` in the run log. `auto` or a name is merged into `vars.agent` and `vars.implementAgent` and keeps the existing subprocess workflow. Headless `spur workflow run` / `spur agent run` is unchanged. See the [execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
42
43
|
|
|
44
|
+
`--worktree` `[<name>]` (run the task's pipeline in an isolated git worktree — FF-merge onto the
|
|
45
|
+
base ref on full success, retain intact on any failure/halt/non-FF; bare form creates a fresh tree,
|
|
46
|
+
`<name>` form adopts an existing worktree by name/path/branch). The lifecycle — dirty-tree precheck,
|
|
47
|
+
creation or adoption, crash-safe `.spur/run/` marker, merge-or-retain, `--continue` re-entry — is
|
|
48
|
+
`execution-batch.md` § Worktree isolation applied to a batch of one: marker `command` is `dev-run`
|
|
49
|
+
and `selector` is the `<wbs>`, the derived branch is `sp/run-<wbs>-<short-id>`, and the success
|
|
50
|
+
condition is the task reaching terminal `done` with no failed stage. A failing gate, a non-PASS
|
|
51
|
+
verify verdict, or a HITL pause that ends the run all take the retention path.
|
|
52
|
+
|
|
53
|
+
**`--worktree` is full-mode only.** `--worktree --mode implement` is **rejected**. `--mode implement`
|
|
54
|
+
*is* the pipeline's implement stage and runs in whatever tree the driver already set up (bug-742);
|
|
55
|
+
giving it a second worktree would split one task's evidence across two trees. Use `--worktree` on the
|
|
56
|
+
full-mode invocation, which carries the implement stage with it.
|
|
57
|
+
|
|
58
|
+
**`--worktree` corpus visibility.** While the task runs in a worktree, corpus writes (status
|
|
59
|
+
transitions, evidence sections, kanban) land in the worktree copy; your main tree still shows the
|
|
60
|
+
pre-run status until the FF-merge on success. This is expected, not a bug.
|
|
61
|
+
|
|
43
62
|
**Mode split (load-bearing — bug-742)**
|
|
44
63
|
|
|
45
64
|
| Mode | What runs | Must not do |
|
|
46
65
|
| --- | --- | --- |
|
|
47
66
|
| `--mode full` (default) | Interactive omit/inline: host-session driver over `task-pipeline.yaml`; explicit/headless executor: workflow subprocess | — |
|
|
48
|
-
| `--mode implement` | Single implement competency via `sp:code-implementation` | Re-launch the full pipeline, `spur workflow run …task-pipeline…`,
|
|
67
|
+
| `--mode implement` | Single implement competency via `sp:code-implementation` | Re-launch the full pipeline, `spur workflow run …task-pipeline…`, `/sp:dev-run` **without** `--mode implement`, or accept `--worktree` (rejected) |
|
|
49
68
|
|
|
50
69
|
The pipeline's `implement` step invokes this command **only** as:
|
|
51
70
|
|
|
@@ -28,7 +28,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
28
28
|
## Implementation
|
|
29
29
|
|
|
30
30
|
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
31
|
-
- Wrap stays **workflow-backed** — `spur workflow run
|
|
31
|
+
- Wrap stays **workflow-backed** — `spur workflow run wrapup-pipeline.yaml` is the only implementation; there is no inline wrap driver.
|
|
32
32
|
- Resolve the executor **before** launching the workflow:
|
|
33
33
|
- `--agent <name>` → pass the name unchanged into `vars.agent`.
|
|
34
34
|
- `--agent auto` → tier-resolve a concrete executor first, then merge it into `vars.agent`.
|
|
@@ -42,7 +42,7 @@ AGENT=… # resolved above: agent.default for omitted, tier-resolved for auto, u
|
|
|
42
42
|
echo "execution surface: subprocess; reason: trigger 3 — durable auditable run record required; requested agent: <inline|auto|name>; executor: $AGENT"
|
|
43
43
|
VARS=$(jq -nc --arg tasks "[\"$WBS\"]" --arg agent "$AGENT" --arg profile "$PROFILE" --arg merge "$MERGE" \
|
|
44
44
|
'{tasks:$tasks, agent:$agent, profile:$profile, merge:$merge}')
|
|
45
|
-
spur workflow run
|
|
45
|
+
spur workflow run wrapup-pipeline.yaml --vars "$VARS" [--dry-run]
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
The executor resolution is described in the bullets above; the snippet's `AGENT` variable carries
|
|
@@ -30,7 +30,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
30
30
|
## Implementation
|
|
31
31
|
|
|
32
32
|
- Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
33
|
-
- Wrap stays **workflow-backed** — `spur workflow run
|
|
33
|
+
- Wrap stays **workflow-backed** — `spur workflow run wrapup-pipeline.yaml` is the only implementation; there is no inline wrap driver.
|
|
34
34
|
- Resolve the executor **before** launching the workflow:
|
|
35
35
|
- `--agent <name>` → pass the name unchanged into `vars.agent`.
|
|
36
36
|
- `--agent auto` → tier-resolve a concrete executor first, then merge it into `vars.agent`.
|
|
@@ -44,7 +44,7 @@ AGENT=… # resolved above: agent.default for omitted, tier-resolved for auto, u
|
|
|
44
44
|
echo "execution surface: subprocess; reason: trigger 3 — durable auditable run record required; requested agent: <inline|auto|name>; executor: $AGENT"
|
|
45
45
|
VARS=$(jq -nc --arg tasks "$TASKS" --arg feature "$FEATURE" --arg agent "$AGENT" --arg profile "$PROFILE" --arg merge "$MERGE" \
|
|
46
46
|
'{tasks:$tasks, feature:$feature, agent:$agent, profile:$profile, merge:$merge}')
|
|
47
|
-
spur workflow run
|
|
47
|
+
spur workflow run wrapup-pipeline.yaml --vars "$VARS" [--dry-run]
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
The executor resolution is described in the bullets above; the snippet's `AGENT` variable carries
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED by scripts/commands/bundle-plugin-lib.ts — do not edit.
|
|
3
|
+
* Source of truth: packages/domain/src/analytics/artifact-digest.ts (task 0669).
|
|
4
|
+
*/
|
|
5
|
+
export declare const ARTIFACT_ARRAY_CLASSIFICATION: Readonly<Record<string, 'ranked' | 'set'>>;
|
|
6
|
+
export declare const RANKED_ARTIFACT_KEYS: ReadonlySet<string>;
|
|
7
|
+
export declare function semanticArtifactDigest(artifactJson: unknown): string;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// packages/domain/src/analytics/artifact-digest.ts
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
var ARTIFACT_ARRAY_CLASSIFICATION = {
|
|
4
|
+
byTool: "ranked",
|
|
5
|
+
bySession: "ranked",
|
|
6
|
+
topStepsByTokens: "ranked",
|
|
7
|
+
topStepsByDuration: "ranked",
|
|
8
|
+
topSteps: "ranked",
|
|
9
|
+
bottlenecks: "ranked",
|
|
10
|
+
coverage: "set",
|
|
11
|
+
daily: "set",
|
|
12
|
+
loops: "set",
|
|
13
|
+
warnings: "set",
|
|
14
|
+
pairings: "set",
|
|
15
|
+
ladderSnapshot: "set",
|
|
16
|
+
stepSupport: "set",
|
|
17
|
+
phases: "set",
|
|
18
|
+
tools: "set",
|
|
19
|
+
skills: "set",
|
|
20
|
+
sources: "set",
|
|
21
|
+
models: "set"
|
|
22
|
+
};
|
|
23
|
+
var RANKED_ARTIFACT_KEYS = new Set(Object.entries(ARTIFACT_ARRAY_CLASSIFICATION).filter(([, kind]) => kind === "ranked").map(([key]) => key));
|
|
24
|
+
function canonicalize(value, key) {
|
|
25
|
+
if (key === "generatedAt" || key === "validatedAt" || key === "baselineArtifactDigest")
|
|
26
|
+
return null;
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
const raw = value.map((v) => JSON.stringify(canonicalize(v, "")));
|
|
29
|
+
return RANKED_ARTIFACT_KEYS.has(key) ? raw : [...raw].sort();
|
|
30
|
+
}
|
|
31
|
+
if (value !== null && typeof value === "object") {
|
|
32
|
+
const out = {};
|
|
33
|
+
for (const k of Object.keys(value).sort()) {
|
|
34
|
+
out[k] = canonicalize(value[k], k);
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function semanticArtifactDigest(artifactJson) {
|
|
41
|
+
const material = JSON.stringify(canonicalize(artifactJson, "root"));
|
|
42
|
+
return createHash("sha256").update(material).digest("hex");
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
semanticArtifactDigest,
|
|
46
|
+
RANKED_ARTIFACT_KEYS,
|
|
47
|
+
ARTIFACT_ARRAY_CLASSIFICATION
|
|
48
|
+
};
|
package/plugins/sp/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sp",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.62",
|
|
4
4
|
"description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics.",
|
|
5
5
|
"extensions": {
|
|
6
6
|
"pi": ["./hooks/pi/guard-extension.ts"]
|
|
@@ -10,8 +10,9 @@ see_also:
|
|
|
10
10
|
# Roles — the Layer-1 role-to-tier table
|
|
11
11
|
|
|
12
12
|
The executor-selection contract is two layers. **Layer 1 (this file)** projects *role → tier*;
|
|
13
|
-
its SSOT is `
|
|
14
|
-
|
|
13
|
+
its SSOT is `agent.roles` in `config/config.global.yaml` (task 0647 / ADR-078) — this file is the
|
|
14
|
+
agent/human-facing view plus the plugin-owned command→role mapping. `DEFAULT_AGENT_ROLES` in
|
|
15
|
+
`packages/config/src/index.ts` is the no-filesystem fallback and must remain identical. **Layer 2** maps
|
|
15
16
|
*tier → executor* and is owned by the operator in `.spur/config.yaml`. This file never names an
|
|
16
17
|
executor, a model, or a vendor — it declares only what tier a role's work needs, and the
|
|
17
18
|
operator's config decides which executor serves that tier.
|
|
@@ -38,9 +39,10 @@ collapse, named as people so they stay addressable in `--agent`.
|
|
|
38
39
|
|
|
39
40
|
## The table
|
|
40
41
|
|
|
41
|
-
<!-- PROJECTION (task
|
|
42
|
-
of
|
|
43
|
-
plugins/sp/tests/roles.test.ts (R9) fails the suite on any drift
|
|
42
|
+
<!-- PROJECTION (task 0647 / ADR-078): the tier/stages half of the block below is a generated view
|
|
43
|
+
of agent.roles in config/config.global.yaml — edit that SSOT, not this file.
|
|
44
|
+
plugins/sp/tests/roles.test.ts (R9) fails the suite on any three-way drift with the
|
|
45
|
+
DEFAULT_AGENT_ROLES no-filesystem fallback. The
|
|
44
46
|
`commands:` half is plugin data (command frontmatter is its SSOT). -->
|
|
45
47
|
|
|
46
48
|
```yaml
|
|
@@ -48,7 +50,7 @@ version: 1
|
|
|
48
50
|
roles:
|
|
49
51
|
- id: scribe
|
|
50
52
|
tier: cheap
|
|
51
|
-
commands: [dev-gitmsg, dev-handover, dev-daily, dev-
|
|
53
|
+
commands: [dev-gitmsg, dev-handover, dev-daily, dev-changelog, dev-refresh, rule-add, rule-refine, workflow-add, workflow-refine, spur-init]
|
|
52
54
|
stages: [changelog]
|
|
53
55
|
- id: coder
|
|
54
56
|
tier: standard
|
|
@@ -81,26 +83,27 @@ must not sit below the highest `min_tier` among its folded stages.
|
|
|
81
83
|
- **`reviewer` (capable-1).** Verification and analysis: per-task verify/review, batch verify,
|
|
82
84
|
dogfooding, anti-pattern scanning (`rule-scan`), and the two audit commands (`dev-find-conflict`,
|
|
83
85
|
`dev-find-issue`) — those analyse rather than transcribe, which is why they sit here and not
|
|
84
|
-
under `scribe`. Folds `verify`, `review`, `dogfood`.
|
|
86
|
+
under `scribe`. `dev-find-issue` now routes through the `sp:history-anatomy` skill (mode contract + report contract). Folds `verify`, `review`, `dogfood`.
|
|
85
87
|
- **`planner` (capable-2).** The planning half: feature planning, requirement refinement (single
|
|
86
88
|
and batch), brainstorm, idea intake, batch run/parallel orchestration, next-step routing,
|
|
87
89
|
architecture survey, feature-frontier prioritization, and feature-tree restructure. Folds `plan`,
|
|
88
90
|
`refine`, `brainstorm`.
|
|
89
91
|
|
|
90
92
|
**Placement notes (directory closure, task 0535).** The decided four-row table listed 31 commands;
|
|
91
|
-
the live `plugins/sp/commands/` directory has 39
|
|
93
|
+
the live `plugins/sp/commands/` directory has 38 (39 at the time of the mapping; `dev-history-load`
|
|
94
|
+
was removed in HA-S1 0661). The six additional commands were placed by the
|
|
92
95
|
same stage logic: `dev-refineall` folds `refine` → planner; `dev-find-next` is planning-side
|
|
93
96
|
frontier work → planner; `dev-feature-change` is planning-half corpus surgery on the feature tree →
|
|
94
97
|
planner; `dev-gtd` is the execution/delivery flow → coder; `dev-find-conflict` and `dev-find-issue`
|
|
95
|
-
are audits/analysis → reviewer (same reasoning as `rule-scan`). Later additions: `dev-
|
|
96
|
-
is mechanical load+analyze orchestration → scribe; `dev-pr-review` is review orchestration —
|
|
98
|
+
are audits/analysis → reviewer (same reasoning as `rule-scan`). Later additions: `dev-pr-review` is review orchestration —
|
|
97
99
|
driving the external PR review and triaging its findings folds the `review` stage → reviewer.
|
|
98
100
|
|
|
99
101
|
**Consistency is a test, not a convention.** `plugins/sp/tests/roles.test.ts` parses this YAML and
|
|
100
102
|
asserts the tier-distinctness, command closure, stage-floor, and boundary invariants against the
|
|
101
|
-
real command directory, the real stage registry, and the real operator config — plus parity
|
|
102
|
-
`DEFAULT_AGENT_ROLES` (R9,
|
|
103
|
-
id/tier/stages. When the table and the registry disagree,
|
|
104
|
-
test. When the
|
|
103
|
+
real command directory, the real stage registry, and the real operator config — plus three-way parity
|
|
104
|
+
with `config/config.global.yaml` and `DEFAULT_AGENT_ROLES` (R9, 0647): the table above must equal the
|
|
105
|
+
shipped SSOT and no-filesystem fallback on id/tier/stages. When the table and the registry disagree,
|
|
106
|
+
fix the table or the registry — never the test. When the three role tables disagree, fix the shipped
|
|
107
|
+
SSOT first, then regenerate the projections.
|
|
105
108
|
A project may re-tier/re-stage a role at config time via `agent.roles` (closed vocabulary) — that
|
|
106
109
|
override never flows back into this file.
|