Found by an automated codebase audit (follow-up on #49, shipped in #248).
The "Restore/persist the booted savevm overlay" step caches path: vmphone/vm-overlay.qcow2 only (.github/workflows/e2e.yml:439). But the warm-resume path (src/beetroot/backends/vm.py:545 → vm/boot_cache.py:overlay_is_stale) treats a missing/unreadable vm-overlay.cache-key sidecar as stale. The sidecar lives next to the overlay but is never cached, so every run re-cold-boots and the savevm cache delivers no speedup — the #49 mechanism is effectively dead in CI.
Failure scenario
Run tier-vm-qemu twice with unchanged kernel+rootfs. Run 1: cache miss → cold boot → post-job saves vm-overlay.qcow2 (not the sidecar). Run 2: cache hit restores vm-overlay.qcow2 with no vm-overlay.cache-key alongside → overlay_is_stale() returns True (missing sidecar) → cold boot again.
Suggested fix
Add the sidecar to the cached path:
path: |
vmphone/vm-overlay.qcow2
vmphone/vm-overlay.cache-key
Also note scripts/vm_cache_key.py (kernel+rootfs only) omits the resolved -smp/-m geometry that boot_cache.base_identity folds in (#161), so even with the sidecar cached, the CI cache key and the CLI staleness fingerprint can disagree — worth reconciling.
Location: .github/workflows/e2e.yml:439
Severity: med · category: bug (ci)
Found by an automated codebase audit (follow-up on #49, shipped in #248).
The "Restore/persist the booted savevm overlay" step caches
path: vmphone/vm-overlay.qcow2only (.github/workflows/e2e.yml:439). But the warm-resume path (src/beetroot/backends/vm.py:545 → vm/boot_cache.py:overlay_is_stale) treats a missing/unreadablevm-overlay.cache-keysidecar as stale. The sidecar lives next to the overlay but is never cached, so every run re-cold-boots and the savevm cache delivers no speedup — the #49 mechanism is effectively dead in CI.Failure scenario
Run
tier-vm-qemutwice with unchanged kernel+rootfs. Run 1: cache miss → cold boot → post-job savesvm-overlay.qcow2(not the sidecar). Run 2: cache hit restoresvm-overlay.qcow2with novm-overlay.cache-keyalongside →overlay_is_stale()returns True (missing sidecar) → cold boot again.Suggested fix
Add the sidecar to the cached path:
Also note
scripts/vm_cache_key.py(kernel+rootfs only) omits the resolved-smp/-mgeometry thatboot_cache.base_identityfolds in (#161), so even with the sidecar cached, the CI cache key and the CLI staleness fingerprint can disagree — worth reconciling.Location:
.github/workflows/e2e.yml:439Severity: med · category: bug (ci)