@gobing-ai/spur 0.3.61 → 0.3.63

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 (87) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.global.yaml +64 -57
  3. package/config/corpus-baseline.json +601 -49
  4. package/config/plugin-scripts.json +2 -2
  5. package/config/rules/boundary/config-loading-ownership.yaml +21 -0
  6. package/config/workflows/history-anatomy.yaml +395 -0
  7. package/package.json +9 -9
  8. package/plugins/sp/README.md +19 -6
  9. package/plugins/sp/commands/dev-find-issue.md +25 -46
  10. package/plugins/sp/commands/dev-idea.md +3 -3
  11. package/plugins/sp/commands/dev-run.md +22 -3
  12. package/plugins/sp/lib/artifact-digest.generated.d.mts +7 -0
  13. package/plugins/sp/lib/artifact-digest.generated.mjs +48 -0
  14. package/plugins/sp/plugin.json +1 -1
  15. package/plugins/sp/references/environment-lens.md +66 -0
  16. package/plugins/sp/references/roles.md +5 -5
  17. package/plugins/sp/scripts/history-anatomy-cache.mjs +818 -0
  18. package/plugins/sp/scripts/history-anatomy-cache.ts +1014 -0
  19. package/plugins/sp/skills/dogfood-testing/references/report-template.md +30 -0
  20. package/plugins/sp/skills/history-anatomy/SKILL.md +67 -0
  21. package/plugins/sp/skills/history-anatomy/references/modes.md +82 -0
  22. package/plugins/sp/skills/history-anatomy/references/operations.md +80 -0
  23. package/plugins/sp/skills/history-anatomy/references/report-contract.md +183 -0
  24. package/plugins/sp/skills/spur-cli/references/agent.md +15 -6
  25. package/plugins/sp/skills/spur-cli/references/message.md +4 -2
  26. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +6 -4
  27. package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -2
  28. package/plugins/sp/skills/spur-dev/references/execution-batch.md +14 -1
  29. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +7 -0
  30. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +25 -13
  31. package/spur.js +1958 -1133
  32. package/web/_astro/{BoardApp.CBIzcvqi.js → BoardApp.CKolAjUz.js} +102 -102
  33. package/web/_astro/BoardApp.DXD--ybM.js +1 -0
  34. package/web/_astro/{TaskDetail.D2N60cfE.js → TaskDetail.Bre7G4gC.js} +1 -1
  35. package/web/_astro/{arc.D-EfJJwf.js → arc.7luwOGiC.js} +1 -1
  36. package/web/_astro/{architectureDiagram-3BPJPVTR.CgvTTzqp.js → architectureDiagram-3BPJPVTR.F6KaHXp-.js} +1 -1
  37. package/web/_astro/{blockDiagram-GPEHLZMM.CnOohvvn.js → blockDiagram-GPEHLZMM.CCGHeRVi.js} +1 -1
  38. package/web/_astro/{c4Diagram-AAUBKEIU.BFcBGUy_.js → c4Diagram-AAUBKEIU.CpqewGmd.js} +1 -1
  39. package/web/_astro/channel.DxfOFf1l.js +1 -0
  40. package/web/_astro/{chunk-2J33WTMH.C-6MR-XY.js → chunk-2J33WTMH.CB9vKa5F.js} +1 -1
  41. package/web/_astro/{chunk-4BX2VUAB.BN4LP5AR.js → chunk-4BX2VUAB.ifGXoUA3.js} +1 -1
  42. package/web/_astro/{chunk-55IACEB6.tUJ_CTtZ.js → chunk-55IACEB6.VIaRo7l8.js} +1 -1
  43. package/web/_astro/{chunk-727SXJPM.BNCk-sxv.js → chunk-727SXJPM.DzPE41OS.js} +1 -1
  44. package/web/_astro/{chunk-AQP2D5EJ.BkpFIbNa.js → chunk-AQP2D5EJ.UF2QRXYF.js} +1 -1
  45. package/web/_astro/{chunk-FMBD7UC4.DcSZ87PN.js → chunk-FMBD7UC4.D2zXKa1R.js} +1 -1
  46. package/web/_astro/{chunk-ND2GUHAM.BkLvHFFf.js → chunk-ND2GUHAM.Cb9bDyvx.js} +1 -1
  47. package/web/_astro/{chunk-QZHKN3VN.HOdgszax.js → chunk-QZHKN3VN.nUKFBiLD.js} +1 -1
  48. package/web/_astro/{classDiagram-4FO5ZUOK.CWfRiY6b.js → classDiagram-4FO5ZUOK.DZg9K9mO.js} +1 -1
  49. package/web/_astro/{classDiagram-v2-Q7XG4LA2.CWfRiY6b.js → classDiagram-v2-Q7XG4LA2.DZg9K9mO.js} +1 -1
  50. package/web/_astro/{cose-bilkent-S5V4N54A.C6j4PxoN.js → cose-bilkent-S5V4N54A.D9STo90d.js} +1 -1
  51. package/web/_astro/{dagre-BM42HDAG.BATZG1II.js → dagre-BM42HDAG.D3IbwhHz.js} +1 -1
  52. package/web/_astro/{diagram-2AECGRRQ.B0f5yY6x.js → diagram-2AECGRRQ.BWTDxBe9.js} +1 -1
  53. package/web/_astro/{diagram-5GNKFQAL.Bewupqv0.js → diagram-5GNKFQAL.XnXlonHG.js} +1 -1
  54. package/web/_astro/{diagram-KO2AKTUF.C23r1tB2.js → diagram-KO2AKTUF.CywOngCO.js} +1 -1
  55. package/web/_astro/{diagram-LMA3HP47.DUErdBOR.js → diagram-LMA3HP47.DY1D21Iu.js} +1 -1
  56. package/web/_astro/{diagram-OG6HWLK6.BubmwAjb.js → diagram-OG6HWLK6.DQxb59KA.js} +1 -1
  57. package/web/_astro/{erDiagram-TEJ5UH35.BE_Qs5mv.js → erDiagram-TEJ5UH35.CF2U-pQZ.js} +1 -1
  58. package/web/_astro/{flowDiagram-I6XJVG4X.COWdbzon.js → flowDiagram-I6XJVG4X.BJK4M3in.js} +1 -1
  59. package/web/_astro/{ganttDiagram-6RSMTGT7.5EGYC4MK.js → ganttDiagram-6RSMTGT7.BSniMzdB.js} +1 -1
  60. package/web/_astro/{gitGraphDiagram-PVQCEYII.bUUV7iEw.js → gitGraphDiagram-PVQCEYII.Dxg-yRov.js} +1 -1
  61. package/web/_astro/index.BVXdIsZV.css +1 -0
  62. package/web/_astro/{infoDiagram-5YYISTIA.CbiInFvz.js → infoDiagram-5YYISTIA.BY4CgO_n.js} +1 -1
  63. package/web/_astro/{ishikawaDiagram-YF4QCWOH.CB7lrSsJ.js → ishikawaDiagram-YF4QCWOH.BmWDZtwF.js} +1 -1
  64. package/web/_astro/{journeyDiagram-JHISSGLW.rhGZgWt8.js → journeyDiagram-JHISSGLW.CpB1YWDP.js} +1 -1
  65. package/web/_astro/{kanban-definition-UN3LZRKU.DPeZD_lP.js → kanban-definition-UN3LZRKU.k-fukQX9.js} +1 -1
  66. package/web/_astro/{linear.l60Nyp5b.js → linear.BNNCobvI.js} +1 -1
  67. package/web/_astro/{mermaid.core.DmtMJcmL.js → mermaid.core.DnpzzuPU.js} +4 -4
  68. package/web/_astro/{mindmap-definition-RKZ34NQL.Cc47AcCn.js → mindmap-definition-RKZ34NQL.D9NnlLBu.js} +1 -1
  69. package/web/_astro/{pieDiagram-4H26LBE5.B8cN-S9g.js → pieDiagram-4H26LBE5.CKhoMiyC.js} +1 -1
  70. package/web/_astro/{quadrantDiagram-W4KKPZXB.DY1FN89L.js → quadrantDiagram-W4KKPZXB.BkAygRlm.js} +1 -1
  71. package/web/_astro/{requirementDiagram-4Y6WPE33.CnM6VbV8.js → requirementDiagram-4Y6WPE33.CX8ibmwc.js} +1 -1
  72. package/web/_astro/{sankeyDiagram-5OEKKPKP.B9DcGfNV.js → sankeyDiagram-5OEKKPKP.Dvurpa0Y.js} +1 -1
  73. package/web/_astro/{sequenceDiagram-3UESZ5HK.ymxaNlAY.js → sequenceDiagram-3UESZ5HK.veO8c2tk.js} +1 -1
  74. package/web/_astro/{stateDiagram-AJRCARHV.DDOJ3d8P.js → stateDiagram-AJRCARHV.DpMr4CO3.js} +1 -1
  75. package/web/_astro/{stateDiagram-v2-BHNVJYJU.Ck0Nb_KY.js → stateDiagram-v2-BHNVJYJU.CKjso86_.js} +1 -1
  76. package/web/_astro/{timeline-definition-PNZ67QCA.BNOvZwAN.js → timeline-definition-PNZ67QCA.DayoPp_2.js} +1 -1
  77. package/web/_astro/{vennDiagram-CIIHVFJN.D3k5ivSF.js → vennDiagram-CIIHVFJN.XNHf04O9.js} +1 -1
  78. package/web/_astro/{wardley-L42UT6IY.BylaxVqn.js → wardley-L42UT6IY.CpM_031g.js} +1 -1
  79. package/web/_astro/{wardleyDiagram-YWT4CUSO.HLNtFUm9.js → wardleyDiagram-YWT4CUSO.lIAjSkZJ.js} +1 -1
  80. package/web/_astro/{xychartDiagram-2RQKCTM6.B-WooKSU.js → xychartDiagram-2RQKCTM6.D8_2K6U1.js} +1 -1
  81. package/web/index.html +2 -2
  82. package/plugins/sp/commands/dev-history-load.md +0 -63
  83. package/plugins/sp/scripts/history-load.mjs +0 -268
  84. package/plugins/sp/scripts/history-load.ts +0 -400
  85. package/web/_astro/BoardApp.BtRfVADq.js +0 -1
  86. package/web/_astro/channel.kIu33Gui.js +0 -1
  87. package/web/_astro/index.Cestp9nh.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 twelve-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 <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 (twelve 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` `<auto\|name>` | Execution surface selector. This target is engine-driven (headless): omit resolves through the executor precedence chain to `agent.default`, then the workflow literal. Explicit `--agent inline` is rejected with the stable special error (exit 2). | omitted |
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
  ```
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  description: Turn a vague idea into a feature with AC and a decomposed task batch — discovery, idea-eval, feature-create, AC, feature-check, system-design, decompose, batch-create (Design by default), handoff
3
3
  role: planner
4
- argument-hint: "\"<idea>\" [--auto] [--skip-design] [--approve-taste] [--agent <inline|auto|name>]"
4
+ argument-hint: "\"<idea>\" [--auto] [--skip-design] [--approve-taste] [--agent <auto|name>]"
5
5
  allowed-tools: ["Bash", "Read", "Skill", "AskUserQuestion"]
6
6
  ---
7
7
 
@@ -20,7 +20,7 @@ contract below maps to that workflow's transitions.
20
20
  | `--approve-taste` | With `--auto`: set idea_approved + design_approved so idea-eval / design-approval do not pause. | off |
21
21
  | `--idea-approved` | Compatibility alias for idea_approved=true (subset of --approve-taste). | off |
22
22
  | `--design-approved` | Compatibility alias for design_approved=true (subset of --approve-taste). | off |
23
- | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing ideation. The pipeline's `agent.run` stages are headless — they always dispatch a subprocess, so `--agent inline` is rejected there with the stable special error (exit 2). Use `omit` (resolves to `agent.default`), `auto` (tier-resolves an executor), or a name (pins that executor). | agent.default |
23
+ | `--agent` `<auto\|name>` | Who runs the model-bearing ideation. The pipeline's `agent.run` stages are headless — they always dispatch a subprocess, so `--agent inline` is rejected there with the stable special error (exit 2). Use `omit` (resolves to `agent.default`), `auto` (tier-resolves an executor), or a name (pins that executor). | agent.default |
24
24
 
25
25
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
26
26
 
@@ -31,7 +31,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
31
31
  [--auto] # skip objective HITL only (feature-check, batch-create)
32
32
  [--skip-design] # design package off (system-design + task Design)
33
33
  [--approve-taste] # with --auto: skip idea-eval + design-approval pauses
34
- [--agent <inline|auto|name>] # who runs the model-bearing ideation (default: agent.default)
34
+ [--agent <auto|name>] # who runs the model-bearing ideation (default: agent.default)
35
35
  ```
36
36
 
37
37
  There is **no** `--design` force flag. Design is default-on; only `--skip-design` opts out.
@@ -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
 
@@ -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.61",
3
+ "version": "0.3.63",
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"]
@@ -0,0 +1,66 @@
1
+ # Environment-improvement lens
2
+
3
+ One mapping turns retrospective "environment" observations into concrete surface improvements
4
+ across the two live report owners: `sp:dogfood-testing` report §6 and `sp:history-anatomy`
5
+ sections 4/9. (The inspiration is an out-of-tree retrospective practice; it is deliberately not
6
+ shipped or invoked by anything in this plugin.)
7
+
8
+ **This file is the single source of truth for the seven categories and the placement rule.**
9
+ Neither report projection restates the table below; each links here as its category table
10
+ (task 0686 / feature I9; accepted design `docs/design/environment-improvement-lens.md`,
11
+ ADR-084/085). There is deliberately no `/sp:dev-retro` command, no CLI change, and no protocol
12
+ bump behind this mapping.
13
+
14
+ ## Canonical categories and projections
15
+
16
+ Exactly one file (this one) enumerates these seven names. Encode them **only** in the projected
17
+ field named by each column — never as a history-anatomy `category` (that vocabulary is frozen at
18
+ `reliability | repetition | workflow | performance | coverage | telemetry | positive`).
19
+
20
+ | Retro category | History-anatomy `category` (closed) | History-anatomy `<signal>` | Dogfood class |
21
+ | --- | --- | --- | --- |
22
+ | navigation | `workflow` | `navigation` | `environment` (P3–P2) |
23
+ | automated checks | `reliability` | `automated-checks` | `environment`; action is a gate, not prose |
24
+ | coding standards | `workflow` | `coding-standards` | `environment`; owner surface is review, never implementer |
25
+ | AGENTS.md placement | `workflow` | `agents-md-placement` | `environment`; action = move to skill/reference/check |
26
+ | tool economy | `performance` | `tool-economy` | existing cache-health P3; `environment` when the tool itself is the waste |
27
+ | no-ops | `workflow` | `no-ops` | `environment`; `file:line` of the dead instruction |
28
+ | information access | `telemetry` | `information-access` | existing chained-step `~unknown` P3; `environment` when access is missing |
29
+
30
+ Dogfood class tags are optional and closed: `environment` | `testee` | `waste`. Grammar,
31
+ classification table, and fix-mode boundaries live in the owning projection:
32
+ [`report-template.md` §6](../skills/dogfood-testing/references/report-template.md).
33
+ History-anatomy key grammar and the structure gate live in
34
+ [`report-contract.md`](../skills/history-anatomy/references/report-contract.md).
35
+
36
+ ## Placement rule
37
+
38
+ When an observation lands, choose a home in this order — never a new sentence in an
39
+ always-loaded steering file when a lower step fits:
40
+
41
+ 1. **Automatable → propose a check.** Anything a linter, typechecker, test, script-contract
42
+ check, or filesystem linter could catch becomes a new-or-tighter automated gate
43
+ (`spur-check`, biome rules, bun tests), not a reminder sentence.
44
+ 2. **Coding standard → the review path.** The owner surface is `sp:code-verification`,
45
+ `sp:code-review`, or pipeline review — never the implementer skill.
46
+ 3. **Always-loaded steering (`AGENTS.md` / `CLAUDE.md`) → navigation pointer only.** Detail
47
+ moves to a skill, reference, or check; the steering file keeps at most a pointer.
48
+
49
+ ## Present-don't-apply
50
+
51
+ Findings projected through this lens are **proposals**, in either owner's report. No projection
52
+ applies a change, produces a diff, or claims to have executed anything. Dogfood bounded fix-mode
53
+ may repair a failed `testee`-class step, but never mutates a finding tagged `environment`;
54
+ class — not the cited file path — decides whether bounded fix may mutate. History-anatomy stays
55
+ report-only. Accepted proposals reach the tree through operator-approved surfaces (`spur task
56
+ create` handoff, manual edit), which remain explicit human gates.
57
+
58
+ ## Keep / drop boundary
59
+
60
+ Kept here because both live reports consume it: the seven names above, their projections, and
61
+ this placement rule. Dropped (each needs its own operator decision): installing or invoking the
62
+ out-of-tree retro practice, a standalone retro command, `CODING_STANDARDS.md` as a file, runtime
63
+ parsing of this markdown by validators, automatic remediation of environment findings, and
64
+ folding the lens into wrap-up learnings or `.spur/context/` memory.
65
+ `plugins/sp/skills/issue-finding/` remains the legacy coexistence non-target — it gains nothing
66
+ from this mapping.
@@ -50,7 +50,7 @@ version: 1
50
50
  roles:
51
51
  - id: scribe
52
52
  tier: cheap
53
- 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]
54
54
  stages: [changelog]
55
55
  - id: coder
56
56
  tier: standard
@@ -83,19 +83,19 @@ must not sit below the highest `min_tier` among its folded stages.
83
83
  - **`reviewer` (capable-1).** Verification and analysis: per-task verify/review, batch verify,
84
84
  dogfooding, anti-pattern scanning (`rule-scan`), and the two audit commands (`dev-find-conflict`,
85
85
  `dev-find-issue`) — those analyse rather than transcribe, which is why they sit here and not
86
- 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`.
87
87
  - **`planner` (capable-2).** The planning half: feature planning, requirement refinement (single
88
88
  and batch), brainstorm, idea intake, batch run/parallel orchestration, next-step routing,
89
89
  architecture survey, feature-frontier prioritization, and feature-tree restructure. Folds `plan`,
90
90
  `refine`, `brainstorm`.
91
91
 
92
92
  **Placement notes (directory closure, task 0535).** The decided four-row table listed 31 commands;
93
- 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
94
95
  same stage logic: `dev-refineall` folds `refine` → planner; `dev-find-next` is planning-side
95
96
  frontier work → planner; `dev-feature-change` is planning-half corpus surgery on the feature tree →
96
97
  planner; `dev-gtd` is the execution/delivery flow → coder; `dev-find-conflict` and `dev-find-issue`
97
- are audits/analysis → reviewer (same reasoning as `rule-scan`). Later additions: `dev-history-load`
98
- 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 —
99
99
  driving the external PR review and triaging its findings folds the `review` stage → reviewer.
100
100
 
101
101
  **Consistency is a test, not a convention.** `plugins/sp/tests/roles.test.ts` parses this YAML and