M27 体检(DevDocs/audit/记忆库价值体检-2026-10-24.md)两条根治项: 1) 新增 `dedupe_group` 候选动作(不放大 containNone): - 簇只认「同 scope+kind+完全相同 tag 集」或「同 scope+kind+前 12 字相同」 (后者附加词项余弦 ≥0.70 与同 kind 收窄); - 每簇保留超集:内容最长 > merge_count 大 > created_at 早 > id; - 安全门与既有合并路径同源:受限来源/绝对时刻/时效状态/低置信一律不进簇, 数值与否定与存活行不一致的成员被逐条剔出;临时层行(expires_at 非空) 两个方向都不进簇(存活行被清扫会给被吸收行留悬空 merged_into); - 已被 archive/merge 候选覆盖的条目不重复出第二条待办(抑制); - 落库形态与 merge 同构:source_ids 多条 + target_id,应用为整簇原子的软合并, 回滚复用 revertTidyMerge(逐条复原); - 批量应用按**行**计上限 200 行/批(maxTidyApplyRowsPerBatch),超限如实 truncated; - 不进自动档(人工/批量点);试算(DryRun)零写库给出簇数与可减少行数。 2) 留存闸改组合口径(治根)+ N6/N7: - 护栏②从「含习惯/约定词就一票放行」改为「锚点词 **且** 含具体约束 (数字/禁忌/频次规律)」;无约束的锚点交给更窄的规则判; - N1/N3/N4/N5 这几条词项规则改为「无锚点时才开火」(`主人喜欢说晚安` 这类偏好不再因寒暄词被判临时); - 新增 N6(指示性时点,句首前 12 字内)与 N7(进行中状态),安全阀:习惯词、 硬性长期事实词、数值/约束、寒暄/情绪词一律按回去; - 命中即第五态 defer,`expires_at = 判定时刻 + tempTtlSec`(默认 7 天, 已落在 $DATA_DIR/config/memory-tidy.json,零新 .env 键);**只开新增侧**, 存量一条不补写(用例钉住)。 契约(加性,不改既有字段语义):tidy dry-run/run 回执加 dedupeGroups / dedupeRowsReducible / dedupeTruncated;批量应用回执加 deduped / rowsAffected。 实测(生产库只读 mode=ro,active 3667): - 闸:改前 2 条(0.05%) → 改后 89 条(2.43%):n6 58 / n7 29 / n1 2; 89 条里 30 条含锚点词,逐条人读均为「约定明天中午见」「约定下周留个午后」 这类到期即失效的安排(唯一可议:1 条把「中午互动的日常」一起带进临时层)。 - dedupe_group:281 簇 / 可减 594 行(16.2% of active);tag_set 265 / prefix12 16; 簇大小 2:170 3:48 4:27 5:10 6:10 7:7 8:2 9:2 10:1。 验收:go build ./... + go vet ./... + go test ./... 全绿。
主人实测:memory_items 1191 行、候选 77 条全 pending、memory_tidy_runs 仅 1 行、两晚定时没跑。 根因两条(都在这片里修掉): ① **以前根本没有执行面** —— 只有只读试算,候选永远 pending ② **调度被重启饿死** —— interval=24h 的 ticker 从进程启动算起,两天重启十几次 ⇒ 24h 永远走不完 - 应用路径:逐条 / 按 run 批量(默认 100、硬顶 500、超限 truncated)/ revert;**软合并** (status + merged_into/merged_from/merge_count,**绝不改 content、行不删**)+ 审计 (memory.tidy.apply / memory.tidy.revert)+ **幂等**(候选状态条件更新 + 行 status 闸两道) - 调度:改成**到点即跑**(catchUp:无历史+窗口内 / 距上次 run ≥ interval / 窗口起点晚于上次 run), 「上次 run」以 memory_tidy_runs 为**持久事实**;注入时钟用例证明**重启不饿死** - 手动真跑端点 POST /admin/memories/tidy/run(同档鉴权 + 审计 + 回执:新增/合并/软删/耗时) - 候选表加 run_id 列 + 索引(前滚;顺序=建表→补列→建索引,否则既有库会 no such column) - 3 个变异自检(删 catchUp / 去掉两道 status 闸 / truncated 恒 false) ⚠️ 生产库零动作:1191 行真跑与 77 条候选应用**未执行**(按红线由主人确认后主会话执行) ⚠️ 契约段在报告里(candidates 列表/apply/revert/tidy.run),Docs/ 待登记