diff --git a/docs/15-frontier-ai-native.md b/docs/15-frontier-ai-native.md index 26090726..05b4daef 100644 --- a/docs/15-frontier-ai-native.md +++ b/docs/15-frontier-ai-native.md @@ -101,10 +101,17 @@ capacidad expuesta (tiempo, random, I/O) filtre no-determinismo a la salida hash spike de wawa, no de hammer. **Tickets (spike, no fase):** -- **H2a** — Auditar determinismo del runtime wasm de wawa: enumerar toda fuente de no-determinismo +- **H2a** ✅ — Auditar determinismo del runtime wasm de wawa: enumerar toda fuente de no-determinismo alcanzable por una app (`wawa-kernel/src/wasm/`), y definir el subconjunto "puro" (módulo + entrada explícita, sin syscalls no deterministas). Salida: un doc `wawa/SDD` §determinismo con el veredicto honesto (qué es puro, qué no). + **Hecho (2026-07-03):** `tawasuyu/03_ukupacha/wawa/SDD-determinismo.md`. Veredicto: el subconjunto + puro **ya existe** en el código (`ejecutar_dinamico`/`_v2`, `wasm/mod.rs:335,430` — linker VACÍO + + reloj virtual + fuel/memoria fijos + wasmi 1.0 sin simd). H2a no era construirlo sino **sellarlo**: + contrato de clave `blake3(módulo)⊕blake3(entrada)⊕E` con `E` = hash-de-entorno (pin wasmi/features/ + fuel/mem/ABI); único vector residual acotado = payload de NaN vía `reinterpret` (sólo cross-build, + irrelevante para H2b local). La superficie de capacidades (`env/*.rs`) reintroduce no-determinismo + o efectos ⇒ NO memoizable; sólo la vía linker-vacío lo es. - **H2b** — Prototipo de `blake3(módulo)+blake3(entrada) → blake3(salida)` como caché local (un `LwwMap` de `shared/crdt`), sin malla todavía. Test: misma entrada ⇒ hit; recompute ⇒ byte-idéntico (o el determinismo está roto y H2a mintió).