Skip to content

UI-12: route Bloom Shell power hold through lifecycle shutdown #643

Closed

Description

@boburning

Observed behavior

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.

Activity

  1. boburning commented on Aug 31, 2026

    @boburning
    OwnerAuthor

    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.

  2. boburning commented on Sep 1, 2026

    @boburning
    OwnerAuthor

    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.

  3. boburning commented on Sep 1, 2026

    @boburning
    OwnerAuthor

    Physical Mini Plus gate: PASS

    • Signed candidate: v0.1.0-dev-c1fc6624 from commit c1fc66240475a0763d132da84342b8fb3cdeb66c
    • Hardware workflow: https://github.com/boburning/BloomOS/actions/runs/33455349733
    • 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.

    Structured evidence: docs/validation/ui/plus-ui12-shutdown-c1fc6624-20260831.json

    Scope remains Mini Plus only; no video capture, non-Plus hardware, audio, gameplay, save-semantics, or soak claim is made.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions