feat(episode): DEPURA_sonidos-de-voz-silenciados-sin-borrar-n_S20260705.R66_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: troubleshooting
Summary: EPISODIO 66 — BLINDADAS: 🔇 Sonidos de voz: silenciados (sin borrar nada)
This commit is contained in:
Ember 2026-07-12 16:21:58 +00:00
parent 43e2ead39f
commit 2c00a0cee4

View file

@ -0,0 +1,44 @@
---
episode_id: "fc095783-76f3-4ff1-8280-56e2dfb1e74f"
puente_flat: "DEPURA_sonidos-de-voz-silenciados-sin-borrar-n_S20260705.R66_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260705.EVAL_INSTRUMENT_FORGE_SKILL"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 66 — BLINDADAS: 🔇 Sonidos de voz: silenciados (sin borrar nada)"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-07-12T16:16:37.005044+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
Listo. **Todo verde — Fase 7 cerrada.** El interruptor funciona y ya está **apagado**.
## 🔇 Sonidos de voz: silenciados (sin borrar nada)
Encontré el sistema — se llaman **"voice hooks"**. Un solo script (`safe_voice_hook.py`) registrado en los 30 eventos de Claude Code reproduce un `.wav` por cada uno (*"Claude está a punto de usar una herramienta"*, *"La herramienta terminó correctamente"*, etc.).
**Qué hice:** le añadí un **interruptor maestro** — antes no existía; la única forma de apagar era borrar listas. Ahora es un solo valor:
| Archivo | Cambio | Efecto |
|---|---|---|
| [voice_hooks_config.json](.claude/hooks/config/voice_hooks_config.json) | `"enabled": false` | 🔇 silencio total (**activo ahora**) |
| [safe_voice_hook.py:80](.claude/hooks/scripts/safe_voice_hook.py) | guard clause 3 líneas | lee el switch; ausente/`true`→suena, `false`→calla |
**Nada se borró:** el manifest (30 sonidos + textos), la doble allowlist y el registro en `settings.local.json` quedan **intactos**. Es reversible con un flip.
**Verificación empírica (no "creo que funciona"):**
- `event_is_allowed` → **OFF=`False`**, ON=`True`, sin-la-clave=`True` (compat) — 3 asserts pasan.
- Config on-disk: `enabled = False`. Hook end-to-end en mudo → **exit 0, sin reproducir**.
- Es **inmediato y en vivo**: el script relee la config en cada evento, no hace falta reiniciar.
## 🔊 Cómo prenderlo/apagarlo luego
- **Dímelo a mí** (lo que pediste): *"Ember, prende los sonidos"* / *"apaga los sonidos"* → yo volteo el `enabled`.
- **Tú mismo** (si quieres, 5 seg): abre `voice_hooks_config.json`, cambia `"enabled": false` → `true`. El `_README_voz` al inicio del archivo lo explica.
**Rollback:** `git checkout HEAD -- .claude/hooks/scripts/safe_voice_hook.py .claude/hooks/config/voice_hooks_config.json`