Skip to content

fix(vm): run rattache la VM existante sans reproposer un reboot (T7.6, AC-R037)#13

Merged
benoitvx merged 2 commits into
mainfrom
fix/vm-run-resource-flags-t7-6
Jul 21, 2026
Merged

fix(vm): run rattache la VM existante sans reproposer un reboot (T7.6, AC-R037)#13
benoitvx merged 2 commits into
mainfrom
fix/vm-run-resource-flags-t7-6

Conversation

@benoitvx

@benoitvx benoitvx commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Problème

Sur une VM projet déjà lancée, chaque albert-code run affiche le prompt agent-vm :

VM '…' is currently running. It must be stopped to apply new resource settings. Stop the VM and apply changes? [y/N]

…alors que rien ne change (ressources demandées = ressources courantes). Faux positif à chaque lancement.

Cause

phase_run passe toujours --cpus/--memory/--disk à _vm opencode (lib/phases.sh). Le moteur de VM vendored ne compare pas aux valeurs courantes (vendor/vm/agent-vm.sh:374) : il repropose un reboot dès qu'un flag ressource est fourni et que la VM tourne. Le vendored étant figé (pin 6f20194), la correction est côté Albert Code.

Correctif (v2)

phase_run ne passe les flags ressources que si la VM projet est absente (1er run → dimensionnement à la création). Si elle est déjà présente (Running ou Stopped), lancement direct sans flags → plus de prompt.

Pourquoi v2 et pas un simple if _agent_vm_running

La 1re tentative (if _agent_vm_running "$(_agent_vm_name)") échouait en run réel : le helper vendored fait limactl list | grep -q, ce qui donne un faux négatif intermittent sous set -o pipefail (actif dans bin/albert-code) — course SIGPIPE quand grep -q ferme le pipe avant la fin de limactl. C'est précisément pour ça que le vendored n'appelle ce helper que dans le sous-shell permissif _vm (set +o pipefail).

→ v2 = capture limactl list -q d'abord (aucun pipe), puis décision par case bash pur. Immunisé au SIGPIPE/pipefail, indépendant des options du shell.

Tests

  • TESTS.md S41 — VM projet présente → rattachement, plus de prompt « must be stopped ».
  • TESTS.md S42 — VM projet absente → flags ressources passés, création dimensionnée.

Validé en run réel (le faux négatif SIGPIPE n'est pas reproductible en test isolé à froid).

Portée

vendor/vm/ non modifié. Aucun changement de comportement pour le 1er run d'un projet.


Mise à jour — correctif étendu à base_vm_exists() (2ᵉ commit)

Revue de la PR : base_vm_exists() portait exactement le même anti-pattern limactl list -q | grep -q '^agent-vm-base$', et il est appelé par phase_run/check_base_vm en amont du code corrigé. Même course SIGPIPE sous set -o pipefail → faux négatif intermittent → la création de la VM de base était reproposée à chaque run (symptôme remonté par un bêta-testeur).

→ Aligné sur le même correctif capture-first + case bash pur (zéro pipe). Test S43 ajouté (base détectée 20/20 sous set -euo pipefail).

La leçon du post-mortem est désormais appliquée aux deux appels limactl | grep -q du chemin run.

benoitvx added 2 commits July 21, 2026 16:13
…ressources (AC-R037)

phase_run passait toujours --cpus/--memory/--disk a _vm opencode, ce qui
declenchait le prompt agent-vm "must be stopped to apply new resource settings"
a chaque run sur une VM deja lancee (le vendored ne compare pas aux valeurs
courantes : il repropose un reboot des qu'un flag ressource est fourni).

Correctif v1 (if _agent_vm_running) a echoue en run reel : le helper vendored
fait `limactl list | grep -q`, faux negatif intermittent sous set -o pipefail
(course SIGPIPE quand grep -q ferme le pipe avant la fin de limactl). C'est
pourquoi le vendored ne l'appelle que dans le sous-shell permissif _vm.

Correctif v2 : capturer `limactl list -q` d'abord (aucun pipe -> immunise
SIGPIPE/pipefail), puis decider par case bash pur. Detection "VM projet
presente" (Running ou Stopped) -> _vm opencode sans flags ; VM absente ->
flags passes pour dimensionner la VM a la creation. vendor/vm/ non touche.

Tests : TESTS.md S41 (VM presente -> plus de prompt) + S42 (VM absente -> flags).
…C-R037)

base_vm_exists() faisait `limactl list -q | grep -q '^agent-vm-base$'`, le
meme anti-pattern que celui corrige dans phase_run : faux negatif intermittent
sous set -o pipefail (grep -q ferme le pipe, limactl prend un SIGPIPE, pipefail
fait echouer le tout). base_vm_exists etant appele par phase_run/check_base_vm
en amont, ce faux negatif reproposait la creation de la VM de base a chaque run
(symptome remonte par un beta-testeur).

Aligne sur le meme correctif : capture `limactl list -q` d'abord (|| true),
puis test par case bash pur. Zero pipe -> pas de course SIGPIPE.

Tests : TESTS.md S43 (base detectee 20/20 sous set -euo pipefail).
@benoitvx
benoitvx merged commit 37afee2 into main Jul 21, 2026
2 checks passed
@benoitvx
benoitvx deleted the fix/vm-run-resource-flags-t7-6 branch July 21, 2026 14:23
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.

1 participant