Skip to content

Compatibility

Compatibility is the eligibility gate. Even if a device is in a deployment's audience and lands inside the cohort percentage, it will only be offered an artifact whose manifest matches its hardware profile.

Enforced dimensions

The decision engine currently enforces these dimensions on every check:

Dimension How matched
framework Exact: arduinoesp_idf.
chip_family Exact: esp32esp32s3esp32c3.
board_id Blank artifact constraint matches anything; otherwise exact.
hardware_revision Artifact's hardware_revision_min/max range (inclusive). Blank bounds mean no constraint.

Progressive dimensions

These are enforced too, but with a softer rule. On the identity dimensions above, an artifact constraint plus a device that has never reported the dimension is a rejection. Here, a device that has not reported yet is let through.

That difference exists to avoid a bootstrapping deadlock: if a device had to report partition_profile before it could be offered an update, a fleet running firmware that predates the reporting code could never receive the build that would teach it to report.

Dimension How matched
partition_profile Blank on either side matches; otherwise exact.
security_mode Blank on either side matches; otherwise exact.
nvs_schema_version The device's version must be greater than or equal to the artifact's. Unset on either side means no constraint.

nvs_schema_version is the one comparison that is not equality: an artifact declaring schema 3 is offered to devices reporting 3 or higher, never to a device still on 2, because older firmware may have written an incompatible NVS layout.

Worked rejection example

A device reports chip_family = esp32s3, board_id = freenove-cam. An artifact's manifest declares chip_family = esp32s3, board_id = esp32s3-devkitc-1.

Not compatible. board_id mismatch. Even at 100% rollout, this device sees {"update_available": false} for that artifact.