PagoKit no solo escribe el código · también pone 5 candados deterministas que se ejecutan en cada acción de Claude Code. Si intentás violar uno (publicar una API key, escribir un webhook sin firma, etc.), el commit se bloquea. No es una sugerencia · es un hook PostToolUse que falla hard.
01Sin API keys hardcoded
Qué protege
Evita que termines publicando una clave secreta de Stripe (o cualquier proveedor) directo en el código fuente.
Cómo funciona
Escanea cada archivo modificado buscando patrones de API keys reales (sk_live_*, prod_*, etc.). Si encuentra una, bloquea el commit y te indica el archivo y la línea para que la muevas al `.env`.
02`.env` siempre en `.gitignore`
Qué protege
Evita que termines pusheando el archivo con tus secretos a GitHub. Es el error más común y el más caro · una vez que está en el historial, asumí que tus keys ya están comprometidas.
Cómo funciona
Antes de cualquier commit, verifica que `.env` esté listado en `.gitignore`. Si no está, lo agrega automáticamente o falla con instrucciones claras.
03Webhooks siempre verifican firma
Qué protege
Evita que cualquiera con tu URL de webhook simule un pago y desbloquee accesos premium en tu app sin haber pagado nada.
Cómo funciona
Inspecciona cada endpoint webhook generado y exige que llame al método de verificación de firma del proveedor (Stripe.webhooks.constructEvent, MercadoPago.signatureVerify, etc.) antes de procesar el body.
04Idempotency canónica por UUID
Qué protege
Evita doble cobro si una request se reintenta. Si Stripe te manda el mismo evento dos veces (cosa que pasa), tu DB no genera dos rows de pago.
Cómo funciona
Cada operación de cobro y refund usa un idempotency key generado como UUID v4 desde el cliente, persistido en la tabla `Payment`. El segundo intento con la misma key devuelve el resultado del primero sin re-ejecutar.
05Raw body antes de parsear
Qué protege
Evita que tu webhook rechace pagos legítimos porque Express ya parseó el JSON y la firma deja de verificar. Es un bug clásico que cuesta horas debuguear.
Cómo funciona
Configura el middleware de raw body solo en las rutas de webhook (`bodyParser.raw({ type: 'application/json' })` o el equivalente Next.js). El body se preserva tal cual llegó y la firma valida bien.
Además de los 5 deterministas · 7 reglas guía
Además de los 5 candados deterministas (que bloquean el commit), PagoKit trae 7 reglas guía no-bloqueantes que te avisan si estás haciendo cosas raras · sin replay protection en el webhook, sin límite de body size, logueando datos sensibles (PII), usando live keys en desarrollo. No te frenan, pero te dejan un comentario en el código.
Escape hatch · cuando tenés que saltarte una regla
Si necesitás saltarte una regla por una razón legítima · por ejemplo, un caso de uso muy específico que el candado no contempla · podés agregar el comentario `// pagokit-ignore: <nombre-regla> -- <tu-razón>` en la línea problemática. PagoKit lo deja pasar pero queda registrado en `.pagokit/audit.log` con tu razón, para que un futuro vos (o cualquier otra persona del equipo) sepa por qué se desactivó.