You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
UI-12: route Bloom Shell power hold through lifecycle shutdown #643
On signed Mini Plus runtime v0.1.0-dev-0b3b5d96, a physical power hold from the Bloom Shell root produced no Saving or Shutting Down surface. Bloom Shell remained visible for about 30 seconds, then the device powered off. This was observed separately from the SSH recovery in PR #642 and is not counted as a UI-12 shutdown pass.
Root cause
system_state_update() correctly classifies the frontend as MODE_BLOOM_SHELL, but keymon::deepsleep() has no branch for that mode. It sets /tmp/.offOrder, leaves Bloom Shell running, waits the 30-second watchdog, and falls through to force_shutdown(). Because runtime.sh is still blocked waiting for Bloom Shell, it never reaches check_off_order "End", so the lifecycle surface is never drawn.
Required correction
terminate Bloom Shell through a bounded graceful path after publishing the shutdown order;
let Bloom Shell finish its normal state/media cleanup;
treat the shutdown-triggered frontend return as expected in the shell guard;
let runtime.sh render the built-in lifecycle surface before the clean power service runs;
preserve the existing game/save shutdown path and clean FAT shutdown behavior;
add focused host tests for Bloom Shell shutdown, guard state, and lifecycle ordering;
validate with a guarded candidate first, then one physical Mini Plus power-hold check;
keep remote/process/framebuffer evidence distinct from the required physical observation.
Safety
This issue does not authorize Wi-Fi/profile/key/listener mutation. The device is currently signed known_good, healthy, and key-only SSH is clean.
Physical Mini Plus retest on signed candidate �0.1.0-dev-e9ce0c30 failed the UI gate.\n\nObserved by the maintainer:\n- poweroff completed much faster than the prior approximately 30-second watchdog path;\n- neither the Saving surface nor the power-off/Shutdown surface was physically visible;\n- the device powered back on successfully.\n\nPost-boot bounded telemetry:\n- installed candidate remained exact and deliberately unconfirmed in esting;\n- boot attempts: 2;\n- aggregate health: healthy;\n- clean-shutdown telemetry recorded successful swap disable and read-only FAT remount;\n- network transaction: idle;\n- listener audit: clean with reviewed key-only SSH;\n- retained rollback source remains the previous signed known-good version.\n\nDisposition: the graceful Bloom Shell exit portion of #644 is effective, but its lifecycle presentation is not. The current runtime launches �ootScreen asynchronously and starts clean power after a fixed one-second delay, so the renderer has no completion boundary or guaranteed physical dwell. I am correcting that ordering in #644 itself; this candidate will not be confirmed.
Second signed Mini Plus physical gate failed on v0.1.0-dev-8aa37619.
Observed by the maintainer:
neither Saving nor Shutdown was visible;
the candidate remained unconfirmed;
the third candidate boot triggered the supported automatic rollback.
Verified recovery:
installed version returned to signed v0.1.0-dev-0b3b5d96;
update state recorded 8aa37619 as the failed version;
aggregate health is green, the network transaction is idle, and key-only SSH is running;
the recovered baseline was explicitly confirmed known_good.
Follow-up commit c1fc6624 targets the shared renderer failure point: Saving and Shutdown no longer enter the legacy battery-header path, and bootScreen now retains framebuffer ownership for 1.5s/2.5s inside the renderer rather than exiting before an external shell sleep. Focused lifecycle checks pass 14/14 and the changed bootScreen source compiles with the pinned Miyoo ARM toolchain. A new signed candidate will remain unconfirmed until the next physical LCD/power gate passes.
Maintainer physically observed both the Saving and Shutdown screens; the device completed poweroff and returned on the same exact candidate.
Installed bootScreen and runtime.sh hashes matched across the two boots.
After the physical cycle, aggregate health was green, five save snapshots were verified, the network transaction was idle with an inactive recovery lease, listener audit was clean with only reviewed key-only SSH, and the development overlay was inactive.
The candidate is now confirmed known_good.
Focused shutdown and critical-surface tests passed 14/14.
Activity
boburning commentedon Aug 31, 2026
Physical Mini Plus retest on signed candidate �0.1.0-dev-e9ce0c30 failed the UI gate.\n\nObserved by the maintainer:\n- poweroff completed much faster than the prior approximately 30-second watchdog path;\n- neither the Saving surface nor the power-off/Shutdown surface was physically visible;\n- the device powered back on successfully.\n\nPost-boot bounded telemetry:\n- installed candidate remained exact and deliberately unconfirmed in esting;\n- boot attempts: 2;\n- aggregate health: healthy;\n- clean-shutdown telemetry recorded successful swap disable and read-only FAT remount;\n- network transaction: idle;\n- listener audit: clean with reviewed key-only SSH;\n- retained rollback source remains the previous signed known-good version.\n\nDisposition: the graceful Bloom Shell exit portion of #644 is effective, but its lifecycle presentation is not. The current runtime launches �ootScreen asynchronously and starts clean power after a fixed one-second delay, so the renderer has no completion boundary or guaranteed physical dwell. I am correcting that ordering in #644 itself; this candidate will not be confirmed.
boburning commentedon Sep 1, 2026
Second signed Mini Plus physical gate failed on
v0.1.0-dev-8aa37619.Observed by the maintainer:
Verified recovery:
v0.1.0-dev-0b3b5d96;8aa37619as the failed version;known_good.Follow-up commit
c1fc6624targets the shared renderer failure point: Saving and Shutdown no longer enter the legacy battery-header path, andbootScreennow retains framebuffer ownership for 1.5s/2.5s inside the renderer rather than exiting before an external shell sleep. Focused lifecycle checks pass 14/14 and the changedbootScreensource compiles with the pinned Miyoo ARM toolchain. A new signed candidate will remain unconfirmed until the next physical LCD/power gate passes.boburning commentedon Sep 1, 2026
Physical Mini Plus gate: PASS
v0.1.0-dev-c1fc6624from commitc1fc66240475a0763d132da84342b8fb3cdeb66cbootScreenandruntime.shhashes matched across the two boots.known_good.Structured evidence:
docs/validation/ui/plus-ui12-shutdown-c1fc6624-20260831.jsonScope remains Mini Plus only; no video capture, non-Plus hardware, audio, gameplay, save-semantics, or soak claim is made.