feat(episode): BACKFILL_q-13f4d77e-8ee8-5c25-be65-c4f167b575f2_S20260426.INST19752_XX.bkf.0.warm_qdr.orphan.in.cc.es.000.BKF_J.EE99E_E.C30-B

Skill: AEGIS | Type: chronicle
Summary: [TESSERA S20260426.INST19752.R1] | sesion=S20260426.INST19752 turno=R1 tipo=assi
This commit is contained in:
Ember 2026-05-11 04:32:29 +00:00
parent 7ce00ce5e6
commit 14eef51139

View file

@ -0,0 +1,79 @@
---
episode_id: "ee99ec30-b528-5568-b30b-8b499324c24d"
puente_flat: "BACKFILL_q-13f4d77e-8ee8-5c25-be65-c4f167b575f2_S20260426.INST19752_XX.bkf.0.warm_qdr.orphan.in.cc.es.000.BKF_J.EE99E_E.C30-B"
session_code: "S20260426.INST19752"
acto_dialogico: "informar"
actor_flujo: "ember_internal"
criticidad_aegis: "moderate"
skill_dominante: "AEGIS"
fase_proyecto: "maintenance"
tipo_semantico: "chronicle"
summary_one_line: "[TESSERA S20260426.INST19752.R1] | sesion=S20260426.INST19752 turno=R1 tipo=assistant | dominio=infrastructure modo=ejecución emocion=urgencia | hora=20:52 --- # 📋 Bloque 2 — Runbook entregado, esper"
source_type: "claude_code"
trust_boundary: "default"
created_at: "2026-04-26T20:52:25.286566+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
[TESSERA S20260426.INST19752.R1] | sesion=S20260426.INST19752 turno=R1 tipo=assistant | dominio=infrastructure modo=ejecución emocion=urgencia | hora=20:52
---
# 📋 Bloque 2 — Runbook entregado, esperando checkpoint granular
## ✅ B1 cerrado
```
-rw------- /home/johnember/ember-mcp-server-v3/.env (era 0644)
-rw------- /home/johnember/ember-ecosystem/crisol/workers/.env (era 0664)
```
## 📦 Runbook B2 entregado
**Path:** `docs/RUNBOOK_ROTACION_3_CREDENCIALES_S20260426_AEGIS.md` (~280L con passport completo)
### Estructura del runbook
| Sección | Contenido |
|---------|-----------|
| Contexto | Por qué rotar pre-cifrado |
| Orden recomendado | Neo4j → Qdrant → PostgreSQL (riesgo creciente) |
| Rotación 1 — Neo4j | 5 fases (PRE-CHECK + BACKUP + ROTATE + UPDATE + VERIFY) + ROLLBACK |
| Rotación 2 — Qdrant | 5 fases con detección triple `.env` drift |
| Rotación 3 — PostgreSQL | 5 fases con `pg_dump` backup completo |
| Post-rotación | Limpieza backups + paso a B3 cifrado SOPS |
| Riesgos R-01..R-06 | 6 mitigaciones documentadas |
| Checkpoints granulares | 3 frases exactas que necesito de John |
### Resumen de comandos críticos por rotación
| # | Credencial | Comando central |
|---|-----------|-----------------|
| 1 | NEO4J_PASS | `cypher-shell ALTER CURRENT USER SET PASSWORD FROM 'old' TO 'new'` |
| 2 | QDRANT_API_KEY | `openssl rand -hex 32` + update 3 `.env` + `docker restart qdrant` |
| 3 | PostgreSQL plex | `psql -c "ALTER USER plex WITH PASSWORD '...'"` + update DSN URL |
### Riesgos consolidados (resumen)
- **R-01** Container `ember-mcp` queda sin acceso → mitigado por backup `.env.bak` + rollback documentado
- **R-02** Password con caracteres URL-rompedores → `tr -d '=/+'` filtra `+`, `/`, `=`
- **R-03** Workers ocultos con misma credencial → `grep -l` global busca TODOS los `.env`
- **R-04** Password queda en bash history → `unset HISTFILE` o heredoc
- **R-05** Rotación interrumpida deja inconsistencia → atomicidad por rotación
- **R-06** Dump SQL contiene plaintext → `shred -u` post-verificación
---
## ❓ Esperando 3 checkpoints granulares
| Checkpoint | Frase exacta tuya | Lo que ejecuto |
|------------|-------------------|----------------|
| **CP-1** | `rota Neo4j` | Fases 1.1-1.5 (~5 min, riesgo bajo) |
| **CP-2** | `rota Qdrant` | Fases 2.1-2.5 (~10 min, riesgo medio — 3 `.env` drift) |
| **CP-3** | `rota PG` | Fases 3.1-3.5 (~10 min, riesgo medio-alto — pipeline crítico) |
**Mi recomendación:** empezar por **CP-1** (Neo4j) porque tiene menor blast radius. Si VERIFY pasa sin issues, procedo con CP-2 cuando confirmes. Si VERIFY falla, ejecuto rollback de ESA rotación únicamente y reporto antes de continuar.
**Alternativa:** si prefieres ejecutar las 3 en cadena sin checkpoints intermedios, dime `rota las 3 en cadena` (riesgo más alto pero más rápido).
---