@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.
Files changed (110) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +2 -2
  3. package/config/config.global.yaml +68 -57
  4. package/config/corpus-baseline.json +505 -57
  5. package/config/plugin-scripts.json +2 -2
  6. package/config/rules/boundary/config-loading-ownership.yaml +21 -0
  7. package/config/workflow-composition-baseline.json +1 -1
  8. package/config/workflows/history-anatomy.yaml +366 -0
  9. package/config/workflows/wayfinder-resolution.yaml +4 -6
  10. package/package.json +1 -1
  11. package/plugins/README.md +5 -4
  12. package/plugins/sp/README.md +22 -9
  13. package/plugins/sp/agents/super-planner.md +1 -1
  14. package/plugins/sp/commands/dev-find-issue.md +25 -46
  15. package/plugins/sp/commands/dev-pr-review.md +1 -1
  16. package/plugins/sp/commands/dev-run.md +22 -3
  17. package/plugins/sp/commands/dev-wrap.md +2 -2
  18. package/plugins/sp/commands/dev-wrapall.md +2 -2
  19. package/plugins/sp/lib/artifact-digest.generated.d.mts +7 -0
  20. package/plugins/sp/lib/artifact-digest.generated.mjs +48 -0
  21. package/plugins/sp/plugin.json +1 -1
  22. package/plugins/sp/references/roles.md +17 -14
  23. package/plugins/sp/scripts/history-anatomy-cache.mjs +669 -0
  24. package/plugins/sp/scripts/history-anatomy-cache.ts +818 -0
  25. package/plugins/sp/scripts/surface-drift-inventory.ts +51 -17
  26. package/plugins/sp/scripts/validate-commands.ts +11 -4
  27. package/plugins/sp/skills/code-verification/SKILL.md +1 -1
  28. package/plugins/sp/skills/code-verification/references/verdict-schema.md +1 -1
  29. package/plugins/sp/skills/history-anatomy/SKILL.md +67 -0
  30. package/plugins/sp/skills/history-anatomy/references/modes.md +82 -0
  31. package/plugins/sp/skills/history-anatomy/references/operations.md +67 -0
  32. package/plugins/sp/skills/history-anatomy/references/report-contract.md +133 -0
  33. package/plugins/sp/skills/issue-finding/SKILL.md +1 -1
  34. package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
  35. package/plugins/sp/skills/pr-reviewing/SKILL.md +2 -2
  36. package/plugins/sp/skills/spec-decomposition/references/decomposition.md +1 -1
  37. package/plugins/sp/skills/spur-cli/references/init.md +1 -1
  38. package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +1 -1
  39. package/plugins/sp/skills/spur-cli/references/workflows/operations.md +1 -1
  40. package/plugins/sp/skills/spur-cli/references/workflows.md +4 -4
  41. package/plugins/sp/skills/spur-dev/SKILL.md +4 -4
  42. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +4 -4
  43. package/plugins/sp/skills/spur-dev/references/dev-operations.md +11 -11
  44. package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +1 -1
  45. package/plugins/sp/skills/spur-dev/references/execution-batch.md +17 -4
  46. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +8 -1
  47. package/plugins/sp/skills/spur-dev/references/feature-link-helper.md +3 -2
  48. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +25 -13
  49. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +1 -1
  50. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +5 -2
  51. package/plugins/sp/skills/spur-dev/references/planning-workflow.md +2 -2
  52. package/schemas/spur-config.schema.json +1 -1
  53. package/spur.js +1278 -890
  54. package/web/_astro/BoardApp.Z9jMwI9G.js +1 -0
  55. package/web/_astro/BoardApp.rkWGVwwK.js +178 -0
  56. package/web/_astro/{TaskDetail.B0l1uzsB.js → TaskDetail.B7ODt_bA.js} +1 -1
  57. package/web/_astro/{arc.DPruHC3P.js → arc.C5QRz6AQ.js} +1 -1
  58. package/web/_astro/{architectureDiagram-3BPJPVTR.CuOqAck6.js → architectureDiagram-3BPJPVTR.CHptn8gZ.js} +1 -1
  59. package/web/_astro/{blockDiagram-GPEHLZMM.Cxb7HDIA.js → blockDiagram-GPEHLZMM.b1nEDkDw.js} +1 -1
  60. package/web/_astro/{c4Diagram-AAUBKEIU.Dw7wa-0S.js → c4Diagram-AAUBKEIU.BWj8S_Qq.js} +1 -1
  61. package/web/_astro/channel.BJtn6CGV.js +1 -0
  62. package/web/_astro/{chunk-2J33WTMH.MECQitzo.js → chunk-2J33WTMH.q0BBuE1n.js} +1 -1
  63. package/web/_astro/{chunk-4BX2VUAB.p3ofhIGE.js → chunk-4BX2VUAB.DP2KDkAU.js} +1 -1
  64. package/web/_astro/{chunk-55IACEB6.BmQGsPZP.js → chunk-55IACEB6.CkCId72p.js} +1 -1
  65. package/web/_astro/{chunk-727SXJPM.CwrK23OA.js → chunk-727SXJPM.oHWzxMot.js} +1 -1
  66. package/web/_astro/{chunk-AQP2D5EJ.CUKI_QXp.js → chunk-AQP2D5EJ.DkkgxfMP.js} +1 -1
  67. package/web/_astro/{chunk-FMBD7UC4.7AtDgShM.js → chunk-FMBD7UC4.lmFJDvRK.js} +1 -1
  68. package/web/_astro/{chunk-ND2GUHAM.f_YJbTs3.js → chunk-ND2GUHAM.52jt0eHK.js} +1 -1
  69. package/web/_astro/{chunk-QZHKN3VN.0q7V3gEg.js → chunk-QZHKN3VN.Cg8KEFoD.js} +1 -1
  70. package/web/_astro/{classDiagram-4FO5ZUOK.C_hG3HMK.js → classDiagram-4FO5ZUOK.BuOUhxcD.js} +1 -1
  71. package/web/_astro/{classDiagram-v2-Q7XG4LA2.C_hG3HMK.js → classDiagram-v2-Q7XG4LA2.BuOUhxcD.js} +1 -1
  72. package/web/_astro/{cose-bilkent-S5V4N54A.vsaaaEMy.js → cose-bilkent-S5V4N54A.BRUU8E_0.js} +1 -1
  73. package/web/_astro/{dagre-BM42HDAG.BN7XFqQ4.js → dagre-BM42HDAG.GDbfFYVV.js} +1 -1
  74. package/web/_astro/{diagram-2AECGRRQ.ED6AfryZ.js → diagram-2AECGRRQ.CvIDBeJF.js} +1 -1
  75. package/web/_astro/{diagram-5GNKFQAL.Dxllzg8R.js → diagram-5GNKFQAL.DMgJjWOX.js} +1 -1
  76. package/web/_astro/{diagram-KO2AKTUF.RuWppieD.js → diagram-KO2AKTUF.njjl-0AP.js} +1 -1
  77. package/web/_astro/{diagram-LMA3HP47.CL32Xn6s.js → diagram-LMA3HP47.CcCqgP8M.js} +1 -1
  78. package/web/_astro/{diagram-OG6HWLK6.CUneEhqB.js → diagram-OG6HWLK6.Btqd-YVE.js} +1 -1
  79. package/web/_astro/{erDiagram-TEJ5UH35.DI-92Lec.js → erDiagram-TEJ5UH35.BbhML_Xo.js} +1 -1
  80. package/web/_astro/{flowDiagram-I6XJVG4X.69Aqa1FF.js → flowDiagram-I6XJVG4X.CkvsIgY8.js} +1 -1
  81. package/web/_astro/{ganttDiagram-6RSMTGT7.DdpClZpa.js → ganttDiagram-6RSMTGT7.m8IWD_wW.js} +1 -1
  82. package/web/_astro/{gitGraphDiagram-PVQCEYII.xqWfkvB4.js → gitGraphDiagram-PVQCEYII.5z87HXO-.js} +1 -1
  83. package/web/_astro/index.nWve6EHS.css +1 -0
  84. package/web/_astro/{infoDiagram-5YYISTIA.B3G5sfKm.js → infoDiagram-5YYISTIA.Bvyvsd7Q.js} +1 -1
  85. package/web/_astro/{ishikawaDiagram-YF4QCWOH.ahVNsoAQ.js → ishikawaDiagram-YF4QCWOH.DdWVYO87.js} +1 -1
  86. package/web/_astro/{journeyDiagram-JHISSGLW.PmFHLc-X.js → journeyDiagram-JHISSGLW.C3kOlYH1.js} +1 -1
  87. package/web/_astro/{kanban-definition-UN3LZRKU.Co1qOPTd.js → kanban-definition-UN3LZRKU.CfKTUHVC.js} +1 -1
  88. package/web/_astro/{linear.DoHZ-iRt.js → linear.CMDHnzgX.js} +1 -1
  89. package/web/_astro/{mermaid.core.DNRElYN2.js → mermaid.core.DN7-WrsP.js} +4 -4
  90. package/web/_astro/{mindmap-definition-RKZ34NQL.CdfJZidJ.js → mindmap-definition-RKZ34NQL.DcQxLvqG.js} +1 -1
  91. package/web/_astro/{pieDiagram-4H26LBE5.C1A8dby4.js → pieDiagram-4H26LBE5.Nu-Inbw6.js} +1 -1
  92. package/web/_astro/{quadrantDiagram-W4KKPZXB.NmZqjG_c.js → quadrantDiagram-W4KKPZXB.Dck2EChs.js} +1 -1
  93. package/web/_astro/{requirementDiagram-4Y6WPE33.tY36zYtK.js → requirementDiagram-4Y6WPE33.C--E5XuW.js} +1 -1
  94. package/web/_astro/{sankeyDiagram-5OEKKPKP.rOEGZYjo.js → sankeyDiagram-5OEKKPKP.B_0iRNna.js} +1 -1
  95. package/web/_astro/{sequenceDiagram-3UESZ5HK.Dpnw3S9J.js → sequenceDiagram-3UESZ5HK.PKuKr9mk.js} +1 -1
  96. package/web/_astro/{stateDiagram-AJRCARHV.DGpvQ3Wz.js → stateDiagram-AJRCARHV.ClhGHb-O.js} +1 -1
  97. package/web/_astro/{stateDiagram-v2-BHNVJYJU.CbwQdEfu.js → stateDiagram-v2-BHNVJYJU.Bv6BBnvg.js} +1 -1
  98. package/web/_astro/{timeline-definition-PNZ67QCA.DAYUpUJT.js → timeline-definition-PNZ67QCA.BZm2ZvAH.js} +1 -1
  99. package/web/_astro/{vennDiagram-CIIHVFJN.C7JCCd6-.js → vennDiagram-CIIHVFJN.Dt6yZXry.js} +1 -1
  100. package/web/_astro/{wardley-L42UT6IY.BGgwOH5_.js → wardley-L42UT6IY.rUs-E00M.js} +1 -1
  101. package/web/_astro/{wardleyDiagram-YWT4CUSO.oIZqzI2l.js → wardleyDiagram-YWT4CUSO.BcWgv4cA.js} +1 -1
  102. package/web/_astro/{xychartDiagram-2RQKCTM6.DohcJzqm.js → xychartDiagram-2RQKCTM6.DH-M-cX9.js} +1 -1
  103. package/web/index.html +2 -2
  104. package/plugins/sp/commands/dev-history-load.md +0 -63
  105. package/plugins/sp/scripts/history-load.mjs +0 -268
  106. package/plugins/sp/scripts/history-load.ts +0 -400
  107. package/web/_astro/BoardApp.BJs3l7O8.js +0 -179
  108. package/web/_astro/BoardApp.D8InuCYx.js +0 -1
  109. package/web/_astro/channel.XCf1DcsL.js +0 -1
  110. package/web/_astro/index.DJl2RAVZ.css +0 -1
@@ -1,37 +1,32 @@
1
1
  ---
2
- description: "Render the session-forensics report from imported history data (8 CLI-derivable sections plus 6 model-authored), identify bottlenecks and behavioral anti-patterns, and optionally create a structured fix task behind --create-task. Triggers: post-mortem, performance analysis, session review, find issues, identify bottlenecks"
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: "[<topic>] [--sessions <glob>] [--source <auto|pi|claude|codex|gemini|opencode|antigravity|openclaw|omp|grok|agy|all>] [--feature <id>] [--template <meta|issue|standard>] [--priority <P0|P1|P2|P3>] [--severity <S0|S1|S2>] [--category <list>] [--since <iso>] [--until <iso>] [--top <n>] [--min-cost <duration>] [--strict-topic] [--create-task] [--agent <inline|auto|name>] [--json]"
5
- allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob", "Skill"]
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:issue-finding** skill — report-first session forensics over the history data plane.
11
- The CLI renders the 8 derivable report sections (`spur history report --mode forensics`); the skill
12
- identifies bottlenecks, proposes fixes, and only with `--create-task` generates a structured
13
- task file via `spur task create`.
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 | Description | Default |
18
- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ---------- |
19
- | `[<topic>]` | Narrow the analysis to a topic. | omitted |
20
- | `--sessions` `<glob>` | Session log glob (fallback input). | recent |
21
- | `--source` `<auto\|pi\|claude\|codex\|gemini\|opencode\|antigravity\|openclaw\|omp\|grok\|agy\|all>` | Agent source to scan (CLI vocabulary; `all` fans out, `auto` resolves at runtime). | auto |
22
- | `--feature` `<id>` | Attach the generated task to a feature. | omitted |
23
- | `--template` `<meta\|issue\|standard>` | Task template shape (`--create-task` only); `issue` is the explicit single-finding override, `standard` the generic override. | meta |
24
- | `--priority` `<P0\|P1\|P2\|P3>` | Filter / assign task priority. | P2 |
25
- | `--severity` `<S0\|S1\|S2>` | Filter / assign severity. | all |
26
- | `--category` `<list>` | Comma list of categories to keep. | all |
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 "test-loop spinning"
43
- /sp:dev-find-issue --sessions "~/.omp/agent/sessions/-xprojects-spur-new/2026-07-29T*"
44
- /sp:dev-find-issue "L3 guard format discovery" --feature H51 --priority P1 --severity S1
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), then invoke the issue-finding skill, forwarding all arguments:
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:issue-finding", args="$ARGUMENTS")
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; `.spur/workflows/pr-review.yaml` is the SSOT
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…`, or `/sp:dev-run` **without** `--mode implement` |
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 .spur/workflows/wrapup-pipeline.yaml` is the only implementation; there is no inline wrap driver.
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 .spur/workflows/wrapup-pipeline.yaml --vars "$VARS" [--dry-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 .spur/workflows/wrapup-pipeline.yaml` is the only implementation; there is no inline wrap driver.
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 .spur/workflows/wrapup-pipeline.yaml --vars "$VARS" [--dry-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
+ };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.3.60",
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 `DEFAULT_AGENT_ROLES` in `packages/config/src/index.ts` (task 0572 / ADR-061) — this
14
- file is the agent/human-facing view plus the plugin-owned command→role mapping. **Layer 2** maps
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 0572 / ADR-061): the tier/stages half of the block below is a generated view
42
- of DEFAULT_AGENT_ROLES in packages/config/src/index.ts — edit that constant, not this file.
43
- plugins/sp/tests/roles.test.ts (R9) fails the suite on any drift between the two. The
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-history-load, dev-changelog, dev-refresh, rule-add, rule-refine, workflow-add, workflow-refine, spur-init]
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. The six additional commands were placed by the
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-history-load`
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 with
102
- `DEFAULT_AGENT_ROLES` (R9, 0572): the table above must equal the code SSOT byte-for-byte on
103
- id/tier/stages. When the table and the registry disagree, fix the table or the registry — never the
104
- test. When the table and `DEFAULT_AGENT_ROLES` disagree, fix the constant (or regenerate this view).
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.