Fix repeat ownership and close out capture evidence

Start each repeat after its own manifest entry, refuse packets from a restarted
or stopped camera, keep a simulated repeat from reading as recorded evidence,
and decide completeness from the writer report. Add the operator summary (four
files plus an atomic pointer) and read-only video review of a hold window.

Verified with the full Autocal suite (567 passed), the shared recorder/playback
files (57 passed), the lint gate and the documentation gate; the two pre-existing
panel_check layout failures also fail on a clean HEAD worktree.
This commit is contained in:
ykcheungab
2026-10-17 10:44:30 +08:00
parent d7540f52ec
commit 19426c3c4a
32 changed files with 5461 additions and 191 deletions
+50 -2
View File
@@ -392,7 +392,22 @@
"col_levels": "Levels (N)",
"col_hold": "Hold (s)",
"col_repeats": "Repeats",
"col_done": "Done"
"col_done": "Done",
"capture": "Recording: {status} · {frames} frames · {dropped} dropped · {reason}",
"capture_idle": "Not ready",
"capture_recording": "Recording",
"capture_closing": "Closing",
"capture_complete": "Complete",
"capture_incomplete": "Evidence incomplete",
"capture_reason_restarted": "image source restarted",
"capture_reason_zero_frames": "no frame was written",
"capture_reason_write_error": "disk write failed",
"capture_reason_video_missing": "no video frame was kept",
"capture_reason_video_undecodable": "the video cannot be decoded",
"capture_reason_dropped": "frames were dropped",
"capture_reason_segments": "unexpected number of video segments",
"capture_reason_timeout": "closing timed out",
"capture_wait": "recording is not ready; the hold cannot be confirmed yet"
},
"finger": {
"title": "Finger calibration-point debug",
@@ -589,6 +604,7 @@
"overview": {
"capture_in_progress": "In progress",
"saved": "Analysis saved; hover for its location.",
"saved_summary": "Review saved and summary published: {path} → {summary}",
"open_session": "Open calibration session…",
"empty": "Choose the session folder containing session.json to view collected sites, normal response and sensitivity. You can also open current data from Calibration capture.",
"title": "Calibration record overview",
@@ -654,7 +670,8 @@
"guide_missing": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: this site has no attempt; choose a collected site or acquire it.",
"guide_incomplete": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: inspect the stop reason and recorded signal. Incomplete attempts are excluded from fitting.",
"guide_check": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: select a trial and Check hold windows; adjust the time interval if needed.",
"guide_save": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: inspect remaining holds or save current analysis."
"guide_save": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: inspect remaining holds or save current analysis.",
"video": "View recording"
},
"quality": {
"open": "Repeatability and validation…",
@@ -724,6 +741,7 @@
"uv_title": "Site sensitivity: blue→red {low:.4g}→{high:.4g} raw/N; grey has no fit",
"issues": "{count} incomplete attempts excluded from fitting. Inspect raw signals for stability.",
"saved": "Saved new review: {path}",
"saved_summary": "Review saved and summary published: {path} → {summary}",
"col_trial": "Trial",
"col_branch": "Phase",
"col_load": "Reference (N)",
@@ -733,5 +751,35 @@
"col_duration": "Hold (s)",
"col_quality": "Quality",
"col_drift": "Drift (raw/s)"
},
"video": {
"title": "Video review",
"header": "{trial} · step {step} ({branch} {load} N) · review {status} · {samples} valid samples",
"position": "Frame {index}/{total} · id {frame} · segment {segment} frame {segment_frame} · basis {basis}",
"play": "Play",
"pause": "Pause",
"previous": "Previous",
"next": "Next",
"frame_missing": "This frame was not written to the video (dropped from the queue)",
"reason_missing": "Cannot open the video: {detail}",
"reason_no_frame_source": "This recording has no usable video evidence (no camera, or no frame was written)",
"reason_no_video_frame": "No valid frame of this hold was written to the video",
"reason_trial_not_found": "This trial is not in the record",
"reason_window_not_found": "This hold window is not in the trial",
"reason_video_undecodable": "The video file cannot be decoded",
"reason_decode": "Decoding this frame failed",
"cursor": "Current frame",
"reference": "Actual reference",
"curve_title": "Raw force curve for this hold",
"basis_unknown": "not recorded",
"open": "View recording"
},
"summary": {
"failed": "Summary export failed: {detail}. The recording is unchanged; you can retry.",
"published": "Summary published: {path}",
"retry": "Publish summary again",
"done": "Summary published again: {path}",
"reason_hold_not_found": "This hold attempt is not in the record",
"reason_hold_not_complete": "This hold attempt was discarded by a remeasure"
}
}
+50 -2
View File
@@ -392,7 +392,22 @@
"col_levels": "档位 (N)",
"col_hold": "保持 (s)",
"col_repeats": "重复",
"col_done": "完成"
"col_done": "完成",
"capture": "录像:{status} · 帧 {frames} · 丢帧 {dropped} · {reason}",
"capture_idle": "未就绪",
"capture_recording": "录制中",
"capture_closing": "收尾中",
"capture_complete": "完整",
"capture_incomplete": "证据不完整",
"capture_reason_restarted": "图像来源已重启",
"capture_reason_zero_frames": "没有写入任何帧",
"capture_reason_write_error": "写盘失败",
"capture_reason_video_missing": "没有录像帧",
"capture_reason_video_undecodable": "录像无法解码",
"capture_reason_dropped": "队列丢帧",
"capture_reason_segments": "录像分段数不符",
"capture_reason_timeout": "收尾超时",
"capture_wait": "录像未就绪,暂时不能确认保持"
},
"finger": {
"title": "手指标定点调试",
@@ -589,6 +604,7 @@
"overview": {
"capture_in_progress": "采集中",
"saved": "分析结果已保存;保存位置见提示。",
"saved_summary": "已保存复核并发布汇总:{path} → {summary}",
"open_session": "打开标定会话…",
"empty": "请选择包含 session.json 的会话文件夹,查看已采集测点、法向响应和灵敏度;也可从标定采集页打开本场数据。",
"title": "标定记录总览",
@@ -654,7 +670,8 @@
"guide_missing": "① 核对身份 → ② 选测点/试验 → ③ 检查稳定段 → ④ 保存\n下一步:此点尚未采集,请选择已采点或安排补采。",
"guide_incomplete": "① 核对身份 → ② 选测点/试验 → ③ 检查稳定段 → ④ 保存\n下一步:查看结束原因及已录曲线,决定补采;未完成试验不参与拟合。",
"guide_check": "① 核对身份 → ② 选测点/试验 → ③ 检查稳定段 → ④ 保存\n下一步:选择单次试验,点击“检查保持段…”;必要时调整时间区间。",
"guide_save": "① 核对身份 → ② 选测点/试验 → ③ 检查稳定段 → ④ 保存\n下一步:继续检查剩余保持段,或保存当前分析结果。"
"guide_save": "① 核对身份 → ② 选测点/试验 → ③ 检查稳定段 → ④ 保存\n下一步:继续检查剩余保持段,或保存当前分析结果。",
"video": "查看录像"
},
"quality": {
"open": "重复性与验证…",
@@ -724,6 +741,7 @@
"uv_title": "测点初步灵敏度:蓝→红 {low:.4g}→{high:.4g} raw/N;灰色无拟合",
"issues": "{count} 次未完成试验不参与拟合;请按原始曲线检查稳定性。",
"saved": "已另存:{path}",
"saved_summary": "已保存复核并发布汇总:{path} → {summary}",
"col_trial": "试验",
"col_branch": "阶段",
"col_load": "参考力 (N)",
@@ -733,5 +751,35 @@
"col_duration": "保持 (s)",
"col_quality": "质量说明",
"col_drift": "漂移 (raw/s)"
},
"video": {
"title": "录像复核",
"header": "{trial} · 第 {step} 步({branch} {load} N)· 复核状态 {status} · 有效样本 {samples}",
"position": "第 {index}/{total} 帧 · 帧号 {frame} · 分段 {segment} 第 {segment_frame} 帧 · 时间基准 {basis}",
"play": "播放",
"pause": "暂停",
"previous": "上一帧",
"next": "下一帧",
"frame_missing": "该帧没有写入录像(队列丢帧)",
"reason_missing": "无法打开录像:{detail}",
"reason_no_frame_source": "这段录像没有可用的视频证据(未接相机或没有写入帧)",
"reason_no_video_frame": "该保持窗口内没有已写入视频的有效帧",
"reason_trial_not_found": "记录中找不到这次试验",
"reason_window_not_found": "在该试验中找不到这个保持窗口",
"reason_video_undecodable": "录像文件无法解码",
"reason_decode": "解码这一帧失败",
"cursor": "当前帧",
"reference": "实际参考",
"curve_title": "原始力曲线与该保持窗口",
"basis_unknown": "未记录",
"open": "查看录像"
},
"summary": {
"failed": "汇总导出失败:{detail}。采集结果没有改变,可以重试。",
"published": "汇总已发布:{path}",
"retry": "重新导出汇总",
"done": "汇总已重新发布:{path}",
"reason_hold_not_found": "记录中找不到这个保持尝试",
"reason_hold_not_complete": "这个保持尝试已被重测废弃,没有可复核的画面"
}
}