@a9i5k4/dsh-auto-memory 2.5.3 → 3.0.1

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 (167) hide show
  1. package/README.md +189 -7
  2. package/README.zh-CN.md +189 -7
  3. package/docs/CONTRIBUTORS.html +471 -0
  4. package/docs/FRONTEND-CO-CREATION.md +191 -0
  5. package/docs/GM53-HOMEPAGE-PROMPT.md +323 -0
  6. package/docs/HANDOFF-CRITERIA.md +92 -0
  7. package/docs/HOMEPAGE-CONTENT-FOR-GM53.md +299 -0
  8. package/docs/INTEGRATION-ANALYSIS.md +350 -348
  9. package/docs/PROMO-PROMPT-3.0.md +100 -0
  10. package/docs/USER-GUIDE.en.md +58 -3
  11. package/docs/USER-GUIDE.zh-CN.md +59 -4
  12. package/docs/WHITEPAPER.md +207 -0
  13. package/docs/internal/ACCEPT-35-LIVE.md +143 -0
  14. package/docs/internal/ACCEPTANCE-20260914.md +90 -0
  15. package/docs/internal/ARCH-REVIEW-BRIEF.md +411 -0
  16. package/docs/internal/ARCH-REVIEW-REQUEST.md +201 -0
  17. package/docs/internal/ARCH-REVIEW-ROUND2.md +169 -0
  18. package/docs/internal/ARCH-REVIEW-ROUND3.md +206 -0
  19. package/docs/internal/ARCHITECTURE-FOR-ZCODE-20260920.md +397 -0
  20. package/docs/internal/ART-DIRECTION-DEEPSEEK-20260920.md +351 -0
  21. package/docs/internal/ART-DIRECTION-WIREFRAME.md +191 -181
  22. package/docs/internal/ART-DIRECTION-WIREFRAME.md.bak-superseded +181 -0
  23. package/docs/internal/AUDIT-WB-GRAPH-FULL-20260916.md +314 -0
  24. package/docs/internal/BATTLE-PLAN-20260917.md +871 -0
  25. package/docs/internal/CONCURRENCY-INVESTIGATION-20260917.md +192 -0
  26. package/docs/internal/CROSS-SESSION-SEARCH-PATH-DECISION.md +72 -0
  27. package/docs/internal/CROSS-SESSION-SEARCH-RESEARCH.md +131 -0
  28. package/docs/internal/DECISIONS-20260914-SESSION.md +269 -0
  29. package/docs/internal/DESIGN-P1-STATE-COMMIT-20260915.md +219 -0
  30. package/docs/internal/DIRECTION-CHECK-WB-GRAPH-20260916.md +132 -0
  31. package/docs/internal/FEATURE-INVENTORY.md +531 -0
  32. package/docs/internal/FEEDBACK-TO-DSHAPI-RELAY.md +13 -0
  33. package/docs/internal/G-SERIES-EXECUTION-20260917.md +248 -0
  34. package/docs/internal/G3-DESIGN-20260918.md +82 -0
  35. package/docs/internal/G3-DISK-FORMAT-GAP-20260919.md +92 -0
  36. package/docs/internal/GH-DISCUSSION-5732-COMMENT.md +74 -0
  37. package/docs/internal/GPT-ACCEPTANCE-PROMPT-20260916.md +352 -0
  38. package/docs/internal/GPT-REVIEW-PROMPT.md +216 -0
  39. package/docs/internal/GROUP-WEBHOOK-SETUP.md +33 -0
  40. package/docs/internal/HANDOFF-TO-ZCODE-20260920.md +309 -0
  41. package/docs/internal/HERMES-DATA-VERIFICATION-20260919.md +120 -0
  42. package/docs/internal/HERMES-LEGACY-STATUS-20260919.md +74 -0
  43. package/docs/internal/ISSUE-55-58-VERIFICATION-20260918.md +175 -0
  44. package/docs/internal/ISSUE10-FIX-EXECUTION-20260919.md +389 -0
  45. package/docs/internal/ISSUE10-PLAN-20260919.md +254 -0
  46. package/docs/internal/ISSUE10B-FORENSICS-20260919.md +468 -0
  47. package/docs/internal/ISSUE9-PURGE-AND-R1-PLAIN-20260919.md +150 -0
  48. package/docs/internal/ISSUE9-RESIDUAL-FORENSICS-20260919.md +114 -0
  49. package/docs/internal/KICKOFF-P0.md +254 -0
  50. package/docs/internal/LESSON-TO-CANDIDATE-STATUS-20260919.md +79 -0
  51. package/docs/internal/MASTER-PLAN-3.0.md +411 -0
  52. package/docs/internal/MEMORY-GOVERNANCE-20260917.md +309 -0
  53. package/docs/internal/MEMORY-MUTATION-AND-INDEX-DESIGN.md +85 -0
  54. package/docs/internal/MERGE-CONFLICT-SCAN-20260914.md +222 -0
  55. package/docs/internal/PENDING-FIXES-20260916.md +289 -0
  56. package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md +705 -0
  57. package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md.bak-s10 +649 -0
  58. package/docs/internal/PROCEDURAL-MEMORY-AND-APPROVAL-DESIGN-20260918.md +225 -0
  59. package/docs/internal/PROGRESS-20260917.md +93 -0
  60. package/docs/internal/PROMPT-GAP-AUDIT-20260920.md +128 -0
  61. package/docs/internal/R1-DEGRADE-AUDIT-20260918.md +163 -0
  62. package/docs/internal/R1-READABILITY-FORENSICS-20260919.md +127 -0
  63. package/docs/internal/R2-EVIDENCE-DEEP-AUDIT-20260918.md +140 -0
  64. package/docs/internal/R3-DEGRADE-LEDGER-DESIGN-20260918.md +138 -0
  65. package/docs/internal/R4-RECALL-QUOTA-PLAN-20260918.md +218 -0
  66. package/docs/internal/RAG-KARPATHY-PROGRAM.md +229 -0
  67. package/docs/internal/REPORT-P0-NIGHTLY.md +212 -0
  68. package/docs/internal/REPORT-P5-ACCEPTANCE.md +31 -0
  69. package/docs/internal/REPORT-WB-GRAPH-NIGHTLY.md +153 -0
  70. package/docs/internal/RESUME-20260918.md +171 -0
  71. package/docs/internal/RESUME-20260919.md +104 -0
  72. package/docs/internal/REVIEW-WB-GRAPH-SELF.md +81 -0
  73. package/docs/internal/RHINELAB-TO-DEEPSEEK-FEASIBILITY.md +198 -0
  74. package/docs/internal/ROADMAP-20260917-WEEK.md +439 -0
  75. package/docs/internal/ROADMAP.md +106 -0
  76. package/docs/internal/RUN-P0-NIGHTLY.md +227 -0
  77. package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +185 -0
  78. package/docs/internal/S10-GAP-INVENTORY-20260917.md +239 -0
  79. package/docs/internal/S10-GAPS-PLAIN-20260917.md +125 -0
  80. package/docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md +360 -0
  81. package/docs/internal/SESSION-FILE-REPAIR-PROTOCOL.md +90 -0
  82. package/docs/internal/T6-EXECUTION-20260920.md +130 -0
  83. package/docs/internal/TELEMETRY-EFFECT-REPORT-DESIGN-20260918.md +146 -0
  84. package/docs/internal/THESIS-GAP-ANALYSIS-20260918.md +89 -0
  85. package/docs/internal/THESIS-OUTLINE-20260918.md +147 -0
  86. package/docs/internal/THREE-LAYER-CONTRACT.md +219 -0
  87. package/docs/internal/TODO-BACKLOG.md +263 -142
  88. package/docs/internal/TODO-GRAPH.html +715 -0
  89. package/docs/internal/TODO-GRAPH.html.bak-20260914-v2 +493 -0
  90. package/docs/internal/TODO-GRAPH.html.bak-20260915-alsfix +710 -0
  91. package/docs/internal/TODO-GRAPH.html.bak-20260915-p1 +710 -0
  92. package/docs/internal/TODO-GRAPH.html.bak-20260915-p6a-rev +703 -0
  93. package/docs/internal/TODO-GRAPH.html.bak-20260915-wshint +710 -0
  94. package/docs/internal/TODO-GRAPH.html.bak-20260916-batch +715 -0
  95. package/docs/internal/UPSTREAM-ISSUE-PR-TRIAGE-20260919.md +297 -0
  96. package/docs/internal/UPSTREAM-ISSUES-3RD-AUDIT-20260920.md +104 -0
  97. package/docs/internal/WB-FORMAT-CONVENTION.md +112 -0
  98. package/docs/internal/WB-GRAPH-DECISIONS-20260914.md +71 -0
  99. package/docs/internal/reviews/CLAIM-VERIFICATION-20260914.md +56 -0
  100. package/docs/internal/reviews/PLAN-gpt6astra-round2-20260914.md +787 -0
  101. package/docs/internal/reviews/REVIEW-gpt6astra-20260914.md +112 -0
  102. package/docs/internal/reviews/ROUND3-REVIEW-INTEGRATION-20260914.md +230 -0
  103. package/docs/prompts/M8-3-enable-verify.md +49 -49
  104. package/docs/screenshots/promo/promo-0-banner-v3.png +0 -0
  105. package/lib/acceptance.js +71 -0
  106. package/lib/activation-host.js +153 -18
  107. package/lib/activation-inbox.js +25 -7
  108. package/lib/board-mode.js +30 -0
  109. package/lib/client.js +1758 -90
  110. package/lib/config-io.js +156 -0
  111. package/lib/context-bridge.js +5 -2
  112. package/lib/context-host.js +86 -15
  113. package/lib/degrade.js +385 -0
  114. package/lib/dsh-home.js +143 -0
  115. package/lib/engine-identity.js +149 -0
  116. package/lib/engine-switch.js +247 -0
  117. package/lib/episodic-store.js +63 -12
  118. package/lib/evidence-store.js +10 -3
  119. package/lib/fact-store.js +22 -3
  120. package/lib/fs-retry.js +46 -0
  121. package/lib/index-sync.js +13 -1
  122. package/lib/index.js +3446 -263
  123. package/lib/intent-clean-safe.js +258 -0
  124. package/lib/intent-clean.js +12 -16
  125. package/lib/l0-extract.js +478 -149
  126. package/lib/l0-index-sync.js +195 -0
  127. package/lib/l0-index.js +349 -239
  128. package/lib/ledger-criteria.js +142 -0
  129. package/lib/m4-corpus.js +8 -2
  130. package/lib/m7-index-sync-host.js +73 -5
  131. package/lib/m7-wire.js +3 -3
  132. package/lib/memory-anchor.js +56 -1
  133. package/lib/memory-envelope.js +257 -0
  134. package/lib/memory-hub.js +138 -13
  135. package/lib/memory-index.js +4 -2
  136. package/lib/memory-mutation.js +246 -0
  137. package/lib/memory-writer.js +204 -24
  138. package/lib/note-status-apply.js +118 -0
  139. package/lib/note-status.js +196 -0
  140. package/lib/procedure-observation.js +48 -0
  141. package/lib/procedure-store.js +118 -20
  142. package/lib/python-setup.js +1 -1
  143. package/lib/python-sidecar-client.js +29 -3
  144. package/lib/recall-fusion.js +83 -12
  145. package/lib/rerank-host.js +160 -0
  146. package/lib/rules-edit.js +159 -0
  147. package/lib/rules-layer.js +261 -0
  148. package/lib/semantic-decide.js +41 -8
  149. package/lib/semantic-js.js +66 -6
  150. package/lib/shadow-host.js +3 -5
  151. package/lib/shadow-retrieval.js +3 -3
  152. package/lib/skill-export-host.js +153 -0
  153. package/lib/skill-export.js +239 -0
  154. package/lib/state-commit.js +245 -0
  155. package/lib/storage-manage.js +6 -0
  156. package/lib/subagent-gc.js +4 -8
  157. package/lib/temporal-parse.js +191 -159
  158. package/lib/tier-layer-inject.js +650 -0
  159. package/lib/tier0-catalog.js +735 -0
  160. package/lib/water-window.js +263 -186
  161. package/lib/wb-contract.js +691 -0
  162. package/lib/wb-sidecar.js +890 -0
  163. package/lib/ws-overview-rank.js +2 -2
  164. package/package.json +1 -1
  165. package/python/m7_embedding_v1.py +5 -5
  166. package/python/worker_semantic_v1.py +17 -6
  167. package/python/worker_v1.py +38 -4
@@ -0,0 +1,114 @@
1
+ # ⑨ 漏网追加取证(2026-09-19 22:40 · 真机实测)
2
+
3
+ > **性质**:⑨ 修复后**新产生**的脏数据。不是存量,是**活的漏网证据**。
4
+ > **发现方式**:用户截图「技能审批队列 (5)」,主代理实测宿主内存发现数字**真的回到了 5**。
5
+
6
+ ---
7
+
8
+ ## 0. 实测数据(`GET /api/dsh-auto-memory-pre/memory-hub`)
9
+
10
+ | 指标 | ⑨ 清理后(20:15) | **现在(22:40)** |
11
+ |---|---|---|
12
+ | `procedures.size` | 12 | **14** |
13
+ | `pipeline`(会进注入路径) | **3** | **5** |
14
+ | `active` | 1 | 1 |
15
+
16
+ **pipeline 逐条**(`obs=True` 即 `observationOnly`):
17
+
18
+ ```
19
+ [observed] 让我自己去试吧。现在是什么情况? obs=True ← 旧(真人文本)
20
+ [observed] 开始实施 obs=True ← 旧(真人文本)
21
+ [observed] 开始实施,实施完给我准确的报告保证我能看懂 obs=True ← 旧(真人文本)
22
+ [observed] Source: me obs=True ← ★ 新漏网
23
+ [observed] Reference: ## 2026-09-18 - dsh-auto-memo obs=True ← ★ 新漏网
24
+ ```
25
+
26
+ **⇒ ⑨ 修好的判据挡住了 8 条存量,但挡不住这两个新形态。**
27
+
28
+ ---
29
+
30
+ ## 1. 根因:判据「太具体」——把「前缀」和「内容」绑死了
31
+
32
+ ⑨ 落地的 F3(`lib/intent-clean-safe-pre.js`):
33
+
34
+ ```js
35
+ const PLUGIN_TAIL_MARKER_RE = /^\[?Retrieved memory ref
36
+ |^Verify against the current user request
37
+ |^If a reference hints at what you need
38
+ |^Source:\s*mem_[0-9a-f]{32} // ← ★ 问题在这
39
+ |^Reason:\s*fv2 lane=
40
+ |^Score:\s*[0-9.]+ \(rank \d+\/\d+\)/i
41
+ ```
42
+
43
+ **`^Source:\s*mem_[0-9a-f]{32}`** —— 它要求 `Source:` **后面必须紧跟合法的 `mem_<32hex>`**。
44
+
45
+ 而漏网的这条是 **`Source: me`**:
46
+ - `Source:` 后面不是 `mem_<32hex>`
47
+ - ⇒ **判据不匹配 ⇒ 放行**
48
+
49
+ **同理**:`Reference: ## 2026-09-18 - dsh-auto-memo` —— F3 里**根本没有 `^Reference:` 这一条**
50
+ (只有 `^\[?Retrieved memory ref`,那是召回块的**首行**,不是 `Reference:` 行)。
51
+
52
+ ---
53
+
54
+ ## 2. ★ 这两条是怎么产生的(推断,附证据方向)
55
+
56
+ **推断(基于形态)**:它们来自**召回块被截断后的残片**。
57
+ 召回块的完整形态包含 `Source: mem_<32hex> / <scope> / v<n> / <digest>` 与 `Reference: <正文片段>` 两类行。
58
+ 当这些行**作为 intent 的一部分被截断**(`slice(0, 40)`,见 `memory-hub-pre.js:155`)时:
59
+
60
+ - `Source: mem_abc123...` 被截 → `Source: me`
61
+ - `Reference: ## 2026-09-18 - dsh-auto-memo...` 被截 → 标题即截断结果
62
+
63
+ **⇒ 截断让「内容判据」失效**,但**前缀 `Source:` / `Reference:` 仍然完好**。
64
+
65
+ **关键教训(与 ⑨ 的 F3 设计初衷直接冲突)**:
66
+ > ⑨ 的注释里明写「**判据是族(family)+ 形状,不是整句前缀** ⇒ 框架换措辞仍能被同一个族覆盖」。
67
+ > **但 F3 的实际实现把「前缀」和「后缀内容」绑死了** ⇒ 一旦被截断,就漏。
68
+ > **这正是 ⑨ 自己批评过的错误模式,在 F3 上复发了一次。**
69
+
70
+ ---
71
+
72
+ ## 3. 修法(**尚未动手,待与 ⑩ 一并处理**)
73
+
74
+ **方向**:F3 应改为 **「前缀即判据」**,不要求后缀形态:
75
+
76
+ ```js
77
+ // 现状(过严,被截断即漏)
78
+ |^Source:\s*mem_[0-9a-f]{32}
79
+
80
+ // 应为(前缀族,后缀不约束)
81
+ |^Source:\s*\S // 或更严格:^Source:\s*(mem_|me\b|epi_|session)
82
+ |^Reference:\s*\S // ← 新增,F3 目前完全没有这一条
83
+ ```
84
+
85
+ **⚠️ 必须同时守住误伤边界**(⑨ 套件 [4] 组守的就是这条):
86
+ - 「帮我看看 `[Retrieved memory reference]` 这个标记是干嘛的」**不得被删**
87
+ - ⇒ 前缀判据必须**要求 `Source:`/`Reference:` 位于行首**(`^` 锚定保留),
88
+ 且**不得**把正文里出现的普通 `Source:` 误判
89
+ - ⇒ 建议**加 `\s*\S`(后面必须跟非空内容)**,避免把孤立的 `Source:` 也吞掉
90
+
91
+ **验收要求**:
92
+ 1. 新增套件用例:`Source: me` / `Reference: ## 2026-09-18 - dsh-auto-memo` **必须被判脏**
93
+ 2. 反向用例:正文中的 `Source:` / `Reference:` **不得**被误删(沿用 ⑨ 套件 [4] 组口径)
94
+ 3. 变异演示真红
95
+ 4. 全量回归 0 失败
96
+
97
+ ---
98
+
99
+ ## 4. 与既有计划的关系
100
+
101
+ | 项 | 关系 |
102
+ |---|---|
103
+ | **⑨** | **判定为「修得不完整」** ⇒ 需追加一轮 F3 判据修正(本文件即其取证) |
104
+ | **⑩-a / ⑩-b** | **同源**:fact 分支同样未清洗 ⇒ 本次一并修 |
105
+ | **存量 2 条新脏** | 与 ⑩-b 的「存量 3 条 fact」处置同源 ⇒ **同样走路 C(靠卫生门堵住)** |
106
+
107
+ **⇒ 建议把「F3 前缀判据修正」并入 ⑩ 那一批一起做**,因为它们都在 `memory-hub-pre.js` 的同一条链路上。
108
+
109
+ ---
110
+
111
+ ## 5. 取证边界
112
+ - 本文所有 `procedures.size / pipeline / title` 均为**实测**(`GET /api/dsh-auto-memory-pre/memory-hub`,2026-09-19 22:40)。
113
+ - 「这两条来自召回块截断残片」为**推断**,依据是形态与 `memory-hub-pre.js:155` 的 `slice(0, 40)`;
114
+ 未逐条回溯其 `sourceEpisodes` 确认。
@@ -0,0 +1,254 @@
1
+ # 🚀 KICKOFF · P0 过夜托管运行(2026-09-14 深夜版)
2
+
3
+ > **这份文件是给「接续后的新窗口」的第一份指令。**
4
+ > 你是谁:接手 `dsh-auto-memory` 3.0 施工的 agent。**规划层已经全部封闭,不要重新规划、不要重新评审、不要问「我们从哪开始」。**
5
+ > 你的任务:**按本文开工,过夜连续施工,在指定停点停下来汇报。**
6
+ > 写这份文件的人(上一个窗口)已经把该定的都定了,该踩的坑都标了。**照做即可。**
7
+
8
+ ---
9
+
10
+ ## 0. 三十秒状态摘要
11
+
12
+ - 项目:DSH 插件 `dsh-auto-memory`(宿主 `lib/index.js` + 浏览器 `lib/client.js` + 可选 python 引擎)。
13
+ - **开发树就是活的宿主代码**(profile 以 `link:` 挂载)⇒ 你改的文件 = 用户下次重启后运行的代码。
14
+ - 规划:三轮外部评审(GPT-6 Astra)走完,产出**《合并总纲 3.0》v2**(施工蓝本)。
15
+ - 你的任务:**P0(注入边界 + 写入门 + 白板最小适配边界)**,然后 P6A。
16
+ - 已知基线:全量 **79 套件 PASS / 0 FAIL / ≈149s**;`verify-todo-graph` 47 卡;doc-code 守卫 44/0。
17
+
18
+ ---
19
+
20
+ ## 1. 第一步:按顺序读这些(**绝对路径,别猜**)
21
+
22
+ ```
23
+ D:\dsh-auto-memory\docs\internal\MASTER-PLAN-3.0.md
24
+ ← 【施工蓝本】先读 §0.5(v2 修订节)+ §4 Phase 0 + §6 交付纪律
25
+
26
+ D:\dsh-auto-memory\docs\internal\reviews\ROUND3-REVIEW-INTEGRATION-20260914.md
27
+ ← 【最重要】第三轮复核的逐条核实与采纳记录:
28
+ 你施工时要用的每一条 v2 修正、每个新增断言编号(T0-8B/T0-8C/T1-7B…)都在这里
29
+
30
+ D:\dsh-auto-memory\docs\internal\MERGE-CONFLICT-SCAN-20260914.md
31
+ ← 矛盾扫描(为什么这么调和)
32
+
33
+ D:\dsh-auto-memory\docs\internal\DECISIONS-20260914-SESSION.md
34
+ ← 用户 8 条裁决 + 三处被推翻的前提
35
+
36
+ D:\dsh-auto-memory\docs\internal\WB-GRAPH-INTEGRATION-PLAN.md
37
+ ← 白板线方案(386 行);P0 的「白板最小适配边界」要看 §2.2 判据表
38
+
39
+ D:\dsh-auto-memory\docs\internal\WB-GRAPH-DECISIONS-20260914.md
40
+ ← 白板 15 个拍板点(本文 §4 已给出**预授权默认值**,不用等用户)
41
+
42
+ D:\dsh-auto-memory\docs\internal\TODO-GRAPH.html
43
+ ← 项目管理看板(47 卡;用浏览器打开看更清楚,也可以只 grep 里面的卡)
44
+ ```
45
+
46
+ **按需查(不要通读)**:`SEMANTIC-ARCHITECTURE-SPEC.md`(S1–S10)、`THREE-LAYER-CONTRACT.md`(I1–I7)、`RAG-KARPATHY-PROGRAM.md`。
47
+
48
+ ---
49
+
50
+ ## 2. 第二步:主动恢复上下文(用户明确要求)
51
+
52
+ **接续流程会生成本窗口的转写包**,主动去找、去读:
53
+
54
+ ```powershell
55
+ Get-ChildItem "$env:USERPROFILE\.dsh\memory\workspaces\--D--dsh-auto-memory--\handoff\prev-session-*.md" |
56
+ Sort-Object LastWriteTime -Descending | Select-Object -First 3 Name, Length, LastWriteTime
57
+ ```
58
+
59
+ - 取**最新一份**读(约 70KB,**单条截断 2000 字符**,是上一个窗口的完整转写)。
60
+ - 注意:DSH 原生会话是 `~/.dsh/sessions/--D-dsh-auto-memory--/<id>/session.v3.jsonl.zstd`(**zstd 压缩,read 工具读不了**);`prev-session-*.md` 是插件解压后的可读版。
61
+ - **同时调用 `memory_recall_pre`** 检索本机所有工作区记忆(含本项目的项目笔记与用户级规则)。**用户说「有些还有问题」,所以不要只信本文,也要自己搜。**
62
+
63
+ ---
64
+
65
+ ## 3. 第三步:立刻开工(按此顺序,不要跳)
66
+
67
+ ### 3.1 第一件事:修 C8(**不依赖任何决策,现在就能做,且已证明是真危害**)
68
+
69
+ **事实**:`superseded` / `retracted` 状态的记忆条目**现在真的会进入注入文本**——违反契约不变式 **I5**(`THREE-LAYER-CONTRACT.md:183`:「非 `current` 的条目在**检索结果与注入内容两处**都被过滤」)。
70
+
71
+ **证据**(已跑出,不是推测):
72
+ ```powershell
73
+ cd D:\dsh-auto-memory; node tools\_redproof\red-proof-phase0-t01.mjs
74
+ # 当前输出:0 通过 / 4 报红,exit 1
75
+ # 其中一条实测:4 条候选(2 current + 1 superseded + 1 retracted)全部进了注入文本
76
+ ```
77
+
78
+ **你要做的**:
79
+ 1. 在**注入侧**加 `current` 过滤(检索侧已有——问题在注入侧)。落点候选:`lib/tier-layer-inject-pre.js` 的 `composeTieredInjectionPre` / `buildTier1SectionPre` 入参处,以及调用方 `lib/index.js`。
80
+ 2. **注意**:`tests/smoke/smoke-test-c5-tier-inject-pre.mjs:127/133/137` **把违反 I5 的现状锁成了「正确行为」**(`:133` 断言三条全留、`:137` 断言那条 superseded 带 0.55 分)。**这个测试必须改**——这是「断言锁死错误现状」的典型案例,改它时要留注释说明原因。
81
+ 3. 让 `red-proof-phase0-t01.mjs` **由红转绿**,然后**把它移进 `tests/smoke/`** 成为正式套件(命名建议 `smoke-test-i5-status-filter-pre.mjs`)。
82
+ 4. 跑全量,确认 79 套件仍全绿(**你改了一个断言与一个实现,套件数会变,允许变成 80**)。
83
+
84
+ ### 3.2 第二件事:T0-2 版本校验
85
+
86
+ - 现行 `lib/index.js:3894` 的命中复用**只查时间**(`Date.now() - gh.at < 30*60000`)与 session,不查 `miv`。
87
+ - 要改:`activation-host-pre.js` 的 `recordTierGateHits` 投影携带 `miv/contextVersion/observationId/requestKey`;复用前比对。
88
+ - 断言:**T0-2**(A 快照产生候选、B 快照准备输出 ⇒ A 正文不得出现且必须带版本降级原因;A/B 混装即失败)。
89
+
90
+ ### 3.3 第三件事:T0-3 预算单一口径
91
+
92
+ **两处实测缺陷**(已核过行号):
93
+ - `lib/tier-layer-inject-pre.js:327–335` —— 只裁下探段(`:329 lines.pop()` 只动 `drillParts`),`headParts`(目录 + 降级行)**从不动**;且 `:332–334` **在裁剪之后**又追加降级说明 ⇒ **最终长度可超 `maxTotal`**。
94
+ - `lib/index.js:3986` —— `catalogCost` 被 `Math.min(..., budget*0.35)` 封顶,**封顶的是"扣账成本"**;实际注入用的是全文 `s.tier0LayerText`(`:3957`),**不参与 `used` 记账**。
95
+
96
+ **v2 要求**:改为**分项账本**(仍由**同一个** `composeMemoryEnvelopePre` 生成):
97
+ ```
98
+ chars: { rules, memoryReferences, otherDynamic, total }
99
+ limits: { memoryReferences, otherDynamic }
100
+ ```
101
+ 规则段、参考段、其他动态**分项计量**;标题/分隔符/降级说明**必须归入某个分项**,**不允许未计费尾巴**。
102
+
103
+ ### 3.4 第四件事:写入门 + 白板最小适配边界(**P0 必须与它一起做**)
104
+
105
+ **为什么必须一起做**(v2 明确):写入门要保护**卡片集合**与**用户区**,而这两个概念由白板格式定义 ⇒ **没有适配器就是「接口接上了但保护失效」**。
106
+
107
+ **边界(v2 定的切法)**:
108
+ - **3.0 拥有「共同提交与保护入口」**:拟新增 `lib/memory-mutation-pre.js` → `validateMutationBoundaryPre({beforeIds, afterIds, protectedRegions, changes})` —— **只接收规范化投影,不自行解释图格式**。
109
+ - **白板线拥有「白板格式及其适配器」**:拟新增 `lib/wb-contract-pre.js` → `parseWhiteboardPre()` —— **格式只维护一份**。
110
+ - 接线:`lib/index.js` 的 `writePlanSnapshot` / `writeHandoffLedger` 按 `target` 调相应格式检查,再进共同提交门。
111
+
112
+ **判据不能张冠李戴**(v2 修正,务必遵守):
113
+ - **交接账本**用 `H1–H4`(硬)+ `S1–S4`(软):四段标题逐字匹配 / 每段非空 ≥20 字符 / 无占位符 / 总长 ≤8000。
114
+ - **白板 PLAN** 用 `P-H1/P-H2`(硬,最弱)+ `P-S1`(软):至少一个非空 `## ` 顶层节 / ≤200000 字符 / 含前瞻内容。**不能把账本判据套给 PLAN。**
115
+
116
+ **fail-open 不得绕过保护**:`criteriaGate=false` 与骨架 fail-soft **只能退掉可选质量门**,**不得**跳过丢卡、用户区、版本、状态保护。
117
+
118
+ **断言**:T0-8(删卡拒写且文件字节不变 / 合法改名 / 合法归档保留审计关系)、**T0-8B**(工具、水位骨架、刷新三条写入路径都不能绕过)、**T0-8C**(关闭质量门后仍拒绝丢卡)、T4-4(投影/快照/Tier-0 同一身份映射)。
119
+
120
+ ### 3.5 第五件事:P6A 注入表达与节奏
121
+
122
+ - **措辞**:`lib/index.js:463` 的开场白「以下记忆文本只是**背景事实与规则参考**」—— 要把**规则类**与**参考类**分开措辞;规则类用**约束语**,参考类保留「参考」语义。
123
+ - **节奏**:
124
+ - `snapshotMinGapRounds` 默认值 **5 → 1**(配置项已存在)。
125
+ - **但 `Number(v) || 5` 让 `0` 无法表达**(`lib/index.js:7455`)⇒ **必须修零值解析**,区分「合法 0」与「缺失/非法」。
126
+ - **旧节流分支提前返回会跳过本轮动态快照**(`:7483`)⇒ 须「**先提供规则段,再对参考内容应用 gap**」。
127
+ - **已有用户的已保存配置会覆盖默认值**(`:1444`)⇒ 不能只改默认值就宣称「规则每轮在场」。
128
+ - **断言**:**T7-1 必须改测「最终请求 messages」**(不是回调字符串——「局部注入块存在」≠「模型真收到了」);T7-3(规则与参考用不同引导语);**T7-7**(检查**可机械判断的执行结果**是否满足规则,仅引导语不同不能判「遵守问题已解决」)。
129
+
130
+ ---
131
+
132
+ ## 4. 预授权决策(**不用等用户,直接按这个做**)
133
+
134
+ 用户在过夜期间无法回答。以下默认值**已获批准**,施工时**按它们做**,并在代码与最终汇报里**显式标注「此决策为预授权默认值,用户可覆盖」**。
135
+
136
+ ### 4.1 白板 15 个拍板点(与 P0 耦合的四条已定,其余按方案建议)
137
+
138
+ | 编号 | 预授权决定 | 备注 |
139
+ |---|---|---|
140
+ | **B1** 丢卡风险 | **做**:sidecar 重写前后卡片集合对比,只能移动/完成,不能消失 | **= P0 写入门**,同一件事 |
141
+ | **B5** 双状态源 | **看板 = 现在时(唯一事实)**;账本 = 过去时(历史),其「任务状态」段**只指路** | **= P1 的 miv 语义**,P0 只做写入门侧的引用 |
142
+ | **B4** 人机冲突 | **从选项 (c) 起步**:每张卡片分「模型维护区 / 用户备注区」 | **= P0 写入门要保护什么** |
143
+ | **A8** 条目锚点 | **做**:`mem_` + sha256(workspaceKey + 页面相对路径 + 卡片标题) 前 32 位十六进制 | **白板进语料的前提** |
144
+ | A1 | P0-P1 立即做;P2-P3 等后端冻结解除 | |
145
+ | A2 | sidecar 位置 = `memoryRoot/<ws>/handoff/`(与现有 handoffDir 同目录) | |
146
+ | A3 | 静态纪律**随下一版一次性更新** | 代价:全量会话一次缓存重建 |
147
+ | A4 | 工具命名 = `memory_expand_pre` / `memory_trace_pre`(对齐 `*_pre` 惯例) | 对外契约,发布后难改 |
148
+ | A5 | P0-P1 进 2.6.0;P2-P3 进 2.7.x | |
149
+ | A6 | 水位骨架硬判据失败策略 = **照写 + 警示行** | 优先保证接续材料存在 |
150
+ | A7 | PLAN 判据**维持自由节名** + 最弱硬判据 P-H1 | 固定小节集会削弱老化机制 |
151
+ | B2 | 列顺序约定 + 完成卡归档;P7 老化升级为**列感知** | |
152
+ | B3 | 卡片带接续链 `contSeq` 时间轴;僵尸卡注入时打过期标记 | 复用现有 `cont-seq.json` |
153
+ | B6 | 卡带接续链标记,新窗口只展开自己链 | |
154
+ | B7 | **先试点两周**再定 P1/P2 交互方案 | |
155
+
156
+ ### 4.2 施工纪律(用户已裁定,不要问)
157
+
158
+ - **新旧并存 + 开关回退**:每个新路径一个配置开关,**默认关**。
159
+ - **每阶段必须有回滚动作**;没有回滚的阶段**不许开工**。
160
+ - **改动点写到 `文件:函数名`**。
161
+ - **新增守卫必须演示变红后再按字节还原**(本项目已被「源码接线守卫 ≠ 行为断言」咬过三次)。
162
+ - **上游同步冻结**:**不主动开 PR、不 push、不 commit**(用户明确「修复在开发端就行」)。
163
+
164
+ ---
165
+
166
+ ## 5. 🛑 停点清单(**到这些地方必须停下来问用户,不许自行决定**)
167
+
168
+ 1. **改动会破坏现有行为且无法用开关回退** —— 立即停,先报告。
169
+ 2. **需要改契约 / 规范条款本体**(`S1–S10` / `I1–I7` / `WB-FORMAT-CONVENTION`) —— **只能引用不能重写**,确需修改先提案。
170
+ 3. **全量回归无法回到全绿** —— 停下来,报告「哪个套件红了、卡在哪一步、你试了什么」,**不要为了让它绿而删断言**。
171
+ 4. **需要动 `~/.dsh/` 下的配置或宿主进程** —— 一律先问(**严禁 `Get-Process node | Stop-Process`**,曾杀穿 harness;宿主重启永远由用户自己做)。
172
+ 5. **要动超过 3 个文件的重构** —— 先问范围。
173
+ 6. **P0 全部做完** —— 停下来做一次完整汇报(见 §7),等待用户与 GPT 验收。
174
+ 7. **遇到本文与 `MASTER-PLAN-3.0.md` / `ROUND3-REVIEW-INTEGRATION` 冲突** —— 以那两份为准,并把冲突写进汇报。
175
+
176
+ ---
177
+
178
+ ## 6. 📝 记忆与注释纪律(**用户明确要求:多写记忆、多写注释**)
179
+
180
+ ### 6.1 写记忆(跨窗口续命的关键)
181
+
182
+ > **本会话可能过夜运行并中途压缩。压缩会吃掉你的思考过程,但吃不掉你写进文件的结论。**
183
+
184
+ | 时机 | 动作 |
185
+ |---|---|
186
+ | **每完成一个小步**(一个函数改完、一个断言转绿) | 调 `memory_log_pre` 追加一条(记:做了什么、结果、行号) |
187
+ | **每得出一个跨会话有用的结论**(口径、约定、踩坑) | 调 `memory_note_pre`(`kind=note`)写进项目笔记 |
188
+ | **方向变化 / 阶段完成** | 调 `memory_note_pre`(`kind=handoff`)写四段式交接账本 |
189
+ | **对项目全貌理解有实质变化** | 调 `memory_note_pre`(`kind=plan`)重写白板 |
190
+
191
+ **日志纪律**:客观陈述(第三人称中性句式),**只留可复用的事实/决策/规则/路径**,不写「我考虑/我排查」这类思考腔。
192
+
193
+ ### 6.2 写运行日志(**这是你被压缩后的救命绳**)
194
+
195
+ **新建并持续追加**:`D:\dsh-auto-memory\docs\internal\RUN-P0-NIGHTLY.md`
196
+
197
+ 每完成一步就追加一段:
198
+ ```markdown
199
+ ## [HH:MM] 步骤名
200
+ - 目标:
201
+ - 改了:文件:函数名
202
+ - 结果:断言 X 由红转绿 / 全量 N 套件 0 失败
203
+ - 卡住:无 / 具体卡点
204
+ - 下一步:
205
+ ```
206
+ **理由**:压缩后你只剩摘要,但这份文件在磁盘上,**你随时可以重读它恢复进度**。
207
+
208
+ ### 6.3 写代码注释(本项目已有的风格,务必遵守)
209
+
210
+ - **中文注释,解释「为什么」而不是「做了什么」**(代码已经说明做了什么)。
211
+ - **踩过的坑必须写进注释**,格式参考现有代码:写清「旧实现是什么 / 为什么错 / 实测证据」。
212
+ - 参考风格:`lib/index.js:1981-1991`(解耦那段)、`lib/client.js` 里 `configOf` 那段。
213
+ - **改动过测试断言时**,在断言旁注明为什么改(例:「原断言锁定了违反 I5 的现状,见 red-proof」)。
214
+
215
+ ---
216
+
217
+ ## 7. ✅ 完成判据(什么叫「今晚跑完了」)
218
+
219
+ **至少满足**:
220
+ 1. C8 修复完成:`red-proof-phase0-t01.mjs` 4/4 转绿,且已移入 `tests/smoke/`。
221
+ 2. T0-2、T0-3 实现并各有**能红的**断言。
222
+ 3. 写入门 + 白板最小适配边界完成(`memory-mutation-pre.js` + `wb-contract-pre.js` 的 P0 部分)。
223
+ 4. **全量 `node tools/run-smoke.mjs` 全绿**(套件数允许增加)。
224
+ 5. `RUN-P0-NIGHTLY.md` 完整记录每一步。
225
+ 6. 最终汇报(见下)。
226
+
227
+ **最终汇报必须包含**(给用户拿去喂 GPT 验收):
228
+ - 改动的文件清单(`文件:函数名`)
229
+ - 每条新断言的**编号 + 现状(绿/红/未做)+ 它证明什么**
230
+ - **实测数据**(跑了几次、耗时、套件数变化)
231
+ - **回滚方法**(关哪个开关、还原哪个文件)
232
+ - **未完成项与原因**
233
+ - **预授权默认值的实际使用情况**(哪些用了、哪些你觉得该改)
234
+ - **你认为最值得让 GPT 审的三个点**
235
+
236
+ ---
237
+
238
+ ## 8. ⛔ 安全红线(过夜期间绝不可越过)
239
+
240
+ 1. **严禁** `Get-Process node | Stop-Process` 或任何重启/关闭宿主进程的操作(**曾杀穿一次 harness**)。
241
+ 2. **严禁** `git commit` / `push` / `checkout` / `stash` / `reset`(约 98 个未提交文件是用户的工作状态)。
242
+ 3. **严禁**改 `~/.dsh/` 下的任何配置(除非用户当场同意)。
243
+ 4. **严禁**为了让测试变绿而**删除或弱化**既有断言。
244
+ 5. **严禁**在没有开关的情况下改掉正在生效的默认行为(开发树 = 活代码)。
245
+ 6. 写任何文件**严禁 BOM**;`lib/index.js` 与 `lib/client.js` 是 **CRLF**,`lib/*-pre.js` 与测试是 **LF** —— 改完做字节探测。
246
+ 7. **HTML/JS 字符串内禁用 ASCII 双引号**(用「」)—— 已有一次因此渲染报错的记录。
247
+
248
+ ---
249
+
250
+ ## 9. 现在就动手
251
+
252
+ 第一件事:**跑 `node tools\_redproof\red-proof-phase0-t01.mjs` 看它报红**,然后开始修 C8。
253
+
254
+ 不要重新规划。不要问「从哪里开始」。**本文就是答案。**
@@ -0,0 +1,79 @@
1
+ # ④ 教训 → 观察型候选 · 引擎侧可行性核查(2026-09-19)
2
+
3
+ > 触发:按 `PRE-FRONTEND-CHECKLIST-20260919.md` 执行序推进 ④ 时的实施前核查。
4
+ > 方法:`artifacts/_probe-lesson-candidate.mjs`(**13/13**,执行真实 store,假 io 内存态,绝不碰磁盘)。
5
+
6
+ ---
7
+
8
+ ## 1. 用户裁定(设计稿 §2.3 原话)
9
+
10
+ > 「**教训**肯定得进 C 啊,它**不自动晋升**,但是**可以形成候选**,
11
+ > 模型也可以**通过搜索搜索到**。因为教训那边,我现在自动注入的硬约束也是某种教训,
12
+ > 把它**上升到了约束层面**。」
13
+
14
+ ⇒ 拆成**两条必须同时成立**的判据,加一条由设计稿推出的必然推论:
15
+
16
+ | 编号 | 判据 | 含义 |
17
+ |---|---|---|
18
+ | **L-1** | **不自动晋升** | 候选不受 `promote()` 通道影响 |
19
+ | **L-2** | **可被搜索到** | 候选可经 `query()` 取到 |
20
+ | **L-3** | **不被注入**(推论) | 未晋升 ⇒ 不进 `activeProcedures()` ⇒ 不进 checklist |
21
+
22
+ ---
23
+
24
+ ## 2. 核查结论:**L-1 / L-2 / L-3 引擎侧已全部满足**
25
+
26
+ `observationOnly:true` 这一机制**恰好就是**用户裁定的「不自动晋升的候选」形态:
27
+
28
+ | 判据 | 实证(探针编号) | 结果 |
29
+ |---|---|---|
30
+ | L-1 | `L-1-2` 把证据拉到**远超门槛**(`distinctSessions:99, successCount:99`)仍 `decision:'keep'`;`L-1-3` 原因码为 `observation-only`;`L-1-4` `stage` 未变 `validated` | ✅ |
31
+ | L-1(反证) | `L-1-5` **同等证据下普通候选确实晋升** ⇒ 隔离是**定向的**,不是"晋升通道整体坏掉" | ✅ |
32
+ | L-2 | `L-2-1` `query({})` 返回全部(含观察行);`L-2-2` **可按 title 子串搜到**;`L-2-3` 结果携带 `observationOnly` 供调用方区分;`L-2-4` 可按 stage 过滤 | ✅ |
33
+ | L-3 | `L-3-1` 未 `active` ⇒ `renderChecklist()` 返回 `null`(**不会被注入**);`L-3-2` `activeProcedures()` 为空 | ✅ |
34
+
35
+ > `L-1-5` 是本核查**最关键的一条**:只验"观察行不晋升"会与"引擎完全坏掉"不可区分(假绿)。加上反证才证明隔离是有效的。
36
+
37
+ ---
38
+
39
+ ## 3. ★ 真缺口:缺的是**生产者**,不是引擎
40
+
41
+ **探针 `L-4-1` 实测:全仓零处**把 `retracted` 条目派生成 procedure 候选。
42
+
43
+ 现有 `retracted` 的消费点**只有一个**,且是 R4-A 刚落的**检索侧呈现标记**(`L-4-2`):
44
+
45
+ ```
46
+ lib/l0-extract-pre.js L0_RETRACTED_MARK_PRE_V1 → ⚠已撤回(原因:…;更正见 mem_…)
47
+ ```
48
+
49
+ ⇒ **缺口定位**:`retracted 教训` →(**缺失的生产者**)→ `observationOnly` 候选
50
+ →(已有)可检索/不晋升/不注入。
51
+
52
+ **引擎侧什么都不用改** —— 只需要一个**生产者**,把 `status:'retracted'` 的条目转成 `observe()` 的入参。
53
+
54
+ ---
55
+
56
+ ## 4. ⚠️ 但本项**不应由 agent 自行实现**
57
+
58
+ 用户在 **2026-09-13** 明确(ZCode 项目记忆留档):
59
+
60
+ > 「**任何 procedure 记忆引擎改动必须等用户拍板整体方案,别顺手修**」
61
+ > 「之前提议的两个小改点……已并入这次统一重构,**不单独做(动了也是白改)**」
62
+
63
+ 而「加一个 retracted → 候选 的生产者」**正是 procedure 记忆引擎的功能改动**。
64
+
65
+ ⇒ **本项的处置与 ③ 完全一致**:核查完成,**实现权交用户**。
66
+
67
+ ---
68
+
69
+ ## 5. 建议(不自行决定)
70
+
71
+ 1. **④ 从「待立项」改为「引擎已就绪,待批复」** —— 前置条件(L-1/L-2/L-3)已实测满足,剩下的是**要不要加生产者**的决策。
72
+ 2. 若批准,最小实现是:一处 `retracted` 扫描 → 构造 `{observationOnly:true, sourceEpisodes:[...], steps:['观察任务:<reason>']}` → `observe()`。
73
+ - **零引擎改动**(复用现有 `observe` + `observationOnly` 语义)
74
+ - **可被现有套件保护**(`promote()` 短路、`query()` 通路已有断言)
75
+ 3. 与 ③ 的 **H-1**(上游是否真产富候选)**合并观测**:两者都在问「procedure 层的真实数据流量是多少」。若上游长期为空,先修 H-1 更有价值。
76
+
77
+ > ⚠️ 本项的**依赖链**:④ 的生产者若落地,会让 `procedures.json` 里出现大量 `observationOnly` 行 ——
78
+ > 而 `procedurePromotionEnabled` 目前**出厂 false**(③ H-2),故**不会**因此产生任何注入副作用。
79
+ > ⇒ ④ 与 ③ 是**同一条决策链**上的两环,宜一并拍板。