@gobing-ai/spur 0.3.62 → 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 (72) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/corpus-baseline.json +200 -8
  3. package/config/workflows/history-anatomy.yaml +40 -11
  4. package/package.json +9 -9
  5. package/plugins/sp/README.md +2 -2
  6. package/plugins/sp/commands/dev-find-issue.md +4 -4
  7. package/plugins/sp/commands/dev-idea.md +3 -3
  8. package/plugins/sp/plugin.json +1 -1
  9. package/plugins/sp/references/environment-lens.md +66 -0
  10. package/plugins/sp/scripts/history-anatomy-cache.mjs +162 -13
  11. package/plugins/sp/scripts/history-anatomy-cache.ts +209 -13
  12. package/plugins/sp/skills/dogfood-testing/references/report-template.md +30 -0
  13. package/plugins/sp/skills/history-anatomy/SKILL.md +3 -3
  14. package/plugins/sp/skills/history-anatomy/references/operations.md +21 -8
  15. package/plugins/sp/skills/history-anatomy/references/report-contract.md +55 -5
  16. package/plugins/sp/skills/spur-cli/references/agent.md +15 -6
  17. package/plugins/sp/skills/spur-cli/references/message.md +4 -2
  18. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +6 -4
  19. package/spur.js +882 -325
  20. package/web/_astro/{BoardApp.rkWGVwwK.js → BoardApp.CKolAjUz.js} +56 -56
  21. package/web/_astro/BoardApp.DXD--ybM.js +1 -0
  22. package/web/_astro/{TaskDetail.B7ODt_bA.js → TaskDetail.Bre7G4gC.js} +1 -1
  23. package/web/_astro/{arc.C5QRz6AQ.js → arc.7luwOGiC.js} +1 -1
  24. package/web/_astro/{architectureDiagram-3BPJPVTR.CHptn8gZ.js → architectureDiagram-3BPJPVTR.F6KaHXp-.js} +1 -1
  25. package/web/_astro/{blockDiagram-GPEHLZMM.b1nEDkDw.js → blockDiagram-GPEHLZMM.CCGHeRVi.js} +1 -1
  26. package/web/_astro/{c4Diagram-AAUBKEIU.BWj8S_Qq.js → c4Diagram-AAUBKEIU.CpqewGmd.js} +1 -1
  27. package/web/_astro/channel.DxfOFf1l.js +1 -0
  28. package/web/_astro/{chunk-2J33WTMH.q0BBuE1n.js → chunk-2J33WTMH.CB9vKa5F.js} +1 -1
  29. package/web/_astro/{chunk-4BX2VUAB.DP2KDkAU.js → chunk-4BX2VUAB.ifGXoUA3.js} +1 -1
  30. package/web/_astro/{chunk-55IACEB6.CkCId72p.js → chunk-55IACEB6.VIaRo7l8.js} +1 -1
  31. package/web/_astro/{chunk-727SXJPM.oHWzxMot.js → chunk-727SXJPM.DzPE41OS.js} +1 -1
  32. package/web/_astro/{chunk-AQP2D5EJ.DkkgxfMP.js → chunk-AQP2D5EJ.UF2QRXYF.js} +1 -1
  33. package/web/_astro/{chunk-FMBD7UC4.lmFJDvRK.js → chunk-FMBD7UC4.D2zXKa1R.js} +1 -1
  34. package/web/_astro/{chunk-ND2GUHAM.52jt0eHK.js → chunk-ND2GUHAM.Cb9bDyvx.js} +1 -1
  35. package/web/_astro/{chunk-QZHKN3VN.Cg8KEFoD.js → chunk-QZHKN3VN.nUKFBiLD.js} +1 -1
  36. package/web/_astro/{classDiagram-4FO5ZUOK.BuOUhxcD.js → classDiagram-4FO5ZUOK.DZg9K9mO.js} +1 -1
  37. package/web/_astro/{classDiagram-v2-Q7XG4LA2.BuOUhxcD.js → classDiagram-v2-Q7XG4LA2.DZg9K9mO.js} +1 -1
  38. package/web/_astro/{cose-bilkent-S5V4N54A.BRUU8E_0.js → cose-bilkent-S5V4N54A.D9STo90d.js} +1 -1
  39. package/web/_astro/{dagre-BM42HDAG.GDbfFYVV.js → dagre-BM42HDAG.D3IbwhHz.js} +1 -1
  40. package/web/_astro/{diagram-2AECGRRQ.CvIDBeJF.js → diagram-2AECGRRQ.BWTDxBe9.js} +1 -1
  41. package/web/_astro/{diagram-5GNKFQAL.DMgJjWOX.js → diagram-5GNKFQAL.XnXlonHG.js} +1 -1
  42. package/web/_astro/{diagram-KO2AKTUF.njjl-0AP.js → diagram-KO2AKTUF.CywOngCO.js} +1 -1
  43. package/web/_astro/{diagram-LMA3HP47.CcCqgP8M.js → diagram-LMA3HP47.DY1D21Iu.js} +1 -1
  44. package/web/_astro/{diagram-OG6HWLK6.Btqd-YVE.js → diagram-OG6HWLK6.DQxb59KA.js} +1 -1
  45. package/web/_astro/{erDiagram-TEJ5UH35.BbhML_Xo.js → erDiagram-TEJ5UH35.CF2U-pQZ.js} +1 -1
  46. package/web/_astro/{flowDiagram-I6XJVG4X.CkvsIgY8.js → flowDiagram-I6XJVG4X.BJK4M3in.js} +1 -1
  47. package/web/_astro/{ganttDiagram-6RSMTGT7.m8IWD_wW.js → ganttDiagram-6RSMTGT7.BSniMzdB.js} +1 -1
  48. package/web/_astro/{gitGraphDiagram-PVQCEYII.5z87HXO-.js → gitGraphDiagram-PVQCEYII.Dxg-yRov.js} +1 -1
  49. package/web/_astro/index.BVXdIsZV.css +1 -0
  50. package/web/_astro/{infoDiagram-5YYISTIA.Bvyvsd7Q.js → infoDiagram-5YYISTIA.BY4CgO_n.js} +1 -1
  51. package/web/_astro/{ishikawaDiagram-YF4QCWOH.DdWVYO87.js → ishikawaDiagram-YF4QCWOH.BmWDZtwF.js} +1 -1
  52. package/web/_astro/{journeyDiagram-JHISSGLW.C3kOlYH1.js → journeyDiagram-JHISSGLW.CpB1YWDP.js} +1 -1
  53. package/web/_astro/{kanban-definition-UN3LZRKU.CfKTUHVC.js → kanban-definition-UN3LZRKU.k-fukQX9.js} +1 -1
  54. package/web/_astro/{linear.CMDHnzgX.js → linear.BNNCobvI.js} +1 -1
  55. package/web/_astro/{mermaid.core.DN7-WrsP.js → mermaid.core.DnpzzuPU.js} +4 -4
  56. package/web/_astro/{mindmap-definition-RKZ34NQL.DcQxLvqG.js → mindmap-definition-RKZ34NQL.D9NnlLBu.js} +1 -1
  57. package/web/_astro/{pieDiagram-4H26LBE5.Nu-Inbw6.js → pieDiagram-4H26LBE5.CKhoMiyC.js} +1 -1
  58. package/web/_astro/{quadrantDiagram-W4KKPZXB.Dck2EChs.js → quadrantDiagram-W4KKPZXB.BkAygRlm.js} +1 -1
  59. package/web/_astro/{requirementDiagram-4Y6WPE33.C--E5XuW.js → requirementDiagram-4Y6WPE33.CX8ibmwc.js} +1 -1
  60. package/web/_astro/{sankeyDiagram-5OEKKPKP.B_0iRNna.js → sankeyDiagram-5OEKKPKP.Dvurpa0Y.js} +1 -1
  61. package/web/_astro/{sequenceDiagram-3UESZ5HK.PKuKr9mk.js → sequenceDiagram-3UESZ5HK.veO8c2tk.js} +1 -1
  62. package/web/_astro/{stateDiagram-AJRCARHV.ClhGHb-O.js → stateDiagram-AJRCARHV.DpMr4CO3.js} +1 -1
  63. package/web/_astro/{stateDiagram-v2-BHNVJYJU.Bv6BBnvg.js → stateDiagram-v2-BHNVJYJU.CKjso86_.js} +1 -1
  64. package/web/_astro/{timeline-definition-PNZ67QCA.BZm2ZvAH.js → timeline-definition-PNZ67QCA.DayoPp_2.js} +1 -1
  65. package/web/_astro/{vennDiagram-CIIHVFJN.Dt6yZXry.js → vennDiagram-CIIHVFJN.XNHf04O9.js} +1 -1
  66. package/web/_astro/{wardley-L42UT6IY.rUs-E00M.js → wardley-L42UT6IY.CpM_031g.js} +1 -1
  67. package/web/_astro/{wardleyDiagram-YWT4CUSO.BcWgv4cA.js → wardleyDiagram-YWT4CUSO.lIAjSkZJ.js} +1 -1
  68. package/web/_astro/{xychartDiagram-2RQKCTM6.DH-M-cX9.js → xychartDiagram-2RQKCTM6.D8_2K6U1.js} +1 -1
  69. package/web/index.html +2 -2
  70. package/web/_astro/BoardApp.Z9jMwI9G.js +0 -1
  71. package/web/_astro/channel.BJtn6CGV.js +0 -1
  72. package/web/_astro/index.nWve6EHS.css +0 -1
@@ -7,7 +7,7 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sp",
10
- "version": "0.3.62",
10
+ "version": "0.3.63",
11
11
  "source": "./plugins/sp"
12
12
  }
13
13
  ]
@@ -15044,14 +15044,6 @@
15044
15044
  "reason": "No verdict artifact and the tracked ## Testing section carries no recoverable coverage evidence; tasks predate durable verification recording (F93 fallback state, task 0673).",
15045
15045
  "since": "2026-08-25"
15046
15046
  },
15047
- {
15048
- "kind": "task",
15049
- "id": "0102",
15050
- "code": "L4.anchor-subject-mismatch",
15051
- "severity": "error",
15052
- "reason": "Point-window matcher residue (probe 2): cited line resolves and is in bounds but does not name the row subject because the matcher reads only the cited lines — see note § L4.anchor-subject-mismatch (2026-08-25), ADR-083.",
15053
- "since": "2026-08-25"
15054
- },
15055
15047
  {
15056
15048
  "kind": "task",
15057
15049
  "id": "0384",
@@ -15339,6 +15331,206 @@
15339
15331
  "severity": "warning",
15340
15332
  "reason": "Anchor path cannot resolve from project root (bare or plugin-relative) or line range exceeds file — see note § L4.stale-line-anchor (2026-08-25), ADR-083.",
15341
15333
  "since": "2026-08-25"
15334
+ },
15335
+ {
15336
+ "kind": "feature",
15337
+ "id": "E1",
15338
+ "code": "L4.scenario-unverified",
15339
+ "severity": "warning",
15340
+ "reason": "Linked historical task 0474 has no canonical PASS verdict with MET requirements; accepted until evidence is recovered or rerun, with two-sided removal when it lands.",
15341
+ "since": "2026-08-26"
15342
+ },
15343
+ {
15344
+ "kind": "feature",
15345
+ "id": "F4",
15346
+ "code": "L4.scenario-unverified",
15347
+ "severity": "warning",
15348
+ "reason": "Linked historical task 0418 has no canonical PASS verdict with MET requirements; accepted until evidence is recovered or rerun, with two-sided removal when it lands.",
15349
+ "since": "2026-08-26"
15350
+ },
15351
+ {
15352
+ "kind": "feature",
15353
+ "id": "F91",
15354
+ "code": "L4.scenario-unverified",
15355
+ "severity": "warning",
15356
+ "reason": "Linked historical task 0582 has no canonical PASS verdict with MET requirements; accepted until evidence is recovered or rerun, with two-sided removal when it lands.",
15357
+ "since": "2026-08-26"
15358
+ },
15359
+ {
15360
+ "kind": "feature",
15361
+ "id": "G4",
15362
+ "code": "L4.scenario-unverified",
15363
+ "severity": "warning",
15364
+ "reason": "Linked historical task 0529 has no canonical PASS verdict with MET requirements; accepted until evidence is recovered or rerun, with two-sided removal when it lands.",
15365
+ "since": "2026-08-26"
15366
+ },
15367
+ {
15368
+ "kind": "feature",
15369
+ "id": "I3",
15370
+ "code": "L4.scenario-unverified",
15371
+ "severity": "warning",
15372
+ "reason": "Linked historical tasks 0539/0540 have no canonical PASS verdict with MET requirements; accepted until evidence is recovered or rerun, with two-sided removal when it lands.",
15373
+ "since": "2026-08-26"
15374
+ },
15375
+ {
15376
+ "kind": "feature",
15377
+ "id": "I81",
15378
+ "code": "L4.dogfood-missing",
15379
+ "severity": "warning",
15380
+ "reason": "Self-referential history-anatomy work has no tracked dogfood artifact yet; accepted pending feature verification, with two-sided removal when the artifact lands.",
15381
+ "since": "2026-08-26"
15382
+ },
15383
+ {
15384
+ "kind": "feature",
15385
+ "id": "I81",
15386
+ "code": "L4.scenario-unverified",
15387
+ "severity": "warning",
15388
+ "reason": "Linked tasks 0674/0680 predate canonical PASS recording for these scenarios; accepted until evidence is recovered or rerun, with two-sided removal when it lands.",
15389
+ "since": "2026-08-26"
15390
+ },
15391
+ {
15392
+ "kind": "feature",
15393
+ "id": "J4",
15394
+ "code": "L4.scenario-unverified",
15395
+ "severity": "warning",
15396
+ "reason": "Linked historical tasks 0374-0378 have no canonical PASS verdicts with MET requirements; accepted until evidence is recovered or rerun, with two-sided removal when it lands.",
15397
+ "since": "2026-08-26"
15398
+ },
15399
+ {
15400
+ "kind": "feature",
15401
+ "id": "K",
15402
+ "code": "L4.scenario-unverified",
15403
+ "severity": "warning",
15404
+ "reason": "Linked historical task 0525 has no canonical PASS verdict with MET requirements; accepted until evidence is recovered or rerun, with two-sided removal when it lands.",
15405
+ "since": "2026-08-26"
15406
+ },
15407
+ {
15408
+ "kind": "task",
15409
+ "id": "0342",
15410
+ "code": "L4.anchor-subject-mismatch",
15411
+ "severity": "error",
15412
+ "reason": "Current source line shifts exposed another closed-task point-window mismatch; preserve the historical citation pending the accepted F91 matcher/corpus migration (ADR-083).",
15413
+ "since": "2026-08-26"
15414
+ },
15415
+ {
15416
+ "kind": "task",
15417
+ "id": "0588",
15418
+ "code": "L4.anchor-subject-mismatch",
15419
+ "severity": "error",
15420
+ "reason": "Task 0685 intentionally removed generated demo specs from the tracked tree, invalidating a historical 0588 point anchor; preserve that evidence pending F91 corpus migration (ADR-083).",
15421
+ "since": "2026-08-26"
15422
+ },
15423
+ {
15424
+ "kind": "task",
15425
+ "id": "0609",
15426
+ "code": "L4.anchor-subject-mismatch",
15427
+ "severity": "error",
15428
+ "reason": "Task 0685 intentionally evolved the agent-wait surface and shifted 0609's historical point anchor; preserve that evidence pending F91 corpus migration (ADR-083).",
15429
+ "since": "2026-08-26"
15430
+ },
15431
+ {
15432
+ "kind": "task",
15433
+ "id": "0631",
15434
+ "code": "L4.anchor-subject-mismatch",
15435
+ "severity": "error",
15436
+ "reason": "The reserved 0685 DDL shifted migration-source line windows and exposed closed-task matcher residue; preserve historical citations pending F91 (ADR-083).",
15437
+ "since": "2026-08-26"
15438
+ },
15439
+ {
15440
+ "kind": "task",
15441
+ "id": "0639",
15442
+ "code": "L4.anchor-subject-mismatch",
15443
+ "severity": "error",
15444
+ "reason": "Current config-source line shifts exposed another closed-task point-window mismatch; preserve the historical citation pending F91 (ADR-083).",
15445
+ "since": "2026-08-26"
15446
+ },
15447
+ {
15448
+ "kind": "task",
15449
+ "id": "0645",
15450
+ "code": "L4.anchor-subject-mismatch",
15451
+ "severity": "error",
15452
+ "reason": "Current web-source line shifts exposed another closed-task point-window mismatch; preserve the historical citation pending F91 (ADR-083).",
15453
+ "since": "2026-08-26"
15454
+ },
15455
+ {
15456
+ "kind": "task",
15457
+ "id": "0655",
15458
+ "code": "L4.anchor-subject-mismatch",
15459
+ "severity": "error",
15460
+ "reason": "Current web-source line shifts exposed another closed-task point-window mismatch; preserve the historical citation pending F91 (ADR-083).",
15461
+ "since": "2026-08-26"
15462
+ },
15463
+ {
15464
+ "kind": "task",
15465
+ "id": "0665",
15466
+ "code": "L4.anchor-subject-mismatch",
15467
+ "severity": "error",
15468
+ "reason": "Current workflow-source line shifts exposed another closed-task point-window mismatch; preserve the historical citation pending F91 (ADR-083).",
15469
+ "since": "2026-08-26"
15470
+ },
15471
+ {
15472
+ "kind": "task",
15473
+ "id": "0666",
15474
+ "code": "L4.anchor-subject-mismatch",
15475
+ "severity": "error",
15476
+ "reason": "Current agent-source line shifts exposed another closed-task point-window mismatch; preserve the historical citation pending F91 (ADR-083).",
15477
+ "since": "2026-08-26"
15478
+ },
15479
+ {
15480
+ "kind": "task",
15481
+ "id": "0667",
15482
+ "code": "L4.anchor-subject-mismatch",
15483
+ "severity": "error",
15484
+ "reason": "Current workflow-source line shifts exposed another closed-task point-window mismatch; preserve the historical citation pending F91 (ADR-083).",
15485
+ "since": "2026-08-26"
15486
+ },
15487
+ {
15488
+ "kind": "task",
15489
+ "id": "0669",
15490
+ "code": "L4.anchor-subject-mismatch",
15491
+ "severity": "error",
15492
+ "reason": "Current history-anatomy source/test line shifts exposed closed-task point-window residue; preserve historical citations pending F91 (ADR-083).",
15493
+ "since": "2026-08-26"
15494
+ },
15495
+ {
15496
+ "kind": "task",
15497
+ "id": "0670",
15498
+ "code": "L4.anchor-subject-mismatch",
15499
+ "severity": "error",
15500
+ "reason": "Current ADR line shifts exposed another closed-task point-window mismatch; preserve the historical citation pending F91 (ADR-083).",
15501
+ "since": "2026-08-26"
15502
+ },
15503
+ {
15504
+ "kind": "task",
15505
+ "id": "0674",
15506
+ "code": "L4.anchor-subject-mismatch",
15507
+ "severity": "error",
15508
+ "reason": "Current history-anatomy source line shifts exposed another closed-task point-window mismatch; preserve the historical citation pending F91 (ADR-083).",
15509
+ "since": "2026-08-26"
15510
+ },
15511
+ {
15512
+ "kind": "task",
15513
+ "id": "0676",
15514
+ "code": "L4.anchor-subject-mismatch",
15515
+ "severity": "error",
15516
+ "reason": "Current history-anatomy source/test line shifts exposed closed-task point-window residue; preserve historical citations pending F91 (ADR-083).",
15517
+ "since": "2026-08-26"
15518
+ },
15519
+ {
15520
+ "kind": "task",
15521
+ "id": "0680",
15522
+ "code": "L4.anchor-subject-mismatch",
15523
+ "severity": "error",
15524
+ "reason": "Current history-anatomy source/test line shifts exposed closed-task point-window residue; preserve historical citations pending F91 (ADR-083).",
15525
+ "since": "2026-08-26"
15526
+ },
15527
+ {
15528
+ "kind": "task",
15529
+ "id": "0685",
15530
+ "code": "L4.missing-feature-id",
15531
+ "severity": "warning",
15532
+ "reason": "Standalone operator-design task completed with a canonical PASS but no parent feature existed; do not invent a post-hoc feature edge solely to silence the advisory.",
15533
+ "since": "2026-08-26"
15342
15534
  }
15343
15535
  ]
15344
15536
  }
@@ -31,6 +31,10 @@
31
31
  # date — YYYY-MM-DD for --date (daily); empty for ad-hoc
32
32
  # since — inclusive ISO lower bound (ad-hoc; also normalizes daily via the DST-aware rule)
33
33
  # until — inclusive ISO upper bound (ad-hoc)
34
+ # baselineSince — declared home for the baseline-leg lower bound the analyze stage references;
35
+ # actual values flow through the run-scoped env file emitted by resolve-paths
36
+ # (0674 R2/R5 — a referenced var must have a declared home, never an implicit one)
37
+ # baselineUntil — baseline-leg upper bound, same contract as baselineSince
34
38
  # focus — ad-hoc focus string (required in ad-hoc mode, rejected in daily)
35
39
  # recompute — "true" forces the full analyze/render/enrich/validate path (cache disposition
36
40
  # forced-recompute)
@@ -57,10 +61,14 @@ vars:
57
61
  date: ""
58
62
  since: ""
59
63
  until: ""
64
+ baselineSince: ""
65
+ baselineUntil: ""
60
66
  focus: ""
61
67
  recompute: "false"
62
68
  output: ""
63
- agent: "omp"
69
+ # 0676 R5: omp went quota-dead (HTTP 429) in the 2026-08-25 dogfood. The literal names a
70
+ # currently-reachable executor; `agent.default` in config still overrides via the precedence chain.
71
+ agent: "claude"
64
72
  spurBin: "spur"
65
73
  __runId: ""
66
74
  stepTimeoutMs: "1800000"
@@ -110,7 +118,8 @@ states:
110
118
  command: >-
111
119
  h=$(superskill script path sp history-anatomy-cache.mjs);
112
120
  node "$h" paths --helper "$h" --report-dir "$reportDir" --date "$date"
113
- --output "$output" --out .spur/run/$__runId-paths.env
121
+ --output "$output" --mode "$mode" --since "$since" --until "$until"
122
+ --out .spur/run/$__runId-paths.txt
114
123
 
115
124
  - id: analyze
116
125
  description: >
@@ -122,11 +131,13 @@ states:
122
131
  options:
123
132
  command: >-
124
133
  mkdir -p .spur/run;
125
- $spurBin history analyze --out .spur/run/$__runId-history-anatomy-current.json --since "$since" --until "$until" --json
134
+ . .spur/run/$__runId-paths.env;
135
+ $spurBin history analyze --out .spur/run/$__runId-history-anatomy-current.json --since "$HA_SINCE" --until "$HA_UNTIL" --json
126
136
  - kind: shell
127
137
  options:
128
138
  command: >-
129
- $spurBin history analyze --out .spur/run/$__runId-history-anatomy-baseline.json --since "$baselineSince" --until "$until" --json 2>/dev/null || true
139
+ . .spur/run/$__runId-paths.env;
140
+ $spurBin history analyze --out .spur/run/$__runId-history-anatomy-baseline.json --since "$HA_BASELINE_SINCE" --until "$HA_BASELINE_UNTIL" --json 2>/dev/null || true
130
141
 
131
142
  - id: cache-probe
132
143
  description: >
@@ -138,7 +149,7 @@ states:
138
149
  - kind: shell
139
150
  options:
140
151
  command: >-
141
- . .spur/run/$__runId-paths.env;
152
+ . .spur/run/$__runId-paths.txt;
142
153
  node "$HA_HELPER" probe --artifact .spur/run/$__runId-history-anatomy-current.json
143
154
  --baseline .spur/run/$__runId-history-anatomy-baseline.json --target "$HA_TARGET"
144
155
  --mode "$mode" --date "$HA_DATE" --recompute "$recompute" --executor "$agent"
@@ -161,8 +172,14 @@ states:
161
172
  - id: enrich
162
173
  description: >
163
174
  Model enrichment via the skill operation sp:history-anatomy enrich (0658 operations.md).
164
- Consumes the two artifacts; authors the model half of the report.
175
+ Consumes the two artifacts; authors the model half of the report. A porcelain baseline
176
+ is captured before dispatch and asserted after: any working-tree file created outside the
177
+ declared output fails the run (0676 R3).
165
178
  onEnter:
179
+ - kind: shell
180
+ options:
181
+ command: >-
182
+ git status --porcelain > .spur/run/$__runId-baseline-enrich.txt || true
166
183
  - kind: agent.run
167
184
  options:
168
185
  agent: ${vars.agent}
@@ -171,10 +188,14 @@ states:
171
188
  role: reviewer
172
189
  expectFile: .spur/run/${vars.__runId}-candidate.md
173
190
  timeoutMs: ${vars.stepTimeoutMs}
191
+ - kind: shell
192
+ options:
193
+ command: >-
194
+ node "$(superskill script path sp history-anatomy-cache.mjs)" assert-clean --baseline .spur/run/$__runId-baseline-enrich.txt --expect .spur/run/$__runId-candidate.md
174
195
 
175
196
  - id: structure-gate
176
197
  description: >
177
- Deterministic structure gate via the helper (0659). Asserts the eleven sections in order,
198
+ Deterministic structure gate via the helper (0659). Asserts the twelve sections in order,
178
199
  per-finding fields, no placeholders, evidence anchors. Not reachable on the hit path from
179
200
  enrich — always gated before validation.
180
201
  onEnter:
@@ -187,8 +208,12 @@ states:
187
208
  - id: validate
188
209
  description: >
189
210
  Independent evidence validation via the skill operation sp:history-anatomy validate.
190
- Publication is reachable only from a PASS here.
211
+ Publication is reachable only from a PASS here. Same undeclared-write assertion as enrich (0676 R3).
191
212
  onEnter:
213
+ - kind: shell
214
+ options:
215
+ command: >-
216
+ git status --porcelain > .spur/run/$__runId-baseline-validate.txt || true
192
217
  - kind: agent.run
193
218
  options:
194
219
  agent: ${vars.agent}
@@ -197,6 +222,10 @@ states:
197
222
  role: reviewer
198
223
  expectFile: .spur/run/${vars.__runId}-validation.txt
199
224
  timeoutMs: ${vars.stepTimeoutMs}
225
+ - kind: shell
226
+ options:
227
+ command: >-
228
+ node "$(superskill script path sp history-anatomy-cache.mjs)" assert-clean --baseline .spur/run/$__runId-baseline-validate.txt --expect .spur/run/$__runId-validation.txt
200
229
 
201
230
  - id: correct
202
231
  description: >
@@ -219,7 +248,7 @@ states:
219
248
  - kind: shell
220
249
  options:
221
250
  command: >-
222
- . .spur/run/$__runId-paths.env;
251
+ . .spur/run/$__runId-paths.txt;
223
252
  node "$HA_HELPER" refresh --report "$HA_TARGET"
224
253
  --out .spur/run/$__runId-publishable.md --disposition hit
225
254
 
@@ -233,7 +262,7 @@ states:
233
262
  - kind: shell
234
263
  options:
235
264
  command: >-
236
- . .spur/run/$__runId-paths.env;
265
+ . .spur/run/$__runId-paths.txt;
237
266
  node "$HA_HELPER" stamp --candidate .spur/run/$__runId-candidate.md
238
267
  --provenance .spur/run/$__runId-provenance.json
239
268
  --out .spur/run/$__runId-publishable.md
@@ -247,7 +276,7 @@ states:
247
276
  - kind: shell
248
277
  options:
249
278
  command: >-
250
- . .spur/run/$__runId-paths.env;
279
+ . .spur/run/$__runId-paths.txt;
251
280
  mkdir -p "$(dirname "$HA_TARGET")";
252
281
  node "$HA_HELPER" publish .spur/run/$__runId-publishable.md "$HA_TARGET"
253
282
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.62",
3
+ "version": "0.3.63",
4
4
  "description": "Spur CLI — local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
5
5
  "keywords": [
6
6
  "spur",
@@ -53,14 +53,14 @@
53
53
  },
54
54
  "devDependencies": {
55
55
  "@commander-js/extra-typings": "^14.0.0",
56
- "@gobing-ai/ts-db": "^0.4.42",
57
- "@gobing-ai/ts-ai-runner": "^0.4.42",
58
- "@gobing-ai/ts-dual-workflow-engine": "^0.4.42",
59
- "@gobing-ai/ts-infra": "^0.4.42",
60
- "@gobing-ai/ts-llm-jsonl-importer": "^0.4.42",
61
- "@gobing-ai/ts-rule-engine": "^0.4.42",
62
- "@gobing-ai/ts-runtime": "^0.4.42",
63
- "@gobing-ai/ts-utils": "^0.4.42",
56
+ "@gobing-ai/ts-db": "^0.4.43",
57
+ "@gobing-ai/ts-ai-runner": "^0.4.43",
58
+ "@gobing-ai/ts-dual-workflow-engine": "^0.4.43",
59
+ "@gobing-ai/ts-infra": "^0.4.43",
60
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.4.43",
61
+ "@gobing-ai/ts-rule-engine": "^0.4.43",
62
+ "@gobing-ai/ts-runtime": "^0.4.43",
63
+ "@gobing-ai/ts-utils": "^0.4.43",
64
64
  "@types/bun": "1.3.14",
65
65
  "@types/figlet": "^1.7.0",
66
66
  "@types/node-notifier": "8.0.5",
@@ -128,7 +128,7 @@ list this README is checked against.
128
128
  | `dev-debug` | Systematic debugging protocol — reproduce, isolate, diagnose root cause, apply minimal fix, and verify with regression tests |
129
129
  | `dev-daily` | Generate a daily summary report from agent usage data, git history, and notes |
130
130
  | `dev-dogfood` | Dogfood an agent skill/command/CLI — drive it end-to-end with bounded auto-fix, self-monitor, and emit a comprehensive report |
131
- | `dev-find-issue` | Generate the daily/ad-hoc history-anatomy diagnostic report over already-imported history — mode contract, closed finding taxonomy, eleven-section report contract, cache branch, atomic publication; forwards to sp:history-anatomy |
131
+ | `dev-find-issue` | Generate the daily/ad-hoc history-anatomy diagnostic report over already-imported history — mode contract, closed finding taxonomy, twelve-section report contract, cache branch, atomic publication; forwards to sp:history-anatomy |
132
132
  | `dev-find-conflict` | Authority-aware semantic audit across source, task, feature, and project authority files — detect conflicts, resolve claim-specific authority, and route confirmed repairs through owner surfaces |
133
133
  | `dev-find-next` | Prompt-first feature frontier prioritizer — ranks the open feature frontier by derived importance/urgency with per-candidate evidence; gates unactionable features; emits tree defects as proposals only |
134
134
  | `dev-fixall` | Fix all lint, type, and test errors systematically across the working tree |
@@ -318,7 +318,7 @@ surface or run one workflow. All skills target the same five core platforms: `cl
318
318
  | `next-feature` | 1.0 | Prompt-first feature frontier prioritizer — sync-first precondition, B3 actionability gate (cited, never restated), tiered rubric over measured signals, D1–D4 defect proposals conforming to the restructure map schema; backs `/sp:dev-find-next` |
319
319
  | `pr-reviewing` | 1.0 | GitHub Codex PR review — PR prepare/reuse, `@codex review` request with per-HEAD dedupe, bounded polling, findings normalization, validated fix + re-review; spine SSOT `pr-review.yaml` + `scripts/pr-reviewing.ts`; backs `/sp:dev-pr-review` |
320
320
  | `indexed-context` | 1.0 | Cross-agent project context — anatomy/learnings/pitfalls/buglog/memory in `.spur/context/`; hook-tracked token-ledger; graceful degradation on agents without hooks |
321
- | `history-anatomy` | 1.0 | Diagnostic interpretation owner over already-imported history — daily/ad-hoc mode contract, closed finding taxonomy, eleven-section report contract, `enrich`/`validate` rubrics; no workflow launch, no JSONL fallback, no corpus mutation |
321
+ | `history-anatomy` | 1.0 | Diagnostic interpretation owner over already-imported history — daily/ad-hoc mode contract, closed finding taxonomy, twelve-section report contract, `enrich`/`validate` rubrics; no workflow launch, no JSONL fallback, no corpus mutation |
322
322
 
323
323
  #### Bounded coexistence and retirement gate — `sp:issue-finding` (HA-S1 0661)
324
324
 
@@ -1,7 +1,7 @@
1
1
  ---
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"
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: "[<focus>] [--mode <daily|ad-hoc>] [--date <YYYY-MM-DD>] [--since <RFC3339>] [--until <RFC3339>] [--recompute] [--agent <inline|auto|name>] [--output <path>]"
4
+ argument-hint: "[<focus>] [--mode <daily|ad-hoc>] [--date <YYYY-MM-DD>] [--since <RFC3339>] [--until <RFC3339>] [--recompute] [--agent <auto|name>] [--output <path>]"
5
5
  allowed-tools: ["Bash", "Read", "Skill"]
6
6
  ---
7
7
 
@@ -10,7 +10,7 @@ allowed-tools: ["Bash", "Read", "Skill"]
10
10
  Wraps the **sp:history-anatomy** skill — the independent owner of diagnostic interpretation over
11
11
  already-imported history. The skill resolves the mode contract (daily is the default and uses the
12
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
13
+ contract (twelve sections, closed finding taxonomy, evidence rules, recurrence ledger), and
14
14
  exposes the `enrich` and `validate` operations the `history-anatomy.yaml` workflow invokes.
15
15
  Publication is atomic and gated behind both the deterministic structure gate and independent
16
16
  evidence validation. This command never triggers an import.
@@ -25,7 +25,7 @@ evidence validation. This command never triggers an import.
25
25
  | `--since` `<RFC3339>` | Inclusive lower bound (ad-hoc; required). | omitted |
26
26
  | `--until` `<RFC3339>` | Inclusive upper bound (ad-hoc; required). | omitted |
27
27
  | `--recompute` | Force the full analyze/render/enrich/validate path; records disposition forced-recompute. | off |
28
- | `--agent` `<inline\|auto\|name>` | Execution surface selector. | inline |
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
29
  | `--output` `<path>` | Explicit report output path (ad-hoc; default writes to the run directory). | run dir |
30
30
 
31
31
  For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.3.62",
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.