@a9i5k4/dsh-auto-memory 3.0.1 → 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 (124) hide show
  1. package/README.md +13 -8
  2. package/README.zh-CN.md +13 -8
  3. package/docs/HANDBOOK.md +88 -52
  4. package/docs/USER-GUIDE.en.md +9 -9
  5. package/docs/USER-GUIDE.zh-CN.md +9 -9
  6. package/docs/screenshots/promo/promo-0-banner-v4.png +0 -0
  7. package/docs/screenshots/promo/promo-1b-auto-recall.png +0 -0
  8. package/lib/activation-host.js +6 -1
  9. package/lib/client.js +819 -272
  10. package/lib/context-host.js +7 -1
  11. package/lib/episodic-store.js +90 -16
  12. package/lib/fact-store.js +463 -41
  13. package/lib/hub-io.js +217 -0
  14. package/lib/index.js +224 -45
  15. package/lib/intent-clean-safe.js +1 -1
  16. package/lib/memory-hub.js +37 -5
  17. package/lib/note-status.js +9 -1
  18. package/lib/procedure-store.js +252 -31
  19. package/lib/procedure-switch.js +38 -0
  20. package/lib/python-sidecar-client.js +285 -8
  21. package/package.json +6 -2
  22. package/docs/internal/ACCEPT-35-LIVE.md +0 -143
  23. package/docs/internal/ACCEPTANCE-20260914.md +0 -90
  24. package/docs/internal/ARCH-REVIEW-BRIEF.md +0 -411
  25. package/docs/internal/ARCH-REVIEW-REQUEST.md +0 -201
  26. package/docs/internal/ARCH-REVIEW-ROUND2.md +0 -169
  27. package/docs/internal/ARCH-REVIEW-ROUND3.md +0 -206
  28. package/docs/internal/ARCHITECTURE-FOR-ZCODE-20260920.md +0 -397
  29. package/docs/internal/ART-DIRECTION-DEEPSEEK-20260920.md +0 -351
  30. package/docs/internal/ART-DIRECTION-WIREFRAME.md +0 -191
  31. package/docs/internal/ART-DIRECTION-WIREFRAME.md.bak-superseded +0 -181
  32. package/docs/internal/AUDIT-WB-GRAPH-FULL-20260916.md +0 -314
  33. package/docs/internal/BATTLE-PLAN-20260917.md +0 -871
  34. package/docs/internal/CONCURRENCY-INVESTIGATION-20260917.md +0 -192
  35. package/docs/internal/CROSS-SESSION-SEARCH-PATH-DECISION.md +0 -72
  36. package/docs/internal/CROSS-SESSION-SEARCH-RESEARCH.md +0 -131
  37. package/docs/internal/CUA-VISION-FIX-NOTES.md +0 -78
  38. package/docs/internal/DECISIONS-20260914-SESSION.md +0 -269
  39. package/docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md +0 -292
  40. package/docs/internal/DESIGN-P1-STATE-COMMIT-20260915.md +0 -219
  41. package/docs/internal/DIRECTION-CHECK-WB-GRAPH-20260916.md +0 -132
  42. package/docs/internal/FEATURE-INVENTORY.md +0 -531
  43. package/docs/internal/FEEDBACK-TO-DSHAPI-RELAY.md +0 -13
  44. package/docs/internal/G-SERIES-EXECUTION-20260917.md +0 -248
  45. package/docs/internal/G3-DESIGN-20260918.md +0 -82
  46. package/docs/internal/G3-DISK-FORMAT-GAP-20260919.md +0 -92
  47. package/docs/internal/GH-DISCUSSION-5732-COMMENT.md +0 -74
  48. package/docs/internal/GPT-ACCEPTANCE-PROMPT-20260916.md +0 -352
  49. package/docs/internal/GPT-REVIEW-PROMPT.md +0 -216
  50. package/docs/internal/GROUP-DIGEST-SETUP.md +0 -62
  51. package/docs/internal/GROUP-LISTENER-SETUP.md +0 -49
  52. package/docs/internal/GROUP-WEBHOOK-SETUP.md +0 -93
  53. package/docs/internal/HANDOFF-TO-ZCODE-20260920.md +0 -309
  54. package/docs/internal/HANDOFF-TO-ZCODE.md +0 -168
  55. package/docs/internal/HERMES-DATA-VERIFICATION-20260919.md +0 -120
  56. package/docs/internal/HERMES-LEGACY-STATUS-20260919.md +0 -74
  57. package/docs/internal/ISSUE-55-58-VERIFICATION-20260918.md +0 -175
  58. package/docs/internal/ISSUE10-FIX-EXECUTION-20260919.md +0 -389
  59. package/docs/internal/ISSUE10-PLAN-20260919.md +0 -254
  60. package/docs/internal/ISSUE10B-FORENSICS-20260919.md +0 -468
  61. package/docs/internal/ISSUE9-PURGE-AND-R1-PLAIN-20260919.md +0 -150
  62. package/docs/internal/ISSUE9-RESIDUAL-FORENSICS-20260919.md +0 -114
  63. package/docs/internal/KICKOFF-P0.md +0 -254
  64. package/docs/internal/LESSON-TO-CANDIDATE-STATUS-20260919.md +0 -79
  65. package/docs/internal/MASTER-PLAN-3.0.md +0 -411
  66. package/docs/internal/MEMORY-GOVERNANCE-20260917.md +0 -309
  67. package/docs/internal/MEMORY-MUTATION-AND-INDEX-DESIGN.md +0 -85
  68. package/docs/internal/MERGE-CONFLICT-SCAN-20260914.md +0 -222
  69. package/docs/internal/NEXT-VERSION-TODO.md +0 -95
  70. package/docs/internal/OFFICIAL-DISCUSSION-DRAFT.md +0 -80
  71. package/docs/internal/PENDING-FIXES-20260916.md +0 -289
  72. package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md +0 -705
  73. package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md.bak-s10 +0 -649
  74. package/docs/internal/PROCEDURAL-MEMORY-AND-APPROVAL-DESIGN-20260918.md +0 -225
  75. package/docs/internal/PROGRESS-20260917.md +0 -93
  76. package/docs/internal/PROMPT-GAP-AUDIT-20260920.md +0 -128
  77. package/docs/internal/R1-DEGRADE-AUDIT-20260918.md +0 -163
  78. package/docs/internal/R1-READABILITY-FORENSICS-20260919.md +0 -127
  79. package/docs/internal/R2-EVIDENCE-DEEP-AUDIT-20260918.md +0 -140
  80. package/docs/internal/R3-DEGRADE-LEDGER-DESIGN-20260918.md +0 -138
  81. package/docs/internal/R4-RECALL-QUOTA-PLAN-20260918.md +0 -218
  82. package/docs/internal/RAG-KARPATHY-PROGRAM.md +0 -229
  83. package/docs/internal/RELEASE-PROCESS.md +0 -99
  84. package/docs/internal/REPORT-P0-NIGHTLY.md +0 -212
  85. package/docs/internal/REPORT-P5-ACCEPTANCE.md +0 -31
  86. package/docs/internal/REPORT-WB-GRAPH-NIGHTLY.md +0 -153
  87. package/docs/internal/RESUME-20260918.md +0 -171
  88. package/docs/internal/RESUME-20260919.md +0 -104
  89. package/docs/internal/REVIEW-WB-GRAPH-SELF.md +0 -81
  90. package/docs/internal/RHINELAB-TO-DEEPSEEK-FEASIBILITY.md +0 -198
  91. package/docs/internal/ROADMAP-20260917-WEEK.md +0 -439
  92. package/docs/internal/ROADMAP.md +0 -106
  93. package/docs/internal/RUN-P0-NIGHTLY.md +0 -227
  94. package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +0 -185
  95. package/docs/internal/S10-GAP-INVENTORY-20260917.md +0 -239
  96. package/docs/internal/S10-GAPS-PLAIN-20260917.md +0 -125
  97. package/docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md +0 -360
  98. package/docs/internal/SESSION-FILE-REPAIR-PROTOCOL.md +0 -90
  99. package/docs/internal/SUBAGENT-REPORT-ROUTING-PRE-RESEARCH.md +0 -261
  100. package/docs/internal/T6-EXECUTION-20260920.md +0 -130
  101. package/docs/internal/TELEMETRY-EFFECT-REPORT-DESIGN-20260918.md +0 -146
  102. package/docs/internal/THESIS-GAP-ANALYSIS-20260918.md +0 -89
  103. package/docs/internal/THESIS-OUTLINE-20260918.md +0 -147
  104. package/docs/internal/THREE-LAYER-CONTRACT.md +0 -219
  105. package/docs/internal/TODO-BACKLOG.md +0 -263
  106. package/docs/internal/TODO-GRAPH.html +0 -715
  107. package/docs/internal/TODO-GRAPH.html.bak-20260914-v2 +0 -493
  108. package/docs/internal/TODO-GRAPH.html.bak-20260915-alsfix +0 -710
  109. package/docs/internal/TODO-GRAPH.html.bak-20260915-p1 +0 -710
  110. package/docs/internal/TODO-GRAPH.html.bak-20260915-p6a-rev +0 -703
  111. package/docs/internal/TODO-GRAPH.html.bak-20260915-wshint +0 -710
  112. package/docs/internal/TODO-GRAPH.html.bak-20260916-batch +0 -715
  113. package/docs/internal/UPSTREAM-ISSUE-PR-TRIAGE-20260919.md +0 -297
  114. package/docs/internal/UPSTREAM-ISSUES-3RD-AUDIT-20260920.md +0 -104
  115. package/docs/internal/WB-FORMAT-CONVENTION.md +0 -112
  116. package/docs/internal/WB-GRAPH-DECISIONS-20260914.md +0 -71
  117. package/docs/internal/WB-GRAPH-INTEGRATION-PLAN.md +0 -386
  118. package/docs/internal/WB-GRAPH-RESEARCH-BRIEF.md +0 -118
  119. package/docs/internal/WB-GRAPH-RESEARCH-EXTERNAL.md +0 -228
  120. package/docs/internal/WB-GRAPH-RESEARCH-LOCAL.md +0 -190
  121. package/docs/internal/reviews/CLAIM-VERIFICATION-20260914.md +0 -56
  122. package/docs/internal/reviews/PLAN-gpt6astra-round2-20260914.md +0 -787
  123. package/docs/internal/reviews/REVIEW-gpt6astra-20260914.md +0 -112
  124. package/docs/internal/reviews/ROUND3-REVIEW-INTEGRATION-20260914.md +0 -230
@@ -1,225 +0,0 @@
1
- # 作废标记语义修正 + Procedural Memory + 长期记忆审批(2026-09-18 设计稿)
2
-
3
- > **用户裁定**(本节其余内容均由此推出):
4
- > ① 「**这个 reacted 不是过滤掉**……**并不是挡,我感觉是备注**」;
5
- > ② 「如果遇到这个,后面应该说明现在**更正的内容在哪个哈希值里面**,方便 AI 去搜索」;
6
- > ③ 「这个**长期记忆审批**的问题……用户都说看不懂……**太抽象了**,名字也不知道,流程是啥也不知道,没法审,**只能盲确认**」;
7
- > ④ 「这个教训和这个**攻关完成的项目**,和**多次重复的事件**,应该都可以上升为 **skill 式**的。这个长期记忆就是 **procedural memory**,你看能不能和那个做结合」。
8
-
9
- ---
10
-
11
- ## 1. ★ I5 再修正:从「按状态分流」改为「一律返回、一律标记」
12
-
13
- ### 1.1 我上一版的错误
14
-
15
- 我上轮提的方案是「`superseded` 放行 + 标记,`retracted` **继续硬过滤**」。
16
- **用户否掉了,而且理由比我的更根本**:
17
-
18
- > 「如果你不记住这个教训的话,你还会再踩。所以**并不是挡,我感觉是备注**。」
19
-
20
- 我的分法来自**检索视角**(过时的信息不该干扰当前判断);用户的分法来自**学习视角**
21
- (**做错的事恰恰是最该被记住的**)。对记忆系统而言,后者才是目的——
22
- `retracted` 不是"垃圾数据",它是**一条教训**:*「这条曾经被当成结论写下来,后来发现是错的」*。
23
- 把它藏起来,等于**系统性遗忘自己的错误**,这正是用户说的"还会再踩"。
24
-
25
- ### 1.2 修正后的语义(三态一律返回)
26
-
27
- | status | 语义 | 呈现 |
28
- |---|---|---|
29
- | `current` | 现行结论 | 原样(**逐字节向后兼容**) |
30
- | `superseded` | 被更新的结论取代 | `⚠已作废(已被 mem_<hash> 取代)` |
31
- | `retracted` | 判断有误 / 主动撤回 | `⚠已撤回(原因:<reason>;更正见 mem_<hash>)` |
32
-
33
- **关键变化**:`isRetrievablePre` 不再过滤任何 status(只对**未知值 fail-closed**,防未来新增枚举时静默放行)。
34
-
35
- ### 1.3 「指向哈希值」= 让 AI 能自己去追(用户 ②)
36
-
37
- 用户要求「说明更正的内容在哪个哈希值里面,方便 AI 去搜索」——
38
- 这要求标记里带上**可检索的 id**,而不只是一句"已作废"。落地要点:
39
-
40
- - id 就是既有的 `mem_<32hex>` 锚点 id(**已有的东西,不新建 ID 体系**,守 S10.4)
41
- - 标记形态:`⚠已作废(已被 mem_xxxx 取代)` ⇒ AI 可直接拿这个 id 去 `memory_recall_pre` / `grep`
42
- - `retracted` 额外带 **reason**(为什么撤回)——这才是"教训"的正文,比 status 本身有价值
43
-
44
- > ⚠️ **安全纪律(已在 R4-A 探针锁定)**:id 只认 `/^mem_[0-9a-f]{32}$/` 形态,
45
- > 不合法一律丢弃 —— 防止把任意文本拼进检索呈现。
46
-
47
- ### 1.4 对 I5 的最终影响
48
-
49
- 原 I5:「非 `current` 的条目在**检索结果与注入内容两处**都被过滤」。
50
- **新语义**:**检索侧完全不过滤**(一律返回 + 标记);**注入侧维持过滤**——
51
- 理由是注入是**常驻目录**(B0 仅 800 token),拿常驻预算装过时条目会挤掉现行结论;
52
- 检索是**按需**的,AI 主动问什么才给什么,装一条带警告的过时结论划算。
53
-
54
- ⇒ 即 **I5 的"两处"要求被拆开**:检索侧从"过滤"改为"标注",注入侧不变。
55
-
56
- ---
57
-
58
- ## 2. ★ 仓库里已经有 procedural memory(用户的 ④ 不是新建,是接线)
59
-
60
- **这是本次最重要的发现**:用户说"看能不能和那个做结合"——**那些东西已经存在了**:
61
-
62
- | 已有资产 | 位置 | 作用 |
63
- |---|---|---|
64
- | `createProcedureStorePre` | `lib/procedure-store-pre.js` | 技能店:`observe/promote/activeProcedures/renderChecklist/touch/addEvidence` |
65
- | `createMemoryHubPre` | `lib/memory-hub-pre.js` | 三层编排器(episodic / **fact** / **procedure**) |
66
- | `isObservationOnlyPre` | `lib/procedure-observation-pre.js` | 观察型候选(不可晋升)标记 |
67
- | `act.skill` 段 | `lib/activation-inbox-pre.js` | **技能注入进投递面**(`renderSkillBlock` 渲染 checklist) |
68
- | 技能召回 | `lib/context-host-pre.js:524+` | query 匹配 active skill → 相似场景自动附上 |
69
- | 三层记忆面板 | `lib/client.js:2552+` | 「记忆中枢」页:晋升/激活/弃用/置顶 |
70
- | 证据制晋升闸门 | `index.js:522-531` | `minSessions=3` / `minSuccess=2` / `correctionCap=0.3` / 高风险需批准 |
71
-
72
- **⇒ 用户想要的「教训 / 攻关完成的项目 / 多次重复的事件 → skill 式」,机制上就是 `procedure` 层。**
73
- 不需要新建系统,需要的是:**接通 + 让它好用 + 让它能被审**。
74
-
75
- > ⚠️ **agent 曾在此处判断错误(已更正)**:初稿写「`procedurePromotionEnabled=false` 与宣传不一致」,
76
- > 把它当成默认值 bug。**实际是有意关闭**(Hermes 遗留未修)——见 §2.1。
77
-
78
-
79
- ### 2.1 出厂为什么是**关的**(用户裁定 2026-09-18,**纠正 agent 的误判**)
80
-
81
- `index.js:513 procedurePromotionEnabled: false`
82
-
83
- **agent 原判断(错)**:写成"宣传与实现不一致",当成默认值 bug。
84
- **用户裁定**:
85
-
86
- > 「记忆晋升是因为**之前的记忆系统有这个问题**,它用的是 **Hermes 那套**。
87
- > 你可以从记忆里看到我要改,**所以才先关掉的,改完自然就能打开了**。」
88
-
89
- ⇒ **这是有意的临时关闭,不是缺陷**。关闭理由是 Hermes 遗留问题(见已归档的 Hermes 调研笔记)。
90
- ⇒ **待办不是"改默认值",而是"把 Hermes 那套的问题改完"** —— 改完默认值自然打开。
91
- ⇒ 本章 §4-1 的待拍板项**随之解除**(不再是选择,而是一个依赖关系)。
92
-
93
- ### 2.2 三类来源到 procedure 的映射(用户的三个例子)
94
-
95
- | 用户说的 | 现有对应机制 | 缺口 / 裁定 |
96
- |---|---|---|
97
- | **「教训」**(踩过的坑) | `retracted` 条目 + `corrected` 证据 | **无自动通路** ⇒ ✅ **已裁定:教训进「候选」,不自动晋升,但可被检索**(见 §2.3) |
98
- | **「攻关完成的项目」** | `episode.success === true` → `observe()`(`memory-hub-pre.js:132-148`)| 只有 `intent + 1 步「观察任务:…」`,**步骤质量不足**(issue30 的 P3 就修过"步骤1: user"垃圾) |
99
- | **「多次重复的事件」** | `minSessions=3` + `minSuccess=2` 跨会话证据 | 机制**已有且合理** |
100
-
101
- ⇒ **最大缺口在第 1 行**,且已被用户裁定(§2.3)。
102
-
103
- ### 2.3 ★ 教训的晋升与检索(用户裁定 2026-09-18)
104
-
105
- > 用户原话:「**教训**肯定得进 C 啊,它**不自动晋升**,但是**可以形成候选**,
106
- > 模型也可以**通过搜索搜索到**。因为教训那边,我现在**自动注入的硬约束也是某种教训**,
107
- > 把它**上升到了约束层面**。」
108
-
109
- **裁定拆解**(agent 转写,若理解有偏差请纠正):
110
-
111
- | 层 | 教训的形态 | 是否自动晋升 | 模型如何拿到 |
112
- |---|---|---|---|
113
- | **候选(Candidate)** | 从 `retracted` / `correction` 证据生成的**观察型** procedure candidate | ❌ **永不自动晋升** | **主动搜索**(`memory_recall` 可检索到) |
114
- | **skill** | 经证据闸门(`minSessions=3`/`minSuccess=2`)+ 人工审批后晋升 | 需人工 | **由官方流程注入**(见 §2.4) |
115
- | **约束 / 规则** | 用户当前**自动注入的硬约束**——「**也是某种教训**,把它上升到了约束层面」 | 用户显式写 | 每轮自动注入(rules layer) |
116
-
117
- **★ 这条裁定的关键洞察(本项最重要的一句)**:
118
- **教训的终极形态不是 skill,而是"约束"**。用户当前系统里自动注入的硬约束
119
- (记忆里的 `[规则 — 用户级硬性约束]` 层)**本质上就是教训升格后的产物**。
120
- ⇒ 所以本设计不是"新建一个教训系统",而是**把既有的三层打通**:
121
- `retracted 教训` →(候选,可检索)→(人工晋升)→ `skill` →(若足够普适)→ `约束/规则`。
122
-
123
- ### 2.4 ★ skill 的注入路径(用户两次澄清后的**最终版**)
124
-
125
- **⚠️ agent 曾在上一稿下过头的结论(已更正)**:曾写「skill 注入归官方,插件不重复注入、
126
- `act.skill` 段可能应改为只提供检索入口」—— **这是错的**。
127
-
128
- **用户最终澄清(原话)**:
129
-
130
- > 「印象这个 **skill 是相对比较独立的系统**,它**顶多会塞这个语义换回(召回)的时候
131
- > 会换回这个 skill**。所以,**如果晋升成功,这个 skill 理论上应该是会被注入的**。」
132
-
133
- **⇒ 正确理解(两条并行、互不冲突)**:
134
-
135
- | | 官方 skills | **本插件的 procedure(skill)** |
136
- |---|---|---|
137
- | 归属 | DSH 官方技能系统 | **本插件,相对独立的系统** |
138
- | 注入方式 | 官方流程("会把所有 skills 当作注入") | **经本插件的语义召回命中后附着注入** |
139
- | 代码位置 | 官方 | `context-host-pre.js:524+`(query 匹配 active skill → `act.skill`)/<br>`activation-host-pre.js:300+`(Python 档 emit 帧)/`activation-inbox-pre.js` `renderSkillBlock` |
140
- | 结论 | 与插件无关 | **✅ 晋升成功后,skill 会被本插件正常注入** |
141
-
142
- **⇒ 对本设计的实际影响**:
143
- 1. **`act.skill` 段保持不变**,不是"应废弃" —— 它是本插件 skill 注入的**实现本体**。
144
- 上一稿把它列为"待评估是否废弃"**作废**(BATTLE-PLAN §7 第 11 项随之撤销)。
145
- 2. 「不用占插件资源」的语境是**官方 skills 那一套**,**不适用于**本插件的 procedure;
146
- 本插件 procedure 的注入走自己的语义召回,**该占的资源照占**(这是它的职责)。
147
- 3. **晋升 = 真正生效**:晋升成功后 skill 进入 `activeProcedures()`,被相似 query 命中后注入。
148
- ⇒ 这**加强了**审批责任感:审批界面「晋升后会怎样」那一栏要展示的正是
149
- **`renderChecklist()` 的真实文本**(§3.2 第 2 条),因为**那就是将来会被注入的内容**。
150
-
151
-
152
- ---
153
-
154
- ## 3. ★ 长期记忆审批:为什么"看不懂"(用户 ③)
155
-
156
- 用户原话:「**名字也不知道,流程是啥也不知道,没法审,只能盲确认通过**」。
157
-
158
- ### 3.1 现状(代码级)
159
-
160
- 「记忆中枢」页(`client.js:2552+`)对每条 pipeline 条目只展示:
161
- `title` / `stage` / `riskLevel` / `evidence` + 三个按钮(晋升/激活/弃用/置顶)。
162
-
163
- **缺的恰恰是审查所需的三样**:
164
-
165
- | 审查需要知道 | 现状 | 后果 |
166
- |---|---|---|
167
- | **它是什么**(这条技能干什么) | 只有 `title`(≤40 字,还是从 `intent` 截断来的) | 名字看不出内容 |
168
- | **凭什么该晋升**(证据) | 只有 `evidence` 计数的裸数字 | 不知道是哪几次会话、发生了什么 |
169
- | **晋升后会怎样**(注入形态与代价) | 完全没展示 | 不知道点了会发生什么 |
170
-
171
- ⇒ **这不是 UI 品味问题,是"审查所需信息结构性地不在界面上"** ⇒ 只能盲确认。
172
-
173
- ### 3.2 设计方向(待细化,先记原则)
174
-
175
- 1. **展示「凭什么」**:把 `evidence` 从计数展开为**可点开的证据链**——
176
- 哪几个 session、每次的 `kind`(success/correction)、对应的 episode 摘要。
177
- *(数据已在 `addEvidence` 里存着,只是没展示。)*
178
- 2. **展示「晋升后会注入什么」**:直接调 `renderChecklist(procedureId)` 把**将要注入的文本原样预览**。
179
- *(函数已存在,`activation-inbox-pre.js` 就在用它渲染。)*
180
- 3. **说人话**:`stage`/`riskLevel`/`observationOnly` 这些内部枚举要给**中文解释**,不能只显示代号。
181
- 4. **能反悔**:晋升错了要能撤回(与 G3 的「撤销通道 U1」同源纪律)。
182
-
183
- > **与 G3 的关系**:G3 的 `restore`(撤销误标 superseded)与本项的「撤回误晋升」
184
- > 是**同一个交互模式**——**凡自动/半自动改变结论状态的操作,都必须有人工回退通道且留痕**。
185
-
186
- ---
187
-
188
- ## 4. 待用户拍板 → ✅ **已全部拍板(2026-09-18)**
189
-
190
- | # | 事项 | 用户裁定 |
191
- |---|---|---|
192
- | 1 | `procedurePromotionEnabled` 出厂默认 | ✅ **不是默认值问题**——是**有意临时关闭**(Hermes 遗留)。⇒ **待办改为"把 Hermes 那套的问题改完",改完自然打开**(详见 §2.1) |
193
- | 2 | 教训是否进 procedure | ✅ **「教训肯定得进 C 啊,它不自动晋升,但是可以形成候选,模型也可以通过搜索搜索到」** ⇒ **进候选 + 可检索 + 永不自动晋升**(详见 §2.3) |
194
- | 3 | 注入侧是否也返回 | ✅ **随 I5 修正一并解决**(见 §2.4 + BATTLE-PLAN §10):**检索侧一律返回+标记**;<br>本插件 procedure(skill)**晋升成功后经语义召回正常注入**,`act.skill` 段**保持不变** |
195
- | 4 | 审批界面何时做 | ✅ 归口**前端重构**(与首次启动页一并) |
196
-
197
- **⇒ 4 项全部解除,本设计稿无阻塞项。**
198
-
199
- ---
200
-
201
- ## 5. 归口与排期
202
-
203
- | 事项 | 归口 | 时机 |
204
- |---|---|---|
205
- | I5 再修正(一律返回 + 标记 + 指向哈希) | R4-A | ✅ 边界已全部拍板,可开工(改动仍冻结) |
206
- | 三条 issue #55–#58 修复 | 新增批次 | **前端重构之前**(用户裁定) |
207
- | **Hermes 遗留问题修复**(打开 procedurePromotion 的前提) | 待立项 | ⬜ **新识别出的依赖项** |
208
- | 教训 → 观察型候选(可检索、不自动晋升) | 待立项 | ⬜ 见 §2.3 |
209
- | ~~评估 `act.skill` 段在官方接管后的定位~~ | — | ❌ **已撤销**:skill 是**相对独立的系统**,晋升成功后**会被本插件正常注入** ⇒ `act.skill` 段是**实现本体,保持不变** |
210
- | **Hermes 遗留问题修复** | 待立项 | ⬜ **打开 procedurePromotion 的前提**(§2.1) |
211
- | 审批界面重构(看懂"凭什么") | **前端重构** | 与首次启动页一并 |
212
- | 首次启动页重构 + 赞助商/中转站展示 | **前端重构** | 用户要求届时提醒 |
213
-
214
- ---
215
-
216
- ## 6. 本次三项裁定暴露的一条通用判据(供后续沿用)
217
-
218
- > **agent 两次提出方案,两次被用户的"视角"推翻**:
219
- > ① I5:agent 用**检索视角**(过时信息别干扰)→ 用户用**学习视角**(做错的事最该记);
220
- > ② procedurePromotion:agent 当**默认值 bug** → 实际是**有意的临时关闭**(依赖未修)。
221
- >
222
- > ⇒ **可复用教训:看到"配置是关的/行为是旧的",先查它是不是"因为已知缺陷而故意关的",
223
- > 不要直接判定为疏漏。** 本仓已有先例(`memoryAnchorEnabled=false` 也是默认路径的关键开关),
224
- > 这类"关着的开关"往往承载着未修复的依赖,**误判为 bug 会导致方向性错误**。
225
-
@@ -1,93 +0,0 @@
1
- # 周末作战 · 进度表(2026-09-17 收盘)
2
-
3
- > 权威顺序依据:`docs/internal/BATTLE-PLAN-20260917.md`(396 行)。
4
- > 回归口径:`node tools\run-smoke.mjs`(全量,非单套件)。
5
- > 本表每次阶段完工后回写。
6
-
7
- ## 总进度条
8
-
9
- ```
10
- L 层 ████████████████████ 100% ✅ 已冻结(PASS 112 / FAIL 0)
11
- G4 ████████████████████ 100% ✅ 已完成(=M3,已吸收)
12
- M9 ████████████████████ 100% ✅ 已完成(容量默认 12000→24000 + 老配置迁移)
13
- M 层 ░░░░░░░░░░░░░░░░░░░░ 0% ⏭ 下一步(M1/M2)
14
- S 层 ░░░░░░░░░░░░░░░░░░░░ 0% ⏸ 待 L/M 冻结后开
15
- G2 ████████████████████ 100% ✅ 已完成
16
- G3/G5/G6 ░░░░░░░░░░░░░░░░ 0% ⏸ 待办(见文末)
17
- ```
18
-
19
- ---
20
-
21
- ## 〇、M9 · 容量出厂默认 12000 → 24000(用户报障驱动)
22
-
23
- **用户原话**:「先把所有人的默认都改到 24000,好多人跟我抱怨写满了,写不进去了。」
24
-
25
- | # | 项 | 改动 |
26
- |---|---|---|
27
- | M9a | 出厂默认 | `DEFAULT_NOTE_CAPACITY_CHARS` / `DEFAULT_USER_CAPACITY_CHARS` 12000 → **24000** |
28
- | M9b | **老配置一次性迁移** | 新增 `upgradeCapacityDefaultsPre()`:配置里**仍是 12000**(= 没表达过偏好)才抬到 24000;用 `capacityDefaultsVersion` 守卫**只升一次**;用户自设值(8000/50000…)一律不动;异常 fail-soft |
29
- | M9c | 落盘 | `loadConfigSync`(注册期真正跑的那条)+ `loadConfig` 都接上;异步路径抬升后 `persistConfigPre()` 落盘(否则设置页读盘仍显示 12000) |
30
- | M9d | 文案同步 | 设置页 zh/en 各 2 处提示 + 两个输入框占位默认值 + 注入纪律行 + `memory_note_pre`/`memory_user_pre` 描述 |
31
- | M9e | 历史保全 | **2.4.0 changelog 里的 12000 原样保留**(那是发布记录,改它=伪造历史)——已写成断言 M9-10 锁死 |
32
-
33
- **为什么必须配迁移(关键)**:`saveConfig` 把**整个合并后的 config** 落盘(实测本机 95 个键全在盘上)⇒ 老用户只要在设置页存过**任何一项**,`noteCapacityChars: 12000` 就已被钉死在磁盘上。**只改常量对老用户完全无效**(配置值覆盖默认值)。这正是"好多人抱怨写满了"的机制。
34
-
35
- **验证**:`smoke-test-m9-capacity-default-pre.mjs` **10/10 绿**;变异演示 **6 处变异 → 4 条断言真红**,还原后 10/10 绿。
36
-
37
- ---
38
-
39
- ## 一、本轮完工明细(逐条可回代码核对)
40
-
41
- | # | 项 | 状态 | 关键改动 | 证据 |
42
- |---|---|---|---|---|
43
- | L1 | 看板渲染解耦 | ✅ | `kanbanBoardData` 删掉 `handoffEnabled` 早退(渲染不归产物开关管) | 首 900 字符内无 `handoffEnabled`;`boardMode` 门保留 |
44
- | L2 | 面板 render 解耦 | ✅ | `handoffPanelData` 门改为 `boardMode!=='graph'` → `{enabled:false,reason:'legacy-mode'}` | `legacy-mode` 存在;无 `handoffEnabled` 早退 |
45
- | L3 | 接续预算重构 | ✅ | 新增 `assembleCarryPre({head,nav,bulk,budget})`:**nav 配额先扣、永不截断**,bulk 可截断 + 截断自述 | `export function assembleCarryPre(...)` 签名核对;`材料因预算被截断` 存在;`bulkParts.push` 存在 |
46
- | L3.5 | 附件路径进转写 | ✅ | `attachmentsOfContent` / `attachmentBlobPathsPre` / `renderAttachmentLinesPre` + `foldSessionLogEvents` 带 attachments | 12/12 断言绿 |
47
- | **L3.6** | **旧会话可检索化** | ✅ | 3 纯函数 `slimTranscriptPre` / `prevSessionSidAnchorPre` / `prevSessionL0Pre` + `listPrevSessionTranscripts` 接进 `searchHandoffCorpus` | **10/10 断言绿**;3 处变异**真红** |
48
- | L4 | 白板进检索 | ✅ | `recallMemoryPre` 的 `pushL0` 加 `handoff/PLAN.md` + 最新账本(词法臂 :5745 / 语义臂 :5953) | grep 命中两处 + `latestLedgerNamePre`(:8143) |
49
- | L5 | 锚点解耦 | ✅ | PLAN 锚点与账本锚点的 `boardMode==='graph'` 门移除 | `applyAnchorsPre(wsKey,'handoff/PLAN.md',...)` 处无 boardMode 门 |
50
- | L6 | 账本保护门注释 | ✅ | `checkMutationPre` 两条 `not-applicable` 分支 | `:2455 target-not-protected` / `:2456 ledger-append-only-no-before-side` |
51
- | L7 | 死导出存活标注 | ✅ | `wb-contract-pre.js` 两处标「对外契约保留」 | `:47` `WB_STATUSES_PRE_V1` / `:69` `describeWbReasonPre` |
52
- | **G4** | **白板纪律 + 写记忆时维护** | ✅ | GUIDANCE 三层分工 + 三条硬约束;`memory_log_pre` 描述加"顺手维护白板" | **7/7 断言绿**;关键词从全 False → 全 True |
53
- | G2 | 标本作废标记 | ✅ | `MEMORY.md` 两处 `> ⚠️ 已作废(2026-09-17 · G2 标记)` | 标记存在且指向 4 门结论 |
54
-
55
- **新增测试套件**:`smoke-test-l36-prev-session-pre.mjs`(10) + `smoke-test-g4-whiteboard-pre.mjs`(7)
56
- **全量回归**:`PASS 111 / FAIL 0 / TIMEOUT 0`(171.0s)
57
-
58
- ---
59
-
60
- ## 二、用什么方式填补了什么空缺
61
-
62
- | 空缺(现象) | 根因(代码级) | 填法 | 为什么是这个填法 |
63
- |---|---|---|---|
64
- | 旧会话转写**检索不到**(用户"有些文件接不过去") | `listHandoffLedgers` 的过滤正则只认 `handoff-<ts>`/`PLAN-<ts>`,**结构性排除** `prev-session-*` ⇒ `scope='handoff'` 永远是孤岛 | **新增独立 lister** `listPrevSessionTranscripts` 并接进 `searchHandoffCorpus` | **不放宽既有正则**——放宽会把旧会话混进账本/归档的血缘语义 |
65
- | 转写正文被工具噪声淹没(1854 工具事件 vs 530 assistant 消息) | 旧实现全量转写 | `slimTranscriptPre`:工具事件**转计数**,单条 2000 / 总长 60000 双上限 | 保留可追溯性(计数自述)同时让正文可见 |
66
- | 转写体每次重建 id 都变,破坏"index.json 完全可重建" | 无 | `prevSessionSidAnchorPre`:由 **sid 推导**(`sha256('prev-session\0'+sid)`)而非时间戳 | 同一会话恒等 ⇒ 可重建 |
67
- | 模型**不知道有白板这回事**,从不维护 | GUIDANCE 对 白板/PLAN/kind=plan/handoff **零覆盖**(实测七个关键词全 False) | GUIDANCE 加三层分工 + 三条硬约束;`memory_log_pre` 描述加"顺手维护白板" | 挂在**既有**每轮注入机制上,零新增通道 |
68
- | 白板与账本都写"下一步" ⇒ 漂移 | 无权威划分 | GUIDANCE 明确:账本=**动态状态的唯一权威** | 一处权威,另一处不再重复 |
69
-
70
- ---
71
-
72
- ## 三、之后还待做什么
73
-
74
- ### M 层(下一步,按 BATTLE-PLAN)
75
- - **M1** 契约行渲染
76
- - **M2** lint ①②④(只读纯函数)
77
- - ~~**M3** GUIDANCE 白板纪律~~ → **已被 G4 吸收,跳过**
78
-
79
- ### S 层(M 冻结后开)
80
- - **S1** 容器结构
81
- - **S2** 视觉对齐 DeepSeek Flow
82
- - **侧边栏进度表**(用户长期要求,本表即其内容蓝本)
83
-
84
- ### G 系列剩余
85
- - **G3/G5/G6**:`supersedes`/`status` 约定 + 读侧过滤;矛盾检测 lint(复用 M2,判据③④待用户裁定);结论层 replace+archive 语义
86
- - 三层方案 A/B/C:**A**(条目带 `supersedes`/`status`,低成本)/ **B**(矛盾 lint)/ **C**(结论层 replace+archive,长期)
87
-
88
- ### 待用户动作
89
- 1. **自行重启宿主** —— `lib/index.js` 已改(L 层 + G4),不重启不生效。(agent 绝不碰 3080)
90
- 2. ~~`noteCapacityChars` 建议 12000 → 24000~~ → **已完成(M9)**:出厂默认已改 24000,老配置(仍是 12000 的)会在重启后自动抬到 24000 并落盘,无需手动改设置。
91
-
92
- ### 已知未做(有意,不在批准范围)
93
- - `boardMode` 原始字符串闸门尚有 13 处未改用 `isGraphModePre`(**L5 批准范围只含 2 处锚点写入**)
@@ -1,128 +0,0 @@
1
- # PROMPT-GAP-AUDIT — 代码能力 vs 模型 prompt 全量对账
2
-
3
- > 生成:2026-09-20 · 触发:用户「有什么是我代码应该让模型知道的内容,模型现在还不知道,就是注入里面还没讲」
4
- > 方法:全量扫描 `lib/*.js` 的 `export const` 枚举/契约常量 + 17 个 `defineTool` 的 description + `renderMemoryStatic` / `renderDynamic` 注入文本,逐条比对"代码有语义域 / prompt 有解释"。
5
- > 铁律:本表**只做对账,不判断该不该补**——补哪条由用户拍板。
6
-
7
- ## 0. 一句话结论
8
-
9
- **共 17 条缺口,分四类。** 其中 6 条是**模型根本判断不了**(零入口),11 条是**有入口但语义域没讲全**。
10
-
11
- ---
12
-
13
- ## A 类 · 模型零入口(判断不了,必须补代码才能补 prompt)
14
-
15
- | # | 能力 | 代码位置 | 现状 | 影响 |
16
- |---|---|---|---|---|
17
- | **A1** | **`retracted`(撤回)写入** | `note-status-pre.js:52` 支持三态 / `:69` 可渲染 retracted · `index.js:5866` 仅映射 `superseded` | **无通道**:`memory_note_pre` 只有 `supersedes` 参数,硬编码映射到 `superseded` | 用户 2026-09-18 裁定「retracted 不是垃圾,是教训」——**教训通路不可写** |
18
- | **A2** | **fact 过期机制** | `fact-store-pre.js:159 isExpired` · `:326 resolveConflict` · `:283 revokeBySource` · `:263 supersede` | 9 个能力齐全,**零 `defineTool`**(实测 `memory_fact*` = 0) | 用户问的「记忆是否过期」——模型既读不到也写不了 |
19
- | **A3** | **episodic(情节)写入** | `episodic-store-pre.js` · `EPISODE_OUTCOMES_PRE_V1 = ['unknown','success','failure','partial']` | 仅宿主自动(`index.js:7411` `hub.stores.episodic.append`) | 模型无法标记"这次是失败/部分成功" |
20
- | **A4** | **fact 语义域(5 个枚举)** | 见 §C-1 | 全部无 prompt | 模型不知道 fact 还有 epistemic_status / scope / trend 这些维度 |
21
- | **A5** | **看板 tag 命名约定** | `wb-sidecar-pre.js:594-597` `matchTags: ['type:goal' / 'type:state' / 'type:dead-end' / 'type:progress']` | prompt 未提任何 tag 名 | 模型写白板时**不知道要打 tag 才能进看板泳道**——只能靠 `matchTitle` 正则兜 |
22
- | **A6** | **看板泳道 = 5 条非 4 条** | `WB_KANBAN_LANES_PRE_V1`(`:593`):goal / state / deadend / progress / **archive** | 注入里只说"四段式" | 用户说"看板方向 4 个"——实测**第 5 条「版本归档」靠 `matchKinds:['archive']`**,模型无从知晓 |
23
-
24
- ---
25
-
26
- ## B 类 · 有入口但 prompt 没讲清
27
-
28
- | # | 缺什么 | 代码位置 | 现状 |
29
- |---|---|---|---|
30
- | **B1** | **白板/账本两套四段措辞不一致** | `index.js:5726`(催办块)用「当前目标/已完成/进行中/下一步第一步」· `:570`/`:3658` 用「任务状态/目标/已试方案与失败原因/进度与下一步」 | 同名四段、两套词,模型可能当同一件事 |
31
- | **B2** | **`boardMode=graph` 前提** | `index.js:10198` 条件注册 `memory_expand_pre` / `memory_trace_pre` | legacy 模式下工具**不存在**,prompt 无任何解释 |
32
- | **B3** | **procedure 晋升门限** | T4:`successCriteria` 缺失 ⇒ 结构上永不晋升 | 工具描述只提了 "high 需人工批准",未说这条硬事实 |
33
- | **B4** | **R1 四条可读性判据** | `R1-READABILITY-FORENSICS-20260919.md`(开头空行=0 / 空行占比<15% / 同日重复 `## `=0 / 缺主语<5%) | 仅在文档,**未进任何 prompt** |
34
- | **B5** | **`memory_log_pre` 的 `date` 参数** | `index.js:9857` | 描述未说"可补写过去日期" |
35
- | **B6** | **`memory_note_pre` 的容量与整理行为** | `:9880` 提到 24000,但未说整理触发条件与归档位置 | 模型不知道写满后会发生什么 |
36
- | **B7** | **`memory_recall_pre` 的 `expand`/`format` 组合** | `:9976-9982` | 参数各自有描述,但**组合语义**(expand 时忽略 query)只在参数描述里夹带 |
37
- | **B8** | **`memory_maintain_pre` 的 days 语义** | `:10007` | 未说"阈值天数"与日志可见性关系 |
38
- | **B9** | **`memory_status_pre` / `memory_reflect_pre` 的适用时机** | `:10011` / `:10023` | 只写了功能,没写"什么时候该用" |
39
- | **B10** | **`memory_external_pre` 的 import 链接模式** | `:10028` | 未说"只记路径指针、不写内容"的防脏纪律 |
40
- | **B11** | **`memory_consolidate_pre` 与自动沉淀的关系** | `:10085` | prompt 里"自动沉淀"与"手动 consolidate"边界模糊 |
41
-
42
- ---
43
-
44
- ## C 类 · 枚举值模型看不到(内部语义域)
45
-
46
- ### C-1 fact 域(5 个)
47
-
48
- ```
49
- FACT_EPISTEMIC_STATUSES_PRE_V1 = ['fact', 'observation', 'directive']
50
- FACT_SCOPES_PRE_V1 = ['User', 'Workspace']
51
- FACT_SOURCE_KINDS_PRE_V1 = ['explicit', 'inference']
52
- FACT_SOURCE_CLASSES_PRE_V1 = ['user-memory','workspace-notes','workspace-log','semantic-candidate','profile-candidate']
53
- FACT_TRENDS_PRE_V1 = ['new', 'strengthening', 'stable', 'weakening', 'stale']
54
- FACT_TTL_DEFAULT_PRE_V1 = 0 // 0 = 永不过期
55
- ```
56
-
57
- ### C-2 证据域(2 个)
58
-
59
- ```
60
- ACCESS_KINDS_PRE_V1 = ['seen', 'read', 'cite', 'reuse', 'success', 'correction']
61
- ACK_REASONS_PRE_V1 = ['ok', 'disabled', 'busy', 'unsupported', 'oversize', 'stale']
62
- ```
63
-
64
- ### C-3 投递/激活域(2 个)
65
-
66
- ```
67
- ACTIVATION_LEVELS_PRE_V1 = ['index', 'hint', 'excerpt', 'checklist', 'resource', 'full']
68
- DELIVERY_STATES_PRE_V1 = ['pending', 'claimed', 'delivered', 'expired', 'dropped']
69
- ```
70
-
71
- ### C-4 L0 层域(1 个)
72
-
73
- ```
74
- L0_LAYERS = ['user', 'project', 'log', 'reflection', 'whiteboard']
75
- L0_LAYER_LABELS_PRE_V1 = { project:'结论层·项目笔记', user:'结论层·用户级记忆', whiteboard:'结论层·白板/账本', … }
76
- L0_RETRACTED_MARK_PRE_V1 = '⚠已撤回'
77
- ```
78
-
79
- ### C-5 降级域(1 个)
80
-
81
- ```
82
- DEGRADE_KINDS_PRE_V1 = ['semantic-arm', 'evidence-arm', 'l0-sync']
83
- ```
84
-
85
- ### C-6 白板状态(1 个)
86
-
87
- ```
88
- WB_STATUSES_PRE_V1 = ['current', 'superseded', 'retracted'] // 与笔记三态同名同值,但作用于白板条目
89
- ```
90
-
91
- ---
92
-
93
- ## D 类 · 三态/四段的家族对照(澄清用,非缺口)
94
-
95
- | 族 | 常量 | 取值 | 作用于 |
96
- |---|---|---|---|
97
- | 笔记条目生命周期 | `NOTE_STATUSES_PRE_V1` | current/superseded/retracted | `MEMORY.md` |
98
- | 白板条目生命周期 | `WB_STATUSES_PRE_V1` | current/superseded/retracted | 白板/账本条目 |
99
- | L0 检索标记 | `L0_STATUSES` | current/superseded/retracted | 检索输出标记 |
100
- | **账本四段**(截断权重) | `HANDOFF_LEDGER_SECTION_WEIGHTS_PRE_V1` | 任务状态.15 / 目标.20 / 已试方案与失败原因.35 / 进度与下一步.30 | 账本内部**截断排序** |
101
- | **看板五泳道**(渲染分组) | `WB_KANBAN_LANES_PRE_V1` | 目标 / 进行中 / 失败与弯路 / 进度与下一步 / **版本归档** | 面板**看板分列** |
102
-
103
- > **关键澄清(用户已指出)**:账本四段 ≠ 看板泳道 ≠ 记忆三态,**三者互不相交**。
104
- > 账本四段管"截断时先丢谁";看板泳道管"面板上分几列";三态管"条目是否作废"。
105
-
106
- ---
107
-
108
- ## E 类 · 判定为「不需要进 prompt」
109
-
110
- | 项 | 理由 |
111
- |---|---|
112
- | `EPISODE_RETENTION_PRE_V1 / SEGMENT_CAP / MIN_SEGMENTS` | 宿主容量参数,模型无需知道 |
113
- | `UPSERT_OUTCOMES_PRE_V1` | fact store 内部返回值 |
114
- | `DEGRADE_CAP / QUOTA_THRESHOLDS / ARM_STATES` | 宿主降级配额 |
115
- | `EVIDENCE_PREFIX / OBSERVATION_PREFIX / ACTIVATION_ID_PREFIX` | id 前缀,内部格式 |
116
- | `BOARD_MODES_PRE_V1 = ['legacy','graph']` | 已由 B2 覆盖(说明"图模式才有那两个工具"即可) |
117
- | `INDEX_SYNC_PAGE_BUDGET` / `CONTEXT_BRIDGE_BUDGET` | 内部预算 |
118
- | 46 条路由 / `DEFAULT_CONFIG` 97 键 | 用户面配置,非模型面 |
119
-
120
- ---
121
-
122
- ## F. 拍板建议(三条最小改动,已在前轮提出)
123
-
124
- 1. **A1**:`memory_note_pre` 增 `retract: string[]`,与 `supersedes` 对称走 `applyNoteStatusPre`
125
- 2. **B1**:统一白板/账本四段措辞,或在 prompt 显式声明二者区别
126
- 3. **B2**:铭文补 boardMode 说明
127
-
128
- **若扩大范围**,A5(tag 命名约定)与 A6(第 5 条泳道)应一并补——否则模型写的白板**永远进不了看板的 tag 匹配**,只能靠 `matchTitle` 正则兜底。
@@ -1,163 +0,0 @@
1
- # R1 · 静默降级高危点普查报告
2
-
3
- > 2026-09-18 定稿 · 只读普查(未改任何代码)
4
- > 探针:`artifacts/_probe-silent-degrade.mjs`(全仓扫描)、`artifacts/_probe-r1-degrade.mjs`(逐点验证)
5
- > 上游:`BATTLE-PLAN-20260917.md` §3.6(R 系列执行顺序)
6
-
7
- ---
8
-
9
- ## 0. 一句话结论
10
-
11
- **10 处高危中:1 处确诊真缺陷(evidence 读写不对称)、1 处假警报已撤销(miv)、其余 8 处为设计内容错。**
12
-
13
- **同时撤销 BATTLE-PLAN §3.5 的 M2.5c**(miv 疑点)——它是假警报,不得作为 M2.5a 的前置阻塞。
14
-
15
- ---
16
-
17
- ## 1. ★ 确诊:evidence 读写**不对称**(真缺陷)
18
-
19
- ### 证据链
20
-
21
- **写入侧**(`evidence-store-pre.js:109-130`):
22
-
23
- ```js
24
- async append(evidence, opts = {}) {
25
- ...
26
- mkdirSync(this.eventsDir, { recursive: true }) // :126 —— 懒建目录
27
- appendFileSync(path.join(this.eventsDir, fname), line + '\n', 'utf8')
28
- }
29
- ```
30
- - 目录**只在首次 append 成功时才创建**
31
- - 且 append 的调用**有条件**(`context-host-pre.js:164` 的 store 惰性创建 + 上游 feature gate)
32
-
33
- **读取侧**(`index.js:5889-5897`):
34
-
35
- ```js
36
- const agg = aggregateEvidenceEventsPre(scanEvidenceEventsPre({
37
- listFiles: () => readdirSync(evDir).filter((x) => x.endsWith('.jsonl')), // ← 无条件 readdirSync
38
- ...
39
- }, {}))
40
- } catch (eImp) { try { diag('evidence-agg 降级为中性(impMap 空): ' + ...) } catch (_) {} }
41
- ```
42
- - **无条件扫描**,目录不存在即抛 ENOENT ⇒ 静默降级
43
-
44
- ### 本机实测(对照)
45
-
46
- ```
47
- ~/.dsh/memory/evidence-pre/events/
48
- 2026-09-17.jsonl 5953 行 mtime=09-17 23:58
49
- 2026-09-18.jsonl 1385 行 mtime=09-18 19:12 ← 仍在写
50
- 共 21 个文件
51
- ```
52
- ⇒ **本机写入侧健康**(开发机长期有会话活动)。
53
-
54
- ### 用户侧(`C:\Users\Administrator\`)
55
-
56
- 报 **功能异常**,日志:
57
- ```
58
- [dsh-auto-memory] evidence-agg 降级为中性(impMap 空):
59
- ENOENT: no such file or directory, scandir 'C:\Users\Administrator\.dsh\memory\evidence\events'
60
- ```
61
- - 路径**不是拼错**:`release.mjs:93` 有 `['memory/evidence-pre','memory/evidence']`(发布版重命名)
62
- - ⇒ 该用户**从未成功 append 过**(目录不存在)⇒ 每次 recall 必走 ENOENT
63
-
64
- ### 缺陷本质
65
-
66
- | 侧 | 行为 | 后果 |
67
- |---|---|---|
68
- | 写 | **懒建 + 有条件** | 新装/未触发该 feature 的用户永远无目录 |
69
- | 读 | **无条件扫描** | 每次都 ENOENT ⇒ importance 恒中性(0.75) |
70
-
71
- **⇒ importance 加权这类用户**出厂即死**,且没有任何提示。**
72
- 与 M8/M9 同族:**功能存在、代码在跑、输入永远为空**。
73
-
74
- ### 修法(R3 范围,候选)
75
-
76
- | 方案 | 内容 |
77
- |---|---|
78
- | **E-1** | 读取侧先 `existsSync(evDir)`,不存在**静默返回空**(不报错)—— 消除噪音,但不解决"功能是死的" |
79
- | **E-2** | **写入侧改为确定性建目录**(注册期即建),读取侧条件不变 —— 让两侧对称 |
80
- | **E-3** | 两者都做 + 走 R3 留痕:**让"importance 恒中性"这件事可见**(面板/状态文件) |
81
-
82
- **倾向 E-1 + E-3**:E-1 消除每次 recall 的异常开销;E-3 让用户能看见"这条臂没在工作"。
83
- **E-2 需先查清 feature gate**(为何该用户没触发写入)——**尚未查证,不得当结论**。
84
-
85
- ---
86
-
87
- ## 2. ✖ 撤销:miv 两公式疑点(假警报)
88
-
89
- ### 原疑点
90
- ```js
91
- index.js:5871 sha256([id, l0] 元组)
92
- context-host-pre.js:537 sha256(recs.map(r => r.memoryId).join(','))
93
- ```
94
- 原判断:两者应一致,否则 worker 三重过滤拒绝 → 静默回退纯词法。
95
-
96
- ### 追查结果:**两条公式服务两个不同消费者,各自自洽**
97
-
98
- **① `index.js:5865` 注释的对照对象是 `index-sync`,不是 `context-host-pre:537`**:
99
- ```
100
- // pyCorpus:与 context-host index-sync 同源的 corpus 快照(workspaceKey/scope/miv 须与已同步索引一致,...
101
- ```
102
-
103
- **② `index-sync-pre.js:62` 只是【接收】miv,不自己计算**:
104
- ```js
105
- const miv = String((input && input.memoryIndexVersion) || (snap ? snap.memoryIndexVersion : '') || '')
106
- if (!miv.startsWith('idx_pre_')) return { ok: false, reason: 'memoryIndexVersion' }
107
- ```
108
- ⇒ 它校验的是**前缀**,公式由调用方给定 ⇒ **不存在"两侧公式不一致"这一说**。
109
-
110
- **③ `context-host-pre.js:537` 是另一个域(技能/procedures)**:
111
- ```
112
- :526 // 2026-08-28 P1⑥:优先 C2 稠密匹配(技能标题+步骤进嵌入索引,miv=技能集指纹,
113
- :527 // 集合不变则缓存命中);不可用回退词法 2-gram。
114
- :538 const rank = await engine._jsSemanticRank({ memoryIndexVersion: miv, records: recs }, ...)
115
- ```
116
- ⇒ 消费者是**直接调用**,miv 由本处生成、本处使用,**自洽**。
117
-
118
- ### 结论
119
- **M2.5c 撤销。** 该疑点不成立;M2.5a 无此前置阻塞。
120
- (教训:注释里的「context-host」指**模块族**而非某一个文件;我最初把 `context-host-pre.js:537` 当成了注释所指的对照点——**推断当结论,已更正**。)
121
-
122
- ---
123
-
124
- ## 3. 其余 8 处:判定为**设计内容错**
125
-
126
- | 位置 | 降级内容 | 判定 | 理由 |
127
- |---|---|---|---|
128
- | `index.js:5877` | 语义臂择优降级 | 🟡 **设计内,但需可见** | py→JS→词法三级择优是刻意设计(P13);异常回退词法属预期 |
129
- | `index.js:5908` | temporal-parse 无时间臂 | 🟡 设计内 | 查询无时间表达时**本就该关**(`tr=null` 是正常路径,非异常) |
130
- | `index.js:8795` | l0-index sync 降级 | 🟡 设计内 | 同步失败不阻塞主流程 |
131
- | `index.js:3873` | buildPrevSessionPack → null | 🟡 设计内 | 接续材料失败不该阻断会话 |
132
- | `index.js:1941` | config migrate failed | 🟢 正常容错 | 迁移失败已有 `console.error` |
133
- | `index.js:9154` | agent lifecycle | 🟢 正常容错 | 生命周期钩子 |
134
- | `client.js:2825` | session rename 失败 | 🟢 正常容错 | UI 层 |
135
-
136
- **关键区分**:
137
- - **"正常路径"的降级**(如 `:5908` 无时间表达)**不是缺陷** —— 不该报错;
138
- - **"异常路径"的降级**(如 `:5897` ENOENT、`:5877` 引擎失败)**才是** —— 用户应当能知道。
139
-
140
- ⇒ **R3 留痕层的判据应是**:区分「**预期内分支**」与「**预期外失败**」。
141
- 只对后者留痕,否则会淹没在正常路径中。
142
-
143
- ---
144
-
145
- ## 4. 对执行顺序的影响
146
-
147
- | 序 | 项 | 变化 |
148
- |---|---|---|
149
- | **R1** | 本报告 | ✅ **完成** |
150
- | **M2.5a** | L0 质量门 | ⚠️ **前置 M2.5c 已撤销 ⇒ 立即可开工,无阻塞** |
151
- | **M2.5c** | ~~miv 验证~~ | ❌ **撤销(假警报)** |
152
- | **R2** | 静默降级深查 | ✅ **本报告已覆盖 10 处高危;R2 可缩为"验证 E-2 的 feature gate"** |
153
- | **R3** | 降级留痕层 | 设计要点已明确(见 §3 判据) |
154
-
155
- ---
156
-
157
- ## 5. 待办(未下结论的观察点)
158
-
159
- 1. **为何该用户从未成功 append?**(feature gate / 配置 / 权限三者未分)
160
- ⇒ 需 user 侧配置或再问用户;**本机无法复现**(本机写入健康)。
161
- 2. **`evidence` 与 `evidence-pre` 两套目录在发布版是否都存活?**
162
- ⇒ `release.mjs:169` 有 `['evidence-store-pre.js','evidence-store.js']`,
163
- `lib/` 下**两者并存**(探针输出可见)—— 需确认哪一套是发布版实际加载的。