H4c: superficies OBSERVADAS — colisión de fichero en install sin declarar slots (SDD 15 §H4)

La misma subida de H1 (prometer -> verificar), ahora sobre topología: la superficie más
común de un paquete es el conjunto de paths que escribe, y esos paths ya están declarados
en el .swm (target_bin + file_drop.path), conocidos ANTES de hidratar.

- compat::output_paths(swm) lee esos paths; compat::path_collisions(db, name, paths) detecta
  cuáles ya posee OTRO paquete instalado (reusa InstalledDb.files + owner_of, cero declaración
  nueva). Reinstalar el mismo paquete sobre sus propios paths NO colisiona (upgrade).
- Gate en `install` corre el chequeo observado JUNTO al declarado (H4b): pisar el fichero de
  otro paquete = caso logo a nivel de fichero (elección) -> aborta salvo --force-slots.
- Verificado e2e REAL (tests/compat_gate.rs, shell-ea al binario hammer): dos paquetes
  escriben /share/logo.png; el 2do aborta con "COLISIÓN de fichero" sin escribir nada; con
  --force-slots la elección se respeta y el fichero se escribe.

Un paquete SIN declarar slots ya participa del gate por lo que de verdad toca.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 20:17:17 -04:00
co-authored by Claude Opus 4.8
parent 27066776b3
commit 9be7bdd707
5 changed files with 270 additions and 7 deletions
+21 -3
View File
@@ -320,8 +320,25 @@ La definición dura de compatibilidad de una config `C` contra mi estado `E`:
instalación detecte la colisión). `hammer install --help` expone `--force-slots`.
Frontera que queda: definir el **espacio de slots** del sistema (qué es una "superficie": un
fichero, un módulo wasm de wawa, un componente) — ahí está el diseño real, no en el álgebra
(que ya está). Hoy el productor de recetas declara los slots a mano; falta la **convención**
y, más allá, **derivarlos** de lo que el paquete de verdad toca.
(que ya está).
- **H4c** ✅ — **Superficies OBSERVADAS: "no prometas, observá".** H4b confía en que el AUTOR
declare `slots`; la misma subida que hizo H1 (de *prometer* a *verificar*) aplica acá: la
superficie más común y observable de un paquete es **el conjunto de paths que escribe**, y
esos paths YA están declarados en el `.swm` (`target_bin` de cada source_patch, `path` de
cada file_drop) — se conocen **antes de hidratar**, así que el gate aborta sin tocar nada.
- `compat::output_paths(swm)` lee esos paths; `compat::path_collisions(db, name, paths)`
detecta cuáles ya posee **otro** paquete instalado (reusa `InstalledDb.files` + el nuevo
`owner_of` — cero declaración nueva en la receta). Reinstalar el mismo paquete sobre sus
propios paths NO colisiona (es upgrade).
- `hammer install` corre este chequeo **junto** al declarado: pisar el fichero de otro
paquete es el caso *logo* a nivel de fichero (elección) ⇒ aborta salvo `--force-slots`.
- **Verificado e2e real** (`tests/compat_gate.rs`, shell-ea al binario `hammer`): dos paquetes
escriben `/share/logo.png`; el segundo aborta con "COLISIÓN de fichero" **y no escribe nada**;
con `--force-slots` la elección se respeta y el fichero se escribe.
Con H4c, un paquete **sin declarar slots** ya participa del gate por lo que de verdad toca.
Lo que queda abierto es **derivar la otra mitad** (los `requires` observados: de qué depende
el paquete) y subir el grano del path-slot a superficies más ricas (un módulo wasm de wawa,
un componente), además del **colapso** con el lado proceso.
**Frontera honesta.** H4a demuestra el *álgebra* sobre hashes abstractos; lo que **no**
resuelve es la **granularidad de los slots** — dos configs pueden no colisionar en el slot
@@ -382,7 +399,8 @@ H3a (design-doc) ──► registrar la visión, barato
└► H3c ✅ (linker de contenido: imports por hash, Merkle-DAG intra-función)
└► H4a ✅ (config = conjunto de slots por hash: compatible/completa/segura)
└► H4b ✅ (slots en la receta/.swm real + gate en `hammer install`)
└► [proceso] replay del MonotonicLog ──► plan OS-CRDT (otro agente)
└► H4c ✅ (superficies OBSERVADAS: colisión de fichero, sin declarar slots)
└► [proceso] replay del MonotonicLog ──► plan OS-CRDT (otro agente)
```
Recomendación: **H1 primero** (empuja la frontera que ya tenemos, sin apuestas). **H2a** en