The 7b offloader Settings UI shipped (#574) with every toggle except Allow major-version mismatch. The compile-side enforcement gate hasn't landed either: pick_build_path doesn't consume StoredPairing.esphome_version today, so a remote receiver running a different major ESPHome version than the offloader is silently treated as eligible.
What's already in place
What's missing
- A version-compat gate in
pick_build_path that filters peers whose esphome_version differs from the offloader's esphome.const.__version__ at the major level.
- A user-facing "Allow major-version mismatch" toggle on the offloader Settings UI (per-pairing or master — TBD) that widens the gate.
- The compile-time check that catches the mismatch before the receiver wastes CPU on an incompatible YAML.
Why deferred
Silently filtering eligible peers without an operator-visible override would be the wrong default — a user wouldn't know why their freshly-paired receiver suddenly stopped getting jobs. The gate and the toggle land together.
Acceptance
pick_build_path exposes a version-compat gate (default-on) that drops mismatched peers from the eligible set.
--no-X / explicit-on toggle on OffloaderRemoteBuildSettings + per-pairing override widens the gate.
- Settings UI surfaces both (master + per-row).
- Tests pin the matrix: matched-major eligible, mismatched-major filtered by default, override re-enables.
The 7b offloader Settings UI shipped (#574) with every toggle except Allow major-version mismatch. The compile-side enforcement gate hasn't landed either:
pick_build_pathdoesn't consumeStoredPairing.esphome_versiontoday, so a remote receiver running a different major ESPHome version than the offloader is silently treated as eligible.What's already in place
esphome.const.__version__through the peer-link handshake'sintent_responsepayload on every session-open (Advertise receiver esphome_version through the peer-link handshake (7a-2 prerequisite) #557).StoredPairing.esphome_version(validator-capped atPAIRING_VERSION_MAX_LEN=64).PairingSummaryso the Settings UI can show it.What's missing
pick_build_paththat filters peers whoseesphome_versiondiffers from the offloader'sesphome.const.__version__at the major level.Why deferred
Silently filtering eligible peers without an operator-visible override would be the wrong default — a user wouldn't know why their freshly-paired receiver suddenly stopped getting jobs. The gate and the toggle land together.
Acceptance
pick_build_pathexposes a version-compat gate (default-on) that drops mismatched peers from the eligible set.--no-X/ explicit-on toggle onOffloaderRemoteBuildSettings+ per-pairing override widens the gate.