Skill: AEGIS | Type: troubleshooting Summary: EPISODIO 22 — HANDOFF_PROMPT.md: Checkpoint — antes de tocar el hook (paso 6)
3.1 KiB
3.1 KiB
| episode_id | puente_flat | session_code | acto_dialogico | actor_flujo | criticidad_aegis | skill_dominante | fase_proyecto | tipo_semantico | summary_one_line | source_type | trust_boundary | created_at | relectura_tagged | forgejo_commit_sha |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| da2eff63-0ba8-42ce-91d9-e9f76a7023ef | TRAZA_checkpoint-antes-de-tocar-el-hook-paso_S20260518.R22_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD | S20260518.PIPELINE_FIXES | informar | multi_actor | low | AEGIS | operations | troubleshooting | EPISODIO 22 — HANDOFF_PROMPT.md: Checkpoint — antes de tocar el hook (paso 6) | claude_code | internal | 2026-05-19T21:21:12.986650+00:00 | false | pending |
Paso 5 — verde. Fase 5 pasos 1-5 completos.
Checkpoint — antes de tocar el hook (paso 6)
Lo que está construido y probado (todo aislado — mega-hook-ssh.py sigue intacto):
| Artefacto | Estado |
|---|---|
docs/HALLAZGO_SSH_HOOK_QUOTE_BYPASS_S20260518.md |
spec del fix |
policies/ — modelo + 2 CSV |
constitución declarativa (13 patrones) |
casbin-poc/casbin_ssh_authz.py |
motor corregido — extrae el payload, decide vía Casbin |
casbin-poc/test_casbin_ssh_authz.py |
217 verificaciones + 7 tests pytest, todos verdes |
Los tests prueban contra el comportamiento correcto: los 3 casos que el hook roto permite hoy (rm -rf, git push --force, docker prune en forma ssh "...") ahora dan deny; el caso#4 (sed que menciona rm) da warn, sin over-trigger.
Lo que hace el paso 6 — la integración al hook vivo:
- Mover
casbin_ssh_authz.pya su hogar de producción.claude/hooks/lib/. - En
mega-hook-ssh.py: reemplazar las secciones DESTRUCTIVE + MODIFY (L133-191) y la función_is_inside_quotespor una llamada aevaluate(command, enabled_rules). - Conservar todo lo demás del hook: SSH-scope gate, override flag,
ssh_mode(BLOCK/WARN/OFF), toggles de config (pasados comoenabled_rules), logging, formato de salida JSON. - Backup
.bakprevio. Paso 7: re-correr el sondeo sobre el hook integrado para verificar in-vivo.
Disclosures honestas (PROCEDENCIA):
- El hueco de seguridad sigue abierto en el hook vivo hasta que el paso 6 integre el fix. La lógica está probada; la integración se verifica en el paso 7.
- Limitación residual 1:
psql -c 'DROP TABLE'— destructivo dentro de una comilla que ejecuta — sigueallow(pre-existente, no regresión, documentado). - Limitación residual 2 (la hallé al escribir los tests): la forma sin comillas
ssh cx43 sed -i 's/rm -rf/x/' fdadeny(falso positivo) — el shell local quita las comillas y dejarm -rfsuelto. Es fail-closed (molesto, no peligroso); la forma con comillas funciona bien. La añado a la sec. 6 del doc. - Capa C (mutation testing con mutmut) — declarada pendiente; no ejecutada.
Reframe: la lógica del fix está probada en aislamiento; lo que resta es el cableado al hook vivo. El riesgo pasa de "¿es correcta la lógica?" (resuelto: verde) a "¿la integración preserva las demás responsabilidades del hook?" — y eso lo verifica el paso 7. Es reversible (backup + git checkout).