修复完整历史与运行态内存放大并重建发布包

This commit is contained in:
shiyue
2026-10-14 18:13:02 +08:00
parent 69b6db0f5b
commit 2b1c91488d
28 changed files with 2344 additions and 159 deletions

View File

@@ -0,0 +1,10 @@
# 调查与实现依据
- 现有完整历史库:lib/session-history-store.js。
- server.js 的 loadSession、saveSession、resolveSessionHistory、refreshSessionSnapshotCache 接入归档。
- 原有契约要求原子提交、可信加载、旧修订合并、删除及清空不复活、完整运行态优先恢复。
- 不能把分块存储只做在文件层:分页入口和快照刷新也须避免整份加载。
- 采用不可变内容哈希块与原子 manifest 提交;可信基线只保留块引用,旧修订按单消息逐字段合并。
- 服务端常用加载保留有界尾部,分页直接读区间,任务跟踪只读元数据;明确导入/全量维护才申请完整加载。
- 集成回归创建 `_history/_turns` 后发现保留目录触发无效会话ID错误;列表枚举须显式排除该目录和同名旧文件,34项持久化回归已覆盖。
- 最终合成夹具:70.5MiB完整旧归档在256MiB堆上限下完成流式迁移、增量保存和67页读取,RSS峰值145.9MiB;1128条正文和工具数据逐条摘要相符。完整集成回归通过;运行服务尚未重启,生产内存效果须在修复生效后另行观察。

View File

@@ -0,0 +1,15 @@
# 执行记录
2026-10-14:初始化项目上下文,确认完整历史功能与归档库。用户要求继续推进修复。
定位已完成,进入分块存储和服务端有界入口实现;测试代理负责隔离内存回归。未重启服务。
分块清单、增量保存、64KiB流式迁移、默认尾部和首屏/重连/分页入口已实现。
补齐元数据保存、单消息修改窗口、跨窗口查重和附件逐块遍历,避免尾部加载遗漏早期消息。
首轮70.5MiB合成归档在256MiB堆上限下通过,RSS峰值144.6MiB;全部1128条消息逐条摘要相符。
当前补齐默认窗口、并发和失败重试回归,并验证运行完成及自动重试路径。测试保持隔离目录,未重启生产服务。
集成回归定位并修复 `_history/_turns` 保留目录被会话列表枚举的问题,补充真实运行态目录及同名旧文件回归。完整历史持久化单测34项全部通过,完整集成回归继续执行。
最终验证:`TMPDIR=/dev/shm timeout 300s node scripts/regression.js` 退出0,输出 Regression checks passed;包含完整历史存储、内存、首屏/分页、运行完成、重启恢复及自动重试回归。最终单独内存回归退出0:70.5MiB旧归档、256MiB堆上限、RSS峰值145.9MiB,1128条消息经67页逐条校验完整,6次增量保存复用37个原始块,单次旧文件读取最多64KiB。该数字为合成隔离夹具,不能当作生产进程测量。语法检查和 git diff --check 通过。
交付完成:所有计划步骤完成,临时TODO CSV已清理;源码与后端契约已更新,保留既有未提交文案改动及10-11任务。未修改生产历史,未打包、提交或重启服务,运行进程仍须后续安全重启后生效。

View File

@@ -0,0 +1,25 @@
# 完整历史内存修复
目标:保留完整会话历史,消除完整归档加载、保存和基线的整份复制,增加分块存储、按页读取和安全迁移。
## 阶段
1. 确认归档和分页入口,确定内存有界的实现:complete
2. 实现分块归档、按页读取和旧数据迁移:complete
3. 验证历史完整性、并发保护和内存峰值:complete
4. 完成代码复核并交付验证结果:complete
## 边界
- 保留正文、工具参数和结果,不用截断历史换取内存。
- 不覆盖现有 server.js 未提交改动。
- 测试使用隔离目录,不修改生产归档。
- 重启前必须确认没有其他运行中的对话。
## 已知情况
- 当前完整历史格式见 .trellis/spec/backend/session-history.md。
- 用户要求继续推进,不再停留在审计流程。
- 初始 git 状态:server.js 已修改;10-11-remove-compact-followup 为既有任务。
## 问题记录
- 首次定位 todo-list-csv 技能不存在,采用项目规定的 CSV 与 update_plan 同步。
- Codebase Memory 部分命中位置错位,须用实际文件交叉校验。
- 本轮 Codebase Memory 连接已关闭,改用 FastCtx 精确读文件继续实现。