Skip to content

[Bug] lastDistilledSeq 为进程内存态:宿主重启后蒸馏窗口从头重放,已蒸馏历史被重复处理 #229

Closed

Description

@modusensus

问题

collectMessages 的增量游标 lastDistilledSeq 只存在于进程内存(#226 引入的按事件序增量蒸馏依赖它)。宿主重启后游标归零,蒸馏管线把已经蒸馏过的历史窗口整段重放。

后果:

期望

游标随库持久化,重启后从上次推进位置继续。

实现约束

认领

@z2Ace0107 在 #211 评论里已表达意向,届时优先由你接。

Activity

  1. added
    bug功能异常、崩溃、数据错误(agent 诊断 → 人工确认)
    on Sep 18, 2026
  2. z2Ace0107 commented on Sep 19, 2026

    @z2Ace0107
    Contributor

    感谢在 #229 中优先邀请我继续负责。我确认认领这个 Issue,并计划单独提交一个 PR,只处理 lastDistilledSeq 的持久化,不混入其他 Issue 的改动。

    初步设计如下:

    开始实现前想请确认三个边界:

    1. 游标是否按 session.id 持久化?
    2. 升级前已有会话没有游标时,是否接受首次启动对历史窗口进行一次补蒸?我倾向于优先保证正确性,而不是直接跳过历史内容。
    3. 是否同意把游标更新与记忆写入放在同一事务中,并将本次成功消费窗口末尾的事件 seq 保存为 last_seq?
  3. modusensus commented on Sep 19, 2026

    @modusensus
    MemberAuthor

    @z2Ace0107 三个边界都确认:

    1. 按 session.id 持久化——是。现状内存游标 lastDistilledSeq(src/summarize.js 的 Map)就是以 session.id 为键,持久化沿用同一键才能跨重启续上既有会话;新增 distill_cursors 表(session_id 主键)比复用 user_settings 干净,同意。

    2. 存量会话接受一次性补蒸——同意你的倾向,正确性优先。去重有双重兜底:三元组精确键(type+title+scope)拦完全同键的,summarizeDedupeMinSim 的向量近重档拦「同源内容二次蒸馏」的近似产出,残余漏网属可接受成本。首次启动那批补蒸会照实写进 llm_audit_logs,量大会显眼——可见即可排查,不需要专门静音。

    3. 同一事务 + 记窗口末尾 seq——同意,这正是 [Bug] 蒸馏取样方向反了:maxChars 上限用 slice(0, n) 取【会话开头】,长会话/复制来的会话会每轮反复提炼同一段 #210 定下的「完整成功才推进」语义的持久化版。一个实现提醒:事务保持短——蒸馏 / LLM 调用留在事务外,「写记忆 + 推游标」在同一短事务里提交;store 的 WAL + busy_timeout 已为多进程就绪,别在事务里做慢调用即可。

    边界确认完毕,可以开工。

  4. moved this from 📋 Backlog to 🔨 In Progress in dsh-mneme 任务看板on Sep 20, 2026
  5. moved this from 🔨 In Progress to ✅ Done in dsh-mneme 任务看板on Sep 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug功能异常、崩溃、数据错误(agent 诊断 → 人工确认)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions