fuentes: HAMMER_MIRROR es una LISTA — un espejo propio era el mismo punto único de fallo

El ADR 0013 existe para no depender de 79 servidores ajenos, y lo resolvió creando una
dependencia de UNO nuestro. Las dos variables aceptan ahora varios orígenes separados por
comas y se prueban todos antes de caer a upstream.

El orden se ROTA con una semilla determinista tomada del hash del propio objeto: el mismo
objeto sale siempre del mismo origen (un fallo se reproduce), pero objetos distintos se
reparten ⇒ una tanda del corpus ejercita la lista entera. Con orden fijo, el segundo origen
no se tocaría jamás hasta la emergencia — que es literalmente «un espejo que nadie prueba»,
la lección del 0013 un nivel más arriba.

La parte pura sale a `rotar_bases` para poder probarla sin tocar el entorno del proceso
(que es global y haría los tests dependientes del orden en que corren). 3 tests.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CK6HpSoHcN9M4GBpqRSusR
This commit is contained in:
Sergio
2026-09-01 18:44:50 +00:00
co-authored by Claude Opus 5
parent a2c2c4d968
commit 927dee60cf
2 changed files with 123 additions and 20 deletions
+9
View File
@@ -8,6 +8,15 @@
# que apunta a una máquina concreta convertiría un fallo de red en un fallo de hammer para cualquiera
# que clone el repo.
#
# LISTA, no una URL (ADR 0014): las dos variables aceptan varios orígenes separados por comas y se
# prueban todos antes de caer a upstream. Con uno solo, el mecanismo que existe para no depender de
# 79 servidores ajenos dependía de UNO nuestro. Para añadir el espejo público:
#
# export HAMMER_MIRROR="sftp://…/hammer/fuentes,https://<bucket>.r2.dev/fuentes"
#
# El orden se ROTA por el hash de cada objeto, así que todos los orígenes se ejercitan en una tanda
# del corpus — un espejo que sólo se usa cuando el otro falla es un espejo que nadie prueba.
#
# La ruta lleva `/~/` a propósito. curl interpreta lo que sigue al host en una URL `sftp://` como
# ruta ABSOLUTA del servidor, así que `…:23/hammer/fuentes` busca en la raíz y devuelve
# «(78) Could not open remote file for reading» aunque el fichero exista. `/~/` lo ancla al home.