This checklist is the acceptance test for the Hub's hardware-bound identity (AD-12) on a real ESP32-S3. CI builds and tests only the host crates. What happens on the chip is checked here, by hand.
Warning
Part B burns an eFuse key block. This cannot be undone. Any build without
--features dev-mode burns on first boot, debug or release, including a plain cargo run. Use a board meant to be a Coldframe
Hub, and do Part A first.
- Two ESP32-S3 boards: board R for the release build, board D for the dev-mode build. Board
D must never run any build without
--features dev-mode(debug or release), because such a build burns an eFuse on first boot. If one board has to serve for both, run Part C first. - The
espRust toolchain andespflash4.x, as inapps/rs/hub/README.md. - A way to read the eFuse key purposes. The Story 3.2 plan names
espflash board-info, but espflash 4.5.0 prints only chip type, crystal, flash size, features and MAC, not the key purposes. Useespefuse summaryfrom esptool (pipx install esptool) until espflash can show them. In its output, look atKEY_PURPOSE_0toKEY_PURPOSE_5and atRD_DIS.
Run every command from apps/rs/hub after source ~/export-esp.sh. Record the port, the board
and the date for each run.
- Run
espflash board-infoand write down the chip revision and MAC. - Run
espefuse --port <port> summaryand write downKEY_PURPOSE_0toKEY_PURPOSE_5. - Check that no key block has purpose
HMAC_UP. If one does, the board already has an identity: Part B must then reportexisting KEYn. - Check that at least one key block has purpose
USERand is unused. Otherwise the Hub stops withNoFreeKeyBlock, and that board cannot become a Hub.
-
cargo build --releasesucceeds. - Flash and monitor with
cargo run --release. - The first boot logs
identity mode=efuse source=burned KEYn device_id=<16 hex>. Write downnand the Device ID. - No log line contains anything but the Device ID: no root, no key, no HMAC output.
-
espefuse --port <port> summaryshowsKEY_PURPOSE_n = HMAC_UPfor that one block, andRD_DIShas bitnset. Every other key purpose is unchanged from Part A. - Reset the board, for example with
espflash resetand thenespflash monitor. The log showsidentity mode=efuse source=existing KEYn device_id=<same hex>, with the samenand the same Device ID. -
espefuse --port <port> summaryshows no newHMAC_UPpurpose and no other change. - Power-cycle the board by unplugging it. The same
existing KEYnline and Device ID appear. - The board stays up and logs
uptime s=…about once a minute.
- Write down the key purposes with
espefuse --port <port> summary. -
cargo build --features dev-modesucceeds. - Flash with
cargo run --features dev-mode. The first boot logsidentity mode=dev source=generated device_id=<16 hex>. - Reset the board. It logs
identity mode=dev source=storedwith the same Device ID. -
espefuse --port <port> summaryshows no eFuse change at all compared with the first step. - Optional corrupt-record check: write one byte over the record, for example with
printf 'X' > x.bin && espflash write-bin 0xE000 x.bin, then reset. The Hub logsfailed stage=provision error=dev identity record is corrupt; haltedand writes nothing. To recover, runespflash erase-region 0xE000 0x1000. The next boot generates a new identity.
-
cargo build --release --features dev-modefails withthe \dev-mode` feature is refused in release builds`.
| Date | Board | Part | Pass / fail | Device ID | Notes |
|---|---|---|---|---|---|