@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.
- package/README.md +20 -10
- package/README.zh-CN.md +22 -10
- package/docs/CONTINUITY-FLOW.md +222 -0
- package/docs/HANDBOOK.md +354 -0
- package/docs/INTEGRATION-ANALYSIS.md +348 -0
- package/docs/M-CM7-HANDOFF-LAYERED-RETRIEVAL.md +311 -0
- package/docs/M8-MEMORY-HUB.md +1 -1
- package/docs/PROMPT-PACK-LAYERED-RECALL.md +474 -0
- package/docs/PROMPT-SET-STRICT.md +389 -0
- package/docs/RELEASE-GO-NOGO.md +82 -0
- package/docs/ROADMAP.md +162 -0
- package/docs/STATUS-BOARD.md +147 -0
- package/docs/USER-GUIDE.en.md +382 -0
- package/docs/USER-GUIDE.zh-CN.md +382 -289
- package/docs/prompts/EXEC-ORDER.md +77 -0
- package/docs/prompts/FEEDING-SCRIPT.md +174 -0
- package/docs/prompts/FEEDING-SEQUENCE.md +61 -0
- package/docs/prompts/FIX-AGENT-M8-2b.md +119 -0
- package/docs/prompts/FIX-AGENT-P11.md +97 -0
- package/docs/prompts/FIX-AGENT-P12-FULL-REGRESSION.md +135 -0
- package/docs/prompts/FIX-AGENT-P12.md +113 -0
- package/docs/prompts/FIX-AGENT-P13-PYTHON-RANK.md +100 -0
- package/docs/prompts/FIX-AGENT-P8.md +120 -0
- package/docs/prompts/FIX-AGENT-P9.md +110 -0
- package/docs/prompts/FIX-AGENT-P9a.md +94 -0
- package/docs/prompts/FIX-AGENT-P9d.md +114 -0
- package/docs/prompts/FIX-AGENT-TEMPORAL-ARM.md +148 -0
- package/docs/prompts/LIVE-VERIFY-ZCODE.md +105 -0
- package/docs/prompts/M8-1-fact-metadata.md +45 -0
- package/docs/prompts/M8-2-ADJUDICATION.md +98 -0
- package/docs/prompts/M8-2-importance-wiring.md +42 -0
- package/docs/prompts/M8-2b-evidence-pipeline.md +52 -0
- package/docs/prompts/M8-3-enable-verify.md +49 -0
- package/docs/prompts/M8-R-REPORT.md +156 -0
- package/docs/prompts/M8-R-research.md +67 -0
- package/docs/prompts/P1-l0-index.md +30 -0
- package/docs/prompts/P10-importance-calibration.md +45 -0
- package/docs/prompts/P11-silent-catch-observability.md +43 -0
- package/docs/prompts/P2-semantic-recall.md +30 -0
- package/docs/prompts/P3-fusion.md +28 -0
- package/docs/prompts/P4-l0-response.md +28 -0
- package/docs/prompts/P5-handoff-anchor.md +28 -0
- package/docs/prompts/P6-ledger-weight.md +27 -0
- package/docs/prompts/P7-write-fix.md +26 -0
- package/docs/prompts/P8-rrf-wiring.md +47 -0
- package/docs/prompts/P9-REVIEW-DECISION.md +95 -0
- package/docs/prompts/P9-evidence-write-coverage.md +113 -0
- package/docs/prompts/README.md +105 -0
- package/docs/prompts/ZCODE-DROPIN.md +229 -0
- package/docs/prompts/_COMMON.md +88 -0
- package/lib/client.js +36 -2
- package/lib/context-host.js +77 -2
- package/lib/evidence-agg.js +81 -0
- package/lib/fact-store.js +32 -0
- package/lib/handoff-anchor.js +114 -0
- package/lib/index.js +402 -43
- package/lib/l0-extract.js +149 -0
- package/lib/l0-index.js +239 -0
- package/lib/m7-wire.js +4 -3
- package/lib/memory-importance.js +70 -0
- package/lib/python-setup.js +16 -4
- package/lib/recall-fusion.js +99 -0
- package/lib/shadow-retrieval.js +2 -2
- package/lib/storage-manage.js +17 -0
- package/lib/subagent-gc.js +8 -1
- package/lib/temporal-parse.js +159 -0
- package/package.json +1 -1
- package/python/worker_semantic_v1.py +28 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
> **给使用者的说明**:P9 裁决后唯一要投喂的修复段。复制时从 `你是一名严谨的修复 Agent` 开始到文件末尾(自包含,无需 `_COMMON.md`)。
|
|
2
|
+
> ⚠️ 改的是 `lib\context-host-pre.js`,**别和任何其他改该文件的任务同时跑**。
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
你是一名严谨的修复 Agent。工作目录:`D:\dsh-auto-memory`(Node.js 项目,BSD-3-Clause,v2.2.6,零运行时依赖)。
|
|
7
|
+
|
|
8
|
+
# 任务:修复 correction 证据「几乎不可能触发」的缺陷(重设计版)
|
|
9
|
+
|
|
10
|
+
## 0. 背景(实读代码 + 裁决结论,必须先自行复现)
|
|
11
|
+
|
|
12
|
+
- correction 是六类 evidence 中唯一的**负向信号**(`lib\memory-importance-pre.js`:`importance = 0.5 + 0.3×pos − 0.5×correctionRate`)。实测全量 events 里 correction 仅 **2 条**,近乎失效。
|
|
13
|
+
- 根因(已核实):`lib\context-bridge-pre.js` 的 `createCorrectionEvidencesFromText` 要求**用户消息文本同时含**纠正词典词 **AND** 完整 32 位 memoryId(它内部先调 `createCiteEvidencesFromText` 找 id)。用户纠正时几乎不可能手打完整 id ⇒ 现实触发率 ≈0。
|
|
14
|
+
- 原方案("用户段同时存在 cites 就升级")**有漏洞已作废**:`lib\context-host-pre.js:490-501` 的 `cites` 也是从 `seg.text`(用户自己消息)算的,用户消息既不含 id 也不含 cites,前提本身不成立。
|
|
15
|
+
- **正确设计(本任务)**:correction 归因到「**最近被 cite/read 的记忆**」,而不是用户消息里新找的 id。
|
|
16
|
+
|
|
17
|
+
## 1. 必读文件(绝对路径)
|
|
18
|
+
|
|
19
|
+
- `D:\dsh-auto-memory\lib\context-host-pre.js` —— 改动面:`emitTextEvidence`(约 490-501)与 `recentEvidenceForSuccess`(约 691)的 store 读取范式
|
|
20
|
+
- `D:\dsh-auto-memory\lib\context-bridge-pre.js` —— `createCorrectionEvidencesFromText`、`createCiteEvidencesFromText`、`buildEvidenceId`、`CORRECTION_LEXICON_PRE_V1`(**只读参考,禁止修改**)
|
|
21
|
+
- `D:\dsh-auto-memory\lib\memory-importance-pre.js` —— 理解 correction 的负向作用(**禁止修改**)
|
|
22
|
+
- 参考范式:`git show 4d54664 -- lib/index.js`(diag 写法)
|
|
23
|
+
|
|
24
|
+
## 2. 目标
|
|
25
|
+
|
|
26
|
+
当 user 段命中纠正词典词时,把 correction 事件归因到「**最近一条被 cite 或 read 的记忆**」(若 5 分钟窗口内无 cite/read,则不发)。**保留 cite 事件,另发一条 correction**(不改写 cite)。
|
|
27
|
+
|
|
28
|
+
## 3. 设计约束(必须遵守,逐条)
|
|
29
|
+
|
|
30
|
+
1. **单条归因,precision 优先**:correction 是负向权重,误报代价高。只归因到**最近一条** cite/read 记忆,不做"该轮所有 cite 全连坐"。
|
|
31
|
+
2. **保留 cite 不改写**:correction 是**新增**事件,kind 与 evidenceId 均为 correction;原 cite 事件原样保留。
|
|
32
|
+
3. **复用既有 store 读取**:`recentEvidenceForSuccess(windowMs)` 已实现"从 store 读近 N 分钟 cite/read、按 memoryId 去重"的范式,**沿用同样思路**取「最近一条」(按时间戳降序取第 1 条即可),不要新造存储层。
|
|
33
|
+
4. **窗口默认 5 分钟**:与 `recentEvidenceForSuccess(5×60×1000)` 一致;窗口内无 cite/read → 静默不发(不报错)。
|
|
34
|
+
5. **同一记忆一轮最多一条 correction**(去重),避免重复惩罚。
|
|
35
|
+
6. **隐私**:diag 只记录「命中纠正词典 + 归因的 memoryId 前 12 位 + 词典词计数」,**绝不记录用户原文**。
|
|
36
|
+
7. **fail-soft**:任何异常 → 静默跳过(可 diag),不影响主流程,不改变 cite 的既有产出。
|
|
37
|
+
|
|
38
|
+
## 4. 改动边界
|
|
39
|
+
|
|
40
|
+
- ✅ 允许修改:`D:\dsh-auto-memory\lib\context-host-pre.js` 中 `emitTextEvidence` 及其附近(最小 diff)
|
|
41
|
+
- ❌ **禁止修改**:`lib\context-bridge-pre.js`、`lib\memory-importance-pre.js`、`lib\evidence-agg-pre.js`、`lib\index.js`、`lib\recall-fusion-pre.js`
|
|
42
|
+
- ❌ 禁止:改写既有 cite 证据;把 correction 归因到"该轮全部 cite";引入新依赖;整文件重写
|
|
43
|
+
|
|
44
|
+
## 5. 验收标准
|
|
45
|
+
|
|
46
|
+
1. 构造 fixture:user 文本命中词典词(如含"不对""错了""不是"等词典词),且 store 内 5 分钟窗口有 1 条 cite → 产出 1 条 correction,其 `memoryId` = 那条 cite 的 memoryId,`kind === 'correction'`
|
|
47
|
+
2. 原 cite 事件仍在(数量不减少)
|
|
48
|
+
3. 窗口内无 cite/read → 0 条 correction(不发)
|
|
49
|
+
4. 同一 memoryId 一轮只 1 条 correction
|
|
50
|
+
5. **纯函数可测**:把"从最近 cite 集合选归因对象"抽成可注入/可 fixture 的纯函数(沿用 `-pre.js` 零 IO 惯例),IO 与 store 读取注入
|
|
51
|
+
6. 既有基线不降:memory-importance 18 / p4 34 / p8 14 / evidence-agg 14 / handoff 51 / continue-chain 58
|
|
52
|
+
7. 新增断言覆盖第 1、2、3、4 条
|
|
53
|
+
|
|
54
|
+
## 6. 停止条件
|
|
55
|
+
|
|
56
|
+
- `CORRECTION_LEXICON_PRE_V1` 不存在或内容为空;
|
|
57
|
+
- store 读取范式无法复用(`storeFor()` / `loadEvents()` 不存在)——此时停止回报,**不得自造存储层**。
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
停止原因:未能定位 <符号>
|
|
61
|
+
已尝试:<搜索词 1>、<搜索词 2>、<路径>
|
|
62
|
+
需要:<澄清问题>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 7. 完成后自检(逐项执行并贴原始输出)
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
cd /d/D/dsh-auto-memory || cd D:/dsh-auto-memory
|
|
69
|
+
|
|
70
|
+
node --check lib/context-host-pre.js
|
|
71
|
+
|
|
72
|
+
node tests/smoke/smoke-test-memory-importance-pre.mjs # 18
|
|
73
|
+
node tests/smoke/smoke-test-p4-l0-response-pre.mjs # 34
|
|
74
|
+
node tests/smoke/smoke-test-p8-rrf-wiring-pre.mjs # 14
|
|
75
|
+
node tests/smoke/smoke-test-evidence-agg-pre.mjs # 14
|
|
76
|
+
node tests/smoke/smoke-test-handoff-pre.mjs # 51
|
|
77
|
+
node tests/smoke/smoke-test-continue-chain-pre.mjs # 58
|
|
78
|
+
|
|
79
|
+
git status --short
|
|
80
|
+
git diff --stat
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 8. 回报必须包含
|
|
84
|
+
|
|
85
|
+
1. 每处改动:`文件:行号 — 原内容 → 新内容`
|
|
86
|
+
2. 归因选择逻辑的说明(为何单条、为何 5 分钟窗口)
|
|
87
|
+
3. 隐私处理说明(diag 不记用户原文的证据)
|
|
88
|
+
4. 新增断言清单与结果
|
|
89
|
+
5. 回滚方式:`git checkout lib/context-host-pre.js`
|
|
90
|
+
6. 自检原始输出
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
> 裁决依据:`D:\dsh-auto-memory\docs\prompts\P9-REVIEW-DECISION.md` §三。
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
> **给使用者的说明**:P9a 附带发现的修复段。**优先级高于一切观察类动作**——不修它,success 永远是 0。
|
|
2
|
+
> 复制时从 `你是一名严谨的修复 Agent` 开始到文件末尾(自包含,无需 `_COMMON.md`)。
|
|
3
|
+
> ⚠️ 改 `lib\context-host-pre.js`(**源文件**);`lib\context-host.js` 是发布产物,**禁止手改**。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
你是一名严谨的修复 Agent。工作目录:`D:\dsh-auto-memory`(Node.js 项目,BSD-3-Clause,v2.2.6,零运行时依赖)。
|
|
8
|
+
|
|
9
|
+
# 任务:修复 recentEvidenceForSuccess 时间戳取值错误(success 证据链结构性断裂)
|
|
10
|
+
|
|
11
|
+
## 0. 缺陷(已实证,你必须先复现)
|
|
12
|
+
|
|
13
|
+
**磁盘事件实样**(`C:\Users\JH Z\.dsh\memory\evidence-pre\events\*.jsonl` 最新一行):
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
顶层字段: ['anchorId','event','evidenceId','kind','memoryId','namespace','policyVersion','recordedAt','schemaVersion','scope','source','storePolicyVersion','workspaceRef']
|
|
17
|
+
有无顶层 ts: False 有无 createdAt: False event.ts = 1788932690285
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
即:**时间戳在 `event.ts`,顶层只有 `recordedAt`,既无 `ts` 也无 `createdAt`。**
|
|
21
|
+
|
|
22
|
+
**缺陷代码**(`lib\context-host-pre.js`,`recentEvidenceForSuccess` 内,约 772 行):
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
const ets = e.ts || e.createdAt || 0 // ← 顶层无这两个字段 → 恒为 0
|
|
26
|
+
if (ets < cutoff) continue // ← 0 < cutoff → 全部跳过
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**后果**:该函数**恒返回空数组**。唯一调用方是 `lib\index.js:4576` 的 M9 success 块 → `cited.length === 0` → **success 事件永远为 0**(实测全量 5388 事件中 success=0)。
|
|
30
|
+
|
|
31
|
+
**对照**:P9a 新增的 `selectCorrectionAttributionPre`(同文件约 68/77 行)已用正确口径:
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
const ets = Number(e.event && e.event.ts) || Number(e.ts) || Number(e.createdAt) || 0
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**你的第一步**:复现上述磁盘字段结构与代码行,把实测结果写进回报。
|
|
38
|
+
|
|
39
|
+
## 1. 必读文件(绝对路径)
|
|
40
|
+
|
|
41
|
+
- `D:\dsh-auto-memory\lib\context-host-pre.js` —— 改动面:`recentEvidenceForSuccess`(约 766-782)、正确范式见 `selectCorrectionAttributionPre`(约 44-94)
|
|
42
|
+
- `D:\dsh-auto-memory\lib\index.js` —— 唯一调用方 `:4575-4576`,理解 success 块上下文(**禁止修改**)
|
|
43
|
+
- 真实数据:`C:\Users\JH Z\.dsh\memory\evidence-pre\events\*.jsonl`
|
|
44
|
+
|
|
45
|
+
## 2. 目标
|
|
46
|
+
|
|
47
|
+
把 `recentEvidenceForSuccess` 的时间戳取值改为与 P9a 选择器**同口径**,使该函数能真正选出近窗口内的 read/cite 事件,从而让 success 证据链恢复工作。
|
|
48
|
+
|
|
49
|
+
## 3. 改动边界
|
|
50
|
+
|
|
51
|
+
- ✅ 允许修改:`lib\context-host-pre.js` 中 `recentEvidenceForSuccess` 的**时间戳取值那一行**(最小 diff,1 行)
|
|
52
|
+
- ✅ 允许新增:`tests\smoke\` 断言
|
|
53
|
+
- ❌ **禁止修改**:`lib\context-host.js`(发布产物,由 `-pre` 生成)、`lib\index.js`、`lib\context-bridge-pre.js`
|
|
54
|
+
- ❌ **禁止顺带放宽窗口**(窗口是否放宽属下一步,本段只修缺陷)
|
|
55
|
+
- ❌ 禁止:整文件重写、引入新依赖、改变函数签名或返回结构
|
|
56
|
+
|
|
57
|
+
## 4. 验收标准
|
|
58
|
+
|
|
59
|
+
1. 时间戳取值与 `selectCorrectionAttributionPre` 口径一致:`Number(e.event && e.event.ts) || Number(e.ts) || Number(e.createdAt) || 0`
|
|
60
|
+
2. **新增断言**(fixture 用磁盘投影形态:`{kind, memoryId, event:{ts}, recordedAt}`):
|
|
61
|
+
- 窗口内 cite/read 能被选出;窗口外被排除
|
|
62
|
+
- 仅 `seen` 不被选(kind 过滤仍生效)
|
|
63
|
+
- 按 memoryId 去重仍生效
|
|
64
|
+
- 缺 `event` / 坏条目 → 跳过,不抛错
|
|
65
|
+
- **修复前用同样 fixture 会返回空(回归证明)**
|
|
66
|
+
3. 既有断言不降:memory-importance 18 / p4 34 / p8 14 / evidence-agg 14 / p9a 26 / handoff 51 / continue-chain 58
|
|
67
|
+
4. **真实数据对照证据**(本段核心,缺此项视为未完成):实读真实 events 文件,用**修复后**的逻辑统计——
|
|
68
|
+
- 近 **5 分钟**窗口能选出几条 read/cite
|
|
69
|
+
- 近 **30 分钟**窗口能选出几条(30 分钟 ≈ `autoConsolidateCooldownMinutes` 默认周期)
|
|
70
|
+
- 目的:判断修复后 success 是否仍会因"5 分钟窗口 vs 30 分钟 consolidation 周期"而稀疏。**只统计,不要因此改窗口。**
|
|
71
|
+
5. 回报中给出该函数修复前后对同一真实数据的输出对比
|
|
72
|
+
|
|
73
|
+
## 5. 停止条件
|
|
74
|
+
|
|
75
|
+
- 若 `loadEvents()` 返回的形状**与磁盘不一致**(例如已被规范化出顶层 `ts`),说明缺陷前提不成立 → **立即停止回报**,不得盲改;
|
|
76
|
+
- 若 `recentEvidenceForSuccess` 有多个实现副本(`-pre` 与 `.js` 行为不同)→ 停止回报并说明。
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
停止原因:<描述>
|
|
80
|
+
已尝试:<搜索词 1>、<搜索词 2>、<路径>
|
|
81
|
+
需要:<澄清问题>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 6. 完成后自检(逐项执行并贴原始输出)
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
cd /d/D/dsh-auto-memory || cd D:/dsh-auto-memory
|
|
88
|
+
|
|
89
|
+
node --check lib/context-host-pre.js
|
|
90
|
+
|
|
91
|
+
node tests/smoke/smoke-test-p9a-correction-attribution-pre.mjs # 26
|
|
92
|
+
node tests/smoke/smoke-test-memory-importance-pre.mjs # 18
|
|
93
|
+
node tests/smoke/smoke-test-p4-l0-response-pre.mjs # 34
|
|
94
|
+
node tests/smoke/smoke-test-p8-rrf-wiring-pre.mjs # 14
|
|
95
|
+
node tests/smoke/smoke-test-evidence-agg-pre.mjs # 14
|
|
96
|
+
node tests/smoke/smoke-test-handoff-pre.mjs # 51
|
|
97
|
+
node tests/smoke/smoke-test-continue-chain-pre.mjs # 58
|
|
98
|
+
|
|
99
|
+
git status --short
|
|
100
|
+
git diff --stat
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 7. 回报必须包含
|
|
104
|
+
|
|
105
|
+
1. 磁盘事件形状复现结果(顶层字段清单 + `event.ts` 值)
|
|
106
|
+
2. 改动:`文件:行号 — 原内容 → 新内容`
|
|
107
|
+
3. 新增断言清单与结果(含"修复前返回空"的回归证明)
|
|
108
|
+
4. **真实数据 5 分钟 / 30 分钟窗口的命中条数**(§4.4)
|
|
109
|
+
5. 对"修复后 success 是否仍稀疏"的判断与建议(**不要在本段放宽窗口**)
|
|
110
|
+
6. 回滚:`git checkout lib/context-host-pre.js`
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
> 立项依据:`D:\dsh-auto-memory\docs\prompts\P9-REVIEW-DECISION.md` §七(P9a 附带发现已核实)。
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
> **给使用者的说明**:**时间检索臂(第一优先的新功能)**。复制时从 `你是 DSH 环境里的执行 Agent` 开始到文件末尾(自包含,无需 `_COMMON.md`)。
|
|
2
|
+
> ⚠️ Agent 不能重启 dsh web(会截断对话),改完只做静态验证;重启与 live 验证由你执行。
|
|
3
|
+
> 依赖:**P12 段先完成**(两者都改 `lib/index.js`,须串行投喂、逐段验收)。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
你是 DSH 环境里的执行 Agent。工作目录:`D:\dsh-auto-memory`(Node.js 项目,BSD-3-Clause,v2.2.6,零运行时依赖)。你可以执行命令、读写文件。**不能重启 dsh web,也不要尝试。**
|
|
8
|
+
|
|
9
|
+
# 任务:给记忆检索加「时间臂」(支持"上周 / 三天前 / 上个月"一类时间查询)
|
|
10
|
+
|
|
11
|
+
## 0. 背景与目标
|
|
12
|
+
|
|
13
|
+
- 当前 `recall()`(`lib\index.js:3301`)只有**词法臂**(BM25)与**语义臂**(C2 打 L0),没有时间维度。
|
|
14
|
+
- 目标:当查询里出现中文时间表达("上周""三天前""上个月底""最近一周"等)时,解析出时间范围,并作为一个**软性第三臂**参与排序——**只提升命中时间范围内的记忆,不硬过滤**。
|
|
15
|
+
- **关键约束:查询里没有时间表达时,行为必须与现状完全一致(零行为变更)。**
|
|
16
|
+
|
|
17
|
+
## 1. 必读文件(绝对路径,先读完再动手)
|
|
18
|
+
|
|
19
|
+
- `D:\dsh-auto-memory\lib\index.js` —— `recall()` 的 L0 分支(约 3355-3420),看 `l0Corpus` / `label` / `rankFusionRRFPre` 的实际调用形态
|
|
20
|
+
- `D:\dsh-auto-memory\lib\recall-fusion-pre.js` —— P8 的 `rankFusionRRFPre(pairs, opts)`,需**向后兼容地**加第三个可选臂
|
|
21
|
+
- `D:\dsh-auto-memory\lib\l0-extract-pre.js` —— `buildL0IndexPre` 返回结构(`id`/`l0`/…)
|
|
22
|
+
- `D:\dsh-auto-memory\lib\fact-store-pre.js` —— M8-1 的时间三价字段(`occurredAt`/`mentionedAt`/`ingestedAt`,仅参考,本段 Phase 1 不接入 facts)
|
|
23
|
+
- 参考范式:`git show 48fa943 -- lib/context-host-pre.js`(时间戳口径的写法)
|
|
24
|
+
|
|
25
|
+
## 2. 范围(Phase 1,刻意收窄)
|
|
26
|
+
|
|
27
|
+
**只做**:
|
|
28
|
+
1. 时间表达解析(纯函数)
|
|
29
|
+
2. 候选时间戳抽取(从 L0 候选的 `label` 里的日志文件名 `YYYY-MM-DD.md`)
|
|
30
|
+
3. 作为第三臂接入 `rankFusionRRFPre`(软提升,非硬过滤)
|
|
31
|
+
|
|
32
|
+
**不做**(留 Phase 2,本段禁止碰):
|
|
33
|
+
- facts 的 `occurredAt/mentionedAt/ingestedAt` 接入
|
|
34
|
+
- sessions 范围的时间检索
|
|
35
|
+
- "上个月底 / 年初 / Q3" 这类复合/季度表达
|
|
36
|
+
|
|
37
|
+
## 3. 具体实现要求
|
|
38
|
+
|
|
39
|
+
### 3.1 新增 `lib\temporal-parse-pre.js`(纯函数,零 IO,注入 `now`)
|
|
40
|
+
|
|
41
|
+
导出 `parseTemporalQueryPre(text, opts = {})`:
|
|
42
|
+
- 输入:查询文本 + `opts.now`(毫秒时间戳,**注入**以保证确定性;缺省用 `Date.now()` 并说明测试里必须注入)
|
|
43
|
+
- 返回:`null`(未识别到时间表达)或 `{ startMs, endMs, matched }`
|
|
44
|
+
- **必须支持**(确定性实现,禁止 LLM、禁止第三方日期库):
|
|
45
|
+
|
|
46
|
+
| 表达 | 含义 |
|
|
47
|
+
|---|---|
|
|
48
|
+
| 今天 / 昨天 / 前天 / 大前天 | 对应自然日 00:00–24:00 |
|
|
49
|
+
| 本周 / 上周 / 上上周 | 周一 00:00 起整周 |
|
|
50
|
+
| 本月 / 上个月 | 自然月 |
|
|
51
|
+
| 今年 / 去年 | 自然年 |
|
|
52
|
+
| 最近 N 天 / N 周 / N 个月 | 从 now 往前 N 个自然周期 |
|
|
53
|
+
| N 天前 / N 周前 / N 个月前 | 定位到那个自然日/周/月(不一定是整段,可按日/周/月起止) |
|
|
54
|
+
|
|
55
|
+
- 边界:中文数字与阿拉伯数字都要认("三天前"="3 天前");`N` 上限 366。
|
|
56
|
+
- 确定性:同输入同 `now` 逐字节相同输出。
|
|
57
|
+
- 时区:统一用 `Asia/Shanghai`(本地),用 `new Date()` 的本地时间方法即可,但**必须显式说明时区假设**。
|
|
58
|
+
|
|
59
|
+
### 3.2 候选时间戳抽取
|
|
60
|
+
|
|
61
|
+
- L0 候选的 `label` 形如日志文件名(如 `2026-09-09.md`,**以实际 grep 到的为准**)→ 从文件名正则抽取 `YYYY-MM-DD` → 当日 00:00(本地)作为该候选的 `dateMs`。
|
|
62
|
+
- 非日志来源(`MEMORY.md`、`~userfile`、无日期名的 reflections)→ `dateMs = null` → 时间臂对该候选**不参与**(中性)。
|
|
63
|
+
|
|
64
|
+
### 3.3 `rankFusionRRFPre` 向后兼容地加第三臂
|
|
65
|
+
|
|
66
|
+
- 现状 `pairs = [{ memoryId, dense, lex }]`。改为**可选**支持 `temp` 字段:
|
|
67
|
+
- `temp` 为数字(1 = 命中范围 / 0 = 未命中 / 缺失 = 无时间臂)
|
|
68
|
+
- 当**所有** pair 都缺 `temp`(或全相等)→ 行为与现状**逐字节一致**
|
|
69
|
+
- 否则 `temp` 作为第三路 rank-space 臂(`1/(k + rank/divisor)`,k/divisor 复用现有常量)与 dense/lex 同权融合
|
|
70
|
+
- **禁止 score-space 加权**(Hindsight #3956 教训);只做 rank-space。
|
|
71
|
+
- 用测试锁死:`无 temp 输入 → 输出与当前版本逐项相等`(回归证明)。
|
|
72
|
+
|
|
73
|
+
### 3.4 `recall()` 接入
|
|
74
|
+
|
|
75
|
+
- 在 L0 分支:`const tr = parseTemporalQueryPre(query, { now: Date.now() })`
|
|
76
|
+
- 若 `tr` 非空:为每个候选算 `temp`(dateMs ∈ [startMs,endMs] → 1,否则 0;dateMs null → 不给 temp 字段);把 `temp` 一并传入 `rankFusionRRFPre`
|
|
77
|
+
- 若 `tr` 为空:**不传 temp**,走现状路径(零变更)
|
|
78
|
+
- 非 L0 分支(旧调用方式)**完全不变**
|
|
79
|
+
|
|
80
|
+
## 4. 改动边界
|
|
81
|
+
|
|
82
|
+
- ✅ 允许新增:`lib\temporal-parse-pre.js`、`tests\smoke\smoke-test-temporal-parse-pre.mjs`
|
|
83
|
+
- ✅ 允许修改:`lib\recall-fusion-pre.js`(**仅向后兼容地加 `temp` 可选臂,不改既有 dense/lex 语义**)、`lib\index.js` 的 `recall()` L0 分支(最小 diff)
|
|
84
|
+
- ❌ **禁止修改**:`lib\shadow-retrieval-pre.js`、`lib\context-host-pre.js`、`lib\l0-extract-pre.js`、`lib\memory-importance-pre.js`、`lib\evidence-agg-pre.js`
|
|
85
|
+
- ❌ 禁止:硬过滤(时间臂只提升不删除);把 facts 时间字段接入;改 `recall()` 签名;引入第三方日期/分词依赖
|
|
86
|
+
|
|
87
|
+
## 5. 验收标准
|
|
88
|
+
|
|
89
|
+
1. `parseTemporalQueryPre` 对 §3.1 表内每种表达返回正确的 `[startMs,endMs]`(fixture 锁死,含"三天前"="3 天前")
|
|
90
|
+
2. 未识别 → `null`;`now` 注入下确定性
|
|
91
|
+
3. `rankFusionRRFPre`:无 `temp` 输入输出与当前版本逐项相等(**回归证明**);有 `temp` 时命中范围的候选排序上升
|
|
92
|
+
4. `recall()`:查询含时间表达 → 命中该时间范围的日志条目排序提升;不含时间表达 → 与现状一致
|
|
93
|
+
5. 新增断言覆盖 1-4;既有基线不降:m4 / p8 14 / p4 34 / evidence-agg 14 / memory-importance 18 / p9a 26 / p9d 13 / handoff 51 / continue-chain 58
|
|
94
|
+
6. 回报附一个**真实数据示例**:用一条含"上周"的查询,展示时间臂接入前后 top-5 的 `id` 序列变化
|
|
95
|
+
|
|
96
|
+
## 6. 停止条件
|
|
97
|
+
|
|
98
|
+
- 若 `recall()` L0 分支的 `label` 不含可抽取的日期(例如日志文件名不是 `YYYY-MM-DD.md`)→ 停止回报,说明实际格式;
|
|
99
|
+
- 若 `rankFusionRRFPre` 的 `pairs` 形状与本节描述不符 → 停止回报。
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
停止原因:<描述>
|
|
103
|
+
已尝试:<搜索词 1>、<搜索词 2>、<路径>
|
|
104
|
+
需要:<澄清问题>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 7. 完成后自检(静态,不重启)
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
cd /d/D/dsh-auto-memory || cd D:/dsh-auto-memory
|
|
111
|
+
node --check lib/temporal-parse-pre.js
|
|
112
|
+
node --check lib/recall-fusion-pre.js
|
|
113
|
+
node --check lib/index.js
|
|
114
|
+
|
|
115
|
+
node tests/smoke/smoke-test-temporal-parse-pre.mjs # 新增
|
|
116
|
+
node tests/smoke/smoke-test-p8-rrf-wiring-pre.mjs # 14
|
|
117
|
+
node tests/smoke/smoke-test-p4-l0-response-pre.mjs # 34
|
|
118
|
+
node tests/smoke/smoke-test-m4-pre.mjs # 全绿
|
|
119
|
+
node tests/smoke/smoke-test-evidence-agg-pre.mjs # 14
|
|
120
|
+
node tests/smoke/smoke-test-memory-importance-pre.mjs # 18
|
|
121
|
+
node tests/smoke/smoke-test-p9a-correction-attribution-pre.mjs # 26
|
|
122
|
+
node tests/smoke/smoke-test-p9d-recent-evidence-ts-pre.mjs # 13
|
|
123
|
+
node tests/smoke/smoke-test-handoff-pre.mjs # 51
|
|
124
|
+
node tests/smoke/smoke-test-continue-chain-pre.mjs # 58
|
|
125
|
+
|
|
126
|
+
git status --short
|
|
127
|
+
git diff --stat
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 8. 回报必须包含
|
|
131
|
+
|
|
132
|
+
1. 每个新/改文件:`文件:行号 — 原内容 → 新内容`
|
|
133
|
+
2. `parseTemporalQueryPre` 覆盖表 + fixture 结果
|
|
134
|
+
3. `rankFusionRRFPre` 无 `temp` 时的回归证明(逐项相等)
|
|
135
|
+
4. 时间臂接入前后 top-5 的 `id` 序列变化(真实数据示例)
|
|
136
|
+
5. 时区假设说明
|
|
137
|
+
6. 静态结论 + **重启后 live 验证项**:用一条含时间表达的查询实测召回是否按时间提升
|
|
138
|
+
7. 回滚:`git checkout` 相应文件 + 删除新增文件
|
|
139
|
+
|
|
140
|
+
## 硬约束(全程)
|
|
141
|
+
|
|
142
|
+
- 搜索优先;最小 diff;零新依赖;不改既有 API 签名;不删既有断言
|
|
143
|
+
- 时间臂是**软提升**,绝不硬过滤
|
|
144
|
+
- **不尝试重启 dsh web**
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
> 背景:`D:\dsh-auto-memory\docs\STATUS-BOARD.md` §8(时间检索臂为近期优先)。
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
> **给使用者的说明**:这份是给 **Zcode**(有 CUA 电脑控制、能读 DSH 后台日志的独立 Agent)的**独立验收 prompt**。
|
|
2
|
+
> 复制时从 `你是独立第三方验收 Agent` 开始到文件末尾。它的价值在于:**不采信任何"已完成"结论,每项都要自己取证**。
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
你是独立第三方验收 Agent。你拥有**电脑控制能力**(可以操作 UI、重启应用)和 **DSH 后台日志读取能力**。
|
|
7
|
+
|
|
8
|
+
**你的立场:你不参与前面的开发,也不采信任何"已完成 / 已验证"的结论。每一项都必须由你亲自操作、亲自取证,用证据说话。** 前面那些汇报里写的"✅ 通过"对你无效。
|
|
9
|
+
|
|
10
|
+
# 任务:重启 dsh web,对记忆系统做独立 live 验收,给出发版 Go / No-Go 结论
|
|
11
|
+
|
|
12
|
+
## 0. 环境(绝对路径)
|
|
13
|
+
|
|
14
|
+
| 项 | 路径 |
|
|
15
|
+
|---|---|
|
|
16
|
+
| 插件工程 | `D:\dsh-auto-memory` |
|
|
17
|
+
| 记忆根目录 | `C:\Users\JH Z\.dsh\memory` |
|
|
18
|
+
| 证据事件 | `C:\Users\JH Z\.dsh\memory\evidence-pre\events\*.jsonl`(按日) |
|
|
19
|
+
| 诊断日志 | `C:\Users\JH Z\.dsh\memory\dsh-auto-memory-pre-diagnose.log` |
|
|
20
|
+
| 端点 | `GET /api/dsh-auto-memory-pre/memory-hub`(端口需你自行发现) |
|
|
21
|
+
|
|
22
|
+
## 1. 前置检查
|
|
23
|
+
|
|
24
|
+
1. `git -C D:\dsh-auto-memory log --oneline -5` —— 确认本版本改动(P12、时间臂)已在提交里
|
|
25
|
+
2. `git -C D:\dsh-auto-memory status --short` —— 确认工作区状态(应只剩已知的两个并行会话文件或已清理)
|
|
26
|
+
3. 找到 dsh web 的运行端口与进程(自行发现:配置、进程列表、或已开的浏览器标签)
|
|
27
|
+
|
|
28
|
+
## 2. 重启(你的能力,前面那个 Agent 做不到)
|
|
29
|
+
|
|
30
|
+
1. 确认当前没有需要保留的未保存会话
|
|
31
|
+
2. **重启 dsh web(硬性:`--no-open`)** —— 任何启动/打开 DSH 的命令都必须带 `--no-open`,禁止自动弹出浏览器窗口(DSH 官方选项,help 原文:`--no-open do not open the Web UI in the default browser`)。从终端输出读实际端口,需要 UI 时手动打开。
|
|
32
|
+
3. 等插件加载完成,检查启动日志**无** `SyntaxError` / `ReferenceError` / 模块加载失败
|
|
33
|
+
|
|
34
|
+
> 重启失败或启动报错 → **立即停止**,回报报错原文,不要继续。
|
|
35
|
+
|
|
36
|
+
## 3. 逐项验收(每项都要贴证据)
|
|
37
|
+
|
|
38
|
+
| # | 功能 | 怎么验(用你的电脑控制操作 UI) | 通过标准 | 你要贴的证据 |
|
|
39
|
+
|---|---|---|---|---|
|
|
40
|
+
| **L1** | **主动联想** | 新开一个会话,聊一段与已有记忆主题相关的话 | 记忆被**主动**联想并注入(无需用户查询) | 注入内容的截图 + 后台日志里对应记录 |
|
|
41
|
+
| **L2** | **语义检索** | 调用 `memory_recall_pre`,查一个**词法不重合但语义相关**的查询(记忆里写"npm 发布报 ENEEDAUTH",查"发布凭证问题") | 能召回 | 返回结果截图/文本。**若失败,切 `legacy` 再测一次对比** |
|
|
42
|
+
| **L3** | L0 返回与展开 | 同 L2 | 返回 L0 列表(含 id/score/match_reason);用 `expand="mem_xxx"` 能取到原文 | 两次调用的返回文本 |
|
|
43
|
+
| **T1** | **时间臂(本版新功能)** | 用 `memory_recall_pre` 查**含时间表达**的查询,如"上周的记忆";再查一条**不含时间词**的同类查询做对照 | 含时间表达时,对应时间范围的日志条目排序**上升**;不含时间词时排序**与对照一致**(零变更) | 两次 top-5 的 `id` 序列对比 |
|
|
44
|
+
| **L4** | M8 记忆中枢 | 打开记忆面板 | 三栏(技能/事实/经历)有内容或正确空态 | 面板截图 + `GET /api/dsh-auto-memory-pre/memory-hub` 的响应(应 200 + overview) |
|
|
45
|
+
| **L5** | 证据落盘 | 对话若干轮后看当日 events 文件 | 有 `seen` 事件新增;**若能触发一次用户纠正**(对话里说"不对,你记错了"之类),应有 `correction` | events 文件新增行的 JSON(脱敏) |
|
|
46
|
+
| **L6** | 跨窗口接续 | 让水位涨到 75% 触发自动接续(或手动一键接续) | 新会话收到**分层**材料(白板/账本/近期线程),且**不再要求先 read 转写** | 新会话首条注入内容截图 |
|
|
47
|
+
| **L7** | 写入与 restore | 对话若干轮 → 看日志文件与 `facts.json` / `episodes.json`;**再重启一次** | 有新条目;重启后数据**不丢** | 重启前后条目数对比 |
|
|
48
|
+
| **P** | 性能 | 全程观察 | 无明显卡顿、内存异常 | 你的观察结论 |
|
|
49
|
+
|
|
50
|
+
## 4. 取证要求(不许只写"通过")
|
|
51
|
+
|
|
52
|
+
每一项必须至少包含**下列之一**:
|
|
53
|
+
|
|
54
|
+
- UI 截图(注入内容、面板、会话)
|
|
55
|
+
- 后台日志片段(贴原文,不要只描述)
|
|
56
|
+
- 数据快照(events JSONL 行、端点响应、top-5 id 序列、文件条目计数)
|
|
57
|
+
|
|
58
|
+
**禁止**出现: "应该是正常的"、"看起来没问题"、"汇报说已通过" —— 这类没有证据的表述一律视为未通过。
|
|
59
|
+
|
|
60
|
+
## 5. 输出结论
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
结论:【可以发版 / 暂缓发版】
|
|
64
|
+
|
|
65
|
+
逐项结果:
|
|
66
|
+
L1 主动联想 : 通过 / 未通过 — <证据摘要>
|
|
67
|
+
L2 语义检索 : 通过 / 未通过 — <证据摘要>
|
|
68
|
+
L3 L0 返回 : 通过 / 未通过
|
|
69
|
+
T1 时间臂 : 通过 / 未通过 — <含时间词 vs 对照的 top-5 对比>
|
|
70
|
+
L4 M8 记忆中枢: 通过 / 未通过
|
|
71
|
+
L5 证据落盘 : 通过 / 未通过
|
|
72
|
+
L6 跨窗口接续 : 通过 / 未通过
|
|
73
|
+
L7 写入 restore: 通过 / 未通过
|
|
74
|
+
P 性能 : 正常 / 异常
|
|
75
|
+
|
|
76
|
+
未通过项:<列出 + 你尝试过的处置>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 暂缓判据(任一成立即暂缓)
|
|
80
|
+
|
|
81
|
+
1. **L2 失败但 `legacy` 下正常** —— P8 融合回归
|
|
82
|
+
2. **L1 主动联想失效**或重启后插件加载报错 —— P12 回归
|
|
83
|
+
3. **T1 时间臂:无时间词查询的排序也变了** —— 违反"零行为变更"约束
|
|
84
|
+
4. L7 数据重启后丢失
|
|
85
|
+
|
|
86
|
+
## 6. 边界(你只验收,不改代码)
|
|
87
|
+
|
|
88
|
+
- ❌ **禁止修改 `D:\dsh-auto-memory` 下任何文件**(不改代码、不改测试、不提交)
|
|
89
|
+
- ❌ 禁止修改 `C:\Users\JH Z\.dsh\memory` 下的记忆数据(只读取证;正常对话产生的写入除外)
|
|
90
|
+
- ✅ 允许:重启 dsh web、操作 UI、调用工具的只读查询(recall / 端点 GET)
|
|
91
|
+
- 发现问题 → **记录并回报**,不要自己动手修
|
|
92
|
+
|
|
93
|
+
## 7. 回报必须包含
|
|
94
|
+
|
|
95
|
+
1. 前置检查结果(git log / status)
|
|
96
|
+
2. 重启结果与启动日志关键行
|
|
97
|
+
3. 九项逐项结果 + 每项证据
|
|
98
|
+
4. **Go / No-Go 结论**
|
|
99
|
+
5. 若有未通过项:具体现象、复现步骤、你尝试过的处置
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
> ⚠️ **直接投喂请用 `ZCODE-DROPIN.md`**(已整合 `--no-open` 与手册指引,可直接整段复制)。本文件保留为详细版。
|
|
104
|
+
>
|
|
105
|
+
> 背景(仅供你对照,不作为"已通过"的依据):`D:\dsh-auto-memory\docs\STATUS-BOARD.md`、`docs\RELEASE-GO-NOGO.md`。
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
> **投喂方式**:本段须与 `_COMMON.md` 一并投喂。
|
|
2
|
+
> 前置:已执行 `M8-R-REPORT.md` 调研,选型 = **A+(保留三层,叠加认识论状态字段,补时间三价)**。
|
|
3
|
+
> 依赖:无。可与 P1 / P5 / P7 并行。
|
|
4
|
+
|
|
5
|
+
## 【M8-1】Fact 层元数据补强(时间三价 + 认识论状态 + 趋势)
|
|
6
|
+
|
|
7
|
+
**背景(有代码证据)**:
|
|
8
|
+
- `lib/fact-store-pre.js` 的 Fact 为四元组 `{scope, subject, predicate, object?}` + provenance + confirmedAt + ttl? + revoked?,持久化落 `facts.json`(`lib/index.js:5591`)。
|
|
9
|
+
- 现有**完全没有时间三价语义**:Hindsight 明确区分 `occurred_start/end`(事件发生)、`mentioned_at`(陈述时间=新鲜度)、入库时间三者,并指出"从旧文档提取的事实即使刚处理也保留旧 mentioned_at"。本项目 `confirmedAt` 单一字段无法表达。
|
|
10
|
+
- 三层分类(episodic/semantic/procedural)是**描述性分类**,不表达"这条是可重算的推断还是不可推导的证据"。
|
|
11
|
+
|
|
12
|
+
**目标**:为 Fact 增加三组**向后兼容**的元数据字段,不动既有 upsert / supersede / revoked 语义。
|
|
13
|
+
|
|
14
|
+
**涉及功能模块**:`lib/fact-store-pre.js`;`lib/index.js`(仅当需透传配置)。
|
|
15
|
+
|
|
16
|
+
**验收标准**:
|
|
17
|
+
1. 新增字段且**旧数据可读**:无新字段的既有 `facts.json` 记录能正常加载(不得因缺字段报错或丢弃)
|
|
18
|
+
2. 新增字段:
|
|
19
|
+
- 时间三价:`occurredAt`(事件发生,可空)、`mentionedAt`(陈述时间,可空)、`ingestedAt`(入库时间,必填,默认取现有 `confirmedAt`)
|
|
20
|
+
- 认识论状态:`epistemicStatus`,枚举 `fact`(证据/不可推导)| `observation`(推断/可重算)| `directive`(行为指令)
|
|
21
|
+
- 趋势:`trend`,枚举 `new` | `strengthening` | `stable` | `weakening` | `stale`
|
|
22
|
+
3. `validateFactCandidatePre` / `validateFactPre` 须接受新字段(可选),**不得因新字段拒绝旧结构**
|
|
23
|
+
4. fact store 既有 **41 断言不下降**,并新增断言覆盖上述三点
|
|
24
|
+
5. 五套基线不降:l0-extract 18 / handoff 51 / continue-chain 58 / water-step 12 / autocont-host 29
|
|
25
|
+
|
|
26
|
+
**需先检索的仓库路径与符号关键词**:
|
|
27
|
+
- 路径:`lib/fact-store-pre.js`、`lib/index.js`
|
|
28
|
+
- 关键词:`createFactStorePre`、`validateFactCandidatePre`、`validateFactPre`、`isFactConflict`、`FACT_POLICY_VERSION`、`FACT_SCOPES_PRE_V1`、`confirmedAt`、`supersede`、`revoked`、`hubIo`
|
|
29
|
+
- **必须先确认**:① `hubIo()` 的定义体与落盘目录(调研未追到,本段必须查明并回报)② Fact 的完整字段列表与校验函数实现 ③ `facts.json` 是否已有真实数据(若有,必须验证向后兼容)
|
|
30
|
+
|
|
31
|
+
**改动边界**:
|
|
32
|
+
- ✅ 允许修改:`lib/fact-store-pre.js`(增量加字段 + 校验放宽)
|
|
33
|
+
- ✅ 允许新增:`tests/smoke/` 中断言
|
|
34
|
+
- ❌ **禁止修改**:`upsert` / `supersede` / `revoked` 的既有语义与分支
|
|
35
|
+
- ❌ 禁止修改:`lib/episodic-store-pre.js`、`lib/procedure-store-pre.js`、`lib/memory-hub-pre.js`、`lib/index.js`(除非确需透传,且须单独论证)
|
|
36
|
+
- ❌ 禁止:因新字段改变既有冲突判定结果;删除既有断言;整文件重写
|
|
37
|
+
|
|
38
|
+
**集成位置正确性(回报必写)**:
|
|
39
|
+
- 说明新字段加在 Fact 结构的哪个位置、为何不影响既有 41 断言
|
|
40
|
+
- 列出所有读取 Fact 字段的下游位置(grep `FACT_ID_PREFIX`、`snapshot`、`facts.` 等)
|
|
41
|
+
- 回滚:`git checkout lib/fact-store-pre.js` + 删除新增断言文件;`facts.json` 若被写入新字段,说明是否需清理
|
|
42
|
+
|
|
43
|
+
**停止条件**:若 `hubIo()` 定义体无法定位,或 `facts.json` 落盘目录不在 `memoryRoot` 内(违反"可整体删除"约定),**立即停止回报**。
|
|
44
|
+
|
|
45
|
+
**自检清单**:按 `_COMMON.md` §5 执行(本段重点:`node --check lib/fact-store-pre.js` + fact store 断言 ≥41)。
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# M8-2 目标裁决(规划侧回应执行汇报)
|
|
2
|
+
|
|
3
|
+
> 日期:2026-09-09 · 裁决人:规划侧 · 依据:**实读代码**(非汇报文字转述)
|
|
4
|
+
|
|
5
|
+
## 一、事实核实(四条,全部可复现)
|
|
6
|
+
|
|
7
|
+
| # | 核实项 | 命令 | 结果 |
|
|
8
|
+
|---|---|---|---|
|
|
9
|
+
| F1 | P3 产物是否接线 | `grep -rn "recall-fusion" lib/ --include="*.js"`(排除自身) | **零引用**。`lib/recall-fusion-pre.js` 导出 `rankFusionRRFPre` / `FUSION_RRF_K_PRE_V1=60` / `FUSION_RRF_DIVISOR_PRE_V1=60` / `RECALL_FUSION_VERSION='rrf_fusion_pre_v1'`,**无调用方** ✅ 执行侧属实 |
|
|
10
|
+
| F2 | `recall()` 当前如何融合 | `sed -n '3301,3420p' lib/index.js` | **不是融合,是字典序排序**:`.sort((a,b) => b.lex - a.lex \|\| (b.sem\|\|0) - (a.sem\|\|0) \|\| id)` —— 词法分主导,语义分**仅在词法完全相等时打破平局** |
|
|
11
|
+
| F3 | evidence 数据是否存在 | `ls ~/.dsh/memory/evidence-pre/events` | **存在**:按日 JSONL(`2026-08-23.jsonl` 2491B、`2026-08-25.jsonl` 18102B…),行结构含 `{kind, memoryId, ts/event.ts}`;`lib/index.js:6861-6876` 已有读取范式(读最近 2 个文件、每文件末 400 行) |
|
|
12
|
+
| F4 | evidence 消费链 | `grep -rn "evidenceFor" lib/` | **仅注释引用**(`fact-store.js` 为构建产物),**真实调用方为零**;`lib/memory-importance-pre.js` 同样**未接线**;`lib/index.js` 无 evidence store 实例 |
|
|
13
|
+
|
|
14
|
+
**F2 是本次核实新增的发现,比"未接线"更严重**:P2 接进来的语义臂在排序中几乎不起作用,`recall()` 实质仍是纯词法。**P3 的 RRF 交付物是对的,只是没人调用。**
|
|
15
|
+
|
|
16
|
+
## 二、结论:**不降级,拆两段补做**
|
|
17
|
+
|
|
18
|
+
**理由**:M8-2 的目标(evidence → importance → 参与候选排序)本身成立且数据基础真实存在(F3 证明事件已落盘),失败原因是**规划缺口**而非目标错误。降等于把正确目标砍掉。
|
|
19
|
+
|
|
20
|
+
**规划缺口认领(三条,全部是我的责任)**:
|
|
21
|
+
|
|
22
|
+
1. **开关判据设错** —— `M8-2-importance-wiring.md` 把"是否接线"挂在"P3 是否完成"上。真实判据是"**RRF 是否已接入检索路径**"。P3 完成 ≠ P3 接线,我当时默认了"交付即接线"。
|
|
23
|
+
2. **缺一段"RRF 接线进检索"** —— P3 的改动边界写的是"新增融合函数(并存),由配置/参数切换",**没有一段 prompt 负责把它接进 `recall()`**。并存交付了,切换永远没发生。
|
|
24
|
+
3. **缺"evidence → 检索"数据管道段** —— 我假设 `evidenceFor()` 可直接被检索侧调用,实际它零调用方且依赖外部传入 evidence list;events 目录的读取范式当时也未纳入 prompt。
|
|
25
|
+
|
|
26
|
+
## 三、补做方案
|
|
27
|
+
|
|
28
|
+
| 新段 | 内容 | 依赖 | 风险 | 价值 |
|
|
29
|
+
|---|---|---|---|---|
|
|
30
|
+
| **P8** | RRF 接线进 `recall()`:替换 F2 的字典序排序,lex/sem 双输入经 `rankFusionRRFPre` 融合;保留 `legacy` 回退开关 | P1/P3(已完成) | 中(改排序行为) | **立即激活 P2 语义臂**,这是当前最大的质量缺口 |
|
|
31
|
+
| **M8-2b** | evidence 聚合层 + importance 加权接入:新增 `lib/evidence-agg-pre.js` 按 `memoryId` 聚合 events(有界读取),经 `memory-importance-pre.js` 转 importance,作为加权因子进入 P8 的融合 | **P8** | 中 | 完成 M8-2 原始目标 |
|
|
32
|
+
|
|
33
|
+
**执行顺序**:P8 → M8-2b(串行,M8-2b 需要 P8 建好的融合入口)。两段均可排在现有 10 轮之后,作为**轮次 11、轮次 12**。
|
|
34
|
+
|
|
35
|
+
## 四、规划级事实修正(已采纳执行侧汇报)
|
|
36
|
+
|
|
37
|
+
1. **白板误载更正**:`P5 已建 lib/handoff-anchor-pre.js` 为误载——P5 是内联实现,P6(`7285675`)才首建该文件。
|
|
38
|
+
2. **预算口径分离**:`handoffLedgerChars`(快照注入预算,默认 800)与 carry 层 8000 **不同源**,后续 prompt 引用时必须区分。
|
|
39
|
+
3. **m73 失败归因**:修正为沙箱 spawn EPERM 假失败,旧账本归因作废。
|
|
40
|
+
4. **M8-2 状态**:正式记为「**纯核心已交付(311e2e8),排序接线待 P8/M8-2b**」,不再是"已完成"。
|
|
41
|
+
|
|
42
|
+
## 五、给执行侧的一句话
|
|
43
|
+
|
|
44
|
+
P8 做完之前,P2 的语义臂处于"接了但没用"状态——**P8 不是新增能力,是修复 P2 的实效性**,应作为缺陷修复默认开启(保留 `legacy` 回退)。
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 六、M8-2b 验收结论(2026-09-09 20:16,规划侧独立复核)
|
|
49
|
+
|
|
50
|
+
**结论:验收通过,全链路闭环。** 但复核过程中发现并修复了一个会让整条管道静默失效的缺陷。
|
|
51
|
+
|
|
52
|
+
### 6.1 复核通过项(独立验证,非采信汇报)
|
|
53
|
+
|
|
54
|
+
| 项 | 验证方式 | 结果 |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| 提交真实 | `git show --stat 344af80` | 4 文件 +187/-3 ✅ |
|
|
57
|
+
| 模块形态 | `lib/evidence-agg-pre.js` 81 行,导出 `scanEvidenceEventsPre` / `aggregateEvidenceEventsPre` / `EVIDENCE_AGG_DEFAULTS_PRE_V1` | ✅ |
|
|
58
|
+
| 只读守卫 | grep 写 API(writeFile/appendFile/rename/mkdir/rm/unlink) | **零命中** ✅ |
|
|
59
|
+
| 融合形态 | diff 显示仅改 `dense` 臂输入值,`rankFusionRRFPre` 内部未动 | rank-space 未被破坏 ✅ |
|
|
60
|
+
| 冒烟 | evidence-agg 14/14、memory-importance 18/18、p4 34/34、p8 14/14 | ✅ |
|
|
61
|
+
| **真实数据端到端** | 13 个 events 文件 → 有界扫描 1268 事件 → 聚合 148 个 memoryId,importance ∈ [0.30, 0.65],**148 条全部偏离中性** | ✅ 管道确实产出差异化权重 |
|
|
62
|
+
|
|
63
|
+
### 6.2 🐛 发现并修复:静默失效(P0 级)
|
|
64
|
+
|
|
65
|
+
**现象**:新增代码 `lib/index.js:3399` 使用裸 `readdirSync(...)`,但顶层 `node:fs` 导入(`:21`)**不含该符号**;`fsMod` 仅在 6018/6050/6684 的函数局部定义。
|
|
66
|
+
|
|
67
|
+
**后果**:调用即抛 `ReferenceError` → 被 `catch (eImp) {}` 静默吞掉 → `impMap` 恒空 → **全体取中性 0.5 → 因子统一 0.75 → 排序完全不变 → 整条管道在生产中毫无作用**。
|
|
68
|
+
|
|
69
|
+
**为什么测试没抓到**:冒烟测的是**纯函数 + 注入 IO**,从不执行 `index.js` 里的接线代码;而"全部中性"与"正常工作但恰好都中性"在结果上不可区分。
|
|
70
|
+
|
|
71
|
+
**实证**:复现脚本输出 `impMap.size = 0`。
|
|
72
|
+
|
|
73
|
+
**修复**:`lib/index.js:21` 导入清单补入 `readdirSync`(唯一改动,1 行,脚本精确替换,CRLF 保持、无 BOM)。全量审计确认**此类问题仅此一处**,其余 fs 符号均已导入。
|
|
74
|
+
|
|
75
|
+
**复验**:`node --check` 通过;审计脚本报告"全部已导入";四套相关冒烟全绿。
|
|
76
|
+
|
|
77
|
+
### 6.3 ⚠️ 新发现:evidence 写入侧覆盖率不足(下一个瓶颈)
|
|
78
|
+
|
|
79
|
+
真实 kind 分布(全量 / 近 7 天):
|
|
80
|
+
|
|
81
|
+
| kind | 全量 | 近 7 天 |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| seen | 4930 | 4828 |
|
|
84
|
+
| cite | 286 | 199 |
|
|
85
|
+
| read | 82 | 33 |
|
|
86
|
+
| correction | **2** | 1 |
|
|
87
|
+
| **reuse** | **0** | **0** |
|
|
88
|
+
| **success** | **0** | **0** |
|
|
89
|
+
|
|
90
|
+
**含义**:`reuse` 与 `success` **从未落盘**(`createSuccessEvidencePre` 有 5 处调用点,但零事件产出);`correction` 全量仅 2 条。因此当前 importance **实质由 `seen`(曝光次数)驱动 ≈ 曝光度,而非有用性**;负向下压机制(correction)几乎不存在。
|
|
91
|
+
|
|
92
|
+
这不是 M8-2b 的问题(它的职责是管道),而是**数据源的问题**,但它决定了 M8-2 最终能兑现多少价值。
|
|
93
|
+
|
|
94
|
+
### 6.4 三条后续建议
|
|
95
|
+
|
|
96
|
+
1. **补 P9:evidence 写入侧覆盖率排查** —— 查清 `reuse`/`success` 为何零产出、`correction` 为何近乎为零(是触发条件未满足,还是调用点未被接线)。见 `P9-evidence-write-coverage.md`。
|
|
97
|
+
2. **静默 catch 增加可观测性** —— `catch (eImp) {}` 是本次缺陷未被发现的根本原因。建议至少 `diag('m8-2b importance unavailable: ' + eImp.message)`,让"降级"可观测(仍需保持 fail-soft,不影响 I4)。
|
|
98
|
+
3. **效应强度标定留作旋钮** —— 当前 `factor = 0.5 + 0.5 × importance`,实测 importance ∈ [0.30, 0.65] → factor ∈ [0.65, 0.825],**最大摆幅 1.27×**。即只有 dense 分差小于约 27% 的候选对才可能被翻转——偏保守。建议 P9 之后用真实查询测量"翻转率"再决定是否放大(如 `0.3 + 0.7×imp`)。
|