release: bump lesavka to 0.17.1
This commit is contained in:
parent
cdaf79bc49
commit
03ad78829b
@ -194,6 +194,7 @@ Context: 0.16.x proved that queue tweaks and static calibration cannot guarantee
|
|||||||
- [x] Calibration may fine-tune sub-frame offsets only; it must not be required to rescue seconds-scale desync.
|
- [x] Calibration may fine-tune sub-frame offsets only; it must not be required to rescue seconds-scale desync.
|
||||||
|
|
||||||
- [x] Bump Lesavka to 0.17.0 because this is a media-contract change, not a patch tune.
|
- [x] Bump Lesavka to 0.17.0 because this is a media-contract change, not a patch tune.
|
||||||
|
- [x] Bump patch follow-ups to 0.17.1 instead of reporting `version+revision` as the release version.
|
||||||
- [x] Add planner policy config: max live lag, max skew, startup timeout, target playout delay, and healing cooldown.
|
- [x] Add planner policy config: max live lag, max skew, startup timeout, target playout delay, and healing cooldown.
|
||||||
- [x] Reset 0.17 defaults so shipped audio/video offsets do not intentionally exceed the freshness budget.
|
- [x] Reset 0.17 defaults so shipped audio/video offsets do not intentionally exceed the freshness budget.
|
||||||
- [x] Track latest camera/audio input timestamps in the server planner.
|
- [x] Track latest camera/audio input timestamps in the server planner.
|
||||||
@ -222,3 +223,4 @@ Context: 0.16.x proved that queue tweaks and static calibration cannot guarantee
|
|||||||
- 2026-05-01: Validation green: `cargo test -p lesavka_server --lib --bins`, `cargo test -p lesavka_testing`, `cargo test -p lesavka_client --bins --lib`, and targeted installer/RPC/layout contracts.
|
- 2026-05-01: Validation green: `cargo test -p lesavka_server --lib --bins`, `cargo test -p lesavka_testing`, `cargo test -p lesavka_client --bins --lib`, and targeted installer/RPC/layout contracts.
|
||||||
- 2026-05-01: First installed 0.17.0 mirrored browser probe on client/server commit `3920e0a` failed honestly: planner reported fresh live state (`live_lag_ms=10`, `skew_ms=+20.7`) but browser-observed paired pulses showed audio late by median `+349.1ms`, p95 `429.1ms`, with 6 video freezes/skew drops. Replayed artifact after analyzer hardening now reports `gross_failure` instead of false raw-start `catastrophic_failure`.
|
- 2026-05-01: First installed 0.17.0 mirrored browser probe on client/server commit `3920e0a` failed honestly: planner reported fresh live state (`live_lag_ms=10`, `skew_ms=+20.7`) but browser-observed paired pulses showed audio late by median `+349.1ms`, p95 `429.1ms`, with 6 video freezes/skew drops. Replayed artifact after analyzer hardening now reports `gross_failure` instead of false raw-start `catastrophic_failure`.
|
||||||
- 2026-05-01: Patch follow-up models the observed MJPEG/UVC browser egress delta by defaulting video playout offset to `+350ms` and preserving the 1s freshness ceiling. Raw activity-start evidence is now ignored for verdict/calibration when it disagrees with paired pulses that are already failing directly. Existing early-0.17 `audio=0/video=0` factory/env calibration files migrate to the new `video=+350ms` default on load.
|
- 2026-05-01: Patch follow-up models the observed MJPEG/UVC browser egress delta by defaulting video playout offset to `+350ms` and preserving the 1s freshness ceiling. Raw activity-start evidence is now ignored for verdict/calibration when it disagrees with paired pulses that are already failing directly. Existing early-0.17 `audio=0/video=0` factory/env calibration files migrate to the new `video=+350ms` default on load.
|
||||||
|
- 2026-05-01: Release identity cleanup: bumped the patched build to clean semver `0.17.1`; probe attribution now prints `client_version`/`server_version` separately from `client_revision`/`server_revision` and refuses old `client_full_version` output.
|
||||||
|
|||||||
6
Cargo.lock
generated
6
Cargo.lock
generated
@ -1652,7 +1652,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.17.0"
|
version = "0.17.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -1686,7 +1686,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.17.0"
|
version = "0.17.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
@ -1698,7 +1698,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.17.0"
|
version = "0.17.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
|
|||||||
@ -4,7 +4,7 @@ path = "src/main.rs"
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.17.0"
|
version = "0.17.1"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@ -181,10 +181,16 @@ fn print_versions(server_addr: &str, caps: &HandshakeSet) {
|
|||||||
} else {
|
} else {
|
||||||
caps.server_version.as_str()
|
caps.server_version.as_str()
|
||||||
};
|
};
|
||||||
|
let server_revision = if caps.server_revision.is_empty() {
|
||||||
|
"unknown"
|
||||||
|
} else {
|
||||||
|
caps.server_revision.as_str()
|
||||||
|
};
|
||||||
println!("client_version={}", lesavka_client::VERSION);
|
println!("client_version={}", lesavka_client::VERSION);
|
||||||
println!("client_full_version={}", lesavka_client::FULL_VERSION);
|
println!("client_revision={}", lesavka_client::REVISION);
|
||||||
println!("server_addr={server_addr}");
|
println!("server_addr={server_addr}");
|
||||||
println!("server_version={server_version}");
|
println!("server_version={server_version}");
|
||||||
|
println!("server_revision={server_revision}");
|
||||||
println!("server_camera_output={}", caps.camera_output);
|
println!("server_camera_output={}", caps.camera_output);
|
||||||
println!("server_camera_codec={}", caps.camera_codec);
|
println!("server_camera_codec={}", caps.camera_codec);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
#![forbid(unsafe_code)]
|
#![forbid(unsafe_code)]
|
||||||
|
|
||||||
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||||
pub const BUILD_ID: &str = env!("LESAVKA_GIT_SHA");
|
pub const REVISION: &str = env!("LESAVKA_GIT_SHA");
|
||||||
pub const FULL_VERSION: &str = concat!(env!("CARGO_PKG_VERSION"), "+", env!("LESAVKA_GIT_SHA"));
|
pub const BUILD_ID: &str = REVISION;
|
||||||
|
|
||||||
pub mod app;
|
pub mod app;
|
||||||
mod app_support;
|
mod app_support;
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.17.0"
|
version = "0.17.1"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
|
|||||||
@ -119,6 +119,7 @@ message HandshakeSet {
|
|||||||
uint32 eye_height = 9;
|
uint32 eye_height = 9;
|
||||||
uint32 eye_fps = 10;
|
uint32 eye_fps = 10;
|
||||||
string server_version = 11;
|
string server_version = 11;
|
||||||
|
string server_revision = 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
message Empty {}
|
message Empty {}
|
||||||
|
|||||||
@ -211,11 +211,26 @@ print_lesavka_versions() {
|
|||||||
echo "${version_output}" >&2
|
echo "${version_output}" >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
if grep -q "^client_full_version=" <<<"${version_output}"; then
|
||||||
|
echo "Lesavka version query reported a combined version+revision; refusing ambiguous probe attribution" >&2
|
||||||
|
echo "${version_output}" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if ! grep -q "^client_revision=" <<<"${version_output}"; then
|
||||||
|
echo "Lesavka version query did not report client_revision=; refusing to run an unattributed probe" >&2
|
||||||
|
echo "${version_output}" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
if ! grep -q "^server_version=" <<<"${version_output}"; then
|
if ! grep -q "^server_version=" <<<"${version_output}"; then
|
||||||
echo "Lesavka version query did not report server_version=; refusing to run an unattributed probe" >&2
|
echo "Lesavka version query did not report server_version=; refusing to run an unattributed probe" >&2
|
||||||
echo "${version_output}" >&2
|
echo "${version_output}" >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
if ! grep -q "^server_revision=" <<<"${version_output}"; then
|
||||||
|
echo "Lesavka version query did not report server_revision=; refusing to run an unattributed probe" >&2
|
||||||
|
echo "${version_output}" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
[[ -n "${line}" ]] && echo " ↪ ${line}"
|
[[ -n "${line}" ]] && echo " ↪ ${line}"
|
||||||
done <<<"${version_output}"
|
done <<<"${version_output}"
|
||||||
|
|||||||
@ -175,11 +175,26 @@ print_lesavka_versions() {
|
|||||||
echo "${version_output}" >&2
|
echo "${version_output}" >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
if grep -q "^client_full_version=" <<<"${version_output}"; then
|
||||||
|
echo "Lesavka version query reported a combined version+revision; refusing ambiguous probe attribution" >&2
|
||||||
|
echo "${version_output}" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if ! grep -q "^client_revision=" <<<"${version_output}"; then
|
||||||
|
echo "Lesavka version query did not report client_revision=; refusing to run an unattributed probe" >&2
|
||||||
|
echo "${version_output}" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
if ! grep -q "^server_version=" <<<"${version_output}"; then
|
if ! grep -q "^server_version=" <<<"${version_output}"; then
|
||||||
echo "Lesavka version query did not report server_version=; refusing to run an unattributed probe" >&2
|
echo "Lesavka version query did not report server_version=; refusing to run an unattributed probe" >&2
|
||||||
echo "${version_output}" >&2
|
echo "${version_output}" >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
if ! grep -q "^server_revision=" <<<"${version_output}"; then
|
||||||
|
echo "Lesavka version query did not report server_revision=; refusing to run an unattributed probe" >&2
|
||||||
|
echo "${version_output}" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
[[ -n "${line}" ]] && echo " ↪ ${line}"
|
[[ -n "${line}" ]] && echo " ↪ ${line}"
|
||||||
done <<<"${version_output}"
|
done <<<"${version_output}"
|
||||||
|
|||||||
@ -10,7 +10,7 @@ bench = false
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.17.0"
|
version = "0.17.1"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
autobins = false
|
autobins = false
|
||||||
|
|
||||||
|
|||||||
@ -34,6 +34,7 @@ impl Handshake for HandshakeSvc {
|
|||||||
eye_height,
|
eye_height,
|
||||||
eye_fps,
|
eye_fps,
|
||||||
server_version: crate::VERSION.to_string(),
|
server_version: crate::VERSION.to_string(),
|
||||||
|
server_revision: crate::REVISION.to_string(),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
// server/src/lib.rs
|
// server/src/lib.rs
|
||||||
|
|
||||||
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||||
pub const BUILD_ID: &str = env!("LESAVKA_GIT_SHA");
|
pub const REVISION: &str = env!("LESAVKA_GIT_SHA");
|
||||||
pub const FULL_VERSION: &str = concat!(env!("CARGO_PKG_VERSION"), "+", env!("LESAVKA_GIT_SHA"));
|
pub const BUILD_ID: &str = REVISION;
|
||||||
|
|
||||||
pub mod audio;
|
pub mod audio;
|
||||||
pub mod calibration;
|
pub mod calibration;
|
||||||
|
|||||||
@ -50,7 +50,10 @@ fn upstream_sync_script_tunnels_auto_server_addr_through_ssh() {
|
|||||||
"==> Lesavka versions under test",
|
"==> Lesavka versions under test",
|
||||||
"lesavka-relayctl",
|
"lesavka-relayctl",
|
||||||
"--bin lesavka-relayctl",
|
"--bin lesavka-relayctl",
|
||||||
|
"client_revision=",
|
||||||
"server_version=",
|
"server_version=",
|
||||||
|
"server_revision=",
|
||||||
|
"combined version+revision",
|
||||||
] {
|
] {
|
||||||
assert!(
|
assert!(
|
||||||
SYNC_SCRIPT.contains(expected),
|
SYNC_SCRIPT.contains(expected),
|
||||||
@ -99,7 +102,10 @@ fn mirrored_sync_script_uses_real_client_capture_path() {
|
|||||||
"==> Lesavka versions under test",
|
"==> Lesavka versions under test",
|
||||||
"lesavka-relayctl",
|
"lesavka-relayctl",
|
||||||
"--bin lesavka-relayctl",
|
"--bin lesavka-relayctl",
|
||||||
|
"client_revision=",
|
||||||
"server_version=",
|
"server_version=",
|
||||||
|
"server_revision=",
|
||||||
|
"combined version+revision",
|
||||||
] {
|
] {
|
||||||
assert!(
|
assert!(
|
||||||
MIRRORED_SYNC_SCRIPT.contains(expected),
|
MIRRORED_SYNC_SCRIPT.contains(expected),
|
||||||
|
|||||||
@ -60,4 +60,17 @@ mod relayctl_binary {
|
|||||||
detail: "ok".to_string(),
|
detail: "ok".to_string(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn version_output_keeps_release_version_and_revision_separate() {
|
||||||
|
let source = include_str!(env!("LESAVKA_CLIENT_RELAYCTL_BIN_SRC"));
|
||||||
|
assert!(source.contains("client_version="));
|
||||||
|
assert!(source.contains("client_revision="));
|
||||||
|
assert!(source.contains("server_version="));
|
||||||
|
assert!(source.contains("server_revision="));
|
||||||
|
assert!(
|
||||||
|
!source.contains("client_full_version="),
|
||||||
|
"release version output must not append the git revision to semver"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -141,6 +141,7 @@ impl Handshake for SparseHandshakeSvc {
|
|||||||
eye_width: 0,
|
eye_width: 0,
|
||||||
eye_height: 0,
|
eye_height: 0,
|
||||||
eye_fps: 0,
|
eye_fps: 0,
|
||||||
|
server_revision: String::new(),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user