FinTrack Analytics · Gobernanza IA

Hook: Bloqueo de Flags --no-verify

PreToolUse guard para Claude Code · .claude/settings.json · Configurado el 14 jun 2026
✓ Hook Activo
◇ Alcance Global
2 flags bloqueados
Incidentes que motivaron este hook
🛑
Secretos en staging
2
Commits con API keys hardcodeadas llegaron a staging porque Gitleaks fue saltado con --no-verify
🔍
Errores de linting
47
Errores ESLint en producción tras commit del agente con bypass de hooks de calidad
📌
Bypasses detectados
3
Ocasiones en que Claude Code usó --no-verify en sprints de desarrollo acelerado
🕐 Línea de tiempo de incidentes
Sprint 4 — mayo / junio 2026
12 mayo 2026 · 23:47
Secreto expuesto en staging — STRIPE_SECRET_KEY
Gitleaks habría bloqueado el commit, pero el agente usó bypass. Key revocada 4h después al detectarlo en revisión de PR.
git commit --no-verify -m "add stripe integration"
28 mayo 2026 · 11:22
DATABASE_URL expuesta en logs de CI
Segunda exposición. El agente volvió a usar --no-verify para resolver conflicto de merge rápidamente.
git merge --no-verify feature/db-refactor
3 junio 2026 · 16:05
47 errores ESLint en rama main
Sprint rápido, agente hizo 6 commits con --no-verify saltándose ESLint + Prettier. Acumulación detectada en daily.
git commit --no-verify -m "quick fixes"
14 junio 2026 · 09:00
Hook PreToolUse desplegado — bloqueo activo
Configuración en .claude/settings.json commiteada a main. Todos los agentes de IA bloqueados ante --no-verify y --no-gpg-sign.
▶ Cómo funciona el hook
Agente IA llama Bash
Claude Code
PreToolUse hook se dispara
$TOOL_INPUT disponible
grep -qE busca flags de bypass
regex en comando git
exit 2 · BLOQUEADO
flag encontrado
exit 0 · PERMITIDO
sin bypass
📄 Configuración desplegada
✓ Commiteado a main
{} .claude/settings.json
✓ Activo en FinTrack Analytics
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",           // Solo intercepta llamadas Bash, no Read/Edit/etc.
        "hook": {
          "type": "command",
          "command": "if printf '%s' \"$TOOL_INPUT\" | grep -qE \
            '(^|&&;|\\|)\\s*git\\s+.*--(no-verify|no-gpg-sign)'; \
            then echo 'BLOCKED: --no-verify y --no-gpg-sign no están \
            permitidos. Ejecuta el commit sin flags de bypass para que \
            los pre-commit hooks se ejecuten correctamente.' >&2; \
            exit 2; fi"
        }
      }
    ]
  },

  // Resto de configuración existente del proyecto...
  "permissions": {
    "allow": ["Bash(npm:*)", "Bash(git:*)"],
    "deny": []
  }
}
🛑 Comandos BLOQUEADOS
bash — FinTrack / claude-agent
$ git commit --no-verify -m "quick fix"
BLOCKED: --no-verify y --no-gpg-sign no están
permitidos. Ejecuta el commit sin flags de
bypass para que los pre-commit hooks se
ejecuten correctamente.
exit code: 2 (tool call rejected)
 
$ git push --no-verify origin main
BLOCKED: --no-verify y --no-gpg-sign no están
permitidos.
exit code: 2 (tool call rejected)
 
$ git commit --no-gpg-sign -m "add feature"
BLOCKED: --no-verify y --no-gpg-sign no están
permitidos.
exit code: 2 (tool call rejected)
✓ Comandos PERMITIDOS
bash — FinTrack / claude-agent
$ git commit -m "add stripe integration"
gitleaks: scanning commit...
gitleaks: STRIPE_SECRET_KEY detected in
src/lib/stripe.ts — commit blocked!
(pre-commit hook funcionó correctamente)
 
$ git commit -m "feat: add dashboard filters"
eslint: 0 errors, 0 warnings ✓
prettier: all files formatted ✓
jest: 42 tests passed ✓
gitleaks: no secrets detected ✓
[main a3f1c2d] feat: add dashboard filters
 
$ git push origin main
Everything up-to-date ✓
🚫 Flags de bypass bloqueados
Flag Qué omite Riesgo para FinTrack Estado
--no-verify pre-commit y commit-msg hooks Salta ESLint, Prettier, Jest, Gitleaks — permite secretos y código sin formato BLOQUEADO
--no-gpg-sign firma GPG del commit Permite commits no firmados, vulnerando política de autoría verificada BLOQUEADO
--force / -f protecciones de rama Podría sobreescribir main. Pendiente añadir al hook v1.1 PENDIENTE
--force-with-lease actualizaciones remotas Menos peligroso que --force, pero a revisar para ramas protegidas EN REVISIÓN
git commit -m "..." nada Comando normal — todos los hooks se ejecutan PERMITIDO
✅ Checklist de implementación
.claude/settings.json creado en raíz del proyecto
Hook PreToolUse con matcher "Bash" configurado
regex cubre --no-verify y --no-gpg-sign
Archivo commiteado a main (todos se benefician)
Verificado manualmente con git commit --no-verify
Mencionado en CONTRIBUTING.md del proyecto
Añadir --force al bloqueo (v1.1 planificada)
Extender a hooks PostToolUse para alertas Slack
📈 Impacto estimado
REDUCCIÓN DE RIESGO DE SEGURIDAD
85% — Gitleaks ahora siempre se ejecuta
COBERTURA DE HOOKS DE CALIDAD
100% — ESLint, Prettier, Jest siempre activos
OVERHEAD PARA EL AGENTE IA
<1ms — grep sobre string local, sin red
💪 Sin impacto en velocidad del agente
El hook solo intercepta el 0.1% de llamadas Bash (las que tienen git + bypass). El 99.9% pasan sin procesamiento adicional.