@a9i5k4/dsh-auto-memory 2.5.3 → 3.0.0

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 (104) hide show
  1. package/README.md +171 -1
  2. package/README.zh-CN.md +171 -1
  3. package/docs/CONTRIBUTORS.html +471 -0
  4. package/docs/HANDOFF-CRITERIA.md +92 -0
  5. package/docs/INTEGRATION-ANALYSIS.md +350 -348
  6. package/docs/USER-GUIDE.en.md +56 -1
  7. package/docs/USER-GUIDE.zh-CN.md +57 -2
  8. package/docs/internal/ACCEPT-35-LIVE.md +143 -0
  9. package/docs/internal/ACCEPTANCE-20260914.md +90 -0
  10. package/docs/internal/ARCH-REVIEW-BRIEF.md +411 -0
  11. package/docs/internal/ARCH-REVIEW-REQUEST.md +201 -0
  12. package/docs/internal/ARCH-REVIEW-ROUND2.md +169 -0
  13. package/docs/internal/ARCH-REVIEW-ROUND3.md +206 -0
  14. package/docs/internal/AUDIT-WB-GRAPH-FULL-20260916.md +314 -0
  15. package/docs/internal/CONCURRENCY-INVESTIGATION-20260917.md +192 -0
  16. package/docs/internal/CROSS-SESSION-SEARCH-PATH-DECISION.md +72 -0
  17. package/docs/internal/CROSS-SESSION-SEARCH-RESEARCH.md +131 -0
  18. package/docs/internal/DECISIONS-20260914-SESSION.md +269 -0
  19. package/docs/internal/DESIGN-P1-STATE-COMMIT-20260915.md +219 -0
  20. package/docs/internal/DIRECTION-CHECK-WB-GRAPH-20260916.md +132 -0
  21. package/docs/internal/FEEDBACK-TO-DSHAPI-RELAY.md +13 -0
  22. package/docs/internal/GH-DISCUSSION-5732-COMMENT.md +74 -0
  23. package/docs/internal/GPT-ACCEPTANCE-PROMPT-20260916.md +352 -0
  24. package/docs/internal/GPT-REVIEW-PROMPT.md +216 -0
  25. package/docs/internal/GROUP-WEBHOOK-SETUP.md +33 -0
  26. package/docs/internal/KICKOFF-P0.md +254 -0
  27. package/docs/internal/MASTER-PLAN-3.0.md +411 -0
  28. package/docs/internal/MEMORY-MUTATION-AND-INDEX-DESIGN.md +85 -0
  29. package/docs/internal/MERGE-CONFLICT-SCAN-20260914.md +222 -0
  30. package/docs/internal/PENDING-FIXES-20260916.md +289 -0
  31. package/docs/internal/RAG-KARPATHY-PROGRAM.md +229 -0
  32. package/docs/internal/REPORT-P0-NIGHTLY.md +212 -0
  33. package/docs/internal/REPORT-P5-ACCEPTANCE.md +31 -0
  34. package/docs/internal/REPORT-WB-GRAPH-NIGHTLY.md +153 -0
  35. package/docs/internal/REVIEW-WB-GRAPH-SELF.md +81 -0
  36. package/docs/internal/ROADMAP-20260917-WEEK.md +305 -0
  37. package/docs/internal/ROADMAP.md +106 -0
  38. package/docs/internal/RUN-P0-NIGHTLY.md +227 -0
  39. package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +175 -0
  40. package/docs/internal/S10-GAPS-PLAIN-20260917.md +125 -0
  41. package/docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md +360 -0
  42. package/docs/internal/SESSION-FILE-REPAIR-PROTOCOL.md +90 -0
  43. package/docs/internal/THREE-LAYER-CONTRACT.md +210 -0
  44. package/docs/internal/TODO-BACKLOG.md +263 -142
  45. package/docs/internal/TODO-GRAPH.html +715 -0
  46. package/docs/internal/TODO-GRAPH.html.bak-20260914-v2 +493 -0
  47. package/docs/internal/TODO-GRAPH.html.bak-20260915-alsfix +710 -0
  48. package/docs/internal/TODO-GRAPH.html.bak-20260915-p1 +710 -0
  49. package/docs/internal/TODO-GRAPH.html.bak-20260915-p6a-rev +703 -0
  50. package/docs/internal/TODO-GRAPH.html.bak-20260915-wshint +710 -0
  51. package/docs/internal/TODO-GRAPH.html.bak-20260916-batch +715 -0
  52. package/docs/internal/WB-FORMAT-CONVENTION.md +112 -0
  53. package/docs/internal/WB-GRAPH-DECISIONS-20260914.md +71 -0
  54. package/docs/internal/reviews/CLAIM-VERIFICATION-20260914.md +56 -0
  55. package/docs/internal/reviews/PLAN-gpt6astra-round2-20260914.md +787 -0
  56. package/docs/internal/reviews/REVIEW-gpt6astra-20260914.md +112 -0
  57. package/docs/internal/reviews/ROUND3-REVIEW-INTEGRATION-20260914.md +230 -0
  58. package/docs/prompts/M8-3-enable-verify.md +49 -49
  59. package/lib/acceptance.js +71 -0
  60. package/lib/activation-host.js +90 -9
  61. package/lib/activation-inbox.js +25 -7
  62. package/lib/board-mode.js +30 -0
  63. package/lib/client.js +878 -75
  64. package/lib/context-bridge.js +2 -2
  65. package/lib/context-host.js +70 -6
  66. package/lib/engine-identity.js +149 -0
  67. package/lib/engine-switch.js +247 -0
  68. package/lib/episodic-store.js +11 -10
  69. package/lib/evidence-store.js +2 -2
  70. package/lib/fact-store.js +1 -1
  71. package/lib/fs-retry.js +46 -0
  72. package/lib/index.js +1987 -153
  73. package/lib/intent-clean-safe.js +40 -0
  74. package/lib/intent-clean.js +12 -16
  75. package/lib/l0-extract.js +263 -149
  76. package/lib/l0-index-sync.js +195 -0
  77. package/lib/l0-index.js +349 -239
  78. package/lib/ledger-criteria.js +142 -0
  79. package/lib/m7-index-sync-host.js +65 -4
  80. package/lib/m7-wire.js +3 -3
  81. package/lib/memory-anchor.js +56 -1
  82. package/lib/memory-envelope.js +252 -0
  83. package/lib/memory-hub.js +14 -4
  84. package/lib/memory-mutation.js +246 -0
  85. package/lib/memory-writer.js +204 -24
  86. package/lib/procedure-observation.js +48 -0
  87. package/lib/procedure-store.js +34 -17
  88. package/lib/python-setup.js +1 -1
  89. package/lib/rerank-host.js +160 -0
  90. package/lib/rules-layer.js +261 -0
  91. package/lib/semantic-js.js +15 -0
  92. package/lib/shadow-retrieval.js +3 -3
  93. package/lib/state-commit.js +245 -0
  94. package/lib/subagent-gc.js +4 -8
  95. package/lib/tier-layer-inject.js +650 -0
  96. package/lib/tier0-catalog.js +693 -0
  97. package/lib/water-window.js +263 -186
  98. package/lib/wb-contract.js +495 -0
  99. package/lib/wb-sidecar.js +839 -0
  100. package/lib/ws-overview-rank.js +2 -2
  101. package/package.json +1 -1
  102. package/python/m7_embedding_v1.py +5 -5
  103. package/python/worker_semantic_v1.py +17 -6
  104. package/python/worker_v1.py +38 -4
@@ -0,0 +1,112 @@
1
+ # 白板格式约定(WB-FORMAT-CONVENTION)v1
2
+
3
+ > **效力**:白板/看板/handoff 账本的**格式与写入契约**。零代码,P0 级。任何改白板结构的实现(`lib/client.js` 渲染、sidecar schema、判据校验)都必须先符合本约定。
4
+ > **上位规范**:`SEMANTIC-ARCHITECTURE-SPEC.md` §8 与 **S10.1–S10.6**(wiki 层契约);接口与预算见 `THREE-LAYER-CONTRACT.md`。
5
+ > **边界(沿用既有拍板,不可越)**:**白板不建状态机**(只在"写入"一个门设防);不搬 dsh-graph 代码(只借范式);不引入跨目标依赖图;不复制 MRAgent 代码。
6
+ > **建立**:2026-09-14(用户批准 S10 后落地)。
7
+
8
+ ---
9
+
10
+ ## 1. 三种页面,三种时态
11
+
12
+ | 页面 | 时态 | 谁写 | 用途 |
13
+ | --- | --- | --- | --- |
14
+ | **PLAN 白板** | **现在时**(唯一事实) | 模型维护区 + 用户备注区 | 当前全貌、在做的事、卡在哪 |
15
+ | **handoff 账本** | 过去时(append-only 历史) | 模型 | 交接;其"任务状态"段**只指路**,不复制白板状态(消解双状态源) |
16
+ | **笔记(MEMORY.md / 日志)** | 累积时(知识) | 模型(自动沉淀) | 长期事实、决策、规则 |
17
+
18
+ **索引(index)不单独手写**:由上述页面**派生**(S10.2),与检索侧 Tier-0 目录同源。
19
+
20
+ ---
21
+
22
+ ## 2. 锚点契约(S10.1 落地)——**最重要的一条**
23
+
24
+ **规则**:白板页面里的每一个**卡片/小节**,必须在其标题行下方紧跟一行锚点:
25
+
26
+ ```markdown
27
+ ### 卡片标题
28
+ <!-- memory:mem_<32hex> -->
29
+ ```
30
+
31
+ - `id` 必须匹配 `^mem_[0-9a-f]{32}$`(与 L0 抽取的 `MEM_ANCHOR_RE` 完全一致)。
32
+ - **id 怎么算(内容寻址,可复算)**:`mem_` + `sha256(workspaceKey + '\u0000' + 页面相对路径 + '\u0000' + 卡片标题)` 的前 32 位十六进制。
33
+ → 卡片**重排/移动不影响 id**;**标题改名 = 新 id**(旧 id 走 supersede 留痕,不得默默消失)。
34
+ - **收益**:白板内容凭锚点**自动进入检索语料**(L0 抽取按锚点切条),无需任何新机制;同时白板保持"现在时视图"的定位,状态仍归记忆条目。
35
+ - **禁止**:手写裸 `mem_` 前缀的其他形态、复用同一个 id 指两个卡片、把锚点写在卡片正文中间。
36
+
37
+ ---
38
+
39
+ ## 3. 索引派生格式(S10.2)
40
+
41
+ 每条一行,供 Tier-0 目录与人读:
42
+
43
+ ```markdown
44
+ - [卡片标题](<页面路径>#mem_<32hex>) — 一句话摘要 · layer=whiteboard · status=current · 2026-09-14
45
+ ```
46
+
47
+ 派生规则:**同日多卡按白板内顺序**;`status` 取卡片状态(`current` / `superseded` / `retracted`);缺 `status` 视为 `current`(与 `isCurrentPre` 口径一致)。
48
+
49
+ ---
50
+
51
+ ## 4. 写入门("只在写入一个门设防")
52
+
53
+ 只做**一件事**:**重写前后比对卡片集合**。
54
+
55
+ - 允许:移动、改状态、改正文、加卡。
56
+ - 不允许:卡片**凭空消失**。要"消失"必须显式移入 `archived` 集合并留痕(时间 + 原因)。
57
+ - 违反 → 拒绝写入并报出差异清单(不是静默接受)。
58
+
59
+ ---
60
+
61
+ ## 5. 人机分区(B4 的解法)
62
+
63
+ 每张卡片分两区,**永不互相覆盖**:
64
+
65
+ ```markdown
66
+ ### 卡片标题
67
+ <!-- memory:mem_<32hex> -->
68
+ <!-- model -->
69
+ (模型维护:状态、进展、下一步)
70
+ <!-- /model -->
71
+ <!-- user -->
72
+ (你的备注;模型只读不改)
73
+ <!-- /user -->
74
+ ```
75
+
76
+ 模型整篇重写时**必须原样带回 `<!-- user -->` 段**。
77
+
78
+ ---
79
+
80
+ ## 6. lint 清单(S10.3)——试点期用这份逐条查
81
+
82
+ **零 token 可判的四类**(应做成自动检查,只读 + 留痕,不新增状态):
83
+
84
+ 1. **孤立条目**:无入站引用(没有任何其他卡片/笔记引用它的 id 或标题)。
85
+ 2. **陈旧**:`status=superseded|retracted`,或日期超出阈值仍标 `current`。
86
+ 3. **被提及却无独立卡**:正文反复提到的概念没有自己的卡片。
87
+ 4. **缺交叉引用**:相关卡片之间没有互链。
88
+
89
+ **需要 LLM 的一类(必须手动触发,不进自动路径)**:
90
+
91
+ 5. **矛盾检测**:两条卡片给出互相冲突的结论。
92
+
93
+ > 纪律:lint **只报告**,不自动改。任何自动修正都会把白板变成状态机(违反边界)。
94
+
95
+ ---
96
+
97
+ ## 7. 答案归档回流(S10.5)
98
+
99
+ 一次分析/检索的结论,必须能**一键**沉淀为:① 白板新卡(带锚点),或 ② 记忆条目(`memory_note_pre`),或 ③ handoff 账本一条。
100
+
101
+ **判据**:任何"只活在对话里"的结论,都算流程不合格——知识复利就断在这里。
102
+
103
+ ---
104
+
105
+ ## 8. 验收清单(能失败)
106
+
107
+ - [ ] 白板每张卡都有合法锚点(正则校验通过),**且由页面派生出的 index 与 Tier-0 目录条目一致**。
108
+ - [ ] 故意删掉一张卡 → 写入被拒并报出差异(**丢卡可检出**)。
109
+ - [ ] 卡片重排后 id 不变;改标题后 id 变且旧 id 有 supersede 留痕。
110
+ - [ ] 模型整篇重写后,`<!-- user -->` 段逐字节保留。
111
+ - [ ] 造一个孤立条目 → lint 报出;造一对矛盾结论 → lint(手动触发时)报出。
112
+ - [ ] 上述每一条都在 `tests/smoke/` 有对应套件,且**故意改坏实现时会红**。
@@ -0,0 +1,71 @@
1
+ # WB-GRAPH 拍板点 · 一页纸(2026-09-14 整理)
2
+
3
+ > **用途**:把散在 `WB-GRAPH-INTEGRATION-PLAN.md`(386 行)里的决策点集中到一页,你**直接在"结论"列写 yes/no 或回我一句**即可。
4
+ > **来源**:方案 §8(8 点)+ §10(看板化 7 点);**你的方向已定**:把看板/流程图 **combine 进自己的白板**,让用户实时看到进展与整个项目的流程(= §10 的看板化)。
5
+ > 状态约定:✅ 已定 / 🎯 待拍板 / ⏸ 冻结后再说。**P0-P1 不等这些拍板点,可立即做。**
6
+
7
+ ---
8
+
9
+ ## A. 方案 §8 的 8 个拍板点
10
+
11
+ | # | 问题 | 选项 | 方案建议 | 影响 / 代价 | 结论 |
12
+ | --- | --- | --- | --- | --- | --- |
13
+ | A1 | **P2/P3 是否立项** | 立项 / 等冻结解除 / 不做 | P0-P1 立即做;**P2-P3 等后端冻结解除后按方案执行** | P2/P3 都改 `lib/index.js` 本体,冻结期内禁改引擎 | 🎯 |
14
+ | A2 | **sidecar 位置** | `memoryRoot/<ws>/handoff/` vs 工作区 `.dsh-memory/handoff/` | **前者**(与现有 handoffDir 同目录;GUI 白名单只放行 `.json`,备份/迁移自动覆盖) | 选错则备份/迁移要另写规则 | 🎯 |
15
+ | A3 | **静态纪律是否随下一版一次性更新** | 更新 / 不更新 | **更新**(把判据纪律写进固定 section,而不只在工具描述里) | 代价:全量会话一次缓存重建 | 🎯 |
16
+ | A4 | **工具命名** | `memory_expand_pre`/`memory_trace_pre`(对齐现有 14 工具 `*_pre` 惯例)vs 任务书直译 `expand_tag`/`trace_back` | **前者** | 命名一旦发布就难改(对外契约) | 🎯 |
17
+ | A5 | **是否进 2.6.0** | P0-P1 进 2.6.0 / 全部等 2.7.x | **P0-P1 进 2.6.0;P2-P3 进 2.7.x**(工具数变化 + 存储格式新增,宜独立回归窗口) | 影响发版节奏与回归范围 | 🎯 |
18
+ | A6 | **P1 水位骨架硬判据失败策略** | 照写 + 警示行 / 跳过写入 | **照写 + 警示行**(优先保证接续材料存在) | 跳过写入更"干净"但接续会缺材料 | 🎯 |
19
+ | A7 | **PLAN 判据强度** | 维持自由节名 + 最弱硬判据 P-H1 / 固定 PLAN 小节集 | **维持自由节名**(P7 老化和"全貌图"用途依赖节名灵活性) | 固定小节集会削弱老化机制 | 🎯 |
20
+ | A8 | **P2-6 条目锚点是否做** | 做 / 不做 | **做**(它是"按 id 展开"的地基;+30 行) | 涉及锚点写法与 `sanitizeReservedSyntax` 豁免约定 | 🎯 |
21
+
22
+ ---
23
+
24
+ ## B. 看板化(§10)的 7 个待解点 —— 你已定方向,这些必须一起解决
25
+
26
+ | # | 问题 | 方案给的解法 | 我的补充建议 | 结论 |
27
+ | --- | --- | --- | --- | --- |
28
+ | B1 | **丢卡风险(最严重)**:白板是整篇重写,看板丢卡 = 任务蒸发 | sidecar 重写前后**卡片集合对比**(只能移动/完成,不能消失)→ **看板化使 P2 从"可选"变"刚需"** | 与 P0-④ 的 `supersede` 同源:**任何"消失"都要留痕** | 🎯(P2 顺位因此上调) |
29
+ | B2 | **旧卡撑爆截断**:`carryText` 第 0 层 `slice(0,3000)` 被已完成卡挤占 | 列顺序约定 + 完成卡归档;**P7 老化(按标题关键词)对看板列名失配,需升级为列感知** | 归档 = 移到 sidecar 的 `archived` 集合,白板只留活跃卡 | 🎯 |
30
+ | B3 | **卡片腐烂**:状态漂移误导接续 | 卡片带接续链 `contSeq` 时间轴 + 刷新仪式逐卡对状态 + 僵尸卡注入时打过期标记 | 复用现有 `cont-seq.json` | 🎯 |
31
+ | B4 | **人机冲突(核心新问题)**:你改卡 vs 模型整篇重写互相覆盖 | (a) 只读 (b) 卡 id + 接口合并(依赖 P2-6,工程最大)(c) **卡片分「模型维护区 / 用户备注区」** | **从 (c) 起步**,稳定后再评估 (b) | 🎯 |
32
+ | B5 | **双状态源**:账本四段与看板并存 | 看板 = 现在时(唯一事实)、账本 = 过去时(历史);账本「任务状态」段改为指路 | 写进判据,由 P1 中间件校验 | 🎯 |
33
+ | B6 | **多任务混板** | 卡带接续链标记(Cue/contSeq),新窗口只展开自己链 | 与 §3 的 Cue 设计闭环 | 🎯 |
34
+ | B7 | **节奏** | P0 级零成本验证:**先出看板格式约定文档,真实工作区试两周**(模型守格式?接续取任务顺不顺?)再定 P1/P2 | 同意先试点 | 🎯 |
35
+
36
+ ---
37
+
38
+ ## C. 我的推荐组合(你只需说"按推荐来"或指出要改的点)
39
+
40
+ 1. **A1**:P0-P1 立即;**A5**:P0-P1 进 2.6.0,P2-P3 进 2.7.x;**A2/A4/A6/A7/A8** 均按方案建议。
41
+ 2. **B4 从 (c) 起步**(模型维护区 + 用户备注区),**B7 先试点两周**;**B1 使 P2 顺位上调**(与 P0-④ 的 supersede 同源,可同版实现)。
42
+ 3. 界面渲染属 `lib/client.js`(**冻结外**),可与大排期合流;**引擎侧(P2/P3)等冻结解除**。
43
+
44
+ ## D. 拍完我就做什么
45
+
46
+ | 拍板结果 | 立即动作 | 工程量 |
47
+ | --- | --- | --- |
48
+ | 按推荐 | ①写 `docs/HANDOFF-CRITERIA.md` 判据约定(P0,零代码)②实现 P1 判据校验中间件(≈190 行,咽喉 `writeHandoffLedger`/`writePlanSnapshot`)+ 回归(**工具数不变**) | 半天~1 天 |
49
+ | 允许 P2/P3 | 按方案 §5 改动清单执行(sidecar + 两工具;**工具数 14→16,三处测试硬锁同步**:`smoke-test.mjs:67` / mapi-paths 等) | 约 2 天 |
50
+ | 看板化 | 出「看板格式约定文档」→ 真实工作区试两周 → 再定交互方案 (a/b/c) | 试点期 |
51
+
52
+ ---
53
+
54
+ ## E. 2026-09-16 凌晨拍板结果(本轮已定,覆盖上方 🎯)
55
+
56
+ | # | 结论 | 备注 |
57
+ | --- | --- | --- |
58
+ | A1 | ✅ **P2/P3 立项**(用户选「立项」) | 3.0 主体收官,引擎冻结实质解除 |
59
+ | A2 | ✅ sidecar 放 `memoryRoot/<ws>/handoff/`(按建议) | |
60
+ | A3 | ✅ 静态纪律随下一版一次性更新(按建议) | |
61
+ | A4 | ✅ 工具命名 `memory_expand_pre`/`memory_trace_pre`(按建议) | |
62
+ | A5 | ✅ P0-P1 与 P2-P3 分期(按建议) | |
63
+ | A6 | ✅ 硬判据失败照写+警示行(按建议) | |
64
+ | A7 | ✅ PLAN 维持自由节名+最弱硬判据 P-H1(按建议) | |
65
+ | A8 | ✅ 条目锚点做(按建议) | |
66
+ | B4 | ✅ **裁定变更:搬 dsh-graph 接管看板层**(用户原话:「MIT协议说明可以直接将它的插件搬过来。按照原来的调研,直接让他接管记忆白板。让用户可以实时、可视化地看到项目从立项到现在的所有流程、弯路、版本更迭等事无巨细的信息;同时也可以让 AI 看到,作为接续的重要参考之一」) | 实测 v0.11.0 兼容性后用户拍板;**覆盖原「只借范式不搬代码」的自设边界**——MIT(`dsh-graph-host/LICENSE`)允许搬代码;MRAgent 无 LICENSE 的零复制约束不变。兼容性实测:Windows 原生 OK(v0.11 修复)、cordis 标准接线(name/inject/apply)、40 个 `graph_*` 工具与 14 个 `memory_*` 零重名、存储 `.dsh-graph/` 与 `memoryRoot/` 不重叠、运行时零 `@deepseek-ai/*` 硬 import |
67
+ | B7 | ✅ **跳过试点期直接实装**(用户原话:「跳过试点,直接实装,有bug,用户自然会报」) | WB-FORMAT-CONVENTION v1 已批准为实装依据,验收清单能失败断言兜底 |
68
+ | P1 范围 | ✅ **P1 全量**:判据校验中间件(两咽喉 ≈190 行)+ 锚点实装(A8)+ 丢卡门(B1)+ 静态纪律(A3),工具数不变 | 用户选「P1 全量(推荐)」 |
69
+ | 看板层 | ✅ dsh-graph 搬入接管:用户实时可视化全流程(立项/弯路/版本更迭)+ AI 可见作为接续参考 | 与 P1 判据门并行:P1 管写入质量,dsh-graph 管可视与流程展示 |
70
+
71
+ **立即动作序列(本窗口)**:①P1 判据校验中间件 + 锚点 + 丢卡门(`writeHandoffLedger`/`writePlanSnapshot` 两咽喉)→ ②dsh-graph v0.11.0 搬入(vendor 到本仓库 + profile 接线)→ ③全量回归 + 留痕 → 明晨交 GPT 验收。
@@ -0,0 +1,56 @@
1
+ # 主张核实结论表 · 2026-09-14
2
+
3
+ > **用途**:第一轮外部评审(`docs/internal/reviews/REVIEW-gpt6astra-20260914.md`)A 节列出的 12 条「文件:行号」主张,逐条对照**当前代码**核实后的结论。
4
+ > **这是第二轮投喂的输入之一**:告诉对方哪些主张**已被证实**(可当前提)、哪些**行号有误但实质成立**、哪些是**架构级必改项**。
5
+ > **核实方式**:只读核实(读文件 + grep),未修改/创建/删除任何文件,未运行任何测试,未执行 git 写操作。
6
+ > **我方独立复核**:C8(最严重的一条)已由本会话自行打开 `tests/smoke/smoke-test-c5-tier-inject-pre.mjs:115-137` 与 `docs/internal/THREE-LAYER-CONTRACT.md:178-189` 逐行复核确认。
7
+
8
+ ---
9
+
10
+ ## 结论摘要
11
+
12
+ **12 / 12 条成立**(真 10 + 部分真 2),**假 0 条,无法判定 0 条。**
13
+
14
+ - **行号有误但实质成立**:C5(`125` 是函数签名行,实际行为在 `126–127`;`138` 正确)、C10(`323` 是注释行,实际行为在 `327–335`)。
15
+ - **行号在可接受范围**(指向路径首行/字面量首行,非错引):C9(`3894` 守卫首行,复用赋值在 `3896`、拼装在 `3901`)、C12(`149` 为 `FIELDS` 字面量首行,条目在 `150–157`)。
16
+ - 其余 8 条行号与当前文件逐一一致。
17
+
18
+ **因此:第一轮评审不是「看着像真」,是真的。其 A1–A3 应按事实指控处置,而非按意见讨论。**
19
+
20
+ ---
21
+
22
+ ## 逐条核实表
23
+
24
+ | 编号 | 判定 | 证据(当前文件:行号) | 说明 |
25
+ |---|---|---|---|
26
+ | **C1** | 真 | `lib/semantic-js-pre.js:60` | `fused: D6_FUSION_WEIGHTS_PRE_V1.dense * denseN + D6_FUSION_WEIGHTS_PRE_V1.lexical * lexN`;`denseN`/`lexN` 由 `normOf` 归一化(:46–51)⇒ 确为**归一化分数空间加权**,与 S3.2「禁止分数空间加权」相悖。 |
27
+ | **C2** | 真 | `python/worker_semantic_pre_v1.py:486`;调用点 `:907` | `:486 \| c['fusedScore'] = round(w * dn + (1 - w) * ln, 6)`(`dn`/`ln` 来自 `:479–481` 的 `_minmax`);`:907 \| candidates = self.hybrid_rank(candidates, query, …)`。两行号均准。 |
28
+ | **C3** | 真 | `lib/context-host-pre.js:378` | `keptList = fuseD6Pre([...poolMap.values()].map((k) => ({ …`)—— JS 侧 D6 加权的唯一生产调用点。 |
29
+ | **C4** | 真 | `lib/activation-inbox-pre.js:255` | `const sorted = [...items].sort((a, b) => b.score - a.score \|\| …)`;`items` 的 `score` 源自 `c.score`(`:357`),JS 路径=裸稠密分(`context-host-pre.js:505`)、Python 路径=裸 `c['score']`(worker `:637`)⇒ **融合序在尾注渲染时被重排覆盖**。 |
30
+ | **C5** | **部分真** | `lib/l0-index-pre.js:126–127`(主张写 125,实为函数签名行);`:138` 正确 | `:126 texts = items.map(it => it.l0)`、`:127 await embedder.embedPassages(texts)` ⇒ **先全量嵌入**;`:138 const reused = prev && prev.l0Hash === l0Hash` 才判复用(`:141` 应用)。「增量不省嵌入算力」**实质成立**;`update → assemble(:213)` 对全部 items 嵌入。 |
31
+ | **C6** | 真 | `lib/l0-index-pre.js:219` | `recomputed: changed,`;`changed` 在 `:204–210` 按 `l0Hash` 分类计数(新增/变化),**与实际嵌入次数(`items.length`)不同**。(`:179` 的 `buildFull` 路径才是 `recomputed: entries.length`。) |
32
+ | **C7** | 真 | `python/m7_embedding_pre_v1.py:75` | `def chunk_id_for(memory_id, record_digest, ordinal)`,哈希串含 `record_digest`(`:77`);调用处 worker `:317`/`:338` 传入整条 `rec['recordDigest']`(来源 `memory-anchor-pre.js:131`/`:211`)⇒ **改一个块则整条记录所有块 ID 全变**,块级复用无从谈起。 |
33
+ | **C8** | 真 | `tests/smoke/smoke-test-c5-tier-inject-pre.mjs:127,133`;契约 `docs/internal/THREE-LAYER-CONTRACT.md:183` | `:127` 放入 `status: 'superseded'` 候选;`:133 eq(lines.length, 3, 'Tier-1 条数=命中数(≤K)')` 断言三条**全留**;`:137` 更显式断言 `lines[2]`(即那条 superseded)带 `0.55` 分。I5 原文(契约 `:183`):**「非 `current` 的条目在检索结果与注入内容两处都被过滤」** ⇒ **我方测试把违反 I5 的现状锁成了正确行为**。本会话已逐行独立复核确认。 |
34
+ | **C9** | 真 | `lib/index.js:3894`(守卫首行)、`:3895`、`:3896`、`:3901` | `:3894 fresh = !!gh && Date.now() - gh.at < 30*60000`(**只查时间**)、`:3895` 只查 session、`:3896` 直接复用 `gh.hits`、`:3901` 与**当前** sources 拼装;`_tierGateHits` 投影本身不含 `miv`(`activation-host-pre.js:151–165`)⇒ 全路径**无处比对 `miv`**,I6(契约 `:184`「三层来自同一份快照(同一 `miv`),混版视为错误」)失守。(若按"复用赋值行"口径,正确行号是 `:3896`。) |
35
+ | **C10** | **部分真** | `lib/tier-layer-inject-pre.js:327–335`(主张写 323,实为注释行) | `:323` 只是注释「只裁下探段,目录层与降级行永不裁」;实际裁剪循环在 `:329` 仅 `lines.pop()`(`drillParts`),`headParts`(目录+降级行)从不动;`:332–334` 在裁剪**之后**把 `[降级] 下探段超注入预算,已裁剪 N 行…` push 进 `headParts`,`:336` 拼入 `text` ⇒ **最终长度可超 `maxTotal`**。 |
36
+ | **C11** | 真 | `lib/index.js:3986` | `const catalogCost = s.tier0LayerText ? Math.min(String(s.tier0LayerText).length + 2, Math.floor(budget * 0.35)) : 0` —— 封顶的是 **35% 的扣账成本**(供 `:3987` 的 `sub` 计算);实际注入用全文 `s.tier0LayerText`(`:3957`),**不参与 `used` 记账** ⇒ 账面与实际双口径。 |
37
+ | **C12** | 真 | `tests/smoke/smoke-test-doc-code-consistency-pre.mjs:149–157` | `const FIELDS = [` 下恰好 **7 项**:`l0IndexEnabled` / `tier0CatalogEnabled` / `injectBudgetChars` / `tier0MaxTokens` / `tier0BudgetShare` / `B0` / `B2`(`:150–157`;`TRACKED_NAMES:89` 同七项);`TIER_BUDGET_PRE_V1`(`tier-layer-inject-pre.js:32–40`)里的 **`L1` / `K` / `projectRatio` / `floorRatio` / `maxTier2Blocks` 均未覆盖**。 |
38
+
39
+ ---
40
+
41
+ ## 必须进施工方案的 5 项(架构级,非测试写法)
42
+
43
+ 1. **C5 + C6 ·「增量索引」名实不符**:`assemble` 每次全量 `embedPassages`,`recomputed` 又是"变化计数"而非真实编码次数 ⇒ 要么做**真增量**(只嵌入 hash 变化的条目),要么把指标改成诚实口径。**否则 3.0 的「增量索引」是空头承诺。**
44
+ 2. **C7 · 块 ID 含整条 `recordDigest`** ⇒ **块级向量缓存必须先改成按「块内容摘要」做键**,否则 3.0 目标④「块级向量缓存」根本无法兑现。
45
+ 3. **C9 · I6 失守**:命中投影不带 `miv`,跨版本复用旧命中并与当前 sources 拼装 ⇒ 投影需带 `miv`,并在 compose 处比对(**属接口改动**)。
46
+ 4. **C11 + C10 · 预算账本双口径**:扣账成本被 35% 封顶、目录却按全文注入;裁剪之后又追加降级行 ⇒ **`injectBudgetChars` 目前不是硬上限**,需收敛为单一口径记账。
47
+ 5. **C1 / C2 / C4 · 排序语义未定**:minmax 分数空间融合(D6)+ 尾注按裸 `score` 重排 ⇒ 必须先裁定「**融合分是否决定展示顺序**」,并与 `lib/recall-fusion-pre.js` 的 rank-space RRF **存并取舍**一并解决。
48
+
49
+ ---
50
+
51
+ ## 第二轮如何使用本表(纪律)
52
+
53
+ - 本表中判**真 / 部分真**的条目,在第二轮提示词里**直接认证为事实**,要求对方**不必再论证**,只需给出落地方案——省下的篇幅全部用于 Phase 设计与验收断言。
54
+ - 判**部分真**的两条(C5、C10),第二轮须显式给出**修正后的行号**,并要求对方按修正后的位置写改动点。
55
+ - 对方在第二轮若**重新引用已被本表修正的行号**或**把本表已认证的事实重新论证一遍**,视为未承接,退回。
56
+ - 对方若**指出本表某条核实有误**,必须写明"我方哪一步错了"(读了哪个文件的哪一行、得出什么相反结论);接受反驳,但反驳同样要落到 `文件:行号`。