SDD 26 §2.sexies: tres afirmaciones que el documento hacía sin medir, y cómo se cerraron
El re-empaque determinista, la capa de configuración y el branding visible eran afirmaciones, no mediciones. Quedan con su prueba al lado: why-differs entre dos builds de atuq (85 idénticas, 0 divergen), el testigo escrito como pref de usuario, y la captura de la pantalla real. De la primera salió el contraste que importa: el DERIVADO reproducía y la BASE no. El BuildID de firefox era la hora del build, y build-state.json no lo podía ver porque el hash es input-addressed. Verde y mintiendo. Cerrado, con guardián. La regla que sale del día entero: cuando la duda es «¿llegó al artefacto?», la respuesta no está en el log ni en la receta — está dentro del artefacto.
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +25 −1
diff --git a/docs/26-atuq-envoltorio-gecko.md b/docs/26-atuq-envoltorio-gecko.md
index b4ea2753..de507c2b 100644
--- a/docs/26-atuq-envoltorio-gecko.md
+++ b/docs/26-atuq-envoltorio-gecko.md
@@ -360,6 +360,30 @@ tampoco se podría shipear nunca**, así que la unidad 6 dependía de ésta sin
`.cfg` modificado con `--ro-bind` por encima del artefacto. Editar el fichero en el rootfs habría
escrito sobre un **hardlink del store** y corrompido el artefacto sellado.
+### 2.sexies Lo que quedó PROBADO, y con qué
+
+Tres afirmaciones que este documento venía haciendo sin medir, y cómo se cerraron:
+
+| Afirmación | Prueba |
+|---|---|
+| El re-empaque del `omni.ja` es determinista | `why-differs` entre dos builds de `atuq`: **85 entradas idénticas, 0 divergen** |
+| La capa de configuración se aplica | testigo `atuq.autoconfig.ok` escrito como pref de **usuario** en el perfil |
+| El branding se ve | captura de la pantalla real con `grim` desde dentro de la jaula, y la página de inicio renderizada por el propio navegador con `--headless --screenshot` |
+
+Y el contraste que salió de la primera: **el derivado reproducía y la base no.** El `BuildID` de
+`firefox` era la hora del build, así que dos construcciones con el mismo `ArtifactHash` daban bytes
+distintos — y `build-state.json` no lo podía ver, porque el hash es input-addressed y no se mueve
+por esto. Verde y mintiendo. Cerrado con `MOZ_BUILD_DATE` desde `SOURCE_DATE_EPOCH`, que es el
+mecanismo de hermeticidad que el sandbox ya tenía.
+
+**Dos guardianes nuevos en la fase `install` de `firefox`**, hermanos entre sí, porque los dos fallos
+son de la misma familia —una bandera que el `configure` acepta y el artefacto ignora, muda y a 50
+minutos de distancia—: uno comprueba `MOZ_REQUIRE_SIGNING: false` dentro del `omni.ja`, el otro que
+el `BuildID` sea el que `SOURCE_DATE_EPOCH` obliga.
+
+**La regla que sale de todo el día:** cuando la duda es «¿llegó al artefacto?», la respuesta no está
+en el log del build ni en la receta — está **dentro del artefacto**, y hay que ir a buscarla ahí.
+
## 7. La costura: un host de native messaging en Rust
Todo lo del §6 que no es CSS pasa por **un solo mecanismo**: un proceso Rust que habla native
@@ -387,7 +411,7 @@ siguiente.
| 4.b | Branding + re-empaque de `omni.ja` ✅ v0.2 | el chrome de verdad | — |
| 4.d | **Abrirlo en pantalla** — destapó EXDEV, el lanzador, el `atk` envenenado y la cadena GTK3 estática | «usable», no sólo «sellado» | — |
| 4.e | **v0.3: página de inicio y pestaña nueva** por extensión de sistema; exigió `MOZ_REQUIRE_SIGNING` vacío | y con eso queda destrabada la unidad 6 (`sct`) | rebuild de firefox |
-| 4.c | **`MOZ_BUILD_DATE` determinista en `firefox`** — hoy el `BuildID` es la fecha del build ⇒ el artefacto **no reproduce bit a bit** | el invariante de reproducibilidad | otro build de 4 h + re-sellar atuq |
+| 4.c | `MOZ_BUILD_DATE` determinista ✅ — `BuildID=19700101000001`, de `SOURCE_DATE_EPOCH`, con guardián en la fase install | el invariante de reproducibilidad | — |
| 5 | Host de native messaging (tawasuyu) | los verbos del §6 | 4 |
| 6 | `sct` v1 (extensión + testigo) | el diferenciador que nadie tiene | 5 |
| 7 | Descargas al CAS | 6.2, y alimenta 6.9 | 5 |