@a9i5k4/dsh-auto-memory 3.0.0 → 3.1.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 (116) hide show
  1. package/README.md +30 -13
  2. package/README.zh-CN.md +30 -13
  3. package/docs/FRONTEND-CO-CREATION.md +191 -0
  4. package/docs/GM53-HOMEPAGE-PROMPT.md +323 -0
  5. package/docs/HANDBOOK.md +88 -52
  6. package/docs/HOMEPAGE-CONTENT-FOR-GM53.md +299 -0
  7. package/docs/PROMO-PROMPT-3.0.md +100 -0
  8. package/docs/USER-GUIDE.en.md +11 -11
  9. package/docs/USER-GUIDE.zh-CN.md +11 -11
  10. package/docs/WHITEPAPER.md +207 -0
  11. package/docs/screenshots/promo/promo-0-banner-v3.png +0 -0
  12. package/docs/screenshots/promo/promo-0-banner-v4.png +0 -0
  13. package/docs/screenshots/promo/promo-1b-auto-recall.png +0 -0
  14. package/lib/activation-host.js +69 -10
  15. package/lib/board-mode.js +1 -1
  16. package/lib/client.js +1697 -285
  17. package/lib/config-io.js +156 -0
  18. package/lib/context-bridge.js +3 -0
  19. package/lib/context-host.js +23 -10
  20. package/lib/degrade.js +385 -0
  21. package/lib/dsh-home.js +143 -0
  22. package/lib/episodic-store.js +142 -18
  23. package/lib/evidence-store.js +8 -1
  24. package/lib/fact-store.js +484 -43
  25. package/lib/hub-io.js +217 -0
  26. package/lib/index-sync.js +13 -1
  27. package/lib/index.js +1730 -202
  28. package/lib/intent-clean-safe.js +258 -40
  29. package/lib/l0-extract.js +231 -16
  30. package/lib/m4-corpus.js +8 -2
  31. package/lib/m7-index-sync-host.js +8 -1
  32. package/lib/memory-envelope.js +6 -1
  33. package/lib/memory-hub.js +164 -17
  34. package/lib/memory-index.js +4 -2
  35. package/lib/note-status-apply.js +118 -0
  36. package/lib/note-status.js +204 -0
  37. package/lib/procedure-store.js +333 -31
  38. package/lib/procedure-switch.js +38 -0
  39. package/lib/python-sidecar-client.js +314 -11
  40. package/lib/recall-fusion.js +83 -12
  41. package/lib/rules-edit.js +159 -0
  42. package/lib/semantic-decide.js +41 -8
  43. package/lib/semantic-js.js +51 -6
  44. package/lib/shadow-host.js +3 -5
  45. package/lib/skill-export-host.js +153 -0
  46. package/lib/skill-export.js +239 -0
  47. package/lib/storage-manage.js +6 -0
  48. package/lib/temporal-parse.js +191 -159
  49. package/lib/tier0-catalog.js +45 -3
  50. package/lib/wb-contract.js +198 -2
  51. package/lib/wb-sidecar.js +54 -3
  52. package/package.json +6 -2
  53. package/docs/internal/ACCEPT-35-LIVE.md +0 -143
  54. package/docs/internal/ACCEPTANCE-20260914.md +0 -90
  55. package/docs/internal/ARCH-REVIEW-BRIEF.md +0 -411
  56. package/docs/internal/ARCH-REVIEW-REQUEST.md +0 -201
  57. package/docs/internal/ARCH-REVIEW-ROUND2.md +0 -169
  58. package/docs/internal/ARCH-REVIEW-ROUND3.md +0 -206
  59. package/docs/internal/ART-DIRECTION-WIREFRAME.md +0 -181
  60. package/docs/internal/AUDIT-WB-GRAPH-FULL-20260916.md +0 -314
  61. package/docs/internal/CONCURRENCY-INVESTIGATION-20260917.md +0 -192
  62. package/docs/internal/CROSS-SESSION-SEARCH-PATH-DECISION.md +0 -72
  63. package/docs/internal/CROSS-SESSION-SEARCH-RESEARCH.md +0 -131
  64. package/docs/internal/CUA-VISION-FIX-NOTES.md +0 -78
  65. package/docs/internal/DECISIONS-20260914-SESSION.md +0 -269
  66. package/docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md +0 -292
  67. package/docs/internal/DESIGN-P1-STATE-COMMIT-20260915.md +0 -219
  68. package/docs/internal/DIRECTION-CHECK-WB-GRAPH-20260916.md +0 -132
  69. package/docs/internal/FEEDBACK-TO-DSHAPI-RELAY.md +0 -13
  70. package/docs/internal/GH-DISCUSSION-5732-COMMENT.md +0 -74
  71. package/docs/internal/GPT-ACCEPTANCE-PROMPT-20260916.md +0 -352
  72. package/docs/internal/GPT-REVIEW-PROMPT.md +0 -216
  73. package/docs/internal/GROUP-DIGEST-SETUP.md +0 -62
  74. package/docs/internal/GROUP-LISTENER-SETUP.md +0 -49
  75. package/docs/internal/GROUP-WEBHOOK-SETUP.md +0 -93
  76. package/docs/internal/HANDOFF-TO-ZCODE.md +0 -168
  77. package/docs/internal/KICKOFF-P0.md +0 -254
  78. package/docs/internal/MASTER-PLAN-3.0.md +0 -411
  79. package/docs/internal/MEMORY-MUTATION-AND-INDEX-DESIGN.md +0 -85
  80. package/docs/internal/MERGE-CONFLICT-SCAN-20260914.md +0 -222
  81. package/docs/internal/NEXT-VERSION-TODO.md +0 -95
  82. package/docs/internal/OFFICIAL-DISCUSSION-DRAFT.md +0 -80
  83. package/docs/internal/PENDING-FIXES-20260916.md +0 -289
  84. package/docs/internal/RAG-KARPATHY-PROGRAM.md +0 -229
  85. package/docs/internal/RELEASE-PROCESS.md +0 -99
  86. package/docs/internal/REPORT-P0-NIGHTLY.md +0 -212
  87. package/docs/internal/REPORT-P5-ACCEPTANCE.md +0 -31
  88. package/docs/internal/REPORT-WB-GRAPH-NIGHTLY.md +0 -153
  89. package/docs/internal/REVIEW-WB-GRAPH-SELF.md +0 -81
  90. package/docs/internal/ROADMAP-20260917-WEEK.md +0 -305
  91. package/docs/internal/ROADMAP.md +0 -106
  92. package/docs/internal/RUN-P0-NIGHTLY.md +0 -227
  93. package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +0 -175
  94. package/docs/internal/S10-GAPS-PLAIN-20260917.md +0 -125
  95. package/docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md +0 -360
  96. package/docs/internal/SESSION-FILE-REPAIR-PROTOCOL.md +0 -90
  97. package/docs/internal/SUBAGENT-REPORT-ROUTING-PRE-RESEARCH.md +0 -261
  98. package/docs/internal/THREE-LAYER-CONTRACT.md +0 -210
  99. package/docs/internal/TODO-BACKLOG.md +0 -263
  100. package/docs/internal/TODO-GRAPH.html +0 -715
  101. package/docs/internal/TODO-GRAPH.html.bak-20260914-v2 +0 -493
  102. package/docs/internal/TODO-GRAPH.html.bak-20260915-alsfix +0 -710
  103. package/docs/internal/TODO-GRAPH.html.bak-20260915-p1 +0 -710
  104. package/docs/internal/TODO-GRAPH.html.bak-20260915-p6a-rev +0 -703
  105. package/docs/internal/TODO-GRAPH.html.bak-20260915-wshint +0 -710
  106. package/docs/internal/TODO-GRAPH.html.bak-20260916-batch +0 -715
  107. package/docs/internal/WB-FORMAT-CONVENTION.md +0 -112
  108. package/docs/internal/WB-GRAPH-DECISIONS-20260914.md +0 -71
  109. package/docs/internal/WB-GRAPH-INTEGRATION-PLAN.md +0 -386
  110. package/docs/internal/WB-GRAPH-RESEARCH-BRIEF.md +0 -118
  111. package/docs/internal/WB-GRAPH-RESEARCH-EXTERNAL.md +0 -228
  112. package/docs/internal/WB-GRAPH-RESEARCH-LOCAL.md +0 -190
  113. package/docs/internal/reviews/CLAIM-VERIFICATION-20260914.md +0 -56
  114. package/docs/internal/reviews/PLAN-gpt6astra-round2-20260914.md +0 -787
  115. package/docs/internal/reviews/REVIEW-gpt6astra-20260914.md +0 -112
  116. package/docs/internal/reviews/ROUND3-REVIEW-INTEGRATION-20260914.md +0 -230
@@ -1,227 +0,0 @@
1
- # RUN-P0-NIGHTLY · 过夜施工运行日志
2
-
3
- > **这是什么**:KICKOFF §6.2 要求的持续追加运行日志。压缩会吃掉思考过程,但吃不掉写进文件的结论。
4
- > **读法**:接续/被压缩后,先读本文件恢复进度,再继续施工。
5
- > **纪律**:客观陈述(第三人称中性句式),只留可复用的事实/决策/路径,不写思考腔。
6
-
7
- ---
8
-
9
- ## [00:20] 接续仪式 + 环境确认
10
-
11
- - 目标:接续上一窗口(已按接续键),恢复上下文并按 KICKOFF 开工。
12
- - 做了:
13
- - 读 `docs/internal/KICKOFF-P0.md`(254 行,第一份指令)。
14
- - 按 §2 找接续转写包:`~/.dsh/memory/workspaces/--D--dsh-auto-memory--/handoff/prev-session-session--160615.md`(75497 字节,2026-09-15 00:06:15,最新一份)。
15
- - 读 `MASTER-PLAN-3.0.md`(§0.5 v2 修订 + §0–§3.5)与 `reviews/ROUND3-REVIEW-INTEGRATION-20260914.md`(230 行,全部三处我方错误 + 六处设计修正 + 断言编号)。
16
- - 结果:确认工作区 `main` 分支、110 项未提交改动(含约 98 个用户工作状态文件);全量基线待复测。
17
- - 卡住:无。
18
- - 下一步:跑红证明 → 修 C8。
19
-
20
- ## [00:26] 第一步 · C8 红证明复现(修复前)
21
-
22
- - 目标:按 KICKOFF §3.1 先确认缺陷真实存在(不是推测)。
23
- - 命令:`node tools/_redproof/red-proof-phase0-t01.mjs`
24
- - 结果:**0 通过 / 4 报红,exit 1**。实测四条全红:
25
- - `superseded 条目不出现在 Tier-1 注入行` RED
26
- - `retracted 条目不出现在 Tier-1 注入行` RED
27
- - `非 current 正文不出现在最终文本` RED
28
- - `Tier-1 条数 = current 命中数(2) —— 实际 4` RED
29
- - 判读:契约 I5(`THREE-LAYER-CONTRACT.md:183`)在**注入侧**从未实现;检索侧(C2)早已过滤。
30
- - 根因(读码确认):`lib/tier-layer-inject-pre.js:buildTier1SectionPre` 把 `h.status` 当**展示字段**渲染进 `- [layer/status]` 前缀,**从不做准入判断**。
31
- - 卡住:无。
32
- - 下一步:在装配器入口(闸门之前)加 current 过滤。
33
-
34
- ## [00:35] 第一步 · C8 修复完成(注入侧 I5 状态过滤)
35
-
36
- - 目标:让非 current 条目在注入侧被挡下,并让红证明转绿。
37
- - 改了:
38
- - `lib/tier-layer-inject-pre.js:filterCurrentHitsPre`(**新增导出**)—— 复用检索侧唯一权威
39
- `import { isCurrentPre } from './l0-extract-pre.js'`(**import 而非复制**:复制会让两侧漂移)。
40
- - `lib/tier-layer-inject-pre.js:composeTieredInjectionPre` —— 在**闸门之前**过滤(顺序关键:
41
- 放闸门后会让"全是 superseded"仍下探并渲染空段);新增 `status-filtered` 降级项;
42
- 返回体新增 `hits`(过滤账:kept/dropped/total/current/droppedCount/droppedIds)。
43
- - `tests/smoke/smoke-test-c5-tier-inject-pre.mjs:127/133/137` —— **改掉锁死错误现状的断言**,
44
- 并附注释说明原断言违反 I5、证据是红证明 4 报红。原 `lines[2].includes('0.55')` 用的是被挡下的
45
- superseded 条目,改为**真正乱序输入**独立验证降序。
46
- - 结果:
47
- - `red-proof-phase0-t01.mjs` ⇒ **4 通过 / 0 报红,exit 0**。
48
- - `smoke-test-c5-tier-inject-pre.mjs` ⇒ pass=90 fail=0。
49
- - `smoke-test-three-layer-pre.mjs` ⇒ pass=122 fail=0(无连带破坏)。
50
- - 卡住:无。
51
- - 下一步:把红证明移进 `tests/smoke/` 成为正式套件。
52
-
53
- ## [00:45] 第一步 · 红证明入正式套件 + 演示变红
54
-
55
- - 目标:KICKOFF §3.1 第 3/4 条 —— 转绿后移入 `tests/smoke/`,并遵守
56
- 「新增守卫必须演示变红后再按字节还原」纪律。
57
- - 改了:新增 `tests/smoke/smoke-test-i5-status-filter-pre.mjs`(7 组 44 断言)。
58
- 保留原红证明 4 条判据,另补:取值域(缺失/空放行、未知值 fail closed)、
59
- 与检索侧同函数逐值对照、过滤在闸门之前、挡下不静默且**不回显被挡条目正文与 id**、
60
- 接线可达性、以及「开关不能撤掉共同保护」(过滤在 `enabled` 开关**之前**执行)。
61
- - **定向变异验证**:把 `isCurrentPre(h)` 改成 `true` ⇒ 套件 **12 条报红**;
62
- 随后按字节还原,SHA256 `A1C0CF8A9630C4677764EB5CBA4138046A49D2063303C06921F8EEB620591CA3`
63
- 前后一致(`RESTORED_BYTE_EXACT=True`)。
64
- - 结果:新套件 pass=44 fail=0。
65
- - 卡住:无。
66
- - 下一步:跑全量回归确认基线(预期 80 套件)。
67
-
68
- ## [01:05] 全量回归(C8 修复后)
69
-
70
- - 命令:`node tools/run-smoke.mjs`
71
- - 结果:**PASS 80 / FAIL 0 / TIMEOUT 0,total 160.1s,exit 0**。
72
- - 判读:套件数 79 → **80**(新增 `smoke-test-i5-status-filter-pre.mjs`),符合 KICKOFF §3.1 第 4 条预期。
73
- - 卡住:无。
74
- - 下一步:第二步 T0-2 版本校验。
75
-
76
- ## [01:25] 第二步 · T0-2 版本校验完成
77
-
78
- - 目标:命中投影复用**不得只凭时间**(旧 `lib/index.js:3894` 只查 `Date.now()-at<30min`,
79
- 且身份取不到时 **fail open**)。
80
- - 改了:
81
- - `lib/tier-layer-inject-pre.js:selectReusableTierHitsPre`(新增)+ `describeReuseReasonPre`
82
- + `TIER_HITS_REUSE_REASONS_PRE_V1` —— 五道门:时间 / 会话 / 工作区 / **版本(contextVersion + miv)** /
83
- 观测身份。凡不能证明同版同源 ⇒ fail closed 不复用;原因码全部有可读中文。
84
- - `lib/activation-host-pre.js:recordTierGateHits` —— 投影补 `contextVersion / miv / observationId /
85
- requestKey / workspaceKey`(T0-2 要求携带版本四元组)。
86
- - `lib/index.js:buildTierLayerInjection` —— 删掉旧的 `fresh` / `sameSession` 判定,改调版本门;
87
- 不复用时追加**可见**降级行(I7),并把复用账写进 `tier0Meta.reuse`。
88
- - `lib/index.js:tierCurrentMivPre`(新增)—— 当前 miv 的**零重读**实现:只用 `sourceFingerprint`
89
- (`size:mtimeMs`)判变化,**不调 `CorpusRegistry.get()`**(后者在指纹变化时会整体重读重建语料,
90
- 不能放在每轮热路径上);60 秒缓存,异常一律返回 null(下游 fail closed)。
91
- - `lib/activation-inbox-pre.js:makeFakeActivationRequestPre` —— fixture 支持 `status` 与 `requestKey`。
92
- - 结果:新增 `tests/smoke/smoke-test-t0-2-version-gate-pre.mjs` **pass=68 fail=0**。
93
- 含核心场景「A 快照产生候选、B 快照准备输出 ⇒ 必须不复用(混装即失败)」。
94
- - **定向变异验证**:把三道版本门改成恒假 ⇒ 套件 **8 条报红**;按字节还原后 SHA256 前后一致。
95
- - 首跑踩坑(已留痕在测试注释):两条接线断言**假红** —— 正则命中了注释里刻意保留的旧实现片段。
96
- 修正方式:先剥注释再匹配(本文件成为"源码接线守卫 ≠ 行为断言"纪律的又一实例)。
97
- - 卡住:无。
98
- - 下一步:第三步 T0-3 预算单一口径。
99
-
100
- ## [01:55] 第三步 · T0-3 预算单一口径完成(模块层 + 接线)
101
-
102
- - 目标:把注入预算改成**分项账本**(v2 §3.3 选 (ii)),消灭两处实测缺陷。
103
- - 改了:
104
- - **新增 `lib/memory-envelope-pre.js`**:`composeMemoryEnvelopePre` + `describeEnvelopeCharsPre`。
105
- 三条不变式各有能红断言:E1 `chars.total === text.length`(逐字节)、
106
- E2 分项之和 = 总计(**不允许未计费尾巴**)、E3 分项上限是硬约束且**裁剪永远可见**。
107
- `rules` 不参与裁剪(显式传上限也会被忽略并留痕);`over-budget-total` 如实记录代价
108
- (v2 要求"不许用记账写法掩盖")。
109
- - `lib/tier-layer-inject-pre.js:composeTieredInjectionPre` —— 修总长门两处:降级行**先计入 head
110
- 长度**再裁、裁完**真正回写** headParts、head 自身超预算时输出 `headOverBudgetChars` 显式超额行;
111
- 新增 `textChars / maxTotalChars / claimedTotalChars / headOverBudgetChars` 四个可审计字段。
112
- 第一版实现漏了回写(降级行没进文本),靠 `claimed === len` 自检抓到 —— 已写进代码注释。
113
- - `lib/index.js:renderMemoryDynamic` —— 从 `lines[] + join('\n')` 改为**边推边归位**的 `segs[]`,
114
- 交给分项账本计量与序列化;删掉 35% 封顶的 `catalogCost` 与注水的 `used`;
115
- 目录层按**实际注入全文长度**计入 `memoryReferences`;`otherDynamicBudgetChars` 按 v2
116
- "未配置时以 `Bm` 作派生初值、不另设魔数"实现;账本挂 `state.envelopeMeta`;
117
- 超限降级行附在快照尾部(不静默)。
118
- **字节等价**:`join('\n')` ≡「首段无前缀 + 其余各加 `\n`」拼接;`neutralizePromptTemplateVars`
119
- 改为逐段施加(`{{`→`{{` 是 1:1 等长替换,逐段与整篇结果相同)。
120
- - 结果:新增 `tests/smoke/smoke-test-t0-3-budget-ledger-pre.mjs` **pass=64 fail=0**;
121
- `smoke-test-c5-tier-inject-pre.mjs` 90/90(旧的总长门断言由红转绿)。
122
- - 连带修正(两条,非行为回归,已留注释):
123
- - `smoke-test-i5-status-filter-pre.mjs` 的接线断言原写死**单行**调用文本,T0-3 给该调用补了
124
- `extraDegradations` 并改多行 ⇒ 改为断言**参数语义**(hits 确实作为实参传入)。
125
- - `smoke-test-t0-3-budget-ledger-pre.mjs` 的 `envelope.chars.total` 断言改为 `envelope.chars`
126
- (`total` 在同一表达式里,断言更贴实现)。
127
- - **连带回归(我引入的,已修)**:
128
- 1. `error: runtime B survived dispose`(`smoke-test-context-observer.mjs` P3f)——
129
- 我在 `buildTierLayerInjection` 里对 `runtimeFor(agent)` 取值;该方法底层
130
- `SessionRuntimeStore.get()` **找不到时会新建并重新登记**,于是在 `await` 之后
131
- **复活了已 dispose 的 runtime**。这正是本项目硬纪律写死的那条坑。
132
- 修法:新增**只读**的 `MemoryEngine.peekRuntime` / `SessionRuntimeStore.peek`(绝不创建),
133
- 注入路径改用它。
134
- 2. `ReferenceError: composeMemoryEnvelopePre is not defined`(`smoke-test-handoff-pre.mjs` G4)——
135
- `renderMemoryDynamic` 现在依赖分项账本模块,而该套件用 `new Function` **抽源码跑**,
136
- 作用域里没有这个符号。修法:把 `lib/memory-envelope-pre.js` 源码一并注入(剥 `export `)。
137
- 这不是"测试迁就实现"——抽取式测试本来就要显式提供该函数依赖的全部模块级符号。
138
- 3. `Error: unbalanced: renderMemoryDynamic(context) {` —— 我在注释里写了裸 ASCII **双花括号**,
139
- 而该套件的 `extractFn` 靠**花括号配平**切函数体。修法:注释改为文字描述
140
- (不写裸双花括号),并把这条坑写进注释本身。
141
- - 卡住:无。
142
- - 下一步:第三步完成后跑全量;然后第四步(写入门 + 白板最小适配边界)。
143
-
144
- ## [02:05] 第四步 · 写入门 + 白板最小适配边界完成(T0-8 / T0-8B / T0-8C)
145
-
146
- - 目标:把 `WB-FORMAT-CONVENTION.md` §4 的写入门与 §5 的人机分区**真正实现**
147
- (事故根因是"规范已批准、代码从未实现":实际 `PLAN.md` 一个锚点、一个分区标记都没有)。
148
- - **边界(总纲 §0.5 / ROUND3 §3.1 定案)**:3.0 主体拥有共同提交与保护入口;白板线拥有白板格式及适配器。
149
- - 改了:
150
- - **新增 `lib/memory-mutation-pre.js`**:`validateMutationBoundaryPre`(**只收规范化投影**
151
- `{beforeIds, afterIds, protectedRegions, afterProtectedRegions, archivedIds}`,**零白板格式知识**)
152
- + `validateProjectionPairPre` + `mutationRefusalTextPre` + `protectedRegionDigestPre`。
153
- 三条**无条件**保护:**M1** 丢卡(消失必须显式归档,否则拒写并报差异清单)/ **M2** 用户区
154
- (摘要逐字节比对;**省略 afterProtectedRegions = fail closed**)/ **M3** 重复 id。
155
- - **新增 `lib/wb-contract-pre.js`**:`parseWhiteboardPre`(锚点 / 卡片 / 人机分区 / 状态解析)
156
- + `computeWhiteboardCardIdPre`(A8 预授权默认值:`mem_` + sha256(wsKey+NUL+页路径+NUL+标题) 前 32 位)
157
- + `extractProtectedRegionsPre` + `toMutationProjectionPre`(唯一桥)
158
- + **同模块内置判据门** `checkHandoffCriteriaPre`(H1–H4/S1–S4)/ `checkPlanCriteriaPre`
159
- (P-H1/P-H2/P-S1)+ `criteriaRefusalTextPre`(格式只维护一份)。
160
- - `lib/index.js`:新增 `checkMutationPre`(**判据门在前、保护门在后**,顺序有意为之:
161
- 质量门可退、保护门不可退);`writePlanSnapshot` / `writeHandoffLedger` 各加 `opts` 并接入;
162
- 水位骨架降级路径(A6 预授权默认值 = **照写 + 警示行**)走 `skipCriteria:true`,
163
- **只跳判据门、遇保护门拒绝时绝不绕过**;工具层对两类拒绝都返回**原始可执行文案**;
164
- 新增配置 `criteriaGate: true`。
165
- - 结果:新增 `tests/smoke/smoke-test-t0-8-mutation-gate-pre.mjs` **pass=110 fail=0**。
166
- 含 T0-8B(三条写入路径都不能绕过共同保护,源码接线守卫)、T0-8C(**关掉质量门后仍拒绝丢卡**)、
167
- 以及"判据不能张冠李戴"的反证(把账本判据套给 PLAN 会误拒 ⇒ 证明归属必须分开)。
168
- - **定向变异验证**:把 M1/M2 改成恒通过(=回到"写入门从未实现"的旧行为)⇒ **15 条报红**;
169
- 按字节还原后 SHA256 前后一致。
170
- - 连带修正(签名扩展,非行为回归):`smoke-test-handoff-pre.mjs` 与 `smoke-test-p7-write-fix-pre.mjs`
171
- 用**签名字符串**抽取函数 ⇒ 同步为 `(projectDir, content, opts)`;并给假引擎补
172
- `checkMutationPre` 恒过桩(门本身由 T0-8 套件专测,接线由 T0-8B 锁)。
173
- - 中途一次**操作失误**(已留痕):变异演示脚本里第二处替换目标写错了文件,
174
- 脚本以 `!!! MUT2 NOT APPLIED` 退出并留下一个未还原的 `.bak-mut`。已立即还原两文件并按 SHA256
175
- 确认无残留,随后重做变异演示(这次先在 `memory-mutation-pre.js` 内精确定位字符串)。
176
- - 卡住:无。
177
- - 下一步:第五步 P6A。
178
-
179
- ## [02:40] 第五步 · P6A 注入表达与节奏完成
180
-
181
- - 目标:修**用户最痛的病**——「规矩不在场 / 规矩被降格为"只是参考"」。
182
- - 改了:
183
- - **新增 `lib/rules-layer-pre.js`**:`extractRulesLayerPre`(两级判定:结构化前缀=高置信 /
184
- 约束语汇=中置信)+ `renderRulesSectionPre` + `splitMemoryEntriesPre` + `ruleSummaryPre`。
185
- **遵守 v2 的真源纪律**:规则真源=**既有用户级记忆**里的类型化规则,**不新增 `RULES.md`**。
186
- **遵守 T7-4 的 v2 修订**:含「必须」但带引用/历史语境(`据文档写着` / `曾经` / `已取消`…)
187
- **不得自动升级为规则**,只产生「待确认候选」——GPT 给的两个反例已写成断言。
188
- - `lib/index.js`:`DEFAULT_PROMPT_LAYERS` 新增 `snapshotRulesTitle` / `snapshotRulesGuide`
189
- (**约束语**措辞,与参考段的"参考"语义**不同**);新增 `renderRulesOnlySnapshotPre`;
190
- `renderMemoryDynamic` 把规则段以 `rules` 分项**排在最前**(在开场白/状态行之后、一切参考内容之前);
191
- 新增配置 `rulesLayeringMode: 'off'`(**默认关** = 新旧并存 + 一键回退)。
192
- - **节奏三处**(ROUND3 §3.3 Q3c,逐条落实):
193
- ① `snapshotMinGapRounds` 默认 **5 → 1**;
194
- ② **新增 `parseGapRoundsPre`** 修零值解析(旧 `Number(v) || 5` 让 **0 无法表达**);
195
- ③ **节流分支不再跳过整份快照** —— 改为 `return rulesOnlyText + renderReflectionRequest()`,
196
- 即"**先提供规则段,再对参考内容应用 gap**"。
197
- - 结果:新增 `tests/smoke/smoke-test-p6a-rules-layer-pre.mjs` **pass=94 fail=0**。
198
- 含 T7-1(连续 6 轮规则都在 —— 在**能测的范围内**测注入函数返回值,并如实标注"模型真收到"需 U6)、
199
- T7-3(规则与参考引导语**必须不同**)、T7-4 修订(两个反例 + 反面:真规则仍要认)、
200
- T7-6(前缀字节稳定;**不冒充**缓存命中)、T7-7(规则以 `rules` 分项进账本 + 代码里不存在对 rules 的裁剪)。
201
- - **首跑抓到一个真实实现缺陷**:`ruleSummaryPre` 最初直接用 `firstLine`,而既有记忆条目结构是
202
- 「锚点 → `## 日期` → 正文」⇒ 规则行被渲染成 `- ## 2026-08-14`(**规则内容全丢,只剩日期**)。
203
- 修法:新增 `ruleSummaryPre` 跳过日期小节标题与锚点行。
204
- - **定向变异验证**:三点变异(取消引用语境降级 / 引导语改回"只是参考" / 摘要退回读首行)
205
- ⇒ **11 条报红**;按字节还原后 SHA256 前后一致。
206
- 期间发现断言不够健壮(`candidates[0].confidence` 在变异后会抛 TypeError 让套件崩掉、
207
- 只剩一条红报告)⇒ 改为防御式取值,让"能红"不退化成"能崩"。
208
- - 卡住:无。
209
- - 下一步:全量回归 + 收尾汇报。
210
-
211
- ## [03:00] 全量回归 + 字节卫生 + 收尾
212
-
213
- - 命令:`node tools/run-smoke.mjs`
214
- - 结果:**PASS 84 / FAIL 0 / TIMEOUT 0,total 154.0s,exit 0**。
215
- 套件数 79 → **84**(新增 i5 / t0-2 / t0-3 / t0-8 / p6a 五个套件)。
216
- - 守卫:`node artifacts/verify-todo-graph.mjs` exit 0(47 卡);
217
- `smoke-test-doc-code-consistency-pre.mjs` 44/0;`red-proof-phase0-t01.mjs` 4/4 绿。
218
- - **字节卫生事故与修复**:`tests/smoke/smoke-test-handoff-pre.mjs` 在编辑后变成 **CRLF**
219
- (KICKOFF §8 第 6 条要求 `lib/*-pre.js` 与测试为 LF)⇒ 已逐字节转回 LF(315 bareLF / 0 CRLF)
220
- 并复跑套件(53/0)确认内容未损。
221
- 全仓复核:`lib/index.js` CRLF ✓、新模块(memory-envelope / memory-mutation / wb-contract /
222
- rules-layer)均为 LF ✓、新测试均 LF ✓、**全部改动文件无 BOM** ✓。
223
- (备注:本仓换行实际是**混合**的——`lib/index.js`、`lib/client.js`、`activation-*`、
224
- `context-*` 等为 CRLF,`handoff-anchor-pre.js`、`tier-layer-inject-pre.js` 等为 LF;
225
- 纪律的实质是"**不改变既有文件的换行形态**",本次未对任何既有文件改换行。)
226
- - 卡住:无。
227
- - 下一步:按 KICKOFF §7 输出完整汇报(含"最值得让 GPT 审的三个点")。
@@ -1,175 +0,0 @@
1
- # 施工交接 · S10 四缺口全量改(2026-09-17 02:3x)
2
-
3
- > **给谁看**:压缩后的下一个窗口(我),以及用户本人。
4
- > **状态**:**未开工**。用户已拍板「四个缺口全量改」,但决定**先推送一次文档更新,明天再改代码**。
5
- > **上游依据**:`ROADMAP-20260917-WEEK.md` §3.5(技术版,带行号)· `S10-GAPS-PLAIN-20260917.md`(大白话版)。
6
-
7
- ---
8
-
9
- ## 一、用户已拍板的决定(不要重开议题)
10
-
11
- | # | 决定 | 原话/口径 |
12
- |---|---|---|
13
- | 1 | **四个缺口全量改**(不是"标注未实现",是真做) | 「我决定了,四个缺口都全量改」 |
14
- | 2 | **缺口 4 的第⑤类(矛盾检测)走「主代理每轮收尾写记忆时顺带做」** | 「不是 subagent 的自动沉淀,是每轮对话的收尾写记忆的时候可以更新白板状态」 |
15
- | 3 | 该时机下 **LLM 介入是合法的** | 用户自己推断,**已核实成立**(见 §四) |
16
- | 4 | **先推送一次文档更新,明天再改代码** | 「我压缩之后先推送一次更新,明天再改剩下的」 |
17
- | 5 | 图片等前端重构后再改 | 前轮已定 |
18
-
19
- ---
20
-
21
- ## 二、四个缺口 + 现状(全部已代码核实)
22
-
23
- ### 缺口 1(P0)· 锚点写入被 `boardMode` 门控,默认不生效
24
-
25
- - 默认值 `boardMode: 'legacy'` —— `lib/index.js:219`
26
- - 锚点写入被门控:`:1988`(PLAN)、`:2032`(账本);sidecar 直接早退 `:2076`
27
- - **⇒ 默认配置下 S10.1「页面即语料」整条链不启动**
28
-
29
- **改法(用户已认可方向)**:**把锚点写入与 `boardMode` 解耦**。
30
- 理由:锚点是**记录格式**,看板是**显示样式**,本不该耦合。**不要改默认值**(会牵动老用户)。
31
- ⚠️ 实施注意:解耦后需确认 sidecar 写入口径 —— `writeSidecarEntryPre` 的早退(`:2076`)与锚点写入是两件事,**要分别判断**是否都该解耦。
32
-
33
- ### 缺口 2(P0)· 白板进「注入」但不进「检索」
34
-
35
- - 注入 ✅ `index.js:4701` `add('whiteboard', s.planText, s.planPath)` → Tier-0 目录(五来源之一,有保底配额)
36
- - 检索 ❌ `pushL0` 四来源(`:5505-5508`)与 `semSources` 四来源(`:5704-5707`)**均无白板**
37
- - **⇒ 白板每轮被注入,但 `memory_recall` 搜不到**
38
-
39
- **改法**:两处各补一条白板来源。`p.planPath` 变量**已存在**(`:4701` 在用)。
40
- ⚠️ 注意配额:`tier0-catalog-pre.js` 的 `floorLayers=['whiteboard','user']` 是 Tier-0 侧的;**L0 检索侧是否需要同类保护要一并判断**,否则白板可能又被 `project` 挤掉。
41
-
42
- ### 缺口 3 · 索引派生(S10.2)——**不是没做,是没输出成契约那一行**
43
-
44
- 契约要的那行(`WB-FORMAT-CONVENTION.md:44`):
45
- ```
46
- - [卡片标题](<页面路径>#mem_<32hex>) — 一句话摘要 · layer=whiteboard · status=current · 2026-09-14
47
- ```
48
-
49
- **已有的家底(关键!别重复造)**:
50
- - `rebuildSidecarIndexPre`(`wb-sidecar-pre.js:363`)**真在派生索引**,产出 `entries` + `by_tag` + `by_cue` + `versions`
51
- - 每条 entry 已有 `id`(`mem_`+sha256 前 32 位,`:78-83`)、`source`(页面路径)、`title`、`section`、`preview`(前 120 字)、`tags`、`cues`、`kind`、`mtime`、`ts`
52
- - **锚点 id 与 sidecar id 同源**:`applyAnchorsPre:501` 调的就是 `wbEntryIdPre`
53
- - `renderCatalogLinePre`(`tier0-catalog-pre.js:316`)已在渲染 `标题 · 摘要 · layer · status · 日期`
54
-
55
- **缺的只有**:① 没拼成契约那一行的字面格式 ② entry 无 `status` 字段 ③ entry 无 `layer` 字段
56
-
57
- **改法(已定的设计)**:**不做成独立文件**(那会新增状态源,违反 S10.4「不建状态机」)。
58
- 改为:**同一次派生、两种渲染** —— 让 `renderCatalogLinePre`(或新增同源渲染函数)在有页面路径时输出**带链接形态**。
59
- ⇒ 契约 §8 验收项「派生出 index 与 Tier-0 条目一致」**天然成立**,因为就是同一份数据。
60
-
61
- ### 缺口 4 · lint(S10.3)——五类,前四类纯函数、第五类走纪律
62
-
63
- 契约清单(`WB-FORMAT-CONVENTION.md:80-93`):
64
-
65
- | 类 | 内容 | 难度 | 做法 |
66
- |---|---|---|---|
67
- | ① | 孤立条目(无入站引用) | ★ 低 | 扫全部卡正文,找是否引用过其 id/标题 |
68
- | ② | 陈旧(`status≠current`,或超阈值仍 current) | ★ 极低 | 状态 + 日期比较 |
69
- | ③ | 被提及却无独立卡 | ★★ 中 | **判据模糊,需先定阈值/词典** |
70
- | ④ | 缺交叉引用 | ★★ 中 | **"相关"判据要先定** |
71
- | ⑤ | 矛盾检测 | ★★★ | **需 LLM → 走 §四 的纪律方案** |
72
-
73
- **形态(硬约束)**:`lintWhiteboardPre(entries) → 问题清单`,**只读、只报告、绝不写盘**。
74
- 契约 §6 尾注:「任何自动修正都会把白板变成状态机(违反边界)」。
75
-
76
- ---
77
-
78
- ## 三、缺口 4⑤ 的纪律方案(用户的核心思路)
79
-
80
- ### 结论:**合法**,且比"造一条 LLM 通路"便宜一个量级
81
-
82
- 三条理由(已核实):
83
- 1. **契约只禁"自动路径"**:§6 原文「需要 LLM 的一类(**必须手动触发,不进自动路径**)」。而「每轮收尾主代理写记忆」**不是自动路径** —— 是主代理在环的有意识判断,与人工触发同性质。
84
- 2. **工具通道现成**:`memory_note_pre(kind=plan)` 就是写白板的口子(`index.js:543` 的 `snapshotPlanTitle` 已告知模型"内容过时可用它重写"),且**过判据门 + 保护门**(`:1939`/`:2020`),丢卡会被拦。
85
- 3. **白板本就是"模型维护区"**:契约 §5 人机分区已规定模型写哪段。
86
-
87
- ### 但**必须先解决的前提**(实测)
88
-
89
- **当前 `GUIDANCE` 对白板零覆盖** —— 逐字扫过:
90
- ```
91
- 白板 no PLAN no kind=plan no handoff no 账本 no
92
- ```
93
- `GUIDANCE`(`index.js:143`,**845 字符 ≈ 423 token**)是每轮注入的记忆纪律,**详列了各 memory_* 工具,唯独没提白板**。
94
- ⇒ **模型被明确要求"做记忆",但从未被要求"维护白板"。这才是白板腐烂的真因 —— 不是模型偷懒,是纪律里没这条。**
95
-
96
- ### 所以要做的:「扩写 `GUIDANCE`」(用户说的"固化文档")
97
-
98
- **零新增管线** —— 它本来就每轮注入,加几十字符即可。
99
-
100
- ### 三条设计要点(**必须守住**)
101
-
102
- **① 写成「条件触发」,不是「每轮都做」**
103
- 否则每轮改白板 → 噪声 + token 浪费。
104
- 措辞方向:「**当本轮产生与白板既有结论冲突的信息、或完成了白板上的目标时**,用 `memory_note_pre(kind=plan)` 更新」。
105
-
106
- **② 必须写明「只报告、不自动删」**
107
- 契约 §6 尾注为硬纪律。否则模型会把"清理白板"理解成"删卡片" → 违反 §4 写入门(会被拒,但模型会反复试)。
108
-
109
- **③ 白板关闭时不得有副作用**
110
- `handoffEnabled=false` 时白板不读不写(`:3581`、`:3615` 已有解耦处理)。
111
- 纪律里须说明「白板未启用时跳过」,否则模型会去找不存在的 PLAN.md。
112
-
113
- ### 已纠正的数字误记
114
-
115
- 用户说的「默认 10000」**不是注入预算**:
116
- - `SECTION_ORDER = 10000`(`index.js:137`)是**注入顺序** —— 末尾注入,让模型最后读到、遵循度高
117
- - 真实注入预算是 `injectBudgetChars = 8000`(本机配置实测)
118
- - **但用户直觉指对了位置**:那个"最后读到"的位置,正是放纪律最合适的地方
119
-
120
- ---
121
-
122
- ## 四、明天动手顺序(5 步,已排定)
123
-
124
- | 步 | 缺口 | 难度 | 备注 |
125
- |---|---|---|---|
126
- | 1 | **缺口 2** 白板进检索 | ★ 很低 | 补两行,变量现成,收益最大 |
127
- | 2 | **缺口 1** 锚点解耦 | ★★ 低 | 拿掉 `boardMode` 壳,**要跑回归** |
128
- | 3 | **缺口 3** 索引派生 | ★ 低 | 纯函数,同源两渲染 |
129
- | 4 | **缺口 4①②④** lint | ★★ 中低 | 只读纯函数;③ 判据待定 |
130
- | 5 | **缺口 4⑤ + 白板纪律** | ★★ 低 | 扩写 `GUIDANCE`;依赖前几步(纪律要能引用索引/lint 判据) |
131
-
132
- **顺序理由**:⑤ 放最后,因为它要在纪律里引用前面做出来的东西。
133
-
134
- ---
135
-
136
- ## 五、实施纪律(沿用本仓既有传统)
137
-
138
- 1. **改前备份**:`*.bak-YYYYMMDD-<tag>`
139
- 2. **改后 `node --check`**(`lib/index.js` 是 CRLF 大文件,注意 edit 的 `replace_all` 命中计数)
140
- 3. **跑全量回归**:基线 **PASS 105 / FAIL 0 / TIMEOUT 0(160.5s)**(`node tools/run-smoke.mjs`)
141
- 4. **写新套件**:每个缺口配可失败断言;**变异演示**要真红(把机制改回旧行为,测试必须失败)
142
- 5. **无 BOM**;大文件分块写
143
- 6. **代码留 pre 线**,未获明确同意不 commit/push
144
- 7. **host 代码改完只告知用户自行重启**,严禁 Stop/Start-Process
145
-
146
- ### ⚠️ 本轮要新增的纪律(前几轮踩出来的)
147
- - **引用行号前必须回读确认**(本次曾把 `:2062` 误记 `:2361`)
148
- - **workflow 脚本先自查变量定义与 `return`**(本次 7 个 agent 白跑)
149
- - **契约文档措辞像"已完成说明",引用前必须 grep 真实调用链** —— 有调用点才算已实现
150
-
151
- ---
152
-
153
- ## 六、本轮已完成、可安全推送的部分(纯文档)
154
-
155
- | 文件 | 内容 |
156
- |---|---|
157
- | `README.md` / `README.zh-CN.md` | 顶部按钮行换 for-the-badge 徽章;新增 5 个技术段(三层下探 / Karpathy 模块 / 唤起度 / 三级部署 / 交接工程);含「⚠️ 实现边界」如实标注 |
158
- | `docs/USER-GUIDE.zh-CN.md` / `.en.md` | 顶部徽章 + 返回链接;版本号 `2.2.7+`→`3.0+`;新增 §13「3.0 底层重建」5 小节 |
159
- | `docs/internal/ROADMAP-20260917-WEEK.md` | 新增 §3.5 缺口审计(技术版) |
160
- | `docs/internal/S10-GAPS-PLAIN-20260917.md` | 缺口大白话版(本文档的上游) |
161
- | 本文档 | 施工交接 |
162
-
163
- **推送注意**:
164
- - 当前 `package.json` 版本 = **2.5.2**,pre 线 HEAD = `746a4ae`,工作区 **247 项改动**(其中 201 未跟踪)
165
- - 远端 `main` = `43c5492`(本轮礼节性 merge 后的位置)
166
- - **推送策略已由用户裁定**:远端 merge 属礼节性,最终以**本机版本强制覆盖**
167
- - 推送前须确认:**README 图片引用未动**(用户指示等前端重构)
168
-
169
- ---
170
-
171
- ## 七、未决 / 待用户拍板
172
-
173
- 1. **lint 第③类(被提及却无独立卡)的判据** —— 「什么算概念」「几次算反复」需用户定;判据不清会是误报源。
174
- 2. **lint 第④类(缺交叉引用)的"相关"判据** —— 同上。
175
- 3. **白板纪律的具体措辞** —— 待我出草案(明天第 5 步)。
@@ -1,125 +0,0 @@
1
- # S10 缺口总账 · 大白话版(2026-09-17 02:2x)
2
-
3
- > **给谁看**:用户本人 + 压缩后的下一个窗口。
4
- > **一句话**:契约文档写得像"已经做完了",但代码里有些地方**根本没接线**。下面逐条讲人话 + 怎么改。
5
- > **来源**:`docs/internal/ROADMAP-20260917-WEEK.md` §3.5(技术版,带行号)。
6
-
7
- ---
8
-
9
- ## 先说好消息:接续(handoff)是好的
10
-
11
- 你让我"尤其看接续",我逐环节查了,**8 个环节全部真接线**,而且比文档给人的印象更扎实:
12
-
13
- | 你以为可能坏的地方 | 实际情况 |
14
- |---|---|
15
- | 水位满了会不会真写交接笔记? | ✅ 会写(`index.js:2789`) |
16
- | 四段式格式有没有真的强制? | ✅ 真强制,两个写入口都过同一道门(`:2302`) |
17
- | 新会话**真的**收得到交接材料吗? | ✅ 真收到(`:3118` 组装 → `:3144` 投递) |
18
- | 旧会话会不会还在跑(两会话并行)? | ✅ 已先停旧回合(`:3099` `sc.cancel`)——这正是 PR #37 争论那个点,你自己那套是对的 |
19
- | 新会话在侧栏是无名会话吗? | ✅ 已命名「接续 #N · 工作区」(`:3129`) |
20
-
21
- **顺带一个实测**:我写交接账本时**真被那道四段式门拦了一次**(报"标题不逐字匹配")。所以这机制是活的,不是纸上的。
22
-
23
- **结论:接续不用改。**
24
-
25
- ---
26
-
27
- ## 六个真缺口(人话版)
28
-
29
- ### 缺口 1 ·「锚点」写了,但默认配置下根本不写
30
-
31
- **这是什么**:白板卡片要带一个"锚点"标记(`<!-- memory:mem_xxxx -->`),有了它这张卡才能被当一条记忆用。
32
-
33
- **问题**:写锚点的代码被一个开关管着——只有把 `boardMode` 设成 `graph`(看板模式)时才写。而**默认值是 `legacy`**(老式文字白板)。
34
-
35
- ⇒ **装了插件、没手动切模式的人,白板卡片永远没有锚点**,契约里承诺的"白板即语料"从头就没启动。
36
-
37
- **证据**:默认值 `index.js:219`;锚点写入被门控 `:1988`(PLAN)、`:2032`(账本)、`:2076`(索引)。
38
-
39
- **怎么改**(我建议这个):**把锚点写入跟看板模式解耦**。
40
- 理由:锚点是**"记录格式"**,看板是**"显示样式"**——不该绑在一起。就像"文章要不要编号"不该取决于"你是横排还是竖排看"。
41
- 不必改默认值(那会牵动老用户)。
42
-
43
- ---
44
-
45
- ### 缺口 2 · 白板内容"每轮都喂给 AI",但**搜不到**
46
-
47
- **这是什么**:记忆有两条路进 AI:① 每轮自动喂一点(注入)② 你主动搜(`memory_recall`)。
48
-
49
- **问题**:白板只通了第 ①条,第 ②条**从来没接**。
50
- - 注入 ✅:`index.js:4701` 把白板列为五个来源之一
51
- - 检索 ❌:`pushL0` 的四个来源、`semSources` 的四个来源(`:5505-5508`、`:5704-5707`)**都只有日志/反思/笔记/用户记忆,没有白板**
52
-
53
- ⇒ **结果**:你在白板上写的目标、判据、结论,AI 每轮都能"看到";但你哪天问"我之前在白板上记过啥",**搜不出来**。
54
-
55
- **怎么改**:在 `pushL0` 和 `semSources` 各**补一行白板来源**(`p.planPath` 这个变量已经存在,现成的)。这是六个缺口里**最小、最值**的一改。
56
-
57
- ---
58
-
59
- ### 缺口 3 ·「索引自动生成」——只有文档,没代码
60
-
61
- **这是什么**:契约说要把白板内容自动生成一个"目录索引"(每行 = 链接 + 一句话 + 层级),方便 AI 导航。
62
-
63
- **问题**:`indexMd` / `renderIndex` / `buildIndexMd` / `index.md` **全仓 0 命中**。**纯口号。**
64
-
65
- **怎么改**:两条路选一条 ——
66
- (a) 补实现(工作量中等);(b) **在契约文档里如实标"未实现"**,降级成待办。
67
- **送审前至少要选 (b)**,否则就是"文档说有、代码没有"。
68
-
69
- ---
70
-
71
- ### 缺口 4 ·「lint 检查」——同样只有文档,没代码
72
-
73
- **这是什么**:契约说要有 4 类自动检查:孤立条目 / 陈旧 / 提到却没有独立页 / 缺交叉引用(外加"矛盾检测"要手动点)。
74
-
75
- **问题**:`lint` 全仓只出现 11 次,而且**没有任何一个是函数定义**。剩下 4 处是**注释在说"这个留着给 lint 用"**——lint 本体不存在。
76
-
77
- **怎么改**:同缺口 3,补实现或**如实标注未实现**。这两条(3、4)是同一性质:**契约级空头承诺**。
78
-
79
- ---
80
-
81
- ### 缺口 5 · 账本"不用保护"——注释和代码互相矛盾
82
-
83
- **这是什么**:有一条"保护门"专门防止重写时**丢掉用户手写的段落**。
84
-
85
- **问题**:代码里对"交接账本"这个目标**直接放行**(`index.js:2313` `return { ok: true }`),
86
- 而**三处注释都写着这道门"无条件生效"**(`:2062`、`:2308`、`:332`)。
87
-
88
- **影响**:目前**实际危害小**(账本是每次都新建文件,不涉及"覆盖旧文件",本来就没有丢卡的场景)。
89
- 但**注释骗人**这件事本身是缺陷 —— 万一以后改成"账本可覆盖",这里就是个静默漏洞。
90
-
91
- **怎么改**:改注释说清"账本不适用"(最省),或真把保护门补上。
92
-
93
- ---
94
-
95
- ### 缺口 6 · 一堆写了但没人用的函数
96
-
97
- **问题**:四个模块里合计 **40 个导出函数,在 `index.js` 里从来没被调用过**:
98
- `wb-contract-pre.js` 12 个、`wb-sidecar-pre.js` 16 个、`ledger-criteria-pre.js` 7 个、`memory-mutation-pre.js` 5 个。
99
-
100
- **注意**:**不能断言都是死代码** —— 有些可能被前端 `client.js` 或测试用。需要逐个复核。
101
-
102
- **怎么改**:复核一遍,真没用的删掉(降低维护面)。**低优先级,可以放最后。**
103
-
104
- ---
105
-
106
- ## 建议的动手顺序
107
-
108
- | 顺序 | 缺口 | 难度 | 理由 |
109
- |---|---|---|---|
110
- | **1** | 缺口 2(白板进检索) | ★ 很低 | 补两行,变量现成,收益最大 |
111
- | **2** | 缺口 1(锚点解耦) | ★★ 低 | 把 `if (boardMode==='graph')` 这层壳拿掉即可,但要跑回归 |
112
- | **3** | 缺口 5(注释矛盾) | ★ 很低 | 改注释,或补门 |
113
- | **4** | 缺口 3 / 4(索引派生 / lint) | ★★★ 中高 | **二选一:补实现,或文档标注"未实现"**。送审前至少标注 |
114
- | **5** | 缺口 6(死导出复核) | ★★ 低 | 收尾清理 |
115
-
116
- **P0 = 缺口 1 + 缺口 2**(用户已定:现在就改完)。
117
-
118
- ---
119
-
120
- ## 为什么这些会漏
121
-
122
- 一句话:**这个仓库的契约文档(`WB-FORMAT-CONVENTION.md`、`RAG-KARPATHY-PROGRAM.md`)写得太像"已完成的功能说明"**,
123
- 里面有大量**设计目标**混在**现状描述**里。写 README 或做验收时,**照抄契约就会把"计划"说成"已有"**。
124
-
125
- **纪律(已固化为项目笔记)**:引用契约文档的结论前,**必须 grep 真实调用链** —— 有调用点才算已实现。