@a9i5k4/dsh-auto-memory 2.2.6 → 2.3.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 (68) hide show
  1. package/README.md +20 -10
  2. package/README.zh-CN.md +22 -10
  3. package/docs/CONTINUITY-FLOW.md +222 -0
  4. package/docs/HANDBOOK.md +354 -0
  5. package/docs/INTEGRATION-ANALYSIS.md +348 -0
  6. package/docs/M-CM7-HANDOFF-LAYERED-RETRIEVAL.md +311 -0
  7. package/docs/M8-MEMORY-HUB.md +1 -1
  8. package/docs/PROMPT-PACK-LAYERED-RECALL.md +474 -0
  9. package/docs/PROMPT-SET-STRICT.md +389 -0
  10. package/docs/RELEASE-GO-NOGO.md +82 -0
  11. package/docs/ROADMAP.md +162 -0
  12. package/docs/STATUS-BOARD.md +147 -0
  13. package/docs/USER-GUIDE.en.md +382 -0
  14. package/docs/USER-GUIDE.zh-CN.md +382 -289
  15. package/docs/prompts/EXEC-ORDER.md +77 -0
  16. package/docs/prompts/FEEDING-SCRIPT.md +174 -0
  17. package/docs/prompts/FEEDING-SEQUENCE.md +61 -0
  18. package/docs/prompts/FIX-AGENT-M8-2b.md +119 -0
  19. package/docs/prompts/FIX-AGENT-P11.md +97 -0
  20. package/docs/prompts/FIX-AGENT-P12-FULL-REGRESSION.md +135 -0
  21. package/docs/prompts/FIX-AGENT-P12.md +113 -0
  22. package/docs/prompts/FIX-AGENT-P13-PYTHON-RANK.md +100 -0
  23. package/docs/prompts/FIX-AGENT-P8.md +120 -0
  24. package/docs/prompts/FIX-AGENT-P9.md +110 -0
  25. package/docs/prompts/FIX-AGENT-P9a.md +94 -0
  26. package/docs/prompts/FIX-AGENT-P9d.md +114 -0
  27. package/docs/prompts/FIX-AGENT-TEMPORAL-ARM.md +148 -0
  28. package/docs/prompts/LIVE-VERIFY-ZCODE.md +105 -0
  29. package/docs/prompts/M8-1-fact-metadata.md +45 -0
  30. package/docs/prompts/M8-2-ADJUDICATION.md +98 -0
  31. package/docs/prompts/M8-2-importance-wiring.md +42 -0
  32. package/docs/prompts/M8-2b-evidence-pipeline.md +52 -0
  33. package/docs/prompts/M8-3-enable-verify.md +49 -0
  34. package/docs/prompts/M8-R-REPORT.md +156 -0
  35. package/docs/prompts/M8-R-research.md +67 -0
  36. package/docs/prompts/P1-l0-index.md +30 -0
  37. package/docs/prompts/P10-importance-calibration.md +45 -0
  38. package/docs/prompts/P11-silent-catch-observability.md +43 -0
  39. package/docs/prompts/P2-semantic-recall.md +30 -0
  40. package/docs/prompts/P3-fusion.md +28 -0
  41. package/docs/prompts/P4-l0-response.md +28 -0
  42. package/docs/prompts/P5-handoff-anchor.md +28 -0
  43. package/docs/prompts/P6-ledger-weight.md +27 -0
  44. package/docs/prompts/P7-write-fix.md +26 -0
  45. package/docs/prompts/P8-rrf-wiring.md +47 -0
  46. package/docs/prompts/P9-REVIEW-DECISION.md +95 -0
  47. package/docs/prompts/P9-evidence-write-coverage.md +113 -0
  48. package/docs/prompts/README.md +105 -0
  49. package/docs/prompts/ZCODE-DROPIN.md +229 -0
  50. package/docs/prompts/_COMMON.md +88 -0
  51. package/lib/client.js +36 -2
  52. package/lib/context-host.js +77 -2
  53. package/lib/evidence-agg.js +81 -0
  54. package/lib/fact-store.js +32 -0
  55. package/lib/handoff-anchor.js +114 -0
  56. package/lib/index.js +402 -43
  57. package/lib/l0-extract.js +149 -0
  58. package/lib/l0-index.js +239 -0
  59. package/lib/m7-wire.js +4 -3
  60. package/lib/memory-importance.js +70 -0
  61. package/lib/python-setup.js +16 -4
  62. package/lib/recall-fusion.js +99 -0
  63. package/lib/shadow-retrieval.js +2 -2
  64. package/lib/storage-manage.js +17 -0
  65. package/lib/subagent-gc.js +8 -1
  66. package/lib/temporal-parse.js +159 -0
  67. package/package.json +1 -1
  68. package/python/worker_semantic_v1.py +28 -1
@@ -0,0 +1,135 @@
1
+ > **给使用者的说明**:**一整段投喂**。流程 = 修 P12 → 静态自检 + 静态回归 → **重启由你执行** → **live 验证由你按清单做** → 你结合两段结果裁定是否发版。
2
+ > 复制时从 `你是 DSH 环境里的执行 Agent` 开始到文件末尾(自包含,无需 `_COMMON.md`)。
3
+ > ⚠️ **Agent 不能重启**(重启会截断对话),所以本任务里 Agent 只负责「改 + 静态验证 + 产出重启后 live 清单」,重启与 live 验证是你的事。
4
+
5
+ ---
6
+
7
+ 你是 DSH 环境里的执行 Agent。工作目录:`D:\dsh-auto-memory`(Node.js 项目,BSD-3-Clause,v2.2.6,零运行时依赖)。你可以执行命令、读写文件。**你不能重启 dsh web,也不要尝试**。
8
+
9
+ # 任务:修 QueryPlan 截断缺陷 → 静态回归 → 产出「重启后 live 验证清单」给用户
10
+
11
+ ## 阶段 0 · 前置检查(先做,有问题就停下)
12
+
13
+ ```bash
14
+ cd /d/D/dsh-auto-memory || cd D:/dsh-auto-memory
15
+ git status --short
16
+ git log --oneline -3
17
+ ```
18
+
19
+ - 工作区现有两个**未提交**文件(`lib/index.js` +11/-5 子代理超时兜底与 localAgent 兼容;`lib/python-setup-pre.js` +16/-4 issue #27 bge-m3 仓库名、#28 tokenizer)。这两个是**并行会话的真实 bug 修复**。
20
+ - **不要擅自提交它们**——在回报里说明,等用户确认。
21
+ - 除这两个外,若还有其他改动,**立即停止回报**。
22
+
23
+ ## 阶段 1 · 修复 P12(QueryPlan 字典序截断丢弃高权重词)
24
+
25
+ ### 1.1 缺陷(已核实,先自行复现)
26
+
27
+ **这是生产路径**:`lib\context-host-pre.js:27` 导入 `buildQueryPlan` / `lexicalSearch`,在 `:321-323` 以 `mode:'prefetch'` 调用 ⇒ **主动联想(预取)链路**,本项目的核心功能。
28
+
29
+ `lib\shadow-retrieval-pre.js` 的 `buildQueryPlan` 内(约 246-250):
30
+
31
+ ```js
32
+ // 排序稳定:按 term 字典序
33
+ const terms = [...seenTerms.values()].sort((a, b) => (a.term < b.term ? -1 : a.term > b.term ? 1 : 0))
34
+ if (terms.length > SHADOW_LEXICAL_BUDGET_PRE_V1.queryTerms) { // queryTerms = 32
35
+ terms.length = SHADOW_LEXICAL_BUDGET_PRE_V1.queryTerms
36
+ }
37
+ ```
38
+
39
+ 而 `seenTerms` 里每个词**都带 `weight`**(约 `:223`):
40
+
41
+ ```
42
+ trigger 1.0 > recent-user 0.8 > tool-result 0.6 > reasoning 0.5 > tool-call 0.4 > assistant 0.2
43
+ ```
44
+
45
+ ⇒ 排序只为确定性,截断却取字典序前 32 个:**权重 1.0 的 trigger 词可能被丢,权重 0.2 的 assistant 词反而留下**。
46
+
47
+ ### 1.2 改法
48
+
49
+ 排序键改为 **`weight` 降序优先,`term` 字典序升序作为稳定 tiebreak**,截断逻辑与 `truncated` 标记不变。
50
+
51
+ ### 1.3 改动边界
52
+
53
+ - ✅ 允许修改:`lib\shadow-retrieval-pre.js` 的 `buildQueryPlan` 排序段(最小 diff)
54
+ - ✅ 允许修改:`tests\smoke\smoke-test-m4-pre.mjs` 中因 `queryDigest` 变化失效的断言(**逐条列出新旧值**)
55
+ - ❌ 禁止修改:`lib\context-host-pre.js`、`lib\index.js`、`lib\semantic-js-pre.js`、`lib\recall-fusion-pre.js`
56
+ - ❌ 禁止:改 `queryTerms` 预算、改 tokenizer、改 weight 赋值规则、引入依赖、整文件重写
57
+
58
+ ### 1.4 验收
59
+
60
+ 1. fixture:词项 > 32 且高权重词恰好字典序靠后 ⇒ 修复后高权重词保留、低权重词被截;修复前该词被截(回归证明)
61
+ 2. 确定性:同输入两次 `buildQueryPlan` 结果 `JSON.stringify` 全等
62
+ 3. 词项 < 32 时结果与现状一致(无谓变更)
63
+ 4. `queryDigest` 变化清单(新旧值 + 原因)
64
+
65
+ ## 阶段 2 · 静态自检与静态回归(Agent 做,不涉及重启)
66
+
67
+ ```bash
68
+ cd /d/D/dsh-auto-memory || cd D:/dsh-auto-memory
69
+ node --check lib/shadow-retrieval-pre.js
70
+
71
+ node tests/smoke/smoke-test-m4-pre.mjs # m4(可能因 queryDigest 变更而更新,须全绿)
72
+ node tests/smoke/smoke-test-p8-rrf-wiring-pre.mjs # 14
73
+ node tests/smoke/smoke-test-p4-l0-response-pre.mjs # 34
74
+ node tests/smoke/smoke-test-evidence-agg-pre.mjs # 14
75
+ node tests/smoke/smoke-test-memory-importance-pre.mjs # 18
76
+ node tests/smoke/smoke-test-p9a-correction-attribution-pre.mjs # 26
77
+ node tests/smoke/smoke-test-p9d-recent-evidence-ts-pre.mjs # 13
78
+ node tests/smoke/smoke-test-handoff-pre.mjs # 51
79
+ node tests/smoke/smoke-test-continue-chain-pre.mjs # 58
80
+ ```
81
+
82
+ **任一数字下降 → 立即停止回报**(这是静态 Go/No-Go 的第一道)。
83
+
84
+ ## 阶段 3 · 产出「重启后 live 验证清单」(交给用户执行)
85
+
86
+ 在回报末尾附上下面这份清单,**明确标注:由用户在重启 dsh web 之后逐项执行**。
87
+
88
+ | # | 功能 | 怎么验 | 通过标准 |
89
+ |---|---|---|---|
90
+ | **L1** | **主动联想(P12 直接影响面)** | 开一个新会话,聊一段与已有记忆主题相关的话 | 记忆被**主动**联想并注入;从日志/diag 看 `queryPlan` 保留的词里**含高权重来源(user/trigger)的词** |
91
+ | **L2** | **语义检索(P8)** | 用 `memory_recall_pre` 查一个**词法不重合但语义相关**的查询(如记忆里写"npm 发布报 ENEEDAUTH",查"发布凭证问题") | 能召回。失败则切 `legacy` 对比——若 legacy 正常而 rrf 失败 ⇒ **P8 回归** |
92
+ | **L3** | L0 返回与展开 | 同 L2 的 recall | 返回 L0 列表(含 id/score),用 `expand="mem_xxx"` 能取到原文 |
93
+ | **L4** | M8 记忆中枢 | 浏览器打开记忆面板 | 三栏(技能/事实/经历)有内容或正确空态;`GET /api/dsh-auto-memory-pre/memory-hub` 返回 200 + overview |
94
+ | **L5** | 证据落盘 | 查看 `C:\Users\JH Z\.dsh\memory\evidence-pre\events\` 当日文件 | 有 `seen` 事件新增 |
95
+ | **L6** | 跨窗口接续 | 让水位涨到 75% 触发自动接续(或手动一键接续) | 新会话收到分层材料,且**不再要求先 read 转写**;接续后对话能连续推进 |
96
+ | **L7** | 记忆写入 | 对话若干轮后检查日志文件与 `facts.json` / `episodes.json` | 有新条目;再重启一次后数据能 restore 不丢 |
97
+
98
+ > L1 与 L2 是**最关键**的两项:P12 改的是主动联想,P8 是排序行为变更。
99
+
100
+ ## 阶段 4 · 静态结论 + 发版建议
101
+
102
+ 回报最后给一段**静态侧结论**(不包含 live,live 由用户补):
103
+
104
+ ```
105
+ 静态结论:【通过 / 未通过】
106
+ - 九套基线:<全绿 / 哪项失败>
107
+ - queryDigest 变更:<清单>
108
+ - 建议:若静态通过,请用户重启 dsh web 后按 live 清单验证;live 全过即可发版
109
+ ```
110
+
111
+ ### 静态 No-Go 判据
112
+
113
+ 1. 任一静态基线数字下降
114
+ 2. 工作区除阶段 0 那两个文件外还有其他未提交改动
115
+
116
+ ### 回报必须包含
117
+
118
+ 1. P12 改动:`文件:行号 — 原内容 → 新内容`
119
+ 2. 修复前 / 修复后保留词对比(fixture 证据)
120
+ 3. `queryDigest` 变更清单
121
+ 4. 九套静态原始输出
122
+ 5. **静态结论**
123
+ 6. **重启后 live 验证清单**(阶段 3 表,供用户执行)
124
+ 7. 回滚:`git checkout lib/shadow-retrieval-pre.js tests/smoke/smoke-test-m4-pre.mjs`
125
+
126
+ ## 硬约束(全程)
127
+
128
+ - 搜索优先:每个符号先 grep 定位,行号以实际为准
129
+ - 最小 diff,禁止整文件重写、禁止顺带重构
130
+ - 零新依赖;不改既有 API 签名;不删既有断言
131
+ - **不尝试重启 dsh web**;无法定位就停下回报,禁止猜测
132
+
133
+ ---
134
+
135
+ > 背景:`D:\dsh-auto-memory\docs\STATUS-BOARD.md` §5.1、`docs\RELEASE-GO-NOGO.md`。
@@ -0,0 +1,113 @@
1
+ > **给使用者的说明**:**可选段**(是否发版前修由你定)。复制时从 `你是一名严谨的修复 Agent` 开始到文件末尾(自包含,无需 `_COMMON.md`)。
2
+ > 改 `lib\shadow-retrieval-pre.js`,与并行会话的 `index.js` / `python-setup-pre.js` 无冲突。
3
+
4
+ ---
5
+
6
+ 你是一名严谨的修复 Agent。工作目录:`D:\dsh-auto-memory`(Node.js 项目,BSD-3-Clause,v2.2.6,零运行时依赖)。
7
+
8
+ # 任务:修复 QueryPlan 词项截断按字典序丢弃高权重词
9
+
10
+ ## 0. 缺陷(已核实,必须先自行复现)
11
+
12
+ **这是生产路径,不是评估通路**:`lib\context-host-pre.js:27` 导入 `buildQueryPlan` / `lexicalSearch`,在 `:321-323` 以 `mode:'prefetch'` 调用——这是**主动联想(预取)**链路,即本项目的核心功能。
13
+
14
+ **缺陷代码**(`lib\shadow-retrieval-pre.js`,`buildQueryPlan` 内约 246-250):
15
+
16
+ ```js
17
+ // 排序稳定:按 term 字典序
18
+ const terms = [...seenTerms.values()].sort((a, b) => (a.term < b.term ? -1 : a.term > b.term ? 1 : 0))
19
+ if (terms.length > SHADOW_LEXICAL_BUDGET_PRE_V1.queryTerms) { // queryTerms = 32
20
+ terms.length = SHADOW_LEXICAL_BUDGET_PRE_V1.queryTerms
21
+ }
22
+ ```
23
+
24
+ **问题**:排序纯粹为了确定性,截断却直接取前 32 个 ⇒ **被保留的是字典序靠前的词,与词的重要性无关**。
25
+
26
+ 而 `seenTerms` 里**每个词都带 `weight`**(由来源决定,`:223`):
27
+
28
+ ```
29
+ trigger 1.0 > recent-user 0.8 > tool-result 0.6 > reasoning 0.5 > tool-call 0.4 > assistant 0.2
30
+ ```
31
+
32
+ 后果:一个 `weight=1.0` 的 trigger 词可能被截掉,而 `weight=0.2` 的 assistant 词被留下 ⇒ 主动联想的词法候选集被削偏。
33
+ 触发频率**不低**:窗口为 8 段 / 4096 字符(`:65-67`),词项很容易超过 32。
34
+
35
+ **第一步**:复现上述行号与常量值,写进回报。
36
+
37
+ ## 1. 必读文件(绝对路径)
38
+
39
+ - `D:\dsh-auto-memory\lib\shadow-retrieval-pre.js` —— 改动面 `buildQueryPlan`(221-290)、常量 `SHADOW_LEXICAL_BUDGET_PRE_V1`(64-70)
40
+ - `D:\dsh-auto-memory\lib\context-host-pre.js` —— 唯一生产调用点 `:321-323`(**禁止修改**)
41
+ - `D:\dsh-auto-memory\tests\smoke\smoke-test-m4-pre.mjs` —— 现有断言(**含 `queryDigest` 断言 2 处,本段必然需要更新**)
42
+
43
+ ## 2. 目标
44
+
45
+ 把截断选择从「字典序靠前」改为「**权重高者优先**」,同时保持确定性。
46
+
47
+ ## 3. 改动边界
48
+
49
+ - ✅ 允许修改:`lib\shadow-retrieval-pre.js` 中 `buildQueryPlan` 的排序那一段(最小 diff)
50
+ - ✅ 允许修改:`tests\smoke\smoke-test-m4-pre.mjs` 中因 `queryDigest` 变化而失效的断言(**必须逐条说明新旧值与变更原因**)
51
+ - ❌ **禁止修改**:`lib\context-host-pre.js`、`lib\index.js`、`lib\semantic-js-pre.js`、`lib\recall-fusion-pre.js`
52
+ - ❌ 禁止:改 `queryTerms` 预算值;改 tokenizer;改 `weight` 的赋值规则;引入新依赖;整文件重写
53
+
54
+ ## 4. 设计要求
55
+
56
+ 1. 排序键:**`weight` 降序**(高权重优先保留),**同权重按 `term` 字典序升序**作为稳定 tiebreak
57
+ 2. 截断逻辑不变(仍取前 `queryTerms` 个,仍置 `truncated`)
58
+ 3. **确定性不变**:相同输入 → 逐字节相同的 QueryPlan(含 `queryDigest`)
59
+ 4. 可选增强(**仅在你能证明不影响确定性时做**):把词项在窗口内的出现次数纳入次要排序键;若做,必须写清理由与断言。**做不了就只做 weight 排序,不要勉强。**
60
+
61
+ ## 5. 验收标准
62
+
63
+ 1. 构造 fixture:窗口内词项 > `queryTerms`,且高权重词恰好字典序靠后 → **修复后高权重词保留、低权重词被截**
64
+ 2. 同一 fixture:修复前该高权重词被截(回归证明)
65
+ 3. 确定性:同输入两次 `buildQueryPlan` 结果 `JSON.stringify` 全等
66
+ 4. 未触发截断时(词项 < 32)结果与现状一致(无谓变更)
67
+ 5. **`queryDigest` 变化的说明**:列出所有因本改动而变化的断言及新旧值
68
+ 6. 既有基线不降:`m4`(更新后全绿)、handoff 51 / continue-chain 58 / p8 14 / p4 34 / evidence-agg 14 / memory-importance 18 / p9a 26 / p9d 13
69
+
70
+ ## 6. 停止条件
71
+
72
+ - 若 `weight` 字段在截断时不可用(例如被归一化掉)→ 停止回报;
73
+ - 若改动导致 `m4` 断言大面积失效(>5 处)→ 停止回报,说明影响面,等我裁决。
74
+
75
+ ```
76
+ 停止原因:<描述>
77
+ 已尝试:<搜索词 1>、<搜索词 2>、<路径>
78
+ 需要:<澄清问题>
79
+ ```
80
+
81
+ ## 7. 完成后自检
82
+
83
+ ```bash
84
+ cd /d/D/dsh-auto-memory || cd D:/dsh-auto-memory
85
+
86
+ node --check lib/shadow-retrieval-pre.js
87
+
88
+ node tests/smoke/smoke-test-m4-pre.mjs # 基线(更新后应全绿)
89
+ node tests/smoke/smoke-test-handoff-pre.mjs # 51
90
+ node tests/smoke/smoke-test-continue-chain-pre.mjs # 58
91
+ node tests/smoke/smoke-test-p8-rrf-wiring-pre.mjs # 14
92
+ node tests/smoke/smoke-test-p4-l0-response-pre.mjs # 34
93
+ node tests/smoke/smoke-test-evidence-agg-pre.mjs # 14
94
+ node tests/smoke/smoke-test-memory-importance-pre.mjs # 18
95
+ node tests/smoke/smoke-test-p9a-correction-attribution-pre.mjs # 26
96
+ node tests/smoke/smoke-test-p9d-recent-evidence-ts-pre.mjs # 13
97
+
98
+ git status --short
99
+ git diff --stat
100
+ ```
101
+
102
+ ## 8. 回报必须包含
103
+
104
+ 1. 复现结果(真实行号 + `queryTerms` 值)
105
+ 2. 改动:`文件:行号 — 原内容 → 新内容`
106
+ 3. 修复前 / 修复后的保留词对比(fixture 证据)
107
+ 4. **`queryDigest` 变更清单**(新旧值 + 原因)
108
+ 5. 确定性断言结果
109
+ 6. 回滚:`git checkout lib/shadow-retrieval-pre.js tests/smoke/smoke-test-m4-pre.mjs`
110
+
111
+ ---
112
+
113
+ > 立项背景:`D:\dsh-auto-memory\docs\STATUS-BOARD.md` §5。
@@ -0,0 +1,100 @@
1
+ > **投喂方式**:发版后投喂。复制时从 `你是 DSH 环境里的执行 Agent` 开始到文件末尾(自包含,无需 `_COMMON.md`)。
2
+ > ⚠️ 改 `python/worker_semantic_pre_v1.py` + `lib/index.js` +(可能)`lib/python-sidecar-client-pre.js`,**不能重启 dsh web**(会截断对话),改完只做静态验证。
3
+
4
+ ---
5
+
6
+ 你是 DSH 环境里的执行 Agent。工作目录:`D:\dsh-auto-memory`(Node.js + Python 项目,BSD-3-Clause,v2.2.6,零运行时依赖)。
7
+
8
+ # 任务:给 recall 接 C3(Python BGE-M3)语义臂
9
+
10
+ ## 0. 背景(已核实,先自行复现)
11
+
12
+ - 当前 recall 的语义臂只走 `lib/index.js:6077` 的 `engine._jsSemanticRank`,首行 `if ((await engine.resolveSemanticTier()) !== 'c2') return null` → **C3(python)档下语义臂恒空**,recall 只剩词法。
13
+ - **但 Python 侧早已实现 dense 检索**:`python/worker_semantic_pre_v1.py` 里已有
14
+ - `dense_search(self, query_text, workspace_key, scope, miv, top_k=...)`(约 `:406`):对 `self.vectors[(ws_ref, scope)]` 做余弦检索,内置三重过滤(workspaceRef + scope + miv 全匹配)
15
+ - `hybrid_rank(...)`(约 `:468`):dense+lexical 融合(**本任务不用它,recall 已有自己的 rank-space RRF**)
16
+ - 索引粒度:Python 按 **memoryId**(`mem_xxx`)建索引(chunk 带 `memoryId`),与 recall 的 L0 候选 `id` **同 ID 空间** ⇒ dense 分数可直接映射。
17
+ - 档位解析 `resolveSemanticTier()`(`lib/index.js:6058`):`lexical→c1`;`python→c3`(int8 模型文件存在才 c3,否则 c1);`auto/js→C2 资产就绪 c2 否则 c1`。
18
+
19
+ ## 1. 目标
20
+
21
+ 在 C3 档下,让 recall 用 Python 的 `dense_search` 结果作为语义臂;`auto` 档择优(python 可用则 c3,否则 c2);任何失败 fail-soft 回退 C2 → 词法。**不碰 C2 默认路径、不影响首启 JS 自动下载。**
22
+
23
+ ## 2. 实施步骤
24
+
25
+ ### B1 · Python worker 新增命令 `recall_rank`
26
+
27
+ 在 `python/worker_semantic_pre_v1.py` 新增 handler(沿用既有 handler 命名与协议框架):
28
+ - 入参:`{cmd:'recall_rank', workspaceKey, scope, miv, query, topK?}`
29
+ - 实现:调 `self.dense_search(query, workspaceKey, scope, miv, top_k=topK or <默认 20>)`
30
+ - 返回:`{scores:[{memoryId, score}], miv}`;embedder 未就绪 / 无 vectors / encode 失败 → 返回 `{scores:[], miv}`(**不抛**)
31
+ - 复用三重过滤,不新造;不写回、不改索引
32
+
33
+ ### B2 · JS 侧 `engine._pySemanticRank`
34
+
35
+ 在 `lib/index.js` 新增 `engine._pySemanticRank = async (corpusSnap, queryText) => {...}`:
36
+ - 前提:`(await engine.resolveSemanticTier()) === 'c3'`
37
+ - 经 sidecar 调 `recall_rank`(先 grep 确认 sidecar 的实际调用方法名,如 `request`/`push`/`command`,**以代码为准**)
38
+ - 返回 `{scores: Map<memoryId, number>}`;sidecar 抛错/超时/空 → 返回 `null`
39
+
40
+ ### B3 · recall 择优接线 + 守卫放宽
41
+
42
+ - 新增择优函数(或扩展 `_jsSemanticRank`):`c3 → _pySemanticRank`;`c2 → _jsSemantic.rank`;`auto → 先 c3(可用则用之)否则 c2`;`lexical → null`
43
+ - recall L0 分支(`lib/index.js` 约 3355-3420)改用择优函数取 dense 臂;`null` → 仅词法(现状)
44
+ - 保留既有 `_jsSemanticRank` 行为不变(**不要删**,激活路径仍在用)
45
+
46
+ ## 3. 改动边界
47
+
48
+ - ✅ 允许修改:`python/worker_semantic_pre_v1.py`(新增 handler)、`lib/index.js`(新增 `_pySemanticRank` + 择优 + recall 接线)
49
+ - ✅ 允许修改(若确需):`lib/python-sidecar-client-pre.js`(仅当现有调用方法不满足时,最小扩展)
50
+ - ❌ **禁止修改**:`lib/shadow-retrieval-pre.js`、`lib/semantic-js-pre.js`、`lib/recall-fusion-pre.js`、`lib/l0-extract-pre.js`、`lib/evidence-agg-pre.js`、`lib/memory-importance-pre.js`
51
+ - ❌ 禁止:改 `resolveSemanticTier` 的档位判定语义;改 `dense_search` 的三重过滤;改 C2 路径;引入第三方依赖
52
+
53
+ ## 4. 验收标准
54
+
55
+ 1. `dense_search` 已能返回 `{memoryId, score}` 列表(用真实/桩数据验证,若 `self.embedder` 未加载则验证 fail-soft 分支)
56
+ 2. `_pySemanticRank`:tier=c3 时经 sidecar 返回 scores Map;sidecar 异常返回 null
57
+ 3. recall:c3 档下含语义臂、结果带语义分;auto 档 python 可用则用 python、否则 c2;lexical 档无语义臂
58
+ 4. fail-soft:python 不可用/超时 → 回退 C2(资产就绪)→ 词法,**不报错不阻塞**
59
+ 5. 确定性/回归:非 c3 档下 recall 行为与现状一致;`rankFusionRRFPre` 无 `temp` 时逐字节不变
60
+ 6. 既有基线不降:m4 / p8 14 / p4 34 / evidence-agg 14 / memory-importance 18 / p9a 26 / p9d 13 / temporal 51 / handoff 51 / continue-chain 58
61
+
62
+ ## 5. 停止条件
63
+
64
+ - sidecar 的调用方法无法定位(grep 不到任何 request/push/command 出口)→ 停止回报
65
+ - `dense_search` 签名与本 prompt 描述不符 → 停止回报
66
+
67
+ ```
68
+ 停止原因:<描述>
69
+ 已尝试:<搜索词 1>、<搜索词 2>、<路径>
70
+ 需要:<澄清问题>
71
+ ```
72
+
73
+ ## 6. 完成后自检(静态,不重启)
74
+
75
+ ```bash
76
+ cd /d/D/dsh-auto-memory || cd D:/dsh-auto-memory
77
+ node --check lib/index.js
78
+ python -c "import ast; ast.parse(open('python/worker_semantic_pre_v1.py',encoding='utf-8').read())" # 语法
79
+ # 相关 smoke(python 侧无单测则说明用桩验证,勿删既有)
80
+ node tests/smoke/smoke-test-p8-rrf-wiring-pre.mjs # 14
81
+ node tests/smoke/smoke-test-p4-l0-response-pre.mjs # 34
82
+ node tests/smoke/smoke-test-temporal-parse-pre.mjs 2>/dev/null # 51(若存在)
83
+ node tests/smoke/smoke-test-handoff-pre.mjs # 51
84
+ node tests/smoke/smoke-test-continue-chain-pre.mjs # 58
85
+ git status --short
86
+ git diff --stat
87
+ ```
88
+
89
+ ## 7. 回报必须包含
90
+
91
+ 1. sidecar 实际调用方法名 + 行号
92
+ 2. 每处改动:`文件:行号 — 原内容 → 新内容`
93
+ 3. c3 / auto / lexical 三档的召回行为对照(能跑则跑,跑不了用桩/静态说明并标注「未实证」)
94
+ 4. fail-soft 路径说明
95
+ 5. 回滚:`git checkout` 相应文件
96
+ 6. 自检原始输出
97
+
98
+ ---
99
+
100
+ > 背景:`docs/STATUS-BOARD.md` §8(时间臂之后);诊断见 `docs/prompts/M8-2-ADJUDICATION.md` §6.4 及今日工作日志 §11。
@@ -0,0 +1,120 @@
1
+ > **给使用者的说明**:下面是**一整段可直接复制投喂**的 prompt,已自包含(硬约束内联 + 绝对路径),Agent 无需再读 `_COMMON.md`。
2
+ > 复制时从 `你是一名严谨的修复 Agent` 开始,一直复制到文件末尾。
3
+
4
+ ---
5
+
6
+ 你是一名严谨的修复 Agent。工作目录:`D:\dsh-auto-memory`(Node.js 项目,BSD-3-Clause,v2.2.6,零运行时依赖)。
7
+
8
+ # 任务:把已交付但闲置的 RRF 融合接进 recall(替换字典序排序)
9
+
10
+ ## 0. 必读文件(绝对路径,先全部读完再动手)
11
+
12
+ - `D:\dsh-auto-memory\lib\index.js` —— 重点 `async recall(` 起始处(上次观测:第 3301 行,**行号可能漂移,必须重新 grep 定位**)
13
+ - `D:\dsh-auto-memory\lib\recall-fusion-pre.js` —— P3 已交付的 RRF 实现(**当前零引用**)
14
+ - `D:\dsh-auto-memory\lib\semantic-js-pre.js` —— C2 语义引擎 / `_jsSemanticRank`
15
+ - `D:\dsh-auto-memory\lib\shadow-retrieval-pre.js` —— 词法臂
16
+ - `D:\dsh-auto-memory\lib\l0-extract-pre.js` —— L0 抽取(**只读参考,禁止修改**)
17
+ - `D:\dsh-auto-memory\docs\prompts\M8-2-ADJUDICATION.md` —— 本任务的裁决依据(可选读)
18
+
19
+ ## 1. 问题(已有代码证据,你必须先自行复现验证)
20
+
21
+ **证据 A — P3 交付物零引用**:在 `lib/` 下 grep `recall-fusion`,除自身外无任何命中。`lib\recall-fusion-pre.js` 导出 `rankFusionRRFPre(pairs, opts)`、`FUSION_RRF_K_PRE_V1 = 60`、`FUSION_RRF_DIVISOR_PRE_V1 = 60`、`RECALL_FUSION_VERSION = 'rrf_fusion_pre_v1'`,**没有任何调用方**。
22
+
23
+ **证据 B — recall 当前是字典序排序,不是融合**:`recall()` 的 L0 命中排序形如
24
+
25
+ ```js
26
+ .sort((a, b) => b.lex - a.lex || (b.sem || 0) - (a.sem || 0) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
27
+ ```
28
+
29
+ 含义:**词法分 `lex` 绝对主导,语义分 `sem` 只在 `lex` 完全相等时才用于打破平局**。这导致 P2 接入的 C2 语义臂在排序中几乎不起作用——`recall()` 实质仍是纯词法。**请用 grep 复现这两条证据,并在回报中给出你实测到的真实行号。**
30
+
31
+ ## 2. 目标
32
+
33
+ 把 `rankFusionRRFPre` 接入 `recall()` 的 L0 命中排序,取代上述字典序排序,使词法臂与语义臂真正融合。
34
+
35
+ **本任务定位为「缺陷修复」而非新增能力**(P2 语义臂当前实效为零),因此新排序**默认开启**,但必须保留 `legacy` 回退开关。
36
+
37
+ ## 3. 硬约束(违反即打回)
38
+
39
+ 1. **搜索优先**:动手前必须 grep 定位每个符号并记下真实行号;不得臆造 API、字段名、配置项。
40
+ 2. **最小 diff**:禁止整文件重写,禁止"顺手重构/统一风格/优化命名"。
41
+ 3. **零新依赖**:项目 `dependencies` 为空。
42
+ 4. **不得改 API 签名**:`recall(query, limit, agent, scope, opts)` 保持不变。
43
+ 5. **不得删除既有测试断言**,不得降低任何既有 smoke 数字。
44
+ 6. **禁止 score-space 加权 RRF**:必须用 rank-space `1/(k + rank/divisor)`,`k = 60`(复用 `FUSION_RRF_K_PRE_V1`)。依据:Hindsight issue #3956 实测,k=60 时动态范围仅 5.9 倍,加权会让排序退化为字典序,recall@20 从 0.97 崩到 0.40。
45
+ 7. **不得触碰前缀缓存纪律层**(I1):本任务只改检索排序,不改任何注入内容。
46
+
47
+ ## 4. 改动边界
48
+
49
+ **允许修改**
50
+ - `D:\dsh-auto-memory\lib\index.js` —— 仅限 `recall()` 内部 **L0 命中排序那一段**(最小 diff)
51
+ - `D:\dsh-auto-memory\tests\smoke\` —— 允许新增断言文件
52
+
53
+ **禁止修改**(绝对路径)
54
+ - `D:\dsh-auto-memory\lib\recall-fusion-pre.js`(P3 已锁定)
55
+ - `D:\dsh-auto-memory\lib\l0-extract-pre.js`(T1 已锁定)
56
+ - `D:\dsh-auto-memory\lib\semantic-js-pre.js`
57
+ - `D:\dsh-auto-memory\lib\shadow-retrieval-pre.js`
58
+ - `D:\dsh-auto-memory\lib\index.js` 中除上述排序段以外的任何内容(尤其是注入、接续、水位逻辑)
59
+
60
+ ## 5. 验收标准(逐条可验证)
61
+
62
+ 1. **核心断言**:构造「`lex` 相同、`sem` 不同」的用例,排序结果**必须随 `sem` 变化**。这是本任务存在的唯一理由,必须有对应断言。
63
+ 2. RRF 参数 `k = 60`,来自 `FUSION_RRF_K_PRE_V1`,不得硬编码其他值。
64
+ 3. **排序确定性**:相同输入两次调用,`id` 序列逐项相等。
65
+ 4. 提供 `legacy` 回退开关(配置项或参数,键名与默认值写进回报),**默认值为 `rrf`**。
66
+ 5. 语义臂不可用(`_jsSemanticRank` 抛错或返回空)→ fail-soft 退回纯词法,不报错、不阻塞。
67
+ 6. 非 L0 分支(旧调用方式,`opts` 不传 `format:'l0'`)行为**完全不变**。
68
+ 7. 回报中必须给出 **legacy vs rrf 的排序差异实测**:至少 3 条主题性查询,每条列出 top-5 的 `id` 序列 diff。
69
+
70
+ ## 6. 停止条件(触发即停下回报,禁止猜测)
71
+
72
+ - `rankFusionRRFPre(pairs, opts)` 的 `pairs` 形状与 `recall()` 现有数据结构无法对应;
73
+ - `lex` / `sem` 的实际含义与你理解不符(例如 `sem` 不是语义分);
74
+ - 找不到 L0 分支的排序位置。
75
+
76
+ 回报格式:
77
+ ```
78
+ 停止原因:未能定位 <符号/文件>
79
+ 已尝试:<搜索词 1>、<搜索词 2>、<路径>
80
+ 需要:<澄清问题>
81
+ ```
82
+
83
+ ## 7. 完成后自检(逐项执行并把原始输出贴进回报)
84
+
85
+ ```bash
86
+ cd /d/D/dsh-auto-memory || cd D:/dsh-auto-memory
87
+
88
+ node --check lib/index.js
89
+ node --check lib/recall-fusion-pre.js
90
+
91
+ # 基线(数字不得下降,缺失的套件先 ls tests/smoke/ 确认真实文件名)
92
+ node tests/smoke/smoke-test-p4-recall-l0-pre.mjs # 34
93
+ node tests/smoke/smoke-test-l0-extract-pre.mjs # 18
94
+ node tests/smoke/smoke-test-handoff-pre.mjs # 51
95
+ node tests/smoke/smoke-test-continue-chain-pre.mjs # 58
96
+ node tests/smoke/smoke-test-water-step-pre.mjs # 12
97
+ node tests/smoke/smoke-test-autocont-host-pre.mjs # 29
98
+
99
+ # 接口一致性:rankFusionRRFPre 现在应有调用方
100
+ grep -rn "rankFusionRRFPre" lib/ | head -20
101
+
102
+ git status --short
103
+ git diff --stat
104
+ ```
105
+
106
+ ## 8. 回报必须包含(缺一不可)
107
+
108
+ 1. 证据 A / 证据 B 的**复现行号**(`文件:行号`)
109
+ 2. 每处改动写成 `文件路径:行号 — 原内容 → 新内容`
110
+ 3. **为什么改在这个位置**:上游数据来源 + 下游消费者,用 grep 到的调用链证明
111
+ 4. 开关的键名、默认值、行号;`recall()` 的全部调用点行号
112
+ 5. legacy vs rrf 的 top-5 diff(第 5.7 条)
113
+ 6. 回滚方式(本任务:`git checkout lib/index.js`,或把开关切回 `legacy`)
114
+ 7. 上述自检的原始输出
115
+
116
+ **回滚**:`git checkout lib/index.js`;或把开关切回 `legacy`。
117
+
118
+ ---
119
+
120
+ > **投喂提示**:本段自包含,无需再附 `_COMMON.md`。原文依据见 `D:\dsh-auto-memory\docs\prompts\P8-rrf-wiring.md` 与 `M8-2-ADJUDICATION.md`。
@@ -0,0 +1,110 @@
1
+ > **给使用者的说明**:**现在投喂的主段**。复制时从 `你是一名严谨的排查 Agent` 开始,一直到文件末尾(自包含,硬约束已内联,无需再附 `_COMMON.md`)。
2
+ > 产出报告后**先交给规划侧过目**,再决定是否投喂修复段。
3
+
4
+ ---
5
+
6
+ 你是一名严谨的排查 Agent。工作目录:`D:\dsh-auto-memory`(Node.js 项目,BSD-3-Clause,v2.2.6,零运行时依赖)。
7
+
8
+ # 任务:evidence 写入侧覆盖率排查(reuse / success 零产出,correction 近乎为零)
9
+
10
+ ## 0. 背景(已有实测数据,你必须先自行复现)
11
+
12
+ evidence 事件落盘于 `C:\Users\JH Z\.dsh\memory\evidence-pre\events\*.jsonl`(按日,每行一条 JSON)。全量按 `kind` 统计的实测分布:
13
+
14
+ | kind | 全量 | 近 7 天 |
15
+ |---|---|---|
16
+ | seen | 4930 | 4828 |
17
+ | cite | 286 | 199 |
18
+ | read | 82 | 33 |
19
+ | correction | **2** | 1 |
20
+ | **reuse** | **0** | **0** |
21
+ | **success** | **0** | **0** |
22
+
23
+ **问题**:`reuse` 与 `success` **从未落盘**(`createSuccessEvidencePre` 在 `lib/` 下有 5 处调用点,却零事件产出);`correction` 全量仅 2 条。六类枚举见 `lib\context-bridge-pre.js:45`。
24
+
25
+ **影响**:下游 `lib\memory-importance-pre.js` 把六类计数转成 importance,再经 `lib\evidence-agg-pre.js` 加权进 `recall()` 的 dense 臂。信号缺三类 ⇒ **importance 现在实质是"曝光度"(seen 驱动),不是"有用性"**;负向下压(correction)几乎不存在。
26
+
27
+ **第一步**:写脚本复现上述分布(python 或 node 均可),把你的实测结果贴进回报。**不得直接引用本 prompt 的数字而不复现。**
28
+
29
+ ## 1. 必读文件(绝对路径)
30
+
31
+ - `D:\dsh-auto-memory\lib\context-bridge-pre.js` —— 六类枚举(第 45 行 `ACCESS_KINDS_PRE_V1`)与各 create 函数
32
+ - `D:\dsh-auto-memory\lib\index.js` —— 写入侧调用点(重点搜 `createSuccessEvidencePre`、`createCorrectionEvidencesFromText`、`createCiteEvidencesFromText`、`createAccessEvidencePre`、`recordEvidence`;另见 `:1301` 附近的 read coverage 观察、`:4539` 附近的 success evidence)
33
+ - `D:\dsh-auto-memory\lib\procedure-store-pre.js` —— 查 success/correction 是否**只喂给 procedure 晋升**而未落 events
34
+ - `D:\dsh-auto-memory\lib\evidence-agg-pre.js` —— 消费侧(**禁止修改**)
35
+ - 真实数据:`C:\Users\JH Z\.dsh\memory\evidence-pre\events\*.jsonl`
36
+
37
+ ## 2. 目标
38
+
39
+ 1. **定位根因**:对 `reuse` / `success` / `correction` 三者**分别**给出结论,三选一(须有证据):
40
+ - (a) **调用点未接线** —— create 函数存在,但生产路径从未调用;
41
+ - (b) **触发条件未满足** —— 有调用,但前置条件(如"本轮 substantive 且记忆被 read/cite")几乎不成立;
42
+ - (c) **落盘分流** —— 事件被写到别处(如只喂 procedure store)而没进 events 目录。
43
+ 2. **影响判断**:当前 importance 实际由哪些信号驱动,与设计的六类模型差多少。
44
+ 3. **理想触发场景清单**(本段核心交付物之一):六类逐个给出——应在什么用户行为/系统事件下产生(例:`read` = 模型实际读了记忆原文;`cite` = 回复引用了该记忆;`reuse` = 跨会话再次命中;`success` = 该记忆参与后任务被判成功;`correction` = 用户纠正了由该记忆产生的内容)/当前是否触发/修复后**预期分布量级**(如"success 应达 seen 的 1%~5%")。
45
+ 4. **默认不修**:本段是排查。除用户明确同意外**不得修改任何 `lib/` 文件**,修复方案写进回报等批准。
46
+
47
+ ## 3. 硬约束(违反即打回)
48
+
49
+ 1. **搜索优先**:每个符号先 grep 到定义处并记下真实行号;统计必须基于真实文件,行号以实际为准(prompt 中的行号是上次观测值,可能漂移)。
50
+ 2. **默认零代码改动**(见 §2.4)。
51
+ 3. 若获准修复:最小 diff、零新依赖、不改既有 API 签名、不删既有断言。
52
+ 4. **events 目录只读**,禁止任何写操作。
53
+ 5. 禁改:`lib\evidence-agg-pre.js`、`lib\memory-importance-pre.js`、`lib\recall-fusion-pre.js`(均已锁定)。
54
+ 6. **不得臆造**:查不到就说查不到,按 §6 停止回报,禁止"应该是""大概是"。
55
+
56
+ ## 4. 改动边界
57
+
58
+ - ✅ 允许:临时统计脚本(**用完即删,不得留在仓库**)
59
+ - ✅ 允许:获用户批准后的最小修复
60
+ - ❌ 禁止修改:`lib\evidence-agg-pre.js`、`lib\memory-importance-pre.js`、`lib\recall-fusion-pre.js`、`lib\context-bridge-pre.js`、`lib\procedure-store-pre.js`、`lib\fact-store-pre.js`
61
+ - ❌ 禁止:events 目录任何写操作
62
+
63
+ ## 5. 验收标准
64
+
65
+ 1. 回报含**你实测的 kind 分布**(全量 + 近 7 天),与背景表对照
66
+ 2. `reuse` / `success` / `correction` 三者各自标注 (a)/(b)/(c),各附 `文件:行号` 证据
67
+ 3. **所有写入 events 的调用点清单**(完整,含行号)
68
+ 4. "当前 importance 实际由哪些信号驱动"的判断
69
+ 5. **理想触发场景清单**(§2.3)
70
+ 6. 修复方案(若适用):改哪个文件哪一行、预期新增哪些 kind、如何验证、回滚方式
71
+
72
+ ## 6. 停止条件
73
+
74
+ - 找不到任何写入 events 的代码路径(落盘机制与理解不同);
75
+ - `ACCESS_KINDS_PRE_V1` 与实际落盘 kind 不一致且无法解释。
76
+
77
+ ```
78
+ 停止原因:未能定位 <符号/路径>
79
+ 已尝试:<搜索词 1>、<搜索词 2>、<路径>
80
+ 需要:<澄清问题>
81
+ ```
82
+
83
+ ## 7. 自检(排查段,lib/ 不得有改动)
84
+
85
+ ```bash
86
+ cd /d/D/dsh-auto-memory || cd D:/dsh-auto-memory
87
+
88
+ node tests/smoke/smoke-test-evidence-agg-pre.mjs # 14
89
+ node tests/smoke/smoke-test-memory-importance-pre.mjs # 18
90
+ node tests/smoke/smoke-test-p4-l0-response-pre.mjs # 34
91
+ node tests/smoke/smoke-test-p8-rrf-wiring-pre.mjs # 14
92
+
93
+ git status --short # 仅排查时 lib/ 不得有任何改动
94
+ git diff --stat # 应为 0
95
+ ```
96
+
97
+ ## 8. 回报必须包含(缺一不可)
98
+
99
+ 1. 实测 kind 分布(全量 + 近 7 天)+ 复现脚本核心片段
100
+ 2. 三者根因结论 + `文件:行号` 证据
101
+ 3. events 写入点完整清单
102
+ 4. importance 实际驱动信号判断
103
+ 5. 六类理想触发场景清单(含预期分布量级)
104
+ 6. 修复方案(若适用)+ 回滚方式 + 自检原始输出
105
+
106
+ **重要**:若你未能实际运行统计而只做了静态分析,必须在回报顶部**显式标注「未实证」**。
107
+
108
+ ---
109
+
110
+ > 背景依据:`D:\dsh-auto-memory\docs\prompts\M8-2-ADJUDICATION.md` §6.3。报告产出后请交规划侧确认,再决定是否投喂修复段。