@gobing-ai/spur 0.3.64 → 0.3.66

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 (108) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/corpus-baseline.json +4104 -7381
  3. package/config/rules/boundary/sp-runtime-path.yaml +45 -35
  4. package/config/rules/surface/check-cli-surface.yaml +7 -5
  5. package/config/workflows/history-anatomy.yaml +40 -8
  6. package/package.json +9 -9
  7. package/plugins/sp/README.md +13 -9
  8. package/plugins/sp/commands/dev-find-issue.md +4 -1
  9. package/plugins/sp/commands/dev-review-session.md +41 -0
  10. package/plugins/sp/plugin.json +1 -1
  11. package/plugins/sp/references/environment-lens.md +4 -2
  12. package/plugins/sp/references/roles.md +8 -5
  13. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +4 -0
  14. package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +4 -0
  15. package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +1 -1
  16. package/plugins/sp/scripts/dogfood-testing/validate-report.ts +3 -2
  17. package/plugins/sp/skills/dogfood-testing/SKILL.md +19 -11
  18. package/plugins/sp/skills/session-review/SKILL.md +139 -0
  19. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +7 -1
  20. package/plugins/sp/skills/spur-cli/references/workflows.md +1 -1
  21. package/plugins/sp/skills/spur-dev/SKILL.md +5 -0
  22. package/plugins/sp/skills/spur-dev/references/dev-operations.md +13 -10
  23. package/plugins/sp/skills/spur-dev/references/execution-batch.md +71 -15
  24. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +8 -6
  25. package/spur.js +1397 -932
  26. package/web/_astro/{BoardApp.CKolAjUz.js → BoardApp.BEtcJqde.js} +62 -62
  27. package/web/_astro/BoardApp.DBEin4N5.js +1 -0
  28. package/web/_astro/{TaskDetail.Bre7G4gC.js → TaskDetail.ClAbCXom.js} +1 -1
  29. package/web/_astro/arc.CCvf51_y.js +1 -0
  30. package/web/_astro/architectureDiagram-3BPJPVTR.C0cb0J5M.js +36 -0
  31. package/web/_astro/{blockDiagram-GPEHLZMM.CCGHeRVi.js → blockDiagram-GPEHLZMM.CIyjqoCE.js} +4 -4
  32. package/web/_astro/{c4Diagram-AAUBKEIU.CpqewGmd.js → c4Diagram-AAUBKEIU.fs14IuFs.js} +1 -1
  33. package/web/_astro/channel.BGn_DUCD.js +1 -0
  34. package/web/_astro/chunk-2J33WTMH.CaBKv4ZO.js +1 -0
  35. package/web/_astro/{chunk-4BX2VUAB.ifGXoUA3.js → chunk-4BX2VUAB.BOllTPto.js} +1 -1
  36. package/web/_astro/chunk-55IACEB6.ChEof0O4.js +1 -0
  37. package/web/_astro/{chunk-727SXJPM.DzPE41OS.js → chunk-727SXJPM.Co2kdjD8.js} +2 -2
  38. package/web/_astro/{chunk-AQP2D5EJ.UF2QRXYF.js → chunk-AQP2D5EJ.SWmfcnog.js} +2 -2
  39. package/web/_astro/{chunk-FMBD7UC4.D2zXKa1R.js → chunk-FMBD7UC4.rDAFifF3.js} +1 -1
  40. package/web/_astro/chunk-ND2GUHAM.BCnoXKCw.js +1 -0
  41. package/web/_astro/{chunk-QZHKN3VN.nUKFBiLD.js → chunk-QZHKN3VN.RSmy2hDO.js} +1 -1
  42. package/web/_astro/{classDiagram-4FO5ZUOK.DZg9K9mO.js → classDiagram-4FO5ZUOK.Be7PEfrX.js} +1 -1
  43. package/web/_astro/{classDiagram-v2-Q7XG4LA2.DZg9K9mO.js → classDiagram-v2-Q7XG4LA2.Be7PEfrX.js} +1 -1
  44. package/web/_astro/{client.CdFpTatq.js → client.yhYJvxCU.js} +1 -1
  45. package/web/_astro/cose-bilkent-S5V4N54A.BkUp2aSK.js +1 -0
  46. package/web/_astro/cynefin-OW5HDTMX.BegGGlUV.js +166 -0
  47. package/web/_astro/cytoscape.esm.DzSz-X2X.js +321 -0
  48. package/web/_astro/dagre-BM42HDAG.BkUdjsaC.js +4 -0
  49. package/web/_astro/{defaultLocale.CrowFXzY.js → defaultLocale.DX6XiGOO.js} +1 -1
  50. package/web/_astro/diagram-2AECGRRQ.E9vugt3-.js +43 -0
  51. package/web/_astro/diagram-5GNKFQAL.Dj4yeHXB.js +10 -0
  52. package/web/_astro/diagram-KO2AKTUF.Buaquwli.js +3 -0
  53. package/web/_astro/diagram-LMA3HP47.BV3dgGgm.js +24 -0
  54. package/web/_astro/diagram-OG6HWLK6.Cnx3s-tc.js +24 -0
  55. package/web/_astro/{erDiagram-TEJ5UH35.CF2U-pQZ.js → erDiagram-TEJ5UH35.DKK_abu4.js} +3 -3
  56. package/web/_astro/{flowDiagram-I6XJVG4X.BJK4M3in.js → flowDiagram-I6XJVG4X.BNuu9fbm.js} +4 -4
  57. package/web/_astro/ganttDiagram-6RSMTGT7.b16KUMjy.js +292 -0
  58. package/web/_astro/gitGraphDiagram-PVQCEYII.Kh41lbG5.js +106 -0
  59. package/web/_astro/{graph.D2o_JWn5.js → graph.-OzhPTMs.js} +1 -1
  60. package/web/_astro/{index.A0eX93qW.js → index.De90oHcH.js} +1 -1
  61. package/web/_astro/infoDiagram-5YYISTIA.DEWBXkp-.js +2 -0
  62. package/web/_astro/{ishikawaDiagram-YF4QCWOH.BmWDZtwF.js → ishikawaDiagram-YF4QCWOH.DiAdmcL6.js} +4 -4
  63. package/web/_astro/{journeyDiagram-JHISSGLW.CpB1YWDP.js → journeyDiagram-JHISSGLW.D1Ki7IRm.js} +1 -1
  64. package/web/_astro/{kanban-definition-UN3LZRKU.k-fukQX9.js → kanban-definition-UN3LZRKU.CWUhrQpc.js} +21 -21
  65. package/web/_astro/layout.owoKPs3z.js +1 -0
  66. package/web/_astro/linear.BaFsgcCe.js +1 -0
  67. package/web/_astro/{mermaid.core.DnpzzuPU.js → mermaid.core.CHw_AsGy.js} +5 -5
  68. package/web/_astro/{mindmap-definition-RKZ34NQL.D9NnlLBu.js → mindmap-definition-RKZ34NQL.UIhghgmN.js} +8 -8
  69. package/web/_astro/ordinal.DBvzRdQf.js +1 -0
  70. package/web/_astro/pieDiagram-4H26LBE5.D05l3JUA.js +30 -0
  71. package/web/_astro/{quadrantDiagram-W4KKPZXB.BkAygRlm.js → quadrantDiagram-W4KKPZXB.BcWIhIcE.js} +1 -1
  72. package/web/_astro/{requirementDiagram-4Y6WPE33.CX8ibmwc.js → requirementDiagram-4Y6WPE33.B1rYvKGn.js} +1 -1
  73. package/web/_astro/sankeyDiagram-5OEKKPKP.CKylVRC4.js +40 -0
  74. package/web/_astro/{sequenceDiagram-3UESZ5HK.veO8c2tk.js → sequenceDiagram-3UESZ5HK.Dm3uA_s4.js} +3 -3
  75. package/web/_astro/stateDiagram-AJRCARHV.Bgca_BLe.js +1 -0
  76. package/web/_astro/stateDiagram-v2-BHNVJYJU.C1T7YFrG.js +1 -0
  77. package/web/_astro/{timeline-definition-PNZ67QCA.DayoPp_2.js → timeline-definition-PNZ67QCA.ZOHJn3Sn.js} +4 -4
  78. package/web/_astro/vennDiagram-CIIHVFJN.DegZitjD.js +34 -0
  79. package/web/_astro/{wardleyDiagram-YWT4CUSO.lIAjSkZJ.js → wardleyDiagram-YWT4CUSO.BDsC115d.js} +1 -1
  80. package/web/_astro/{xychartDiagram-2RQKCTM6.D8_2K6U1.js → xychartDiagram-2RQKCTM6.D0MO70ea.js} +4 -4
  81. package/web/index.html +1 -1
  82. package/web/_astro/BoardApp.DXD--ybM.js +0 -1
  83. package/web/_astro/arc.7luwOGiC.js +0 -1
  84. package/web/_astro/architectureDiagram-3BPJPVTR.F6KaHXp-.js +0 -36
  85. package/web/_astro/channel.DxfOFf1l.js +0 -1
  86. package/web/_astro/chunk-2J33WTMH.CB9vKa5F.js +0 -1
  87. package/web/_astro/chunk-55IACEB6.VIaRo7l8.js +0 -1
  88. package/web/_astro/chunk-ND2GUHAM.Cb9bDyvx.js +0 -1
  89. package/web/_astro/cose-bilkent-S5V4N54A.D9STo90d.js +0 -1
  90. package/web/_astro/cytoscape.esm.D3_iZ_3b.js +0 -321
  91. package/web/_astro/dagre-BM42HDAG.D3IbwhHz.js +0 -4
  92. package/web/_astro/diagram-2AECGRRQ.BWTDxBe9.js +0 -43
  93. package/web/_astro/diagram-5GNKFQAL.XnXlonHG.js +0 -10
  94. package/web/_astro/diagram-KO2AKTUF.CywOngCO.js +0 -3
  95. package/web/_astro/diagram-LMA3HP47.DY1D21Iu.js +0 -24
  96. package/web/_astro/diagram-OG6HWLK6.DQxb59KA.js +0 -24
  97. package/web/_astro/ganttDiagram-6RSMTGT7.BSniMzdB.js +0 -292
  98. package/web/_astro/gitGraphDiagram-PVQCEYII.Dxg-yRov.js +0 -106
  99. package/web/_astro/infoDiagram-5YYISTIA.BY4CgO_n.js +0 -2
  100. package/web/_astro/layout.DNLMvjEt.js +0 -1
  101. package/web/_astro/linear.BNNCobvI.js +0 -1
  102. package/web/_astro/ordinal.BYWQX77i.js +0 -1
  103. package/web/_astro/pieDiagram-4H26LBE5.CKhoMiyC.js +0 -30
  104. package/web/_astro/sankeyDiagram-5OEKKPKP.Dvurpa0Y.js +0 -40
  105. package/web/_astro/stateDiagram-AJRCARHV.DpMr4CO3.js +0 -1
  106. package/web/_astro/stateDiagram-v2-BHNVJYJU.CKjso86_.js +0 -1
  107. package/web/_astro/vennDiagram-CIIHVFJN.XNHf04O9.js +0 -34
  108. package/web/_astro/wardley-L42UT6IY.CpM_031g.js +0 -161
@@ -1,41 +1,51 @@
1
1
  $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
2
- # Runtime-path boundary rule (task 0217, R6) — zero `config/(plugins|rules|tasks|templates|workflows)`
3
- # references in agent-facing instructions and runtime source code. `config/` is the build-time
4
- # bundled-asset source-of-truth (ADR-015); `.spur/` is the runtime configuration directory that
5
- # agents and runtime code MUST reference. A `config/...` literal in scope teaches the wrong
6
- # convention and propagates confusion into every project created via `/sp:spur-init`.
2
+ # Runtime-path boundary rule (task 0217, R6) — zero
3
+ # `config/(plugins|rules|tasks|templates|workflows)` references in agent-facing
4
+ # instructions and runtime source code. `config/` is the build-time bundled-asset
5
+ # source-of-truth (ADR-015); `.spur/` is the runtime configuration directory that
6
+ # agents and runtime code MUST reference. A `config/...` literal in scope teaches
7
+ # the wrong convention and propagates confusion into every project created via
8
+ # `/sp:spur-init`.
7
9
  #
8
- # Blanket scope (all file types across apps/packages/plugins/sp) chosen deliberately:
9
- # even build-time JSDoc and test-fixture `config/` literals are caught, forcing rephrase rather
10
- # than false-positive triage. See task 0217 Design "Standing enforcement (R6)" for rationale.
10
+ # Blanket scope (all file types across apps/packages/plugins/sp) chosen
11
+ # deliberately: even build-time JSDoc and test-fixture `config/` literals are
12
+ # caught, forcing rephrase rather than false-positive triage. See task 0217
13
+ # Design "Standing enforcement (R6)" for rationale.
11
14
  #
12
- # This is a STANDING gate (not transitional like rg-migration.yaml) — it runs on every pre-check.
15
+ # This is a STANDING gate (not transitional like rg-migration.yaml) — it runs on
16
+ # every pre-check.
13
17
  include:
14
- - "apps/**"
15
- - "packages/**"
16
- - "plugins/sp/**"
18
+ - "apps/**"
19
+ - "packages/**"
20
+ - "plugins/sp/**"
17
21
  exclude:
18
- - "**/node_modules/**"
19
- - "**/dist/**"
20
- # `.pi-lens/cache/` holds autogenerated project snapshots (absolute paths that
21
- # legitimately contain `config/...` substrings). Not source — exclude to avoid
22
- # triaging snapshot noise every pre-check.
23
- - "**/.pi-lens/**"
24
- # Package build artifacts: `build:bundle` copies repo-root config/ apps/cli/config/
25
- # (and legacy spur-cli/config/). Those trees are the ADR-015 SSOT payload itself and
26
- # legitimately contain `config/...` documentation / self-references not runtime paths.
27
- - "apps/cli/config/**"
28
- - "apps/cli/spur-cli/**"
22
+ - "**/node_modules/**"
23
+ - "**/dist/**"
24
+ # `.pi-lens/cache/` holds autogenerated project snapshots (absolute paths that
25
+ # legitimately contain `config/...` substrings). Not source — exclude to avoid
26
+ # triaging snapshot noise every pre-check.
27
+ - "**/.pi-lens/**"
28
+ # `.spur/` runtime dirs hold run records, agent sessions, and captured test
29
+ # output (e.g. e2e failed-agent dumps embedding real source diffs). Not
30
+ # source same class as the .pi-lens exclusion above.
31
+ - "**/.spur/**"
32
+ # Package build artifacts: `build:bundle` copies repo-root config/
33
+ # apps/cli/config/ (and legacy spur-cli/config/). Those trees are the ADR-015
34
+ # SSOT payload itself and legitimately contain `config/...` documentation /
35
+ # self-references — not runtime paths.
36
+ - "apps/cli/config/**"
37
+ - "apps/cli/spur-cli/**"
29
38
  rules:
30
- - id: sp-runtime-path
31
- description: >
32
- Use `.spur/` paths for runtime configuration references, not `config/`. `config/` is the
33
- build-time bundled-asset source-of-truth (ADR-015); `.spur/` is the runtime directory.
34
- Agent-facing instructions (`plugins/sp/`) and runtime code (`apps/`, `packages/`) MUST NOT
35
- contain literal `config/plugins`, `config/rules`, `config/tasks`, `config/templates`, or
36
- `config/workflows` path references.
37
- severity: error
38
- evaluator:
39
- type: rg
40
- config:
41
- pattern: "config/(plugins|rules|tasks|templates|workflows)"
39
+ - id: sp-runtime-path
40
+ description: >
41
+ Use `.spur/` paths for runtime configuration references, not `config/`.
42
+ `config/` is the build-time bundled-asset source-of-truth (ADR-015);
43
+ `.spur/` is the runtime directory. Agent-facing instructions
44
+ (`plugins/sp/`) and runtime code (`apps/`, `packages/`) MUST NOT contain
45
+ literal `config/plugins`, `config/rules`, `config/tasks`,
46
+ `config/templates`, or `config/workflows` path references.
47
+ severity: error
48
+ evaluator:
49
+ type: rg
50
+ config:
51
+ pattern: "config/(plugins|rules|tasks|templates|workflows)"
@@ -1,7 +1,7 @@
1
1
  $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
2
2
  # CLI surface consistency — structural checks that every command file follows
3
3
  # the registerXxxCommand convention and that --json claims are backed by real
4
- # output serialization (toJson or JSON.stringify).
4
+ # output serialization (toEnvelopeJson, toJson, or JSON.stringify).
5
5
  #
6
6
  # Part of the recommended-pre-check preset. Run:
7
7
  # spur rule run --preset recommended-pre-check
@@ -11,7 +11,8 @@ include:
11
11
 
12
12
  exclude:
13
13
  - "apps/cli/src/commands/stubs.ts"
14
- - "apps/cli/src/commands/shared-options.ts" # option registry, not a command module (consistency.test.ts excludes it too)
14
+ - "apps/cli/src/commands/shared-options.ts" # option registry, not a command
15
+ # module (consistency.test.ts excludes it too)
15
16
 
16
17
  rules:
17
18
  - id: cli-register-pattern
@@ -27,11 +28,12 @@ rules:
27
28
 
28
29
  - id: cli-json-output
29
30
  description: >
30
- Command files that register --json options must call toJson() or
31
- JSON.stringify() to produce machine-readable output.
31
+ Command files that register --json options must call toEnvelopeJson()
32
+ (ADR-091 envelope seam), toJson(), or JSON.stringify() to produce
33
+ machine-readable output.
32
34
  severity: error
33
35
  evaluator:
34
36
  type: rg
35
37
  config:
36
- pattern: "toJson\\b|JSON\\.stringify\\b"
38
+ pattern: "toEnvelopeJson\\b|toJson\\b|JSON\\.stringify\\b"
37
39
  mode: require
@@ -14,7 +14,8 @@
14
14
  # start -> resolve-scope -> resolve-paths -> analyze -> cache-probe
15
15
  # (hit -> refresh-provenance -> publish -> published)
16
16
  # (miss -> render -> enrich -> structure-gate -> validate -> stamp -> publish)
17
- # (validate FAIL -> correct (max 1) -> structure-gate ...; exhausted -> failed)
17
+ # (structure-gate FAIL -> correct (max 2 total) -> structure-gate; exhausted -> failed)
18
+ # (validate FAIL -> correct (max 2 total) -> structure-gate ...; exhausted -> failed)
18
19
  # (any all-paths failure -> failed)
19
20
  #
20
21
  # `analyze` precedes `cache-probe` deliberately: ADR-079 makes cache validity a DERIVED fact, so
@@ -43,7 +44,6 @@
43
44
  # spurBin — PATH-independent spur invocation (overridden by CLI at run start)
44
45
  # __runId — run-scoped id for explicit artifact paths (allocated in start)
45
46
  # stepTimeoutMs — agent.run budget for enrich/validate
46
- # correctionCount — bounded correction loop counter file path bits (name resolved in correct)
47
47
 
48
48
  "$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
49
49
  kind: state-machine
@@ -72,7 +72,6 @@ vars:
72
72
  spurBin: "spur"
73
73
  __runId: ""
74
74
  stepTimeoutMs: "1800000"
75
- correctionCount: "0"
76
75
  workflowFile: "config/workflows/history-anatomy.yaml"
77
76
  contractVersion: "1"
78
77
  reportDir: "docs/report"
@@ -229,14 +228,40 @@ states:
229
228
 
230
229
  - id: correct
231
230
  description: >
232
- One bounded correction pass. onEnter increments the counter; the retry edge guards on
233
- correctionCount < 1, the second failure takes the -> failed edge.
231
+ A two-pass correction budget (0690). onEnter increments the counter; retry edges guard on
232
+ the run-scoped correction-count file
233
+ `.spur/run/$__runId-correction-count` < 2 (the live bound — the
234
+ former `vars.correctionCount` declared-but-unread var was removed,
235
+ 0702 R3), and a failure after the second repair takes the -> failed
236
+ edge. The
237
+ counter is shared by the structure-gate and validate FAIL edges, so a structure repair can
238
+ still be followed by one validation-driven repair. The
239
+ model half re-authors the candidate in place from the gate findings and validation notes —
240
+ re-anchoring evidence rows to a backticked .md/.ts/.json path or path:line, stripping
241
+ placeholders, restoring the canonical twelve-section order, and reconciling quantitative
242
+ claims against the current/baseline artifacts — before the deterministic gate re-runs.
234
243
  onEnter:
235
244
  - kind: shell
236
245
  options:
237
246
  command: >-
238
247
  n=$(cat .spur/run/$__runId-correction-count 2>/dev/null || echo 0) &&
239
248
  printf '%s\n' "$((n + 1))" > .spur/run/$__runId-correction-count
249
+ - kind: shell
250
+ options:
251
+ command: >-
252
+ git status --porcelain > .spur/run/$__runId-baseline-correct.txt || true
253
+ - kind: agent.run
254
+ options:
255
+ agent: ${vars.agent}
256
+ input: "Repair .spur/run/${vars.__runId}-candidate.md in place. Read its structure-gate findings, optional validation notes, references/report-contract.md, and the references/operations.md validate rubric; fix every violation. Use a backticked `.md`/`.ts`/`.json` path or a `path:line` anchor, never `current #/...`; remove placeholders and empty rows; restore the twelve-section order; ensure every problem and positive finding carries the full field set; verify every quantitative claim (counts, durations, percentages, distributions) and every current/baseline full-digest match against .spur/run/${vars.__runId}-history-anatomy-current.json and -baseline.json. Overwrite only the candidate; never launch a workflow."
257
+ # Declared Layer-1 role (0538 R2): repair reuses enrich-class judgment.
258
+ role: reviewer
259
+ expectFile: .spur/run/${vars.__runId}-candidate.md
260
+ timeoutMs: ${vars.stepTimeoutMs}
261
+ - kind: shell
262
+ options:
263
+ command: >-
264
+ node "$(superskill script path sp history-anatomy-cache.mjs)" assert-clean --baseline .spur/run/$__runId-baseline-correct.txt --expect .spur/run/$__runId-candidate.md
240
265
 
241
266
  - id: refresh-provenance
242
267
  description: >
@@ -352,7 +377,14 @@ transitions:
352
377
  command: 'grep -q "^PASS$" .spur/run/$__runId-structure-gate.txt 2>/dev/null'
353
378
  - from: structure-gate
354
379
  to: failed
355
- description: Structure gate FAIL — never publish a malformed candidate.
380
+ description: Structure gate FAIL with the correction cap exhausted — never publish a malformed candidate.
381
+ guard:
382
+ kind: shell
383
+ options:
384
+ command: '! grep -q "^PASS$" .spur/run/$__runId-structure-gate.txt 2>/dev/null && test "$(cat .spur/run/$__runId-correction-count 2>/dev/null || echo 0)" -ge 2'
385
+ - from: structure-gate
386
+ to: correct
387
+ description: Structure gate FAIL under the shared two-pass correction cap (0690).
356
388
  guard:
357
389
  kind: always
358
390
 
@@ -365,11 +397,11 @@ transitions:
365
397
  command: 'grep -q "Verdict: PASS" .spur/run/$__runId-validation.txt 2>/dev/null'
366
398
  - from: validate
367
399
  to: correct
368
- description: Validation FAIL under the correction cap — one bounded pass.
400
+ description: Validation FAIL under the shared two-pass correction cap.
369
401
  guard:
370
402
  kind: shell
371
403
  options:
372
- command: '! grep -q "Verdict: PASS" .spur/run/$__runId-validation.txt 2>/dev/null && test "$(cat .spur/run/$__runId-correction-count 2>/dev/null || echo 0)" -lt 1'
404
+ command: '! grep -q "Verdict: PASS" .spur/run/$__runId-validation.txt 2>/dev/null && test "$(cat .spur/run/$__runId-correction-count 2>/dev/null || echo 0)" -lt 2'
373
405
  - from: validate
374
406
  to: failed
375
407
  description: Validation FAIL with the correction cap exhausted — terminate without publishing.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.64",
3
+ "version": "0.3.66",
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.45",
57
- "@gobing-ai/ts-ai-runner": "^0.4.45",
58
- "@gobing-ai/ts-dual-workflow-engine": "^0.4.45",
59
- "@gobing-ai/ts-infra": "^0.4.45",
60
- "@gobing-ai/ts-llm-jsonl-importer": "^0.4.45",
61
- "@gobing-ai/ts-rule-engine": "^0.4.45",
62
- "@gobing-ai/ts-runtime": "^0.4.45",
63
- "@gobing-ai/ts-utils": "^0.4.45",
56
+ "@gobing-ai/ts-db": "^0.4.46",
57
+ "@gobing-ai/ts-ai-runner": "^0.4.46",
58
+ "@gobing-ai/ts-dual-workflow-engine": "^0.4.46",
59
+ "@gobing-ai/ts-infra": "^0.4.46",
60
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.4.46",
61
+ "@gobing-ai/ts-rule-engine": "^0.4.46",
62
+ "@gobing-ai/ts-runtime": "^0.4.46",
63
+ "@gobing-ai/ts-utils": "^0.4.46",
64
64
  "@types/bun": "1.3.14",
65
65
  "@types/figlet": "^1.7.0",
66
66
  "@types/node-notifier": "8.0.5",
@@ -129,6 +129,7 @@ list this README is checked against.
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
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
+ | `dev-review-session` | Review the active coding-agent session inline — compact outcome, resolved/open issues with evidence, proposal-only improvements, and next actions; forwards to sp:session-review |
132
133
  | `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
134
  | `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
135
  | `dev-fixall` | Fix all lint, type, and test errors systematically across the working tree |
@@ -173,7 +174,8 @@ and verification (`sp:code-verification`) — plus a CLI facade (`sp:spur-cli`,
173
174
  `spur` noun) and standalone technique skills (`sp:next-router`, `sp:test-driven-development`, `sp:brainstorm`,
174
175
  `sp:wayfinder`, `sp:sys-debugging`, `sp:code-review`, `sp:code-simplification`, `sp:code-improvement`,
175
176
  `sp:parallel-execution`, `sp:branch-workflow`, `sp:doc-evolve`, `sp:dogfood-testing`,
176
- `sp:daily-summary`, `sp:reverse-engineering`, `sp:issue-finding`, `sp:conflict-finding`, `sp:indexed-context`, `sp:redesign-web-ui`). See
177
+ `sp:daily-summary`, `sp:reverse-engineering`, `sp:issue-finding`, `sp:conflict-finding`,
178
+ `sp:indexed-context`, `sp:session-review`, `sp:redesign-web-ui`). See
177
179
  [skills/spur-dev/SKILL.md](skills/spur-dev/SKILL.md)'s Step routing table for which skill owns which
178
180
  pipeline step.
179
181
 
@@ -181,7 +183,7 @@ pipeline step.
181
183
 
182
184
  ```
183
185
  plugins/sp/
184
- ├── skills/ # Domain knowledge + workflow docs (31 skills)
186
+ ├── skills/ # Domain knowledge + workflow docs (32 skills)
185
187
  │ ├── brainstorm/ # Structured ideation workflow
186
188
  │ │ ├── agents/openai.yaml
187
189
  │ │ ├── examples/ideation-example.md
@@ -243,12 +245,13 @@ plugins/sp/
243
245
  │ │ └── references/{audit-checklist, upgrade-techniques}.md
244
246
  │ ├── history-anatomy/ # Diagnostic interpretation owner over already-imported history (backs /sp:dev-find-issue)
245
247
  │ │ └── references/{modes.md, report-contract.md, operations.md}
248
+ │ ├── session-review/ # Inline, report-only review of the active coding-agent session
246
249
  │ ├── sys-architecture/ # Architecture / ADR judgment competency
247
250
  │ │ └── references/decision-method.md
248
251
  │ ├── sys-debugging/ # Structured debugging protocol
249
252
  │ │ └── references/debugging-protocol.md
250
253
  │ └── wayfinder/ # Multi-session investigation maps (SKILL.md only)
251
- ├── commands/ # 37 slash-command wrappers — the SSOT (hand-editable thin wrappers; see Commands below)
254
+ ├── commands/ # 39 slash-command wrappers — the SSOT (hand-editable thin wrappers; see Commands below)
252
255
  ├── agents/ # 4 specialist subagents (expert-spur, super-coder, super-planner, super-reviewer)
253
256
  ├── hooks/ # hooks.json + task-write-guard.{ts,test.ts} + context-{session-start,post-tool,session-stop}.ts
254
257
  │ # + careful-guard.{ts,test.ts} + context-hooks.test.ts + token-estimate.test.ts
@@ -286,8 +289,8 @@ Tier 3 — Execution Layer (spur CLI + Guard Scripts)
286
289
  The single source of truth for domain knowledge and workflow documentation. Each skill is a
287
290
  self-contained knowledge module that teaches the agent how to operate one slice of the Spur CLI
288
291
  surface or run one workflow. All skills target the same five core platforms: `claude-code`, `codex`,
289
- `antigravity`, `opencode`, `openclaw`; `conflict-finding`, `issue-finding`, `next-feature`, and
290
- `reverse-engineering` additionally declare `pi`.
292
+ `antigravity`, `opencode`, `openclaw`; selected read-only and review skills additionally declare
293
+ `pi`.
291
294
 
292
295
  | Skill | Ver | Domain |
293
296
  | --------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
@@ -321,6 +324,7 @@ surface or run one workflow. All skills target the same five core platforms: `cl
321
324
  | `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` |
322
325
  | `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 |
323
326
  | `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 |
327
+ | `session-review` | 1.0 | Inline review of the active coding-agent session — compact outcomes, evidence-backed resolved/open issue classification, proposal-only improvements, and next actions; no workflow, import, delegation, or mutation |
324
328
  | `redesign-web-ui` | 1.0 | Existing-UI visual upgrade — audit generic AI fingerprints, apply in-stack polish against `DESIGN.md` / live tokens, verify behavior and viewports; does not migrate frameworks |
325
329
 
326
330
  #### Bounded coexistence and retirement gate — `sp:issue-finding` (HA-S1 0661)
@@ -354,11 +358,11 @@ Skills contain zero validation logic — the CLI is the gate.
354
358
 
355
359
  Thin slash-command wrappers that parse user arguments and delegate to the corresponding skill. Each
356
360
  command is a user-facing entry point that bridges natural language to skill invocation. There are
357
- **38 commands** (see the Command index above for the full list), organized by the surface they wrap:
361
+ **39 commands** (see the Command index above for the full list), organized by the surface they wrap:
358
362
 
359
363
  | Prefix | Count | Delegates to | Purpose |
360
364
  | ------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
361
- | `dev-*` | 32 | `sp:spur-dev`, `sp:code-implementation`, `sp:code-testing`, `sp:code-verification`, `sp:code-simplification`, `sp:next-router`, `sp:brainstorm`, `sp:dogfood-testing`, `sp:parallel-execution`, `sp:sys-debugging`, `sp:daily-summary`, `sp:history-anatomy`, `sp:conflict-finding`, `sp:reverse-engineering`, `sp:pr-reviewing`, inline | The dev-workflow surface — planning, execution, batch, wrap-up, review/verify, hygiene |
365
+ | `dev-*` | 33 | `sp:spur-dev`, `sp:code-implementation`, `sp:code-testing`, `sp:code-verification`, `sp:code-simplification`, `sp:next-router`, `sp:brainstorm`, `sp:dogfood-testing`, `sp:parallel-execution`, `sp:sys-debugging`, `sp:daily-summary`, `sp:history-anatomy`, `sp:session-review`, `sp:conflict-finding`, `sp:reverse-engineering`, `sp:pr-reviewing`, inline | The dev-workflow surface — planning, execution, batch, wrap-up, review/verify, hygiene |
362
366
  | `rule-*` | 3 | `sp:spur-cli` | The rule surface — `rule-add`, `rule-refine`, `rule-scan` |
363
367
  | `workflow-*` | 2 | `sp:spur-cli` | The workflow surface — `workflow-add`, `workflow-refine` |
364
368
  | `spur-init` | 1 | `sp:doc-evolve` | Project bootstrap (`spur init`) with doc-evolve integration |
@@ -368,7 +372,7 @@ Each command file contains:
368
372
  - YAML frontmatter (`description`, `argument-hint`, `allowed-tools`).
369
373
  - A delegation block: `Skill(skill="sp:<skill-name>", args="<operation> $ARGUMENTS")`.
370
374
 
371
- **Commands as SSOT (ADR-032).** The 38 `.md` files in `commands/` are the authoritative,
375
+ **Commands as SSOT (ADR-032).** The 39 `.md` files in `commands/` are the authoritative,
372
376
  hand-editable source for the operator command surface. Per-platform adapters are **install-time
373
377
  output** owned by `superskill` (`superskill install sp`) and never committed here. Plugin `sp` ships
374
378
  no per-platform artifacts — only the platform-independent thin wrappers.
@@ -497,7 +501,7 @@ the hard gate that the soft skill cannot enforce on its own.
497
501
  ```mermaid
498
502
  graph TB
499
503
  subgraph "User entry points"
500
- CMD["Commands<br/>37 slash commands<br/>/sp:dev-plan, /sp:dev-runall, /sp:dev-refineall, /sp:rule-add, ..."]
504
+ CMD["Commands<br/>39 slash commands<br/>/sp:dev-plan, /sp:dev-runall, /sp:dev-review-session, /sp:rule-add, ..."]
501
505
  AGENT["Agents<br/>4 subagents<br/>expert-spur, super-coder, super-planner, super-reviewer"]
502
506
  HOOK["PreToolUse hook<br/>Write|Edit matcher"]
503
507
  end
@@ -1,5 +1,5 @@
1
1
  ---
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"
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 historical issues, post-mortem, performance analysis, history-anatomy, run the daily report, ad-hoc diagnosis"
3
3
  role: reviewer
4
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"]
@@ -15,6 +15,9 @@ exposes the `enrich` and `validate` operations the `history-anatomy.yaml` workfl
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.
17
17
 
18
+ For an immediate review of the active conversation, route to `/sp:dev-review-session`; this command
19
+ owns imported-history windows, recurrence, trends, and quantitative forensics only.
20
+
18
21
  ## Argument Flags
19
22
 
20
23
  | Flag | Description | Default |
@@ -0,0 +1,41 @@
1
+ ---
2
+ description: "Review the active coding-agent session immediately: summarize outcomes, distinguish resolved and open issues with evidence, and propose bounded improvements. With --triage: apply pure-doc / one-to-two-line fixes inline, then file remaining findings as one new task. Triggers: review this session, session wrap-up, immediate retrospective, what happened, what was resolved, triage findings"
3
+ role: reviewer
4
+ argument-hint: "[<focus>] [--triage]"
5
+ allowed-tools: ["Bash", "Read", "Grep", "Glob", "Skill"]
6
+ ---
7
+
8
+ # Dev Review Session
9
+
10
+ Wraps the **sp:session-review** skill for a lightweight review of the active host session. By
11
+ default it is report-only: current conversation plus read-only repository evidence, run inline so
12
+ the session context is preserved — no workflow launch, history import, task creation, or
13
+ remediation. With `--triage`, it first triages the findings, then applies direct fixes (pure
14
+ documentation work and one-to-two-line fixes) inline and files everything remaining as exactly one
15
+ new task for further fixing.
16
+
17
+ ## Argument Flags
18
+
19
+ | Flag | Description | Default |
20
+ | --- | --- | --- |
21
+ | `[<focus>]` | Optional question or operation to emphasize without excluding material session outcomes. | full active session |
22
+ | `--triage` | After the report: bucket findings → apply pure-doc / 1–2-line fixes inline → create one task for the remainder. | off (report-only) |
23
+
24
+ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
25
+
26
+ ## Usage
27
+
28
+ ```
29
+ /sp:dev-review-session
30
+ /sp:dev-review-session "why the verification loop repeated"
31
+ /sp:dev-review-session --triage
32
+ /sp:dev-review-session "F95 findings" --triage
33
+ ```
34
+
35
+ ## Implementation
36
+
37
+ Invoke the skill directly in the active host session; do not delegate to a subagent or subprocess.
38
+
39
+ ```
40
+ Skill(skill="sp:session-review", args="$ARGUMENTS")
41
+ ```
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.3.64",
3
+ "version": "0.3.66",
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"]
@@ -9,7 +9,8 @@ shipped or invoked by anything in this plugin.)
9
9
  Neither report projection restates the table below; each links here as its category table
10
10
  (task 0686 / feature I9; accepted design `docs/design/environment-improvement-lens.md`,
11
11
  ADR-084/085). There is deliberately no `/sp:dev-retro` command, no CLI change, and no protocol
12
- bump behind this mapping.
12
+ bump behind this mapping. `sp:session-review` consumes only the placement rule for supported
13
+ live-session proposals; it adds no category projection or imported-history analysis owner (ADR-089).
13
14
 
14
15
  ## Canonical categories and projections
15
16
 
@@ -58,7 +59,8 @@ create` handoff, manual edit), which remain explicit human gates.
58
59
  ## Keep / drop boundary
59
60
 
60
61
  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
+ this placement rule. The active-session reviewer may apply the placement rule without copying the
63
+ table. Dropped (each needs its own operator decision): installing or invoking the
62
64
  out-of-tree retro practice, a standalone retro command, `CODING_STANDARDS.md` as a file, runtime
63
65
  parsing of this markdown by validators, automatic remediation of environment findings, and
64
66
  folding the lens into wrap-up learnings or `.spur/context/` memory.
@@ -58,7 +58,7 @@ roles:
58
58
  stages: [implement, test, wrap]
59
59
  - id: reviewer
60
60
  tier: capable-1
61
- commands: [dev-verify, dev-verifyall, dev-review, dev-pr-review, dev-dogfood, rule-scan, dev-find-conflict, dev-find-issue]
61
+ commands: [dev-verify, dev-verifyall, dev-review, dev-review-session, dev-pr-review, dev-dogfood, rule-scan, dev-find-conflict, dev-find-issue]
62
62
  stages: [verify, review, dogfood]
63
63
  - id: planner
64
64
  tier: capable-2
@@ -81,9 +81,11 @@ must not sit below the highest `min_tier` among its folded stages.
81
81
  simplification, fix-everything sweeps, reverse engineering, wrap-up, and the end-to-end
82
82
  delivery flow (`dev-gtd`). Folds `implement`, `test`, `wrap`.
83
83
  - **`reviewer` (capable-1).** Verification and analysis: per-task verify/review, batch verify,
84
- dogfooding, anti-pattern scanning (`rule-scan`), and the two audit commands (`dev-find-conflict`,
85
- `dev-find-issue`) — those analyse rather than transcribe, which is why they sit here and not
86
- under `scribe`. `dev-find-issue` now routes through the `sp:history-anatomy` skill (mode contract + report contract). Folds `verify`, `review`, `dogfood`.
84
+ dogfooding, anti-pattern scanning (`rule-scan`), immediate session review, and the two audit
85
+ commands (`dev-find-conflict`, `dev-find-issue`) — those analyse rather than transcribe, which is
86
+ why they sit here and not under `scribe`. `dev-find-issue` routes through `sp:history-anatomy`;
87
+ `dev-review-session` routes through `sp:session-review` in the active host context. Folds
88
+ `verify`, `review`, `dogfood`.
87
89
  - **`planner` (capable-2).** The planning half: feature planning, requirement refinement (single
88
90
  and batch), brainstorm, idea intake, batch run/parallel orchestration, next-step routing,
89
91
  architecture survey, feature-frontier prioritization, and feature-tree restructure. Folds `plan`,
@@ -96,7 +98,8 @@ same stage logic: `dev-refineall` folds `refine` → planner; `dev-find-next` is
96
98
  frontier work → planner; `dev-feature-change` is planning-half corpus surgery on the feature tree →
97
99
  planner; `dev-gtd` is the execution/delivery flow → coder; `dev-find-conflict` and `dev-find-issue`
98
100
  are audits/analysis → reviewer (same reasoning as `rule-scan`). Later additions: `dev-pr-review` is review orchestration —
99
- driving the external PR review and triaging its findings folds the `review` stage → reviewer.
101
+ driving the external PR review and triaging its findings folds the `review` stage → reviewer;
102
+ `dev-review-session` performs evidence-backed review over the active conversation → reviewer.
100
103
 
101
104
  **Consistency is a test, not a convention.** `plugins/sp/tests/roles.test.ts` parses this YAML and
102
105
  asserts the tier-distinctness, command closure, stage-floor, and boundary invariants against the
@@ -7,9 +7,13 @@ var PIPELINE_TOKENS = [
7
7
  "--next",
8
8
  "dev-runall",
9
9
  "dev-wrapall",
10
+ "dev-refineall",
11
+ "dev-verifyall",
10
12
  "dev-run",
11
13
  "dev-wrap",
12
14
  "dev-idea",
15
+ "refineall",
16
+ "verifyall",
13
17
  "runall",
14
18
  "wrapall",
15
19
  "run",
@@ -51,9 +51,13 @@ const PIPELINE_TOKENS = [
51
51
  '--next',
52
52
  'dev-runall',
53
53
  'dev-wrapall',
54
+ 'dev-refineall',
55
+ 'dev-verifyall',
54
56
  'dev-run',
55
57
  'dev-wrap',
56
58
  'dev-idea',
59
+ 'refineall',
60
+ 'verifyall',
57
61
  'runall',
58
62
  'wrapall',
59
63
  'run',
@@ -18,7 +18,7 @@ function countLedgerDataRows(markdown) {
18
18
  const nextHeading = after.search(/^### /m);
19
19
  const body = nextHeading === -1 ? after : after.slice(0, nextHeading);
20
20
  const rows = body.split(`
21
- `).filter((line) => line.trim().startsWith("|")).filter((line) => !/^\|[\s:|-]+\|?\s*$/.test(line.trim())).filter((line) => !/^\|\s*drift:/.test(line.trim()));
21
+ `).filter((line) => line.trim().startsWith("|")).filter((line) => !/^\|[\s:|-]+\|?\s*$/.test(line.trim())).filter((line) => !/^\|\s*`?drift:/.test(line.trim()));
22
22
  return Math.max(rows.length - 1, 0);
23
23
  }
24
24
  function declaredExecutedSteps(markdown) {
@@ -37,8 +37,9 @@ function countLedgerDataRows(markdown: string): number | null {
37
37
  .filter((line) => line.trim().startsWith('|'))
38
38
  .filter((line) => !/^\|[\s:|-]+\|?\s*$/.test(line.trim()))
39
39
  // drift:external rows are documentary (task 0296) — included in the table but
40
- // subtracted from the executed-step count, per the @1.2 cardinality contract.
41
- .filter((line) => !/^\|\s*drift:/.test(line.trim()));
40
+ // subtracted from the executed-step count, per the @1.2 cardinality contract;
41
+ // the prescribed code-span form (`drift:external`) matches too (task 0701 R5b).
42
+ .filter((line) => !/^\|\s*`?drift:/.test(line.trim()));
42
43
  // Minus the header row; what remains are data rows.
43
44
  return Math.max(rows.length - 1, 0);
44
45
  }
@@ -408,22 +408,22 @@ no fix applications and a clean tree at finalize needs no drift row.
408
408
 
409
409
  ### What drift is — and is not
410
410
 
411
- **Drift** = a tracked file changes that neither the driver nor the testee ledger row names.
412
- **Explained** set = files named in ledger `Fix Applied` cells (driver fixes) plus files the testee
413
- wrote that the driver recorded in the ledger (testee-attributed writes). Anything else in
414
- `git status --porcelain` that is new or modified since baseline is drift.
411
+ **Drift** = a tracked file changes that neither the driver nor a testee ledger row names.
412
+ **Explained** set = files named in ledger `Fix Applied` cells (driver fixes) plus testee writes the
413
+ driver recorded in the ledger. Anything else new or modified in `git status --porcelain` since
414
+ baseline is drift.
415
415
 
416
416
  ### On detecting drift
417
417
 
418
418
  - Append a **warning ledger row** tagged `drift:external` in the Step column: paths in `Fix Applied`,
419
- `Outcome: drift`, `Basis: <fingerprint diff>`. Do NOT mark the step PASSED/FIXED on account of
420
- drift; the row records the drift, it does not change a step's outcome.
419
+ `Outcome: drift`, `Basis: <fingerprint diff>`. Do NOT mark the step PASSED/FIXED because of
420
+ drift; the row records the drift, it does not change a step's outcome. Write the Step cell as
421
+ the code span `` `drift:external` `` — the validator drops it from the data-row count (0701 R5b).
421
422
  - Emit a **mandatory report finding** under §6 Findings — `P2 — workspace drift detected during
422
- run; attribution to external writer` — naming the drifted paths and the snapshot delta. The report
423
- explicitly states the run's evidence is degraded, not voided.
424
- - The driver **never** claims drifted files as its own or the testee's work. A fix ledger row's
425
- `Fix Applied` cites only the file:line the driver changed; drift rows cite the drifted paths
426
- separately.
423
+ run; attribution to external writer` — naming the drifted paths and the snapshot delta. The
424
+ report states the run's evidence is degraded, not voided.
425
+ - The driver **never** claims drifted files as its own or the testee's work: a fix row's
426
+ `Fix Applied` cites only what the driver changed; drift rows cite drifted paths separately.
427
427
 
428
428
  ### Worktree advisory (mutating dogfoods)
429
429
 
@@ -619,3 +619,11 @@ socket binding. Signals: `EPERM: operation not permitted`, `FS_PERMISSION_DENIED
619
619
  `sandbox.network.allowLocalBinding`. Caveat: `spur agent doctor` reports `usable: true` from
620
620
  configuration alone — it never probes a real dispatch, so `usable` means *configured*, not
621
621
  *proven runnable under this sandbox*.
622
+
623
+ Related operator-local trap (spur task 0689): adding a `permissions.allow` `write_file(**)` entry
624
+ to an executor's own settings (e.g. `~/.gemini/antigravity-cli/settings.json`) is an **operator-
625
+ local unblock, not the shipped fix**. It is per-machine and untracked, and it **masks shim
626
+ regressions in local end-to-end runs**: a broken headless dispatch looks green on the patched
627
+ machine while failing on every other machine and in CI. The fix belongs in the executor shim
628
+ (print-mode permission affordance); keep the allow entry, if at all, as a documented convenience
629
+ and never as the reason a run passes.