Skip to content

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.jsonquality.jsonevents/*.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)
真机回放、截图和标注本批次未执行

未完成与下一步

  1. 在 SwiftUI 中增加“历史 Session”入口与列表,选择后加载 PerformanceSessionReview
  2. 让指标图表、时间游标和报告统一读取 review.timeline,而不是各自按墙上时间重算。
  3. 接入低频截图事件和标注模型,保存到 Session 的 append-only 目录。
  4. 增加 JSONL / CSV 导出字段:时钟来源、anchor、算法版本和时间轴质量。

变更范围

  • MacApp/Sources/PerfowlCore/SessionReview.swift
  • MacApp/Sources/PerfowlCore/PerformanceSessionStore.swift
  • MacApp/Tests/PerfowlCoreTests/SessionReviewTests.swift
  • site/devlog/p4-session-review-store.md
  • site/devlog/index.md

Perfowl · Performance Observer