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>
This commit is contained in:
2026-07-05 06:20:07 -04:00
co-authored by Claude Fable 5
parent 6c655642b6
commit 3ff1823e38
+37 -7
View File
@@ -203,10 +203,38 @@ proyecto, no una fase.
hash; compartir *resultados* es seguro por reproducción — juntos, la foto completa de «el hash es hash; compartir *resultados* es seguro por reproducción — juntos, la foto completa de «el hash es
el espacio de nombres común». el espacio de nombres común».
**Frontera honesta.** No prometer "una distro donde paquete = función = proceso": H3b demostró - **H3c** ✅ — (exploratorio) **El grano intra-función: el linker de contenido** (2026-07-05,
que el **núcleo** del modelo (definir por hash, nombres como metadata, actualizar sin romper, `wawa-memo/src/enlace.rs` + `tests/h3c.rs`, 10 tests; 40 verdes en el crate). H3b dejó las
componer por hash) se sostiene sobre wasm, no que el grano fino intra-función o el colapso total definiciones *opacas*: una función wasm no podía llamar a otra — la composición vivía sólo en el
lo hagan. Es la idea más disruptiva; su núcleo ya está verde, su ambición máxima sigue abierta. á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] └► H2b (caché local) ──► H2c (caché de malla) [sólo si H2a da verde]
H3a (design-doc) ──► registrar la visión, barato H3a (design-doc) ──► registrar la visión, barato
└► H3b ✅ (experimento wasm-por-función) [sobre H2 puro: núcleo Unison verde] └► 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 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; - **No reclama verificación formal del sistema.** H1 estratifica evidencia y la reporta;
"verificado bajo supuestos", no "invulnerable". "verificado bajo supuestos", no "invulnerable".
- **No promete memoización de malla sin determinismo probado** (H2a es el gate). - **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 - **No promete el colapso Unison.** H3b (✅) demostró el *núcleo* (definir por hash, nombres
como metadata, actualizar sin romper, componer por hash) se sostiene sobre wasm; el colapso como metadata, actualizar sin romper, componer por hash) y H3c (✅) el *grano intra-función*
total (paquete = función = proceso, grano intra-función) sigue siendo ambición, no promesa. (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.