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.
48 lines
2.6 KiB
Markdown
48 lines
2.6 KiB
Markdown
---
|
|
name: granja
|
|
description: 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.
|
|
|
|
```sh
|
|
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.
|