fix(ops OPS56): forgejo-pr-automerge — veredito de merge por re-read do PR (falso positivo 'já mergeado') #42

Merged
fsolla merged 1 commit from OPS56-forgejo-pr-automerge-falso-positivo-ja-mergeado-com-pr into main 2026-08-18 14:28:54 +00:00
Owner

Closes #28

OPS56 — forgejo-pr-automerge: falso positivo 'já mergeado' com PR aberto

Raiz (confirmada no source do servidor, Forgejo 9.0.3 tag v9.0.3): o endpoint POST /pulls/{n}/merge responde 200 com corpo vazio no sucesso; falhas são sempre 404/405/409/500. O request() do forgejo-api.mjs convertia o 200-vazio em null, o autoMerge() devolvia null cru e o CLI imprimia "já mergeado" (exit 0) independente do estado real do PR — o merge falhava silenciosamente com o PR aberto (incidente real: PR #27 da OPS52).

Correção — veredito por re-read do PR:

  • autoMerge retorna { attempted, merged, pr }: após o POST (ok ou erro), re-read do GET /pulls/{n} é a fonte da verdade.
    • POST ok → confirma merge no re-read.
    • POST falhou (405/409/…) e o PR segue aberto → re-throw (falha ruidosa, exit 1).
    • Raça perdida (outro ator mergeou) → merged: true (legítimo "já mergeado").
    • PR fechado sem merge → merged: false → CLI imprime "fechado sem merge — skip".
  • waitForChecks espera o mergeable amadurecer: false → throw imediato (conflito); null → segue no poll (mesmo timeout de 30 min).
  • CLI: "já mergeado" só quando o servidor reporta o PR como mergeado; mensagens derivadas do shape novo; removido shadowing de const pr (redeclaração no mesmo escopo).

Testes: 6 specs novas em tests/unit/forgejoApi.unit.spec.ts (veredito por re-read no 200-vazio, POST 405 + PR aberto → reject, raça concorrente, no-op de já-mergeado, poll de mergeable null, fail-fast de mergeable false).

Verificação: 2318 unit + 791 int + tsc/lint/prettier/knip/check:cycles verdes; gate:ci mirror passou no push.

Débito deferido: alargar o gatilho do agent-pr-ready-automerge.yml para branches não-cursor/* (decisão de ops separada da cobertura do veredito).

Impl plan: docs/plans/ops56-forgejo-pr-automerge-falso-positivo-impl.md · changelog: docs/changelog/2026-08-18-ops56.md

Closes #28 ## OPS56 — forgejo-pr-automerge: falso positivo 'já mergeado' com PR aberto **Raiz (confirmada no source do servidor, Forgejo 9.0.3 tag v9.0.3):** o endpoint `POST /pulls/{n}/merge` responde **200 com corpo vazio** no sucesso; falhas são sempre 404/405/409/500. O `request()` do `forgejo-api.mjs` convertia o 200-vazio em `null`, o `autoMerge()` devolvia `null` cru e o CLI imprimia "já mergeado" (exit 0) independente do estado real do PR — o merge falhava silenciosamente com o PR aberto (incidente real: PR #27 da OPS52). **Correção — veredito por re-read do PR:** - `autoMerge` retorna `{ attempted, merged, pr }`: após o POST (ok ou erro), **re-read do `GET /pulls/{n}`** é a fonte da verdade. - POST ok → confirma merge no re-read. - POST falhou (405/409/…) e o PR segue **aberto** → re-throw (falha ruidosa, exit 1). - Raça perdida (outro ator mergeou) → `merged: true` (legítimo "já mergeado"). - PR fechado sem merge → `merged: false` → CLI imprime "fechado sem merge — skip". - `waitForChecks` espera o `mergeable` amadurecer: `false` → throw imediato (conflito); `null` → segue no poll (mesmo timeout de 30 min). - CLI: "já mergeado" só quando o servidor reporta o PR como mergeado; mensagens derivadas do shape novo; removido shadowing de `const pr` (redeclaração no mesmo escopo). **Testes:** 6 specs novas em `tests/unit/forgejoApi.unit.spec.ts` (veredito por re-read no 200-vazio, POST 405 + PR aberto → reject, raça concorrente, no-op de já-mergeado, poll de mergeable null, fail-fast de mergeable false). **Verificação:** 2318 unit + 791 int + tsc/lint/prettier/knip/check:cycles verdes; gate:ci mirror passou no push. **Débito deferido:** alargar o gatilho do `agent-pr-ready-automerge.yml` para branches não-`cursor/*` (decisão de ops separada da cobertura do veredito). Impl plan: `docs/plans/ops56-forgejo-pr-automerge-falso-positivo-impl.md` · changelog: `docs/changelog/2026-08-18-ops56.md`
fsolla added 1 commit 2026-08-18 14:25:17 +00:00
fix(ops OPS56): forgejo-pr-automerge — veredito de merge por re-read do PR (falso positivo 'já mergeado' com PR aberto)
All checks were successful
Agent PR Ready + auto-merge / ready-automerge (pull_request) Has been skipped
CI (PR) / docs-guards (pull_request) Successful in 7s
CI (PR) / plans-only-closes (pull_request) Successful in 7s
CI (PR) / scope (pull_request) Successful in 30s
CI (PR) / lint (pull_request) Successful in 52s
CI (PR) / format (pull_request) Successful in 54s
CI (PR) / typecheck (pull_request) Successful in 35s
CI (PR) / knip (pull_request) Successful in 36s
CI (PR) / cycles (pull_request) Successful in 40s
CI (PR) / unit (pull_request) Successful in 50s
CI (PR) / build (pull_request) Has been skipped
CI (PR) / e2e (1) (pull_request) Has been skipped
CI (PR) / e2e (2) (pull_request) Has been skipped
CI (PR) / int (pull_request) Successful in 1m39s
CI (PR) / checks (pull_request) Successful in 1s
Promote plan-issue Related on main merge / plan-issue-ready (pull_request) Has been skipped
Main merge flips claimed issues to done + in-prod / issue-done (pull_request) Successful in 12s
Agent pool supervisor / tick (pull_request) Successful in 27s
46b7526c8d
fsolla merged commit b78a390371 into main 2026-08-18 14:28:54 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
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#42
No description provided.