diff --git a/crates/hammer-build/src/sandbox.rs b/crates/hammer-build/src/sandbox.rs index 76481d43..0c15fcc3 100644 --- a/crates/hammer-build/src/sandbox.rs +++ b/crates/hammer-build/src/sandbox.rs @@ -187,6 +187,15 @@ impl Sandbox { // repo upstream lo declare (SDD 09 §2). Inerte para builds no-Cargo (musl/busybox lo // ignoran). Ver runbook §8c / SDD 11. ("CARGO_PROFILE_RELEASE_CODEGEN_UNITS", "1"), + // Reproducibilidad de builds Cargo (parte 2): `codegen-units=1` NO basta. El backend + // paralelo de rustc/LLVM (ThinLTO + codegen) lanza un pool de hilos dimensionado por la + // paralelismo disponible, y sus decisiones (orden de import/inline) varían build-a-build + // a >1 hilo ⇒ `arje-zero` divergía ~62 KB entre dos builds host idénticos, mientras un + // build serial (la VM tiene 1 vCPU, o `taskset -c 0`) reproducía bit-a-bit. `JOBS=1` + // limita el jobserver a 1 token ⇒ rustc serializa el backend ⇒ salida estable e + // independiente del nº de CPUs del que reconstruye. Lo cazó Stage 2 variante (b): host + // (paralelo) daba `0039b2b9…` no-reproducible vs VM (serial) `9adefb82…`. Ver SDD 09 §2. + ("CARGO_BUILD_JOBS", "1"), ]; if self.cache_dir.is_some() { defaults.push(("ZIG_GLOBAL_CACHE_DIR", "/cache/zig"));