feat(episode): TRAZA_para-john-r1_S20260616.R24_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: chronicle
Summary: EPISODIO 24 — Vaultwarden: 📍 PARA JOHN — R1
This commit is contained in:
Ember 2026-06-18 16:41:51 +00:00
parent ae4f613ad0
commit 70d302730e

View file

@ -0,0 +1,48 @@
---
episode_id: "6900fcf1-c7bd-412a-98b2-7773990cbe89"
puente_flat: "TRAZA_para-john-r1_S20260616.R24_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260616.LOOP_WRITE_BACKLOG_DISCARD"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "chronicle"
summary_one_line: "EPISODIO 24 — Vaultwarden: 📍 PARA JOHN — R1"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-06-17T21:21:02.687446+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
**El matiz que cierra el círculo:** file-secrets es *inyección*, pero el archivo-fuente aún vive en disco → todavía necesitas **cifrado-at-rest del source** (mínimo chmod 600 + idealmente `SOPS+age` para versionar cifrado en git). Ahí Vaultwarden suma como **el índice humano "qué secretos existen"** que tú consultas, mientras la fuente de máquina son los file-secrets cifrados. **file-secrets para máquinas, Vaultwarden para ti.**
### 📍 PARA JOHN — R1
- **Hice:** te di la recomendación razonada con la corrección de que ninguno está generalizado aún, y el marco de que resuelven capas distintas.
- **Falta:** tu confirmación de la dirección (file-secrets como estándar de servicio) — eso ancla el roadmap que el workflow está sintetizando.
- **Mi consejo:** **adoptar Docker file-secrets como estándar de servicio** (migración stack-por-stack desde `env_file`), Vaultwarden se queda como tu bóveda personal + catálogo. Es la opción que mata la exposición real con tecnología que ya probaste, sin sumar fragilidad.
- **Para avanzar, elige:**
- 🟢 **A (recomendado):** confirmas file-secrets como estándar de servicio → lo fijo como la decisión P1 del roadmap (que ya viene en camino del workflow).
- 🟡 **B:** prefieres explorar Vaultwarden-programático (vía `bw` CLI/API) antes de descartarlo — hago una prueba de concepto de cuán viable es inyectarlo a un container.
- ⚪ **C:** prefieres SOPS+age como fuente cifrada git-friendly (te explico cómo se combina con file-secrets).
**Entregado:** [ROADMAP_SECRETOS_EXCELENCIA_S20260616.md](docs/ROADMAP_SECRETOS_EXCELENCIA_S20260616.md) — el plan que pediste, ya **curado contra gold-plating**.
## El plan en una mirada
**Target state:** de *"crónica de una rotación"* a *"sistema auditable verificable en 1 comando"* (`secrets_status.py`). Dimensionado para operador solo: **sin** rotación automática diaria, **sin** HSM, **sin** Vault clustering, **sin** TLS intra-docker, **sin** matriz RBAC empresarial.
**El crítico adversarial ganó su sueldo** — cortó 5 cosas sobre-ingenieriadas y, lo más importante, **sacó el "skill matriz" del camino crítico de secretos** (era un segundo proyecto montado encima; va a su propio sprint *después*). Y tapó **3 huecos reales**, uno que me incrimina directamente:
> 🚨 **`MEMORY.md` tiene keys VIVAS en plaintext** (Karakeep, Langfuse pk/sk, Meilisearch) — y **yo las leo en CADA boot**. Es una fuga mayor y más constante que el historial git, y el plan original la ignoraba. Lo confirmo: están en `memory/MEMORY.md` ahora mismo, las vi en mi propio contexto de arranque. **Es P0.**
**El camino mínimo (8 pasos), empezando por contener lo que sangra:**
1. 🔴 Rotar la key OpenAI (ya confirmada VIVA HTTP 200) + decidir las keys plaintext de `MEMORY.md`.
2. 1 pregunta: Vaultwarden vs `.env.local` canónico (mi reco: file-secrets para servicio, Vaultwarden bóveda humana).
3. Inventario completo + verificado (los ≥6 secretos omitidos, cada uno con liveness real).
4. `secrets_status.py` **read-only** (PASS/FAIL, NUNCA imprime un valor).
5. Matar hardcoded (SEC-D3 1-línea + SEC-D2) + hook que impide que renazca.
6. Rollback-por-paso en rotaciones (la lección de plex, generalizada).
7. Gobernanza ligera (tabla blast-radius + política de rotación de 1 párrafo + audit solo ROTATE/DISTRIBUTE).
8. Auto-regen ARIADNA al final. *(Skill matriz → sprint aparte.)*