Skip to content

fix(session): 会话保留默认 365 天、不限数量、10GB 体积兜底;修 --cleanup-sessions 挂住 - #218

Merged
njfuzrs merged 2 commits into
mainfrom
fix/session-retention-defaults
Oct 9, 2026
Merged

njfuzrs merged 2 commits into
mainfrom
fix/session-retention-defaults

Conversation

@njfuzrs

@njfuzrs njfuzrs commented Oct 9, 2026

Copy link
Copy Markdown
Owner

改了什么

会话保留默认值(单一事实源 packages/core/src/session/retention.ts)

项 旧默认 新默认
maxAge 30d 365d
maxCount 50 不限
maxTotalSize(新增) — 10GB(会话 jsonl + 同 id 轨迹合计,超了才从最旧的删)
minRetention 1d 1d

保留期统一:轨迹目录和 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 都通过。
  • 真实 pty 复现(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

- 默认值单一事实源 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
njfuzrs enabled auto-merge October 9, 2026 19:31
@njfuzrs
njfuzrs merged commit f0d5d5a into main Oct 9, 2026
4 checks passed
@njfuzrs
njfuzrs deleted the fix/session-retention-defaults branch October 9, 2026 19:53
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant