Skip to content

ci(release-truth): que el chequeo rápido pueda fallar rápido - #249

Merged
wolverin0 merged 1 commit into
mainfrom
ci/release-truth-falla-rapido
Aug 31, 2026
Merged

ci(release-truth): que el chequeo rápido pueda fallar rápido#249
wolverin0 merged 1 commit into
mainfrom
ci/release-truth-falla-rapido

Conversation

@wolverin0

Copy link
Copy Markdown
Owner

El defecto

release-truth:
    needs: test      # ← el chequeo de 30s cuelga del de 70 minutos

release-truth corre generate_release_truth.py --check en ~30 segundos. Pero la misma staleness la detecta tests/test_release_truth.py dentro de la suite. Así que test falla primero y este job queda skipped — precisamente en la única situación donde servía.

El chequeo rápido estaba downstream del lento que lo duplica. Nunca podía llegar primero.

Medido hoy, PR #248, corrida 33405024683

Job Resultado Hora
contract-witness success 14:51
test ×6 fail (Windows 3.12 tras 1h10m)
release-truth skipped 16:01

Seis jobs en rojo y setenta minutos para reportar lo que este job reportaba en medio minuto.

Por qué ahora

Es la cuarta vez en un día que caigo en la misma trampa: el generador cuenta funciones de test, y agregar una sin regenerar deja el archivo viejo. La lección no es "acordarse mejor" — es que el chequeo que ya existía no podía dispararse.

Seguridad del cambio

Sin needs, el job es independiente: checkout, pip install -e, --check. No consume nada que produzca test. El costo es un runner más en paralelo; el beneficio es que la señal llega en 30 segundos en vez de nunca.

`release-truth` corre `generate_release_truth.py --check` en unos 30 segundos,
pero tenia `needs: test`. La MISMA staleness la detecta
`tests/test_release_truth.py` dentro de la suite, asi que `test` fallaba primero
y este job quedaba `skipped` — justo en la unica situacion donde servia.

Medido hoy sobre el PR #248: 6 jobs de test en rojo, el de Windows 3.12 tras
1h10m, para reportar exactamente lo que este job reportaba en medio minuto.
Verificado en la corrida 33405024683: contract-witness success 14:51,
release-truth SKIPPED 16:01.

Es la cuarta vez en un dia que caigo en la misma trampa: el generador cuenta
funciones de test, agregar una sin regenerar deja el archivo viejo. La leccion
no es "acordarse" — es que el chequeo que ya existia no podia dispararse.

Sin `needs`, el job es independiente: hace checkout, instala y corre --check.
No consume nada que produzca `test`.
@wolverin0
wolverin0 merged commit 83387ad into main Aug 31, 2026
15 checks passed
@wolverin0
wolverin0 deleted the ci/release-truth-falla-rapido branch August 31, 2026 16:55
wolverin0 added a commit that referenced this pull request Aug 31, 2026
…de verdad (#250)

* fix(tests): la espera de arranque del servidor MCP tiene que esperar de verdad

`test_authenticated_mcp_http_delivers_disposable_capture` cayo CUATRO veces el
2026-08-31, siempre en Windows, con `authority_unavailable`. Entre 1 y 1,5 horas
de suite cada vez, mas el relanzamiento que vuelve a pagarla entera.

NO era aleatorio. El bucle de arranque del fixture tenia dos defectos:

    for _ in range(100):
        try:
            if httpx.get(health, timeout=0.2).status_code == 200: break
        except httpx.HTTPError:
            time.sleep(0.02)          # <- el sleep SOLO aca

1. Sin sleep en la rama de "respondio pero no 200" —el caso normal mientras
   arranca— el bucle giraba sus 100 vueltas en milisegundos y se rendia sin
   haber esperado nada.
2. El limite estaba en VUELTAS, no en tiempo: el presupuesto real dependia de si
   cada intento fallaba rapido o agotaba su timeout. O sea que no habia
   presupuesto.

Por que el sintoma mentia: el fallo no aparecia como un error de arranque
legible. El test avanzaba, la llamada MCP fallaba, y `_classify_transport_error`
(backend.py:273) la reportaba como `authority_unavailable`, que es su FALLBACK
para cualquier error de transporte sin clasificar.

`_wait_until_healthy` reemplaza el bucle: limite por TIEMPO, sleep en todos los
caminos, timeout por intento de 1s en vez de 0,2s.

NO es un reintento y hay un test que lo fija: un servidor que nunca levanta
sigue fallando. No repite aserciones ni tolera un fallo persistente — que era el
riesgo de la alternativa que descarte (marker de reintento, ademas de exigir una
dependencia nueva; ninguna de pytest-rerunfailures/flaky/pytest-retry esta
instalada). La otra alternativa, un job aparte no bloqueante, tapa la caida por
completo, que contradice el criterio del PR #249: el chequeo tiene que llegar a
hablar.

Barra roja verificada contra el bucle ORIGINAL: caen exactamente los dos tests
que anclan los defectos y los otros tres pasan, porque ese comportamiento ya
estaba bien.

13/13 en la suite real de hermes, 5/5 en los nuevos, ruff limpio, release-truth
regenerado ANTES de commitear.

* docs(handoff): estado al cierre del 2026-08-31

Los 8 PRs del dia, los resultados MEDIDOS (perfil destrabado tras 10 dias,
PPR-7 volviendo a emitir, corpus 18% -> 96% agrupado, cero claims vivas en
tenant NULL), los 9 items que quedan abiertos con su evidencia, y las seis
trampas que costaron tiempo hoy — incluida la de release-truth, en la que cai
cuatro veces.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant