Files
Sergio b818f5249f takana etapa 5d: comentarios de crates, CLAUDE.md y el skill de granja
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.
2026-09-09 19:38:33 +00:00

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

  1. Todo takana build bajo flock -o work/.farm-build.lock. El -o no es opcional: sin él un proceso fugado hereda el fd y deja la granja sin compilar, en silencio. Ver regla 1 de CLAUDE.md.
  2. 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.
  3. 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.
  4. Nada se borra por nombre. gioser es 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.