[seguranca] fix(deploy-guard): frase manual confirma-deploy só vale disparada por aprovador [INFRA-69413] #114

Merged
tarcisio merged 1 commit from fix/INFRA-69413-manual-exige-aprovador into develop 2026-10-11 20:10:45 -03:00
Owner

[seguranca] Guard de deploy: a frase manual exige aprovador [INFRA-69413]

Achado do Hub (TH-69412), conferido na develop. Espera aprovação do operador: o prefixo [seguranca] no título vale como a label, que não existe no repo (o bot não lê as labels da org, INFRA-69128).

Furo. Em scripts/ci/conferir_autorizacao_deploy.py, o caminho manual (RE_MANUAL → conferir_manual) aceitava confirma-deploy <produto> <tag> <data> sem olhar o ACTOR. O bot tmf-ia, que dispara workflow pelo token, escrevia a frase e autorizava o próprio deploy de produção. É o mesmo furo que a INFRA-68604 fechou no hotfix.

Prova do furo e do conserto (mesmo ambiente: dispatch em main, ACTOR=tmf-ia, frase de hoje):

  • script da develop: ✅ deploy autorizado — autorização manual do operador, rc=0;
  • script deste PR: ❌ DEPLOY BLOQUEADO: a frase manual só vale disparada por um aprovador: quem disparou (tmf-ia) é bot, rc=1.

Correção (opção A). conferir_manual exige eh_aprovador(ACTOR): bot, vazio ou fora de DEPLOY_APROVADORES reprova, com mensagem clara. O bot segue pelo release-aprovado PR #N, que confere o ato humano pela API. O docstring e o guia de adoção foram atualizados, e o CHANGELOG está em [Não lançado].

Testes:

  • deploy-guard 89, com 7 novos em ManualExigeAprovador:
    • bots recusados (tmf-ia, adelbardo, joestein, *-bot, [bot]);
    • ACTOR vazio e ausente recusados;
    • humano fora da allowlist recusado;
    • operador aceito;
    • allowlist lida do ambiente, com bot nunca entrando;
    • o release-aprovado não é afetado.
  • tests/release/test_autorizacao_dispatch.py: o teste que passava a frase manual com ACTOR=tmf-ia e esperava sucesso confirmava o furo. Agora o caso positivo usa o operador, e há um teste negativo com o bot.
  • release 429 e ci-unico 128, verdes.

Impacto:

  • o release.yml já passa ACTOR: ${{ github.actor }};
  • deploy.yml próprio de produto que não passe o ACTOR passa a ter o dispatch manual recusado, que é falha fechada; o guia de adoção diz isso;
  • os produtos que fixam o ci-shared por SHA só recebem a correção no próximo pin;
  • as cópias locais do guard (Hub, DANI) são das sessões donas.

🤖 Generated with Claude Code

https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2

## [seguranca] Guard de deploy: a frase manual exige aprovador [INFRA-69413] Achado do Hub (TH-69412), conferido na develop. **Espera aprovação do operador**: o prefixo `[seguranca]` no título vale como a label, que não existe no repo (o bot não lê as labels da org, INFRA-69128). **Furo.** Em `scripts/ci/conferir_autorizacao_deploy.py`, o caminho manual (`RE_MANUAL` → `conferir_manual`) aceitava `confirma-deploy <produto> <tag> <data>` **sem olhar o `ACTOR`**. O bot `tmf-ia`, que dispara workflow pelo token, escrevia a frase e autorizava o próprio deploy de produção. É o mesmo furo que a INFRA-68604 fechou no hotfix. **Prova do furo e do conserto** (mesmo ambiente: dispatch em main, `ACTOR=tmf-ia`, frase de hoje): - script da develop: `✅ deploy autorizado — autorização manual do operador`, rc=0; - script deste PR: `❌ DEPLOY BLOQUEADO: a frase manual só vale disparada por um aprovador: quem disparou (tmf-ia) é bot`, rc=1. **Correção (opção A).** `conferir_manual` exige `eh_aprovador(ACTOR)`: bot, vazio ou fora de `DEPLOY_APROVADORES` reprova, com mensagem clara. O bot segue pelo `release-aprovado PR #N`, que confere o ato humano pela API. O docstring e o guia de adoção foram atualizados, e o CHANGELOG está em [Não lançado]. **Testes:** - deploy-guard 89, com 7 novos em `ManualExigeAprovador`: - bots recusados (tmf-ia, adelbardo, joestein, `*-bot`, `[bot]`); - `ACTOR` vazio e ausente recusados; - humano fora da allowlist recusado; - operador aceito; - allowlist lida do ambiente, com bot nunca entrando; - o `release-aprovado` não é afetado. - `tests/release/test_autorizacao_dispatch.py`: **o teste que passava a frase manual com `ACTOR=tmf-ia` e esperava sucesso confirmava o furo.** Agora o caso positivo usa o operador, e há um teste negativo com o bot. - release 429 e ci-unico 128, verdes. **Impacto:** - o `release.yml` já passa `ACTOR: ${{ github.actor }}`; - `deploy.yml` próprio de produto que não passe o `ACTOR` passa a ter o dispatch manual recusado, que é falha fechada; o guia de adoção diz isso; - os produtos que fixam o ci-shared por SHA só recebem a correção no próximo pin; - as cópias locais do guard (Hub, DANI) são das sessões donas. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
fix(deploy-guard): frase manual confirma-deploy só vale disparada por aprovador [INFRA-69413]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m14s
5044322403
O caminho manual não olhava o ACTOR: o bot tmf-ia, que dispara workflow pelo token,
escrevia a frase e autorizava o próprio deploy de produção (TH-69412), o mesmo furo que
a INFRA-68604 fechou no hotfix. Agora exige eh_aprovador(ACTOR); bot, vazio ou fora de
DEPLOY_APROVADORES reprova. Prova: o guard antigo autorizava ACTOR=tmf-ia (rc=0), o novo
recusa (rc=1). O teste do release que esperava sucesso com o bot passa a exigir o operador.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ES1xwVdpQV69zEsuLLKzx2
tarcisio merged commit 502cd32ff7 into develop 2026-10-11 20:10:45 -03:00
tarcisio deleted branch fix/INFRA-69413-manual-exige-aprovador 2026-10-11 20:10:45 -03:00
Sign in to join this conversation.
No reviewers
No labels
seguranca
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
TMF/ci-shared!114
No description provided.