siembra: anclar la exclusión de PNG — sin anclar rompe las recetas que traen PNG

La siembra excluía `*.png` sin anclar, o sea PNG en CUALQUIER sitio, incluido
recipes/. Dos consecuencias y 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 del latido venía repitiendo
     `cannot delete non-empty directory: recipes/atuq/extension` sin que nadie lo
     leyera como un error.
  b) Un PNG NUEVO de una receta tampoco viaja. Y hay recetas cuyo `[source] dir`
     lleva PNG dentro: los 9 iconos de recipes/atuq/branding/icons/.

El efecto medido: `atuq` daba b3:f2960991 en el hub y b3:b33e81a5 en el worker,
por ESE único fichero de más. El worker no podía coincidir con el hub ni
construyendo bien.

Lo bueno es que no era silencioso, y por diseño: hammer SÍ hashea el árbol de un
`[source] dir` (recipe.rs, `dir:<hash>`), así que la divergencia sale como otro
ArtifactHash en vez de como dos bytes distintos en la misma dirección. Es
exactamente la propiedad que le falta al lab y a la versión de hammer.

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 ahora se excluye POR RUTA. Los PNG de recipes/
viajan, que es lo correcto: ahí son fuente, no adorno.

Borrado el fichero rancio del worker; hub y worker vuelven a coincidir en
b3:f2960991.
This commit is contained in:
Sergio
2026-09-06 04:29:43 +00:00
parent 1578eb16f5
commit dc1391e611
+18 -1
View File
@@ -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:<hash>`), 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