Skip to content

[P0][security-gate][INVIOLÁVEL] pre-push hook VERSIONADO: check-all local (1653 + Bandit/Zizmor/Semgrep) ANTES de push/PR — NUNCA removível #1151

Description

@FabioLeitao

MANDATO DO OPERADOR (não-negociável)

Todos os testes + security scans rodam LOCAL, ANTES do push/PR. O ponto é NÃO depender do round-trip do GitHub (esperar minutos, falhar remoto, refazer). O tier local (Zizmor + Bandit + Semgrep + os 1653) foi montado exatamente pra isso. Esses gates NUNCA podem ser removidos.

Problema (evidência 03/jul)

  • .git/hooks/ só tem pre-commit (framework leve) — NÃO existe pre-push que rode o check-all.sh.
  • Cursor pushou [P3][security][hardening] api/rbac.py: hmac.compare_digest com API key não-ASCII → TypeError (500) #1150 rodando só 2 testes targeted (2 passed in 2.39s) — não os 1653 + security.
  • A regra check-all-gate.mdc (alwaysApply: true, 'check-all before commit/PR') e never-weaken-security-gates.mdc existem — mas o enforcement era disciplina de agente OU um hook não-versionado em .git/hooks/ (untracked → some no silêncio, sem trilha, não compartilha entre clones T14/L14).

AC — tornar o gate MECÂNICO, VERSIONADO e INVIOLÁVEL

  1. Commitar .githooks/pre-push (versionado, no repo) que roda ./scripts/check-all.sh --enforced (pre-commit + 1653 pytest + Bandit + Zizmor + Semgrep). Falhou → push abortado. Espelho .githooks/pre-push.ps1 se precisar no Windows do Cursor.
  2. core.hooksPath=.githooks — setar num passo de setup idempotente (scripts/install-hooks.sh/.ps1) + documentar em AGENTS.md/CONTRIBUTING como passo obrigatório por clone. OU pre-commit default_install_hook_types: [pre-commit, pre-push] + stage pre-push rodando o gate.
  3. TAMPER-EVIDENT (o 'nunca removível'): teste em tests/ (que roda no CI required Test (Python)) que ASSERTA que .githooks/pre-push existe, é executável, e invoca check-all. Se alguém deletar/enfraquecer o hook versionado → o CI required FALHA → PR não merge. O gate protege a si mesmo.
  4. DOUTRINA: codificar em never-weaken-security-gates.mdc + AGENTS.md que remover/bypassar o pre-push local é PROIBIDO; mudança exige trailer Gate-Change-Approved-By: <operador> (paridade com o gate PII/ADR-0071). Bypass (--no-verify) só com aprovação explícita do operador, logada.

Fora de escopo

  • NÃO enfraquecer nada 'pra ficar rápido'. O gate local é o ponto — velocidade vem de rodar local (sem round-trip remoto), não de pular teste.

Prioridade P0: é integridade de gate de segurança. Operador tratou como top.

Metadata

Metadata

Assignees

Labels

P0Critical — blocks release or securityciCI/CD pipeline, build matrix, release automationcoordinationParte de esforco coordenado multi-agente (A.I.I.D.C.O.B.P.P.)housekeepingoperator-gatedStay closed only with Gate-Close-Approved-By trailer (#990, ADR-0072)securitySecurity hardening, abuse/DoS defense, leak prevention

Type

Fields

No fields configured for Task.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions