OPS64 — OPS64 — forgejo-pr-automerge: waitForChecks conta o próprio status pendente (deadlock → timeout 30min, merge nunca acontece pelo safety net) #62

Closed
opened 2026-08-18 17:59:01 +00:00 by fsolla · 4 comments
Owner
id depends serializes priority
OPS64
P2

Sintoma (evidência: PR #55, OPS59, 2026-08-18): o job ready-automerge (agent-pr-ready-automerge.yml, OPS57) começou junto com o CI do PR e rodou os 30 min do waitForChecks mesmo com o CI 100% verde desde ~11 min antes — Failing after 30m14s — e o merge só aconteceu manualmente.

Causa: waitForChecks (scripts/lib/forgejo-api.mjs) polia listCommitStatuses(pr.head.sha) e exige pending.length === 0 — mas o status do PRÓPRIO job ready-automerge (context 'PR Ready + auto-merge / ready-automerge') fica pending enquanto o job roda. Como o workflow dispara em open/sync (antes do CI terminar), o pending do próprio job nunca zera → sempre estoura o timeout de 30 min → exit 1 → merge nunca acontece pelo safety net (a classe OPS52 continua descoberta).

Observação secundária da mesma sessão: em run 607 o job checks do ci-pr.yml passou (2s) com um shard de e2e vermelho (e2e (1) falhou no setup — porta 5435 ocupada, corrigido por 5b50e1da) — o needs.e2e de matrix parece não agregar o shard falho; só o waitForChecks do automerge pegou o vermelho. Avaliar no mesmo item.

Correção possível (a decidir): ignorar o próprio context no waitForChecks (ex. filtrar 'ready-automerge'), ou passar merge_when_checks_succeed no POST de merge (auto-merge nativo do Forgejo, sem poll), ou timeout > 40 min. Fora do escopo OPS59 (entregue).

--- id: OPS64 depends: [] serializes: [] priority: P2 --- Sintoma (evidência: PR #55, OPS59, 2026-08-18): o job `ready-automerge` (agent-pr-ready-automerge.yml, OPS57) começou junto com o CI do PR e rodou os 30 min do waitForChecks mesmo com o CI 100% verde desde ~11 min antes — `Failing after 30m14s` — e o merge só aconteceu manualmente. Causa: `waitForChecks` (`scripts/lib/forgejo-api.mjs`) polia `listCommitStatuses(pr.head.sha)` e exige `pending.length === 0` — mas o status do PRÓPRIO job `ready-automerge` (context 'PR Ready + auto-merge / ready-automerge') fica `pending` enquanto o job roda. Como o workflow dispara em open/sync (antes do CI terminar), o pending do próprio job nunca zera → sempre estoura o timeout de 30 min → exit 1 → merge nunca acontece pelo safety net (a classe OPS52 continua descoberta). Observação secundária da mesma sessão: em run 607 o job `checks` do ci-pr.yml passou (2s) com um shard de e2e vermelho (e2e (1) falhou no setup — porta 5435 ocupada, corrigido por 5b50e1da) — o `needs.e2e` de matrix parece não agregar o shard falho; só o waitForChecks do automerge pegou o vermelho. Avaliar no mesmo item. Correção possível (a decidir): ignorar o próprio context no waitForChecks (ex. filtrar 'ready-automerge'), ou passar `merge_when_checks_succeed` no POST de merge (auto-merge nativo do Forgejo, sem poll), ou timeout > 40 min. Fora do escopo OPS59 (entregue).
fsolla added the
prio:P2
ready
labels 2026-08-18 17:59:01 +00:00
fsolla added
in-progress
and removed
ready
labels 2026-08-18 21:51:44 +00:00
Author
Owner

Claimed by agent run at 2026-08-18T21:51:44.850Z. Lock otimista: outro claim deve falhar e re-rodar pnpm agent:claim.

Claimed by agent run at 2026-08-18T21:51:44.850Z. Lock otimista: outro claim deve falhar e re-rodar `pnpm agent:claim`.
fsolla added
done
in-prod
and removed
in-progress
labels 2026-08-19 15:18:25 +00:00
Author
Owner

Merged em main via PR #79 — done + in-prod. Deploy de produção segue o verificador ci.yml (gated).

Merged em main via PR #79 — `done` + `in-prod`. Deploy de produção segue o verificador `ci.yml` (gated).
Author
Owner

Merged em main via PR #79 — done + in-prod. Deploy de produção segue o verificador ci.yml (gated).

Merged em main via PR #79 — `done` + `in-prod`. Deploy de produção segue o verificador `ci.yml` (gated).
Author
Owner

Entregue via PR #79 (merged 2026-08-19 15:18Z pelo safety net ready-automerge — prova viva de que o primário já funcionava pós-OPS61).

Desfecho: o primário (deadlock do próprio pending) já estava entregue pelo OPS61 (filtro do próprio contexto + gate do rollup + PAT; runs 710/712). O secundário (rollup checks reportava SUCCESS com shard de e2e vermelho por causa do parent de matrix do Forgejo) foi eliminado estruturalmente pelo OPS62 (mergeado durante a execução deste item): ci-pr.yml e ci.yml viraram jobs únicos sequenciais, sem matrix/shard — o status do job checks agora é o veredito honesto da cascata.

Entregue aqui: teste-pino no waitForChecks (run 607: rollup verde + shard vermelho → CLI lança; invariante de defesa que vale para sempre) + docs honestas + changelog. O script ci-rollup-check.mjs e os edits de workflow planejados foram descartados no gate (redundantes pós-OPS62).

Entregue via PR #79 (merged 2026-08-19 15:18Z pelo safety net `ready-automerge` — prova viva de que o primário já funcionava pós-OPS61). **Desfecho:** o primário (deadlock do próprio pending) já estava entregue pelo OPS61 (filtro do próprio contexto + gate do rollup + PAT; runs 710/712). O secundário (rollup `checks` reportava SUCCESS com shard de e2e vermelho por causa do parent de matrix do Forgejo) **foi eliminado estruturalmente pelo OPS62** (mergeado durante a execução deste item): ci-pr.yml e ci.yml viraram jobs únicos sequenciais, sem matrix/shard — o status do job `checks` agora é o veredito honesto da cascata. Entregue aqui: teste-pino no `waitForChecks` (run 607: rollup verde + shard vermelho → CLI lança; invariante de defesa que vale para sempre) + docs honestas + changelog. O script `ci-rollup-check.mjs` e os edits de workflow planejados foram descartados no gate (redundantes pós-OPS62).
fsolla added spent time 2026-08-19 15:22:29 +00:00
2 hours 30 minutes
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Total time spent: 2 hours 30 minutes
fsolla
2 hours 30 minutes
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: fsolla/teqo#62
No description provided.