Repository navigation
Post-update boot verification blocks update completion and the reboot - #543
Merged
Merged
Conversation
U-Boot starts the loader on the ESP the device tree names. The boot check read Limine's files from ESP_PATH only, so a Mac whose ESP_PATH named another ESP passed with a loader U-Boot never boots.
The lifecycle dispatch entrypoint runs the boot check on the whole boot chain after an update, with the new kernel's reboot still to come, and on failure says not to reboot and how to rebuild the boot files.
omarchy update runs update-preflight before its package changes and update-verify after them through the lifecycle dispatcher. A failed verification leaves the update unfinished, exiting non-zero without offering the reboot. Both are no-ops on platforms without a boot package, x86 included.
The full boot check also fails a Mac that boots fine: package file drift, a second installed kernel, an extra LUKS keyslot or provisioning leftovers, and an m1n1 image its owner took over. --boot-chain leaves those to the full check, and update-verify uses it.
The dispatcher said the package was not installed when an older copy was. It now names the installed version and asks for its update, and exits 3 only when the package is missing altogether.
Such a Mac predates the package and boots a chain it does not manage, so verification cannot vouch for it and blocking would fail every update until its migration installs the package. An omarchy-mac-boot too old to ship update-verify still blocks.
With two kernels installed, --boot-chain picked the one whose m1n1 was installed, which is not what boots: it now checks the menu's first kernel. It also holds the kernel image, device trees and m1n1 against their package mtree again, leaving out only the rest of the package's files.
A warning on stderr from a successful resolution counted as an entrypoint, so an x86 update could still call sudo.
…/35-update-verify
A fresh image's database warnings made any failing pacman -Qkk pass once its own diagnostics were filtered out. Only drift in files the boot files are not built from is left out now.
maralcbr
changed the base branch from
mac/09-mac-boot-source
to
quattro-upstream
September 25, 2026 14:37
Owner provisioning and its journal test take quattro-upstream's version, which already carries #540 and ticket 32. The dispatch contract keeps both sides; boot-rebuild stays optional until ticket 36, since the update path does not call it.
This was referenced Sep 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ticket 35 of the Apple Silicon convergence plan: post-update boot verification blocks completion.
Based on
quattro-upstreamat4e56f1dd2, which carries #527, #540, #541 and #545. The last merge takes quattro-upstream's owner provisioning and journal test unchanged, and keeps both sides ofdocs/lifecycle-dispatch.md.boot-rebuildstays optional until ticket 36, because the update path does not call it.What changed
omarchy updatecalls two lifecycle dispatch operations through a new hidden helper,omarchy-update-boot.update-preflightruns before the keyring and system packages change. A refusal stops the update. Apple ships no preflight, so there it is a no-op.update-verifyruns after the last package step: packages, migrations, the post-update hook, AUR, mise and orphans.omarchy-update-restart, so no reboot is offered.sudoonly when there is an entrypoint to run. On x86, generic aarch64 and Qualcomm both steps are no-ops: the same steps run, nothing extra is printed and nothing asks for root.omarchy-mac-bootshipsentrypoints/update-verify, installed as/usr/lib/omarchy/mac-boot/update-verify. It runsomarchy-apple-silicon-boot-check --boot-chainread-only, with the new kernel's reboot allowed to be pending./boot, the unlock settings (crypttab,rd.luks.name=, sd-encrypt), the device-tree set (order-insensitive, from omarchy-mac-boot: deterministic m1n1 device-tree order, first boot via #528 #541), m1n1 stage 2 and U-Boot inm1n1/boot.bin, and Limine's loader, menu hash and UKI kernel.--boot-chainholds only the kernel image, device trees and m1n1 against their package mtree, and any otherpacman -Qkkreport still fails it. With both kernels installed it checks the one the boot menu starts first: the first Limine kernel entry, where Omarchy'sdefault_entrypoints, else GRUB's first entry. Adefault_entryorGRUB_DEFAULTpointed elsewhere is not followed.M1N1_UPDATE_DISABLED. With that setting,M1N1andDTBSmust still resolve to installed package files.sudo mkinitcpio -P && sudo update-m1n1 && sudo omarchy-mac-boot-update, thenomarchy update).EFI/BOOT/BOOTAA64.EFI,limine.confand UKI onESP_PATHto be the ones on the system ESP the device tree names. U-Boot boots from that ESP.omarchy-mac-bootthat lacks a required entrypoint fails with, for example,update-verify on apple-silicon needs /usr/lib/omarchy/mac-boot/update-verify, which omarchy-mac-boot 20260921-10 does not provide; update omarchy-mac-boot(exit 1).docs/update-process.mdanddocs/lifecycle-dispatch.mddescribe the update caller, the exit codes and the Apple implementation.The update path does not call
boot-rebuild. Package hooks rebuild the boot files, andupdate-verifycatches anything they missed.Ship order and legacy Macs
omarchy-mac-bootbuilt from this branch (withupdate-verify) before any runtime carrying this PR. A runtime that arrives first blocks every update on Macs whoseomarchy-mac-bootpredates it, with the "update omarchy-mac-boot" message. The M2 Max, on the mx stack withomarchy-mac-boot 20260921-10, shows exactly that message today. The recipe pins (Make the Monitor panel's display toggle work under the Lua config #637, Apple Silicon test candidate set pinned to #527, with its signing tool #538) need to move to a commit that includes this PR.omarchy-mac-bootat all (a legacy omarchy-mac install) gets a warning that its boot files were not verified, and the update finishes as before. This is deliberate:install/omarchy-apple.packages), so they are always verified.omarchy-mac-bootand a busyboxencryptroot (cryptdevice=, no crypttab) stays blocked until tickets 43/45 migrate it, or until the check's busybox acceptance (mx fix: keep optional recorder failures nonfatal #248, ledger B14) is ported.Testing
test/shell.d/update-boot-verify-test.shrunsomarchy updatewith its other steps stubbed, through the real helper, dispatcher and detector on platform fixtures:sudo, even with failing Mac entrypoints on disk and bash locale warnings on stderr.omarchy-mac-boot's real entrypoint and boot check on a fixture Limine Mac: a coherent chain passes, including a pending reboot. A wrong device tree, a stale m1n1 or a missing UKI fails the update with the reason and remediation, and no reboot is offered.omarchy-mac-boot: the update warns and finishes.update-verify: the update fails and names the version.packages/omarchy-mac/boot/test/update-verify-test.shcovers the entrypoint.packages/omarchy-mac/boot/test/allpasses (125 checks). In runtime./test/all, every failing file also fails on quattro-upstream in the same container: the suite's container-dependency failures, plusplatform-packages-test.sh, which callsomarchy-pkg-defaultswithoutbin/onPATH. CI's Shell suites, Shellcheck and aarch64 package resolution pass.update-verifypasses on its healthy LUKS + Limine chain, both directly as root and through the helper and dispatcher. The full check passes too.omarchy-gpu: the shared x86 harness there has this PR (at3b1d2e49, same ticket code) queued behind its ISO builds. It is not reported here yet.u-boot-nodtb.binis folded into the rebuilt image but never held against its package, so a corrupted copy would pass.Second review:
sudoon x86 and an entrypoint style issue, both fixed.--boot-chain). The dispatcher said "not installed" for an old package (fixed). The ship order was undocumented (documented above).sudo(fixed).--boot-chainskipped the mtree check entirely (narrowed instead).pacman -Qkkpass. That is fixed, with a test that fails on the old code. It also found two low gaps, the U-Boot follow-up above and thedefault_entrylimit, now documented.