# 统一时间线全链路性能复查（2026-10-09）

范围：本任务插件改动，从 Browser 失效通知到 Host 统一查询、投影、SQLite 页缓存、Browser 窗口合并、交织已读和公开快记详情。插件基线 official/dev `03d07a6e9649c2813055b64ab9d4b59127fc3bf3`。客户端与 DSH 未改源码，未发布。

用户确认闪烁场景复测正常后追加本次审查。本报告区分确定性边界、局部测量和真实场景验收，不以构建或单次 CPU 采样证明整体性能达标。

## 本轮确认并修复的问题

1. SQLite 在每次看到 `not_applicable` 时，重复扫描来源内容并改写同会话全部缓存页的 metadata。加入仅记录成功事务的退役来源集合；相同退役结果跳过跨页清理。来源恢复可用或 gap 后重新保守处理，重启后也重新处理，最多保留 256 个 scope。权限退役语义未放宽。
2. 统一窗口逐条 `find` 消息、逐条 `some` 判断本地消息，形成平方级匹配。改为在同一 memo 中建立 eventId Map 和 recordUid Set，匹配工作随事件和消息数量线性增长，保留事件身份与本地待发送记录。
3. 刷新进行中新收到交织通知时，通知可能被消费而读取因 single-flight 返回。读取完成后同时检查消息和交织修订号，使用既有最多两次追赶上限；覆盖无普通消息的交织窗口。没有新增并发刷新、定时器或无限重试。

## 相同工作负载对照

macOS 同一工作树、Node/pnpm 环境、全新临时 SQLite，256 页 × 40 条事件，每条正文约 1 KB。先完成来源退役，再重复写同一页 10 次。计时不含初次填充；用数据库 trigger 记录真实 metadata UPDATE 次数。

| 指标 | 修改前 | 修改后 |
| --- | ---: | ---: |
| 跨页 metadata 重写 | 2,560 | 0 |
| 10 次写入合计耗时 | 1,096 ms | 16 ms |

这是一次同工作负载的局部测量，不是 p95、FPS、整体网络响应或跨机器保证。确定性门禁是重复退役不改写其他页、恢复可用后再次退役仍生效、页数不超过 256。

复现入口：`tests/unified-timeline-performance.test.ts`。修改前制品为 `plugin-refresh-loop.tgz`，SHA-256 `bba0ff6d995fd7e307f649cbc40eb2bc45ef03dee72ab1e47f57f236eb7c94a8`。

## 链路与资源核对

| 环节 | 当前边界与证据 |
| --- | --- |
| 结构查询 | 私聊/群聊只读 unified 结构；旧辅助结构读取已停用。单页最多 100 条，默认 40 条，refresh 100 条；刷新串行读完后整体发布。 |
| 请求协调 | 使用既有 authenticatedChatPost 协调器，interactive-read 最大并发 4、队列 128；相同查询加入 single-flight，最后调用方取消可终止底层请求。头像/资料按用户 ID 批量读取，不逐条查询结构。 |
| 窗口增长 | 活跃窗口最多 2,000 事件、500 token；会话内存缓存最多 20 个来源；重复游标失败，refresh 和追赶分别最多 500 页，失败保留上次已确认窗口。主列表单页读取使用现有 30 秒 deadline，预览整个 load 使用 15 秒 deadline。 |
| SQLite | 最多 256 页，内容 payload 64 MiB，单页含 metadata 最多 4 MiB；事务失败不破坏原页，按账号/环境/会话隔离，卸载关闭数据库。64 MiB 指内容 payload，不是 SQLite 文件/RSS 的总大小。 |
| 交织通知 | 250 ms 合并通知；同一通知只执行一次，发布结果不自触发；读取中后续通知有有限追赶。新增回归在修复前失败、修复后通过。 |
| 已读查询 | 只查可见行，按引用去重，每批最多 20，Browser 串行批次，Host 最多 3 个 worker；同群详情在一批内共用。全部已读停止轮询，后台停止；未读 15 秒、全部未知 60 秒、失败退避最高 60 秒。 |
| 已读释放 | 新增 100 次会话生命周期测试，每次注册 40 行、20 行可见：每次 dispose 后 timer 为 0、状态清空；再推进 1 小时没有新增请求，最大并发 1。 |
| 公开快记 | 列表仅发布入口，无逐条正文预取；点击后单次详情读取，关闭/切换取消，复用 WorldCard 的评论与媒体 owner。 |
| UI/桌面 | 输入回归覆盖 40/400/1,000 条已加载记录，20 次输入没有新增 Host 调用；这些是 React 测试而非真实 Chromium FPS。无新 Harness、订阅连接或客户端进程 owner。 |

## 适用范围与保留限制

未执行生产写入/发送消息来制造负载。生产不同账号、群规模、弱网、长时间运行以及 Windows/Linux 的 CPU、内存、滚动帧率与服务端 p95 不由这些本机测试证明。主列表 refresh 当前是有上限的串行多页读取，未引入全流程总时限；极慢网络下仍可能经历较长刷新，但旧窗口保留且切换可以取消。没有发现需要新增独立缓存、订阅或后台轮询 owner 的理由。

## 性能审查阶段验证（后续功能回归见统一时间线文档）

- 全量入口 `NODE_OPTIONS=--no-experimental-webstorage pnpm test --maxWorkers=2`：873 个文件通过、11 个既有跳过；10,257 项通过、15 项既有跳过，耗时约 258 秒。
- 定向链路回归 7 文件 393 项通过；已读生命周期独立复跑 6 项通过。
- Typecheck、完整构建、不可变 tgz 打包通过；最终验收包 `plugin-performance-audit.tgz` SHA-256 为 `4f11a8405cb2c9b9cdebbd71ab925b67490a673bb28a936d15ad40cc60cf2e01`。Consumer 与 Profile 的 Browser bundle SHA-256 均为 `86a181ffd2935f4002718dc8cf5dcf64a31a7c9b89d1643c9b373dbc2d084888`，临时诊断代码不在制品内。
- 最终包在已登录的独立客户端打开原私聊场景后，用户继续切换会话。61 秒、13 次进程树采样中始终为同一组 7 个进程，未新增 Harness；进程树 RSS 由约 1,386 MiB 到 1,210 MiB，随后一次读取约 827 MiB。处于启动/用户操作过程，不将 CPU 波动或这段短样本当作长期无泄漏证明。保留用户当前会话，不再抢占导航。
