> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
build: SOURCE_DATE_EPOCH + TZ=UTC en el sandbox (determinismo pre-Stage 2)
Stage 2 compara el content-hash (of_tree) de stage1 vs stage1' rebuildeado; para
que coincidan, el build debe ser determinista. Las rutas ya lo son (el source se
bindea en /src, constante entre rebuilds); el knob que faltaba es el timestamp:
SOURCE_DATE_EPOCH=1 (+ TZ=UTC) fija los que tar/ar/gzip y __DATE__/__TIME__ embeben.
No cambia ningún ArtifactHash (input-addressed) ⇒ caché intacta; sólo normaliza
los bytes de salida de builds futuros. Plan C.2 #5.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
diff --git a/crates/hammer-build/src/sandbox.rs b/crates/hammer-build/src/sandbox.rs
index 20e1d98b..5e7a559c 100644
--- a/crates/hammer-build/src/sandbox.rs
+++ b/crates/hammer-build/src/sandbox.rs
@@ -165,6 +165,12 @@ impl Sandbox {
("AR", "zig ar"),
("LC_ALL", "C"),
("LANG", "C"),
+ // Reproducibilidad (pre-Stage 2): fija los timestamps que muchas herramientas embeben
+ // (tar, ar, gzip, __DATE__/__TIME__ vía SOURCE_DATE_EPOCH). Valor fijo y arbitrario
+ // (1970-01-01 00:00:01). Las rutas ya son deterministas: el source se bindea en `/src`
+ // (constante entre rebuilds, sea cual sea el work dir del host). Ver SDD 11 / runbook.
+ ("SOURCE_DATE_EPOCH", "1"),
+ ("TZ", "UTC"),
];
if self.cache_dir.is_some() {
defaults.push(("ZIG_GLOBAL_CACHE_DIR", "/cache/zig"));