外观
P4 Session Review 归档索引与回放加载
批次结论
本批次把 P4 时间轴基础接到真实的本地 Session 目录:可以按 manifest 建立历史会话索引,并按会话只读加载 manifest、quality 和 JSONL 事件,统一交给 SessionTimelineBuilder 生成回放坐标。核心实现通过 Swift 全量测试 53/53(E2)。工作台展示由后续 UI 批次承接,截图、标注和导出仍在后续批次。
本批次交付
PerformanceSessionStore.listSessionSummaries():读取 Session 根目录下的 manifest,按startedAt倒序建立轻量索引;缺失 manifest 的目录不进入列表,目录与清单 ID 不一致时报告数据错误。PerformanceSessionStore.loadReview(sessionID:):校验会话标识和相对文件路径,读取manifest.json、quality.json与events/*.jsonl,逐行严格解码并校验事件sessionID。PerformanceSessionReview:以只读结构同时暴露 summary、manifest、原始事件追加顺序和派生 timeline。- 事件时间持久化改为带小数秒的 ISO-8601,避免默认 Foundation 策略截断 500 ms 等子秒信息。
- 路径越界、清单损坏、质量文件损坏和事件行损坏均 fail-closed,保留明确错误,不把损坏或缺失转换成 0。
时间与指标口径
本批次没有新增指标或改变指标公式;回放仍使用Session 回放与时间轴中记录的 session-timeline.v1:优先 monotonic,旧归档统一 wall clock fallback,窗口查询基于 elapsed 闭区间。指标自身的 raw / rate、scope、unit 和质量字段原样来自事件。
验证证据(E2)
| 检查项 | 结果 |
|---|---|
| Swift 全量测试 | 53/53 通过 |
| Session 索引按开始时间排序 | 通过 |
| JSONL 事件加载与 timeline 构建 | 通过 |
| 旧归档 monotonic=0 回退 | 通过,质量为 estimated |
| 路径穿越与损坏事件拒绝 | 通过 |
| Python Sidecar 测试 | 既有 22/22 通过 |
| VitePress 构建 | 通过 |
| macOS App / Collector 包检查 | 通过(x86_64、ad-hoc) |
| 真机回放、截图和标注 | 本批次未执行 |
未完成与下一步
- 在 SwiftUI 中增加“历史 Session”入口与列表,选择后加载
PerformanceSessionReview。 - 让指标图表、时间游标和报告统一读取 review.timeline,而不是各自按墙上时间重算。
- 接入低频截图事件和标注模型,保存到 Session 的 append-only 目录。
- 增加 JSONL / CSV 导出字段:时钟来源、anchor、算法版本和时间轴质量。
变更范围
MacApp/Sources/PerfowlCore/SessionReview.swiftMacApp/Sources/PerfowlCore/PerformanceSessionStore.swiftMacApp/Tests/PerfowlCoreTests/SessionReviewTests.swiftsite/devlog/p4-session-review-store.mdsite/devlog/index.md