@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,710 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>dsh-auto-memory · 待办排期图</title>
7
+ <style>
8
+ :root{
9
+ --paper:#F4F1EB; --ink:#17171A; --accent:#E9470C; --muted:#6B6B73;
10
+ --line:#D8D3C8; --card:#FFFFFF; --card2:#FAF8F4; --shadow:0 1px 2px rgba(23,23,26,.06),0 8px 20px rgba(23,23,26,.05);
11
+ --p0:#E9470C; --p1:#C9860A; --p2:#3E6C8E; --decide:#7A3E9D; --defer:#9A9AA3; --inbox:#2E7D6B;
12
+ }
13
+ @media (prefers-color-scheme: dark){
14
+ :root{ --paper:#141416; --ink:#EDEBE7; --muted:#9C9CA4; --line:#2C2C31; --card:#1C1C20; --card2:#222227; --shadow:0 1px 2px rgba(0,0,0,.4),0 8px 24px rgba(0,0,0,.35); }
15
+ }
16
+ *{box-sizing:border-box}
17
+ body{margin:0;background:var(--paper);color:var(--ink);
18
+ font:14px/1.6 "Segoe UI","PingFang SC","Microsoft YaHei",system-ui,sans-serif;}
19
+ header{position:sticky;top:0;z-index:20;background:color-mix(in srgb,var(--paper) 88%,transparent);
20
+ backdrop-filter:blur(10px);border-bottom:1px solid var(--line);padding:14px 22px 12px}
21
+ h1{margin:0 0 2px;font-size:17px;letter-spacing:.2px}
22
+ h1 span{color:var(--accent)}
23
+ .sub{color:var(--muted);font-size:12px}
24
+ .bar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:10px}
25
+ .chip{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:999px;
26
+ padding:3px 11px;font-size:12px;cursor:pointer}
27
+ .chip[data-on="1"]{border-color:var(--ink);background:var(--ink);color:var(--paper)}
28
+ .btn{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:8px;
29
+ padding:4px 10px;font-size:12px;cursor:pointer}
30
+ .btn:hover{border-color:var(--accent);color:var(--accent)}
31
+ .legend{display:flex;gap:14px;flex-wrap:wrap;margin-top:8px;font-size:12px;color:var(--muted)}
32
+ .dot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:5px;vertical-align:1px}
33
+ main{max-width:1180px;margin:0 auto;padding:22px 22px 80px}
34
+ .phase{position:relative;margin:0 0 10px;padding-left:30px}
35
+ .phase::before{content:"";position:absolute;left:9px;top:34px;bottom:-14px;width:2px;background:var(--line)}
36
+ .phase:last-child::before{display:none}
37
+ .phead{display:flex;align-items:center;gap:10px;margin:26px 0 12px;position:relative}
38
+ .phead::before{content:"";position:absolute;left:-26px;top:50%;transform:translateY(-50%);
39
+ width:12px;height:12px;border-radius:50%;background:var(--paper);border:2px solid var(--muted)}
40
+ .phase[data-tone="decide"] .phead::before{border-color:var(--decide)}
41
+ .phase[data-tone="p0"] .phead::before{border-color:var(--p0)}
42
+ .phase[data-tone="p1"] .phead::before{border-color:var(--p1)}
43
+ .phase[data-tone="p2"] .phead::before{border-color:var(--p2)}
44
+ .phase[data-tone="inbox"] .phead::before{border-color:var(--inbox)}
45
+ .phead h2{margin:0;font-size:15px}
46
+ .phead .hint{color:var(--muted);font-size:12px}
47
+ .cards{display:flex;flex-direction:column;gap:12px}
48
+ .card{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--muted);
49
+ border-radius:12px;padding:12px 14px;box-shadow:var(--shadow);position:relative}
50
+ .card[data-tone="decide"]{border-left-color:var(--decide)}
51
+ .card[data-tone="p0"]{border-left-color:var(--p0)}
52
+ .card[data-tone="p1"]{border-left-color:var(--p1)}
53
+ .card[data-tone="p2"]{border-left-color:var(--p2)}
54
+ .card[data-tone="defer"]{border-left-color:var(--defer);opacity:.72}
55
+ .card[data-tone="graph"]{border-left-color:var(--accent)}
56
+ .phase[data-tone="graph"] .phead::before{border-color:var(--accent)}
57
+ .card[data-added="1"]{border-left-color:var(--inbox);background:var(--card2)}
58
+ .card .row1{display:flex;flex-wrap:wrap;gap:8px;align-items:baseline}
59
+ .lvl{font-weight:700;font-size:12px;color:var(--accent);letter-spacing:.4px}
60
+ .title{font-weight:600;font-size:14px}
61
+ .tag{font-size:11px;border:1px solid var(--line);border-radius:999px;padding:1px 8px;color:var(--muted)}
62
+ .tag.st{background:color-mix(in srgb,var(--p0) 10%,transparent);border-color:transparent;color:var(--p0)}
63
+ .tag.dep{background:color-mix(in srgb,var(--p2) 12%,transparent);border-color:transparent;color:var(--p2)}
64
+ .kill{position:absolute;right:8px;top:8px;border:0;background:transparent;color:var(--muted);
65
+ cursor:pointer;font-size:14px;line-height:1}
66
+ .kill:hover{color:var(--accent)}
67
+ ul.pts{margin:8px 0 0;padding-left:18px}
68
+ ul.pts li{margin:2px 0}
69
+ .crit{margin-top:8px;padding:8px 10px;border-radius:8px;background:var(--card2);border:1px dashed var(--line)}
70
+ .crit b{font-size:12px;color:var(--muted);font-weight:600}
71
+ .refs{margin-top:8px;font-size:12px;color:var(--muted)}
72
+ .refs code{background:var(--card2);border:1px solid var(--line);border-radius:5px;padding:0 4px}
73
+ .slot{border:1px dashed var(--line);border-radius:12px;padding:12px 14px;color:var(--muted);
74
+ background:transparent;display:flex;justify-content:space-between;align-items:center;gap:10px}
75
+ .slot span{font-size:12.5px}
76
+ .addbtn{border:1px dashed var(--line);background:transparent;color:var(--muted);border-radius:10px;
77
+ padding:8px;font-size:12.5px;cursor:pointer}
78
+ .addbtn:hover{border-color:var(--inbox);color:var(--inbox)}
79
+ .note{border:1px solid var(--line);background:var(--card);border-radius:12px;padding:12px 14px;margin-top:14px;font-size:12.5px;color:var(--muted)}
80
+ .note b{color:var(--ink)}
81
+ textarea{width:100%;height:130px;margin-top:8px;border:1px solid var(--line);border-radius:8px;
82
+ background:var(--card2);color:var(--ink);padding:8px;font:12px/1.5 ui-monospace,Consolas,monospace;display:none}
83
+ table{margin-top:10px;border-collapse:collapse;font-size:12.5px;width:100%}
84
+ th,td{border-bottom:1px solid var(--line);text-align:left;padding:5px 8px;vertical-align:top}
85
+ th{color:var(--muted);font-weight:600}
86
+ @media print{ header{position:static} .kill,.addbtn,.slot .btn{display:none} }
87
+ </style>
88
+ </head>
89
+ <body>
90
+ <header>
91
+ <h1>dsh-auto-memory · <span>待办排期图</span></h1>
92
+ <div class="sub" id="sub">自上而下 = 时间顺序 · 依赖用「依赖」标签标注 · 虚线框是留给新待办的空位</div>
93
+ <div class="bar">
94
+ <button class="chip" data-filter="all" data-on="1">全部</button>
95
+ <button class="chip" data-filter="decide">等你拍板</button>
96
+ <button class="chip" data-filter="p0">P0(v2 起点)</button>
97
+ <button class="chip" data-filter="p1">v2 后续阶段</button>
98
+ <button class="chip" data-filter="graph">白板线 graph</button>
99
+ <button class="chip" data-filter="p2">P2</button>
100
+ <button class="chip" data-filter="defer">推后</button>
101
+ <button class="chip" data-filter="inbox">待入池</button>
102
+ <button class="chip" data-filter="main">只看 3.0 主轨</button>
103
+ <button class="chip" data-filter="core">主轨 + 白板线</button>
104
+ <span style="flex:1"></span>
105
+ <button class="btn" id="exportBtn">导出 JSON</button>
106
+ <button class="btn" id="resetBtn">清空我加的</button>
107
+ </div>
108
+ <div class="legend">
109
+ <span><i class="dot" style="background:var(--decide)"></i>待拍板</span>
110
+ <span><i class="dot" style="background:var(--p0)"></i>P0(先做,工程落地)</span>
111
+ <span><i class="dot" style="background:var(--p1)"></i>P1(紧接/并行)</span>
112
+ <span><i class="dot" style="background:var(--p2)"></i>P2(待拍板)</span>
113
+ <span><i class="dot" style="background:var(--defer)"></i>明确推后</span>
114
+ <span><i class="dot" style="background:var(--inbox)"></i>待入池(你加的)</span>
115
+ </div>
116
+ <div class="note" style="margin:12px 22px 0;border-left:4px solid var(--accent)">
117
+ <b>3.0 主轨(快刀斩乱麻 · 2026-09-14 定)</b>:本轮<b>只做底层</b>——① 会话检索解锁 ② 三层补全 + 验收门 ③ 分级精确检索 ④ 记忆纠错与索引稳定(块级缓存 / supersede / 防抖)⑤ 验收判据换代 ⑥ 三层量化实验 ⑦ 语义框架审计。
118
+ <b>其余一律封存到 3.1</b>:接续开关、模型选择、日历、手机端指引、procedural 重构、白板 combine、界面 / 文档 / 分发。用户没反馈大问题 → 线上不动,攒成 3.0 一次发。
119
+ </div>
120
+
121
+ <div class="note" style="margin:12px 22px 0;border-left:4px solid var(--p0)">
122
+ <b>⚡ 2026-09-14 深夜更新:施工蓝本已定版(总纲 v2)</b><br>
123
+ 外部评审走完三轮(GPT-6 Astra),产出:<b>《合并总纲 3.0》v2</b> + <b>矛盾扫描</b> + <b>第三轮复核整合</b>。
124
+ 本页已按 v2 重写:<b>开工顺序、每阶段六项、15 个拍板点、调研与 combine 的怎么做,全部在图里</b>。
125
+ <br><br>
126
+ <b>开工顺序(v2 已改,替代旧的"只做底层"粗排):</b><br>
127
+ <code>P0 与白板最小适配边界 → P6A → P1 与 P6B → P2 → P3 → P4 → P5</code>
128
+ <br><br>
129
+ <b>与 v1 的三处关键差别(务必先读):</b><br>
130
+ ① <b>Phase 6 拆成 6A / 6B</b>:6A(注入措辞 + 节奏)紧随 P0;<b>6B(规则分类持久化)必须接在 P1 上</b>——它不能绕过状态提交。<br>
131
+ ② <b>P0 必须和白板最小适配边界同时做</b>:没有适配器,写入门就是"接口接上了但保护失效"。<br>
132
+ ③ <b>白板线的 15 个拍板点不再"等做完底层"</b>:它们与 P0/P1 是同一批决策(B1=写入门、B5=miv 语义、B4=用户区、A8=锚点),<b>决策一起定、实装分两条线</b>。
133
+ <br><br>
134
+ <b>本次会话新发现的三件事(两份方案都没覆盖):</b><br>
135
+ · <b>最痛的病在"注入表达"不在"检索算法"</b>——注入开场白写着「只是背景事实与规则参考」(<code>lib/index.js:463</code>),把<u>规矩</u>降格成<u>建议</u>;且 <code>snapshotMinGapRounds=5</code> 让<u>规矩在第 2–5 轮不在场</u>。→ 新增 <b>Phase 6</b>。<br>
136
+ · <b>已有上千真实用户</b>——npm 近一年下载 <b>10,900</b>、近一周 <b>2,935</b>、66 个版本。→ 兼容档必须真做;「新旧并存可回退」从稳妥变必需。<br>
137
+ · <b>精排实测比方案假设慢 20–50 倍</b>——bge <b>P95 37.4 秒</b> / qwen <b>8.8 秒</b>(方案写的是 ≤750ms)。→ 改为多级档位 + 1 分钟异步窗口。
138
+ </div>
139
+ </header>
140
+
141
+ <main>
142
+ <div id="mount"></div>
143
+
144
+ <div class="note">
145
+ <b>怎么用:</b>① 每个「待入池」空位右边有「+ 加一条」,点了输入标题就进图(存在你浏览器本地,不会上传);
146
+ ② 每条卡片右上角 ✕ 可以隐藏(也可恢复,见「清空我加的」);
147
+ ③ 加完点「导出 JSON」,把内容贴给我,我就把群反馈/新问题正式并进排期;
148
+ ④ 卡片里写「<b>群反馈第 N 条</b>」的,就是你 2026-09-14 从群里喂进来的那 9 项,可直接对照群消息;
149
+ ⑤ 打印或另存 PDF 都行。
150
+ <textarea id="io" readonly></textarea>
151
+ </div>
152
+ </main>
153
+
154
+ <script>
155
+ (function(){
156
+ "use strict";
157
+ var KEY = "dam-todo-graph-v1";
158
+ var DATA = {
159
+ updated: "2026-09-14 深夜(总纲 v2 已并入 · 三轮外部评审走完)",
160
+ phases: [
161
+ { id:"decide", tone:"decide", title:"阶段 0 · 等你拍板", hint:"白板 15 个拍板点已上调:与 P0/P1 同批定(B1=写入门、B5=miv、B4=用户区、A8=锚点)" },
162
+ { id:"p0", tone:"p0", title:"阶段 1 · P0 与白板最小适配边界(v2 起点)", hint:"没有适配器,写入门就是「接口接上了但保护失效」" },
163
+ { id:"p1", tone:"p1", title:"阶段 2 · P6A → P1 与 P6B → P2 → P3 → P4 → P5", hint:"v2 顺序:6A 紧随 P0;6B 必须接在 P1 上(不能绕过状态提交)" },
164
+ { id:"graph", tone:"graph", title:"白板线(graph)· 独立立项 · 独立回归窗口", hint:"调研 / combine / 15 拍板点;工具数 14→16,三处测试硬锁须同步" },
165
+ { id:"p2", tone:"p2", title:"阶段 3 · 封存(3.1 及以后)", hint:"本轮不碰——用户小需求都在这里" },
166
+ { id:"defer", tone:"defer", title:"阶段 4 · 封存(不碰)", hint:"界面 / 文档 / 分发 / 冷启动余项" },
167
+ { id:"inbox", tone:"inbox", title:"阶段 5 · 待入池", hint:"留空位给你要喂进来的群反馈与新问题" }
168
+ ],
169
+ items: [
170
+ { id:"V2-0", phase:"p0", lvl:"🗺️ 总纲 v2", title:"开工顺序与三处关键差别(先读这张)", who:"评审定版 · 2026-09-14", status:"已定版(可开工)", est:"—",
171
+ points:["<b>开工顺序</b>:<code>P0 与白板最小适配边界 → P6A → P1 与 P6B → P2 → P3 → P4 → P5</code>(完整白板线独立推进,在「共同接口」与「最终集成回归」两处汇合)",
172
+ "<b>差别① Phase 6 拆成 6A / 6B</b>:6A(注入措辞 + 节奏)紧随 P0;<b>6B(规则分类持久化、修改撤回、跨窗口失效)必须接在 P1 上</b>——它不能绕过状态提交",
173
+ "<b>差别② P0 必须和白板最小适配边界同时做</b>:写入门要保护卡片集合与用户区,而格式解析在 <code>wb-contract-pre.js</code>;<b>没有适配器就是「接口接上了但保护失效」</b>",
174
+ "<b>差别③ 白板 15 个拍板点不再「等做完底层」</b>:与 P0/P1 是同一批决策(B1=写入门、B5=miv 语义、B4=用户区、A8=锚点)→ <b>决策一起定、实装分两条线</b>",
175
+ "<b>硬门</b>:Phase 0 未通过,不接入任何新算法(GPT 原方案的硬门,保留)",
176
+ "<b>每阶段交付纪律(六条)</b>:① 能失败断言(跑什么/看到什么算过/看到什么算失败)② 新旧并存 + 开关回退 ③ 每阶段必须有回滚动作(没有回滚不许开工)④ 改动点写到 <code>文件:函数名</code> ⑤ 新增守卫必须演示变红后再还原 ⑥ 上游同步冻结(不主动开 PR)"],
177
+ crit:["你派活时:每个阶段只认「能红断言 + 回滚动作」两样东西,缺一样不验收",
178
+ "P0 开工前确认:白板最小适配边界是否已排进同一批(否则写入门会白做)"],
179
+ refs:["MASTER-PLAN-3.0.md §0.5","ROUND3-REVIEW-INTEGRATION-20260914.md","MERGE-CONFLICT-SCAN-20260914.md"] },
180
+
181
+ { id:"V2-P0", phase:"p0", lvl:"P0", title:"注入边界(状态 / 版本 / 预算三关)+ 写入门 + 白板最小适配边界", who:"执行方", status:"✅ 已完成(2026-09-15 过夜施工 · 全量回归 84/0/0 · 341 条新断言)", est:"约 2 天",
182
+ points:["<b>三关之一·状态</b>:非 <code>current</code> 条目不得进注入(<code>superseded</code> / <code>retracted</code>)—— <b>本项已实测 4/4 报红</b>(脚本 <code>tools/_redproof/red-proof-phase0-t01.mjs</code>),是真危害、先修它",
183
+ "<b>三关之二·版本</b>:命中投影必须带 <code>miv/contextVersion/requestKey</code>,不得仅凭时间复用(现 <code>lib/index.js:3894</code> 只查时间)",
184
+ "<b>三关之三·预算</b>:现行两处缺陷 —— <code>tier-layer-inject-pre.js:327–335</code> 只裁下探段、裁剪后又追加降级行;<code>index.js:3986</code> 扣账成本被 35% 封顶而目录按全文注入 ⇒ <code>injectBudgetChars</code> 目前<b>不是硬上限</b>",
185
+ "<b>写入门 ≠ 注入边界</b>(v2 修正):写入门阻止<b>破坏源数据</b>,状态过滤阻止<b>不该用的数据进上下文</b> —— 同阶段交付,但是<b>两个独立检查</b>",
186
+ "<b>白板最小适配边界</b>:<code>memory-mutation-pre.js:validateMutationBoundaryPre</code> 只接收规范化的 <code>beforeIds/afterIds/protectedRegions/changes</code>,<b>不自行解释图格式</b>;格式由 <code>wb-contract-pre.js:parseWhiteboardPre</code> 提供 —— <b>格式只维护一份</b>",
187
+ "<b>判据不能张冠李戴</b>(v2 修正):<code>H1–H4 / S1–S4</code> 是<b>交接账本</b>的判据;白板 PLAN 用 <code>P-H1/P-H2/P-S1</code> + 卡片完整性 + 用户区保护",
188
+ "<b>fail-open 不得绕过保护</b>:<code>criteriaGate=false</code> 与骨架 fail-soft <b>只允许退掉可选质量门</b>,不得跳过丢卡、用户区、版本、状态保护"],
189
+ crit:["T0-1:混合 current/superseded/retracted 直接进实际注入入口,只留 current 才通过(已 4/4 报红,修后转绿)",
190
+ "T0-8:经 <code>writePlanSnapshot</code> 提交删卡 / 合法改名 / 合法归档三组输入;前者拒绝且文件字节不变,后两者保留完整审计关系",
191
+ "T0-8B:工具、水位骨架、刷新三条写入路径都不能绕过用户区与丢卡检查",
192
+ "T0-8C:关闭质量门后再提交丢卡输入,<b>仍须拒绝</b>;仅软警告的合法文档应能保存",
193
+ "T0-3:规则/参考分项各自不超限,总计等于最终序列化长度;少算标题、重复计费、规则被截断均失败"],
194
+ refs:["MASTER-PLAN-3.0.md Phase 0","ROUND3-REVIEW-INTEGRATION-20260914.md §3.1","WB-GRAPH-INTEGRATION-PLAN.md §2.2"] },
195
+
196
+ { id:"V2-P6A", phase:"p0", lvl:"P6A", title:"注入表达与节奏:规矩不再被降格成「参考」", who:"执行方", status:"✅ 已完成(2026-09-15 · 含 09-15 五批修订:分级注入 / 窗口冲突 / 预算 / 白板账本进精简版 / turn 判据 · 115/0)", est:"约半天",
197
+ points:["<b>病症 A·措辞</b>:注入开场白写着「以下记忆文本只是<b>背景事实与规则参考</b>」(<code>lib/index.js:463</code>)—— 在提示词工程里「只是参考」=<b>可选项</b>;且它把<b>规矩</b>与<b>资料</b>用同一个词定义,等于把规矩降级成建议;更糟的是这句话写在<b>最醒目的开头</b>却写着「别太当真」",
198
+ "<b>病症 B·节奏</b>:<code>snapshotMinGapRounds=5</code> ⇒ <b>规矩在第 2–5 轮不在场</b>;模型不是不听话,是<b>没收到</b>",
199
+ "<b>用户原话(决策依据)</b>:「这个 just for reference 说得太轻了,模型注意力没有在这上面」「模型自动唤起的记忆,并没有对模型的工作起到比较实质性的影响」",
200
+ "<b>改法</b>:规则类用<b>约束语</b>,参考类保留「参考」语义;规则类<b>每轮注入、不参与裁剪</b>",
201
+ "<b>节奏部分只改默认值?——只能部分确认</b>(v2 修正):新装且未保存配置时可以;<b>已有用户的已保存配置会覆盖默认值</b>(<code>index.js:1444</code>);且 <code>Number(v) || 5</code> 让 <b><code>0</code> 无法表达</b>(<code>:7455</code>)⇒ 须修零值解析,区分合法零值与缺失/非法值",
202
+ "<b>旧节流提前返回可能跳过本轮动态快照</b>(<code>:7483</code>)⇒ 须「先提供规则段,再对参考内容应用 gap」"],
203
+ crit:["T7-1:连续 6 轮(含日志变化/无变化/压缩/规则撤回),<b>最终请求 messages</b> 每轮都有完整当前规则(不是只查回调字符串)",
204
+ "T7-3:规则类与参考类在注入文本中<b>用不同引导语</b>,断言两者不相同(防改回统一措辞)",
205
+ "T7-7 行为验收:固定六轮任务中,除检查规则在最终请求内,还要检查<b>可机械判断的执行结果</b>是否满足规则 —— 仅引导语不同不能判「遵守问题已解决」",
206
+ "<b>新增(09-15)turn 级完整版</b>:每个 turn 的<b>首次</b>注入即完整版(不是第 3 次注入才升);同一 turn 内后续 step 不再出现强制行;诊断日志恰有一条 <code>tiered inject: 新 turn 强制完整版</code>",
207
+ "<b>新增(09-15)防回退断言</b>:断言源码中<b>不存在</b> <code>engine.humanTurnKeyPre</code> —— 任何人把门控改回「只认真人消息」必报红(首版 A 的实测失败点)"],
208
+ refs:["MASTER-PLAN-3.0.md Phase 6","DECISIONS-20260914-SESSION.md §8","ROUND3-REVIEW-INTEGRATION-20260914.md §3.3"],
209
+ done:["症状 A 已修:<code>DEFAULT_PROMPT_LAYERS.snapshotHead</code> 改为「提取其中的事实、决策、路径与偏好即可」——不再把规矩与资料用同一个词定义;规则类另用<b>约束语</b>引导语(<code>RULES_SECTION_GUIDE_PRE_V1</code>)",
210
+ "症状 B 已修(<b>09-15 用户裁定修订为「分级注入」</b>):节流<b>不再跳过整份快照</b>,而是「完整版每 <code>snapshotMinGapRounds</code> 轮一次 + 其余轮给<b>精简版</b>」—— 用户原话:「不是不注入,而是精简注入:第一轮注入完整的,第 2-5 轮注入精简的」<br>⇒ 规则与索引<b>每轮在场</b>;缓存不击穿(动态层在历史尾部,system 前缀字节稳定);边际开销约 +1k 字符/轮(≈500 token,1M 窗口的 0.05%)<br>回退开关:<code>snapshotTieredInject=false</code> ⇒ 完全恢复旧行为",
211
+ "零值解析已修:<code>parseGapRoundsPre</code> 区分「合法 0」与「缺失/非法」(旧 <code>Number(v) || 5</code> 让 0 无法表达)",
212
+ "预算口径已修:<code>injectBudgetChars</code> 2000 → <b>8000</b>(实测 2000 下用户级记忆只有约 9% 能进注入)",
213
+ "① <b>turn 级强制完整版</b>(09-15 追加,用户裁定):<b>每个 turn 的首次注入给完整版</b>,同 turn 后续工具 step 回到节流。<b>判据用 turn 号</b>(<code>turnBoundaryKeyPre</code>,读 <code>event.data.turn</code>)—— 首版用「抓到真人消息」判定,<b>实测失败</b>:宿主 <code>user/message</code> 投递与本插件观察器落地<b>不同步</b>,首次装配 context 时事件流里还看不到它,实测要到本 turn 第 3 次注入才升完整版(用户报告:「点发送后没立刻注入,完成一次工具调用以后才注入完整版」)。<b>代价(如实)</b>:turn 号不区分人 / cron / 接续 ⇒ 非真人轮也给一次完整版,判为可接受(宁多给一次,不漏真人轮)",
214
+ "② <b>精简版纳入白板与账本</b>(09-15 追加,用户裁定):新增 <code>slimPlanChars=400</code> / <code>slimLedgerChars=300</code>(<b>刻意小于</b>完整版的 1200/800)—— 精简版的目标不是「看到全文」而是「看到它长什么样、以及它已经旧了」。用户理由:轮次结束时理论上都要更新白板;不放进精简版等于模型在第 2–5 轮<b>看不见自己该更新什么</b>,与「规矩不在场」同族",
215
+ "③ <b>接续时强制索取白板 + 账本更新</b>(09-15 追加,用户裁定):新增 <code>renderPlanUpdateRequest()</code>,<code>state.planUpdatePending</code> 两个置位点 —— 水位越阈 / compaction(<code>reason: water|compact|overflow</code>)与 <code>markContinuedSession</code>(<code>reason: continue</code>)。置位后注入 <code>[白板与账本 — 待更新]</code> 索取块(含 <code>memory_note_pre(kind=plan)</code> 全貌重写 + <code>kind=handoff</code> 四段式账本两条可执行指令),<b>一次性取用即清位</b>;<code>handoffEnabled=false</code> 时不索取",
216
+ "④ <b>窗口冲突取大</b>(09-15 追加,用户裁定 B·彻底):会话自报 contextWindow 不再无条件覆盖 settings(实测 262144 盖掉 1000000 ⇒ 470572 被算成 180%);改为<b>声明冲突取大</b>并记 <code>winConflict</code>;<code>hardWin</code>(provider 400 观测值)仍压小分母",
217
+ "⑤ 规则分层默认值 <code>off</code> → <b><code>self</code></b>(<code>off</code> 语义是「回落旧行为」而非「渲染规则段」⇒ 作为出厂默认会让规则段从不渲染,与「规矩每轮在场」的目标相反)"] },
218
+
219
+ { id:"V2-P6B", phase:"p1", lvl:"P6B", title:"规则分类持久化 + 修改撤回 + 跨窗口失效(必须接在 P1 上)", who:"执行方", status:"待开工(依赖 P1)", est:"约 1 天", deps:["V2-P1"],
220
+ points:["<b>为什么必须接 P1</b>:规则要能<b>撤回</b>、要能<b>跨窗口失效</b>,这些都走状态提交 —— <b>不能绕过 P1</b>",
221
+ "<b>分类时机</b>:<b>不做独立 LLM 调用</b> —— <code>memory_log_pre</code> 本来就在<b>本轮内由模型直接写</code>,顺手打 <code>kind</code> 标记(rule / preference / fact / todo)=零额外成本",
222
+ "<b>真源只有一个(v2 修正)</b>:<b>既有用户级记忆中的类型化规则为唯一真源</b>;若将来生成 <code>RULES.md</code>,<b>只作单向派生视图</b>,不做双向维护。若改用独立真源,必须补<b>迁移 / 去重 / 旧模式读取 / 回滚</b>四类测试",
223
+ "<b>关键词双保险被 v2 修正</b>:原设想「含『必须』一律进规则层」<b>过度设计</b> —— 反例:<code>「文档写着必须重启」</code>、<code>「曾经要求必须 X 但已取消」</code> 也会命中 ⇒ 改为:<b>只有明确规则来源才进规则层;普通资料命中关键词只产生「待确认候选」</b>",
224
+ "<b>规则被撤回后应消失</b>:「不参与裁剪」<b>不等于</b>「永久注入」",
225
+ "<b>两层结构</b>:用户级(跨工作区恒定)+ 工作区级(换工作区即换);用户担心膨胀 ⇒ 规则要写得克制,以工作区为锚点"],
226
+ crit:["T7-4 修订:明确有效的用户规则进规则层;<b>引文、历史描述、已撤回规则即使含「必须」也不得自动升级</b>",
227
+ "T7-5:打标过程<b>不产生任何新的 LLM 调用</b>(用调用计数断言)",
228
+ "规则迁移断言:迁移、重启、关闭分层、切换工作区后,每条有效规则<b>只有一个真源和正确作用域</b>;双份相互覆盖或回滚后不可见均失败",
229
+ "T1-3 扩展:规则撤回后,检索与注入两处都消失,审计仍可定位"],
230
+ refs:["ROUND3-REVIEW-INTEGRATION-20260914.md §3.7","MASTER-PLAN-3.0.md §3.5"] },
231
+
232
+ { id:"V2-P1", phase:"p1", lvl:"P1", title:"统一状态提交与快照(miv 单源)+ 并发原子边界", who:"执行方", status:"✅ 已完成(2026-09-15 · 代码侧:lib/state-commit-pre.js 新契约 233 行 + memory-writer-pre 提交边界双闸(四写方法,applyPlan 原无任何校验)+ 并发原子验收 T1-1/T1-2/T1-7C 真并发 23 断言 + T1-5a-d/T1-6 40 断言 + capturePathsFor 修 no-paths-captured;三处设计稿勘误已留痕:I6 由 P0 的 T0-2 守住故 §2.4 撤销、setMiv 是死代码无对象可收敛、memoryMutationMode 不存在故回滚面=新增字段可选。全量 87/0/0。唯一未做:白板 Cue(session) 进图——需图结构且格式归白板线,按 KICKOFF §3.4 边界移交白板线)", est:"约 2 天", deps:["V2-P0"],
233
+ points:["<b>并发不能「不加锁」就够</b>(v2 修正):两个写者都先读 D、都通过比较、再分别写 A 和 B ⇒ <b>后写者仍会覆盖前写者</b>;「通常只有一个活跃窗口」<b>不能证明这个时序不存在</b>",
234
+ "<b>正确做法</b>:保留现有<b>短提交队列</b>(<code>memory-writer-pre.js:235 _queue</code> 按路径分键串行),所有窗口通过<b>同一工作区 owner</b> 提交;<code>expectedDigest</code> <b>必须在提交边界内检查</b>(<code>:344 replace</code> 已在队列内部检查 ✓)。<b>不引入长期编辑锁、不按会话分片</b>",
235
+ "<b>重要澄清</b>:<code>atomicReplace</code>(<code>:199</code>)<b>不是</b>「比较 digest 再替换」的 CAS —— 它的签名里没有 <code>expectedDigest</code>,只做原子写。真正的保护在队列内部",
236
+ "<b>提交接口补来源身份</b>:<code>{workspaceKey, boardId, txId, expectedDigest, expectedStateVersion, actor:{sessionId,contSeq,kind}, writes, stateChanges}</code>,其中 <b><code>boardId</code> 在工作区内稳定、不含当前会话号</b>",
237
+ "<b>共享 vs 隔离要分开</b>:共享数据(图)按<b>工作区</b>缓存;<b>激活、冷却、精排任务、已交付标记仍按会话隔离</b>",
238
+ "<b>三种状态不能混</b>:<code>done / passed / archived</code>(任务进度、判据确认、归档位置)<b>不能塞进</b> <code>current/superseded/retracted</code>(记忆有效状态)",
239
+ "<b>并发范围</b>:3.0 支持<b>多窗口经同一宿主提交</b>;<b>多宿主同目录</b>通过 U2 单独认证 —— 若要多进程直接写同一文件,必须增加跨进程原子提交或单写者路由"],
240
+ crit:["T1-4:两窗口读取同一 D 后<b>同时</b>提交替换;恰好一项成功、另一项收到<b>可见冲突</b>,成功版本未被覆盖",
241
+ "T1-7B:A、B 会话共享图节点;<b>A 的激活包和交付记录不能出现在 B</b>",
242
+ "T1-7C:旧接续窗口的<b>迟到写入不能覆盖新图</b>;拒绝信息带当前版本及冲突目标",
243
+ "T1-5:业务内容或有效状态改变时 miv 改变;仅切换会话、更新 rebuilt_at 时<b>不</b>改变"],
244
+ refs:["ROUND3-REVIEW-INTEGRATION-20260914.md §3.2","MASTER-PLAN-3.0.md Phase 1"] },
245
+
246
+ { id:"V2-P2", phase:"p1", lvl:"P2", title:"真增量(2A→2B→2C)+ 引擎隔离与切档进度条", who:"执行方", status:"待开工", est:"约 3 天", deps:["V2-P1"],
247
+ points:["<b>三小步</b>:2A L0 真增量 → 2B 原文块缓存与完整 manifest → 2C 差量传输(先证明计算增量,再承担协议变更)",
248
+ "<b>两层引用绕开 recordDigest 问题</b>:<code>aliasKey = engineIdentity + chunkId</code>;<code>vectorKey = engineIdentity + hash(exactEncoderInput)</code> ⇒ 记录变了导致未改块重新编号时,<b>只更新 alias、不重新编码相同输入</b>,且<b>不改现有 chunkId 公式</b>",
249
+ "<b>引擎身份必须够宽</b>(v2 修正):单个 <code>PROVIDER_ID_INT8</code> <b>不足以</b>标识模型内容/tokenizer/预处理 —— 须含模型与权重摘要、tokenizer 版本、精度格式、维度、池化、归一化、输入处理版本。两层缓存若只凭 <code>chunkId</code> 或裸输入哈希读取,<b>仍会串用两套向量</b>",
250
+ "<b>切档 = 强制全量重建 + 进度条</b>(用户裁定):每次实际切换创建<b>新 rebuild generation</b>,目标重建<b>不复用旧代一二级缓存</b>(含 e5→BGE→e5);完成后恢复日常增量",
251
+ "<b>进度只能有一个真实所有者</b>(正面回应用户「别和引导耦合」):复用现有向导与 <code>semantic-status</code> 接口;<code>python-setup-pre.js:status</code> 只<b>投影</b>索引进度,不自行维护第二套计数;向导须区分 <code>assetsReady</code>(资产就绪)与 <code>indexReady</code>(索引就绪)—— <b>模型下载完成 ≠ 当前引擎索引完成</b>",
252
+ "<b>GPU 依赖别混淆</b>:<code>ensureDeps({gpu:true})</code> 装的是 <code>onnxruntime-gpu</code>,<b>不等于 GPU torch 已可供精排使用</b>;向导须分别探测「嵌入/精排CPU/精排CUDA」,不能用一个 <code>depsOk</code> 冒充全部就绪",
253
+ "<b>成本措辞收紧</b>:不说「成本为零」,改为「<b>身份比较开销小;全量重建成本由本机承担</b>」"],
254
+ crit:["T2-9a:e5→BGE→e5,<b>每次实际切换都完整处理冻结目标快照</b>;旧目标缓存已存在也不能跳过重建",
255
+ "T2-9b:A 切换未完成又发起 B;<b>A 迟到不能发布 B 的 ready</b>;同一 switchId 重试不重复编码",
256
+ "T2-9c:编码中暂停/校验失败/发布失败/重启恢复;<b>进度来自实际完成量</b>,manifest 发布前不得显示整体完成,两个状态接口一致",
257
+ "T2-1:记录真实 embedder 输入 —— 不变更新为 0、单新增为新增输入数、状态变化为 0(只看返回计数不算通过)",
258
+ "T2-2:固定三块记录只改末块;前两块即使新 chunkId,alias 仍指向旧向量对象,实际只编码一个变化输入"],
259
+ refs:["ROUND3-REVIEW-INTEGRATION-20260914.md §3.5","MASTER-PLAN-3.0.md Phase 2"] },
260
+
261
+ { id:"V2-P3", phase:"p1", lvl:"P3", title:"共同检索、融合与决策(R1 双显示 / R2 维持)", who:"执行方", status:"待开工", est:"约 2 天", deps:["V2-P2"],
262
+ points:["<b>R1 双显示</b>:<code>RankedHit</code> 已同时带 <code>denseScore</code>(绝对,决策用)与 <code>fusionScore/fusionRank</code>(相对,排序用)—— UI <b>两个都显示</b>,相似度在前、融合分在后。因为<b>没拿融合分冒充相似度</b>,与 S5.4 的冲突不存在",
263
+ "<b>但 R1 不自动解决「排序顺序」</b>(v2 修正):推荐<b>机器注入依照 <code>finalRank</code></b>,同时标注相似度与融合分,UI 默认跟随同序;<b>S5.4/C7 的「分值降序」口径仍须在执行决定中明确</b>,不能通过双显示声称旧断言自然成立",
264
+ "<b>R2 维持现状</b>:融合分<b>只用于排序</b>,决策用绝对分 + 校准阈值(代码已如此,<code>recall-fusion-pre.js:10-12</code>)。<b>新融合间隔只进 shadow</b>,不暗接生产",
265
+ "<b>两档 margin 尺度不同</b>(实测):bge-m3 校准的 0.03 用在 e5 上会<b>拦掉全部候选</b>(<code>lib/index.js:7254</code>)",
266
+ "<b>词法臂必须独立扫描</b>:不能只给稠密 top-K 打词法分,否则词法独有候选进不了融合",
267
+ "<b>UI 上的分数是给人调试用的</b>;模型看到的是注入文本 —— 两条展示链路不该混(用户原话:一般不会有人点开上下文注入去看,那是给机器看的)"],
268
+ crit:["T3-1:每臂排名不变、只改分数间距 ⇒ 融合 ID 顺序不变",
269
+ "T3-2:输入融合序与稠密序相反的 fixture;<b>按本次选定 ordering 验证顺序</b>(用异步精排时不再断言 RRF 顺序),同时检验标签",
270
+ "T3-3:词法独有候选能进入融合;关闭稠密后仍返回它且标注降级",
271
+ "T3-6:同一 observation 只能形成一个主路径 activation;<b>后台完成不能创建第二个主激活</b>"],
272
+ refs:["ROUND3-REVIEW-INTEGRATION-20260914.md §3.4","recall-fusion-pre.js"] },
273
+
274
+ { id:"V2-P4", phase:"p1", lvl:"P4", title:"精排改为多级 + 有界异步窗口(方案假设被实测推翻)", who:"执行方 · 最优档", status:"待开工", est:"约 2 天", deps:["V2-P3"],
275
+ points:["<b>实测推翻方案假设</b>:方案写「额外等待 ≤750 毫秒」,实测 —— bge-reranker-v2-m3 <b>P95 37.4 秒</b>(50 对/题)、qwen3-reranker-0.6b <b>P95 8.8 秒</b>(10 题×10 对)",
276
+ "<b>⚠️ 两行不可直接比</b>(v2 修正):候选规模不同 —— qwen 是<b>小样本探针</b>,不能与 bge 直接比较速度或全量质量",
277
+ "<b>收益是真的</b>:recall@1 <b>0.739 → 0.898</b>(bge)/ 0.800(qwen)",
278
+ "<b>多级档位</b>(用户裁定):<b>关</b> / <b>快档</b>(int8 量化 + CPU)/ <b>发烧档</b>(完整模型 + RTX 4070 Ti SUPER 16GB)",
279
+ "<b>一分钟 = 有界后台窗口</b>(v2 修正,不能解释成「下一轮无条件用上一轮结果」):从<b>入队时</b>起算含排队与计算、<b>到期不续命</b>;本轮立即用现有排序;后台完成<b>只进有界结果缓存</b>,不改本轮 envelope、不再次 emit;下一请求<b>重新生成 requestKey</b>,仅 <code>inputKey</code> 完全匹配才复用,且<b>重跑当轮状态/fv2/冷却/预算检查</b>;会话关闭、接续换会话、查询或 miv 改变即不复用;<b>没有下一轮就过期,不主动制造模型请求</b>",
280
+ "<b>运行隔离</b>:精排用<b>独立、懒加载的 worker 角色</b>,复用既有 sidecar 传输 —— <b>不能把几十秒的同步计算塞进同时承担稠密查询与索引服务的 worker</b>;一期全机最多一个精排任务,忙时继续粗排",
281
+ "<b>U5 缺口修正</b>:cross-encoder 模型<b>已下载</b>(bge 2.1GB / qwen 1.1GB,各带 tokenizer)⇒ 「模型未下载」阻塞<b>解除</b>;真实缺口是 <b>GPU 版 torch</b>(当前 <code>torch 2.13.0+cpu</code>)与<b>快档量化产物</b>",
282
+ "<b>资源上限不能沿用</b>:实测峰值 RSS <b>3.84GB(bge)/ 4.95GB(qwen)</b>,旧「2048MiB」建议值作废",
283
+ "<b>T5-5 不要重算</b>(v2 修正):那是 <b>H1 生成式改写</b>的费用门,<b>不因 H2 变慢而重算</b>;本地精排另设资源门 T5-5R"],
284
+ crit:["T5-3R:精排 Promise 未完成时前台已返回;<b>59 秒内完成且下一请求输入完全一致时可复用</b>;改变任一身份字段或到 60 秒后不可复用",
285
+ "T5-4R:缓存完成后撤回候选,<b>下一轮不得输出它</b>;不能复用旧 fv2 放行结论",
286
+ "T5-5R:精排忽略取消时,在登记的清理宽限内<b>终止其进程并释放占用</b>;稠密查询仍可工作",
287
+ "T5-6R:全部后台结果过期或<b>零次实际复用</b>时,<b>不得把离线收益写成异步注入收益</b>"],
288
+ refs:["artifacts/m7-rerank-pre/results.json","ROUND3-REVIEW-INTEGRATION-20260914.md §3.4"] },
289
+
290
+ { id:"V2-P5", phase:"p1", lvl:"P5", title:"分档运行验收与发布(含上千真实用户的兼容档)", who:"执行方", status:"待开工", est:"约 2 天", deps:["V2-P4"],
291
+ points:["<b>兼容档必须实测</b>:登记设备与负载,测冷启动 / P95 / RSS / 峰值 / 磁盘 / 索引积压年龄 —— <b>U1 未完成时不能填写「兼容已验收」</b>",
292
+ "<b>为什么现在变严了</b>:实测 npm 近一年下载 <b>10,900</b>、近一周 <b>2,935</b>、66 个版本 ⇒ 已不是自用工具",
293
+ "<b>错误提示面向用户</b>(不是面向作者);<b>切档进度条属必需品</b>(并进引导体系)",
294
+ "<b>T6-2/T6-3 分开测</b>:前台返回时间 vs 后台完成时间;CPU/GPU、前台/后台分别登记资源门",
295
+ "<b>T6-6 扩展</b>:新旧模式分别提交丢卡、撤回、旧版本及用户区改动输入,<b>共同保护均须生效</b>;关闭增强后旧任务完成<b>不能重新启用或写入缓存</b>",
296
+ "<b>发布材料逐项记录通过 / 失败 / 未执行</b> —— 不把「没测试环境」写成「已验收」",
297
+ "<b>T6-7</b>:在隔离目录从<b>发行产物</b>运行入口测试,禁止依赖开发树相对导入路径;增加工具能力矩阵"],
298
+ crit:["T6-1:兼容配置拦截所有生成式模型调用,<b>调用数必须为 0</b>,同时目录/词法/展开通过",
299
+ "T6-5:最终动态文本<b>全量计费</b>、Tier-0 常驻、尾注不重复、交付幂等;仅测中间字符串不算通过",
300
+ "T6-6:按各阶段开关退回基础路径后,撤回项仍不出现、预算仍守住;<b>回滚使旧状态复活即失败</b>"],
301
+ refs:["MASTER-PLAN-3.0.md Phase 5","DECISIONS-20260914-SESSION.md §1.3"] },
302
+
303
+ { id:"G-0", phase:"graph", lvl:"📐 白板线总纲", title:"为什么独立立项 + 你现在的起点在哪", who:"评审裁定 (乙)", status:"已定方向 · 待拍板 15 点", est:"两条线并行",
304
+ points:["<b>用户裁定 (乙)</b>:「两者合并:把 GPT 的『写入门 + 引擎隔离 + 状态过滤』这套通用原则,注入到 WB-GRAPH 方案的 P1/P2 里」",
305
+ "<b>用户的关键表述</b>:「我认为这个 dsh graph <b>正是我想要的 Karpathy 模块</b>」;「只要是一个工作区的接续的不同对话,都要是同一张图」;「白板后面要 combine 进 dsh graph 这个开源项目」",
306
+ "<b>为什么独立立项</b>:① 它有自己的 386 行方案与 15 个拍板点;② 它会<b>改工具数 14→16</b>,触发<b>三处测试硬锁</b>;③ 它是<b>用户最在意的接续体验</b>。与 3.0 主体共用回归基线会互相污染",
307
+ "<b>但决策必须一起定</b>:B1=写入门(=P0)、B5=miv 语义(=P1)、B4=用户区(=P0 写入门要保护什么)、A8=锚点(白板进语料的前提)⇒ <b>决策同批、实装分线</b>",
308
+ "<b>⚠️ 现状实测(重要)</b>:<code>WB-FORMAT-CONVENTION.md §5</code> <b>早已定义人机分区</b>(<code>&lt;!-- model --&gt;</code> / 用户区,永不互相覆盖),<b>但实际 PLAN.md 一个锚点、一个分区标记都没有</b> —— <b>规范已批准、代码从未实现</b>。这正是「白板被整篇覆盖成骨架」事故的根因",
309
+ "<b>已落地的部分</b>:<code>WB-FORMAT-CONVENTION.md</code> v1(契约层,零代码)已完成 —— 三种页面时态 · 锚点契约 · 索引派生格式 · 写入门 · 人机分区 · lint 五类 · 答案归档回流",
310
+ "<b>顺序结论(2026-09-14 定)</b>:<b>契约层(格式/锚点/索引派生)必须在 RAG 底层之前</b>(它决定语料形状,先做 RAG 就得对语料重做一遍);<b>界面层(渲染/看板交互)排在 RAG 之后</b>(它只是视图)"],
311
+ crit:["你能用一句话回答:这张图上的哪些决策必须和 3.0 一起定(答案:B1/B5/B4/A8)",
312
+ "白板线开工前,15 个拍板点全部有结论(见下一张卡)"],
313
+ refs:["WB-GRAPH-INTEGRATION-PLAN.md","WB-GRAPH-DECISIONS-20260914.md","WB-FORMAT-CONVENTION.md"] },
314
+
315
+ { id:"G-1", phase:"graph", lvl:"🔬 调研", title:"怎么调研 dsh-graph?(结论:已经调研完了)", who:"执行方 · 已完成", status:"✅ 已产出三份文档", est:"已完成",
316
+ points:["<b>已经有现成产出,不用重做</b>:① <code>WB-GRAPH-RESEARCH-BRIEF.md</code>(任务书)② <code>WB-GRAPH-RESEARCH-LOCAL.md</code>(本地审计)③ <code>WB-GRAPH-RESEARCH-EXTERNAL.md</code>(外部调研)④ <code>WB-GRAPH-INTEGRATION-PLAN.md</code>(综合方案 386 行)",
317
+ "<b>调研方法(可复用)</b>:本地审计(现有白板/账本/接续链路怎么走)+ 外部调研(读 dsh-graph 与 MRAgent 的源码与文档)→ 由综合子代理产出整合方案",
318
+ "<b>外部调研的两个来源及边界</b>:<code>dsh-graph</code>(MIT,许可文本在 <code>dsh-graph-host/</code> 子包 —— <b>只借范式、不搬代码</b>);<code>MRAgent</code>(<b>仓库无 LICENSE ⇒ 零代码复制,只借鉴行为范式</b>,这是硬约束不是偏好)",
319
+ "<b>借鉴了哪三个范式</b>:① 判据是<b>写操作的前置门槛</b>而非事后检查;登记与确认分离(写入 ≠ 合格确认);② <b>「真相源 + 可重建投影」</b> —— Markdown 是人读真相源,sidecar/事件流是机读派生件,允许损坏、可从真相源重建;③ 遍历动作集 + 剪枝纪律(去重、条目帽、轮数帽)",
320
+ "<b>明确不借鉴的</b>:dsh-graph 的<b>七阶段状态机不引入</b>(它是为多目标管理设计的;白板是单对话进度快照)—— 只取「只在关键门口设防」的思想,<b>白板只在「写入」一个门上设防</b>",
321
+ "<b>两个被证伪的猜想(避免你再问一遍)</b>:① 猜「判据 schema 是 <code>criterion_type + evidence_required + confidence_level</code>」→ <b>证伪</b>:dsh-graph 的判据只是 <code>## 质量判据</code> 小节里的编号文本行,无字段化 schema;② 猜「Tag 是节点」→ <b>证伪</b>:MRAgent 里 Tag 是<b>边属性</b>(三元组 (cue, tag, content))"],
322
+ crit:["你需要新调研时,先读这三份,避免重复劳动",
323
+ "若要把 dsh-graph 真代码搬进来:先确认许可边界(MRAgent 不可搬,dsh-graph 的 MIT 文本在子包)"],
324
+ refs:["WB-GRAPH-RESEARCH-BRIEF.md","WB-GRAPH-RESEARCH-LOCAL.md","WB-GRAPH-RESEARCH-EXTERNAL.md"] },
325
+
326
+ { id:"G-2", phase:"graph", lvl:"🔧 combine", title:"怎么 combine?四个阶段 + 现有接点", who:"执行方", status:"待拍板后开工", est:"P0 零代码 / P1 ≈190 行 / P2 ≈240 行 / P3 ≈165 行",
327
+ points:["<b>总思路(一句话)</b>:白板接续从「自由文本 + 平铺注入」升级为 —— <b>写入端用可计算判据把关</b>(P1,咽喉在 <code>writeHandoffLedger</code> / <code>writePlanSnapshot</code>)+ <b>存储端用 sidecar JSON 承载结构而 Markdown 仍是人读真相源</b>(P2)+ <b>检索端新增两个遍历工具</b>让新窗口主动重建上下文而非被动收平铺(P3)",
328
+ "<b>P0|判据文档约定</b>(零代码,<b>已完成</b>):<code>WB-FORMAT-CONVENTION.md</code> v1 —— 锚点契约、索引派生、写入门、人机分区、lint 五类、答案归档 + 6 条能失败验收",
329
+ "<b>P1|判据校验中间件</b>(≈190 行):插在<b>两个咽喉</b> <code>writeHandoffLedger</code>(<code>lib/index.js:1667</code>)与 <code>writePlanSnapshot</code>(<code>:1620</code>)入口 —— 这两个函数覆盖<b>全部三条生成通路</b>(工具 <code>:7083</code> / 水位骨架 <code>:2019</code> 直调 / 刷新仪式)。<b>工具数不变</b>",
330
+ "<b>P2|sidecar 结构化存储</b>(≈240 行,需拍板):<code>&lt;projectDir&gt;/handoff/</code> 下新增 <code>index.json</code>(条目表 + tag/cue 倒排 + 判据报告摘要)与 <code>events.jsonl</code>(append-only:written / criteria.passed / criteria.warned / aged)。<b>可重建性</b>:index.json 完全由 PLAN.md + 账本白名单文件<b>确定性重建</b>,sidecar 丢失不丢信息,只损失增量性能",
331
+ "<b>P3|两个遍历工具 + 看板 UI</b>(≈165 行):<code>memory_expand_pre</code>(正向:给定 tag 展开 Content,默认 limit 10、硬帽 20)与 <code>memory_trace_pre</code>(反向:给定 id 回溯 cue/tag/邻居与归档版本)。<b>⚠️ 工具数 14→16</b>",
332
+ "<b>三处测试硬锁必须同步</b>:<code>tests/smoke/smoke-test.mjs:67</code>、<code>smoke-test-m3b3-pre.mjs:43</code>、<code>smoke-test-context-observer.mjs:107</code> —— 都断言工具数 <code>!== 14</code> 抛错",
333
+ "<b>v2 修正的测法</b>:<b>同一套测试中明确两种能力集合</b>(白板工具关闭 14 / 启用 16);验证<b>精确名称集合、无重复、schema 及可调用性</b>,<b>数量作为派生检查</b>;测试预期须来自<b>已批准的公共工具清单</b>,<b>不能从被测注册结果自动生成</b>(否则自证正确)",
334
+ "<b>图形数据模型(只借范式)</b>:<code>Cue 节点 + Tag 边属性 + Content 节点</code> 三元;映射表已定(账本篇→Content(ledger)、白板→Content(board)、段→Tag type、条目中的路径→Cue(key)…);<b>不建跨目标依赖边</b>,唯一的非三元边是 <code>prev_version</code>(只连归档链)"],
335
+ crit:["P1 完成后:少一张卡且无 archive/rename 记录 ⇒ <b>拒写且文件字节不变</b>",
336
+ "P2 完成后:删掉 index.json,能从 PLAN.md + 账本完整重建",
337
+ "P3 完成后:<code>memory_expand_pre(tag=\"type:dead-end\")</code> 能返回所有失败方案条目,且带 source 与 criteria 状态",
338
+ "工具矩阵:白板关 ⇒ 恰好 14 个;白板开 ⇒ 基础集合不变、只增两个、无重名"],
339
+ refs:["WB-GRAPH-INTEGRATION-PLAN.md §2/§3/§4","WB-GRAPH-DECISIONS-20260914.md"] },
340
+
341
+ { id:"G-3", phase:"graph", lvl:"⚖️ 15 拍板点", title:"A1–A8(方案层)+ B1–B7(看板化)逐条待拍", who:"你", status:"待拍板(与 P0/P1 同批)", est:"半小时",
342
+ points:["<b>A1 P2/P3 是否立项</b>|选项:立项 / 等冻结解除 / 不做|方案建议:<b>P0-P1 立即做;P2-P3 等后端冻结解除后按方案执行</b>|影响:P2/P3 都改 <code>lib/index.js</code> 本体,冻结期内禁改引擎",
343
+ "<b>A2 sidecar 位置</b>|选项:<code>memoryRoot/&lt;ws&gt;/handoff/</code> vs 工作区 <code>.dsh-memory/handoff/</code>|建议:<b>前者</b>(与现有 handoffDir 同目录;GUI 白名单只放行 .json,备份/迁移自动覆盖)",
344
+ "<b>A3 静态纪律是否随下一版一次性更新</b>|建议:<b>更新</b>(把判据纪律写进固定 section)|代价:全量会话一次缓存重建",
345
+ "<b>A4 工具命名</b>|选项:<code>memory_expand_pre</code>/<code>memory_trace_pre</code>(对齐现有 <code>*_pre</code> 惯例)vs 任务书直译 <code>expand_tag</code>/<code>trace_back</code>|建议:<b>前者</b>|命名一旦发布就难改(对外契约)",
346
+ "<b>A5 是否进 2.6.0</b>|建议:<b>P0-P1 进 2.6.0;P2-P3 进 2.7.x</b>(工具数变化 + 存储格式新增,宜独立回归窗口)",
347
+ "<b>A6 P1 水位骨架硬判据失败策略</b>|选项:照写 + 警示行 / 跳过写入|建议:<b>照写 + 警示行</b>(优先保证接续材料存在)",
348
+ "<b>A7 PLAN 判据强度</b>|建议:<b>维持自由节名 + 最弱硬判据 P-H1</b>(固定小节集会削弱老化机制)",
349
+ "<b>A8 P2-6 条目锚点是否做</b>|建议:<b>做</b>(它是「按 id 展开」的地基;+30 行)|⚠️ 它与 P0 的写入门同批(决定白板内容能否进语料)",
350
+ "<b>B1 丢卡风险(最严重)</b>|白板是整篇重写,看板丢卡 = 任务蒸发|解法:sidecar 重写前后<b>卡片集合对比</b>(只能移动/完成,不能消失)|<b>= P0 写入门,同一件事必须一起定</b>",
351
+ "<b>B2 旧卡撑爆截断</b>|<code>carryText</code> 第 0 层 <code>slice(0,3000)</code> 被已完成卡挤占|解法:列顺序约定 + 完成卡归档;<b>P7 老化按标题关键词对看板列名失配,需升级为列感知</b>",
352
+ "<b>B3 卡片腐烂</b>|状态漂移误导接续|解法:卡片带接续链 <code>contSeq</code> 时间轴 + 刷新仪式逐卡对状态 + 僵尸卡注入时打过期标记(复用现有 <code>cont-seq.json</code>)",
353
+ "<b>B4 人机冲突(核心新问题)</b>|你改卡 vs 模型整篇重写互相覆盖|选项:(a) 只读 (b) 卡 id + 接口合并(工程最大)(c) <b>卡片分「模型维护区 / 用户备注区」</b>|建议:<b>从 (c) 起步</b>,稳定后再评估 (b)|⚠️ 与 P0 写入门同批(决定写入门保护什么)",
354
+ "<b>B5 双状态源</b>|账本四段与看板并存|解法:<b>看板 = 现在时(唯一事实)、账本 = 过去时(历史)</b>;账本「任务状态」段改为<b>指路</b>,由 P1 中间件校验|⚠️ 与 P1 的 miv 语义同批",
355
+ "<b>B6 多任务混板</b>|卡带接续链标记(Cue/contSeq),新窗口只展开自己链",
356
+ "<b>B7 节奏</b>|建议:<b>P0 级零成本验证 —— 先出看板格式约定文档,真实工作区试两周</b>(模型守格式?接续取任务顺不顺?)再定 P1/P2",
357
+ "<b>推荐组合(只需说「按推荐来」)</b>:A1 P0-P1 立即 + A5 分期 + A2/A4/A6/A7/A8 按建议;<b>B4 从 (c) 起步</b>;<b>B7 先试点两周</b>;<b>B1 使 P2 顺位上调</b>(与 P0-④ supersede 同源,可同版实现)"],
358
+ crit:["15 条每条都有结论(哪怕结论是「按方案建议」)",
359
+ "拍完立刻能开工 P1(≈190 行,工具数不变)"],
360
+ refs:["WB-GRAPH-DECISIONS-20260914.md","MASTER-PLAN-3.0.md §5"] },
361
+
362
+ { id:"D1", phase:"p0", lvl:"✅ 已拍板", title:"① 会话检索口径:C + B(含丁组允许改字段)", who:"你已拍板 2026-09-14", status:"已拍板", est:"半天",
363
+ points:["<b>拍板结果</b>:C=就地修复 51 个文件(每文件先备份、写盘前跑启动级契约校验)+ B=给 DSH 索引器加「跳过+计数」保险(保留全部会话;dsh 升级会覆盖,需留重打脚本)",
364
+ "<b>丁组允许就地改字段</b>:cc245cf1 空工具名 → 占位名 \"(unnamed)\";fc931245 的 kind:anchored-monitor → plugin(各 1~2 个字段,不碰任何消息正文)",
365
+ "<b>四组构成</b>:39 个 descriptor v2→v3 / 7 个 permission·preset 删多余 origin / 3 个 seq 缺口(重编号 + 同步重映射 sourceEventSeqs)/ 丁组 2 个改字段",
366
+ "<b>禁删行</b>:seq 必须严格等于行序号——删任一行 = 该文件永久不可读",
367
+ "全库复测通过后,<b>由你重启一次 dsh web</b>(重启我不动)"],
368
+ note:"已弃用口径:A 只隔离 / D 导出后隔离 / E 只上报(若 B 的重打脚本维护负担太大,再回退到 A)",
369
+ refs:["SESSION-FILE-REPAIR-PROTOCOL.md","TODO-BACKLOG §0 看板 P0-①"] },
370
+
371
+ { id:"D2", phase:"decide", title:"【已暂停】⑥ 白板路线:把看板 combine 进自己的白板", who:"已定方向", status:"暂停(做完底层再谈)",
372
+ points:["目标(你的原话):让用户实时看到进展 + 整个项目的流程",
373
+ "不装独立插件;吸收 dsh-graph 的范式(版本泳道 / 目标 / 判据先于执行 / 事件流唯一事实源)",
374
+ "落地载体:仓库里的 WB-GRAPH 方案(P0→P3)+ 白板看板化(方案 §10)"],
375
+ refs:["WB-GRAPH-INTEGRATION-PLAN.md §5 / §8 / §10"] },
376
+
377
+ { id:"D3", phase:"decide", title:"【已暂停】WB-GRAPH 的 8 个拍板点什么时候拍", who:"你", status:"暂停(做完底层再谈)",
378
+ points:["①P2/P3 是否立项 ②sidecar 位置 ③静态纪律是否一次性更新 ④工具命名",
379
+ "⑤是否进 2.6.0 ⑥水位骨架 fail 策略 ⑦PLAN 判据强度 ⑧P2-6 条目锚点",
380
+ "P0(零代码)/ P1(≈190 行)不等这 8 点,可立即做"],
381
+ refs:["WB-GRAPH-DECISIONS-20260914.md","TODO-BACKLOG §A"] },
382
+
383
+ { id:"D4", phase:"p0", lvl:"口径 · 已定默认", title:"④ 记忆纠错两问 → 我先按「默认可逆」实现,你随时改", who:"执行方(默认口径)", status:"默认口径(可回退)",
384
+ points:["<b>问题一(压缩上限 + 排除用户提示)</b>:默认按「<b>注入量上限(条数 / 字符)+ 可排除来源</b>」实现(即 P0-④d);若你本意是「压缩蒸馏时的取舍规则」,改动点集中在取材规则,可回退",
385
+ "<b>问题二(AI 能否直接改记忆)</b>:默认走 <b>只读 + 提案</b> —— AI 不直接写记忆文件,产出「建议修改」清单由你确认;破坏性最小,等 P0-④b(supersede)落地后再考虑放开低风险档",
386
+ "两条都是<b>可逆默认</b>:先把底层跑起来,不做成阻塞项;你哪天真要改口径,我再改实现"],
387
+ refs:["ROADMAP.md A1 / A2","MEMORY-MUTATION-AND-INDEX-DESIGN.md"] },
388
+
389
+ { id:"D5", phase:"p2", lvl:"✅ 已拍板", title:"【已暂停】⑦ 跨会话 / 跨 Agent 检索:路径 C 已定 + 等大排期(剩 6 条拍板点)", who:"你已拍板 2026-09-13", status:"已拍板 · 暂停(随大排期)",
390
+ points:["路径已选 <b>C(分期版 A)</b>:先把插件自己承诺的能力做实,再扩到外部 Agent 源(对应 P2-⑦)",
391
+ "体量与成本已实测:见 P2-⑦ 卡片;全量解码约 1 分钟 CPU,无需新装依赖",
392
+ "<b>拍板原话(09-13 02:58 日志)</b>:路径选 <b>C(分期版 A)</b>,并「<b>等大排期一起定,暂不动工</b>」",
393
+ "剩下没定的:<code>CROSS-SESSION-SEARCH-PATH-DECISION.md</code> 里的 <b>6 条拍板点</b>(与「大排期」捆绑,需要时逐条过)"],
394
+ note:"不做也不会烂——调研与成本模型已落盘,随时可启动",
395
+ refs:["CROSS-SESSION-SEARCH-RESEARCH.md","CROSS-SESSION-SEARCH-PATH-DECISION.md","ROADMAP.md A4b"] },
396
+
397
+ { id:"P0-A", phase:"p2", lvl:"P0-A", title:"白板「接续」开关互锁 + 取消强制接续(成本)", who:"执行方", status:"封存(3.1)", est:"约半天",
398
+ points:["现况 bug:开了「接续」之后「强制接续」点不动,要关只能把整个白板关掉(互锁失效)",
399
+ "诉求:默认<b>不强制接续</b>——强制接续会让主力 agent 用贵模型(成本诉求)",
400
+ "群反馈第 1 条(老板提的)"],
401
+ crit:["两个开关互不卡死、可独立开关","不勾强制时,压缩后不自动接续(或严格按用户设置)"] },
402
+
403
+ { id:"P0-B", phase:"p2", lvl:"P0-B", title:"设置里 sub agent 的「模型 + 思考强度」选不动", who:"执行方", status:"封存(3.1)", est:"约半天",
404
+ points:["现况:能读出来,但选不动;用户估计「用的时候也没法复制」",
405
+ "排查面:控件 disabled / 枚举来源 / 选中值持久化写入路径",
406
+ "群反馈第 2 条"],
407
+ crit:["设置页可选,且有一次实际生效证据(跑一次归纳,确认落到所选模型)"] },
408
+
409
+ { id:"P0-1", phase:"p0", lvl:"P0-①", title:"解锁会话检索(可开工)", who:"执行方 + 你重启", status:"待开工(口径已定)", est:"半天", deps:["D1"],
410
+ points:["51 个阻塞文件:39 个 descriptor v2 / 7 个 permission-preset 多 origin / 3 个 seq 缺口 / 1 个空工具名 / 1 个 kind=anchored-monitor",
411
+ "处理完 → 你重启 → 首次检索自动重建索引"],
412
+ crit:["memory_recall(scope=\"sessions\") 返回命中,不再报 disabled / descriptor","51 个文件各有明确去向(修复或隔离或跳过计数)"] },
413
+
414
+ { id:"P0-4", phase:"p0", lvl:"P0-④", title:"记忆增删 × 少重建:块级向量缓存 + 检索 fail-open", who:"执行方", status:"待开工", est:"约 1 天", deps:["P0-1"],
415
+ points:["持久化改 Map&lt;chunkId, vector&gt;;commit 时做集合差 → 只嵌新增块",
416
+ "identity 校验收窄到 embedding 配置(换模型才全量重算)",
417
+ "索引失败 → 退回词法 + 明确降级标注,绝不整条失败"],
418
+ crit:["编辑 1 条只嵌变化块","删除 1 条 = 零 encode","故意破坏一个源文件仍返回词法命中"],
419
+ refs:["MEMORY-MUTATION-AND-INDEX-DESIGN.md P0"] },
420
+
421
+ { id:"P0-4b", phase:"p0", lvl:"P0-④b", title:"supersede 改正语义(改正=新增声明,不物理删)", who:"执行方", status:"待开工", est:"约半天", deps:["P0-4"],
422
+ points:["新记录声明 supersedes:&lt;旧id&gt;;旧条标记 supersededBy 但**不退场**",
423
+ "检索过滤/降权被替代项;审计视图仍能看到「当时为什么这么记」"],
424
+ crit:["被 supersede 的记录不出现在检索结果、但出现在审计视图"] },
425
+
426
+ { id:"P0-4c", phase:"p0", lvl:"P0-④c", title:"差量同步:upsert + tombstone", who:"执行方", status:"待开工", est:"约 1 天", deps:["P0-4b"],
427
+ points:["miv 退化为诊断用;缓存键改为 memoryId → recordDigest 集合","发送成本与改动量成正比"],
428
+ crit:["改 1 条不再重发整份语料"] },
429
+
430
+ { id:"P0-4d", phase:"p0", lvl:"P0-④d", title:"注入压缩上限 + 可排除来源(坏记忆不再反复灌入)", who:"执行方", status:"待开工", est:"约半天", deps:["P0-4b"],
431
+ points:["给自动注入设上限(条数/字符)——<b>口径待 D4 确认</b>(也可能是「压缩蒸馏的取舍规则」)",
432
+ "支持把某条来源整个排除(例:已判定错误的白板段/日志段)",
433
+ "与 supersede 同一套状态:被替代项默认不进注入",
434
+ "群反馈第 4 条:「避免因为记忆问题导致结果一路走错」"],
435
+ crit:["被排除的来源在后续注入中 0 次出现","上限生效且超限时的取舍规则写死在代码里(可测)"],
436
+ refs:["ROADMAP.md A2","MEMORY-MUTATION-AND-INDEX-DESIGN.md"] },
437
+
438
+ { id:"P0-4e", phase:"p0", lvl:"P0-④e", title:"索引同步防抖:持续写入会让语义索引永远不就绪(实测卡死 20 分钟)", who:"执行方", status:"已实测复现", est:"约半天", deps:["P0-4"],
439
+ points:["<b>现场</b>:诊断日志从本地 07:43 到 08:01 一直在刷同一行 —— <code>ctx-host drop: index-not-ready:sync-in-progress cv=…</code>(cv 从 175 涨到 612,即<b>每轮都在换新语料版本、每轮都触发新一轮全量重建</b>),期间注入被显式丢弃(+N suppressed in 30s)",
440
+ "<b>成因</b>:语料身份是整份哈希(miv),而最近每轮都在写记忆(日志 / 笔记)→ 语料一直在变 → 新 miv 的全量重嵌还没跑完,下一轮又变 → <b>重建永远追不上</b>;旁证=最新向量文件停在 07:42:56、fv2 候选生成停在 07:44:30,之后 20 分钟零新产物",
441
+ "<b>后果</b>:语义唤回 packet 自 07:43:45 起停止注入(你看到的「语义唤回没了」就是它),recall 也静默退化为纯词法",
442
+ "修法:①块级向量缓存(P0-④:只嵌变化块,重建成本与改动量成正比)②corpus 变更<b>合并 / 防抖</b>(一段时间内的多次写入只触发一次 sync)③长时间未就绪<b>不得静默丢弃</b>:要么用旧版本向量继续服务并标注过期,要么在界面上明示",
443
+ "<b>更硬的定性(08:09 补测)</b>:worker 子进程 CPU 累计 659.4s、<b>3 秒内增加 0.00s(在闲着)</b>,而索引产物从 07:43 到 08:09 <b>26 分钟零更新</b>;对比此前一次重建只花 <b>6 秒</b>(07:42:50 → 07:42:56)→ <b>不是「重建慢」,是同步状态机卡死 / 任务被反复作废</b>;「持续写入导致饥饿」仍是待复测假设(重启后单独验证)",
444
+ "<b>已排除的错误猜测</b>:曾怀疑「两个 python worker 抢同一份索引」——实测为<b>父子结构</b>(venv python 父进程 5MB → 用 <code>D:\\PsychoPy\\python.exe</code> 重新拉起自己,子进程 2.6GB 装着模型),是<b>一个逻辑 worker</b>,不是两个竞争者"],
445
+ crit:["连续写 10 轮记忆后索引仍能就绪(复跑:ctx-host 不再刷 index-not-ready)","未就绪期间注入不丢空——至少出现明确的降级标注","重嵌耗时与改动量成正比(改 1 条不触发全量)"],
446
+ refs:["MEMORY-MUTATION-AND-INDEX-DESIGN.md P0 / P2","ROADMAP.md A1"] },
447
+
448
+
449
+ { id:"P0-2", phase:"p0", lvl:"P0-②", title:"OpenViking 式三层补全(施工全部完成 · 待宿主重启真实验收)", who:"执行方", status:"施工完成(C1/C2/C3/C4/C5/C6/C7 全 ✅;**待宿主重启后真实验收**)", est:"约 2 天", deps:["P0-1"],
450
+ points:["<b>阶段门(用户 2026-09-14 明确)</b>:「三层先修完并真验收通过,才能进入语义模型」——本项是 P1-⑨ 语义框架审计与引擎调优的前置",
451
+ "<b>2026-09-14 施工结果(全部带能失败的断言)</b>:C1 抽取层补 layer/status(21)· C2 召回侧带层与检索侧过滤(21)· C4 Tier-0 目录生成器(33)· C7 注入块 0-1 相似度与排名(29)· <b>C3 接线 + C5 注入层 + C6 验收套件</b>(C5 83、C6 122,另 7 处定向变异全部报红);全量 <code>tests/smoke</code> <b>77 套件 0 失败</b>",
452
+ "<b>关键事实更正(2026-09-14)</b>:每轮 <code>&lt;memory_system&gt;</code> 块由 <code>renderMemoryDynamic</code> 产出,<b>不是</b> <code>injectionText</code>(后者全仓零引用的死代码,内容是外部 AI 记忆清单)——此前文档与本卡按旧认知写过,以此为准",
453
+ "<b>验收未完成的最后一步(必须由用户做)</b>:重启 dsh web 后,注入里应出现 <code>[Tier-0 常驻目录 …]</code> + <code>[层账]</code> + <code>[降级]</code>(有缺层时)+ <code>[闸门]</code>,且参考块带 <code>Score: 0.xx (rank n/m)</code>——这才是「真过」",
454
+ "<b>⚠️ 行为变更需知</b>:C5 的 <code>tier0CatalogEnabled</code> <b>默认开</b>,且目录段长度从证据段预算里先扣(默认预算下 4 个证据段各约 135 字符,原约 275)→ 每轮 token 成本与日志/笔记注入长度都会变;C3 的 <code>l0IndexEnabled</code> <b>默认开</b>(用户 2026-09-14 裁定;设 false 才回到零 IO)",
455
+ "<b>已知残留</b>:① Tier-2 实践上仍是「更长的摘录」(受激活候选 20–480 字限制),取整篇原文仍走 expand;② Python 档激活帧不带 query,其闸门只能开到 tier1;③ C3 索引为「按层各一份」而非单文件(<code>l0-index-pre</code> 每次只接受单一 layer)",
456
+ "<b>实测缺口(2026-09-14 代码级复核)</b>:①无 Tier-0 带状态目录;②L0 条目无 layer(用户级/项目/日志/反思/白板)与 status(current/superseded/retracted);③无递进闸门(现为 top-K 混排,语料=日志 40+反思 30+笔记+用户记忆);④<code>l0-index-pre.js</code> 仍<b>零引用未接线</b>(L0 层没有自己的向量索引,现有向量是对原文块做的);⑤中间「概览层」不存在——从 ~90 字 L0 一步跳到原文全文",
457
+ "「以为过了、其实没过」的病根=验收只验「声明过的项」→ 治法见 P1-⑤(能力可达性)与 P1-⑯(量化实验)",
458
+ "施工顺序:①三层契约(每层的输入/产出/token 预算/状态位;零代码,可立即做)②L0 补 layer+status,检索按状态过滤 ③接线 l0-index-pre.js ④Tier-0 目录 + 递进闸门 ⑤验收套件(每条能力一个能失败的断言)",
459
+ "待裁:<code>metamem-rules-pre.js</code> 是否要做"],
460
+ crit:["三层各自可独立验证:Tier-0 常驻 ≤N token;L0 每条带 layer+status;expand 能按需取回原文",
461
+ "被 supersede / retracted 的条目不出现在检索结果(造样本可断言)",
462
+ "验收套件里每条能力都有一个「默认配置下可达」的断言,故意破坏时确实会红"],
463
+ refs:["TODO-BACKLOG §K.0(四大问题之二)","ROADMAP.md A3","P1-⑯"] },
464
+
465
+ { id:"P0-3", phase:"p0", lvl:"P0-③", title:"分级精确检索:Tier-0 目录 → L0 摘要 → 原文", who:"执行方", status:"待开工", est:"约 1 天", deps:["P0-2"],
466
+ points:["Tier-0:短目录常驻(标题+一句+layer+status+日期),负责「要不要用这条记忆」",
467
+ "Tier-1:L0 摘要列表(现状);Tier-2:expand 取原文",
468
+ "仲裁:当前认知(笔记)优先于历史日志;被更正项过滤;输出带 provenance"],
469
+ crit:["Tier-0 ≤N token 可注入","有更正的场景返回更正后的条目且带来源+日期+状态"] },
470
+
471
+ { id:"P1-5", phase:"p1", lvl:"P1-⑤", title:"验收判据换代:能力可达性套件", who:"执行方", status:"待开工", est:"约半天", deps:["P0-1","P0-2","P0-3","P0-4"],
472
+ points:["每条对外承诺(尤其 guidance 写给模型的能力)必须有「默认配置下可达」的证据",
473
+ "文档里的默认值/接线状态由测试锁住,杜绝「文档说 A、代码是 B」"],
474
+ crit:["新增套件覆盖 scope=\"sessions\"、语义臂、外部源、白板语料"] },
475
+
476
+ { id:"P1-6", phase:"p2", lvl:"P1-⑥", title:"白板 combine:实时进展 + 全流程可视化", who:"执行方", status:"契约层已落地(B 线,零代码);界面层封存(3.1)", est:"分步", deps:["D2"],
477
+ points:["P0|判据文档约定(零代码,可立即做)—— <b>已完成:<code>docs/internal/WB-FORMAT-CONVENTION.md</code> v1</b>(2026-09-14,用户批准 S10 后落地):三种页面时态 · <b>锚点契约</b>(卡片 id = <code>mem_</code>+sha256(workspaceKey+页面路径+卡片标题) 前 32 位十六进制;重排不变、改名换 id 且旧 id 须 supersede 留痕)· 索引派生格式(与 Tier-0 目录同源,不许手抄)· 写入门只做「卡片集合比对」(丢卡可检出、拒绝静默消失)· 人机分区(<code>&lt;!-- model --&gt;</code> / <code>&lt;!-- user --&gt;</code>,整篇重写须原样带回用户段)· lint 五类(孤立/陈旧/被提及无独立卡/缺交叉引用 = 零 token;矛盾检测须手动触发)· 答案归档回流 · 6 条能失败的验收",
478
+ "<b>顺序结论(2026-09-14 定)</b>:Karpathy 那套要拆成两层 —— <b>契约层(格式/锚点/索引派生)必须在 RAG 底层之前</b>(它决定语料形状,先做 RAG 就得对语料重做一遍);<b>界面层(client.js 渲染/看板交互)必须排在 RAG 之后</b>(它只是视图)。故本卡的契约层已提前进 B 线,界面层仍封存",
479
+ "P1|判据校验中间件(≈190 行;咽喉=writeHandoffLedger / writePlanSnapshot)",
480
+ "P2|sidecar 结构化存储(≈240 行,需拍板)",
481
+ "P3|两个遍历工具 + 看板 UI(≈165 行;工具数 14→16,三处测试硬锁必须同步)",
482
+ "<b>群反馈第 1 条的两个目标准入本项</b>:①不启动 agent 也能单独打开 graph 看项目总进展(不用用户自己记)②这份进展同步注入 agent,使多轮压缩后仍准确掌握",
483
+ "看板化:白板从「接续专用」升级为「人机交互面」(方案 §10 的七大待解点)"],
484
+ crit:["能按版本回答「改了什么 / 哪些是弯路」","用户在面板上实时看到进展(目标/阶段/判据)","不启动 agent 也能单独打开看到项目总进展(目标①)","同一条进展在 agent 多轮压缩后的上下文里仍能被读到(目标②)"] },
485
+
486
+ { id:"P1-8", phase:"p2", lvl:"P1-⑧", title:"procedural memory 重构(档着 3 条群反馈)", who:"执行方(设计要你拍板)", status:"封存(3.1)", est:"分步", deps:["P0-4b"],
487
+ points:["<b>晋升标准重做</b>:不只按次数沉淀——长时攻关/突破做完也晋升为长期 skill 记忆(群反馈第 8 条)",
488
+ "<b>skill 之间可写 hand-off</b>:「用完这个经常会遇到那个」,两个紧密联系的 skill 互相指路(第 8 条)",
489
+ "<b>晋升物要可读</b>:现在「我都不知道是啥技能」(第 5 条)",
490
+ "<b>晋升开关</b>:项目记忆 → 全局记忆,可开可关、可手动管理;你的规划=保留自动,但等本项做完再上(第 3 条)",
491
+ "现状沿用 Hermes 的 observed→candidate→validated→active;社区褒贬不一,issue #30 同根因",
492
+ "过渡期:执行类流程仍走仓库任务书通道(docs/prompts/*-AGENT.md)"],
493
+ crit:["晋升记录里能看到「因攻关而晋升」与「skill 互链」两类真实样本",
494
+ "关掉晋升开关后,项目记忆不再自动写入全局记忆",
495
+ "技能说明人看得懂(不是一串 id)"],
496
+ refs:["ROADMAP.md §B","issue #30"] },
497
+
498
+ { id:"P1-9", phase:"p1", lvl:"P1-⑨", title:"语义架构规范 v2(已立):用规范 RAG 策略清单审计并约束检索", who:"执行方", status:"规范已立(B 线,可与三层施工并行);审计待跑", est:"约半天", deps:["P1-16"],
499
+ points:["素材:B 站《7 分钟了解 10 种 RAG 策略》(BV17J3B6PEGK)——你的要求是「用规范性的框架来做,或用来审核我这个的标准」",
500
+ "<b>已交付:<code>docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md</code> v2</b> —— <b>9 条规范条款 S1–S9</b>,每条都带「判据 / 我方现状(含代码证据)/ 缺口」:S1 分块与增量 · S2 查询侧加工(改写 / 多查询 / HyDE)· S3 混合臂与排名空间融合 · S4 精排 · S5 注入压缩/预算/降级 · S6 自适应检索决策 · S7 评估(没有实验就没资格改算法)· S8 观测与再现 · <b>S9 分档四条</b>(S9.1 兼容档 = 零额外 LLM token;S9.2 最优档 = 允许引入 LLM,但每条重方案须带「成本 + 门控条件 + 无 LLM 时的降级路径」三件套;S9.3 两档共用同一套接口与判据、只换引擎与预算、不改契约形状;S9.4 禁止把兼容档当成目标形态)",
501
+ "<b>审计结论(规范 §3)</b>:<b>合规</b>的是 S3(词法 + 稠密 + 时间三臂,RRF 排名空间融合 <code>:4068</code>)、S6(fv2 决策 + echo veto + 冷却,本仓领先项)、S9(<b>兼容档</b>达标:决策 = 本地 LR、嵌入 = 端侧、压缩 = 本地规则,即 S9.1 零额外 LLM token;<b>最优档</b>的 S9.2 三件套审计待跑);<b>草台</b>的是 S1(块 ID 未进缓存键 → 写一条记忆全库重嵌)、S2(查询侧三项全无)、S4(无精排级)、S5.3(索引未就绪静默丢弃,07:43–08:35 现场)",
502
+ "<b>立场(规范 §7 分档口径,已核验外部事实见附录 F)</b>:<b>「RAG 已死」的判据不是 RAG vs 长上下文,而是「谁付费」</b>。LLM Wiki(Karpathy)= 写入/维护侧由 LLM 承担,靠 <code>index.md</code> 导航,约百份资料规模可避开嵌入基础设施;Grep agentic(Claude Code)= 每轮多次 LLM 工具调用的乘数。<b>首要用户 = 开发者本人 = 最优档:以最优为目标吸收两者优点(索引即自然语言 + 智能判断要不要搜),允许在检索路径上引入 LLM,但每条重方案须按 S9.2 带「成本 + 门控条件 + 无 LLM 时的降级路径」三件套</b>;<b>兼容档(token 敏感 + 设备弱)只是必须存在的降级路径:按 S9.1 零额外 LLM token,判断交给零 token 的本地 LR</b>。两档共用同一套接口与判据、只换引擎与预算(S9.3),<b>不得把兼容档当作目标形态(S9.4)</b>",
503
+ "<b>阶段门(三条线)</b>:<b>A 线</b>接口冻结(C3 → C5 → C6)在先;<b>C 线</b>按 S1.3 增量 → S5.3 降级标注 → S2 查询侧(<b>兼容档</b>必须本地实现,按 S9.1 零额外 LLM token;<b>最优档</b>可引入 LLM,但按 S9.2 带「成本 + 门控条件 + 降级路径」三件套)→ S4 精排 的顺序改造算法,开工条件 = A 线全绿;<b>B 线</b>(本卡:立规 + 审计 + 补实验基线)不碰接口,<b>即刻可跑</b>"],
504
+ crit:["逐条覆盖规范清单的每一类策略,标注现状(已用/部分/未用)与代码证据 —— ✅ 已随规范 v2 交付",
505
+ "<b>分档审计(S9)</b>:清点检索路径上的每一处 LLM 调用点 —— <b>兼容档</b>守 S9.1(零额外 LLM token);<b>最优档</b>每条重方案必须写明「成本 + 门控条件 + 无 LLM 时的降级路径」三件套",
506
+ "<b>语义算法改造的开工条件可判定</b>:C3/C5/C6 全绿,且宿主重启后注入块里出现 <code>Score: 0.xx (rank n/m)</code>",
507
+ "改造按规范 §5 顺序执行,每项带 S7 三策略对照(A 只给目录 / B 目录+命中摘要 / C 目录+候选全灌)与一条能失败的断言"],
508
+ refs:["SEMANTIC-ARCHITECTURE-SPEC.md(新)","THREE-LAYER-CONTRACT.md §7","ROADMAP.md §A"] },
509
+
510
+ { id:"CHK-1", phase:"p1", lvl:"P1-⑬", title:"记忆文件卫生:空行残留 / 标题层级 / 容量逼近上限", who:"执行方", status:"本机已复现(已清理一轮,机制待修)", est:"约 1 小时",
511
+ points:["<b>群友报的 3 条里,第 1 条在本机复现了</b>:项目笔记 `MEMORY.md` 开头有 <b>63 行连续空行</b>(残留碎片),另有 5 处标题层级错位(相邻两个 `##`)",
512
+ "实测修复(2026-09-14):191 行 → 128 行;空行 93 → 30;最长连续空行 63 → 2;字符 11,366 → 11,308;<b>15 个记忆锚点一个没少</b>;无 BOM;行尾保持 LF;备份 `MEMORY.md.hygiene-backup-20260914-075325.bak`",
513
+ "<b>机制推断</b>:笔记的自动压缩把旧内容移走后<b>留下了空行</b>——这就是群友说的「空标题碎片」的真身(我上次查的是「空 <code>###</code> 标题行」,<b>口径错了</b>,所以误报「未复现」)",
514
+ "<b>仍悬着两条</b>:①笔记容量 11,308/12,000 = <b>94%</b>,随时会撞上「超容量 → 写入被拒」(群友第 2 条);②交接账本被自动快照段落污染(第 3 条)本机还没复现",
515
+ "<b>给插件加的真修法</b>:压缩时同步清掉空行残留;容量到 90% 就主动折叠,而不是等写入被拒"],
516
+ crit:["笔记文件头不再有空行残留;相邻同层标题消失","容量到 90% 时自动折叠而不是拒绝写入(造一份 11k 字符的笔记,再写一条应成功)"] },
517
+
518
+ { id:"P1-14", phase:"p1", lvl:"P1-⑭", title:"语义臂会静默失效:miv 一变,0-1 相似度排序就消失", who:"执行方", status:"已实测复现(含根因)", est:"约 1 天",
519
+ points:["<b>症状</b>:以前 recall 给的是 0-1 拟合度(0.8 / 0.7 / 0.6 往下走),现在只剩「词法×1 / ×2 / ×3」——<b>语义分整段消失</b>",
520
+ "<b>根因链(文件级证据)</b>:①diag 显示四门全开(associativeMemoryEnabled / contextBridgeEnabled / pythonBackendEnabled / contextSinkMode=python),语义引擎=python 模式,python worker 活着(3.2GB 那个);②但 semantic-pre 里最新的向量文件是 <code>vectors-c6eef049….json</code>(07:42:56);③我在 <b>07:53:33 改了项目笔记</b> → 语料变 → miv 变 → <b>新 miv 对应的向量文件不存在</b>;④worker 的三重过滤(workspaceRef + scope + miv)于是返回空分 → <b>静默退化为纯词法</b>,不告诉调用方",
521
+ "<b>换句话说</b>:我改一次笔记,就把语义检索打回词法——这正是「一改就全量重算」的现场版,也解释了「理论上该有语义」而实测没有",
522
+ "同源症状两条:L0 只有标题级摘要(决策结论句只在 expand 原文里);刚写入的条目下一轮查不到(新鲜度滞后)",
523
+ "修法:①块级向量缓存(只嵌变化块 = P0-④)②miv 未就绪时必须<b>显式降级标注</b>,不许静默 ③写盘后触发索引刷新,或 recall 前校验 miv",
524
+ "<b>决定性证据(2026-09-14 08:0x)</b>:诊断日志 <code>~/.dsh/dsh-auto-memory-pre-diagnose.log</code> 显示<b>每轮</b>都在 <code>ctx-host drop: index-not-ready:sync-in-progress</code>,从 07:43 起持续 20 分钟未就绪 → 这就是 packet 归零的直接原因(详见 P0-④e)",
525
+ "时间线锚点:packet 注入 02:15–02:58 正常、07:39–<b>07:43:45 正常</b>、之后<b>归零</b>;而 spliced 投递仍在(07:52 / 07:54 / 07:56 / 07:58 / 08:00),只是内容被 ctx-host 丢弃"],
526
+ crit:["纯语义查询能命中同主题条目(复跑「改掉一条旧结论之后整个向量空间要不要重算」那条探针应非空)","语义臂不可用时,返回里出现明确的降级标注","改一次笔记之后,下次 recall 仍带 0-1 语义分(不用等全量重建)"],
527
+ refs:["ROADMAP.md A3 / A6","MEMORY-MUTATION-AND-INDEX-DESIGN.md","TODO-BACKLOG §K"] },
528
+
529
+ { id:"P1-15", phase:"p1", lvl:"P1-⑮", title:"注入层不是语义唤回:注入块里看不到 0-1 相似度(已修渲染层,待重启验证)", who:"执行方", status:"已修(待宿主重启验证)", est:"小",
530
+ points:["<b>现象(用户报告)</b>:昨晚今早注入里能看到很多语义唤回块,后来「怎么现在就没了」,并且<b>看不到 0-1 相似度排序</b>",
531
+ "<b>消失的直接原因(已定案)</b>:本地 ctx-host 每轮刷 <code>index-not-ready:sync-in-progress</code> → 注入被<b>显式丢弃</b>(07:43:45–08:35:55 归零,而 inbox 投递仍在,只是内容为空);根因=整份哈希 miv 语料身份 + worker 卡死,重建永远追不上写记忆节奏。重启后注入块已恢复(每轮 7–9 块)",
532
+ "<b>0-1 相似度是另一处真缺陷(渲染层丢分)</b>:分值上游一直算得出来(<code>act.candidates[].score</code> → <code>packet.references[].score</code>,来自稠密分 / 融合序),但 <code>renderReferenceTail</code> 只渲染 Source/Reason/Reference 三行,<b>从不打印 item.score</b>;reason 串也只有 lane/decision/reasonCodes(<code>python/worker_semantic_pre_v1.py</code> 的 fv2 reason 串 / <code>lib/context-host-pre.js</code> 的 js-decide reason)→ 看得见「要不要注入」,看不见「到底多像」<b>(行号别写死:本轮补数值后该处已从 :697 漂到 :707)</b>",
533
+ "<b>修法(2026-09-14 已落地)</b>:①<code>renderItemBlock</code> 增第四行 <code>Score: 0.71 (rank 1/3)</code>(取自 packet 既有字段,确定性;score 非有限数则整行省略,保持旧版字节行为)②Python 与 JS 两处 reason 串补 <code>intent/dense/margin</code>,且数值段放在 reasonCodes <b>之前</b>,160 字符截断只砍代码列表不砍分值 ③新套件 <code>smoke-test-tail-score-visible-pre.mjs</code> 29 断言(含乱序输入必须重排、预算必须把这行计入、声明了却没接线必须报红)",
534
+ "<b>残留(归 P0-③)</b>:注入层骨架(日志尾/反思摘要/笔记头…)仍未升级为带 layer/status 的 Tier-0 目录;本卡只解决「块里看不见相似度」"],
535
+ crit:["注入内容里能看到带 layer / status 的 Tier-0 目录(P0-③)","宿主重启后,注入块里出现 <code>Score: 0.xx (rank n/m)</code> 且块序按分值降序","至少一次注入中出现语义召回条目(带相似度与来源)"],
536
+ refs:["ROADMAP.md A3","P1-⑭ 本卡","THREE-LAYER-CONTRACT.md §7","tests/smoke/smoke-test-tail-score-visible-pre.mjs"] },
537
+
538
+ { id:"P1-16", phase:"p1", lvl:"P1-⑯", title:"三层检索的量化实验(你缺的那两个实验)", who:"执行方", status:"词法基线已跑,待语义臂恢复后正式跑", est:"约 1 天",
539
+ points:["<b>三层现状(代码级实测)</b>:✅ 语料已分块(chunkId 内容寻址)/✅ L0 摘要层(<code>buildL0IndexPre</code>,被 index.js 三处调用 :2827 / :3995 / :4148)/✅ 原文层(<code>expandMemoryRecordPre</code> :4194);❌ 无 Tier-0 带状态目录;❌ 无层级归属、无状态过滤、无递进闸门(现在是 top-K 混排);❌ <code>l0-index-pre.js</code> 仍<b>零引用未接线</b> → 语义向量是对<b>原文块</b>做的,L0 自己没有索引",
540
+ "<b>关键缺口</b>:从 ~90 字的 L0 <b>一步跳到原文全文</b>,中间那个「概览层」目前不存在 —— 这正是实验二要回答的「直接灌够不够、贵不贵」",
541
+ "<b>实验一 · 下探准确性</b>:12 条已知答案的事实 → 记录 L0 top-1 / top-3 / top-5 命中率 + <b>expand 之后答案可达率</b> + 每跳 token 成本 + 需要几跳。判据:top-5 命中 ≥ 10/12 且下探后答案可达 ≥ 10/12",
542
+ "<b>实验二 · 直接灌是否够用</b>:同一批问题,三策略对照 —— A 只给 L0 / B L0 + 命中条原文 / C L0 + 候选集全灌(上限 <code>injectBudgetChars 2000</code>);指标 = 盲测答题正确率、注入 token 数、噪声比",
543
+ "<b>词法基线(2026-09-14 已跑,语义臂卡死期间)</b>:3 条事实 → L0 top-1 命中 <b>1/3</b>、top-5 命中 <b>2/3</b>(m73 根因那条 top-5 未中);命中原因<b>全是词法、0 条带语义分</b>;并观察到单字母 token 污染(<code>词法×3(agent,检索,a)</code>)",
544
+ "前置:语义臂恢复(重启 dsh web)。两个实验可离线跑,不需要重跑嵌入"],
545
+ crit:["实验一:top-5 命中 ≥ 10/12 且下探后答案可达 ≥ 10/12","实验二:给出 A/B/C 三策略的正确率与 token 对照表,并明确「中间概览层要不要补」","结论能直接决定 Tier-0 / L1 概览层是否立项"],
546
+ refs:["ROADMAP.md A3","TODO-BACKLOG §K"] },
547
+
548
+
549
+ { id:"P2-7", phase:"p2", lvl:"P2-⑦", title:"跨 Agent 记忆入检索(外部文档 + 外部会话)", who:"待拍板(见 D5)", status:"待拍板", deps:["P0-3"],
550
+ points:["外部 md 入语料(Claude Code CLAUDE.md / WorkBuddy·CodeBuddy 画像 / ZCode 记忆 / TRAE·Cursor 规则)",
551
+ "外部会话适配器(Claude Code / Codex / WorkBuddy / ZCode / Kimi),逐源可开关",
552
+ "与 P0-②③ 共用同一套 ID 与增量纪律",
553
+ "<b>路径已选 C(分期版 A)</b>:先把插件自己承诺的能力做实,再扩到外部 Agent 源",
554
+ "体量实测:DSH 191 个/320MB、Codex 17/45.8MB、WorkBuddy 89/155MB、ZCode 3/80MB(≈600MB);DSH 压缩比 2.1x、可索引正文约 0.35GB;解码 11MB 仅 0.7s(全量约 1 分钟 CPU)",
555
+ "技术结论:FTS5/BM25 词法主干 + 可选本地小嵌入(RRF 融合)+ <b>轮次级分块</b> + 增量后台索引;LongMemEval-S R@5:BM25-only 86.2% → 混合 95.2% → 纯向量 96.6%",
556
+ "<b>容错纪律:逐文件跳过 + 计数 + quarantine,不得 fail-closed</b>(本次被 51 个文件压死的教训)"],
557
+ refs:["CROSS-SESSION-SEARCH-RESEARCH.md","CROSS-SESSION-SEARCH-PATH-DECISION.md","ROADMAP.md A4b"] },
558
+
559
+ { id:"P2-8", phase:"p2", lvl:"P2-⑧", title:"(已上移为 P1-⑧ · procedural memory 重构)", who:"—", status:"见 P1-⑧",
560
+ points:["本条已并入阶段 2 的 <b>P1-⑧</b>:群反馈第 3/5/8 条都以它为前置,所以从「待拍板」上移为「待开工」"] },
561
+
562
+ { id:"P2-9", phase:"p2", lvl:"P2-⑨", title:"群反馈 / 日报 CI 的安全与运维收口", who:"ZCode", status:"待确认",
563
+ points:["webhook 签名 / 限流 / 来源白名单;密钥只存 GitHub Secrets 与 SCF 环境变量",
564
+ "时区与失败告警;index.zip 这类二进制是否应入库"] },
565
+
566
+ { id:"P2-10", phase:"p2", lvl:"P2-⑩", title:"SCF 云函数 zip 重部署", who:"你", status:"待你操作",
567
+ points:["新 index.zip 已重打(含 ?report=N 路由与版本标记)","上传后在群里或 ?diag=1 核对"] },
568
+
569
+ { id:"P2-11", phase:"p2", lvl:"P2-⑪", title:"日历换开源方案(自研太粗糙)", who:"执行方调研 + 你定夺", status:"待调研", est:"调研约半天",
570
+ points:["群反馈第 7 条:「日历插件太粗糙,需要搜索公开的开源日历插件,直接替换掉我写的这个草台班子」",
571
+ "调研面:DSH 生态现成日历插件 / 通用开源日历组件,比较「替换成本 vs 自研补齐」",
572
+ "注意迁移:日历数据现在落在 ~/.dsh/memory/CALENDAR.md(本插件自己维护的 md),换组件要给出旧数据导入路径"],
573
+ crit:["给出 2~3 个候选(含许可与维护活跃度)+ 一个推荐","旧数据迁移路径明确(能一条命令导过去)"] },
574
+
575
+ { id:"P2-12", phase:"p2", lvl:"P2-⑫", title:"手机端远程控制:首次启动指引太大且关不掉", who:"执行方", status:"远期(随 UI 调整)",
576
+ points:["群反馈第 6 条:手机端远程控制首次启动指引过大、且无法关闭",
577
+ "与「明确推后」阶段的冷启动余项同源(welcomeTourEnabled 死键 / 向导无兜底触发),<b>合并做</b>"],
578
+ crit:["小屏下指引可关闭,且关闭状态被记住"] },
579
+
580
+ { id:"A-1", phase:"defer", title:"大排期三件套(界面 / 文档 / 首页)", who:"你", status:"推后",
581
+ points:["需 6 个拍板点 + 3 样输入(官方 DSH 网页 URL·截图 / 角色基准图 / 风格探针许可)"] },
582
+ { id:"A-2", phase:"defer", title:"界面技术债:令牌层 / 组件层 / i18n / IA 重排", status:"推后",
583
+ points:["硬编码色 320 处 / 内联 style 228 vs className 4 / :focus 0 条 / 12 页签塞进 440×560"] },
584
+ { id:"A-3", phase:"defer", title:"文档体系:README 大改 / USER-GUIDE / 双语对账 / 27 张配图", status:"推后" },
585
+ { id:"A-4", phase:"defer", title:"分发门面:npm 瘦身 / package.json 字段 / Pages / CHANGELOG 死链", status:"推后" },
586
+ { id:"A-5", phase:"defer", title:"冷启动余项:向导兜底触发 / 幻觉 ON / 引擎步重试 / welcomeTourEnabled / 术语 Top5", status:"推后" }
587
+ ]
588
+ };
589
+
590
+ var state = load();
591
+ var filter = "all";
592
+
593
+ function load(){
594
+ try{ var raw = localStorage.getItem(KEY); if(!raw) return {added:[],hidden:[]};
595
+ var o = JSON.parse(raw);
596
+ return { added: Array.isArray(o.added)?o.added:[], hidden: Array.isArray(o.hidden)?o.hidden:[] };
597
+ }catch(e){ return {added:[],hidden:[]} }
598
+ }
599
+ function save(){ try{ localStorage.setItem(KEY, JSON.stringify(state)) }catch(e){} }
600
+
601
+ function tone(id){ var p = DATA.phases.filter(function(x){return x.id===id})[0]; return p?p.tone:"inbox" }
602
+ function visible(it){
603
+ if(state.hidden.indexOf(it.id)>=0) return false;
604
+ if(filter==="all") return true;
605
+ if(filter==="main") return it.phase==="p0" || it.phase==="p1";
606
+ if(filter==="core") return it.phase==="p0" || it.phase==="p1" || it.phase==="graph";
607
+ return it.phase===filter;
608
+ }
609
+ function esc(s){ return String(s==null?"":s).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;") }
610
+
611
+ function card(it){
612
+ var t = tone(it.phase) === "inbox" ? "p2" : tone(it.phase);
613
+ var h = '<div class="card" data-tone="' + (it.added?"inbox":t) + '" data-added="' + (it.added?1:0) + '">';
614
+ h += '<button class="kill" title="隐藏这条" data-kill="' + esc(it.id) + '">×</button>';
615
+ h += '<div class="row1">';
616
+ if(it.lvl) h += '<span class="lvl">' + esc(it.lvl) + '</span>';
617
+ h += '<span class="title">' + esc(it.title) + '</span>';
618
+ if(it.status) h += '<span class="tag st">' + esc(it.status) + '</span>';
619
+ if(it.who) h += '<span class="tag">' + esc(it.who) + '</span>';
620
+ if(it.est) h += '<span class="tag">' + esc(it.est) + '</span>';
621
+ (it.deps||[]).forEach(function(d){ h += '<span class="tag dep">依赖 ' + esc(d) + '</span>' });
622
+ if(it.added) h += '<span class="tag">我加的</span>';
623
+ h += '</div>';
624
+ if(it.points && it.points.length){
625
+ h += '<ul class="pts">';
626
+ it.points.forEach(function(p){ h += '<li>' + p + '</li>' }); // 允许内联小标签
627
+ h += '</ul>';
628
+ }
629
+ if(it.note) h += '<div class="refs">↳ ' + esc(it.note) + '</div>';
630
+ if(it.crit && it.crit.length){
631
+ h += '<div class="crit"><b>验收判据(打钩用)</b><ul class="pts">';
632
+ it.crit.forEach(function(c){ h += '<li>' + esc(c) + '</li>' });
633
+ h += '</ul></div>';
634
+ }
635
+ if(it.refs && it.refs.length){
636
+ h += '<div class="refs">参考:';
637
+ it.refs.forEach(function(r){ h += '<code>' + esc(r) + '</code> ' });
638
+ h += '</div>';
639
+ }
640
+ return h + '</div>';
641
+ }
642
+
643
+ function render(){
644
+ var all = DATA.items.concat(state.added);
645
+ var out = '';
646
+ DATA.phases.forEach(function(ph){
647
+ var list = all.filter(function(it){ return it.phase===ph.id && visible(it) });
648
+ var slots = (ph.id==="inbox");
649
+ var showPhase = (filter==="all") || (filter==="main" ? (ph.id==="p0" || ph.id==="p1") : filter==="core" ? (ph.id==="p0" || ph.id==="p1" || ph.id==="graph") : (filter===ph.id)) || slots;
650
+ if(!showPhase) return;
651
+ if(!list.length && !slots) return;
652
+ out += '<section class="phase" data-tone="' + ph.tone + '">';
653
+ out += '<div class="phead"><h2>' + esc(ph.title) + '</h2>';
654
+ if(ph.hint) out += '<span class="hint">' + esc(ph.hint) + '</span>';
655
+ out += '</div><div class="cards">';
656
+ list.forEach(function(it){ out += card(it) });
657
+ if(slots){
658
+ for(var i=0;i<6;i++){
659
+ out += '<div class="slot"><span>空位 ' + (i+1) + ' · 等一条新待办(群反馈 / ZCode 待办 / 你想到的)</span>' +
660
+ '<button class="btn" data-add="' + ph.id + '">+ 加一条</button></div>';
661
+ }
662
+ }
663
+ out += '</div></section>';
664
+ });
665
+ document.getElementById("mount").innerHTML = out;
666
+ document.getElementById("sub").textContent =
667
+ "数据源:MASTER-PLAN-3.0.md(总纲 v2)+ MERGE-CONFLICT-SCAN + ROUND3-REVIEW-INTEGRATION + WB-GRAPH 三份 + TODO-BACKLOG §0/§K/§L(更新 " + DATA.updated + ")· "
668
+ + "v2 开工顺序:P0 与白板最小适配边界 → P6A → P1 与 P6B → P2 → P3 → P4 → P5 · 白板线独立推进 · 虚线框是留给你加待办的空位";
669
+ }
670
+
671
+ function addItem(phaseId){
672
+ var title = prompt("新待办标题(例:群里反馈的「XX 面板不刷新」)");
673
+ if(!title) return;
674
+ state.added.push({ id:"NEW-" + Date.now(), phase:phaseId, title:title.trim(),
675
+ who:"你", status:"待排期", added:true, points:["(占位:细节待你补充,或我按群反馈整理)"] });
676
+ save(); render();
677
+ }
678
+
679
+ document.addEventListener("click", function(e){
680
+ var k = e.target.closest("[data-kill]");
681
+ if(k){ state.hidden.push(k.getAttribute("data-kill")); save(); render(); return }
682
+ var a = e.target.closest("[data-add]");
683
+ if(a){ addItem(a.getAttribute("data-add")); return }
684
+ var f = e.target.closest("[data-filter]");
685
+ if(f){
686
+ filter = f.getAttribute("data-filter");
687
+ [].forEach.call(document.querySelectorAll("[data-filter]"), function(b){ b.setAttribute("data-on", b===f ? "1":"0") });
688
+ render();
689
+ }
690
+ });
691
+
692
+ document.getElementById("exportBtn").addEventListener("click", function(){
693
+ var payload = { updated:new Date().toISOString().slice(0,10), added:state.added, hidden:state.hidden };
694
+ var txt = JSON.stringify(payload, null, 2);
695
+ var ta = document.getElementById("io");
696
+ ta.style.display = "block"; ta.value = txt;
697
+ try{ ta.select(); document.execCommand("copy") }catch(e){}
698
+ alert("已生成并尝试复制到剪贴板——把这整段贴给我即可。");
699
+ });
700
+
701
+ document.getElementById("resetBtn").addEventListener("click", function(){
702
+ if(!confirm("清空你加的待办与隐藏记录?(不动我原来写的内容)")) return;
703
+ state = {added:[],hidden:[]}; save(); render();
704
+ });
705
+
706
+ render();
707
+ })();
708
+ </script>
709
+ </body>
710
+ </html>