Repository navigation
fix(session): 会话保留默认 365 天、不限数量、10GB 体积兜底;修 --cleanup-sessions 挂住 - #218
Merged
Merged
Conversation
- 默认值单一事实源 session/retention.ts:maxAge 30d→365d,maxCount 50→不限, 新增 maxTotalSize(默认 10GB,会话+轨迹合计,超限按最旧优先删,不越过保护) - 轨迹目录 / Session Memory 笔记与会话共用一个保留期;cleanupPeriodDays 降为 maxAge 别名; enabled=false 时三处都不按时间删 - 启动期自动清理真删了会话时推状态栏提示(TUI 未就绪先排队),不再静默删除 - --cleanup-sessions 等一次性命令统一 exitOneShot() 收尾:交互终端下 early-input 让 stdin 保持 resume,只 return 会挂住;--cleanup-sessions 打印完整生效配置 - schema 校验 maxTotalSize;disk-usage 登记表、sessions.md、ref/settings.md 同步 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njfuzrs
enabled auto-merge
October 9, 2026 19:31
njfuzrs
added a commit
that referenced
this pull request
Oct 10, 2026
## 改了什么 本地轨迹目录(`~/.sid-code/trajectories/sessions/`)的清理从「默认留最近 100 个」改为与会话保留(#218)同口径: | 规则 | 旧默认 | 新默认 | | --- | --- | --- | | 数量(`trace.maxSessionsRetained`) | 100 | **不限**(显式配置仍生效) | | 体积 | — | **复用 `sessionRetention.maxTotalSize`(10GB)**,超了才删 | | 保护 | — | 活跃进程正在写的会话(含 resume 的 logicalSessionId)+ `minRetention`(1d)窗口内的目录不删 | | 时间 | 365d(#218) | 不变 | - 淘汰选择抽成纯函数 `packages/core/src/trace/retention.ts`:已上传优先、最旧优先。 - `init-helpers.ts` 把 `sessionRetention` 接进 collector;`enabled:false` 时不按体积删。 - 同步 `website/team/observability.md`「本地保留多少」、`website/ref/settings.md`、`disk-usage.ts` 登记表,以及 `collector.ts` / `session-index.ts` / `backfill.ts` 里引用旧默认 100 的注释。 - Agent Note:`.agents/notes/implemented/bug-fix/2026-10-10-轨迹保留默认不限数量改体积兜底.md` ## 为什么 #218 遗留的已知边界:一天几十个会话时,轨迹先于会话被 100 截断。实测开发者本机已顶到 100 个,最早只到 2026-09-11(约 2~4 周)。调试要用的 `raw.jsonl` / `session.traj` / `events.jsonl`(`trace-digest`、`provider-health` 的数据源)回头就找不到了。 旧注释「不要调大上限」的前提是「原始轨迹 ≈45MB/会话」,实测 100 个目录合计 **37MB**(p50 24KB / p95 1.3MB / max 3.2MB),差了一个数量级以上。长期指标仍由 `session-index.jsonl` / `usage-ledger.jsonl` 承担,不受影响。 ## 测试 - 新增 `packages/core/tests/trace/retention.test.ts`(9 个用例):反向门禁「150 个旧目录默认全部保留」、体积超限按已上传优先 + 最旧优先、保护窗口与活跃进程不删、非法数量不会解读成「保留 0 个」、`maxTotalBytes=0` 不删。 - 变异自证:把默认值改回 `?? 100`,反向门禁变红(8 pass / 1 fail),还原后全绿。 - 端到端:本机 100 个真实轨迹目录的副本 + 60 个 2 天前的已上传目录(共 160 个)→ 默认配置下删 0 个;把上限压到 30MB → 删到 100 个,60 个已上传的优先被删。 - `bun run affected-tests:run`:2502 pass / 0 fail;`make build` 和自检都通过(没有 `will always be undefined` 警告);`lint` / `lint:boundary` / `format:check` / `docs:gen-reference --check` 都通过。 🤖 Generated with [Claude Code](https://claude.com/claude-code)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
改了什么
会话保留默认值(单一事实源
packages/core/src/session/retention.ts)maxAgemaxCountmaxTotalSize(新增)minRetentionmaxCount不限)。一天几十个会话时,50 个只够留一两天,删会话还会连带删掉轨迹。保留期统一:轨迹目录和 Session Memory 笔记原来写死 30 天,现在与会话共用同一个保留期。
cleanupPeriodDays降为maxAge的别名,两者都写时以maxAge为准;enabled:false时三处都不按时间删。不静默删除:启动期自动清理真删了会话时,推一条状态栏提示,告诉用户删了几个、去哪调整。原来只在
--debug下记日志。--cleanup-sessions在终端里挂住:交互终端下 bootstrap 的 early-input 让 stdin 保持 resume,一次性命令只return时事件循环不会退出。新增exitOneShot(),五个一次性命令分支统一用它收尾。--cleanup-sessions现在会打印完整的生效配置。同步更新了:schema 校验(
maxTotalSize)、disk-usage 保留策略登记表、website/use/sessions.md、生成的website/ref/settings.md,并加了 Agent Note。测试
packages/core/tests/session/retention.test.ts:默认值(含「不得回到 30d / 50」的反向门禁)、别名优先级、体积兜底最旧优先且不越过保护、写错配置时不会全删;还有对照用例:160 个会话分布在 2 天内,新默认删 0 个,旧默认删 80 个。startup-housekeeping-orphans.test.ts:Session Memory 笔记跟随maxAge,enabled:false时不删。bun run affected-tests:run:3393 pass / 0 fail;make build和二进制自检都通过;lint、lint:boundary、oxfmt都通过。script -q /dev/null ./sid-code --cleanup-sessions,用临时SID_CONFIG_DIR加本机会话的副本):修复前 15s 超时被 SIGKILL,修复后 exit=0、约 440ms;maxAge/maxCount、enabled:false、cleanupPeriodDays三种配置都生效。已知边界
trace.maxSessionsRetained(TraceCollector 的 LRU,默认 100)这次没动:它只清原始轨迹,长期指标在session-index.jsonl,已有 P0-2 的论证。一天超过 100 个会话时,轨迹仍会先于会话被回收。🤖 Generated with Claude Code