tawasuyu

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…

docs: sincronizar roadmap con los frentes cerrados + Etapa A

El roadmap (SDD 10, "Estado actual") estaba detrás de la realidad ya verificada
in-VM. Sincroniza:

- Auto-alojamiento puro (variante b): 🚧 → ✅ CERRADO (5 swaps in-VM
  ✓ REPRODUCIBLE, of_tree 9adefb82; binutils 2.45.1 añadido).
- Frente rust/llvm: ✅ CERRADO (mrustc→1.91.1, auto-consistencia in-VM 7fa6cb4e).
  Capstone: los 6 swaps juntos in-VM ✓ REPRODUCIBLE.
- Frente kernel-from-source: ✅ CERRADO (6.16.12 hammer-built bootea + rebuild
  in-VM reproducible; build-deps de-Alpinizados).
- Etapa A: ✅ CERRADA (bootstrap all + manifest).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

5f12692ccfb2aca8ff6931b0776de9027a721b0e · ruwaq sergio · (4 killa ñawpaq) · tayta 98f0b2d22 · kay commitpi sach'ata qhaway

Semántico sayk'uy

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

1 qillqakuna · +39 −4

diff --git a/docs/10-roadmap.md b/docs/10-roadmap.md
index b5a08d15..415fc3fe 100644
--- a/docs/10-roadmap.md
+++ b/docs/10-roadmap.md
@@ -231,7 +231,7 @@ Diseño completo en [SDD 11 — Bootstrap from-scratch](11-bootstrap.md). Resume
   Stage 0 → Stage 1 (booteado en QEMU, arje-zero como PID 1, `CRASHED` real) → **Stage 2
   auto-alojamiento bit-a-bit confirmado** (`✓ REPRODUCIBLE`, host↔VM). Baseline reproducible
   4/4: `of_tree(stage1)=b3:0039b2b9…` (cu=1).
-- 🚧 **En curso — auto-alojamiento *puro* (variante b, [SDD 11 §7.2b](11-bootstrap.md)):** que
+- ✅ **CERRADO — auto-alojamiento *puro* (variante b, [SDD 11 §7.2b](11-bootstrap.md)):** que
   hammer construya el toolchain del builder desde fuente (no Alpine), reemplazando piezas una a una
   con Stage 2 verificando cada paso. **Pieza 1 hecha:** GNU make `4.4.1` (`recipes/make.toml`) se
   compila desde fuente con el lab — estática musl, sellada `b3:fbad44ac…`, reproducible bit-a-bit.
@@ -297,9 +297,44 @@ Diseño completo en [SDD 11 — Bootstrap from-scratch](11-bootstrap.md). Resume
   y validadas (corren, versión correcta, funcionales). El 4/4 mínimo (musl/busybox/hammerd/arje-zero)
   no las invoca, así que no llevan flag `SWAP_*` dedicado: son swapeables con el escape `SWAPS="name=hash:rel"`.
   Avanzan el "builder reconstruible al completo, no todo-Alpine" aunque el verify no las ejercite hoy.
-  **Pendiente:** correr in-VM acumulando los swaps de sandbox
-  (`KVM=1 MEM=24576 SWAP_MAKE=1 SWAP_BUSYBOX=1 SWAP_LINUX_HEADERS=1 SWAP_BWRAP=1 SWAP_COREUTILS=1 ./scripts/selfhost-verify.sh`)
-  para el `✓ REPRODUCIBLE`, y la última pieza grande: rust/llvm (ya hay infra de deps; falta python/cmake/ninja en el toolchain).
+  **✅ CORRIDA in-VM acumulada (2026-06-14): los 5 swaps de sandbox juntos `✓ REPRODUCIBLE`.**
+  `KVM=1 MEM=... SWAP_MAKE=1 SWAP_BUSYBOX=1 SWAP_LINUX_HEADERS=1 SWAP_BWRAP=1 SWAP_COREUTILS=1
+  ./scripts/selfhost-verify.sh` reconstruyó los 4/4 dentro de la VM con el `/toolchain` hammerizado y
+  el `of_tree(stage1')` igualó `9adefb82…` bit a bit (~46 min, sobrevive presión de memoria). Recetas
+  extra de toolchain desde fuente añadidas después: `recipes/binutils.toml` (GNU binutils 2.45.1, CC=gcc
+  porque zig miscompila → segfault, link dinámico, inerte al of_tree porque zig ya provee as/ld/ar;
+  swapeable vía `SWAPS=`).
+- ✅✅✅ **CERRADO — frente rust/llvm (la última pieza grande del toolchain):** cadena purista
+  `mrustc → rustc 1.90.0 → 1.91.0 → 1.91.1` con `x.py` real, reusando un LLVM 20.1.8 externo en todo
+  (sin rebuild). `rust-1.91.1-prefix/bin/{rustc,cargo}` corren standalone (rpath, host musl), versión
+  EXACTA de Alpine. **Auto-consistencia VERIFICADA in-VM (2026-06-18):** `SWAP_RUST=1 KVM=1
+  PRESEED=hammerd ./scripts/selfhost-verify.sh` → `✓ REPRODUCIBLE` bit a bit (host y VM dan
+  `of_tree=7fa6cb4e…` = `RUST_EXPECT_REF`, ≠ `9adefb82…` Alpine). Para el rebuild bit-reproducible
+  se committeó el `Cargo.lock` de arje-zero en tawasuyu + se bumpeó la receta (`--locked`); `PRESEED=hammerd`
+  es OBLIGATORIO (arje-zero vendorea ~1973 crates y un rebuild in-VM completo desborda RAM). Artefactos en
+  `scripts/rust-frontier/`.
+- ✅✅✅ **CAPSTONE (2026-06-19): LOS 6 SWAPS JUNTOS `✓ REPRODUCIBLE` IN-VM** — los 5 tools de sandbox +
+  `SWAP_RUST` a la vez, `of_tree=7fa6cb4e…` bit a bit (~7 min, `MEM=12288 PRESEED=hammerd`, sin swap en el
+  host). El auto-alojamiento del toolchain del builder está COMPLETO; las piezas inertes al 4/4
+  (binutils/pkgconf) quedan salteadas por diseño. Capa de arranque restante (status libc, no vale
+  de-Alpinizar): gcc, m4, libz/libzstd runtime.
+- ✅✅✅ **CERRADO — kernel-from-source ([SDD 11](11-bootstrap.md), último eslabón de soberanía):** el
+  kernel Linux 6.16.12 construido por hammer (`recipes/linux.toml`, `CC=gcc`, monolítico
+  e1000/overlay/userns=y) **BOOTEA la VM del selfhost-verify** y el rebuild in-VM da `✓ REPRODUCIBLE`
+  bit a bit (`HAMMER_KERNEL=1 KERNEL=<bzImage> KVM=1 MEM=16384 PRESEED=hammerd`). Config lean (build
+  ~35→~14 min, bzImage 13→8.7 MB). El muro `pivot_root` (`/` = rootfs absoluto del mount-ns ⇒ bwrap no
+  pivota; quirk que el kernel host enmascaraba) se resolvió con un `/init` wrapper `switch_root` a tmpfs
+  (condicional a `HAMMER_KERNEL=1`, no toca el camino del kernel host). **Build-deps del kernel TODOS
+  de-Alpinizados:** `recipes/{flex,bison}.toml` (kconfig), `recipes/openssl.toml` (3.5.4, certs/extract-cert),
+  `recipes/elfutils.toml` (sólo libelf 0.194 para objtool, con shims musl mínimos). Capa de arranque
+  restante: m4, libz/libzstd, gcc (status libc).
+- ✅ **Etapa A — orquestador `bootstrap all` + log de transparencia exportable:** `hammer_bootstrap::all`
+  encadena stage0→stage1→stage2 en una corrida del host (`hammer bootstrap all --url … --sha256 … --version …`)
+  y deja el `bootstrap.json` poblado; `hammer bootstrap manifest` lo imprime (la superficie de publicación
+  del log, SDD 11 §4). El veredicto `✓ REPRODUCIBLE` lo sigue sellando el rebuild in-VM (`selfhost-verify.sh`),
+  no el host — `all` ancla la referencia para que ese rebuild la compare. **Pendiente de la Etapa A:** el
+  smoke end-to-end de I3 (bus único) contra un init **vivo** (arje+hammerd corriendo) — no reproducible
+  sin la VM, mismo status que cualquier sello in-VM.
 - ✅ **B.2 — `CRASHED` real a la capa de IA (cableado end-to-end):** el `Event::Crashed` del
   bus de agente ya tiene fuente real. **Fuente (arje):** `arje-bus` ganó `BusRequest::Subscribe`
   + `BusPayload::Event(BusEvent)`; arje-zero difunde en `on_death` `EnteCrashed{id,label,status}`