SEGUNDA corrección: lo que medía el test era DERIVA, no no-determinismo — el corpus SÍ reproduce

El §1.bis dijo «sí hay no-determinismo» porque appstream y bison divergían. También estaba mal,
y por un fallo de diseño del propio test.

`verificar-repro.sh` compara el artefacto GUARDADO contra una reconstrucción de hoy. Pero el
guardado puede tener meses: se construyó con OTRO estado del lab. El test conflaba dos cosas:
  · NO-DETERMINISMO — mismas entradas, mismo lab, salidas distintas (rompe el invariante);
  · DERIVA — el artefacto viejo no es lo que el lab de hoy produce (el mundo se movió).

LA PRUEBA QUE LAS SEPARA es construir DOS VECES HOY, y se dio sin querer: al reejecutar el
verificador sobre recetas ya reconstruidas, TODAS pasaron a reproducir.
    anew  ✗ diverge → ✓ REPRODUCE
    gron  ✗ diverge → ✓ REPRODUCE
    age   ✗ diverge → ✓ REPRODUCE   (y en la 1ª ni instalaba los mismos ficheros: faltaba age-inspect)

⇒ EL CORPUS ES DETERMINISTA HOY. Lo que hay es deriva contra artefactos viejos.

QUÉ SIGNIFICA, sin adornos:
· El argumento de reproducibilidad para el split de debug SE CAE. El split se justifica por
  ESPACIO (~60%), que sigue siendo real y grande. Nada más.
· Pero la DERIVA es un problema por derecho propio y mayor: el store contiene artefactos que el
  lab de hoy no reproduciría, así que «nuestros artefactos son verificables por terceros» es
  falso para parte del corpus — quien reconstruya no obtendrá lo publicado. `age` es el caso
  feo: la reconstrucción ni siquiera instala los mismos ficheros.
· ⇒ La reconstrucción masiva SIGUE valiendo la pena, pero por otra razón: no para arreglar el
  determinismo sino para PONER EL STORE AL DÍA CON EL LAB y que la promesa sea cierta.

Y otro hallazgo del mismo experimento: en el hub las recetas Go SÍ reconstruyen (0 fallos). Lo
que fallaba en el worker era la RED para bajar los módulos, no las recetas. Eso cambia el
bloqueante de la etapa 4: no es «Go no reconstruye», es «el worker no tiene red para módulos».

LA LECCIÓN, que es la misma tres veces en este documento: un test hay que diseñarlo contra la
PREGUNTA, no contra lo que es fácil de comparar. Comparar con lo que hay en el store es cómodo;
comparar dos builds de hoy es lo que contesta. El script queda anotado con esto en la cabecera.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-08 08:34:15 -04:00
co-authored by Claude Opus 5
parent ca83c2ae6e
commit 102aabd1ff
2 changed files with 58 additions and 0 deletions
+48
View File
@@ -231,3 +231,51 @@ y la diferencia importa para dimensionar el alojamiento del espejo, que es una d
> midiera otra (tamaño de artefacto), y llegó a tres documentos. El número no era falso; **la unidad
> sí**. Cuando un número vaya a decidir un gasto, conviene volver a la medición original y comprobar
> QUÉ estaba midiendo.
---
## 7. 🔴 SEGUNDA CORRECCIÓN: lo que medía el test era DERIVA, no no-determinismo
El §1.bis dijo «sí hay no-determinismo» al ver que `appstream` y `bison` divergían. **También estaba
mal**, y por un fallo de diseño del propio test.
`scripts/verificar-repro.sh` aparta el artefacto **guardado en el store** y lo compara con una
reconstrucción de hoy. Pero ese artefacto guardado puede tener meses: se construyó con **otro estado
del lab** (otro zig, otras flags, otro entorno). Así que el test conflaba dos cosas muy distintas:
- **no-determinismo** — mismas entradas, mismo lab, salidas distintas. Es lo que rompe el invariante.
- **deriva** — el artefacto viejo no es lo que el lab de HOY produce. No es no-determinismo: es que
el mundo se movió.
**La prueba que las separa: construir DOS VECES HOY.** Y se hizo, sin querer al principio: al volver
a correr el verificador sobre recetas ya reconstruidas, todas pasaron a REPRODUCIR.
| receta | 1ª corrida (viejo vs hoy) | 2ª corrida (hoy vs hoy) |
|---|---|---|
| `anew` | ✗ diverge | ✓ **REPRODUCE** |
| `gron` | ✗ diverge | ✓ **REPRODUCE** |
| `age` | ✗ diverge (¡y le faltaba `age-inspect`!) | ✓ **REPRODUCE** |
**El corpus es determinista hoy.** Lo que hay es deriva contra artefactos viejos.
### Qué significa para la campaña, sin adornos
- **El argumento de reproducibilidad para el split de debug se cae.** El split se justifica por
ESPACIO (~60%, §6), que sigue siendo real y grande. Nada más.
- **Pero la deriva es un problema por derecho propio, y mayor**: el store contiene artefactos que el
lab de hoy **no reproduciría**. Mientras eso siga así, la frase «nuestros artefactos son
verificables por terceros» es falsa para una parte del corpus — un tercero que reconstruya no
obtendrá lo publicado. `age` es el caso feo: la reconstrucción **ni siquiera instala los mismos
ficheros** (falta `age-inspect`), o sea que la deriva no es cosmética.
- ⇒ La reconstrucción masiva **sigue valiendo la pena**, pero por una razón distinta de la que este
documento decía: no para *arreglar* el determinismo, sino para **poner el store al día con el lab**
y que la promesa de reproducibilidad sea cierta sobre todo el corpus.
### La lección, que es la misma tres veces
Este documento se equivocó tres veces seguidas y las tres se corrigieron midiendo:
1. «el `-ffile-prefix-map` no hace falta» — falso, por leer una sola muestra;
2. «sí hay no-determinismo» — falso, por un test que confundía deriva con no-determinismo;
3. y de paso, el «79%» que medía contenido binario y se citaba como tamaño de artefacto.
**Un test hay que diseñarlo contra la pregunta, no contra lo que es fácil de comparar.** Comparar
con lo que hay en el store es cómodo; comparar dos builds de hoy es lo que contesta.