diff --git a/scripts/farm/cosecha-cron.sh b/scripts/farm/cosecha-cron.sh index 716d421a..81790e3c 100755 --- a/scripts/farm/cosecha-cron.sh +++ b/scripts/farm/cosecha-cron.sh @@ -58,10 +58,27 @@ else [ -n "${name:-}" ] || continue echo "==> $name ($ip)" # 1. SIEMBRA: código + recetas laptop→worker (--delete: el laptop manda; nunca toca work/store/target). + # ⚠ LA EXCLUSIÓN DE PNG VA ANCLADA, Y NO ES ESTILO (2026-09-06). Antes decía `--exclude '*.png'`, + # sin anclar, o sea PNG en CUALQUIER sitio — incluido `recipes/`. Dos consecuencias, las dos malas: + # + # a) rsync PROTEGE DE BORRADO lo que excluye. Un directorio cuyo único resto es un `.png` no se + # puede vaciar y por lo tanto no se puede borrar NUNCA, aunque el hub lo haya eliminado. + # Medido: `recipes/atuq/extension/atuq128.png` sobrevivió a un rename hecho en el hub y el + # log de la siembra repetía `cannot delete non-empty directory: recipes/atuq/extension`. + # b) Un PNG NUEVO de una receta tampoco viaja. Y hay recetas cuyo `[source] dir` tiene PNG + # dentro: los 9 iconos de `recipes/atuq/branding/icons/`. + # + # Como hammer SÍ hashea el árbol de un `[source] dir` (`recipe.rs`, `dir:`), el efecto no es + # silencioso —bendito sea—: el worker calcula OTRO ArtifactHash. Medido el mismo día, + # `atuq` daba `b3:f2960991` en el hub y `b3:b33e81a5` en el worker por ESE único fichero de más. + # O sea que el worker no podía coincidir con el hub ni construyendo bien. + # + # Lo que se quería ahorrar eran las capturas: `docs/evidencia/` (4,4 M) y el PNG suelto de la raíz + # (1 M). Eso se excluye por RUTA. Los PNG de `recipes/` viajan, que es lo correcto: son fuente. if rsync -az --delete -e "$SSH" \ --exclude /work --exclude /store --exclude '/store-*' --exclude /target \ --exclude /dist --exclude /.dev-fs --exclude /.git --exclude /.scratch \ - --exclude '*.png' --exclude '/content*' \ + --exclude '/docs/evidencia/' --exclude '/*.png' --exclude '/content*' \ ./ "root@$ip:$REMOTE/" 2>&1 | tail -2; then echo " siembra ✓" else