peaks-loop 4.0.0-beta.14 → 4.0.0-beta.15

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 (204) hide show
  1. package/CHANGELOG.md +230 -148
  2. package/README-en.md +1 -1
  3. package/README.md +32 -1
  4. package/bin/peaks.js +0 -0
  5. package/dist/cli/cli-helpers.d.ts +1 -1
  6. package/dist/cli/cli-helpers.js +1 -1
  7. package/dist/cli/commands/adapter-commands-s2a.js +1 -1
  8. package/dist/cli/commands/asset-commands.js +33 -16
  9. package/dist/cli/commands/audit-commands.js +1 -1
  10. package/dist/cli/commands/bee-commands.js +1 -1
  11. package/dist/cli/commands/capability-commands.js +1 -1
  12. package/dist/cli/commands/classify-classify-commands.js +1 -1
  13. package/dist/cli/commands/code-commands.js +1 -1
  14. package/dist/cli/commands/code-review-commands.js +1 -1
  15. package/dist/cli/commands/codegraph-commands.js +1 -1
  16. package/dist/cli/commands/compact-command.js +1 -1
  17. package/dist/cli/commands/complexity-commands.js +1 -1
  18. package/dist/cli/commands/config-commands.js +1 -1
  19. package/dist/cli/commands/context-commands.js +1 -1
  20. package/dist/cli/commands/contract-commands.js +1 -1
  21. package/dist/cli/commands/core/artifacts-command.js +1 -1
  22. package/dist/cli/commands/core/binding-commands.js +1 -1
  23. package/dist/cli/commands/core/doctor-command.js +63 -3
  24. package/dist/cli/commands/core/memory-command.js +1 -1
  25. package/dist/cli/commands/core/profile-command.js +1 -1
  26. package/dist/cli/commands/core/proxy-command.js +1 -1
  27. package/dist/cli/commands/core/session-command.js +1 -1
  28. package/dist/cli/commands/core/skill-command.js +2 -2
  29. package/dist/cli/commands/core/standards-command.js +1 -1
  30. package/dist/cli/commands/dispatch-commands.js +2 -2
  31. package/dist/cli/commands/dispatch-from-dag.js +1 -1
  32. package/dist/cli/commands/doc-commands.js +1 -1
  33. package/dist/cli/commands/ecc-commands.js +2 -2
  34. package/dist/cli/commands/evolution-commands.js +1 -1
  35. package/dist/cli/commands/feedback-commands.js +1 -1
  36. package/dist/cli/commands/final-review-commands.js +1 -1
  37. package/dist/cli/commands/fixture-commands.js +1 -1
  38. package/dist/cli/commands/fork-commands.js +1 -1
  39. package/dist/cli/commands/gate-commands.js +1 -1
  40. package/dist/cli/commands/heartbeat-commands.js +1 -1
  41. package/dist/cli/commands/hook-handle.js +1 -1
  42. package/dist/cli/commands/hooks-commands.js +1 -1
  43. package/dist/cli/commands/ide-commands.js +1 -1
  44. package/dist/cli/commands/impact-commands.js +1 -1
  45. package/dist/cli/commands/job-commands.js +1 -1
  46. package/dist/cli/commands/legacy-commands.js +1 -1
  47. package/dist/cli/commands/log-commands.js +1 -1
  48. package/dist/cli/commands/loop-commands.js +1 -1
  49. package/dist/cli/commands/loop-eval-commands.js +1 -1
  50. package/dist/cli/commands/memory-commands.js +1 -1
  51. package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
  52. package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
  53. package/dist/cli/commands/mut-commands.d.ts +1 -1
  54. package/dist/cli/commands/mut-commands.js +1 -5
  55. package/dist/cli/commands/observability-commands.js +1 -1
  56. package/dist/cli/commands/openspec-commands.js +2 -2
  57. package/dist/cli/commands/perf-audit-commands.js +2 -2
  58. package/dist/cli/commands/perf-commands.js +1 -1
  59. package/dist/cli/commands/polyrepo-commands.js +1 -1
  60. package/dist/cli/commands/prd-blocks-commands.js +1 -1
  61. package/dist/cli/commands/prd-commands.js +1 -1
  62. package/dist/cli/commands/project-commands.js +1 -1
  63. package/dist/cli/commands/qa-business-review-commands.js +1 -1
  64. package/dist/cli/commands/qa-commands.d.ts +1 -1
  65. package/dist/cli/commands/qa-commands.js +2 -2
  66. package/dist/cli/commands/release-commands.js +1 -1
  67. package/dist/cli/commands/request-commands.js +1 -1
  68. package/dist/cli/commands/retrospective-commands.js +1 -1
  69. package/dist/cli/commands/reviewer-commands.js +1 -1
  70. package/dist/cli/commands/role-commands.js +1 -1
  71. package/dist/cli/commands/runtime-commands.js +1 -2
  72. package/dist/cli/commands/sc-commands.js +1 -1
  73. package/dist/cli/commands/scan-commands.js +1 -1
  74. package/dist/cli/commands/security-audit-commands.js +2 -2
  75. package/dist/cli/commands/share-commands.d.ts +19 -0
  76. package/dist/cli/commands/share-commands.js +121 -2
  77. package/dist/cli/commands/skill-conformance-commands.js +1 -1
  78. package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
  79. package/dist/cli/commands/skill-search-commands.js +1 -1
  80. package/dist/cli/commands/slice-commands.js +1 -1
  81. package/dist/cli/commands/slice-integrate-commands.js +1 -1
  82. package/dist/cli/commands/slice-review-commands.js +1 -1
  83. package/dist/cli/commands/smoke-commands.js +1 -1
  84. package/dist/cli/commands/sop-commands.js +1 -1
  85. package/dist/cli/commands/statusline-commands.js +1 -1
  86. package/dist/cli/commands/sub-agent-commands.js +2 -1
  87. package/dist/cli/commands/understand-commands.js +1 -1
  88. package/dist/cli/commands/upgrade-commands.js +1 -1
  89. package/dist/cli/commands/user-touchpoint-commands.js +1 -1
  90. package/dist/cli/commands/verdict-aggregate-command.js +1 -1
  91. package/dist/cli/commands/workflow-commands.js +1 -1
  92. package/dist/cli/commands/workflow-plan-commands.js +1 -1
  93. package/dist/cli/commands/workspace/init-command.js +1 -1
  94. package/dist/cli/commands/workspace/migrate-command.js +1 -1
  95. package/dist/cli/commands/workspace/reconcile-command.js +1 -1
  96. package/dist/cli/index.js +1 -1
  97. package/dist/cli/program.js +2 -2
  98. package/dist/services/artifacts/artifact-prerequisites.js +1 -1
  99. package/dist/services/artifacts/request-artifact-service.js +1 -1
  100. package/dist/services/artifacts/workspace-service.js +1 -1
  101. package/dist/services/code/auto-compact-orchestrator.js +5 -2
  102. package/dist/services/code-review/ocr-service.d.ts +1 -1
  103. package/dist/services/code-review/ocr-service.js +6 -3
  104. package/dist/services/config/config-types.js +1 -1
  105. package/dist/services/dashboard/project-dashboard-service.js +2 -2
  106. package/dist/services/dispatch/batch-counter.js +1 -1
  107. package/dist/services/dispatch/dispatch-record-writer.js +1 -1
  108. package/dist/services/job/job-progress-store.d.ts +2 -2
  109. package/dist/services/job/job-types.d.ts +27 -27
  110. package/dist/services/log/retention.js +1 -1
  111. package/dist/services/openspec/openspec-archive-service.js +1 -1
  112. package/dist/services/openspec/openspec-bridge-service.js +1 -1
  113. package/dist/services/openspec/openspec-init-service.js +1 -1
  114. package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
  115. package/dist/services/openspec/openspec-render-service.js +1 -1
  116. package/dist/services/openspec/openspec-scan-service.js +1 -1
  117. package/dist/services/openspec/openspec-validate-service.js +1 -1
  118. package/dist/services/scan/acceptance-coverage-service.js +1 -1
  119. package/dist/services/scan/archetype-service.js +1 -1
  120. package/dist/services/scan/existing-system-service.js +1 -1
  121. package/dist/services/scan/libraries-service.js +1 -1
  122. package/dist/services/skill/skill-search-service.d.ts +5 -5
  123. package/dist/services/skill/skill-search-service.js +2 -2
  124. package/dist/services/skills/skill-registry.js +2 -2
  125. package/dist/services/skills/skill-runbook-service.js +1 -1
  126. package/dist/services/slice/slice-check-service.js +1 -1
  127. package/dist/services/understand/understand-hybrid-service.js +1 -1
  128. package/dist/services/understand/understand-scan-service.js +2 -2
  129. package/dist/services/upgrade/upgrade-service.js +4 -3
  130. package/dist/services/verdict/envelopes.d.ts +2 -2
  131. package/dist/services/verdict/envelopes.js +2 -2
  132. package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
  133. package/dist/services/workflow/autonomous-resume-writer.js +1 -1
  134. package/dist/services/workflow/plan-reader.d.ts +1 -1
  135. package/dist/services/workflow/plan-reader.js +1 -1
  136. package/dist/services/workflow/plan-refresher.d.ts +1 -1
  137. package/dist/services/workflow/plan-refresher.js +1 -1
  138. package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
  139. package/dist/services/workflow/plan-trigger-detector.js +1 -1
  140. package/dist/services/workflow/workflow-router-service.js +11 -9
  141. package/dist/services/workspace/migrate-service.js +1 -1
  142. package/dist/services/workspace/workspace-service.js +1 -1
  143. package/package.json +13 -8
  144. package/scripts/sync-version.mjs +8 -1
  145. package/skills/bee/peaks-rd/SKILL.md +14 -1
  146. package/skills/peaks-code/SKILL.md +44 -0
  147. package/skills/peaks-code/references/sub-agent-dispatch.md +30 -0
  148. package/dist/services/agent/ecc-cache-service.d.ts +0 -97
  149. package/dist/services/agent/ecc-cache-service.js +0 -491
  150. package/dist/services/audit-independent/perf-audit-service.d.ts +0 -151
  151. package/dist/services/audit-independent/perf-audit-service.js +0 -316
  152. package/dist/services/audit-independent/security-audit-service.d.ts +0 -155
  153. package/dist/services/audit-independent/security-audit-service.js +0 -316
  154. package/dist/services/context/dispatch-context-guard.d.ts +0 -27
  155. package/dist/services/context/dispatch-context-guard.js +0 -192
  156. package/dist/services/context/shared-channel.d.ts +0 -93
  157. package/dist/services/context/shared-channel.js +0 -308
  158. package/dist/services/crystallization/crystallization-service.d.ts +0 -239
  159. package/dist/services/crystallization/crystallization-service.js +0 -397
  160. package/dist/services/crystallization/crystallization-store.d.ts +0 -75
  161. package/dist/services/crystallization/crystallization-store.js +0 -193
  162. package/dist/services/crystallization/crystallization-types.d.ts +0 -313
  163. package/dist/services/crystallization/crystallization-types.js +0 -299
  164. package/dist/services/crystallization/evidence-brief-builder.d.ts +0 -237
  165. package/dist/services/crystallization/evidence-brief-builder.js +0 -240
  166. package/dist/services/doctor/doctor-service.d.ts +0 -149
  167. package/dist/services/doctor/doctor-service.js +0 -929
  168. package/dist/services/filesystem/file-lock.d.ts +0 -11
  169. package/dist/services/filesystem/file-lock.js +0 -152
  170. package/dist/services/final-review/final-review-service.d.ts +0 -12
  171. package/dist/services/final-review/final-review-service.js +0 -52
  172. package/dist/services/final-review/final-review-types.d.ts +0 -42
  173. package/dist/services/final-review/final-review-types.js +0 -18
  174. package/dist/services/job/job-resource-snapshot.d.ts +0 -7
  175. package/dist/services/job/job-resource-snapshot.js +0 -75
  176. package/dist/services/mut/assert-scanner.d.ts +0 -6
  177. package/dist/services/mut/assert-scanner.js +0 -116
  178. package/dist/services/mut/index.d.ts +0 -8
  179. package/dist/services/mut/index.js +0 -7
  180. package/dist/services/mut/mut-runner.d.ts +0 -39
  181. package/dist/services/mut/mut-runner.js +0 -29
  182. package/dist/services/mut/production-stryker.d.ts +0 -2
  183. package/dist/services/mut/production-stryker.js +0 -75
  184. package/dist/services/mut/report-builder.d.ts +0 -11
  185. package/dist/services/mut/report-builder.js +0 -110
  186. package/dist/services/mut/report-loader.d.ts +0 -31
  187. package/dist/services/mut/report-loader.js +0 -78
  188. package/dist/services/mut/thresholds.d.ts +0 -21
  189. package/dist/services/mut/thresholds.js +0 -22
  190. package/dist/services/mut/types.d.ts +0 -336
  191. package/dist/services/mut/types.js +0 -59
  192. package/dist/shared/fs.d.ts +0 -4
  193. package/dist/shared/fs.js +0 -26
  194. package/dist/shared/paths.d.ts +0 -6
  195. package/dist/shared/paths.js +0 -50
  196. package/dist/shared/result.d.ts +0 -22
  197. package/dist/shared/result.js +0 -46
  198. package/dist/shared/version.d.ts +0 -1
  199. package/dist/shared/version.js +0 -1
  200. package/examples/video-demo/README.md +0 -142
  201. package/examples/video-demo/out/en-closing-960.png +0 -0
  202. package/examples/video-demo/out/zh-closing-960.png +0 -0
  203. package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
  204. package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 5d01343: Monorepo extraction: peaks-loop 4.0.0-beta.15 ships the new pnpm
8
+ workspace shell with 6 independent packages extracted from the main
9
+ repo as Tier-A zero/low-coupling domains:
10
+
11
+ - peaks-loop-shared (4 utils: fs / paths / result / version)
12
+ - peaks-loop-mut (mutation testing + ECC cache)
13
+ - peaks-loop-doctor (project health check)
14
+ - peaks-loop-crystallization (crystallization pipeline)
15
+ - peaks-loop-final-review (4-dim business review)
16
+ - peaks-loop-audit-independent (security + perf audit)
17
+
18
+ Each subpackage has its own typecheck / build / vitest pipeline; they
19
+ are wired back into the main peaks-loop CLI via workspace:_ protocol.
20
+ Trusted Publishing (OIDC) is wired via .github/workflows/publish.yml
21
+ on push tags v_._._ — no NPM_TOKEN required.
22
+
23
+ Also:
24
+
25
+ - D21: peaks sub-agent finalize command (LLM-side completion signal
26
+ to mark dispatch records done/failed/cancelled; without it records
27
+ would stay queued forever).
28
+ - Trusted Publishing via OIDC — npmjs.com trusted publisher
29
+ configured; npm token removed from ~/.npmrc.
30
+
31
+ ### Patch Changes
32
+
33
+ - Updated dependencies [5d01343]
34
+ - peaks-loop-shared@0.1.0
35
+ - peaks-loop-mut@0.1.0
36
+ - peaks-loop-doctor@0.1.0
37
+ - peaks-loop-crystallization@0.1.0
38
+ - peaks-loop-final-review@0.1.0
39
+ - peaks-loop-audit-independent@0.1.0
40
+
3
41
  ## [Unreleased]
4
42
 
5
43
  ## 4.0.0-beta.14 — 2026-07-16
@@ -34,7 +72,8 @@
34
72
  > (PEAKS_HOME defaults to `~/.peaks`). Previously, the code resolved
35
73
  > `home` to `process.cwd()` when invoked from a project root, producing
36
74
  > `<project>/.peaks/state.db` — wrong location for loop engineering
37
- > + bee sediment data.
75
+ >
76
+ > - bee sediment data.
38
77
  >
39
78
  > **Fix**: `src/cli/commands/sediment-commands.ts:664-665` now uses
40
79
  > `peaksHome()` from `src/services/sop/sop-paths.ts:29` (which honors
@@ -59,7 +98,7 @@
59
98
 
60
99
  ### Status: RELEASED (follow-up to `4.0.0-beta.11`; D-013 wrapper exit-code fix)
61
100
 
62
- > **This CHANGELOG entry documents the D-013 follow-up release.
101
+ > \*\*This CHANGELOG entry documents the D-013 follow-up release.
63
102
  > Same source tree as `4.0.0-beta.11`; pure fix for the wrapper
64
103
  > exit-code bug that previously caused `peaks <unknown>` and
65
104
  > `peaks <unknown> --help` to exit 0 with the help banner.
@@ -68,14 +107,14 @@
68
107
  > `COMMAND_NOT_FOUND` JSON envelope. ice-cola baseline 27/27 PASS
69
108
  > (AC3.9/AC3.10 now functionally correct).
70
109
 
71
- > **This CHANGELOG entry documents the SHIPPED 4.0.0-beta.11.
110
+ > \*\*This CHANGELOG entry documents the SHIPPED 4.0.0-beta.11.
72
111
  > It is the post-implementation release of the 4.0.0-beta.10 contract
73
112
  > documented at `docs/release/4.0.0-beta.10.md` (runbook filename
74
113
  > preserved for cross-reference stability).
75
114
  >
76
115
  > The 3 slices (del-minimax-worker, hide-role-skills, on-demand-ecc)
77
116
  > all landed PASS in this branch — see `peaks workflow verify-pipeline
78
- > --rid 2026-07-15-cli-surface-cleanup` and the Slice 1/2/3 sediment
117
+ --rid 2026-07-15-cli-surface-cleanup` and the Slice 1/2/3 sediment
79
118
  > memories in `.peaks/memory/`.
80
119
  >
81
120
  > **Version bump rationale** (D-016): 4.0.0-beta.10 was the pre-impl
@@ -143,15 +182,16 @@
143
182
  > spawn `<cached>/ecc agent run <name> --json` as a subprocess.
144
183
  > RD sub-agent triggered **Gate S3-0**: affaan-m/everything-claude-code
145
184
  > has no `ecc` binary; its real structure is `agents/*.md` flat
146
- > + SKILL.md descriptors. User chose Option B — drop the subprocess
147
- > model entirely.
185
+ >
186
+ > - SKILL.md descriptors. User chose Option B — drop the subprocess
187
+ > model entirely.
148
188
 
149
189
  - **`peaks ecc install`** — downloads affaan-m/everything-claude-code
150
190
  from GitHub releases to `~/.peaks/cache/ecc-<sha>/`. Selective
151
191
  tarball extraction: ONLY `agents/` subtree (skip `rules/`,
152
192
  `commands/`, `settings/`, `docs/`, `README.md`).
153
193
  - **`peaks ecc status`** — reads cache manifest, reports version + sha
154
- + agent count.
194
+ - agent count.
155
195
  - **`peaks ecc ls`** — lists cached agents by parsing `agents/*.md`
156
196
  frontmatter.
157
197
  - **`peaks ecc show <name>`** — outputs the agent's SKILL.md body
@@ -269,7 +309,7 @@ all present after a fresh workspace init.
269
309
  audit/business templates (default: skip if present).
270
310
  - **5-template boot** — every `peaks workspace init` materialises
271
311
  `.peaks/project-scan/{project-scan.md, business-knowledge.md,
272
- security-template.md, perf-template.md, audit-output-schema.md}`.
312
+ security-template.md, perf-template.md, audit-output-schema.md}`.
273
313
  The 4 audit/business templates are bundled at
274
314
  `src/services/workspace/templates/project-scan/*.md` and copied
275
315
  verbatim by `scripts/copy-templates.mjs` (post-`tsc` step; tsc
@@ -381,15 +421,15 @@ exposed two follow-on bugs that the unit suite missed:
381
421
 
382
422
  ### Sediment (Step 11) — 7 lessons in `.peaks/memory/`
383
423
 
384
- | File | Topic |
385
- |---|---|
386
- | `z-code-peaks-loop-9-ide-adapter-vendor-neutrality-adapter.md` | z-code 9th IDE + vendor-neutrality adapter pattern |
387
- | `peaks-loop-install-model-getstrongestmodelid-fallback.md` | install no longer hardcodes default model |
388
- | `desktop-application-ide-adapter-z-code-cli.md` | desktop-app IDE adapter field-degradation decision |
389
- | `peaks-code-runbook-4-0-0-beta-6-skill-md-cli-d-001-d-002-d-003-d-010.md` | 4 SKILL.md / CLI drift points |
390
- | `2026-07-09-zcode-adapter-overview.md` | RID 003 overall summary (project record) |
391
- | `peaks-ide-runtime-detect-zcode-only.md` | `peaks ide model --current` z-code 4-tier priority chain |
392
- | `ide-adapter-detectcurrentmodel-optional-interface-pattern.md` | optional interface field extension pattern |
424
+ | File | Topic |
425
+ | ------------------------------------------------------------------------- | -------------------------------------------------------- |
426
+ | `z-code-peaks-loop-9-ide-adapter-vendor-neutrality-adapter.md` | z-code 9th IDE + vendor-neutrality adapter pattern |
427
+ | `peaks-loop-install-model-getstrongestmodelid-fallback.md` | install no longer hardcodes default model |
428
+ | `desktop-application-ide-adapter-z-code-cli.md` | desktop-app IDE adapter field-degradation decision |
429
+ | `peaks-code-runbook-4-0-0-beta-6-skill-md-cli-d-001-d-002-d-003-d-010.md` | 4 SKILL.md / CLI drift points |
430
+ | `2026-07-09-zcode-adapter-overview.md` | RID 003 overall summary (project record) |
431
+ | `peaks-ide-runtime-detect-zcode-only.md` | `peaks ide model --current` z-code 4-tier priority chain |
432
+ | `ide-adapter-detectcurrentmodel-optional-interface-pattern.md` | optional interface field extension pattern |
393
433
 
394
434
  ### Known follow-ups (S3-cleanup backlog)
395
435
 
@@ -406,7 +446,7 @@ None. All 8 pre-existing adapters continue to load without changes. CLI subcomma
406
446
 
407
447
  ### Added — peaks-solo dispatcher (分诊员)
408
448
 
409
- - **`peaks-solo` skill** — `skills/peaks-solo/SKILL.md` + 3 references (triage / fallback / sediment). Natural-language front door for the Peaks-Loop skill family. Use when the user describes a task in NL and does not know which peaks-* skill fits. 0 breaking change: 3.x / 4.x `/peaks-code` / `/peaks-content` / `/peaks-doctor` etc. continue to work.
449
+ - **`peaks-solo` skill** — `skills/peaks-solo/SKILL.md` + 3 references (triage / fallback / sediment). Natural-language front door for the Peaks-Loop skill family. Use when the user describes a task in NL and does not know which peaks-\* skill fits. 0 breaking change: 3.x / 4.x `/peaks-code` / `/peaks-content` / `/peaks-doctor` etc. continue to work.
410
450
  - **`peaks skill search` CLI** — `src/services/skill/skill-search-service.ts` + `src/cli/commands/skill-search-commands.ts`. Query / tag / domain filters; substring match; structured JSON output. Used by `peaks-solo` to find the right leaf skill. Available as a top-level primitive (not dispatcher-specific).
411
451
  - **Sub-skills unchanged** — `peaks-code / peaks-content / peaks-doctor / peaks-issue-fix-orchestrator / peaks-sop / etc.` are NOT modified. peaks-solo sits alongside, not on top.
412
452
 
@@ -447,9 +487,9 @@ Loop Engineering crystallization is now the product surface. The 4.0.0-beta.3 li
447
487
 
448
488
  - **`.peaks/standards/loop-engineering-guidelines.md`** — the single source of truth for the 10 red lines RL-0..RL-9, each in the four-section karpathy form (Failure modes / Rewrite / Self-check / Out-of-scope). Co-equal karpathy × darwin layers (RL-0).
449
489
  - **`peaks standards lint --category loop-engineering`** — `src/services/standards/loop-engineering-lint.ts`. Parses the guideline file and asserts every red line has all four sections, fails closed otherwise.
450
- - **`peaks skill lint --category loop-engineering-readiness --path <skill-dir>`** — `src/services/standards/loop-engineering-readiness-lint.ts` + `src/cli/commands/skill-loop-engineering-readiness-commands.ts`. Asserts a peaks-* SKILL.md (a) references `.peaks/standards/loop-engineering-guidelines.md`, (b) does not introduce a CLI verb the user is meant to type, (c) does not introduce a JSON / manifest hand-authoring surface. Alias verb: `peaks skill ready --category loop-engineering-readiness --path <skill-dir>`.
490
+ - **`peaks skill lint --category loop-engineering-readiness --path <skill-dir>`** — `src/services/standards/loop-engineering-readiness-lint.ts` + `src/cli/commands/skill-loop-engineering-readiness-commands.ts`. Asserts a peaks-\* SKILL.md (a) references `.peaks/standards/loop-engineering-guidelines.md`, (b) does not introduce a CLI verb the user is meant to type, (c) does not introduce a JSON / manifest hand-authoring surface. Alias verb: `peaks skill ready --category loop-engineering-readiness --path <skill-dir>`.
451
491
  - **Unit guard** — `tests/unit/standards/loop-engineering-guidelines.test.ts` enforces the four-section shape for every red line in the file.
452
- - **peaks-code domain boundary (RL-8)** — `skills/peaks-code/SKILL.md` self-declares as the code-domain long-task loop engineering orchestrator and is NOT a general-purpose orchestrator. Cross-domain peaks-* skills (peaks-content, peaks-issue-fix-orchestrator) import the shared guideline file and pass the readiness lint.
492
+ - **peaks-code domain boundary (RL-8)** — `skills/peaks-code/SKILL.md` self-declares as the code-domain long-task loop engineering orchestrator and is NOT a general-purpose orchestrator. Cross-domain peaks-\* skills (peaks-content, peaks-issue-fix-orchestrator) import the shared guideline file and pass the readiness lint.
453
493
 
454
494
  ### Added — Bundle share + desktop extension surface (§7A, AC-24 / AC-25 / AC-26)
455
495
 
@@ -463,6 +503,7 @@ Loop Engineering crystallization is now the product surface. The 4.0.0-beta.3 li
463
503
  ### Added — SkillHub expansion (5 new tables / non-breaking)
464
504
 
465
505
  The 6+ relation table layout is preserved. 5 new tables added under `.peaks/_runtime/<sessionId>/`:
506
+
466
507
  - `loop_release` (002)
467
508
  - `loop_bee_relation` (003)
468
509
  - loop↔bee share / desktop extension columns (004)
@@ -502,13 +543,16 @@ Migration is non-breaking: every new column has a DEFAULT and the new tables sit
502
543
  ## 4.0.0-beta.2 — 2026-07-07
503
544
 
504
545
  ### Renamed
546
+
505
547
  - **`peaks-solo` → `peaks-code`** — the long-running code-domain orchestrator skill (PRD/RD/QA/UI/SC/TXT pipeline) has been renamed to communicate its scope more accurately. The on-disk directory `~/.peaks/skills/.system/bees/peaks-code/` is preserved as a stable install location; only the manifest `id` and `displayName` change (`peaks-code` / `Peaks Code`). All four sibling skills (`peaks-solo-resume` → `peaks-resume`, `peaks-solo-status` → `peaks-status`, `peaks-solo-test` → `peaks-test`) are now top-level primitives rather than child skills of `peaks-solo`. Migration: `peaks session migrate-skill-name --from peaks-solo --to peaks-code --apply`.
506
548
 
507
549
  ### Changed (Breaking)
550
+
508
551
  - **`peaks skill presence:set peaks-solo` no longer recognized** — the canonical skill name is now `peaks-code`. Existing `.peaks/_runtime/*/active-skill.json` files carrying `skill: "peaks-solo"` are migrated by `peaks session migrate-skill-name`. Manual override: edit the file and replace `"skill": "peaks-solo"` with `"skill": "peaks-code"`.
509
552
  - **CLI surface unchanged** — `peaks code`, `peaks code --fast`, and the entire `peaks-code` skill runbook continue to function; only the skill-identification field (`id`, `displayName`, presence `skill` value) changes. The runbook name `peaks code` is the user-facing verb and remains as-is.
510
553
 
511
554
  ### Fixed (post-rename polish)
555
+
512
556
  - **Rule name normalization** — `Code Code-Change Red Line` → `Code Commit Ban Red Line` (8 occurrences across `src/services/audit/enforcers/code-ban.ts`, `src/cli/commands/hook-handle.ts`, and the audit tests). Aligns with `red-line-catalog.ts` entry `rl-code-ban-001` / `Code Commit Ban`.
513
557
  - **Wire-format error code rename** — `SOLO_MODE_REQUIRES_SOLO_WORKFLOW` → `CODE_MODE_REQUIRES_CODE_WORKFLOW` and `UNSUPPORTED_SOLO_MODE` → `UNSUPPORTED_CODE_MODE` in `src/cli/commands/workflow-commands.ts` (4 test sites updated).
514
558
  - **Test local consts** — `soloResult/soloOutput` → `codeResult/codeOutput` in `tests/unit/cli-program.workflow.test.ts`; `SOLO_PATH/soloAbsPath` → `CODE_PATH/codeAbsPath` in `tests/unit/code/skills-subagent-scope-dir.test.ts`; `SOLO_REF/SOLO_FANOUT_REF` → `CODE_REF/CODE_FANOUT_REF` in `tests/unit/dispatch/dispatch-fanout-mandatory.test.ts`.
@@ -519,11 +563,13 @@ Migration is non-breaking: every new column has a DEFAULT and the new tables sit
519
563
  - **Video demo copy** — `examples/video-demo/src/copy.ts` `skillWas: 'peaks-solo'` → `skillWas: 'peaks-code'` (legacy label, both locales).
520
564
 
521
565
  ### Added
566
+
522
567
  - **Manifest id field** — `.peaks/skills/.system/bees/peaks-code/manifest.json` now carries `{ "id": "peaks-code", "displayName": "Peaks Code" }`. The `migrate-skill-name` service explicitly skips this file (test: `session-migrate-skill-name.test.ts:69` "跳过 .peaks/skills/.system/bees/peaks-code/manifest.json") so the canonical id is only ever edited by hand or by an explicit `peaks skill sediment refine-bee` flow, never by bulk migration.
523
568
  - **Spec §4.1.1 rewrite** — `docs/superpowers/specs/2026-07-04-peaks-maker-dynamic-skill-sediment-design.md` §4.1.1 has been rewritten from "peaks-code as preserved alias" to "peaks-code as the system-stable code-domain bee (renamed from peaks-code)". The plan's spec-coverage table now references the renamed heading.
524
569
  - **Migration helper** — `peaks session migrate-skill-name --from <old> --to <new> [--apply]` is the supported path for renaming skill references in `.peaks/_runtime/`. Idempotent; skip-list includes `.peaks/memory/**` and `.peaks/skills/.system/bees/peaks-code/manifest.json`.
525
570
 
526
571
  ### Verification
572
+
527
573
  - `tsc --noEmit` zero errors
528
574
  - Full `vitest run` exit 0 (all 30 touched test files / 265 directly-tested assertions pass)
529
575
  - `silent-warning-detector` OK on 481 files
@@ -642,10 +688,11 @@ Validated on `C:/Users/smallMark/Desktop/peaksclaw/ice-cola` (consumer project).
642
688
  ## [3.0.2] — 2026-07-02 — change-id shim retirement (v2.19.0) + Understand Anything hybrid context (3.0.2)
643
689
 
644
690
  **PATCH bump from 3.0.1**. Two independent slices bundled into one release:
691
+
645
692
  - **v2.19.0 change-id shim retirement** — full removal of the peaks-loop change-id axis (filesystem axis, code shim, envelope JSON slug, CLI flags). The change-id was a no-op post-v2.17.0 hard-kill; this slice retires the v2.17.0 shim half-life. OpenSpec's independent `openspec/changes/<change-id>/` vocabulary (L4) is preserved untouched.
646
693
  - **3.0.2 Understand Anything hybrid context** — new `peaks understand context` subcommand that encapsulates the UA-first / codegraph-fallback / hybrid-union routing decision in the service layer (per the peaks-loop "skill-first / CLI-auxiliary" architecture). Consumers no longer pick one or the other at the LLM level.
647
694
 
648
- The v2.19.0 work shipped as code commits (`f91d71c`, `5186d3d`, `b598612`, `ced835e`, `7ee9d8f`, plus follow-up tests) but was never formally released. v2.19.0 is therefore *not* a separate release line — its changes are rolled forward into 3.0.2. Future releases resume numeric sequence from 3.0.3.
695
+ The v2.19.0 work shipped as code commits (`f91d71c`, `5186d3d`, `b598612`, `ced835e`, `7ee9d8f`, plus follow-up tests) but was never formally released. v2.19.0 is therefore _not_ a separate release line — its changes are rolled forward into 3.0.2. Future releases resume numeric sequence from 3.0.3.
649
696
 
650
697
  ### Removed — change-id shim (cleanup post v2.17.0 hard-kill)
651
698
 
@@ -668,7 +715,7 @@ The v2.19.0 work shipped as code commits (`f91d71c`, `5186d3d`, `b598612`, `ced8
668
715
  - 12 JSDoc references to the deleted `src/shared/change-id.ts` file scrubbed across `src/services/session/session-binding-bridge.ts`, `src/services/session/session-manager.ts`, `src/shared/path-safety.ts`, `tests/unit/session-manager.test.ts`, `tests/vitest.setup.ts`. The 3 pre-slim `tests/fixtures/skills/pre-slim/*.SKILL.md` fixtures preserve the historical reference per the FROZEN EVIDENCE rule.
669
716
  - 2 weakened `tests/unit/rd/repair-cycle-2-cli-wiring.test.ts` cases restored with real assertions: the test now bootstraps a real session via `peaks workspace init` then drives `peaks swarm plan` end-to-end, asserting `standardsErrorCode`, `standardsDiagnostic`, and `process.exitCode` (no `expect(true).toBe(true)`, no `.skip`).
670
717
 
671
- ### Round 3 — change-id彻底根治
718
+ ### Round 3 — change-id 彻底根治
672
719
 
673
720
  - All 275 internal `changeId` field references in `src/` renamed to `sessionId` across 35 source files (cli/commands, services/workflow, services/tech, services/workspace, services/sc, services/rd, services/prd, services/audit, services/fixture, services/slice, services/mut, services/providers, services/artifacts, services/openspec-adjacent callers). The 65 remaining `changeId` hits are EXCLUSIVELY in `src/cli/commands/openspec-commands.ts` and `src/services/openspec/*.ts` — L4 OpenSpec vocabulary (positional `<change-id>` arg, `openspec/changes/<change-id>/` dir name, OpenSpec spec/proposal markdown tokens). The rename preserves L4 per PRD §Non-Goals.
674
721
  - `WorkspaceInitOptions.changeId?: string` field REMOVED entirely (was a no-op post-v2.17.0; the slice deletes the binding-file legacy and the inline lstatSync guard now scopes the v2.8.3 hard-ban to date-stamped top-level siblings at `.peaks/<YYYY-MM-DD-*>/` only).
@@ -684,6 +731,7 @@ The v2.19.0 work shipped as code commits (`f91d71c`, `5186d3d`, `b598612`, `ced8
684
731
  - `pnpm build` regenerated `dist/` to drop the dead `migrate-change-scope` JS. AC-15 (`node bin/peaks.js workspace migrate-change-scope`) now reports `error: unknown command 'migrate-change-scope'`.
685
732
 
686
733
  ### Round 4 — change-id full root-out (fix 55 test regressions)
734
+
687
735
  - Fixed 55 unit tests failing across 15 files (regressions from round-3 rename script + incomplete code paths).
688
736
  - `peaks request *` dry-run mode no longer creates `.peaks/_runtime/<sid>/` dir eagerly (test updated to assert the canonical single-axis scope dir at apply-time only).
689
737
  - Observability event hook restored on `peaks request transition` (3 tests): root cause was `readSummary` returning the scope fragment (`_runtime/<sid>`) as the bare session id, so `emitObservabilityEvent` landed at `.peaks/_runtime/_runtime/<sid>/metrics/slices.jsonl`. Fix strips the `_runtime[\\/]` prefix when storing the summary's sessionId.
@@ -716,10 +764,11 @@ The v2.19.0 work shipped as code commits (`f91d71c`, `5186d3d`, `b598612`, `ced8
716
764
  ## [3.0.2] — 2026-07-02 — change-id shim retirement (v2.19.0) + Understand Anything hybrid context (3.0.2)
717
765
 
718
766
  **PATCH bump from 3.0.1**. Two independent slices bundled into one release:
767
+
719
768
  - **v2.19.0 change-id shim retirement** — full removal of the peaks-loop change-id axis (filesystem axis, code shim, envelope JSON slug, CLI flags). The change-id was a no-op post-v2.17.0 hard-kill; this slice retires the v2.17.0 shim half-life. OpenSpec's independent `openspec/changes/<change-id>/` vocabulary (L4) is preserved untouched.
720
769
  - **3.0.2 Understand Anything hybrid context** — new `peaks understand context` subcommand that encapsulates the UA-first / codegraph-fallback / hybrid-union routing decision in the service layer (per the peaks-loop "skill-first / CLI-auxiliary" architecture). Consumers no longer pick one or the other at the LLM level.
721
770
 
722
- The v2.19.0 work shipped as code commits (`f91d71c`, `5186d3d`, `b598612`, `ced835e`, `7ee9d8f`, plus follow-up tests) but was never formally released. v2.19.0 is therefore *not* a separate release line — its changes are rolled forward into 3.0.2. Future releases resume numeric sequence from 3.0.3.
771
+ The v2.19.0 work shipped as code commits (`f91d71c`, `5186d3d`, `b598612`, `ced835e`, `7ee9d8f`, plus follow-up tests) but was never formally released. v2.19.0 is therefore _not_ a separate release line — its changes are rolled forward into 3.0.2. Future releases resume numeric sequence from 3.0.3.
723
772
 
724
773
  ### Added — `peaks understand context` (3.0.2 user-facing feature)
725
774
 
@@ -728,12 +777,14 @@ The Understand Anything (UA) Claude Code plugin and `@colbymchenry/codegraph` ar
728
777
  This slice adds a single `peaks understand context` subcommand that encapsulates the routing decision in the service layer (per the peaks-loop "skill-first / CLI-auxiliary" architecture — see `peaks-code` SKILL.md). The envelope carries a `source` tag so downstream consumers can audit which evidence contributed to the context.
729
778
 
730
779
  **Source routing** (deterministic, decided in `buildUnderstandContext`):
780
+
731
781
  - `ua-only` — UA knowledge graph present, no codegraph
732
782
  - `ua-missing-fallback-codegraph` — UA absent, codegraph produced evidence
733
783
  - `ua-and-codegraph-hybrid` — both present, both contribute (parallel `Promise.all`)
734
784
  - `both-missing` — neither produced evidence, exit code 2
735
785
 
736
786
  **Added files (5):**
787
+
737
788
  - `src/services/understand/understand-hybrid-service.ts` (133L, new): `buildUnderstandContext({projectRoot, files?, sampleSize?, artifactDir?, codegraphRunner?})` uses `Promise.all` to run UA scan and codegraph affected in parallel; total wall-clock = `max(uaMs, codegraphMs)`, not sum. Failures are caught into `warnings[]` (best-effort); the main envelope is always returned so consumers can audit missing evidence.
738
789
  - `src/services/understand/hybrid-types.ts` (39L, new): `UnderstandContextResult` envelope + 4-value source enum + `CodegraphContextBlock`.
739
790
  - `src/cli/commands/understand-commands.ts` (208L, +51L net): new `peaks understand context` subcommand at base path `admin/audit-logs` (the only 3rd CLI surface in the understand module family). The subcommand accepts `--project --files --sample --artifact-dir` and emits the envelope as JSON or human-readable summary.
@@ -880,12 +931,12 @@ The 1.x → 2.0 upgrade is an irreversible external side effect (rewrites `~/.pe
880
931
 
881
932
  The split methodology follows the v2.18.0 `session-binding-bridge.ts` pattern: identify a natural seam (state/helpers vs business logic, types vs impl, etc.), extract the chosen section into a new sibling file, and re-export the moved symbols from the original module so external imports are unchanged. Internal references are routed through a local `import { ... }` so the body of the original module continues to compile and behave identically.
882
933
 
883
- | # | File | Before | After (orig + sibling) | New sibling | Seam |
884
- |---|------|-------:|-----------------------:|-------------|------|
885
- | 1 | `src/services/artifacts/request-artifact-service.ts` | 783 | 649 + 153 | `request-artifact-state-helpers.ts` | `RequestArtifactState` type, `ALLOWED_STATES_PER_ROLE`, `allowedStatesForRole`, 4 transition error classes, `updateStatusBlock` frontmatter mutator |
886
- | 2 | `src/services/slice/slice-decompose-service.ts` | 775 | 632 + 178 | `slice-decompose-runners.ts` | 3 default runner factories (`defaultCodegraphRunner`, `defaultUnderstandRunner`, `defaultImportEdgeRunner`) + `runCodegraph` shell-out helper |
887
- | 3 | `src/services/workflow/workflow-autonomous-service.ts` | 774 | 465 + 337 | `workflow-autonomous-resume-helpers.ts` | Resume validation pipeline (`getResumeRequiredArtifacts`, `readResumeArtifact`, `stripChangeScopePrefix`, JSON / frontmatter parsers, `getResumeArtifactsStatus`, `createResumePlan`) + `MAX_RESUME_ARTIFACT_BYTES` const |
888
- | 4 | `src/services/workspace/workspace-service.ts` | 742 | 550 + 217 | `workspace-claude-settings-materializer.ts` | Consumer `.claude/settings.local.json` materialization (`materializeClaudeSettingsLocal`, `writeOfflineTemplateCopy`, `upsertPeaksGitignoreSnippet`) + `PEAKS_GITIGNORE_*` constants |
934
+ | # | File | Before | After (orig + sibling) | New sibling | Seam |
935
+ | --- | ------------------------------------------------------ | -----: | ---------------------: | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
936
+ | 1 | `src/services/artifacts/request-artifact-service.ts` | 783 | 649 + 153 | `request-artifact-state-helpers.ts` | `RequestArtifactState` type, `ALLOWED_STATES_PER_ROLE`, `allowedStatesForRole`, 4 transition error classes, `updateStatusBlock` frontmatter mutator |
937
+ | 2 | `src/services/slice/slice-decompose-service.ts` | 775 | 632 + 178 | `slice-decompose-runners.ts` | 3 default runner factories (`defaultCodegraphRunner`, `defaultUnderstandRunner`, `defaultImportEdgeRunner`) + `runCodegraph` shell-out helper |
938
+ | 3 | `src/services/workflow/workflow-autonomous-service.ts` | 774 | 465 + 337 | `workflow-autonomous-resume-helpers.ts` | Resume validation pipeline (`getResumeRequiredArtifacts`, `readResumeArtifact`, `stripChangeScopePrefix`, JSON / frontmatter parsers, `getResumeArtifactsStatus`, `createResumePlan`) + `MAX_RESUME_ARTIFACT_BYTES` const |
939
+ | 4 | `src/services/workspace/workspace-service.ts` | 742 | 550 + 217 | `workspace-claude-settings-materializer.ts` | Consumer `.claude/settings.local.json` materialization (`materializeClaudeSettingsLocal`, `writeOfflineTemplateCopy`, `upsertPeaksGitignoreSnippet`) + `PEAKS_GITIGNORE_*` constants |
889
940
 
890
941
  The original 4 files land at 465-649 LOC (well below the 800 cap; target range 600-650). The 4 new sibling files are 153-337 LOC. Total LOC across the 8 files is unchanged (3074) — this is a structural refactor only, not a deletion or compression.
891
942
 
@@ -956,12 +1007,12 @@ Each original file gets a sibling `import { ... } from './X-helpers.js'` + `expo
956
1007
 
957
1008
  ### Dogfood
958
1009
 
959
- | # | Scenario | Verdict | Evidence |
960
- |---|---|---|---|
961
- | A | v2.18.1 verify-pipeline happy-path (session-axis) | PASS | `.peaks/_runtime/2026-06-29-session-9cac8e/{rd,qa}/...` resolves as canonical; `data.changeId` slug preserved in envelope |
962
- | B | v2.18.1 verify-pipeline missing-evidence | PASS | Clear `RD evidence missing: ...` violations, no `ReferenceError` |
963
- | C | v2.18.1 prd check-blocks well-formed PRD | PASS | `report.ok: true`, all 4 blocks pass, JSON envelope `{ 业务场景: 'pass', 边界 case: 'pass', UI 装配意图: 'pass' }` |
964
- | D | v2.18.1 prd check-blocks missing 业务场景 block | PASS | `report.ok: false`, `issues: ["Missing required block: 业务场景"]`, no `ReferenceError` |
1010
+ | # | Scenario | Verdict | Evidence |
1011
+ | --- | ------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------- |
1012
+ | A | v2.18.1 verify-pipeline happy-path (session-axis) | PASS | `.peaks/_runtime/2026-06-29-session-9cac8e/{rd,qa}/...` resolves as canonical; `data.changeId` slug preserved in envelope |
1013
+ | B | v2.18.1 verify-pipeline missing-evidence | PASS | Clear `RD evidence missing: ...` violations, no `ReferenceError` |
1014
+ | C | v2.18.1 prd check-blocks well-formed PRD | PASS | `report.ok: true`, all 4 blocks pass, JSON envelope `{ 业务场景: 'pass', 边界 case: 'pass', UI 装配意图: 'pass' }` |
1015
+ | D | v2.18.1 prd check-blocks missing 业务场景 block | PASS | `report.ok: false`, `issues: ["Missing required block: 业务场景"]`, no `ReferenceError` |
965
1016
 
966
1017
  ### Commits
967
1018
 
@@ -992,7 +1043,7 @@ Each original file gets a sibling `import { ... } from './X-helpers.js'` + `expo
992
1043
  - `src/services/session/binding-store.ts:259` — `ownerHint` field is now `${envSignal}#${pid}` (was bare env signal). Preserves the existing v2.17.0 field shape; only the value format changes.
993
1044
  - `registerInstance` distinguishes instances by `(callerId, pid)` tuple, not by `ownerHint` alone. Same pid + same callerId → auto-resume (D2 Claude-instance-level hard-exclusive sid preserved); same callerId + different pid → distinct sids.
994
1045
  - `/compact` resume: same outer-session-id + same pid → reuses sid (verified by new Case B test). Different pid (rare, but possible if the harness restarts) → new sid (safe default, not a stale resume).
995
- - Sub-agent dispatch: sub-agents inherit parent's `CLAUDE_CODE_SESSION_ID` but run in the same Node process → same pid → same callerId → same sid (D2 sid-aggregation across peaks-* skill activations preserved).
1046
+ - Sub-agent dispatch: sub-agents inherit parent's `CLAUDE_CODE_SESSION_ID` but run in the same Node process → same pid → same callerId → same sid (D2 sid-aggregation across peaks-\* skill activations preserved).
996
1047
  - 6 new test cases in `tests/unit/services/session/binding-store.test.ts:151-242`:
997
1048
  - **Case A:** 2 instances, same `callerId`, different `pid` → 2 distinct sids
998
1049
  - **Case B:** 2 instances, same `callerId`, same `pid`, same outer-session-id → 1 sid (auto-resume)
@@ -1030,12 +1081,12 @@ Each original file gets a sibling `import { ... } from './X-helpers.js'` + `expo
1030
1081
 
1031
1082
  ### Dogfood (ice-cola NestJS project, 2026-06-29-session-2e81dc)
1032
1083
 
1033
- | # | Scenario | Verdict | Evidence |
1034
- |---|---|---|---|
1035
- | A | P0 fix verification (binding file format) | PASS | `callerId: 5fa8a7d8-...#13472` matches shell pid 13472; pre-existing instance pid 3876 ≠ current shell — fix works in production-shape data |
1036
- | B | peaks doctor stale-binding scan | PASS | 0 stale bindings, ttl=300000ms, v2.16.0 schema surface intact |
1037
- | C | peaks code smoke (4 sub-commands) | PARTIAL | 3/4 pass; `peaks request lint --project .` is invalid syntax (needs `<rid>` + `--role`); not a v2.18.0 regression |
1038
- | D | env-collision simulation (single shell, 2 envs) | PASS | `fake-session-A#20984` + `fake-session-B#20984` → 2 distinct sids (fupv8b / xnntb1); transposed axis (same pid, different env) verified; primary 2-Claude-windows scenario needs CI integration test with 2 child node processes |
1084
+ | # | Scenario | Verdict | Evidence |
1085
+ | --- | ----------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1086
+ | A | P0 fix verification (binding file format) | PASS | `callerId: 5fa8a7d8-...#13472` matches shell pid 13472; pre-existing instance pid 3876 ≠ current shell — fix works in production-shape data |
1087
+ | B | peaks doctor stale-binding scan | PASS | 0 stale bindings, ttl=300000ms, v2.16.0 schema surface intact |
1088
+ | C | peaks code smoke (4 sub-commands) | PARTIAL | 3/4 pass; `peaks request lint --project .` is invalid syntax (needs `<rid>` + `--role`); not a v2.18.0 regression |
1089
+ | D | env-collision simulation (single shell, 2 envs) | PASS | `fake-session-A#20984` + `fake-session-B#20984` → 2 distinct sids (fupv8b / xnntb1); transposed axis (same pid, different env) verified; primary 2-Claude-windows scenario needs CI integration test with 2 child node processes |
1039
1090
 
1040
1091
  **Dogfood verdict:** 3.5 / 4 pass; `recommend_v2.18.0_commit: true`.
1041
1092
 
@@ -1074,7 +1125,7 @@ The first v2.18.0 release deferred two open items to a redo slice; both are now
1074
1125
  ### Feature — binding-store v2 sentinel (v2.16.0-alpha + v2.17.0)
1075
1126
 
1076
1127
  - `src/services/session/binding-store.ts` — zod-validated multi-instance binding schema with auto-migration from legacy `{ sessionId, createdAt, projectRoot }`. New shape: `{ ownerHint, pid, lastHeartbeat, scope, instances: Record<sid, InstanceRecord> }`.
1077
- - `InstanceRecord` = `{ startedAt, roles: string[], callerId, lastHeartbeat }` — `roles` accumulates as the Claude instance activates multiple peaks-* skills (solos → rd → qa all share one sid).
1128
+ - `InstanceRecord` = `{ startedAt, roles: string[], callerId, lastHeartbeat }` — `roles` accumulates as the Claude instance activates multiple peaks-\* skills (solos → rd → qa all share one sid).
1078
1129
  - Auto-resume: same callerId reuses the same sid; different callers get different sids in the same `instances` map.
1079
1130
  - `dropStale(projectRoot, ttlMs)` for Doctor integration.
1080
1131
 
@@ -1086,7 +1137,7 @@ The first v2.18.0 release deferred two open items to a redo slice; both are now
1086
1137
 
1087
1138
  ### Feature — D2 Claude-instance-level hard-exclusive sid
1088
1139
 
1089
- - Same Claude instance keeps one sid across multiple peaks-* skill activations (peaks-code → peaks-rd → peaks-qa).
1140
+ - Same Claude instance keeps one sid across multiple peaks-\* skill activations (peaks-code → peaks-rd → peaks-qa).
1090
1141
  - `/compact` resume: same outer-session-id reuses the same sid (post-compact-resume v2.11.0 D7 alignment).
1091
1142
 
1092
1143
  ### Feature — Doctor stale-binding scan (AC-10)
@@ -1119,7 +1170,7 @@ The first v2.18.0 release deferred two open items to a redo slice; both are now
1119
1170
 
1120
1171
  Recommended scenarios before next release (see `peaks/_runtime/2026-06-29-session-88411f/txt/handoff-2026-06-29-v2-17-0.md` for details):
1121
1172
 
1122
- 1. **Multi-Claude parallel提速**: open 2 Claude instances in the same project, run `peaks code <different goal>` in each. Verify both bindings coexist with distinct sids.
1173
+ 1. **Multi-Claude parallel 提速**: open 2 Claude instances in the same project, run `peaks code <different goal>` in each. Verify both bindings coexist with distinct sids.
1123
1174
  2. **D1 conflict detection**: 2 instances both targeting the same source file. Verify each writes to its own session-scoped artifact directory.
1124
1175
  3. **`/compact` resume**: run `peaks code <goal>`, `/compact`, continue. Verify same sid reused.
1125
1176
  4. **Doctor stale**: kill -9 a Claude instance, run `peaks doctor`, verify stale binding listed + `--cleanup-stale` works.
@@ -1235,11 +1286,13 @@ Recommended scenarios before next release (see `peaks/_runtime/2026-06-29-sessio
1235
1286
  - **Per the user-given rule** `.peaks/memory/2026-06-28-full-auto-boundary.md`: "full-auto 只做到 commit 就是,push 不用". The commit-boundary hard-floor is the machine enforcement of that advisory rule.
1236
1287
 
1237
1288
  ### Test results
1289
+
1238
1290
  - 4 new test files: `presence-staleness.test.ts` (12), `stale-presence-detection.test.ts` (9), `feedback-promotion.test.ts` (18), `commit-boundary-hard-floor.test.ts` (247). Total new cases: **286**.
1239
1291
  - Existing code tests (mode-gate × 81, post-compact × 11) pass unchanged.
1240
1292
  - Full unit suite baseline 4394 → 4680 passing (286 added). 0 new failures; pre-existing 7 unrelated failures unchanged.
1241
1293
 
1242
1294
  ### Out-of-scope
1295
+
1243
1296
  - Push / tag / npm publish — full-auto boundary = commit only; the commit-boundary hard-floor now BLOCKS these in full-auto (was advisory). User must explicitly confirm via AskUserQuestion to proceed.
1244
1297
  - `peaks hooks install` — slice is code-only. Hooks remain user-only.
1245
1298
  - Cleaning the 88b27d session's stale presence on disk — slice ships the detection + auto-clear, does NOT proactively touch the live tree.
@@ -1262,12 +1315,14 @@ slice-2026-06-28-layered-dag PRD: 大需求(1 周内做不完)= 基础先行 +
1262
1315
  4 个 PRD + 4 个 service + 4 个 CLI 文件 + 4 个 test 文件,共 **17 个新命令 + 63 个新测试通过**。
1263
1316
 
1264
1317
  **G11 上游 tag 同步**(slice-2026-06-28-fork-cli):
1318
+
1265
1319
  - 5 commands: `peaks fork status` / `upstream-check` / `sync-plan` / `sync` / `sync-verify`
1266
1320
  - 持久化 `.peaks/fork-state.json` (baseline + history)
1267
1321
  - `recommendStableTags` 过滤 pre-release 标签(alpha/beta/rc/dev/preview)
1268
1322
  - 15 tests pass
1269
1323
 
1270
1324
  **G13 存量影响面扫描**(slice-2026-06-28-impact-cli):
1325
+
1271
1326
  - 2 commands: `peaks impact scan --files <list>` / `peaks impact must-check --files <list>`
1272
1327
  - 手写 glob 匹配(`**` / `*`),无 AST 依赖
1273
1328
  - 10 个默认业务流(用户管理 / 权限校验 / 登录流程 / Skill 权限 / 数据列表 / API 网关 / DB schema / ...)
@@ -1275,6 +1330,7 @@ slice-2026-06-28-layered-dag PRD: 大需求(1 周内做不完)= 基础先行 +
1275
1330
  - 13 tests pass
1276
1331
 
1277
1332
  **G14 轻量回归 critical-paths**(slice-2026-06-28-smoke-cli):
1333
+
1278
1334
  - 4 commands: `peaks smoke define` / `run` / `run-and-repair` / `add-path`
1279
1335
  - 持久化 `.peaks/smoke-paths.json`
1280
1336
  - 5 个 source (prd-business-scenario / boss-stated / historical-incident / impact-must-check / manual)
@@ -1282,6 +1338,7 @@ slice-2026-06-28-layered-dag PRD: 大需求(1 周内做不完)= 基础先行 +
1282
1338
  - 16 tests pass
1283
1339
 
1284
1340
  **G15 上线观察期状态机**(slice-2026-06-28-release-cli):
1341
+
1285
1342
  - 7 commands: `peaks release plan` / `canary` / `promote` / `watch` / `done` / `rollback` / `hotfix`
1286
1343
  - 8 阶段状态机: planned → canary-10 → canary-50 → promoted → watching → done
1287
1344
  - side branches: → rolled-back (from any pre-done), → hotfixed (from watching)
@@ -1292,6 +1349,7 @@ slice-2026-06-28-layered-dag PRD: 大需求(1 周内做不完)= 基础先行 +
1292
1349
  **触动:** 新增 4 个 service / 4 个 CLI / 4 个 test 文件 = **12 个新文件**。CLI 注册全在 `src/cli/program.ts`,**不触动** transition gates / hard contracts / Karpathy 4 / sub-agent 协议 / mode-gate。
1293
1350
 
1294
1351
  **已知未实现**(后续切片):
1352
+
1295
1353
  - 真实 git fetch + merge(G11)
1296
1354
  - 真实 Playwright 路径执行(G14)
1297
1355
  - 真实 k8s rollout / LB config / 监控集成(G15)
@@ -1301,23 +1359,27 @@ slice-2026-06-28-layered-dag PRD: 大需求(1 周内做不完)= 基础先行 +
1301
1359
  4 个 service + 4 个 CLI 文件 + 4 个 test 文件,共 **16 个新命令 + 40+ 个新测试通过**。所有 CLI 都遵循 12 Gaps 核心原则: user 在循环里 = 业务/产品审阅,不参与技术决策。
1302
1360
 
1303
1361
  **G3 prd 4 必填块**(slice-2026-06-28-prd-blocks):
1362
+
1304
1363
  - `peaks prd check-blocks <rid>` — 验证 4 必填块(业务场景/边界/UI 装配/上游基线)+ 业务禁区子节
1305
1364
  - 上游基线仅在 fork 项目上 required(检测 `.peaks/fork-state.json`)
1306
1365
  - 8 tests pass
1307
1366
 
1308
1367
  **G4 user touchpoint classifier**(slice-2026-06-28-user-touchpoints):
1368
+
1309
1369
  - 3 commands: `peaks code gate-classify` / `peaks code user-touchpoints` / `peaks code commit-boundary-actions`
1310
1370
  - 14 个 Code gate 静态分类: business / tech / mode-selection / commit-boundary / commit-floor
1311
1371
  - `userShouldReview`: always / business-only / never
1312
1372
  - 7 tests pass
1313
1373
 
1314
1374
  **G1 slice 业务审阅**(slice-2026-06-28-slice-review):
1375
+
1315
1376
  - 4 commands: `peaks slice review` / `score` / `accept` / `reject`
1316
1377
  - 4 个默认 review item: business-match / boundary-cases / ui-assembly / mergeable
1317
1378
  - 12 Gaps 阈值: avg >= 3 AND no item <= 2 → accepted
1318
1379
  - 16 tests pass
1319
1380
 
1320
1381
  **G5 QA 业务视角验收**(slice-2026-06-28-qa-business):
1382
+
1321
1383
  - 4 commands: `peaks qa business-review` / `business-score` / `business-accept` / `business-reject`
1322
1384
  - 6 个默认 review item: business-flow / req-coverage / boundary-cases / ui-assembly / exception-tone / mergeable
1323
1385
  - 同一阈值(avg >= 3, no item <= 2)
@@ -1330,29 +1392,35 @@ slice-2026-06-28-layered-dag PRD: 大需求(1 周内做不完)= 基础先行 +
1330
1392
  5 个 PRD 一次性收尾剩余 5 个 Gaps。每 G 一个 service + CLI + test,**10 个新文件 + 30+ 个新测试通过**。
1331
1393
 
1332
1394
  **G6 跨 slice 集成**(slice-2026-06-28-slice-integrate):
1395
+
1333
1396
  - `peaks slice-integrate --slices <id1,id2,...>` — 验证多个 slice 的公共契约不冲突(重复 export / signature drift)
1334
1397
  - 5 tests pass
1335
1398
 
1336
1399
  **G7 文档自动化**(slice-2026-06-28-doc):
1400
+
1337
1401
  - `peaks doc generate-skill --name --from <commands-dir>` — 扫描 program.command() 自动生成 SKILL.md skeleton
1338
1402
  - `peaks doc changelog-suggest --since <ref>` — git log 解析 conventional commit + 生成 [Unreleased] 块
1339
1403
  - 6 tests pass
1340
1404
 
1341
1405
  **G8 存量代码 smell 扫描**(slice-2026-06-28-legacy):
1406
+
1342
1407
  - `peaks legacy-detect --dir <path>` — TODO/FIXME/HACK/console.log/any-type/large-file/ts-ignore 启发式扫描
1343
1408
  - 5 tests pass
1344
1409
 
1345
1410
  **G9 角色 RBAC**(slice-2026-06-28-role):
1411
+
1346
1412
  - `peaks role list/add/grant/check` — 4 命令,持久化 .peaks/role-registry.json
1347
1413
  - `--preset senior-fe` 一键预置 12 Gaps 高级前端权限
1348
1414
  - 5 tests pass
1349
1415
 
1350
1416
  **G10 复杂度估算**(slice-2026-06-28-complexity):
1417
+
1351
1418
  - `peaks complexity-estimate --files <list>` — 按 LOC + exports + async 估算 trivial/simple/complex
1352
1419
  - 与 G2 字段(complexity tier)对齐,驱动 user-attended vs overnight 排程
1353
1420
  - 5 tests pass
1354
1421
 
1355
1422
  **Dogfood 验证(ice-cola NestJS 项目):**
1423
+
1356
1424
  - peaks legacy-detect (164 文件, smells=high, 406 个 any-type, 15 个 large-file)
1357
1425
  - peaks role add senior-fe --preset senior-fe + role list + role check (granted/not)
1358
1426
  - peaks complexity-estimate (auth files → complex, 41 lines + hasAsync)
@@ -1377,6 +1445,7 @@ slice-2026-06-28-layered-dag PRD: 大需求(1 周内做不完)= 基础先行 +
1377
1445
  - `tests/unit/services/context/tokenizer.test.ts:23` — `fetchedAt` 硬编码 `2026-06-21` 距今 7 天触发 `timeDecayScore 0.886 < 0.9` 期望,改 `new Date().toISOString()` 符合"fresh fetch"测试意图
1378
1446
 
1379
1447
  **测试结果:**
1448
+
1380
1449
  - silent-warning-detector: 2 violations → 0
1381
1450
  - `tests/unit/services/context/`: 49/50 → 50/50
1382
1451
  - 全量 vitest 4819 tests:3 failed → 2 failed(剩下 2 个是并发 race condition,单跑 context 50/50 全过,pre-existing)
@@ -1388,19 +1457,23 @@ slice-2026-06-28-layered-dag PRD: 大需求(1 周内做不完)= 基础先行 +
1388
1457
  **PATCH bump from 2.14.1** (slice `2026-06-28-tilde-peaks-p3p4`). Closes P3 + P4 from `.peaks/memory/2026-06-28-tilde-peaks-inventory.md`.
1389
1458
 
1390
1459
  ### Cleanup
1460
+
1391
1461
  - **`skills/peaks-companion/`** — REMOVED. Skill was dead: SKILL.md documented `peaks companion status/install/setup/start` but no CLI implementation existed (`src/services/companion/` not present, `peaks --help` had no companion entry). Empty `~/.peaks/companion/` directory is no longer expected to receive `cc-connect.log` writes.
1392
1462
  - **`tests/unit/skills/peaks-companion.test.ts`** — REMOVED (9 cases). The companion skill-count assertion (19 → 18 skills) is now verified by `tests/unit/skills/skill-count.test.ts` (already covers the meta count, not companion specifically).
1393
1463
  - **`.peaks/memory/peaks-companion-*.md`** — REMOVED (4 files: `cc-connect-dogfood-2026-06-15`, `qr-autoopen-2026-06-15`, `qr-inline-display-2026-06-15`, `watcher-ecs-url-config`). Historical dogfood records, no longer relevant.
1394
1464
 
1395
1465
  ### Refactor
1466
+
1396
1467
  - **`~/.peaks/providers.json`** (NEW sidecar) — MiniMax provider config migrated from deprecated `~/.peaks/config.json.providers` to canonical `~/.peaks/providers.json` per `provider-service.ts` schema. The slim `config.json` (per `config-types.ts`) no longer carries the `providers` field.
1397
1468
  - **MiniMax model field preserved** — `~/.peaks/providers.json.providers.minimax.model = "minimax-2.7"`; `peaks config provider minimax get/status` continue to report correctly via the back-compat fallback in `provider-service.ts`.
1398
1469
 
1399
1470
  ### Test results
1471
+
1400
1472
  - `pnpm vitest run tests/unit/doctor.test.ts` — 50/50 pass
1401
1473
  - `pnpm vitest run` full unit suite — `peaks-companion.test.ts` no longer runs; total cases drop from 4418 → 4409. Pre-existing failures (`doctor.test.ts` × 0, `tokenizer.test.ts` × 1, `35-checks-aggregate.test.ts` × 1) unchanged.
1402
1474
 
1403
1475
  ### Out-of-scope
1476
+
1404
1477
  - Push / tag / npm publish — full-auto mode boundary = commit only; user-only.
1405
1478
  - Re-implementing peaks-companion CLI — user chose delete over revive.
1406
1479
  - Cleaning `~/.peaks/companion/` empty dir — left in place; harmless.
@@ -1412,14 +1485,17 @@ slice-2026-06-28-layered-dag PRD: 大需求(1 周内做不完)= 基础先行 +
1412
1485
  **PATCH bump from 2.14.0** (carry-forward from v2.13.3 AC-2 partial fix + npm 11.x config rename).
1413
1486
 
1414
1487
  ### Bug fixes
1488
+
1415
1489
  - `scripts/prepublish-build.mjs` — use `execFileSync('pnpm', ['run', 'build'])` (no shell) with Windows fallback to `prepublish-build.ps1` (proven dogfood). Eliminates the v2.13.4 partial-fix `spawnSync cmd.exe ENOENT` on Node 22 + Windows native.
1416
1490
  - `.npmrc` (NEW, repo-local template) — documents that `https_proxy` (underscore) is NO LONGER VALID in npm 11.x; use `https-proxy` or `proxy`. User-global `~/.npmrc` may still have `https_proxy`; npm 11.x warns, npm 12 will error.
1417
1491
 
1418
1492
  ### Test results
1493
+
1419
1494
  - `tests/unit/scripts/prepublish-build.test.ts` (NEW, 6 cases) — covers execFile happy path + Windows ps1 fallback + error propagation + version validation + ENOENT regression
1420
1495
  - `node scripts/prepublish-build.mjs` end-to-end: `[prepublish-build] build OK` exit 0 (verified on this Windows session)
1421
1496
 
1422
1497
  ### Out-of-scope
1498
+
1423
1499
  - Do NOT modify user-global `~/.npmrc` (user-only boundary); user must run `npm config delete https_proxy` themselves if they want to silence the warning before npm 12.
1424
1500
 
1425
1501
  ---
@@ -1540,7 +1616,7 @@ The four defects all stem from the v2.13.0 two-axis convention landing debt: the
1540
1616
 
1541
1617
  **PATCH bump from 2.13.2** (slice `2026-06-27-verdict-aggregator-v2-12-debt`, red-line scope 7 source files + 3 test files modified + 3 new scripts + 1 package.json hook).
1542
1618
 
1543
- 2.13.2 dogfood surfaced 4 bugs that all stem from v2.12.0 envelope-schema落地 debt: the v2.12.0 audit artifacts (`audit/security.md`, `audit/perf.md`) are YAML-frontmatter + markdown, but v2.13.2's `parseSecurityEnvelope` / `parsePerfEnvelope` used `JSON.parse` (which is the wrong shape). v2.13.3 also fixes a cross-version publish-pipeline issue (`bin/peaks.js` was shipping a Jun 13 stale dist because `prepublishOnly` was never wired) and adds a soft-block-warning surface in the CLI so users can see v2.13.2's `mut-report-missing-deprecated-in-v2.14.0` warning instead of having it silently downgraded in service-layer.
1619
+ 2.13.2 dogfood surfaced 4 bugs that all stem from v2.12.0 envelope-schema 落地 debt: the v2.12.0 audit artifacts (`audit/security.md`, `audit/perf.md`) are YAML-frontmatter + markdown, but v2.13.2's `parseSecurityEnvelope` / `parsePerfEnvelope` used `JSON.parse` (which is the wrong shape). v2.13.3 also fixes a cross-version publish-pipeline issue (`bin/peaks.js` was shipping a Jun 13 stale dist because `prepublishOnly` was never wired) and adds a soft-block-warning surface in the CLI so users can see v2.13.2's `mut-report-missing-deprecated-in-v2.14.0` warning instead of having it silently downgraded in service-layer.
1544
1620
 
1545
1621
  ### Bug fixes
1546
1622
 
@@ -1576,9 +1652,9 @@ The four defects all stem from the v2.13.0 two-axis convention landing debt: the
1576
1652
 
1577
1653
  ### Multi-CC commit boundaries
1578
1654
 
1579
- | Commit tag | Scope |
1580
- |---|---|
1581
- | v2.13.3 | 4 bug fixes (parser / publish pipeline / CLI warnings / handoff sha256) + 3 new scripts + 4 new test cases + package.json prepublishOnly + README publish note + CHANGELOG + version bump + ship-state memory |
1655
+ | Commit tag | Scope |
1656
+ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1657
+ | v2.13.3 | 4 bug fixes (parser / publish pipeline / CLI warnings / handoff sha256) + 3 new scripts + 4 new test cases + package.json prepublishOnly + README publish note + CHANGELOG + version bump + ship-state memory |
1582
1658
 
1583
1659
  ### Verified (peaks code dogfood + QA on this session)
1584
1660
 
@@ -1654,9 +1730,9 @@ v2.13.1 shipped with a BLOCKER bug found via post-release dogfood: `aggregateVer
1654
1730
 
1655
1731
  ### Multi-CC commit boundaries
1656
1732
 
1657
- | Commit tag | Scope |
1658
- |---|---|
1659
- | v2.13.2 | `aggregateVerdict()` dedup bug fix + `peaks verdict aggregate` CLI + `envelopes.ts` unification + `prd/handoff.md` auto-regen + `MUT_REPORT` soft-block window + 4 new test files + 4 updated test files + CHANGELOG + version bump + ship-state memory |
1733
+ | Commit tag | Scope |
1734
+ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1735
+ | v2.13.2 | `aggregateVerdict()` dedup bug fix + `peaks verdict aggregate` CLI + `envelopes.ts` unification + `prd/handoff.md` auto-regen + `MUT_REPORT` soft-block window + 4 new test files + 4 updated test files + CHANGELOG + version bump + ship-state memory |
1660
1736
 
1661
1737
  ### Verified (peaks code dogfood + QA on this session)
1662
1738
 
@@ -1718,9 +1794,9 @@ peaks-code previously received 5 heterogeneous signals (security-audit, perf-aud
1718
1794
 
1719
1795
  ### Multi-CC commit boundaries
1720
1796
 
1721
- | Commit tag | Scope |
1722
- |---|---|
1723
- | v2.13.1 | MUT_REPORT prereq + `aggregateVerdict()` service + `## Verdict reasoning` section + 4 new test files + 2 updated test files + CHANGELOG + version bump + ship-state memory |
1797
+ | Commit tag | Scope |
1798
+ | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1799
+ | v2.13.1 | MUT_REPORT prereq + `aggregateVerdict()` service + `## Verdict reasoning` section + 4 new test files + 2 updated test files + CHANGELOG + version bump + ship-state memory |
1724
1800
 
1725
1801
  ### Verified (peaks code dogfood on this session)
1726
1802
 
@@ -1784,10 +1860,10 @@ Adapter-driven protocol (no hard-coded IDE names): `IdeAdapter.compact?: IdeComp
1784
1860
 
1785
1861
  ### Multi-CC commit boundaries
1786
1862
 
1787
- | Commit tag | Scope |
1788
- |---|---|
1863
+ | Commit tag | Scope |
1864
+ | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1789
1865
  | v2.13.0-alpha.1 (`edffc33`) | Two-tier threshold + auto-compact types + reader + dispatcher + orchestrator + Claude Code MVP adapter + `peaks code context-now` + `peaks code auto-compact` CLI |
1790
- | `a8b9804` | In-session dogfood limitation documented (current ad-hoc Claude Code session cannot be externally compacted — reserved for follow-up PreToolUse-hook slice) |
1866
+ | `a8b9804` | In-session dogfood limitation documented (current ad-hoc Claude Code session cannot be externally compacted — reserved for follow-up PreToolUse-hook slice) |
1791
1867
 
1792
1868
  ### Verified (peaks code dogfood on this session)
1793
1869
 
@@ -1798,7 +1874,7 @@ Adapter-driven protocol (no hard-coded IDE names): `IdeAdapter.compact?: IdeComp
1798
1874
  - `post-compact-detect` after pre-compact: `shouldAutoResume: true`, `reason: post-compact-match` ✓
1799
1875
  - Trae IDE (no `compact` profile): `ratio: 0` + `source: conservative-fallback` + `below-threshold` (no auto-fire on missing signal — by design) ✓
1800
1876
  - `pnpm tsc --noEmit`: clean
1801
- - `pnpm vitest run` (full suite): `4317 / 4317` pass + 17 skipped (2 pre-existing baseline failures on session-checkpoint + _archive-removal-guard unchanged)
1877
+ - `pnpm vitest run` (full suite): `4317 / 4317` pass + 17 skipped (2 pre-existing baseline failures on session-checkpoint + \_archive-removal-guard unchanged)
1802
1878
 
1803
1879
  ### Out-of-scope (NOT changed)
1804
1880
 
@@ -1855,17 +1931,17 @@ v2.13.0 hard-deletes the legacy paths.
1855
1931
 
1856
1932
  ### Multi-CC commit boundaries
1857
1933
 
1858
- | Group | Tiers | Commit tag | Scope |
1859
- |---|---|---|---|
1860
- | A | 1+2+3 | v2.12.0-alpha.1 | Templates + new skills (fa082f5) |
1861
- | B | 4+5 | v2.12.0-alpha.2 | 5→3 fanout collapse + prereq migration (6485f1c) |
1862
- | C | 6 | v2.12.0-alpha.3 | peaks-txt sediment extension (ab2757b) |
1863
- | D | 7 | v2.12.0-alpha.4 | fan-out SKILL.md updates (b6c4fae) |
1864
- | E | 8+9 | v2.12.0 (release) | Decision records + migration + CHANGELOG + version bump (this commit) |
1934
+ | Group | Tiers | Commit tag | Scope |
1935
+ | ----- | ----- | ----------------- | --------------------------------------------------------------------- |
1936
+ | A | 1+2+3 | v2.12.0-alpha.1 | Templates + new skills (fa082f5) |
1937
+ | B | 4+5 | v2.12.0-alpha.2 | 5→3 fanout collapse + prereq migration (6485f1c) |
1938
+ | C | 6 | v2.12.0-alpha.3 | peaks-txt sediment extension (ab2757b) |
1939
+ | D | 7 | v2.12.0-alpha.4 | fan-out SKILL.md updates (b6c4fae) |
1940
+ | E | 8+9 | v2.12.0 (release) | Decision records + migration + CHANGELOG + version bump (this commit) |
1865
1941
 
1866
1942
  ### Zero regression (verified per group)
1867
1943
 
1868
- Each Group A→D ran the full RD→QA loop independently. Group C final QA: 14/14 sediment tests pass + 39/39 prd service tests pass; 9 pre-existing baseline failures unchanged (doctor / _archive-removal-guard / request-commands / observability / session-checkpoint / tech-service / workflow-autonomous-resume / jsonl-store / 35-checks-aggregate — all unrelated to v2.12.0). Group D final QA: 35/35 fan-out SKILL.md contract tests pass; same 9 pre-existing baseline failures.
1944
+ Each Group A→D ran the full RD→QA loop independently. Group C final QA: 14/14 sediment tests pass + 39/39 prd service tests pass; 9 pre-existing baseline failures unchanged (doctor / \_archive-removal-guard / request-commands / observability / session-checkpoint / tech-service / workflow-autonomous-resume / jsonl-store / 35-checks-aggregate — all unrelated to v2.12.0). Group D final QA: 35/35 fan-out SKILL.md contract tests pass; same 9 pre-existing baseline failures.
1869
1945
 
1870
1946
  ### Out-of-scope (NOT changed)
1871
1947
 
@@ -2046,6 +2122,7 @@ LLM was creating top-level `.peaks/_runtime/<change-id>/` siblings of `.peaks/_r
2046
2122
  - Bumps `package.json#version` from 2.9.1 to 2.9.2
2047
2123
 
2048
2124
  **Pre-existing violations preserved as-is** (intentional historical/forbidden documentation, all explicitly labeled):
2125
+
2049
2126
  - 6 ban-explanation memory files under `.peaks/memory/` (slice 005 / 2.8.3 / 2.7.1 lessons)
2050
2127
  - 28 historic session files under `.peaks/_runtime/2026-06-*/`
2051
2128
  - 5 historic dispatch records under `.peaks/_sub_agents/`
@@ -2142,37 +2219,37 @@ the four-step recipe; no data is lost.
2142
2219
  final root-out of a 2.8.0-era orphan (`.peaks/2026-06-22-cc-connect-orphan-cleanup/`,
2143
2220
  4 files, 28 KB, untracked) and pins the rule across FOUR layers so a
2144
2221
  regression cannot survive:
2145
- 1. **`.gitignore` fnmatch rule** —
2146
- `.peaks/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-*/` blocks any
2147
- future untracked date-prefix sibling at `.peaks/_runtime/<seg>/`. Path-anchored
2148
- so it does not over-match (`.peaks/_runtime/<date>/` is still ignored
2149
- by the existing `.peaks/_runtime/` rule, not this one).
2150
- 2. **Vitest guard** at
2151
- `tests/unit/workspace/top-level-change-id-guard.test.ts` (8 cases)
2152
- pins the gitignore rule literal, asserts fnmatch matches a synthetic
2153
- candidate, asserts it does NOT match `.peaks/_runtime/-nested`
2154
- candidates, scans the live working tree for orphan date-prefix
2155
- siblings, scans `git ls-files` for tracked escapes, asserts both
2156
- `CLAUDE.md` and `.peaks/PROJECT.md` carry the ban wording, AND
2157
- asserts the CLI help text (`init-command.ts`) teaches the
2158
- `.peaks/_runtime/current-change` binding path + the four
2159
- migration verbs (inspect / move / delete / unlink / re-run).
2160
- 3. **Source-code redirect** —
2161
- `src/shared/change-id.ts#setCurrentChangeId` now defaults to
2162
- `{ form: 'file' }` (was `'symlink'`); the file form writes ONLY
2163
- `.peaks/_runtime/current-change` and never creates
2164
- `.peaks/_runtime/<changeId>/`. The legacy `'symlink'` form is kept for
2165
- back-compat reads but is no longer written by `peaks workspace init`.
2166
- `src/services/workspace/workspace-service.ts#initWorkspace`
2167
- pre-flights the existence of `.peaks/_runtime/<changeId>/` and throws
2168
- `LegacyChangeIdSiblingError` if found.
2169
- 4. **CLI help-text guard** — `src/cli/commands/workspace/init-command.ts`
2170
- rewrites the `init` command description and `--change-id` option
2171
- description so an LLM reading `peaks workspace init --help` is
2172
- taught the correct path (`.peaks/_runtime/current-change`) instead
2173
- of the legacy `.peaks/_runtime/<change-id>/` sibling dir. A new catch block
2174
- surfaces `LegacyChangeIdSiblingError` with the 4-step migration
2175
- recipe in the JSON envelope.
2222
+ 1. **`.gitignore` fnmatch rule** —
2223
+ `.peaks/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-*/` blocks any
2224
+ future untracked date-prefix sibling at `.peaks/_runtime/<seg>/`. Path-anchored
2225
+ so it does not over-match (`.peaks/_runtime/<date>/` is still ignored
2226
+ by the existing `.peaks/_runtime/` rule, not this one).
2227
+ 2. **Vitest guard** at
2228
+ `tests/unit/workspace/top-level-change-id-guard.test.ts` (8 cases)
2229
+ pins the gitignore rule literal, asserts fnmatch matches a synthetic
2230
+ candidate, asserts it does NOT match `.peaks/_runtime/-nested`
2231
+ candidates, scans the live working tree for orphan date-prefix
2232
+ siblings, scans `git ls-files` for tracked escapes, asserts both
2233
+ `CLAUDE.md` and `.peaks/PROJECT.md` carry the ban wording, AND
2234
+ asserts the CLI help text (`init-command.ts`) teaches the
2235
+ `.peaks/_runtime/current-change` binding path + the four
2236
+ migration verbs (inspect / move / delete / unlink / re-run).
2237
+ 3. **Source-code redirect** —
2238
+ `src/shared/change-id.ts#setCurrentChangeId` now defaults to
2239
+ `{ form: 'file' }` (was `'symlink'`); the file form writes ONLY
2240
+ `.peaks/_runtime/current-change` and never creates
2241
+ `.peaks/_runtime/<changeId>/`. The legacy `'symlink'` form is kept for
2242
+ back-compat reads but is no longer written by `peaks workspace init`.
2243
+ `src/services/workspace/workspace-service.ts#initWorkspace`
2244
+ pre-flights the existence of `.peaks/_runtime/<changeId>/` and throws
2245
+ `LegacyChangeIdSiblingError` if found.
2246
+ 4. **CLI help-text guard** — `src/cli/commands/workspace/init-command.ts`
2247
+ rewrites the `init` command description and `--change-id` option
2248
+ description so an LLM reading `peaks workspace init --help` is
2249
+ taught the correct path (`.peaks/_runtime/current-change`) instead
2250
+ of the legacy `.peaks/_runtime/<change-id>/` sibling dir. A new catch block
2251
+ surfaces `LegacyChangeIdSiblingError` with the 4-step migration
2252
+ recipe in the JSON envelope.
2176
2253
  - **`CLI_VERSION`** sync bumped 2.8.2 → 2.8.3 (regenerated via
2177
2254
  `scripts/sync-version.mjs` from `package.json#version`).
2178
2255
 
@@ -2298,7 +2375,7 @@ are unchanged by this release), `pnpm build` clean.
2298
2375
  `src/services/companion/*` module + `src/cli/commands/companion.ts`
2299
2376
  CLI + 14 `tests/unit/companion/*` test files are removed
2300
2377
  (~7,700 lines deleted, 0 added). The `peaks companion install|setup|
2301
- start|stop|bind|status|restart|verify|token|qr` command tree is gone
2378
+ start|stop|bind|status|restart|verify|token|qr` command tree is gone
2302
2379
  along with the `peaks scan companion-binary` sub-command and the
2303
2380
  `capability:companion-binary-resolution` doctor check. Companion
2304
2381
  types (`CompanionConfig`, `CompanionWeixinConfig`, `CompanionChannel`,
@@ -2326,7 +2403,7 @@ are unchanged by this release), `pnpm build` clean.
2326
2403
  - **`@alibaba-group/open-code-review` is now a peer dependency** —
2327
2404
  moved from `optionalDependencies` to `peerDependencies` with
2328
2405
  `peerDependenciesMeta."@alibaba-group/open-code-review".optional =
2329
- true`. The peer hint lets npm skip the optional resolution entirely
2406
+ true`. The peer hint lets npm skip the optional resolution entirely
2330
2407
  during global install; users who want second-opinion reviews via
2331
2408
  `peaks code-review run-ocr` install it manually with
2332
2409
  `npm i -g @alibaba-group/open-code-review`. Install hint copy in
@@ -2358,8 +2435,8 @@ are unchanged by this release), `pnpm build` clean.
2358
2435
  - **Defense-in-depth comment cites H6 verbatim (Plan 5 R1-W3 MED)** —
2359
2436
  `src/services/rd/impl.ts` defense-in-depth check now cites spec H6
2360
2437
  (CLI 计算裁决) directly. The accompanying `docs/superpowers/specs/
2361
- 2026-06-21-context-audit-redesign-design.md` gained a new §4.3
2362
- *战术审计* subsection that consolidates §3.2 / §3.3 / H6 / H8 / Phase 3
2438
+ 2026-06-21-context-audit-redesign-design.md` gained a new §4.3
2439
+ _战术审计_ subsection that consolidates §3.2 / §3.3 / H6 / H8 / Phase 3
2363
2440
  AC-2 into a single canonical anchor (previous code references to
2364
2441
  `§4.2` updated to `§4.3`).
2365
2442
 
@@ -2376,7 +2453,7 @@ are unchanged by this release), `pnpm build` clean.
2376
2453
  is in the test name, not just the body.
2377
2454
 
2378
2455
  - **Atomic-write crash test (Plan 5 R1-W5 LOW)** — new test
2379
- *unlinks .tmp when rename throws* pins the catch→unlink fallback in
2456
+ _unlinks .tmp when rename throws_ pins the catch→unlink fallback in
2380
2457
  `writeImpl` (EISDIR-triggered real-rename failure). Mutation probe
2381
2458
  KILLED: commenting out the unlink makes the test fail at the
2382
2459
  `existsSync(tmp)` assertion.
@@ -2478,7 +2555,7 @@ are unchanged by this release), `pnpm build` clean.
2478
2555
  `C:\Users\name\.trae\agents` and a Mac user gets
2479
2556
  `/Users/name/.trae/agents`. No hardcoded `/Users/...` or `C:\...` in
2480
2557
  any 5-IDE `awaitBatch` path. The 4 new IDE paths (`trae / trae-cn /
2481
- codex / cursor`) follow the same discipline.
2558
+ codex / cursor`) follow the same discipline.
2482
2559
  - **`runDag` cancel-on-fail correctness (slice 1.2.c)** — when any leaf
2483
2560
  fails, in-flight sub-agents in the same batch receive a cancel signal
2484
2561
  at the envelope level; the orchestrator no longer waits for them to
@@ -2569,11 +2646,11 @@ are unchanged by this release), `pnpm build` clean.
2569
2646
  4. `scanExportsInFile` now matches `export default function name()`
2570
2647
  and `export default class Name`; `importedNameCount` now treats
2571
2648
  re-exports (`export { x } from './y'`, `export type { T } from
2572
- './y'`) as consumer references.
2573
- Bonus: `OrphanScanOptions.baseRef` lets the scan diff against an
2574
- arbitrary git ref (default: `HEAD`) for branch-vs-main reviews.
2649
+ './y'`) as consumer references.
2650
+ Bonus: `OrphanScanOptions.baseRef` lets the scan diff against an
2651
+ arbitrary git ref (default: `HEAD`) for branch-vs-main reviews.
2575
2652
  - **karpathy-service code-fence skip (Slice 2.6.1.B)** — `peaks scan
2576
- karpathy` no longer flags anti-pattern phrases (TODO, "should be
2653
+ karpathy` no longer flags anti-pattern phrases (TODO, "should be
2577
2654
  fine", "maybe", "probably") when they appear inside fenced markdown
2578
2655
  code blocks. Illustrative code snippets were eroding trust in the
2579
2656
  structural scanner. The 4 guideline-marker tests
@@ -2596,7 +2673,7 @@ are unchanged by this release), `pnpm build` clean.
2596
2673
  byte-identical.
2597
2674
  - **KARPATHY_REVIEW heading-anchored gate (Slice 2.6.1.F)** — the L3
2598
2675
  LOW (the 4 guideline `mustContain` substring markers could be
2599
- spoofed by any file that just *mentioned* the marker names as
2676
+ spoofed by any file that just _mentioned_ the marker names as
2600
2677
  prose) is fixed by a new `headingMustContain: string[]` field on
2601
2678
  `ArtifactPrerequisite`. `KARPATHY_REVIEW` now requires each of
2602
2679
  the 4 guidelines to appear as an actual markdown heading
@@ -2613,8 +2690,7 @@ are unchanged by this release), `pnpm build` clean.
2613
2690
 
2614
2691
  - **L2-install dogfood verification (Slice 2.6.1.D)** — confirmed
2615
2692
  end-to-end on a temp HOME that the 2.6.0 tarball's `postinstall`
2616
- creates `~/.claude/agents/karpathy-reviewer.md` (15.4 KB, mode
2617
- 0600) and the matching `.peaks-managed` marker (245 bytes, JSON
2693
+ creates `~/.claude/agents/karpathy-reviewer.md` (15.4 KB, mode 0600) and the matching `.peaks-managed` marker (245 bytes, JSON
2618
2694
  with `version`, `kind`, `agentName`, `sourcePath`, `contentSha256`).
2619
2695
  The 8-platform skill fan-out also confirmed (codex, cursor, trae,
2620
2696
  trae-cn, qoder, tongyi-lingma, hermes, openclaw). After Slice E,
@@ -2644,7 +2720,7 @@ are unchanged by this release), `pnpm build` clean.
2644
2720
  title-case section markers (Think Before Coding / Simplicity First /
2645
2721
  Surgical Changes / Goal-Driven Execution). CLI error code
2646
2722
  `PREREQUISITES_MISSING`. Escape hatch: `peaks request transition
2647
- --allow-incomplete --confirm` (assisted mode).
2723
+ --allow-incomplete --confirm` (assisted mode).
2648
2724
  - **Karpathy prompt-injection across the full RD surface** (slice 1) —
2649
2725
  4-layer guard: SKILL.md body + 3 reference docs
2650
2726
  (`mandatory-tech-doc.md`, `rd-fanout-contracts.md`,
@@ -2666,7 +2742,7 @@ are unchanged by this release), `pnpm build` clean.
2666
2742
  endpoints / components / stores / mocks in the consumer project
2667
2743
  before any new code is written. `--project --format --scope --max-per-kind`
2668
2744
  options; output feeds the tech-doc's `## Existing API or Component
2669
- Inventory` section. New service
2745
+ Inventory` section. New service
2670
2746
  `src/services/scan/api-surface-service.ts` (~280 lines).
2671
2747
  - **`peaks scan orphan` CLI** (slice 4) — 4-kind orphan detection
2672
2748
  (exportOrphan / importOrphan / cliSubcommandOrphan /
@@ -2783,8 +2859,8 @@ are unchanged by this release), `pnpm build` clean.
2783
2859
  `references/checkpoint-resume.md` + `references/periodic-checkpoint.md`, but
2784
2860
  SKILL.md body only mentioned them in a single line. New Claude Code sessions
2785
2861
  that load SKILL.md never learned the optimization existed. `### Peaks-Loop
2786
- Step 0.75: Resume from checkpoint` and `### Peaks-Loop Step N: Periodic
2787
- checkpoint` headings are now in the body (≥ 5 lines each), with explicit
2862
+ Step 0.75: Resume from checkpoint` and `### Peaks-Loop Step N: Periodic
2863
+ checkpoint` headings are now in the body (≥ 5 lines each), with explicit
2788
2864
  `peaks session checkpoint` / `peaks session resume` CLI mentions and
2789
2865
  reference-doc pointers. Byte cap bumped 22K → 24K (precedent: 18K → 20K → 22K).
2790
2866
  - **`peaks test <pattern...>` CLI with smart cache** (sub-fix B) — new CLI
@@ -2893,7 +2969,7 @@ are unchanged by this release), `pnpm build` clean.
2893
2969
  (~/.claude/skills + ~/.claude/output-styles)" and writes to
2894
2970
  `~/.claude/skills/`.
2895
2971
  - Byte-stability: `git diff
2896
- src/services/ide/adapters/{claude-code,trae}-adapter.ts` returns
2972
+ src/services/ide/adapters/{claude-code,trae}-adapter.ts` returns
2897
2973
  empty (AC8 / AC15 ✓). Dispatch chokepoints `resource-profile.ts` /
2898
2974
  `ide-aware-standards-service.ts` / `install-skills.mjs` untouched
2899
2975
  (R6 inverse rule ✓).
@@ -2988,6 +3064,7 @@ are unchanged by this release), `pnpm build` clean.
2988
3064
  registered SOP gate.
2989
3065
 
2990
3066
  Concrete changes:
3067
+
2991
3068
  - `src/services/workspace/claude-settings-template.ts` — deleted
2992
3069
  `PEAKS_SUBCOMMAND_ALLOWLIST`, `buildBashHookCommand()`. The
2993
3070
  template now emits only the `Write|Edit|MultiEdit` matcher.
@@ -3040,11 +3117,12 @@ Full suite: **2957 passed, 12 skipped, 0 failed**.
3040
3117
  - **`headroom-ai` preferences resolver** — `src/services/context/headroom-prefs.ts` with
3041
3118
  `resolveHeadroomOptions` and `shouldCompressResults` (pure functions, no IO). Sub-agent
3042
3119
  dispatch now reads `loadPreferences().headroom` and:
3043
- - Hard-blocks `--use-headroom` when `headroom.enabled = false` (new error code
3044
- `HEADROOM_DISABLED_BY_PREFERENCE`, exit 1).
3045
- - Respects `--headroom-mode <m>` CLI override > `perTouchpoint.subAgentDispatch` >
3046
- `defaultMode` precedence.
3047
- - Falls back to G7 metadata-only on any preferences load failure (no dispatch break).
3120
+
3121
+ - Hard-blocks `--use-headroom` when `headroom.enabled = false` (new error code
3122
+ `HEADROOM_DISABLED_BY_PREFERENCE`, exit 1).
3123
+ - Respects `--headroom-mode <m>` CLI override > `perTouchpoint.subAgentDispatch` >
3124
+ `defaultMode` precedence.
3125
+ - Falls back to G7 metadata-only on any preferences load failure (no dispatch break).
3048
3126
 
3049
3127
  - **New preferences fields** — `headroom.perTouchpoint.subAgentDispatch` and
3050
3128
  `headroom.compressMinBytes` (default 4096). Shallow-merge on existing
@@ -3174,7 +3252,7 @@ Full suite: **2957 passed, 12 skipped, 0 failed**.
3174
3252
 
3175
3253
  - The "one rid = one feature" pattern. From 2.1.1 onward, the
3176
3254
  recommended workflow is: PRD -> `peaks slice decompose` -> `peaks
3177
- slice pick` (interactive) -> `peaks slice plan` -> N child rids.
3255
+ slice pick` (interactive) -> `peaks slice plan` -> N child rids.
3178
3256
  Legacy `--type`-based fan-out still works as a fallback for rids
3179
3257
  that pre-date the algorithm.
3180
3258
 
@@ -3252,10 +3330,10 @@ Full suite: **2957 passed, 12 skipped, 0 failed**.
3252
3330
  (canonical home: proxy-service.ts).
3253
3331
  - `~/.peaks/workspaces.json` — registered workspaces + current-workspace
3254
3332
  pointer (canonical home: workspace-state-service.ts).
3255
- On-disk legacy bloat is auto-detected and promoted to the correct
3256
- sidecar on next CLI invocation; the slim `config.json` is then
3257
- rewritten. The migration is **idempotent and silent** — no user
3258
- action required.
3333
+ On-disk legacy bloat is auto-detected and promoted to the correct
3334
+ sidecar on next CLI invocation; the slim `config.json` is then
3335
+ rewritten. The migration is **idempotent and silent** — no user
3336
+ action required.
3259
3337
  - **`peaks config migrate --apply` distributes legacy fields across
3260
3338
  their canonical homes.** `economyMode` / `swarmMode` continue to
3261
3339
  forward to `<project>/.peaks/preferences.json`; `providers` /
@@ -3274,9 +3352,9 @@ Full suite: **2957 passed, 12 skipped, 0 failed**.
3274
3352
 
3275
3353
  - **New `src/services/config/sidecar-store.ts`** — path helpers
3276
3354
  (`providersConfigPath()`, `proxyConfigPath()`, `workspacesConfigPath()`)
3277
- + generic `readSidecarJson<T>` / `writeSidecarJson` with the same
3278
- hardened-fs guarantees as `config-safety.ts` (symlink / hardlink
3279
- guards, atomic temp-file rename, 0o600 mode).
3355
+ - generic `readSidecarJson<T>` / `writeSidecarJson` with the same
3356
+ hardened-fs guarantees as `config-safety.ts` (symlink / hardlink
3357
+ guards, atomic temp-file rename, 0o600 mode).
3280
3358
  - **New `src/services/config/provider-service.ts`** —
3281
3359
  `getMiniMaxProviderConfig()`, `setMiniMaxProviderConfig()`,
3282
3360
  `getMiniMaxProviderStatus()`, `getAllProviders()`,
@@ -3395,10 +3473,10 @@ Full suite: **2957 passed, 12 skipped, 0 failed**.
3395
3473
  call; a missing or anonymous caller-id is rejected.
3396
3474
  3. **Mandatory `--reason`** — the CLI rejects `--reason ""`; the
3397
3475
  reason is persisted into the slice record for the retrospective.
3398
- Three rules, not one: each rule is independently fail-closed, so a
3399
- misuse in any one of them blocks the bypass. The classifier is the
3400
- pure function `canSkipSlice(slice, callerId, reason)` so the rule
3401
- set is testable in isolation.
3476
+ Three rules, not one: each rule is independently fail-closed, so a
3477
+ misuse in any one of them blocks the bypass. The classifier is the
3478
+ pure function `canSkipSlice(slice, callerId, reason)` so the rule
3479
+ set is testable in isolation.
3402
3480
  - **`peaks workflow verify-pipeline --gate-skipped`** — reporting
3403
3481
  flag that surfaces slices that completed via the skip classifier
3404
3482
  during a pipeline run. The default `verify-pipeline` output hides
@@ -3435,27 +3513,29 @@ Full suite: **2957 passed, 12 skipped, 0 failed**.
3435
3513
  bash saw literal `const c=process.argv[1]...` and tripped
3436
3514
  `syntax error near unexpected token`. Net effect on every 2.0.3
3437
3515
  install on Windows + macOS + Linux:
3516
+
3438
3517
  - Every Bash tool call (peaks CLI or otherwise) was rejected.
3439
3518
  - Every Write / Edit / MultiEdit call was rejected.
3440
3519
  - The [Fact-Forcing Gate] bypass that `peaks workspace init` was
3441
3520
  supposed to install was therefore self-defeating — the bypass
3442
3521
  broke the gate itself, and the gate could not be reached to fix
3443
3522
  it.
3444
- Recovery required the user to delete `.claude/settings.local.json`
3445
- manually (losing the bypass permanently) or hand-patch the
3446
- `command` field (drift vs the template).
3447
- The fix wraps both builders' JS payloads in a real shell-evaluable
3448
- `node -e "<js>"` form via a new `wrapAsNodeOneLiner` helper in
3449
- `src/services/workspace/claude-settings-template.ts`. Inner `"`
3450
- are escaped to `\"`; backslashes pass through unchanged so regex
3451
- literals like `/\.peaks\//` still match correctly. `process.argv[1]`
3452
- is the correct slot under `-e` per Node.js docs
3453
- (https://nodejs.org/api/process.html#processargv) — consistent
3454
- across Windows, macOS, and Linux. The docstring is reconciled
3455
- with the implementation (the previous docstring incorrectly said
3456
- `argv[2]`).
3523
+ Recovery required the user to delete `.claude/settings.local.json`
3524
+ manually (losing the bypass permanently) or hand-patch the
3525
+ `command` field (drift vs the template).
3526
+ The fix wraps both builders' JS payloads in a real shell-evaluable
3527
+ `node -e "<js>"` form via a new `wrapAsNodeOneLiner` helper in
3528
+ `src/services/workspace/claude-settings-template.ts`. Inner `"`
3529
+ are escaped to `\"`; backslashes pass through unchanged so regex
3530
+ literals like `/\.peaks\//` still match correctly. `process.argv[1]`
3531
+ is the correct slot under `-e` per Node.js docs
3532
+ (https://nodejs.org/api/process.html#processargv) — consistent
3533
+ across Windows, macOS, and Linux. The docstring is reconciled
3534
+ with the implementation (the previous docstring incorrectly said
3535
+ `argv[2]`).
3457
3536
 
3458
3537
  Regression tests cover:
3538
+
3459
3539
  - `buildBashHookCommand()` and `buildWriteHookCommand()` return
3460
3540
  `node -e "..."` form.
3461
3541
  - Inner `"` are escaped to `\"`.
@@ -3570,6 +3650,7 @@ config surface.
3570
3650
  > `optionalDependencies`; everything else in this section
3571
3651
  > (env-var injection, `config-template` CLI, `missingKeys`,
3572
3652
  > source-of-truth under `peaksConfig.ocr.llm`) is unchanged.
3653
+
3573
3654
  - **`detectOcr` / `runOcrReview` no longer read `~/.opencodereview/config.json`.**
3574
3655
  The source of truth is `peaksConfig.ocr.llm` (parsed by
3575
3656
  `getOcrLlmConfig()` in `config-service.ts`). Missing fields surface
@@ -3631,7 +3712,7 @@ subprocess ignores it when peaks-loop's env vars are present).
3631
3712
  supported IDE platforms in one command.
3632
3713
 
3633
3714
  - **`peaks audit red-lines`** — L2 catalog audit (P0/P1/P2-a/P2-b
3634
- enforcers) for skills/SKILL.md, references/*.md, and the agent shield.
3715
+ enforcers) for skills/SKILL.md, references/\*.md, and the agent shield.
3635
3716
 
3636
3717
  - **`peaks agent run`** — ECC 64 agents soft-optional integration
3637
3718
  (spec §7.2). When the L3 stack is installed, peaks delegates to it;
@@ -3666,6 +3747,7 @@ subprocess ignores it when peaks-loop's env vars are present).
3666
3747
  expands globs on disk before spawning.
3667
3748
 
3668
3749
  - **(2026-06-12) Three bugs surfaced by real-world ice-cola dogfood:**
3750
+
3669
3751
  - memory-extract was called without `--apply` → always dry-ran, never
3670
3752
  actually wrote.
3671
3753
  - `.claude/skills/**/SKILL.md` (the standard Claude-Code consumer
@@ -3789,7 +3871,7 @@ call-to-action text differ.
3789
3871
  Chinese tagline: `peaks-loop: 跨 AI IDE 的工程门禁与编排`).
3790
3872
  - `README-en.md` synced to mirror the new layout (typing animation
3791
3873
  uses the English tagline: `peaks-loop: cross-AI-IDE engineering
3792
- gates & orchestration`).
3874
+ gates & orchestration`).
3793
3875
  - Card anchors renamed to ASCII-friendly slugs on the English file
3794
3876
  (`30-seconds-to-running`, `5-minute-onboarding`, `11-skills-in-the-family`,
3795
3877
  `killer-feature-un-bypassable-gates`) so the README renders