gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

getty→agetty no es migrar un exec: agetty NO está en el rootfs del producto

Hice la migración, verifiqué la sintaxis contra el binario sellado, actualicé los
dos tests que afirmaban el valor viejo, puse 42 pruebas en verde… y el cambio
habría dejado el arranque SIN CONSOLA. Revertido.

Lo que falta no es sintaxis: `agetty` acepta el argv del applet tal cual —las dos
formas de orden, `-n` (--skip-login) y `-l` (--login-program) con la misma
semántica—, comprobado ejecutándolo, no leyendo su manual.

Lo que falta es el BINARIO. La card `console-getty` vive en STAGE1_SEED_CARD, o
sea en la seed del núcleo, y el rootfs del núcleo tiene cuatro componentes:
musl, busybox, hammerd, arje-zero. util-linux no está ahí, ni en
USERLAND_COMPONENTS ni en SERVICE_COMPONENTS. Medido en los artefactos:

  stage1-rootfs  1a3823b4  sbin/agetty NO existe · sbin/getty sí (busybox)
  product-rootfs 86398943  sbin/agetty NO existe · sbin/getty sí

Que util-linux esté en los 7 perfiles de targets.toml NO lo pone en el rootfs del
producto: el producto se ensambla de esas tres listas, no del catálogo. Es
catalogo-no-es-imagen otra vez, y esta vez me la tragué entera — con
`supervision: Restart` la card habría reintentado un binario inexistente para
siempre y el arranque habría quedado mudo, que es el fallo que sólo aparece en
metal y tarde.

⇒ Es una decisión de arquitectura, no una línea: (1) meter util-linux en
STAGE1_COMPONENTS —el núcleo pasa de 4 a 5, cambia el of_tree del self-host, es
ADR— o (2) mover la card de consola a la capa de producto, que no toca el núcleo
pero deja al stage1 sin consola o con dos cards distintas.

⚠ Y un getty no se valida con pruebas unitarias: los 42 tests pasaban con la card
rota. Intenté ejercitar agetty contra un pty real, con setsid y como root, y no
ejecuta el programa de login — su contrato necesita ser el tty de control de una
sesión de arranque. La prueba es product-boot-test.sh en QEMU, que esta jaula no
tiene.

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

03bfca3864a9038a12dc01570511eda3f4c7e9b3 · ruwaq Sergio · (1 killa ñawpaq) · tayta b09af85ec · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

1 qillqakuna · +53 −0

diff --git a/docs/plan-botar-busybox.md b/docs/plan-botar-busybox.md
index f7d3769b..b22de54f 100644
--- a/docs/plan-botar-busybox.md
+++ b/docs/plan-botar-busybox.md
@@ -1617,3 +1617,56 @@ reproducibilidad:
 
 Y los **47 applets** del censo, que ya no viajan en ninguna imagen pero siguen siendo el inventario
 de lo que el producto tendría que proveer por otra vía el día que el frente C se cierre.
+
+## `getty → agetty` NO es migrar un `exec` — corrección (2026-09-22)
+
+Este documento decía, y yo lo repetí: «`getty` deja de ser escritura y pasa a ser **migrar el
+`exec` de la card**, porque `agetty` de util-linux ya está en los 7 perfiles». **Es falso, y el
+cambio hecho a ciegas deja el arranque SIN CONSOLA.**
+
+Lo que falta no es sintaxis. Eso sí se verificó y está bien: `agetty` acepta el argv del applet tal
+cual —documenta las dos formas, `<line> [<baud>]` y `<baud>,... <line>`, y admite `-n`
+(`--skip-login`) y `-l` (`--login-program`) con la misma semántica—, comprobado contra el binario
+sellado y no contra la documentación.
+
+**Lo que falta es el binario.** La card `console-getty` vive en `STAGE1_SEED_CARD`, o sea en la
+seed del **núcleo**, y el rootfs del núcleo tiene exactamente **cuatro** componentes:
+
+```rust
+const STAGE1_COMPONENTS: &[&str] = &["musl", "busybox", "hammerd", "arje-zero"];
+const USERLAND_COMPONENTS: &[&str] = &["uutils", "findutils", "findutils-xargs", "diffutils", "ripgrep"];
+const SERVICE_COMPONENTS:  &[&str] = &["netup", "openssh"];
+```
+
+`util-linux` **no está en ninguna de las tres**. Comprobado en los artefactos sellados, que es donde
+se ve y no en `targets.toml`:
+
+| | `sbin/agetty` | `sbin/getty` |
+|---|---|---|
+| `stage1-rootfs` (`1a3823b4…`) | **no existe** | ✅ (symlink a busybox) |
+| `product-rootfs` (`86398943…`) | **no existe** | ✅ |
+
+Que `util-linux` esté en los 7 perfiles de `targets.toml` **no lo pone en el rootfs del producto**:
+el producto se ensambla de esas tres listas, no del catálogo. Es la distinción
+[[catalogo-no-es-imagen]] otra vez, y esta vez me la tragué entera: la habría dejado apuntando a un
+binario inexistente, con `supervision: Restart` reintentando para siempre y el arranque sin consola
+— que es justo el fallo que sólo se ve en metal, tarde.
+
+### Entonces, qué es de verdad
+
+Una decisión de arquitectura, no una línea:
+
+1. **Meter `util-linux` en `STAGE1_COMPONENTS`** — el núcleo pasa de 4 a 5 componentes, cambia el
+   `of_tree` del self-host y toca la evidencia de reproducibilidad. **Es ADR.**
+2. **Mover la card de consola a la capa de producto** y añadir `util-linux` a
+   `USERLAND_COMPONENTS` — no toca el núcleo, pero entonces **el stage1 se queda sin consola** (o
+   conserva la suya de busybox y hay dos cards distintas, una por capa).
+
+Las dos son defendibles y ninguna es «migrar un exec». Lo que queda medido y aprovechable es que el
+argv no cambia: cuando se decida, el `exec` es lo único que se toca.
+
+⚠ **Y la validación de un getty no se hace con pruebas unitarias.** Se intentó ejercitar `agetty`
+contra un pty real —con `setsid`, y también como root— y **no ejecuta el programa de login**: su
+contrato necesita ser el tty de control de una sesión de arranque. Los 42 tests del crate pasaban
+con la card cambiada y el producto habría arrancado mudo. La prueba es `scripts/product-boot-test.sh`
+en QEMU, que esta jaula no tiene.