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

Cada app tiene ahora su propia ranura de estado en el Manifiesto de
Génesis (EntradaApp.estado): guarda y recobra lo suyo, sobrevive al
reinicio, y no pisa a ninguna otra app.

- apps/memoriosa: app WASM interactiva nueva. Cuenta las teclas pulsadas
  y persiste el recuento; al reiniciar despierta con su cuenta intacta.
  Reemplaza la 2a instancia de hola en la genesis.
- kernel: capacidades sys_estado_cargar / sys_estado_guardar. El kernel
  custodia un manifiesto VIVO (Mutex<Manifiesto>); fijar_estado lo muta,
  lo re-graba en el grafo y lo re-ancla. ContextoCapacidades.indice_app
  da a cada app su identidad — su ranura, jamas la de otra.
- cargar_userspace instala el manifiesto vivo antes de instanciar las
  apps: el init de una app ya consulta su estado al despertar.

Verificado en QEMU (screendump + sendkey): disco virgen -> memoriosa con
0 celdas, testigo verde; 5 pulsaciones -> 5 celdas; reinicio -> 5 celdas
intactas, testigo ambar (init releyo el estado del grafo).

Cierra la Fase 7 — el userspace nace del grafo, completa.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-22 18:43:58 +00:00
parent 6a0781c0a8
commit 900cd19e49
15 changed files with 492 additions and 35 deletions
+43
View File
@@ -587,3 +587,46 @@ poblado. El binario del kernel ya no carga ni un solo `.wasm`.
por `boot`.
- `cargo build -p boot` y `cargo kernel` compilan limpios; `cargo test` de
`formato` — 5/5 en verde.
## Fase 7c — Persistencia inter-sesión: cada app recuerda lo suyo — 2026-05-22
La cronista dejaba huella, pero en la RAÍZ del grafo — un ancla única que sólo
una app puede usar. La 7c estrena la persistencia POR-APP: cada `EntradaApp`
del Manifiesto de Génesis tiene su propia ranura `estado`, y una app guarda y
recobra lo suyo sin pisar a nadie. El estado de cada aplicación sobrevive, por
separado, a un reinicio.
### Añadido
- **`apps/memoriosa`** — nueva app WASM interactiva. Cuenta las teclas pulsadas
en toda su historia y persiste el recuento; al reiniciar, despierta con su
cuenta intacta. Una celda violeta por pulsación; el testigo de la esquina es
verde si nació limpia, ámbar si despertó con memoria de una vida anterior.
- `kernel` — dos capacidades del host nuevas:
- `sys_estado_cargar(salida, capacidad)` — copia el estado persistido de la
app que llama en su memoria lineal; 0 si aún no tiene estado previo.
- `sys_estado_guardar(datos, datos_len)` — graba `datos` como objeto del
grafo y ancla su hash en la `EntradaApp` de la app, re-grabando y
re-anclando el manifiesto.
- `manifiesto.rs` — el manifiesto VIVO: `VIVO`, un `Mutex<Manifiesto>` que el
kernel custodia. `instalar` (en el arranque), `estado_de` (lee la ranura de
una app) y `fijar_estado` (la muta, re-graba el manifiesto y lo re-ancla).
- `ContextoCapacidades` gana `indice_app`: la identidad de cada app en el
manifiesto, con la que las capacidades de estado hallan SU ranura — jamás la
de otra.
### Cambiado
- `AplicacionWasm::cargar` y `encender_app` reciben el `indice_app` de la app.
- `cargar_userspace` instala el manifiesto VIVO ANTES de instanciar las apps:
el `init` de una app ya consulta su estado persistido al despertar.
- `almacen::fijar_manifiesto` deja de ser `dead_code` — lo invoca `fijar_estado`.
- La génesis (`boot`) sustituye la segunda instancia de `hola` por `memoriosa`
(región 700,120 de 360×80).
### Verificado
- QEMU (captura headless + `sendkey` por el monitor):
- **Disco virgen** — memoriosa arranca con 0 celdas y el testigo verde.
- **Cinco pulsaciones** (`sendkey`) — memoriosa pinta 5 celdas violetas y
persiste el recuento; `sys_estado_guardar` re-ancla el manifiesto.
- **Reinicio** — `boot` respeta el disco; memoriosa despierta con las 5
celdas intactas y el testigo en ámbar: su `init` releyó el estado del
grafo. El estado por-app sobrevivió al apagón.