arranque-grafo: hammer boot menu — orquestador del menú + wiring en el init (ADR 0010)

hammer boot menu ata las tres piezas del contrato: emite el grafo → lanza el
compositor (mirada, --compositor configurable) → activa el nodo que el usuario
dejó en boot-select. Graceful: sin compositor (servidor headless) emite el grafo
y sigue el arranque. Refactor: activate_and_report compartido con boot activate;
--out/--select configurables (testeable sin /run/hammer root-only).

Wiring: iso-image INSTALLER=1 + install-image-efi bundlean el CLI hammer (static
musl) al sistema instalado (el producto trae arje-zero/hammerd pero no el CLI);
el wrapper /sbin/init lo invoca tras hammer-recover, salida al serial (no pinta
tty0 ⇒ respeta cero-parpadeo). Cierra la pieza #3 del handoff mirada (quién
lanza el menú en el boot): lo ownea hammer, desde el hook de init.

Tests: boot_menu.rs (3 caminos del glue: graceful/sin-selección/selección→activate)
+ efi-disk-boot-test asevera que el menú corre. Validado en OVMF: pivote →
INIT-OK → menú (emite boot-graph.json + saltea sin mirada) → arje-zero.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-10 21:30:30 -04:00
co-authored by Claude Opus 4.8
parent c7d1d9cf5c
commit a5be781ef6
6 changed files with 203 additions and 11 deletions
+1
View File
@@ -41,6 +41,7 @@ info 'EFI stub: Loaded initrd' 'EFI-stub cargó kernel+i
info 'EXT4-fs \(vda2\): mounted' 'kernel montó hammer-root (kernel-side)'
check 'HAMMER-EFI-DISK-PIVOT-OK' 'initramfs pivote resolvió hammer-root y va a switch_root'
check 'HAMMER-EFI-INIT-OK' 'switch_root → arje-zero PID1 (init real corriendo)'
check 'hammer boot menu: grafo en' 'menú de arranque por grafo corrió (ADR 0010: emite boot-graph.json)'
reject_panic() { if clean | grep -aqiE 'HAMMER-EFI-FALLO|Kernel panic'; then echo " ✗ hubo FALLO/panic de pivote"; fail=1; else echo " ✓ sin FALLO ni panic"; fi; }
reject_panic