2026-10-24 归档:本文保留当时的设计、测量和验证边界,不作为当前接口或待办清单。现行说明见文档入口;下文日期、状态和未运行项均属于原记录。
日期:2026-10-22。调查起点为 53a03b31,验证期间保留并跟随了独立提交的头像修复 7bad118d。已读取本地私有仓库的 PRD v1.1 和实施设计 v1.1,检查时私有仓库提交为 75b9403f、工作区无修改;未核对远端。本文只记录公开实现与实测边界。
本机当日运行日志中的成功调用:
| 调用 | 样本数 | 最短 | 中位数 | 最长 |
|---|---|---|---|---|
session/unlock |
14 | 7.212 s | 13.582 s | 32.715 s |
vault/list |
8 | 0 ms | 7 ms | 17,861 ms |
sync/run |
2 | 15.832 s | 28.557 s | 41.281 s |
这些不是独立性能基准;解锁总时间包含系统在场确认,不能全部归因于网络。列表的异常慢样本与连续三个解锁调用重叠;其余列表样本为 0–26 ms。数据量小的情况下,主要问题是本地读取等待解锁/同步释放客户端锁。
原先快速解锁的路径为:系统凭据/在场确认 → 本机密钥 → 用户 home 的设备状态 → 根加载(包括向中继发布安全证明)→ 完整内容同步 → 恢复保存的登录 → 返回并发出会话事件 → 界面读本地数据。open_root 内部等待 sync(),daemon 又在整个过程中持有客户端锁。定时同步和手动同步也持有同一把锁。
每次同步即使没有新内容,仍创建 export、读取完整快照并验证;有本地待上传版本时,还会逐项上传并再次读取快照。网络往返耗时被放进首屏等待路径。界面的自动解锁、侧栏、内容区和审批窗口还能重复触发解锁,加重排队。
- 解锁完成设备校验与根加载后返回,本地内容立即可读;daemon 自动安排一次后台同步,周期同步关闭时也执行。
- 已保存的根与刚取得的认证状态一致时,加载根无需先访问中继。在线设备撤销检查、根变更时的下载验证、离线快速解锁的既有边界均保留。
- 内容同步的网络访问改用
Hold:仅在同步步骤中读取/修改 Client。同步与密文 flush 串行提交,本地查看、编辑、锁定可在网络等待期间继续。 - 锁定使旧同步执行失效;即使同一账户随后重新解锁,旧执行也不能应用迟到的响应。排队中的同步绑定原账户;上传进度和提交结果写回前重新核对任务。
- 同一窗口共享正在进行的解锁;daemon 对已经解锁的同一账户不重复执行解锁。内容区、侧栏、设置和审批窗口显示解锁中状态。
- 状态增加
syncing,侧栏显示后台同步与失败重试;开始同步只刷新状态,完成或失败才刷新内容。锁定不再等待密文 flush 返回才通知界面。 - 日志新增
sync/pass耗时,区分解锁完成与完整同步完成;不记录内容、账户 ID 或凭据。
实现入口:client.rs、root.rs、sync.rs、daemon.rs、session.ts、GateRail.svelte。
| 优先级 | 当前证据 | 建议与验证方式 |
|---|---|---|
| 高 | sync::fetch 每次全量 export;apply 每轮仍打开全部快照 manifest |
为日常同步设计认证的增量游标;首次同步和校验仍保留全量路径。需与中继合同一起处理遗漏/回滚检测,不能仅跳过已有条目。测无变化同步的请求数、字节数和 P95。 |
| 中 | Vault.svelte 的 Promise.all 等列表、冲突和完整健康检查一起结束 |
首先发布列表,健康检查稍后补充;按版本缓存检查结果。测 1,000/10,000 条记录的首屏和 CPU,避免为当前小样本先增加缓存复杂度。 |
| 中 | channels.rs 每 5 秒检查频道,频道网络读取在循环中串行进行 |
解锁/账户同步结束后唤醒频道读取;优先当前频道,其余采用有界并发。保持每个频道的游标、换代和重试语义。分别测本地历史出现和新消息到达。 |
| 中 | 解锁的设备安全校验、新根读取,以及部分账户/审批操作仍在 under_lock 中 |
继续按具体慢调用拆分;安全校验前不提前暴露被撤销设备的内容。单独测在场确认耗时与安全查询耗时,避免用放松校验来换速度。 |
| 中 | 冷启动加载的 renderer bundle 包含全部视图 | 根据冷启动 profiling 决定是否按路由延迟加载;当前日志不足以把约十秒的解锁归因于 bundle。 |
本次优先解决已有数据的首次可见与交互阻塞,没有改变云端同步协议。新设备没有本地内容时,仍需等待首次同步;正常在线快速解锁仍需要设备状态查询。优化后的真实 Touch ID 到首屏 P50/P95 需在更新运行中的应用后测量,不能用单元测试耗时替代。
确定性回归使中继接收请求后不响应,期间完成本地文件树/秘密库读取、写入一条内容及锁定,再放回旧响应,确认它不能继续同步或改写最后同步状态。一次本地运行中,这些本地操作合计约 4.4 ms;这是隔离测试数据,不是线上解锁耗时。
另有本地根无需中继即可加载、根变化仍需验证、重复解锁不重复执行、锁定后重新打开同一账户时拒绝旧响应的回归;Electron smoke 覆盖解锁中禁用、后台同步时查看列表与失败重试提示。
本地 PocketIC + 私有中继集成测试确认:关闭周期同步后,登录仍自动同步一次,并取回锁定期间另一台设备新增的内容。本次循环地址测试从模拟登录开始到读到缓存条目约 666 ms,整个用例 23.65 s;不含真人 Touch ID,也不代表公网耗时。
Rust 核心 196 项、CLI 43 项常规测试通过,Clippy(-D warnings)通过;前端 84 项测试、Svelte/TypeScript 检查与构建通过。真实 Secure Enclave 测试在受限环境返回不可用,两个原生挂载测试及已有的 large_vault、print_share_vector 显式忽略项未运行。macOS 原生全屏测试因窗口无法进入全屏而未通过,采用现有选项关闭该项后,完整桌面 smoke 通过;长按审批测试显式置前窗口,避免被遮挡窗口的动画帧暂停造成偶发失败。
完整 desktop_content_and_sync 在通过双设备冲突/删除恢复、100 MiB 备份往返和中断续传后,于 64 MiB 密码分享链接的 files/share_link 返回 UNAVAILABLE;整项不能记为通过,该超时的成因尚未确认。聚焦本次范围的 desktop_unlock_syncs_in_background_with_periodic_sync_disabled 已通过。