Sentinel — guardrails de arquitectura en cada commit
Sentinel es el validador en Go que corre al hacer commit y bloquea violaciones de arquitectura, secretos hardcodeados, fugas entre capas y mal naming antes de que lleguen a un PR. Veintiuna reglas built-in, totalmente extensible vía YAML.
Actualizado: 2026-04-30
Sentinel es un binario Go (korva-sentinel) que escanea archivos staged al momento del commit y bloquea el commit ante violaciones graves. Es la segunda mitad de Korva — Vault le da memoria a la IA, Sentinel se asegura de que no pueda mandar código malo aunque ignore esa memoria.
Tres formas de ejecutarlo
- Hook pre-commit (recomendado). Instalado por
korva sentinel install, corre automáticamente en cadagit commit. - Escaneo manual.
korva sentinel checkejecuta el validador sobre los archivos actualmente en stage e imprime los hallazgos sin commitear. - CI/CD.
korva-sentinel --format jsonemite un reporte parseable que puedes publicar en PRs de GitHub o guardar como artefacto del build.
CLI
korva-sentinel [--format text|json] [--profile minimal|standard|strict] [--fail-on-warning] [files...]Inputs:
- stdin:
git diff --cached --name-only | korva-sentinel - args explícitos:
korva-sentinel src/domain/x.ts src/application/y.ts
Output:
text— íconos coloreados (✓ pass, ✗ error, ⚠ warning) conarchivo:línea:coljson— reporte estructurado para tooling
Perfiles de severidad
| Perfil | Reglas activas | Recomendado para |
|---|---|---|
minimal | solo SEC-001 | Equipos recién empezando |
standard (default) | HEX-001/002/003, SEC-001 | Balance de arquitectura + seguridad |
strict | Todas las built-in | Equipos maduros, enforcement total |
Familias de reglas built-in
| ID | Familia | Severidad | Atrapa |
|---|---|---|---|
| HEX-001 | Hexagonal | Error | Capa de dominio importando de infrastructure/application |
| HEX-002 | Hexagonal | Error | Capa de application importando de infrastructure |
| HEX-003 | Hexagonal | Error | console.* en src/ (excluyendo tests) |
| HEX-004 | Hexagonal | Error | new XAdapter(...) fuera de *.module.ts |
| HEX-005 | Hexagonal | Warning | : any sin un comentario // korva-ignore: <razón> |
| NAM-001 | Naming | Error | Sufijo Dto en lugar de DTO |
| NAM-002 | Naming | Error | Token de puerto DI no en SCREAMING_SNAKE_CASE |
| NAM-003 | Naming | Warning | Archivos en /adapters/ que no siguen *.adapter[.variant].ts |
| SEC-001 | Security | Error | Secretos hardcodeados (literales password, api_key, secret, token) |
| TEST-001 | Testing | Warning | Tests en __tests__/ o test/ en lugar de co-located |
Reglas documentadas (cargadas por YAML)
Puedes dejar un archivo <rule-id>.yaml en .korva/rules/ y Sentinel lo recoge. Ver sentinel/rules/AGENTS.md para la referencia canónica. Highlights:
- ARC-001 — imports de frameworks (
express,nestjs,prisma…) dentro de domain/core - ARC-002 — funciones de más de 25 líneas o llamadas a DB dentro de handlers HTTP
- ARC-003 —
db.query,prisma.*,mongoose.*fuera de repository/store - SEC-002 —
logger.info(password),console.log(token)con nombres de variable sensibles - SEC-003 — igualdad directa (
==/===) sobre valores de token/secret/HMAC/firma (timing attack) - SEC-004 — CORS con
origin: "*"oAccess-Control-Allow-Origin: * - SEC-005 — SQL en template literals con interpolación
- SEC-006 — rutas admin/internas/de usuario sin middleware de autenticación
- QC-001 —
console.log,debugger;,breakpoint()ensrc/ - QC-002 —
: any/as anysin justificación - DEPS-001 — imports de paquetes vulnerables (
lodash<4.17.21,moment,node-serialize,eval())
Supresiones
Si una regla dispara y tienes una razón real para mantener el código, añade un comentario inline en la misma línea:
const publicData: any = response.data // korva-ignore: API externa, sin tipo estático disponibleUn // korva-ignore pelado (sin razón) es a su vez una violación — Sentinel te obliga a escribir por qué estás suprimiendo.
Instalador de hooks
korva sentinel installCrea / reemplaza:
.git/hooks/pre-commitEjecutakorva sentinel run --hook=pre-commit. Sikorvano está en el$PATH, el hook imprime un warning y deja pasar el commit — degradación con normalidad, nunca bloquea a nuevos contributors..git/hooks/post-commitNo bloquea, ejecutakorva sync --vault --quiet. Se usa para empujar observaciones a Hive cuando está activo.
Arquitectura
sentinel/├── validator/│ ├── cmd/korva-sentinel/main.go → entry, flags, dispatch│ └── internal/│ ├── rules/ → implementaciones Go de cada regla│ └── analyzer/ → generación de reportes text/json├── hooks/│ ├── pre-commit│ ├── post-commit│ └── install.sh└── rules/ └── AGENTS.md → documentación canónica de cada regla¿Por qué un gate pre-commit?
La IA genera código rápido. La revisión de código es lenta. La ventana entre “la IA escribió el código” y “PR abierto” es donde se cuelan los malos patrones. Sentinel cierra esa ventana — el developer ve la violación al instante, en su propia máquina, antes de que salga de su rama.
Siguiente
- Workflow de Forge SDD — Sentinel corre como parte de la fase Verify
- Referencia de reglas de Sentinel — cada regla con ejemplos
- Self-hosting — ejecutar Sentinel en CI