Dosu LogoDosu Logo
Ask
Join our Discord
Organization avatar
bluefinPublic
Bluefin
Documentsbluefin
2026-03-30-boot-verification
2026-03-30-boot-verification
Type
External
Status
Published
Created
Jun 13, 2026
Updated
Jun 13, 2026
Source
docs/superpowers/plans/2026-03-30-boot-verification.md

Boot Verification Implementation Plan#

For agentic workers: REQUIRED SUB-SKILL: Use superpowers (recommended) or superpowers to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Add a QEMU+OVMF boot verification step to bootcrew-nightly.yml that boots each installed image and fails the matrix job if a login prompt does not appear within 180 seconds.

Architecture: Two edits to .github/workflows/bootcrew-nightly.yml: add qemu-system-x86 ovmf to the apt install line, and insert a "Boot verification" step between "Verify installation" and "Cleanup". The step boots the loop device with KVM acceleration, tees serial output to a log file, and greps for login:.

Tech Stack: GitHub Actions, QEMU (qemu-system-x86_64), OVMF UEFI firmware, Bash.


File Map#

FileActionResponsibility
.github/workflows/bootcrew-nightly.ymlModifyAdd QEMU tools to apt install; add boot verification step

Task 1: Add QEMU tools to the apt install line and boot verification step#

Files:

  • Modify: .github/workflows/bootcrew-nightly.yml

This is a CI-only change. There is no unit-testable Go code involved. The verification is done by triggering the workflow manually after the edit.

  • Step 1: Add qemu-system-x86 ovmf to the apt install line

In .github/workflows/bootcrew-nightly.yml, find the "Install tools" step (line 50–52) and extend the apt install line:

Old:

      - name: Install tools
        run: |
          sudo apt-get update -qq
          sudo apt-get install -y podman xfsprogs btrfs-progs cryptsetup-bin ostree

New:

      - name: Install tools
        run: |
          sudo apt-get update -qq
          sudo apt-get install -y podman xfsprogs btrfs-progs cryptsetup-bin ostree qemu-system-x86 ovmf
  • Step 2: Insert the "Boot verification" step

Insert the following step between the "Verify installation" step (ends at line 127) and the "Cleanup" step (starts at line 129). The working-directory default is fisherman/fisherman, so use working-directory: ${{ github.workspace }} to run from the repo root where the loop device path is accessible.

      - name: Boot verification
        working-directory: ${{ github.workspace }}
        run: |
          LOOPDEV="${{ steps.loopdev.outputs.loopdev }}"
          IMAGE_NAME="${{ matrix.image.name }}"
          LOG="/tmp/boot-${IMAGE_NAME}.log"

          echo "Booting $IMAGE_NAME with QEMU+OVMF (timeout 180s)..."
          sudo timeout 180 qemu-system-x86_64 \
            -enable-kvm \
            -m 2G \
            -drive file="$LOOPDEV",format=raw,if=virtio \
            -drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \
            -serial stdio \
            -nographic \
            -no-reboot 2>&1 | tee "$LOG" || true

          if grep -q "login:" "$LOG"; then
            echo "PASS: login prompt found for $IMAGE_NAME"
          else
            echo "FAIL: no login prompt found for $IMAGE_NAME"
            echo "--- last 50 lines of boot log ---"
            tail -50 "$LOG"
            exit 1
          fi

Why || true after the pipe: timeout exits with code 124 when it fires, and QEMU may exit non-zero on -no-reboot. We capture the output first and let the grep decide pass/fail, so we suppress the QEMU exit code. The exit 1 inside the if block propagates failure correctly.

Why sudo on QEMU: The loop device is owned by root (created with sudo losetup), so QEMU needs root to open it directly.

  • Step 3: Verify the full workflow file looks correct

Read .github/workflows/bootcrew-nightly.yml and confirm:

  • The apt line now includes qemu-system-x86 ovmf

  • The "Boot verification" step appears between "Verify installation" and "Cleanup"

  • The "Cleanup" step still has if: always() so it runs even when boot verification fails

  • Step 4: Commit

cd /var/home/james/dev/bootc-installer
git add .github/workflows/bootcrew-nightly.yml
git commit -m "ci: add QEMU+OVMF boot verification to bootcrew-nightly"
  • Step 5: Push and trigger the workflow
git push
gh workflow run bootcrew-nightly.yml

Then watch the run:

gh run watch

Expected: each matrix job shows a "Boot verification" step. For a passing image the step log ends with PASS: login prompt found for <name>. For a failing image it prints the last 50 lines of the boot log and exits non-zero.


Self-Review#

Spec coverage:

Spec requirementTask
Add qemu-system-x86 ovmf to apt installTask 1 Step 1
Boot loop device with -enable-kvm -m 2G -drive virtio -pflash OVMFTask 1 Step 2
-serial stdio -nographic -no-rebootTask 1 Step 2
timeout 180Task 1 Step 2
grep -q "login:" for success detectionTask 1 Step 2
Failure exits non-zero (fails matrix job)Task 1 Step 2 (exit 1)
fail-fast: false already set — other images continuealready in workflow

All spec requirements covered.

Placeholder scan: None found.

Consistency: LOOPDEV is sourced from steps.loopdev.outputs.loopdev, consistent with how the existing "Verify installation" and "Cleanup" steps reference it.

Documents
Changelogs
Bluefin LTS Errata
Pin Log
2024-12-30-ublue-2024-wrapup
2025-01-01-announcements-archive
2025-02-23-february-update
2025-05-14-bluefin-f42
2025-06-23-bazaar-default
2025-07-06-fresh-bluefin-isos-and-bazaar
2025-07-11-four-years-of-ublue
2025-07-15-bold-brew
2025-07-17-ask-projectbluefin
2025-08-01-august-wallpapers
2025-08-08-bluefin-on-lfx
2025-08-29-github-oss-fund
2025-09-17-color-with-bluefin
2025-09-18-bluefin-lts-and-gdx
2025-09-23-LTS-at-indiafoss
2025-10-28-bluefin-autumn
2025-10-31-fastfetch-metrics
2025-11-15-cloud-native-milestone-15-million
2025-11-16-coreos-desktop
2025-11-24-new-just-and-bbrew
2025-11-27-bluefin-and-paleoartists
2025-11-30-report
2025-12-04-flatpak-support-in-brewfiles
2025-12-06-interview-with-michael-tunnell
2025-12-07-documentation-updates
2025-12-14-huntress-holiday-wallpapers
2025-12-15-easier-homebrew-installation-for-custom-images
2025-12-27-upcoming-homebrew-cli-changes
2025-12-30-bluefin-2025-wrapup
2025-12-31-report
2026-01-03-modernizing-custom-images
2026-01-31-report
2026-02-01-automated-reports-changelogs
2026-02-28-report
2026-03-13-bluefin-cli-mac-wsl
2026-03-27-bluefin-lts-gnome-49-50
2026-03-29-composefs-fisherman
2026-03-29-composefs-fisherman-design
2026-03-30-boot-verification
2026-03-30-boot-verification-design
2026-03-30-proportional-progress-tracking
2026-03-30-proportional-progress-tracking-design
2026-03-31-report
2026-04-02-state-of-ecosystem
2026-04-19-dakota-alpha-1
2026-04-30-report
2026-05-05-bluefin-spring
2026-05-12-bluefin-spring-2026
2026-05-13-bluefin-spring-2026-2
2026-05-14-making-our-own-fate
2026-05-15-hummingbird
2026-05-23-gradia-capture-bluefin
2026-05-28-knuckle
2026-05-31-report
2026-06-11-promotion-pr-body
AGENTS
AGENTS
AGENTS
AGENTS
AGENTS
AGENTS
Building a Custom Bluefin Image
CI_CD_GUIDE
CLAUDE
CLAUDE
CONTRIBUTING
CONTRIBUTING
CONTRIBUTING
CONTRIBUTING
CONTRIBUTING
FAQ
How can I install Double Commander on Bluefin (an immutable Linux OS), coming from Arch Linux?
How can you fix random GPU artifacts and hard freezes on an AMD Framework 16 laptop running Linux (Bluefin/Fedora)?
How do I install the Cloudflare WARP (One) client on Bluefin?
How to Reset a User's Home Directory to Defaults on Bluefin
INDEX
MAINTAINERS
MULTI_VARIANT_BUILD
PITFALLS
PULL_REQUEST_TEMPLATE
Plex Media Server
README
README
README
README
README
README
README
README
README
SECURITY
SECURITY
SECURITY
SKILL
SKILL
SKILL
SKILL
TRANSLATING
Update Process
Which Bluefin ISO is recommended for a Lenovo Yoga Pro 9i with an NVIDIA RTX 4050 for Python data science and Machine Learning with CUDA?
about-monthly-reports
action-reference
actionadon
add-package
administration
agentic-contributing
ai
analytics
architect
architecture
artwork
blog-poster.agent
bluefin-dx
bluefin-gdx
bonedigger-agent-donation
bonedigger-lifecycle
bonedigger-overview
bonedigger-templates
bonedigger-ujust
bst-overrides
build
build
buildstream
ci
ci
ci
code-of-conduct
command-line
composite-actions
consumer-guide
consumer-validation
contributing
contributors
conventional-commit.prompt
copilot-instructions
copilot-instructions
copilot-instructions
copilot-instructions
dakota-tpm2-validation
debugging
demo-mode-e2e
determinism
dinosaurs
downloads
downloads-testing
driver-versions
e2e-ci
e2e-feature-verification
encryption-matrix
factory-operations
failure-paths
feedback-loop
gstreamer-codec-validation
human-gates
images
index
index
installation
installer
introduction
knuckle
label-workflow
libpastry-integration
live-iso
local-ota
lore
lts
luks-testing
merge-queue
mission
multi-arch
music
not-bluefin
oci-assembly
oci-layers
onboarding
overview
packaging-binaries
packaging-gnome-extensions
packaging-go
packaging-rust
packaging-zig
patch-junctions
patches
pr-checklist
pr-review
press-kit
projects
pull_request_template
pull_request_template
pull_request_template
qr-phone-companion
quickstart
r2-promotion
release-qualification
remove-package
reports
reusable-workflow
skill-improvement
supply-chain
t2-mac
testing
tips
troubleshooting
ujust-recipes
update-refs
upgrade-and-migration
ux-ubuntu-provision
values
variants
vm-stack
workflow