jianf
64c614b99a
fix(memory): 自动召回在真实 dsh batch 里 100% 失效
实测发现的 bug(在 headless profile 里真跑出来的,不是判据抓到的)。
根因
lastUserText 取「最后一条 role=user」。但真实 step batch 里,
用户提问后面还跟着 user 角色的注入:
[ 用户提问 ][ runtime-context 快照 ][ skill-catalog 提醒 ]
于是拿技能清单当检索词,召回 0 命中。
为什么 V3b 全绿却漏了:V3b 自造 batch 只有 2 条消息,判据有盲区。
修复
lastUserText 改为按 source.kind 过滤,allowlist 只有人真实提问的
kind(MessageSourceMap.user 的 'user')。未知 kind 一律当作注入——
将来某个插件的快照绝不能变成检索词。
实际给 dsh 的注入 kind:
runtime-context dsh-agent-loop 的工作目录/沙箱快照
skill-catalog dsh-tool-skill 的技能提醒
skill-invocation 同上
agent-instructions / time-context / goal / ...
判据(先写红,再修)
- REGRESSION: lastUserText 从 3 段 batch 里取出真实提问 修前红
- REGRESSION: 真实 batch 端到端必须召回命中(修前 0 命中) 修前红
- REGRESSION 变异: 退回「最后一条 role=user」⇒ 命中数必须掉到 0 修前红
- checkpoint V3c: 同样的场景进 checkpoints,V3b 的盲区补齐
- 原 V3b 的 fixture 补上 source.kind(真实消息都有,缺了就没测到判别)
修前/修后数字(4 条种子块,三种 batch 形状)
batch 形状 旧规则 新规则
2 段(原判据形状) 1 1
3 段(+runtime-context) 0 1
4 段(+runtime-context +skill-catalog) 0 1
合计 1/3 3/3
在实测者留下的真实库上复验(/tmp/dsh-memory-probe/memory.db,
1 条真实块「测试口令是 7788。」):
旧规则 query = "[Skills] git-release-discipline, ..." → 0 命中
新规则 query = "测试口令是什么" → 1 命中
验证:npm test 29/29(原 26 + 3 条回归)、npm run check 9/9(原 8 + V3c)。
README 补「真实 batch 不只是提问」一节,含 kind 对照表与修前修后数字,
并把 V3b 的盲区显式标注为已知缺口。