Skip to content

feat(minvmd): produce a viable non-EFI VM image and reach READY (closes #326) - #344

Merged
norrietaylor merged 16 commits into
mainfrom
feat/326-minvmd-viable-vm-image
Jun 4, 2026
Merged

feat(minvmd): produce a viable non-EFI VM image and reach READY (closes #326)#344
norrietaylor merged 16 commits into
mainfrom
feat/326-minvmd-viable-vm-image

Conversation

@norrietaylor

@norrietaylor norrietaylor commented Jun 4, 2026

Copy link
Copy Markdown
Member

Supersedes #339. Produces a viable non-EFI libkrun VM image (external virtio-linux kernel + Alpine virtio-fs rootfs) and wires the boot path so minvmd boot reaches the guest READY marker. Carries #339's host plumbing plus the fixes below.

Root cause

The #339 boot E2E could not reach READY for four reasons:

  1. Wrong aarch64 kernel format. image.rs used KRUN_KERNEL_FORMAT_IMAGE_GZ=4; the aarch64 libkrun loader implements only RAW=0 and PE_GZ=2, so krun_set_kernel returned KernelFormatUnsupported before boot. Verified against /opt/homebrew/include/libkrun.h (1.18.1).
  2. No guest workload. Neither vm.rs nor vmm_child.rs called krun_set_exec, so libkrun's /init.krun (pid-1) fell back to /bin/sh and never emitted READY.
  3. vsock marker direction deadlock. The host registers the marker with the plain krun_add_vsock_port (≡ listen=false, guest→host) and listens on the host UDS, but the rootfs stub socat VSOCK-LISTEN:7350 also listened. Both sides waited. Confirmed against src/libkrun/src/lib.rs + libkrun#246.
  4. No image on main. The rootfs/kernel scripts lived on feature/CI branches; CI staged a vanilla Alpine with no READY writer.

Fix

  • fix(minvmd): aarch64 → KRUN_KERNEL_FORMAT_PE_GZ; add the constant.
  • feat(minvmd): krun_set_exec the workload (/sbin/minvmd-stub-init, MINVMD_EXEC overrides) with an explicit minimal envp (avoids the ~2 KiB aarch64 cmdline overflow); opt-in console capture (MINVMD_BOOT_LOG); 2 vCPU / 1024 MiB. Kernel cmdline stays NULL (libkrun's default carries console=hvc0 rootfstype=virtiofs rw).
  • feat(minvmd): scripts/{fetch-alpine,build-rootfs,fetch-virtio-kernel}.sh; the stub READY writer now connects out (socat - VSOCK-CONNECT:2:7350).
  • ci(minvmd): boot-e2e builds the real rootfs and uploads the guest console log.
  • docs(minvmd): spec R2.1/R2.3/R2.4 + process model corrected.

Acceptance

  • cargo test -p minvmd, cargo clippy -p minvmd --all-targets -- -D warnings, cargo fmt --check — green locally.
  • FFI smoke (krun_smoke) green against real libkrun 1.18.1.
  • build-rootfs.sh assembles a rootfs with /sbin/minvmd-stub-init (connect-out) + socat.
  • boot-e2e green on the self-hosted Apple Silicon runner → then drop continue-on-error to gate. First green also validates the virtio-linux kernel config (virtio-MMIO / VIRTIO_FS / VIRTIO_VSOCKETS / HVC all =y).

Note on #341

This PR carries #341's fetch-virtio-kernel.sh and an enhanced ci-macos.yml boot-e2e lane, so it supersedes #341's CI work. Merge #341 first and rebase, or close #341 — your call.

References

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • macOS-only "boot" command, hidden VM child entrypoint, and shell completions.
    • Improved kernel-format selection for aarch64/x86_64.
    • Utilities to fetch virtio kernels and to build a bootable guest rootfs.
  • Documentation

    • Clarified macOS VM boot flow, READY-marker handshake, and in-VM init expectations.
  • Tests

    • Added an opt-in macOS end-to-end boot test.
  • Chores

    • CI updated to stage kernels, run macOS boot e2e jobs, and upload boot logs.

gominimal-aw-bot Bot and others added 10 commits June 4, 2026 05:34
Implements R2.3 and R2.4 from the minvmd spec:

- cmd/mod.rs: declares the cmd module, VSOCK_MARKER_PORT (9799) and
  MARKER_SOCK_ENV constants shared between parent and child.

- cmd/boot.rs: the `minvmd boot [--foreground]` subcommand.
  On macOS: validates MINVMD_KERNEL_PATH and MINVMD_ROOTFS_PATH,
  creates a UNIX socket listener for the READY marker, fork-execs
  `minvmd __krun-vmm` with MINVMD_MARKER_SOCK set to the socket
  path, writes the child PID to vmm.pid, then waits up to 5 s for
  the guest to connect and write READY\n (R2.4). On success prints
  vm-up. With --foreground, blocks until the VMM child exits.
  On Linux: bails immediately (no-op stub).

- cmd/vmm_child.rs: the hidden `minvmd __krun-vmm` subcommand.
  On macOS: creates a libkrun context, applies VmConfig (kernel,
  rootfs, 2 vcpus, 512 MiB), registers VSOCK_MARKER_PORT pointing
  to the host UNIX socket, then calls krun_start_enter (R2.3).
  On Linux: bails immediately (no-op stub).

- main.rs: wires Boot and KrunVmm subcommands to the CLI.
- lib.rs: exports pub mod cmd.
- tests/boot_e2e.rs: READY-marker round-trip E2E test (gated on
  MINVMD_E2E=1 and #[ignore], macOS only) (R2.4).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
On the error and timeout paths in boot.rs, terminate and wait the VMM
child and remove both vmm.pid and the marker socket before returning,
so a failed boot does not leave stale state behind.

In boot_e2e.rs, set XDG_STATE_HOME to an isolated tempdir for the
spawned child so the E2E test does not clobber the developer's real
state directory.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add #[serial] to boot_e2e_ready_marker_round_trip so it cannot race
other stateful E2E tests that mutate XDG_STATE_HOME. The test already
isolates its state directory via XDG_STATE_HOME=<tempdir>, so no
additional isolation is needed; serialization ensures only one such
test runs at a time.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use PID + 4 random bytes from /dev/urandom for the READY-marker socket
path instead of PID alone, making the path unpredictable and closing
the TOCTOU race a local attacker could exploit to inject a spoofed
READY.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The host awaited the boot READY marker on vsock 9799, but no guest emits
on that port: the guest rootfs manifest documents 7350
(etc/minvmd/manifest: vsock_port_ready=7350). With 9799 the marker never
arrived. Align the host to 7350.

Necessary but not sufficient: krun_start_enter still returns EINVAL; root
cause under investigation (see PR comment) — not a kernel-format or
rootfs-format issue.

Refs: #221

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The aarch64 libkrun loader implements only RAW and PE_GZ; IMAGE_GZ (=4)
is x86_64-only and returns KernelFormatUnsupported, so krun_set_kernel
failed before the VM could boot. Select KRUN_KERNEL_FORMAT_PE_GZ (=2)
for the aarch64 Image.gz (the loader scans for the gzip magic and
decompresses) and add the constant to the FFI surface.

Verified against /opt/homebrew/include/libkrun.h (libkrun 1.18.1).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The VMM child configured a kernel + rootfs but never set a workload, so
libkrun's /init.krun (pid-1) fell back to /bin/sh and never emitted the
READY marker. Set the guest workload via krun_set_exec (default
/sbin/minvmd-stub-init, MINVMD_EXEC overrides) with an explicit minimal
envp — passing None would inherit the full host env and can overflow the
~2 KiB aarch64 kernel cmdline.

Add opt-in early-boot console capture (MINVMD_BOOT_LOG) for diagnosing a
stuck boot, and raise the VM from 512 MiB to 2 vCPU / 1024 MiB for cheap
headroom under Hypervisor.framework.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Stage the non-EFI VM image production on main:

- fetch-alpine.sh: pinned, sha256-verified Alpine 3.21.7 minirootfs.
- build-rootfs.sh: overlay socat + the /sbin/minvmd-stub-init workload
  and the guest manifest onto the rootfs directory (consumed by
  krun_set_root as virtio-fs; no disk image).
- fetch-virtio-kernel.sh: pull the prebuilt virtio-linux vmlinuz
  (Image.gz) from the public minimal build cache (carried from #341).

The stub's READY writer connects OUT to the host (CID 2, port 7350)
rather than listening: the host registers the marker with the plain
krun_add_vsock_port (== listen=false), so the direction is guest->host.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Stage the guest rootfs via fetch-alpine.sh + build-rootfs.sh (was a
vanilla extract with no READY writer), capture the guest console as an
artifact for debugging, and scope the workflow to scripts/**. The boot
E2E stays non-gating (continue-on-error) until first-green on the
self-hosted runner, which also validates the virtio-linux kernel config.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Align the spec with libkrun's verified behaviour: aarch64 loads Image.gz
via PE_GZ (not IMAGE_GZ); libkrun's /init.krun is pid-1 and execs the
krun_set_exec workload (no init system in the rootfs); the kernel cmdline
stays unset; boot uses 2 vCPU / 1024 MiB; and the READY marker is
guest-initiated (krun_add_vsock_port, listen=false), the opposite of the
R3 ssh.sock bridge.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@norrietaylor, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 28 minutes and 47 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8caa2825-9f0d-4eec-b10b-ac3b10e5d7bf

📥 Commits

Reviewing files that changed from the base of the PR and between d6519a3 and 82ce054.

📒 Files selected for processing (2)
  • crates/minvmd/src/cmd/boot.rs
  • docs/specs/01-spec-minvmd-host-daemon/01-spec-minvmd-host-daemon.md
📝 Walkthrough

Walkthrough

Implements macOS boot orchestration and hidden VMM child, adds scripts to fetch/build guest rootfs and virtio kernel, introduces arch-specific kernel formats and tests, adds a macOS boot e2e test and CI jobs, and updates spec/architecture docs.

Changes

minvmd macOS boot pipeline

Layer / File(s) Summary
Boot contracts and kernel formats
crates/minvmd/src/krun/raw.rs, crates/minvmd/src/krun/mod.rs, crates/minvmd/src/image.rs, crates/minvmd/src/cmd/mod.rs, crates/minvmd/src/lib.rs, crates/minvmd/src/main.rs, crates/minvmd/Cargo.toml
Adds KRUN_KERNEL_FORMAT_PE_GZ, re-exports it, updates aarch64 kernel_format() and tests; exposes cmd module and adds Boot and hidden __krun-vmm CLI variants; defines VSOCK marker constants and test serialization dev-dep.
Parent-child macOS boot orchestration
crates/minvmd/src/cmd/boot.rs, crates/minvmd/src/cmd/vmm_child.rs
Implements minvmd boot (creates UNIX marker socket, spawns child with MINVMD_MARKER_SOCK, records vmm.pid, waits up to 5s for guest READY\n handshake, handles cleanup and optional foreground wait) and __krun-vmm child (resolves kernel/rootfs, configures libkrun Context, registers vsock marker port bridged to host socket, calls start_enter()).
Guest provisioning scripts
scripts/fetch-alpine.sh, scripts/build-rootfs.sh, scripts/fetch-virtio-kernel.sh
Adds idempotent Alpine minirootfs fetch/extract with SHA marker, overlays pinned socat and installs minvmd-stub-init that performs READY vsock connect-out and vsock relay, and a script to fetch prebuilt virtio-linux kernels via the minimal CLI.
Boot E2E test and CI wiring
.github/workflows/ci-macos.yml, crates/minvmd/tests/boot_e2e.rs
CI: expands triggers to scripts/**, adds virtio-kernel job (ubuntu) to fetch kernel artifact, and gated boot-e2e job on self-hosted macOS that downloads kernel, stages rootfs, builds/codesigns minvmd, runs non-blocking boot e2e test, and uploads boot log artifact; adds macOS-only e2e test (ignored by default, gated by MINVMD_E2E).
Spec and architecture docs
docs/specs/01-spec-minvmd-host-daemon/*
Refines Unit 2 boot bring-up text: documents /init.krun behavior, arch-specific kernel formats (PE_GZ for aarch64, ELF for x86_64), guest-initiated READY marker semantics on port 7350, and updates process-model diagrams.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related issues

  • #328 — Related: implements the READY vsock round-trip and guest stub coordination referenced by these changes.
  • gominimal/minspec-test#33 — Related: spec/test coverage for macOS libkrun boot and READY handshake.
  • #311 — Related: implements the macOS host daemon parent/child model and READY marker functionality.

Possibly related PRs

Suggested reviewers

  • evanspearman
  • twitchyliquid64

Poem

🐰 I tunneled through macOS nights,
Spawned a child to set things right,
A socket whispered "READY\n" true,
Alpine roots and kernels flew,
Userspace woke — the rabbit cheers!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title directly addresses the main objective: producing a viable non-EFI VM image and reaching the READY marker, with specific reference to the resolved issue #326.
Linked Issues check ✅ Passed All linked issue requirements are met: #341 is satisfied by the new kernel-fetch and boot-e2e CI jobs; #326 is satisfied by boot/vmm-child CLI implementation, host-side boot-to-userspace proof, and E2E test infrastructure.
Out of Scope Changes check ✅ Passed All changes are scoped to the linked issues: new scripts, CLI commands, rootfs tooling, CI workflow updates, test additions, documentation, and kernel format fixes are all directly required by #326 and #341.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

The self-hosted runner's `/usr/bin/env bash` is the macOS system bash
3.2, which lacks associative arrays; `declare -A` made `[aarch64]=` parse
as an unbound arithmetic index under `set -u`, failing build-rootfs.sh
with "aarch64: unbound variable". Replace the per-arch sha256 arrays with
plain vars + a case lookup. Verified under /bin/bash 3.2.57.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/minvmd/src/cmd/boot.rs`:
- Around line 54-59: The current nonce construction silently ignores errors and
yields 0 when std::fs::File::open("/dev/urandom") or read_exact fails; change it
to handle errors explicitly by checking the Result from File::open and
read_exact, and return or propagate an error (or panic with a clear message)
instead of silently using a zero nonce. Locate the nonce block in cmd::boot.rs
(the variable named nonce and the calls to std::fs::File::open and read_exact),
unwrap or map_err with context and propagate the failure from the surrounding
function (or call expect with a descriptive message) so a failed read from
/dev/urandom does not produce a predictable nonce.

In `@scripts/build-rootfs.sh`:
- Around line 40-43: The associative array SOCAT_SHA256 uses unquoted keys like
[aarch64] and [x86_64] which, under set -u, are treated as variable expansions
and cause "unbound variable" failures; update the array declaration for
SOCAT_SHA256 to quote the keys (e.g. ["aarch64"], ["x86_64"]) so bash treats
them as literal strings and the pipeline no longer errors when set -u is
enabled.

In `@scripts/fetch-alpine.sh`:
- Around line 26-29: The associative array PINNED_SHA256 is using unquoted
subscripts which fail under set -u; update the declaration of PINNED_SHA256 to
use quoted keys (e.g., "aarch64" and "x86_64") and ensure any later accesses to
PINNED_SHA256[...] also quote the subscript to avoid bash treating them as
undefined variables; locate the PINNED_SHA256 declaration and all uses of
PINNED_SHA256 in the script and replace unquoted keys/subscripts with quoted
strings.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3e255fd7-9172-486b-b2dc-73900057abc0

📥 Commits

Reviewing files that changed from the base of the PR and between 5862969 and f253501.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (16)
  • .github/workflows/ci-macos.yml
  • crates/minvmd/Cargo.toml
  • crates/minvmd/src/cmd/boot.rs
  • crates/minvmd/src/cmd/mod.rs
  • crates/minvmd/src/cmd/vmm_child.rs
  • crates/minvmd/src/image.rs
  • crates/minvmd/src/krun/mod.rs
  • crates/minvmd/src/krun/raw.rs
  • crates/minvmd/src/lib.rs
  • crates/minvmd/src/main.rs
  • crates/minvmd/tests/boot_e2e.rs
  • docs/specs/01-spec-minvmd-host-daemon/01-spec-minvmd-host-daemon.md
  • docs/specs/01-spec-minvmd-host-daemon/architecture.md
  • scripts/build-rootfs.sh
  • scripts/fetch-alpine.sh
  • scripts/fetch-virtio-kernel.sh

Comment thread crates/minvmd/src/cmd/boot.rs Outdated
Comment thread scripts/build-rootfs.sh Outdated
Comment thread scripts/fetch-alpine.sh Outdated
norrietaylor and others added 3 commits June 4, 2026 12:25
The READY-writer stub runs socat, which dynamically links libreadline.so.8
(needs libncursesw.so.6) — neither is in the Alpine minirootfs, so socat
aborted with "Error loading shared library libreadline.so.8" and never
wrote READY. Overlay the readline and libncursesw apks (sha256-pinned)
alongside socat via a fetch_apk helper. (libssl/libcrypto/libc are already
in the base.) NOTE: the library ships in `libncursesw`, not the
payload-less `ncurses-libs` metapackage.

Verified locally on Apple Silicon: a codesigned `minvmd boot` against the
prebuilt virtio-linux kernel boots Alpine and prints `vm-up`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
`cargo test` relinks target/debug/minvmd under the test profile, discarding
the hypervisor entitlement applied by codesign — so krun_start_enter failed
with EINVAL even though a prior step signed the binary. Build with
`--no-run`, codesign, then execute the prebuilt boot_e2e test binary
directly (no further cargo invocation), which preserves the signature.
Stage the real rootfs via build-rootfs.sh and upload the guest console log.

Verified locally: build --no-run -> codesign -> run test binary == 1 passed,
binary still signed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The READY round-trip is green on the self-hosted Apple Silicon runner
(test result: ok. 1 passed). Drop continue-on-error so a boot regression
fails the workflow. This is the acceptance gate for #311 / #326.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
scripts/build-rootfs.sh (1)

156-161: 💤 Low value

Consider logging a warning if READY marker emission fails after all retries.

If all 50 attempts fail, the script silently proceeds to the echo bridge. For a bring-up stub this is likely acceptable, but a warning log would aid debugging vsock connectivity issues without blocking the boot.

 i=0
 while [ "$i" -lt 50 ]; do
     printf 'READY\n' | socat -t2 - VSOCK-CONNECT:2:7350 && break
     i=$((i + 1))
     sleep 0.1
 done
+[ "$i" -ge 50 ] && echo "minvmd-stub-init: READY marker failed after 50 attempts" >&2
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/build-rootfs.sh` around lines 156 - 161, The retry loop that sends
the 'READY' marker via socat (the while loop using variable i and the socat -
VSOCK-CONNECT:2:7350 command) currently proceeds silently if all 50 attempts
fail; add a post-loop check that detects the failed case (i reached 50 / the
loop never broke) and emits a warning message to stderr or syslog before
continuing to the echo bridge to aid debugging of vsock connectivity issues.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@scripts/build-rootfs.sh`:
- Around line 156-161: The retry loop that sends the 'READY' marker via socat
(the while loop using variable i and the socat - VSOCK-CONNECT:2:7350 command)
currently proceeds silently if all 50 attempts fail; add a post-loop check that
detects the failed case (i reached 50 / the loop never broke) and emits a
warning message to stderr or syslog before continuing to the echo bridge to aid
debugging of vsock connectivity issues.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ee86643e-8828-47fb-9b3a-b8c474f1a097

📥 Commits

Reviewing files that changed from the base of the PR and between 079eaa7 and c7580a4.

📒 Files selected for processing (2)
  • .github/workflows/ci-macos.yml
  • scripts/build-rootfs.sh
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/ci-macos.yml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/ci-macos.yml (1)

69-72: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Serialize the two macOS jobs or widen boot-e2e's timeout.

boot-e2e and build-macos both target the single self-hosted ARM64 runner, but boot-e2e times out after 20 minutes while build-macos is allowed 30. Because queued time counts toward the job timeout here, boot-e2e can fail in the queue before its VM boot even starts, which will make this new required gate flaky.

Suggested fix
   boot-e2e:
     if: ${{ vars.RUN_MACOS_CI != 'false' }}
-    needs: virtio-kernel
+    needs: [virtio-kernel, build-macos]
     runs-on: [self-hosted, macOS, ARM64]
-    timeout-minutes: 20
+    timeout-minutes: 30

Also applies to: 136-138

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci-macos.yml around lines 69 - 72, The two macOS jobs
(boot-e2e and build-macos) contend for the single self-hosted ARM64 runner and
boot-e2e currently has timeout-minutes: 20 which can expire while queued; either
serialize these jobs so they don't run concurrently (e.g., add needs/depends-on
from boot-e2e to build-macos or vice versa) or increase boot-e2e's
timeout-minutes to match build-macos (e.g., 30+); locate the job definitions
named boot-e2e and build-macos and update their depends/needs or the
timeout-minutes field accordingly to prevent queue time from causing flaky
failures.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In @.github/workflows/ci-macos.yml:
- Around line 69-72: The two macOS jobs (boot-e2e and build-macos) contend for
the single self-hosted ARM64 runner and boot-e2e currently has timeout-minutes:
20 which can expire while queued; either serialize these jobs so they don't run
concurrently (e.g., add needs/depends-on from boot-e2e to build-macos or vice
versa) or increase boot-e2e's timeout-minutes to match build-macos (e.g., 30+);
locate the job definitions named boot-e2e and build-macos and update their
depends/needs or the timeout-minutes field accordingly to prevent queue time
from causing flaky failures.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 09fed536-047f-46da-ad06-39bd3aba30ba

📥 Commits

Reviewing files that changed from the base of the PR and between c7580a4 and d6519a3.

📒 Files selected for processing (2)
  • .github/workflows/ci-macos.yml
  • docs/specs/01-spec-minvmd-host-daemon/01-spec-minvmd-host-daemon.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/specs/01-spec-minvmd-host-daemon/01-spec-minvmd-host-daemon.md

norrietaylor and others added 2 commits June 4, 2026 13:07
Name build-rootfs.sh (overlays /sbin/minvmd-stub-init + socat + the
readline/libncursesw closure), not just fetch-alpine.sh, and state the
result is a virtio-fs directory (no disk image).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A failed open/read of /dev/urandom silently fell back to a zero nonce,
making the marker socket path predictable and defeating the TOCTOU
hardening the comment promises. Propagate the error with context instead
of discarding it via `let _ =` (which the repo's standards ban).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@norrietaylor
norrietaylor force-pushed the feat/326-minvmd-viable-vm-image branch from d6519a3 to 82ce054 Compare June 4, 2026 20:07
@norrietaylor
norrietaylor enabled auto-merge (squash) June 4, 2026 20:32
@norrietaylor
norrietaylor merged commit 2f613df into main Jun 4, 2026
51 of 63 checks passed
@norrietaylor
norrietaylor deleted the feat/326-minvmd-viable-vm-image branch June 4, 2026 20:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Boot command and VMM child subcommand

2 participants