Files
takana/.claude/skills/granja/SKILL.md
T
SergioandClaude Opus 5 d45c0688e7 granja: el worker es el LXC PRESTADO (€0) — que no se vuelva a perder
El dato ya estaba en memoria y aun así se perdió dos veces, así que ahora vive en los sitios
que se leen sin buscarlos: regla 1 bis de CLAUDE.md (que carga todo agente en cada sesión) y
la skill 'granja' del repo. Se compila en dev.gioser.net PARA NO GASTAR HETZNER; no se
levantan cajas hcloud salvo petición explícita.

Y se arregla la fragilidad que salió al mirar: el reaper de cosecha-cron expulsa de .fleet
todo lo que no esté en hcloud, y el LXC se salvaba SÓLO porque su nombre contiene la subcadena
'gioser' y caía en una lista negra que existe para proteger al hub de Hetzner — no tiene nada
que ver con él. Medido con el bloque real del reaper contra un .fleet de juguete:

  nombre CON 'gioser'                    → 'en LISTA NEGRA ⇒ intocable'      sobrevive
  el MISMO host como 'pruebasia-lxc'     → 'ya no existe en hcloud'          .fleet VACÍO

O sea que la granja se mantenía conectada por una casualidad de nombre, y con otro nombre
volvía a 'flota vacía' en el primer ciclo sin que nada fallara. Ahora el reaper pregunta por
SSH si el host responde, que es preguntarle a la máquina en vez de al nombre. Verificado en
las dos direcciones, con control:

  host vivo, nombre sin 'gioser'  → 'no es de hcloud pero RESPONDE ⇒ se queda (€0)'
  host que no responde            → 'no responde ⇒ lo saco de .fleet'   (intención original)

Queda anotado también que .fleet está gitignored: un hub recién clonado nace con la flota
vacía y la granja queda desconectada en silencio — la cosecha dice 'flota vacía', los
artefactos no vuelven, y estado-granja.sh reporta 'no hay worker vivo' con el worker
compilando. Es como se descubrió esto hoy.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPJteswQvP1L7zSBrQQe2
2026-09-08 18:41:16 +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 hammer

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 hammer 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.