gioser

tawasuyu/brahman

Rust 567TOML 214Markdown 67JSON 198130 Definiciones

⎇ main renaser/FASE7.md Markdown · 97 líneas · 5.1 KB Historia crudo

feat(renaser): Fase 7c — persistencia inter-sesión por-app 900cd19e4 · sergio ·

1# renaser — Fase 7 :: Apps que nacen del Grafo
2
3Plan de ataque. Para el estado general ver `ROADMAP.md`; para la arquitectura,
4`ARCHITECTURE.md`.
5
6## El objetivo
7
8Hoy el kernel lleva el userspace **empotrado en su propio binario**:
9`main.rs` tiene cuatro `include_bytes!` (`app.wasm`, `discola.wasm`,
10`glotona.wasm`, `cronista.wasm`) y cinco llamadas `encender_app` con regiones
11escritas a mano. Eso contradice la tesis de renaser: el almacenamiento es un
12**grafo de objetos direccionado por contenido**, no un binario monolítico.
13
14La Fase 7 **destruye el `include_bytes!` del userspace**. Las aplicaciones
15pasan a ser objetos del grafo; el kernel las descubre, las verifica por su
16hash y las inyecta en caliente en `wasmi`. Qué apps arrancan, con qué cuota y
17en qué región lo dicta un **Manifiesto de Génesis** que también vive en el
18grafo. (La fuente `font.ttf` sigue empotrada: es del kernel, no del userspace.)
19
20## El problema de la génesis
21
22Hay un huevo-y-gallina: el kernel lee el manifiesto para saber qué cargar,
23pero el manifiesto y el bytecode tienen que haber sido escritos antes. En un
24disco virgen no hay nada. Dos vías para sembrarlo:
25
26- **A — el kernel siembra.** En un disco sin manifiesto, el kernel graba en el
27  grafo el bytecode de unas apps de génesis y un manifiesto por defecto. El
28  bytecode de génesis llega vía `include_bytes!` — todavía.
29- **B — `boot` siembra la imagen.** El constructor de imagen (anfitrión)
30  pre-puebla el disco con los objetos de bytecode y el manifiesto. El kernel
31  jamás empotra una app.
32
33B es el estado final puro, pero exige enseñarle a `boot` el formato del grafo
34(objetos, BLAKE3, log, superbloque) — trabajo de anfitrión considerable. Se
35ataca **incremental**, como las Fases 6.1a/b/c.
36
37## Sub-fases
38
39### 7a — El Manifiesto y la carga desde el grafo (semilla por el kernel) — ✅ HECHA
40
411. **`manifiesto.rs`** *(andamiaje ya creado)* — tipos `Manifiesto` /
42   `EntradaApp`, (de)serialización postcard. Hoy es un módulo `no_std` del
43   kernel; no se comparte con las apps (la frontera app↔kernel es el ABI WASM
44   numérico, no tipos Rust).
452. **`almacen.rs`** — el `SuperBloque` gana un segundo ancla,
46   `manifiesto: Option<Hash>`, gemelo de `raiz`. `VERSION` sube de `1` a `2`
47   (un disco v1 se reformatea, como ya hace `init` con discos ajenos).
48   Getters `manifiesto()` / `fijar_manifiesto()`.
493. **`manifiesto::sembrar_genesis()`** — en un disco sin manifiesto: graba el
50   bytecode de las apps de génesis (`include_bytes!`, **sólo aquí**), compone
51   un `Manifiesto` por defecto con sus regiones y cuotas, lo graba y lo ancla.
524. **`manifiesto::cargar()`** — lee el ancla del superbloque, recupera el
53   objeto, lo deserializa.
545. **`kernel_main`** — reemplaza las cinco `encender_app` escritas a mano por:
55   cargar el manifiesto (o sembrarlo si falta) e iterar sus `EntradaApp`.
566. **`wasm/mod.rs`** — el techo de memoria deja de ser la constante
57   `TECHO_MEMORIA` y pasa a venir por-app del manifiesto (`EntradaApp`).
587. **Verificar en QEMU** — la pantalla debe verse idéntica a la Fase 6.2
59   (cinco apps en sus regiones), pero ahora **nacidas del grafo**.
60
61### 7b — La imagen sembrada por `boot`; muere `include_bytes!` — ✅ HECHA
62
63- `boot` (anfitrión) aprende el formato del grafo y pre-puebla la imagen de
64  disco con los objetos de bytecode + el manifiesto.
65- El kernel pierde los `include_bytes!` del userspace; `sembrar_genesis` se
66  retira o queda como camino vacío de respaldo.
67
68### 7c — Persistencia inter-sesión — ✅ HECHA
69
70- Una app (cronista evolucionada, o una nueva interactiva) guarda su estado
71  mutado como un objeto nuevo del grafo al recibir teclado.
72- Cada `EntradaApp` usa su campo `estado: Option<Hash>` (ya previsto en el
73  tipo). Al guardar, el kernel reescribe el manifiesto; al arrancar, le pasa
74  ese estado a la app para que despierte donde quedó.
75- Probablemente una capacidad host nueva para que el kernel se entere del
76  hash de estado nuevo que la app produjo.
77
78## Guardarraíles (directiva de la arquitecta)
79
80- **No romper `check-shared-cores.sh`.** Si algún tipo del manifiesto llegara
81  a compartirse entre apps y kernel, debe habitar un núcleo estrictamente
82  `no_std`. Hoy no se comparte: `manifiesto.rs` es kernel-only.
83- **Errores recuperables con `Result`.** Si el kernel lee del grafo un objeto
84  de bytecode corrupto (su hash recomputado ≠ su id), `almacen::recuperar` ya
85  lo detecta — devuelve `Err`. El kernel **niega esa instanciación**, pinta la
86  baliza de desalojo en la región de esa app, y **sigue levantando el resto**.
87  Un módulo podrido nunca tumba el arranque.
88
89## Estructura de archivos
90
91| archivo | estado | rol en la Fase 7 |
92| --- | --- | --- |
93| `kernel/src/manifiesto.rs` | **nuevo (7a)** | tipos `Manifiesto`/`EntradaApp` + (de)serialización + carga/siembra |
94| `kernel/src/almacen.rs` | a modificar (7a) | `SuperBloque.manifiesto`, `VERSION` 2, getters |
95| `kernel/src/main.rs` | a modificar (7a) | `kernel_main` itera el manifiesto en vez de `include_bytes!` |
96| `kernel/src/wasm/mod.rs` | a modificar (7a) | techo de memoria por-app desde el manifiesto |
97| `boot/` | a modificar (7b) | siembra la imagen de disco con el grafo |

FASE7.md

renaser — Fase 7 :: Apps que nacen del Grafo

Plan de ataque. Para el estado general ver ROADMAP.md; para la arquitectura, ARCHITECTURE.md.

El objetivo

Hoy el kernel lleva el userspace empotrado en su propio binario: main.rs tiene cuatro include_bytes! (app.wasm, discola.wasm, glotona.wasm, cronista.wasm) y cinco llamadas encender_app con regiones escritas a mano. Eso contradice la tesis de renaser: el almacenamiento es un grafo de objetos direccionado por contenido, no un binario monolítico.

La Fase 7 destruye el include_bytes! del userspace. Las aplicaciones pasan a ser objetos del grafo; el kernel las descubre, las verifica por su hash y las inyecta en caliente en wasmi. Qué apps arrancan, con qué cuota y en qué región lo dicta un Manifiesto de Génesis que también vive en el grafo. (La fuente font.ttf sigue empotrada: es del kernel, no del userspace.)

El problema de la génesis

Hay un huevo-y-gallina: el kernel lee el manifiesto para saber qué cargar, pero el manifiesto y el bytecode tienen que haber sido escritos antes. En un disco virgen no hay nada. Dos vías para sembrarlo:

B es el estado final puro, pero exige enseñarle a boot el formato del grafo (objetos, BLAKE3, log, superbloque) — trabajo de anfitrión considerable. Se ataca incremental, como las Fases 6.1a/b/c.

Sub-fases

7a — El Manifiesto y la carga desde el grafo (semilla por el kernel) — ✅ HECHA

  1. manifiesto.rs (andamiaje ya creado) — tipos Manifiesto / EntradaApp, (de)serialización postcard. Hoy es un módulo no_std del kernel; no se comparte con las apps (la frontera app↔kernel es el ABI WASM numérico, no tipos Rust).
  2. almacen.rs — el SuperBloque gana un segundo ancla, manifiesto: Option<Hash>, gemelo de raiz. VERSION sube de 1 a 2 (un disco v1 se reformatea, como ya hace init con discos ajenos). Getters manifiesto() / fijar_manifiesto().
  3. manifiesto::sembrar_genesis() — en un disco sin manifiesto: graba el bytecode de las apps de génesis (include_bytes!, sólo aquí), compone un Manifiesto por defecto con sus regiones y cuotas, lo graba y lo ancla.
  4. manifiesto::cargar() — lee el ancla del superbloque, recupera el objeto, lo deserializa.
  5. kernel_main — reemplaza las cinco encender_app escritas a mano por: cargar el manifiesto (o sembrarlo si falta) e iterar sus EntradaApp.
  6. wasm/mod.rs — el techo de memoria deja de ser la constante TECHO_MEMORIA y pasa a venir por-app del manifiesto (EntradaApp).
  7. Verificar en QEMU — la pantalla debe verse idéntica a la Fase 6.2 (cinco apps en sus regiones), pero ahora nacidas del grafo.

7b — La imagen sembrada por boot; muere include_bytes! — ✅ HECHA

7c — Persistencia inter-sesión — ✅ HECHA

Guardarraíles (directiva de la arquitecta)

Estructura de archivos

archivoestadorol en la Fase 7
kernel/src/manifiesto.rsnuevo (7a)tipos Manifiesto/EntradaApp + (de)serialización + carga/siembra
kernel/src/almacen.rsa modificar (7a)SuperBloque.manifiesto, VERSION 2, getters
kernel/src/main.rsa modificar (7a)kernel_main itera el manifiesto en vez de include_bytes!
kernel/src/wasm/mod.rsa modificar (7a)techo de memoria por-app desde el manifiesto
boot/a modificar (7b)siembra la imagen de disco con el grafo