POWER-FINAL-11 — 10 plus the remaining screens (validation receipt)
Status: offline-qualified; physical NOT_RUN. Identity: Linux 5741d161699582d5a2696c658c7ede05c712a6ae, Reborn 0.3.0 abbb2038dc392c520d76ce6e5a2747a68578252b. BOOTIMG 1482316d69e470c7625ea5805dbb4e17172ebebad2ecfb9f205c43b155f2ee08, Y2ROOT 4773d90d11213c5f676dd9f9027a809bf04a635164947bb3e6670f738515d73c. Fallback = sealed 10.
Change
Reborn: computer connection/copying screens, Bluetooth pairing progress and failure dialog, update-download and scanning spinners, battery-low dialog, SD removed and songs-added toasts, crossfade icon, charging-screen art (docs: Y2Reborn docs/ui/REBORN-PRODUCT-UI-V3.md). Linux: tools/production/offline-charge.c redraws its display from tools/graphics/offline-charge-art.h (generated by make-charge-art.py from Reborn's layout) plus a procedural sweeping ring; decision logic, gates and writes unchanged. Identity bump. Scope audit: POWER-FINAL-11 entry in docs/planning/roadmap-gap-audit.md.
Tests
Locked-container production suite PASS, 632 cases (two new charger-frame tests render real frames into a memory framebuffer: sweep, full and paused ring, text, bounds); 29 packaging-host and 27 splash PASS; package, ELF closure, installed-ARM, inventory and privacy PASS. Reborn: fmt, strict Clippy, 362 workspace tests PASS (new: computer screen, low-battery dialog, Bluetooth progress/failure, spinners, crossfade icon, charging copy); all 73 preview frames render identically through the production GL code on a host GLES2 and the Python rasteriser.
Not verified
On the device: the charger's new framebuffer drawing (16/32-bit panel formats are handled by the existing rectangle()), the GL path for the new spinner arcs, how the USB state behaves with a real computer, the pairing/failure flow with real headphones. Charging screen: no percentage or time to full by design.
Verdict
IMPLEMENTATION_READY_PHYSICAL_NOT_RUN