外观
P4 工作台布局与截图时间轴
批次结论
工作台完成一次窄范围 UI 收敛:侧边栏从 340pt 收窄到 280pt,移除“关于”入口和底部“基座服务”展示,设备刷新迁移到“设备发现”信息标题;根布局固定顶部对齐并限制侧栏内容在可滚动区域内,避免在“会话 ↔ 设备发现”切换时内容上溢、把 perfowl 顶出窗口。
Session 运行期间,截图区域不再只保留最新一张图,而是按固定 1.0s 节拍向 session-timeline.v1 追加截图卡片。卡片按 elapsed 排序、使用持久化 SessionScreenshot.id 作为稳定标识,并在新事件到达时自动滚动到末尾;失败截图保留质量与原因占位,不以旧图片或 0 代替。
UI 变更
- 侧栏标签改为“设备发现 / 会话 / 设置”,删除“关于”。
- 删除侧栏底部品牌与“基座服务”状态条;设备刷新按钮放入设备信息表头,原有设备选择器刷新仍保留。
- 根
VStack、内容HStack和工作区统一使用顶部对齐与可伸缩高度;设备信息行放入ScrollView,窄侧栏不再依赖固定内容高度撑开窗口。 - 空闲状态继续展示单张设备预览;Session 活跃后切换为横向
ScreenShot时间轴,显示截图缩略图、elapsed、质量、序号和字节数。
截图时间轴契约
| 项 | 当前口径 |
|---|---|
| 目标频率 | 1.0s(PerformanceSessionController.screenshotIntervalSeconds) |
| 调度 | 从上一次目标 deadline 推进;请求耗时不额外累加整秒,超时后跳到下一个可用间隔,避免突发连发 |
| 时间坐标 | session-timeline.v1 的 Host monotonic elapsed;不使用界面刷新时间重算 |
| 排序 | SessionTimeline.playbackPoints 的 elapsed 顺序;原始追加顺序仍保留 |
| 稳定 ID | SessionScreenshot.id;不使用每次重建会变化的 SessionTimelinePoint.id |
| 缺失语义 | failed / cancelled 事件保留原因和时间点,路径为空、无附件、UI 显示占位 |
| 证据边界 | 截图为低频辅助证据,不代表逐帧 Display 真值 |
验证与未关门项
- Swift 全量测试 62/62 通过,包含截图附件、失败清理、共享时间轴和 Session 收尾(E2)。
- SwiftPM App 编译通过;本批尚未形成原生窗口的人工点击录证,因此布局切换和横向回放保持
gate-open,不宣称 E4 UI 通过。 - 当前 USB 设备的命令级 DVT 截图、User App 列表和 Collector 短采集沿用上一批 E4 记录;本批没有把它们重复计入 UI 验收。
后续闭门步骤:在当前连接设备上打开最终 App,录证“会话 ↔ 设备发现”切换、Session 连续多张截图、失败占位、停止后 Review 回放,并单独记录 UI E4;逐帧 Display/Hitches 仍由 P3/P6 承接。