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"
}
}