diff --git a/docs/runbooks/armador-de-kernel.md b/docs/runbooks/armador-de-kernel.md index 2d80e887..ee06645a 100644 --- a/docs/runbooks/armador-de-kernel.md +++ b/docs/runbooks/armador-de-kernel.md @@ -96,6 +96,26 @@ construir**. ⚠ Para construir la receta derivada hay que dejarla **junto a la receta base**, o sus `deps.build` no resuelven. `plan` no escribe en `recipes/` por su cuenta: ese directorio es el corpus compartido. +⚠ **Y al construirla, `hammer build` va SIEMPRE bajo el lock compartido:** + +```sh +flock work/.farm-build.lock ./target/release/hammer --store ./store build recipes/linux-derivada.toml +``` + +`hammer build` comparte `work/sources/-` entre todas las recetas. Dos builds simultáneos +que compartan una dependencia se pisan: uno hace fetch y borra el árbol mientras el otro lo usa, y +**el árbol queda roto para siempre** — reintentar no lo arregla. Medido a escala: al invalidar +`libdrm`, ~93 de 205 recetas KDE murieron con «`/src/.zwrap/cc` is not a full path to an existing +compiler tool», que es el wrapper de zig que la receta deja **en el árbol de fuente**, barrido por el +fetch concurrente de otra. Es el ADR 0012, todavía sin decidir. + +Es el mismo fichero de lock que toman `scripts/farm/farm-worker-loop.sh` y `campana-deuda.sh`, así +que con esto quedan serializados los tres. Deliberadamente **no** está dentro de `hammer build`: los +scripts de la granja ya lo toman por fuera y hammer se bloquearía contra ellos. + +Nada más del armador toca el store: `plan` calcula el `ArtifactHash` con `hammer_build::artifact_hash`, +que es cómputo puro sobre las recetas, y `probe`/`gate`/`bundles`/`closure` sólo leen. + ## 4. El gate de no-regresión — **por objetivo** La regla es «todo dispositivo en uso debe seguir teniendo driver». Aplicada global rechazaría