test(sync): require stronger calibration evidence

This commit is contained in:
Brad Stein 2026-05-04 15:52:51 -03:00
parent 8bb157891f
commit bbc70f088f
7 changed files with 17 additions and 17 deletions

6
Cargo.lock generated
View File

@ -1652,7 +1652,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
[[package]] [[package]]
name = "lesavka_client" name = "lesavka_client"
version = "0.19.19" version = "0.19.20"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-stream", "async-stream",
@ -1686,7 +1686,7 @@ dependencies = [
[[package]] [[package]]
name = "lesavka_common" name = "lesavka_common"
version = "0.19.19" version = "0.19.20"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"base64", "base64",
@ -1698,7 +1698,7 @@ dependencies = [
[[package]] [[package]]
name = "lesavka_server" name = "lesavka_server"
version = "0.19.19" version = "0.19.20"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"base64", "base64",

View File

@ -4,7 +4,7 @@ path = "src/main.rs"
[package] [package]
name = "lesavka_client" name = "lesavka_client"
version = "0.19.19" version = "0.19.20"
edition = "2024" edition = "2024"
[dependencies] [dependencies]

View File

@ -5,7 +5,7 @@ const DEFAULT_MAX_PAIR_GAP_S: f64 = 0.5;
const DEFAULT_PULSE_PERIOD_S: f64 = 1.0; const DEFAULT_PULSE_PERIOD_S: f64 = 1.0;
const DEFAULT_PULSE_WIDTH_S: f64 = 0.12; const DEFAULT_PULSE_WIDTH_S: f64 = 0.12;
const DEFAULT_MARKER_TICK_PERIOD: u32 = 5; const DEFAULT_MARKER_TICK_PERIOD: u32 = 5;
const CALIBRATION_MIN_PAIRED_EVENTS: usize = 8; const CALIBRATION_MIN_PAIRED_EVENTS: usize = 13;
const CALIBRATION_MAX_DRIFT_MS: f64 = 40.0; const CALIBRATION_MAX_DRIFT_MS: f64 = 40.0;
const CALIBRATION_MAX_START_MEDIAN_DISAGREEMENT_MS: f64 = 250.0; const CALIBRATION_MAX_START_MEDIAN_DISAGREEMENT_MS: f64 = 250.0;
const CALIBRATION_SETTLED_SKEW_MS: f64 = 5.0; const CALIBRATION_SETTLED_SKEW_MS: f64 = 5.0;
@ -370,7 +370,7 @@ mod tests {
assert!( assert!(
recommendation recommendation
.note .note
.contains("need at least 8 paired pulses") .contains("need at least 13 paired pulses")
); );
} }
@ -379,7 +379,7 @@ mod tests {
let report = SyncAnalysisReport { let report = SyncAnalysisReport {
video_event_count: 12, video_event_count: 12,
audio_event_count: 12, audio_event_count: 12,
paired_event_count: 12, paired_event_count: 14,
coded_events: false, coded_events: false,
activity_start_delta_ms: 0.0, activity_start_delta_ms: 0.0,
raw_first_video_activity_s: 0.0, raw_first_video_activity_s: 0.0,
@ -407,7 +407,7 @@ mod tests {
let report = SyncAnalysisReport { let report = SyncAnalysisReport {
video_event_count: 14, video_event_count: 14,
audio_event_count: 14, audio_event_count: 14,
paired_event_count: 12, paired_event_count: 14,
coded_events: false, coded_events: false,
activity_start_delta_ms: 0.0, activity_start_delta_ms: 0.0,
raw_first_video_activity_s: 0.0, raw_first_video_activity_s: 0.0,
@ -492,7 +492,7 @@ mod tests {
let report = SyncAnalysisReport { let report = SyncAnalysisReport {
video_event_count: 14, video_event_count: 14,
audio_event_count: 14, audio_event_count: 14,
paired_event_count: 10, paired_event_count: 13,
coded_events: true, coded_events: true,
activity_start_delta_ms: -3_620.7, activity_start_delta_ms: -3_620.7,
raw_first_video_activity_s: 9.361, raw_first_video_activity_s: 9.361,
@ -520,7 +520,7 @@ mod tests {
let report = SyncAnalysisReport { let report = SyncAnalysisReport {
video_event_count: 14, video_event_count: 14,
audio_event_count: 14, audio_event_count: 14,
paired_event_count: 12, paired_event_count: 14,
coded_events: false, coded_events: false,
activity_start_delta_ms: 0.0, activity_start_delta_ms: 0.0,
raw_first_video_activity_s: 0.0, raw_first_video_activity_s: 0.0,

View File

@ -1,6 +1,6 @@
[package] [package]
name = "lesavka_common" name = "lesavka_common"
version = "0.19.19" version = "0.19.20"
edition = "2024" edition = "2024"
build = "build.rs" build = "build.rs"

View File

@ -60,7 +60,7 @@ LESAVKA_SERVER_RC_PROBE_PREBUILD=${LESAVKA_SERVER_RC_PROBE_PREBUILD:-1}
LESAVKA_SERVER_RC_CONTINUE_ON_FAIL=${LESAVKA_SERVER_RC_CONTINUE_ON_FAIL:-1} LESAVKA_SERVER_RC_CONTINUE_ON_FAIL=${LESAVKA_SERVER_RC_CONTINUE_ON_FAIL:-1}
LESAVKA_SERVER_RC_TUNE_DELAYS=${LESAVKA_SERVER_RC_TUNE_DELAYS:-1} LESAVKA_SERVER_RC_TUNE_DELAYS=${LESAVKA_SERVER_RC_TUNE_DELAYS:-1}
LESAVKA_SERVER_RC_TUNE_CONFIRM=${LESAVKA_SERVER_RC_TUNE_CONFIRM:-1} LESAVKA_SERVER_RC_TUNE_CONFIRM=${LESAVKA_SERVER_RC_TUNE_CONFIRM:-1}
LESAVKA_SERVER_RC_TUNE_MIN_PAIRS=${LESAVKA_SERVER_RC_TUNE_MIN_PAIRS:-8} LESAVKA_SERVER_RC_TUNE_MIN_PAIRS=${LESAVKA_SERVER_RC_TUNE_MIN_PAIRS:-13}
LESAVKA_SERVER_RC_TUNE_MAX_ABS_SKEW_MS=${LESAVKA_SERVER_RC_TUNE_MAX_ABS_SKEW_MS:-1000} LESAVKA_SERVER_RC_TUNE_MAX_ABS_SKEW_MS=${LESAVKA_SERVER_RC_TUNE_MAX_ABS_SKEW_MS:-1000}
LESAVKA_SERVER_RC_TUNE_MAX_DRIFT_MS=${LESAVKA_SERVER_RC_TUNE_MAX_DRIFT_MS:-80} LESAVKA_SERVER_RC_TUNE_MAX_DRIFT_MS=${LESAVKA_SERVER_RC_TUNE_MAX_DRIFT_MS:-80}
LESAVKA_SERVER_RC_TUNE_MAX_STEP_US=${LESAVKA_SERVER_RC_TUNE_MAX_STEP_US:-500000} LESAVKA_SERVER_RC_TUNE_MAX_STEP_US=${LESAVKA_SERVER_RC_TUNE_MAX_STEP_US:-500000}
@ -253,7 +253,7 @@ def as_float(value, default=0.0):
result = json.loads(pathlib.Path(result_path).read_text()) result = json.loads(pathlib.Path(result_path).read_text())
calibration = result.get("output_delay_calibration") or {} calibration = result.get("output_delay_calibration") or {}
sync = result.get("sync") or {} sync = result.get("sync") or {}
min_pairs = max(1, as_int(min_pairs_raw, 8)) min_pairs = max(1, as_int(min_pairs_raw, 13))
max_abs_skew_ms = max(1.0, as_float(max_abs_skew_raw, 1000.0)) max_abs_skew_ms = max(1.0, as_float(max_abs_skew_raw, 1000.0))
max_drift_ms = max(0.0, as_float(max_drift_raw, 80.0)) max_drift_ms = max(0.0, as_float(max_drift_raw, 80.0))
max_step_us = max(1, as_int(max_step_raw, 500_000)) max_step_us = max(1, as_int(max_step_raw, 500_000))
@ -1109,7 +1109,7 @@ for result in results:
continue continue
sync = result.get("sync") or {} sync = result.get("sync") or {}
calibration = result.get("output_delay_calibration") or {} calibration = result.get("output_delay_calibration") or {}
required_pairs = calibration.get("min_pairs") or 8 required_pairs = calibration.get("min_pairs") or 13
confirmed = ( confirmed = (
sync.get("passed") is True sync.get("passed") is True
and (sync.get("paired_event_count") or 0) >= required_pairs and (sync.get("paired_event_count") or 0) >= required_pairs

View File

@ -68,7 +68,7 @@ LESAVKA_OUTPUT_DELAY_CONFIRM=${LESAVKA_OUTPUT_DELAY_CONFIRM:-1}
LESAVKA_OUTPUT_DELAY_SAVE=${LESAVKA_OUTPUT_DELAY_SAVE:-0} LESAVKA_OUTPUT_DELAY_SAVE=${LESAVKA_OUTPUT_DELAY_SAVE:-0}
LESAVKA_OUTPUT_REQUIRE_SYNC_PASS=${LESAVKA_OUTPUT_REQUIRE_SYNC_PASS:-0} LESAVKA_OUTPUT_REQUIRE_SYNC_PASS=${LESAVKA_OUTPUT_REQUIRE_SYNC_PASS:-0}
LESAVKA_OUTPUT_DELAY_TARGET=${LESAVKA_OUTPUT_DELAY_TARGET:-video} LESAVKA_OUTPUT_DELAY_TARGET=${LESAVKA_OUTPUT_DELAY_TARGET:-video}
LESAVKA_OUTPUT_DELAY_MIN_PAIRS=${LESAVKA_OUTPUT_DELAY_MIN_PAIRS:-8} LESAVKA_OUTPUT_DELAY_MIN_PAIRS=${LESAVKA_OUTPUT_DELAY_MIN_PAIRS:-13}
LESAVKA_OUTPUT_DELAY_MAX_ABS_SKEW_MS=${LESAVKA_OUTPUT_DELAY_MAX_ABS_SKEW_MS:-5000} LESAVKA_OUTPUT_DELAY_MAX_ABS_SKEW_MS=${LESAVKA_OUTPUT_DELAY_MAX_ABS_SKEW_MS:-5000}
LESAVKA_OUTPUT_DELAY_MAX_DRIFT_MS=${LESAVKA_OUTPUT_DELAY_MAX_DRIFT_MS:-80} LESAVKA_OUTPUT_DELAY_MAX_DRIFT_MS=${LESAVKA_OUTPUT_DELAY_MAX_DRIFT_MS:-80}
LESAVKA_OUTPUT_DELAY_GAIN=${LESAVKA_OUTPUT_DELAY_GAIN:-1.0} LESAVKA_OUTPUT_DELAY_GAIN=${LESAVKA_OUTPUT_DELAY_GAIN:-1.0}
@ -731,7 +731,7 @@ verdict = report.get("verdict") or {}
target = target.strip().lower() target = target.strip().lower()
apply_mode = apply_mode_raw.strip().lower() apply_mode = apply_mode_raw.strip().lower()
min_pairs = max(1, as_int(min_pairs_raw, 8)) min_pairs = max(1, as_int(min_pairs_raw, 13))
max_abs_skew_ms = max(1.0, as_float(max_abs_skew_raw, 5000.0)) max_abs_skew_ms = max(1.0, as_float(max_abs_skew_raw, 5000.0))
max_drift_ms = max(0.0, as_float(max_drift_raw, 80.0)) max_drift_ms = max(0.0, as_float(max_drift_raw, 80.0))
gain = min(max(as_float(gain_raw, 1.0), 0.01), 1.0) gain = min(max(as_float(gain_raw, 1.0), 0.01), 1.0)

View File

@ -10,7 +10,7 @@ bench = false
[package] [package]
name = "lesavka_server" name = "lesavka_server"
version = "0.19.19" version = "0.19.20"
edition = "2024" edition = "2024"
autobins = false autobins = false