docs: SDD 15 §H3c hecho — el linker de contenido (grano intra-función por hash, Merkle-DAG de código)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +37 −7
diff --git a/docs/15-frontier-ai-native.md b/docs/15-frontier-ai-native.md
index 5f2a36a7..ec860015 100644
--- a/docs/15-frontier-ai-native.md
+++ b/docs/15-frontier-ai-native.md
@@ -203,10 +203,38 @@ proyecto, no una fase.
hash; compartir *resultados* es seguro por reproducción — juntos, la foto completa de «el hash es
el espacio de nombres común».
-**Frontera honesta.** No prometer "una distro donde paquete = función = proceso": H3b demostró
-que el **núcleo** del modelo (definir por hash, nombres como metadata, actualizar sin romper,
-componer por hash) se sostiene sobre wasm, no que el grano fino intra-función o el colapso total
-lo hagan. Es la idea más disruptiva; su núcleo ya está verde, su ambición máxima sigue abierta.
+- **H3c** ✅ — (exploratorio) **El grano intra-función: el linker de contenido** (2026-07-05,
+ `wawa-memo/src/enlace.rs` + `tests/h3c.rs`, 10 tests; 40 verdes en el crate). H3b dejó las
+ definiciones *opacas*: una función wasm no podía llamar a otra — la composición vivía sólo en el
+ árbol (`Termino::Componer`), fuera del bytecode. H3c mete la dependencia **dentro**: una
+ definición importa a otra **por hash** (`import "base" "h:<blake3-hex>"`), y el linker la
+ satisface únicamente con los bytes de la `Base` que hashean exacto a ese `Id` — el contrato de
+ `Termino::Ref`, ahora intra-bytecode. Consecuencias verificadas:
+ **(1) el Merkle-DAG de código** — el hash del callee está embebido en el bytecode del caller ⇒
+ la identidad del caller pinnea transitivamente el DAG entero; la dependencia ENTRA a la
+ identidad; **(2) actualizar no rompe, transitivamente** — «actualizar g» = def nueva + rebind;
+ toda f que embebía `h(g_v1)` sigue llamando los bytes exactos de siempre (v1/v2 coexisten);
+ **(3) los ciclos son imposibles por criptografía**, no por disciplina — un ciclo exigiría un
+ hash que depende del hash que lo contiene (invertir BLAKE3); el DAG es DAG por construcción,
+ idéntico a Unison; **(4) la memoización subsume el DAG** — la clave del compuesto
+ (`blake3(bytecode) ⊕ entrada ⊕ E`) ya cubre sus deps; un cierre INCOMPLETO jamás se cachea (el
+ colgante es un hecho de la base local, no del bytecode — cachearlo envenenaría réplicas);
+ `E` distingue el linker (`vacio` vs `base-v1`) para que los espacios de claves no colisionen;
+ **(5) los paquetes de malla llevan el cierre transitivo** — retener/alterar una dep profunda
+ (a dos aristas del árbol) tumba la ingesta con `RefColgante`, y la portabilidad del compuesto
+ hereda el veredicto más conservador de su DAG (`clasificar_cierre`). Política honesta: cada
+ subllamada corre en instancia fresca con fuel completo (pin en `E`); el presupuesto compuesto
+ no está acotado globalmente — suficiente para el *modelo*, no para un sandbox de producción.
+ Con H3c, de las dos ambiciones abiertas de H3 queda demostrado el **grano intra-función** (en
+ su forma wasm: función llama función por hash); lo aún abierto es el **colapso total**
+ paquete = función = proceso (el lado "proceso" = replay del MonotonicLog, plan OS-CRDT).
+
+**Frontera honesta.** No prometer "una distro donde paquete = función = proceso": H3b+H3c
+demostraron el núcleo del modelo (definir por hash, nombres como metadata, actualizar sin romper
+— ahora también transitivo —, componer por hash *fuera y dentro* del bytecode) sobre wasm, no el
+colapso total ni el grano sub-función (el AST interno de una función sigue siendo opaco: el átomo
+es la función-módulo, no la expresión). Es la idea más disruptiva; su núcleo ya está verde, su
+ambición máxima sigue abierta.
---
@@ -218,6 +246,7 @@ H2a (auditar determinismo wasm) ──► gate de todo H2 (spike wawa)
└► H2b (caché local) ──► H2c (caché de malla) [sólo si H2a da verde]
H3a (design-doc) ──► registrar la visión, barato
└► H3b ✅ (experimento wasm-por-función) [sobre H2 puro: núcleo Unison verde]
+ └► H3c ✅ (linker de contenido: imports por hash, Merkle-DAG intra-función)
```
Recomendación: **H1 primero** (empuja la frontera que ya tenemos, sin apuestas). **H2a** en
@@ -231,6 +260,7 @@ no construir. H2c y H3b son futuro condicionado a verdes previos.
- **No reclama verificación formal del sistema.** H1 estratifica evidencia y la reporta;
"verificado bajo supuestos", no "invulnerable".
- **No promete memoización de malla sin determinismo probado** (H2a es el gate).
-- **No promete el colapso Unison.** H3b (✅) demostró que su *núcleo* (definir por hash, nombres
- como metadata, actualizar sin romper, componer por hash) se sostiene sobre wasm; el colapso
- total (paquete = función = proceso, grano intra-función) sigue siendo ambición, no promesa.
+- **No promete el colapso Unison.** H3b (✅) demostró el *núcleo* (definir por hash, nombres
+ como metadata, actualizar sin romper, componer por hash) y H3c (✅) el *grano intra-función*
+ (función llama función por hash: el Merkle-DAG de código); el colapso total
+ (paquete = función = proceso, grano sub-función) sigue siendo ambición, no promesa.