Communitygithub.com

GateGuard — Portão de Pré-Ação com Exigência de Fatos

Portão pré-execução que bloqueia edições/escrita/bash e exige investigação concreta (importadores, esquemas de dados, instruções do usuário) antes de permitir a ação. Melhora a qualidade mensurável em +2,25 pontos em relação a agentes sem portão.

O que é GateGuard — Portão de Pré-Ação com Exigência de Fatos?

O GateGuard é um hook **pre-tool-use** que impede que modelos de IA (como Claude) realizem ações como editar arquivos, escrever novos arquivos ou executar comandos bash destrutivos sem primeiro fornecer fatos concretos. Em vez de confiar em autoavaliações ineficazes ('você tem certeza?'), ele força o modelo a investigar o código, listando importadores, funções afetadas, esquemas de dados e instruções do usuário. Isso resulta em código mais consciente do contexto e com menos suposições incorretas — comprovado por dois testes A/B independentes que mostraram uma melhora média de 2,25 pontos. O GateGuard funciona em qualquer plataforma que suporte hooks de pré-execução (como o Claude Code ou Cursor via ECC), e é configurável por projeto através de variáveis de ambiente ou arquivos YAML, com opções para desabilitar portões específicos ou ignorar caminhos via globs. Ele não substitui revisões pós-edição, mas atua como uma barreira preventiva contra edições cegas, especialmente em bases de código com múltiplos módulos ou esquemas de dados complexos.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/gateguard

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que GateGuard — Portão de Pré-Ação com Exigência de Fatos faz?

Um hook PreToolUse que força o Claude a investigar antes de editar. Em vez de autoavaliação ("você tem certeza?"), ele exige fatos concretos. O ato de investigar cria consciência que a autoavaliação nunca criou.

Quando Ativar

  • Ao trabalhar em qualquer base de código onde edições de arquivos afetam múltiplos módulos
  • Projetos com arquivos de dados que têm esquemas ou formatos de data específicos
  • Times onde o código gerado por IA deve corresponder a padrões existentes
  • Qualquer fluxo de trabalho onde o Claude tende a adivinhar em vez de investigar

Conceito Central

Autoavaliação de LLMs não funciona. Pergunte "você violou alguma política?" e a resposta é sempre "não." Isso foi verificado experimentalmente.

Mas perguntar "liste todos os arquivos que importam este módulo" força o LLM a executar Grep e Read. A própria investigação cria contexto que altera a saída.

Portão de três estágios:

1. NEGAR — bloquear a primeira tentativa de Editar/Escrever/Bash
2. FORÇAR — dizer ao modelo exatamente quais fatos reunir
3. PERMITIR — autorizar a repetição após os fatos serem apresentados

Nenhum concorrente faz todos os três. A maioria para na negação.

Evidências

Dois testes A/B independentes, agentes idênticos, mesma tarefa:

TarefaCom PortãoSem PortãoDiferença
Módulo de análise8,0/106,5/10+1,5
Validador de webhook10,0/107,0/10+3,0
Média9,06,75+2,25

Ambos os agentes produzem código que roda e passa nos testes. A diferença está na profundidade do design.

Tipos de Portão

Portão de Editar / MultiEditar (primeira edição por arquivo)

MultiEditar é tratado de forma idêntica — cada arquivo no lote é bloqueado individualmente.

Antes de editar {caminho_do_arquivo}, apresente estes fatos:

1. Liste TODOS os arquivos que importam/requerem este arquivo (pesquise a árvore — Glob/Grep, ou find/grep via Bash)
2. Liste as funções/classes públicas afetadas por esta alteração
3. Se este arquivo lê/escreve arquivos de dados, mostre nomes de campos, estrutura
   e formato de data (use valores redigidos ou sintéticos, não dados brutos de produção)
4. Cite a instrução atual do usuário literalmente

Portão de Escrever (primeira criação de arquivo)

Antes de criar {caminho_do_arquivo}, apresente estes fatos:

1. Nomeie o(s) arquivo(s) e linha(s) que chamarão este novo arquivo
2. Confirme que nenhum arquivo existente atende ao mesmo propósito (pesquise a árvore — Glob/Grep, ou find/grep via Bash)
3. Se este arquivo lê/escreve arquivos de dados, mostre nomes de campos, estrutura
   e formato de data (use valores redigidos ou sintéticos, não dados brutos de produção)
4. Cite a instrução atual do usuário literalmente

Portão de Bash Destrutivo (todo comando destrutivo)

Dispara em: rm -rf, git reset --hard, git push --force, drop table, etc.

1. Liste todos os arquivos/dados que este comando modificará ou excluirá
2. Escreva um procedimento de reversão de uma linha
3. Cite a instrução atual do usuário literalmente

Portão de Bash Rotineiro (uma vez por sessão)

1. A solicitação atual do usuário em uma frase
2. O que este comando específico verifica ou produz

Lotes Paralelos e Aplicação Parcial

O portão de primeiro toque avalia cada chamada de ferramenta independentemente. Quando várias edições em um arquivo que ainda não foi tocado são enviadas em um único lote paralelo, a primeira chamada é negada e a negação marca o arquivo como verificado, portanto as edições irmãs nesse lote são aplicadas. Nada é revertido: o arquivo pode acabar contendo as edições irmãs sem a que foi negada.

A mensagem de negação nomeia o arquivo e avisa que os irmãos do lote podem já ter sido aplicados. Trate-a literalmente:

  • Envie edições dependentes para um arquivo ainda não tocado sequencialmente, não em um lote paralelo. Uma definição e seu primeiro uso, ou uma importação e seu ponto de chamada, não devem estar no mesmo lote.
  • Após uma negação de primeiro toque, apresente os fatos, repita a edição negada e releia o arquivo antes de construir sobre qualquer outra coisa do lote.

Um bloqueio em todo o lote não é possível: hooks veem chamadas de ferramenta uma de cada vez, então o portão não pode saber quais chamadas chegaram juntas.

Início Rápido

Opção A: Usar o hook ECC (instalação zero)

O hook em scripts/hooks/gateguard-fact-force.js está incluído neste plugin. Ative-o via hooks.json.

Se o GateGuard bloquear trabalhos de configuração ou reparo, inicie a sessão com ECC_GATEGUARD=off. Para controle em nível de hook, continue usando ECC_DISABLED_HOOKS com o ID do hook GateGuard.

Em sessões longas, apenas as primeiras GATEGUARD_FACT_FORCE_FULL_DENIALS negações de exigência de fatos (padrão 3) emitem o bloco completo de quatro fatos; negações posteriores são condensadas em uma única linha carregando o ordinal da negação, para que blocos quase idênticos não possam se acumular na janela de contexto e amplificar loops de repetição do modelo (#2142). Tentar novamente o mesmo arquivo ou comando após apresentar fatos nunca reativa o portão.

Controles graduados

ECC_GATEGUARD=off (ou GATEGUARD_DISABLED=1) desliga o portão completamente. As variáveis nesta tabela não — cada uma estreita um comportamento enquanto as verificações de Bash destrutivo que suportam a carga continuam sendo executadas:

VariávelPadrãoEfeito
GATEGUARD_BASH_ROUTINE_DISABLEDnão definido (portão ligado)Desativa apenas o portão de Bash rotineiro. O portão de Bash destrutivo (rm -rf, git reset --hard, drop table, dd if=, …) não é afetado.
GATEGUARD_EXEMPT_GLOBSnão definido (sem isenções)Globs separados por vírgula; um alvo de Editar/Escrever/MultiEditar correspondente pula a exigência de fatos de primeiro toque. Destinado a árvores de baixo valor de importação (testes, artefatos gerados, diretórios temporários) onde "quem importa isso / qual esquema" não carrega sinal.
GATEGUARD_FACT_FORCE_FULL_DENIALS3Quantas negações emitem o bloco completo de quatro fatos antes que as posteriores sejam condensadas em uma única linha. 0 condensa desde a primeira negação.
GATEGUARD_BASH_EXTRA_DESTRUCTIVEnão definidoPadrões extras de comandos destrutivos, como fonte de regex, adicionados ao conjunto embutido. Um regex malformado é tratado como não definido (os embutidos ainda se aplicam) e registrado uma vez em stderr.
GATEGUARD_STATE_DIR~/.gateguardOnde o estado do portão por sessão é mantido. Se o estado não puder ser persistido, o portão permite a operação em vez de fazer loop, e nomeia esta variável no aviso.

GATEGUARD_BASH_ROUTINE_DISABLED aceita 1, true, on, enabled, enable, ou yes (insensível a maiúsculas/minúsculas e espaços em branco); qualquer outro valor mantém o portão ligado.

Desligando o portão completamente

VariávelEfeito
ECC_GATEGUARD=offDesabilita o GateGuard para a sessão. Aceita 0, false, off, disabled, ou disable.
GATEGUARD_DISABLED=1Mesmo efeito. Reconhece apenas 1 — as grafias acima não se aplicam aqui.

Para controle em nível de hook, continue usando ECC_DISABLED_HOOKS com o ID do hook GateGuard.

Semântica de glob para GATEGUARD_EXEMPT_GLOBS

Padrões correspondem a todo o caminho alvo relativo ao projeto. A raiz do projeto é CLAUDE_PROJECT_DIR, recuando para o cwd do payload do hook, depois o diretório de trabalho do processo do hook. Globs relativos nunca isentam alvos fora dessa raiz. Globs absolutos explícitos correspondem a todo o caminho alvo absoluto e podem deliberadamente isentar caminhos fora do projeto.

Tanto padrões quanto caminhos usam separadores / e correspondência em minúsculas. * corresponde dentro de um segmento, ** entre segmentos, e ? a um caractere que não seja separador. **/ inclui zero diretórios, então **/tests/** também corresponde a tests/foo.js. Padrões malformados são descartados sem conceder isenção.

Desde 2.2.1, services/** cobre apenas a árvore de serviços raiz do projeto, e *.md cobre apenas seus arquivos Markdown raiz. Use **/*.md para todos os arquivos Markdown dentro do projeto. Isenções não ancoradas existentes podem precisar de ajuste:

{
  "env": {
    "GATEGUARD_BASH_ROUTINE_DISABLED": "1",
    "GATEGUARD_EXEMPT_GLOBS": "**/tests/**,tests/**,**/*.test.*,**/docs/**,**/dist/**"
  }
}

Opção B: Pacote completo com configuração

pip install gateguard-ai
gateguard init

Isso adiciona .gateguard.yml para configuração por projeto (mensagens personalizadas, caminhos de ignorar, ativações de portão).

Anti-Padrões

  • Não use autoavaliação no lugar. "Tem certeza?" sempre obtém "sim." Isso foi verificado experimentalmente.
  • Não pule a verificação de esquema de dados. Ambos os agentes de teste A/B assumiram datas ISO-8601 quando os dados reais usavam %Y/%m/%d %H:%M. Verificar a estrutura de dados (com valores redigidos) previne toda essa classe de bugs.
  • Não bloqueie todo comando Bash. Portões de bash rotineiro atuam uma vez por sessão. Portões de bash destrutivo atuam todas as vezes. Esse equilíbrio evita lentidão enquanto captura riscos reais.

Melhores Práticas

  • Deixe o portão disparar naturalmente. Não tente pré-responder às perguntas do portão — a própria investigação é o que melhora a qualidade.
  • Personalize as mensagens do portão para seu domínio. Se seu projeto tiver convenções específicas, adicione-as aos prompts do portão.
  • Use .gateguard.yml para ignorar caminhos como .venv/, node_modules/, .git/.

Habilidades Relacionadas

  • safety-guard — Verificações de segurança em tempo de execução (complementar, não sobreposto)
  • code-reviewer — Revisão pós-edição (GateGuard é investigação pré-edição)

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Habilidades Relacionadas