修复完整历史与运行态内存放大并重建发布包
This commit is contained in:
10
.planning/2026-10-14-history-memory-fix/findings.md
Normal file
10
.planning/2026-10-14-history-memory-fix/findings.md
Normal 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条正文和工具数据逐条摘要相符。完整集成回归通过;运行服务尚未重启,生产内存效果须在修复生效后另行观察。
|
||||
15
.planning/2026-10-14-history-memory-fix/progress.md
Normal file
15
.planning/2026-10-14-history-memory-fix/progress.md
Normal 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任务。未修改生产历史,未打包、提交或重启服务,运行进程仍须后续安全重启后生效。
|
||||
25
.planning/2026-10-14-history-memory-fix/task_plan.md
Normal file
25
.planning/2026-10-14-history-memory-fix/task_plan.md
Normal 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 精确读文件继续实现。
|
||||
9
.planning/2026-10-14-runtime-json-fix/findings.md
Normal file
9
.planning/2026-10-14-runtime-json-fix/findings.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# 实现依据
|
||||
|
||||
- `saveTurn`仍通过`writeAtomicJson`整份序列化,`loadTurn`仍整文件读取并JSON.parse,是本轮补齐点。
|
||||
- `preserveNewerTaskTrackingForSessionSave`已只读元数据,但每次保存重复读清单,改为归档内部合并。
|
||||
- 历史基线已经是不可变块引用,不需要改回整文件磁盘基线。
|
||||
- 流式JSON实现固定64KiB字节缓冲,字符串按8Ki字符段转义并保护代理对;解析按容器和值构造对象,保留原v1运行态格式。旧归档迁移共用新解析器,移除重复扫描实现。
|
||||
- 任务状态保护使用同一次提交取得的当前清单;可信同修订保存仅读256字节修订头,保存后才同步受保护的任务状态,失败不推进会话与基线。
|
||||
- 最终隔离集成回归退出0;JSON10项、历史持久化38项通过。80MiB运行态在256MiB堆参数下RSS峰值210.5MiB,读写最大64KiB;重开正文摘要完整,write/fsync/rename失败保留旧档且无tmp残留。
|
||||
- 本轮仍未重启服务或修改生产历史。运行态返回完整对象,峰值随单条正文和同时存活运行态增长;测得RSS只代表合成夹具。
|
||||
15
.planning/2026-10-14-runtime-json-fix/progress.md
Normal file
15
.planning/2026-10-14-runtime-json-fix/progress.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# 执行记录
|
||||
|
||||
2026-10-14:用户要求按另一实例方案继续修改;限定为运行态流式读写、结构比较及单次提交中的任务状态保护,保留分块归档设计。
|
||||
|
||||
已实现通用流式JSON读写、仅容器克隆和结构比较,并接入完整运行态、原子清单写入及旧格式迁移。归档内部保护任务版本,同修订保存只读修订头。测试代理只新增JSON与大运行态回归,主代理补任务状态及失败边界。
|
||||
|
||||
首次持久化回归发现新增修订头调用与提交修订局部变量同名,命中暂存区错误;局部变量改为nextRevision后重新验证,避免同修订快速路径失效。
|
||||
|
||||
持久化回归38项通过,新增同修订零完整读取、并发任务版本、任务看板删除及失败不推进基线四类验证。JSON新测试10项通过;80MiB运行态在256MiB堆下读取和保存并注入写/fsync/rename失败,正文摘要完整、旧文件不变、无临时文件残留,RSS峰值210.1MiB、单次读写64KiB。继续完整集成回归。
|
||||
|
||||
最终完整回归:`TMPDIR=/dev/shm timeout 300s node scripts/regression.js`退出0,输出Regression checks passed。进一步修复toJSON getter只读取一次并补断言,最终JSON回归10项及运行态内存回归均退出0;运行态80MiB、256MiB堆参数下RSS峰值210.5MiB,单次读写64KiB。lib/json-persistence.js、lib/session-history-store.js与server.js语法检查通过,git diff --check通过。文档已补充格式、失败语义和峰值局限。
|
||||
|
||||
交付完成:最终测试日志与工作区状态已核对,全部计划项完成,移除临时CSV跟踪文件。保留历史分块归档和分页读取,未改写生产历史、未打包、未提交或重启服务;当前服务进程尚未加载本轮源码修改。
|
||||
|
||||
后续交付:按用户要求使用本地Bun 1.4.2重新生成CentOS 7 baseline单文件发布包,目标为bun-linux-x64-baseline。规定的8个文件语法检查及git diff --check通过;新二进制MCP initialize返回有效JSON-RPC结果并正常退出。压缩包138个归档项,二进制和前端资源与当前构建一致;大小42.91MiB,SHA-256为7bbe795e39f61fdc4e47d96a2083d92e9a2f59593e2e4c5397debdb67a84b7c9。提交范围包含工作区全部源码、回归脚本、文档、任务记录和更新后的发布包;未重启服务。
|
||||
12
.planning/2026-10-14-runtime-json-fix/task_plan.md
Normal file
12
.planning/2026-10-14-runtime-json-fix/task_plan.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# 运行态流式持久化补齐
|
||||
|
||||
目标:吸收另一实例的流式JSON读写和单次任务状态提交方案,同时保留当前分块归档、分页读取和清单基线。
|
||||
|
||||
1. 确认运行态持久化和任务状态合并的现有契约:complete
|
||||
2. 实现流式JSON读写并整合任务状态保护:complete
|
||||
3. 验证JSON语义、失败保护及大运行态低堆回归:complete
|
||||
4. 更新契约与交付验证结果:complete
|
||||
|
||||
边界:不覆盖此前已完成的历史分块实现和既有文案改动;不修改生产历史,不打包或重启服务;单测上限60秒。
|
||||
|
||||
已知:Codebase Memory连接此前已关闭,源码使用FastCtx读取及rg精确校验;todo-list-csv技能不存在,按AGENTS维护CSV和update_plan。
|
||||
Reference in New Issue
Block a user