205 lineas en 73 ficheros de crates, mas la prosa de CLAUDE.md y del skill, que se me habian quedado afuera de los barridos anteriores (no eran ni recetas ni docs/ ni scripts/). EL BARRIDO ANCHO ESTUVO A UN COMMIT DE ROMPER EL CORPUS ENTERO. El primer intento reescribia los .rs completos, no solo los comentarios. Entre las lineas de codigo que tocaba estaban SIETE etiquetas de separacion de dominio, que son ENTRADA DE HASH: b"hammer-tree-v1" <- el prefijo de ArtifactHash::of_tree (hash.rs:60) b"hammer-seed-v1" la funcion que hashea TODOS los artefactos: b"hammer-stage1-rootfs-v2" cambiarla mueve los 4750 hashes del store b"hammer-product-rootfs-v3" b"hammer-product-attested-v2" b"hammer-builder-rootfs-v1" b"hammer-attest-dev-rootkey-0001!!" <- clave raiz de atestacion, [u8;32] Revertido y rehecho solo sobre comentarios, esquivando ademas las cadenas crudas de Rust (r#"..."#) porque el SYSTEM_PROMPT del traductor tiene lineas que empiezan como comentario. Controles: las 7 etiquetas siguen ahi, el diff toca CERO lineas de codigo, 605 tests en verde y el hash de zlib sigue en b3:dc363f26. La leccion es la misma de toda esta etapa: un literal que parece prosa puede ser entrada de hash, y la unica forma de saberlo es mirar donde se usa.
2.6 KiB
name, description
| name | description |
|---|---|
| granja | Cómo se compila en este proyecto — dónde está el worker, cómo se enchufa, y por qué NO se levantan cajas de pago. Usar al empezar cualquier trabajo de build, cosecha o estado de la granja. |
La granja de takana
Lo primero, porque cuesta dinero equivocarse
Se compila en dev.gioser.net — un LXC PRESTADO, coste €0. 6 cores, 16 G RAM + 8 G swap, 196 G.
Se usa exactamente para no gastar Hetzner.
NO levantar cajas hcloud (farm-up.sh, farm-run.sh) salvo petición explícita del usuario. El
modelo efímero de pago existe, funciona y está documentado, pero está SUPERADO como sitio de trabajo
desde el 2026-09-05. Un farm-up por reflejo gasta euros que no hacen falta.
ssh -i ~/.ssh/github5 root@dev.gioser.net # github5 está en su authorized_keys
ssh -i ~/.ssh/sergio root@dev.gioser.net # la otra válida; NO hay entrada en ~/.ssh/config,
# por eso un `ssh` a secas da "Permission denied" y
# parece que la caja rechaza — no ofrece clave, nada más
Antes de decir «no hay worker»
scripts/farm/.fleet (<nombre> <ip> por línea) es lo que conecta hub y worker, y está en
.gitignore. Un hub recién clonado nace con la flota vacía: la cosecha dice «flota vacía» cada
30 minutos, los artefactos del worker no vuelven, y nada falla. estado-granja.sh dirá «no hay
worker vivo» aunque el worker esté compilando. Comprobar el fichero antes de creerle al informe:
cat scripts/farm/.fleet || echo "dev.gioser.net 154.197.1.13" > scripts/farm/.fleet
Reglas que no son estilo
- Todo
takana buildbajoflock -o work/.farm-build.lock. El-ono es opcional: sin él un proceso fugado hereda el fd y deja la granja sin compilar, en silencio. Ver regla 1 de CLAUDE.md. - Un lock tomado sin build a la vista se diagnostica con
fuser -v work/.farm-build.lock, que nombra al fugado. Pasó dos veces el mismo día. - Antes de contar nada del corpus, mirar
docs/state/build-state*.json— hay uno por cola (corpus, kde, gnome, cosmic, wlr) y el cron los regenera los cinco cada 30 min. No recontar a mano. - Nada se borra por nombre.
gioseres el hub del usuario, fijo y sin backup.
Qué hace el latido
cosecha-cron.sh cada 30 min: siembra código hub→worker (rsync --delete, excluye
work/store/target/.git), baja el manifiesto de sellados del worker (no el store — bajarlo
deshacía la poda cada media hora), regenera los cinco grafos, y commitea+pushea el estado.