fix(granja): el clon de la granja podía quedarse atrás para siempre, y eso ya pasó
Los dos caminos de adelanto de rama se bloquean JUNTOS en cuanto otro agente empuja código: el `merge --ff-only` no puede porque `docs/state/` está modificado (lo acaba de reescribir el generador), y el `reset --mixed` tampoco porque exige que el árbol ya tenga TODO lo que el ff tocaría — y el código del otro agente no lo tiene. Resultado medido hoy: el clon que siembra al worker se quedó **106 commits y dos días** atrás y la granja construyó recetas que no estaban en ningún commit. Se añade un último recurso: soltar `docs/state/` —que es salida NUESTRA y acabamos de publicarla, o sea que el commit remoto contiene exactamente lo que hay en el disco— y volver a intentar el ff. Es un no-op de contenido: las mismas rutas vuelven en el mismo ff, idénticas. Se descarta SÓLO `docs/state/`, nunca recetas ni código: lo de otro agente no se toca ni para desatascarse. Y va guardado por «el índice no tiene nada» por el mismo motivo que el `reset --mixed` de arriba — el índice es estado compartido (regla 2). Si aun así no puede, el mensaje ya no dice sólo «lo publicado NO depende de eso»: dice que el ÁRBOL QUE SE SIEMBRA sí depende, y dónde mirar. Esa era la frase que hizo que dos días de deriva pasaran por normales. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +21 −0
diff --git a/scripts/farm/publicar-estado.sh b/scripts/farm/publicar-estado.sh
index a14acebd..f8b72af2 100755
--- a/scripts/farm/publicar-estado.sh
+++ b/scripts/farm/publicar-estado.sh
@@ -204,6 +204,27 @@ while :; do
git reset --mixed -q "$commit" \
&& echo " rama local al día (el árbol ya tenía el contenido publicado)" \
|| echo " la rama local queda detrás — lo publicado NO depende de eso"
+ # ── ÚLTIMO RECURSO: SOLTAR NUESTRA PROPIA SUCIEDAD Y VOLVER A INTENTAR EL FF ────────────────
+ # Los dos caminos de arriba se bloquean juntos en cuanto OTRO agente empuja código: el `ff` no
+ # puede porque `docs/state/` está modificado, y el `reset --mixed` tampoco porque exige que el
+ # árbol ya tenga TODO lo que el ff tocaría —y el código del otro no lo tiene—. Resultado medido
+ # el 2026-10-15: el clon que siembra al worker se quedó **106 commits y dos días** atrás, y la
+ # granja construyó recetas que no estaban en ningún commit. Esto es el eslabón que faltaba.
+ #
+ # `docs/state/` es salida NUESTRA y acabamos de publicarla: en este punto el commit remoto
+ # contiene exactamente lo que hay en el disco, así que descartar esas rutas es un no-op de
+ # contenido —vuelven en el mismo ff, idénticas— y desbloquea el adelanto. Se descarta SÓLO
+ # `docs/state/`, nunca recetas ni código: lo de otro agente no se toca ni para desatascarse.
+ # Guardado por el índice vacío por lo mismo que el `reset --mixed`: es estado compartido.
+ elif git diff --cached --quiet HEAD 2>/dev/null \
+ && [ -n "$(git diff --name-only HEAD -- docs/state 2>/dev/null)" ]; then
+ git checkout -- docs/state 2>/dev/null
+ if git merge --ff-only -q "$commit" 2>/dev/null; then
+ echo " rama local al día (soltando docs/state, que es salida propia ya publicada)"
+ else
+ echo " la rama local queda detrás — lo publicado NO depende de eso, pero el ÁRBOL QUE SE"
+ echo " SIEMBRA sí: mirá \`git status\` en $ROOT antes de que la granja muela algo viejo"
+ fi
else
echo " la rama local queda detrás (hay cambios propios en el árbol) — lo publicado NO depende de eso"
fi