From 9a7325e3a64c5a89fafeaa58f795e9b83f39af6e Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Sun, 30 Aug 2026 15:30:21 -0400 Subject: [PATCH 1/4] Stop OCR-waiting on the unencrypted install confirm Tesseract cannot read the highlighted "Yes, install without encryption" button under any preprocessing, so waiting for that text always timed out and killed unencrypted installs at the disk warning. Capture the screen and continue instead; a Ctrl+C toggle that failed to apply still surfaces when the unexpectedly encrypted install stalls at the LUKS prompt on first boot. --- bin/omarchy-iso-test | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/bin/omarchy-iso-test b/bin/omarchy-iso-test index 281cf56..9a134ec 100755 --- a/bin/omarchy-iso-test +++ b/bin/omarchy-iso-test @@ -631,7 +631,11 @@ drive_configurator() { capture_console "success-installer-04-prepare-disk-warning-encrypted" if ! $ENCRYPT; then press ctrl-c - wait_for_screen "without encryption" 30 + # The toggled confirm ("Yes, install without encryption") is a highlighted + # button OCR cannot read, so don't wait for it. A failed toggle still + # surfaces: the encrypted install stalls at the LUKS prompt on first boot + # and SSH never comes up. + sleep 2 capture_console "success-installer-05-prepare-disk-warning-unencrypted" fi press ret @@ -695,7 +699,11 @@ drive_configurator() { capture_console "success-installer-12-disk-warning-encrypted" if ! $ENCRYPT; then press ctrl-c # toggles the confirm to the unencrypted flow - wait_for_screen "without encryption" 30 + # The toggled confirm ("Yes, install without encryption") is a highlighted + # button OCR cannot read, so don't wait for it. A failed toggle still + # surfaces: the encrypted install stalls at the LUKS prompt on first boot + # and SSH never comes up. + sleep 2 capture_console "success-installer-13-disk-warning-unencrypted" fi press ret From 0b2739a55d84730901eda1373fb70932fbd3542e Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Sun, 30 Aug 2026 15:30:31 -0400 Subject: [PATCH 2/4] Match the shortcut smoke to the menu-first bindings Omarchy now binds Super+Space to the Omarchy menu and Super+Alt+Space to the apps menu, and the omarchy.launcher plugin is gone (the apps menu replaced it). The smoke table still expected the old launcher binding, so both chords failed against current builds. Both surfaces open under the omarchy-menu layer namespace. --- bin/omarchy-iso-test | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/omarchy-iso-test b/bin/omarchy-iso-test index 9a134ec..85d6332 100755 --- a/bin/omarchy-iso-test +++ b/bin/omarchy-iso-test @@ -400,7 +400,7 @@ guest_layer_absent() { } cleanup_shortcut_state() { - ssh_session 'for plugin in omarchy.launcher omarchy.menu omarchy.emojis omarchy.clipboard omarchy.audio; do + ssh_session 'for plugin in omarchy.menu omarchy.emojis omarchy.clipboard omarchy.audio; do omarchy-shell shell hide "$plugin" >/dev/null 2>&1 || true done while read -r address; do @@ -577,8 +577,8 @@ shortcut_smoke_phase() { local status=0 local name chord namespace plugin - local shortcuts='launcher|meta_l-spc|omarchy-launcher|omarchy.launcher -menu|meta_l-alt-spc|omarchy-menu|omarchy.menu + local shortcuts='menu|meta_l-spc|omarchy-menu|omarchy.menu +apps-menu|meta_l-alt-spc|omarchy-menu|omarchy.menu emojis|meta_l-ctrl-e|omarchy-emojis|omarchy.emojis clipboard|meta_l-ctrl-v|omarchy-clipboard|omarchy.clipboard audio-panel|meta_l-ctrl-a|omarchy-keyboard-panel|omarchy.audio' From e89c0796f7150b63e0a6f3dbc62958990fe7dab0 Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Sun, 30 Aug 2026 15:30:37 -0400 Subject: [PATCH 3/4] Serve a localhost VNC display from test VMs Runs stay headless, but a viewer on 127.0.0.1:5905 can watch the driven install live or inspect the acceptance VM left up by --keep-running. --- bin/omarchy-iso-test | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/omarchy-iso-test b/bin/omarchy-iso-test index 85d6332..542bd1e 100755 --- a/bin/omarchy-iso-test +++ b/bin/omarchy-iso-test @@ -211,6 +211,7 @@ start_vm() { -device virtio-blk-pci,drive=drive0,bootindex=1 \ -device virtio-vga \ -display none \ + -vnc 127.0.0.1:5 \ -usb -device usb-tablet \ -netdev user,id=net0,hostfwd=tcp:127.0.0.1:$SSH_PORT-:22 \ -device virtio-net-pci,netdev=net0 \ From 37fd3c4305ba4d13120657c7b0aababa7601ae7d Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Sun, 30 Aug 2026 16:08:51 -0400 Subject: [PATCH 4/4] Sync the whole test suite and run it in the guest --sync-omarchy now pushes all of test/ (the security coverage lives in shell.d as well as acceptance.d), and the acceptance run gets OMARCHY_ACCEPTANCE_SUDO_PASSWORD so the suite's opt-in sshd hardening exercise can run against the throwaway VM. --sync-all additionally runs the CLI and shell suites inside the guest from the synced tree. The acceptance suite always runs against /usr/share/omarchy either way: VM runs verify the finished product, and qs matches shell instances by config path, so pointing the suite at the synced tree just reads the session shell as "not running". --- bin/omarchy-iso-test | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/bin/omarchy-iso-test b/bin/omarchy-iso-test index 542bd1e..4b25a8e 100755 --- a/bin/omarchy-iso-test +++ b/bin/omarchy-iso-test @@ -18,9 +18,10 @@ # first boot runs omarchy-provision-owner and creates it there # --reuse-base Skip the install phase if a base image already exists # --install-only Stop after producing the installed base image -# --sync-omarchy DIR Push DIR's test/acceptance into the guest before running +# --sync-omarchy DIR Push DIR's test suite into the guest before running # (defaults to OMARCHY_PATH when the suite is present) # --sync-all DIR Push all of DIR (bin/config/shell/test) into the guest +# and also run the CLI and shell suites there # --port PORT Host port forwarded to guest SSH (default 2222) # --memory MB VM memory (default 8192) # --timeout SECS Install timeout (default 2400) @@ -1067,17 +1068,14 @@ sync_omarchy() { log "Syncing $SYNC_DIR into the guest" tar -C "$SYNC_DIR" --exclude .git -cf - . | ssh_guest "mkdir -p $target && tar -C $target -xf -" else - log "Syncing $SYNC_DIR/test/acceptance into the guest" - tar -C "$SYNC_DIR/test" -cf - acceptance acceptance.d | ssh_guest "mkdir -p $target/test && tar -C $target/test -xf -" + log "Syncing $SYNC_DIR/test into the guest" + tar -C "$SYNC_DIR" -cf - test | ssh_guest "mkdir -p $target && tar -C $target -xf -" fi } acceptance_phase() { log "Booting acceptance VM from base image overlay" - local guest_omarchy_path="/usr/share/omarchy" - $SYNC_ALL && guest_omarchy_path=".local/share/omarchy" - qemu-img create -f qcow2 -b "$BASE_DISK" -F qcow2 "$RUN_DIR/run.qcow2" >/dev/null start_vm "$RUN_DIR/run.qcow2" "$RUN_DIR/serial.log" @@ -1087,8 +1085,19 @@ acceptance_phase() { local status=0 shortcut_smoke_phase || status=1 + # The synced tree is a full checkout under --sync-all; run the host-style + # CLI and shell suites in the guest too before the graphical acceptance + # run. They derive their root from their own location in the synced tree. + if $SYNC_ALL; then + log "Running CLI and shell suites in the guest" + ssh_guest "bash .local/share/omarchy/test/all" || status=$? + fi + + # The product under test is always the installed tree — VM runs verify the + # finished product, never a dev-linked checkout. log "Running acceptance suite" - ssh_guest "OMARCHY_PATH=$guest_omarchy_path OMARCHY_ACCEPTANCE_DIR=/tmp/omarchy-acceptance bash .local/share/omarchy/test/acceptance" || status=$? + ssh_guest "OMARCHY_PATH=/usr/share/omarchy OMARCHY_ACCEPTANCE_DIR=/tmp/omarchy-acceptance \ + OMARCHY_ACCEPTANCE_SUDO_PASSWORD=$GUEST_PASSWORD bash .local/share/omarchy/test/acceptance" || status=$? log "Collecting artifacts into $RUN_DIR" ssh_guest "tar -C /tmp -cf - omarchy-acceptance 2>/dev/null" | tar -C "$RUN_DIR" -xf - || true