From 5f12692ccfb2aca8ff6931b0776de9027a721b0e Mon Sep 17 00:00:00 2001 From: sergio Date: Fri, 19 Jun 2026 19:12:12 -0400 Subject: [PATCH] docs: sincronizar roadmap con los frentes cerrados + Etapa A MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- docs/10-roadmap.md | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) 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= 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}`