OPS61 — contratos de merge/flip do Forgejo: labels com PAT + gate do rollup checks + branch protection real #67
Loading…
Reference in a new issue
No description provided.
Delete branch "OPS61-forgejo-contracts-de-merge-flip-quebrados-labels-nao-f"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
O que é
OPS61 — contratos de merge/flip do Forgejo quebrados: labels não flipam e branch protection de main não existe no servidor.
S1 — labels não flipam (GITHUB_TOKEN 403)
issue-done-on-main-merge.yml/plan-issue-ready-on-main-merge.yml:env: FORGEJO_API_TOKEN(oGITHUB_TOKENnativo 403 em escrita de Issues — o flipCloses #N → done+in-prodquebrava em silêncio).head.repo.full_name == github.repository) nos dois: PR de fork mergeada faz checkout do script do fork rodando com o token do repo (RCE — mesma classe do guard doagent-pr-ready-automerge).forgejo-issue-transition.mjs: falha de flip agora exit 1 — o job vermelha em vez de mentir (skip silencioso da era 403).S3 — branch protection de main não existia + safety net com 3 bloqueios
GET /branch_protectionsretornava[]: opnpm configure:branch-protectionera passo humano pendente do OPS50 e nunca rodou (docs diziam "aplicado").checksdo script nunca casaria os contextos reais do Forgejo: a regra casa por glob contraCI (PR) / checks (pull_request)(o sufixo(evento)faz parte do contexto). Corrigido paraCI (PR) / checks*, script idempotente (GET → POST/PATCH/no-op) com verificação pós-aplicação e dry-run honesto.waitForChecks(2b, achado ao vivo na própria entrega): o CLI nunca auto-mergeou nada — todo merge Forgejo até aqui foi manual (merged_bydo dono), inclusive a PR #52 com CI vermelho (narrativa de "raça" da intenção corrigida). Três bloqueios independentes, todos corrigidos:pending.length === 0insatisfazível — o Forgejo posta o status do próprio job do safety net comopendingdurante o run inteiro; o gate novo espera o rollupCI (PR) / checkspresente+verde (único contexto que só existe com a cascata inteira assentada) e ignora o próprio contexto.maine o hook pre-receive do Forgejo rejeita quando o usuário do token não tem write no repo; oGITHUB_TOKENnativo age como o usuário sistema do Actions (o mesmo que 403 em Issues).agent-pr-ready-automerge.ymlagora injetaFORGEJO_API_TOKEN.mergeable === falseprematuro — só conta como conflito após a cascata assentar (a regra recém-aplicada derruba o mergeable enquanto a CI roda).Testes
forgejoApi.unit.spec.ts: rollup não-posto continua poll, rollup failure lança, próprio status do safety net não bloqueia, mergeable pré-settle; fixtures existentes atualizados para o contexto real.branchProtection.unit.spec.ts(nova): create/update/noop + glob casa o contexto observado.Validação ao vivo: a regra foi criada e verificada no servidor (re-run = no-op); esta PR
Closes #53mergeou pelo novo gate do rollup com a regra aplicada e o PAT no merge, e oissue-doneflipou a #53 com o PAT.Closes #53
404ac7ffe0toe34a964bff