feat(renaser): Fase 7b — boot siembra la imagen, muere el include_bytes!

El kernel deja de empotrar el userspace por completo. Ya no carga ni un
solo .wasm: es boot quien siembra el disco con el grafo poblado.

- kernel/almacen.rs y manifiesto.rs migran al nucleo compartido `formato`
  (tipos, postcard, BLAKE3, trazado de registros). El kernel pierde los
  include_bytes!, genesis() y sembrar_genesis().
- boot::sembrar_grafo siembra un disco virgen con el bytecode de las apps
  (deduplicado) y el Manifiesto de Genesis anclado en el superbloque.
- cargar_userspace sin rama de siembra; wasm/mod.rs sin TECHO_MEMORIA.
- alias `cargo kernel` -> --manifest-path (esquiva un ICE de cargo con
  formato compartido entre el kernel y boot via artifact-dep).

Verificado en QEMU (screendump): disco virgen -> boot siembra 5 objetos,
el kernel monta su grafo; segundo arranque -> boot respeta el disco, la
cronista persiste. formato: 5/5 pruebas.

Nota: el crate `formato` y los 3 Cargo.toml entraron antes en 43e6b32 por
un `git add -A` de un trabajo concurrente; este commit cierra el resto.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-22 18:29:23 +00:00
parent 43e6b32e15
commit 7695dbf3ce
13 changed files with 415 additions and 342 deletions
+59
View File
@@ -528,3 +528,62 @@ un Manifiesto de Génesis que también vive en el grafo.
nacidas del grafo», y la cronista pinta su segunda celda — la cuenta de
arranques sobrevivió al apagón. El userspace nace del grafo en ambos
casos.
## Fase 7b — La imagen sembrada por `boot`; muere el `include_bytes!` — 2026-05-22
El kernel deja de empotrar el userspace POR COMPLETO. Hasta la 7a, el bytecode
de las cinco apps de génesis aún viajaba dentro del binario del kernel
(`include_bytes!`), como semilla transitoria. La 7b lo mata: es el constructor
de imagen `boot` —en el anfitrión— quien siembra el disco con el grafo ya
poblado. El binario del kernel ya no carga ni un solo `.wasm`.
### Añadido
- **`formato`** — nueva crate: un núcleo `#![no_std]` COMPARTIDO que define el
formato del grafo de objetos en disco. Tipos (`Objeto`, `SuperBloque`,
`Manifiesto`, `EntradaApp`), su (de)serialización `postcard`, la función hash
BLAKE3 (escalar pura) y el trazado de un registro del log
(`componer_registro` / `longitud_registro`). Lo enlazan el kernel bare-metal
Y el anfitrión `boot`: una sola verdad del formato, imposible de divergir
entre los dos lados. 5 pruebas de ida y vuelta. Excluida del workspace, como
el kernel.
- `boot`: `sembrar_grafo` — siembra un disco virgen con el grafo ya poblado.
Graba el bytecode de cada app de génesis como un objeto (deduplicado:
`app.wasm`, usado dos veces, se guarda una sola), compone el Manifiesto de
Génesis con sus regiones y cuotas, lo graba con las aristas hacia los objetos
de bytecode, y forja el superbloque que lo ancla. El `.wasm` se lee de
`kernel/assets/` en tiempo de ejecución.
### Cambiado
- `kernel/manifiesto.rs`: pierde los cuatro `include_bytes!`, el descriptor
`AppGenesis`, `genesis()` y `sembrar_genesis()`. Se reduce a `cargar()` —leer
el manifiesto del grafo— y `region()` —traducir la región en disco a la del
kernel—. Los tipos `Manifiesto` / `EntradaApp` migran a `formato`.
- `kernel/almacen.rs`: los tipos `Objeto` / `SuperBloque`, las constantes del
formato, el hash y el trazado de registros migran a `formato`. El módulo
queda como el almacén VIVO: cursor, índice y E/S contra virtio-blk.
- `kernel_main` / `cargar_userspace`: sin la rama de siembra. Un disco sin
manifiesto anclado ya no se siembra desde el kernel —`boot` lo hace siempre
al forjar la imagen—; el kernel se levanta sin userspace y lo reporta.
- `kernel/Cargo.toml`: deja de declarar `serde` / `postcard` / `blake3` por su
cuenta; los hereda —mismas features, BLAKE3 escalar puro— a través de
`formato`.
- `wasm/mod.rs`: se retira la constante `TECHO_MEMORIA`, ya sin uso (el techo
por-app lo dicta el manifiesto; el valor de génesis vive ahora en `boot`).
- `.cargo/config.toml`: el alias `cargo kernel` pasa de `-p kernel` a
`--manifest-path kernel/Cargo.toml`. Con `formato` compartido entre el kernel
y `boot`, pedir `-p kernel` dentro del workspace —con el kernel a la vez como
dependencia de artefacto— hace caer al resolvedor de features de cargo;
apuntar al manifiesto del kernel lo compila como raíz y esquiva el grafo.
### Verificado
- QEMU (captura headless por el monitor, `screendump`), los dos caminos:
- **Disco virgen** — `boot` imprime «disco de objetos sembrado :: 5 objetos,
manifiesto anclado»; el kernel monta el grafo de `boot` —«grafo montado ::
5 objetos :: raíz ausente», SIN «disco formateado» ni «génesis sembrada»—
e instancia las cinco apps. Pantalla idéntica a la Fase 6.2.
- **Segundo arranque** — `boot` respeta el disco existente («el grafo
perdura»); el kernel carga «6 objetos :: raíz presente» y la cronista pinta
su segunda celda: la persistencia sobrevive a través de un disco sembrado
por `boot`.
- `cargo build -p boot` y `cargo kernel` compilan limpios; `cargo test` de
`formato` — 5/5 en verde.