jianf
98612b2746
feat(memory-b): A 组完成 —— 异步 seam + golden fixture,recallBlocks 未动
G6 收口
- 范围如实收窄:表从 8 个扩到 **23 个**(当前 harness 里全部 user-role
注入 kind),并把措辞改成「installed harness 里的 user-role 注入 kind」,
不再暗示穷举。全量 MessageSourceMap 有 25 个 source key,会继续增长;
白名单是 fail-closed,未列出的新 kind 天然安全。
- 每个 kind 都核到字面声明(不是照抄之前的表);`compact-checkpoint` 的
kind 藏在 checkpoint.d.ts:18 的 marker 类型里,也已核到。
- 新增 **G6b**:`user-rpc` 的 kind 就是 `'user'`
(dsh-api-session-controller/lib/types/types.d.ts:395-400),
所以这条白名单不会把远程/网页用户挡在外面。这条是你指出的,
我认为是全组最关键的安全性断言,已写进 README 正文。
A 组实现
- `recallBlocks` 保持同步且一行未改(新增函数在它之后)。
- 新增 `recallBlocksHybrid(store, embedder, query, opts)` async 包装。
无 embedder / embedder 抛错 / 返回空向量 / 维度与 info() 不符
⇒ 退回同步召回,并在返回数组上挂不可枚举的 `degraded`
('no_embedder' | 'embed_error' | 'hybrid')。永不抛错(§0.4)。
- `degraded` 不可枚举:不进 JSON.stringify / Object.keys /
与 phase A 输出的深比较,保证 A3 的逐字段相等成立。
- `Embedder` 窄接口三成员:embedText / info() 同步 / close。
判据里不出现任何 provider 字段名。
A 组判据(test/phase-b-a.test.js,6 条)
- golden fixture:12 块 × 15 查询 × topK 1/3/5 = **45 例**,
逐例比较 id / 顺序 / **score 精确相等(无容差)** / exact / why 字符串。
容差比较会放过评分改动,而这正是本组要挡的。
- A1 结构性断言 recallBlocks 不返回 thenable。
- A3 hybrid(null) 与同步版逐字段相等(含 why)。
- A3b 降级原因可见。
A 组变异(全部实跑打红,原文如下)
M1 非精确带分数 +1e-6
not ok 2 - A2: golden fixture — every case reproduces exactly
M2 recallBlocks 改 async(被否决的设计)
not ok 1 - A1: recallBlocks is synchronous and takes no embedder
M3 hybrid 给 why 加后缀
not ok 3 - A3: recallBlocksHybrid with no embedder equals recallBlocks
★ A 组抓到的真问题(不是我的判据,是实现改动引起的)
`StableMem.recall()` 变成 async 后,上一轮那条 REGRESSION 变异测试
拿到的 Promise 没有 `.length` ⇒ `undefined < undefined` 为 false ⇒
断言「通过」但什么都没测。checkpoint V3c 同一处也有这个问题。
两处已补 await。README 里记成一条通用陷阱:
任何东西改 async 后,grep 所有对可能已变 Promise 的值取 `.length` 的地方。
验证
- npm test 40/40(34 + A 组 6)
- npm run check 9/9
- 提交前连跑 3 次 check + 3 次 test,6 次全绿(按你的要求)
F 组未动:等 §0.1 endpoint 规范化 / §0.2 四态 / §0.3 stats+is_anomalous /
§0.4 失败降级的裁定落地。