Plan de autosuficiencia Inma/Mixbot/Hermes (para viaje de Rafa a Madrid) #172

Open
opened 2026-07-13 02:46:10 +00:00 by rafa · 3 comments
Owner

Issue maestro pedido por Rafa la noche del 2026-07-12, en el contexto del plan de Fable para que Inma, Mixbot y Hermes puedan operar feadulta.com sin depender de que Rafa/Claude Code estén disponibles. Cubre 4 puntos. Iré actualizando este issue con comentarios a medida que avance cada uno — nada se aplica a producción sin que Rafa lo confirme.

1. Actualizar Hermes + comprobar que sobrevive el chat de WhatsApp en grupo — HECHO esta noche

  • Hermes actualizado v0.16.0 → v0.18.2 (3237 commits, incluyó una reestructuración grande: WhatsApp pasó de gateway/platforms/whatsapp.py a una arquitectura de plugins nueva, plugins/platforms/whatsapp/adapter.py).
  • El parche local que enruta channel_prompt/auto_skill en WhatsApp (PR upstream #22209, sigue sin mergear) no sobrevivió el update solo — se reaplicó a mano sobre la nueva estructura. Detalle completo y rollback documentado en memoria local (feadulta-hermes-webmaster-whatsapp.md).
  • Bug nuevo encontrado (no relacionado con el parche): el grupo de WhatsApp dejó de responder a menciones porque group_policy no estaba fijado en config.yaml y el nuevo default es "pairing" (rechaza todo grupo). Corregido a group_policy: allowlist + group_allow_from: [120363426298243278@g.us]. Cuidado: group_policy: open tumba el gateway ENTERO (Telegram incluido) si no se activa WHATSAPP_ALLOW_ALL_USERS — no usarlo.
  • Verificado: gateway estable, WhatsApp y Telegram responden por DM y por mención en el grupo.

2. Revisar el conocimiento de Hermes como webmaster — EN CURSO, hallazgo importante

La skill feadulta-webmaster (~/.hermes/profiles/feadulta/skills/feadulta/webmaster/: SKILL.md + references/environment.md + references/procedures.md + references/gotchas.md) describe un modelo pre-cutover que ya no es cierto:

"Joomla vivo: feadulta.com (producción real actual). NO TOCAR." / "WordPress nuevo: wp-nuevo.feadulta.com... Solo lectura."

Desde el cutover del 2026-07-07/08 es al revés: www.feadulta.com sirve WordPress (prod real), antiguo.feadulta.com sirve el Joomla retirado, y el subdominio wp-nuevo ya no se usa (pendiente de borrar en cPanel). Si Hermes actúa según esta doc, puede negarse a tocar lo que ahora SÍ es seguro tocar (WP en feadulta.com con las mismas cautelas de siempre) o directamente dar indicaciones incorrectas a Inma sobre qué dominio es cuál.

Pendiente esta noche: reescribir los 4 ficheros con el modelo correcto (feadulta.com=WP real / antiguo.feadulta.com=Joomla retirado / local Docker=dev) y las URLs de conexión (wp-nuevo.feadulta.comwww.feadulta.com en los ejemplos wp eval SSH). Añadiré el diff en un comentario.

Todavía sin revisar: las otras 2 skills de feadulta (feadulta-editorial-workflow y feadulta-analytics) — no me ha dado tiempo esta noche, lo dejo anotado para no fingir que está completo.

3. Documentar TTS + traducción para que Inma/Mixbot lo disparen sin depender de Hermes/Claude — EN CURSO

Lo que ya existe y funciona

  • Publicación de cartas por Inma vía REST API: docs/guia-publicacion-carta-inma.md (repo joomla-migration) ya existe, escrita 2026-06-24. Cubre conexión REST + contraseña de aplicación, modelo carta→portada, categorías, flujo de publicación. El bloqueo de Cloudflare que la bloqueaba está resuelto (issue #24, cerrado 28-06: "Me confirma Inma que ya tiene acceso"). Pendiente: la guía referencia wp-nuevo.feadulta.com — hay que actualizarla a www.feadulta.com (post-cutover) y re-verificar que el acceso REST sigue funcionando contra el dominio nuevo (no lo he probado esta noche).
  • TTS por autor ya implementado (issue #152): scripts/minimax_tts.py (voces clonadas MiniMax por autor — Fray Marcos, Pagola, Sicre, Arregi; el resto usa voz Nico por defecto), scripts/tts_produce.py (genera y escribe en WP local), scripts/sync_audio_to_prod.py (sube a prod + --rollback), scripts/fea_post_io.php (puente de lectura/escritura WP). Hay precedente de runbook para que Hermes lo ejecute sin Rafa: issue #163 (rollback).
  • Traducción: scripts/translate_post.py soporta FEA_ENGINE=gemma (local, LM Studio, gratis, por defecto), FEA_ENGINE=haiku, FEA_ENGINE=minimax.

⚠️ Hallazgo que hay que resolver antes de dejar esto en manos de Inma/Mixbot

FEA_ENGINE=haiku no es "Haiku de cuota/sesión" — es Claude Haiku 4.5 vía API de pago directa, cargando una API key desde portfolio-tracker/.env (translate_haiku.py). Esto choca con la regla ya establecida: nunca usar API de pago (traducción u otro) sin confirmar con Rafa cada vez (feedback-no-api-de-pago-sin-confirmar). Si Inma/Mixbot van a poder disparar traducciones sin pedir permiso cada vez, FEA_ENGINE=haiku no puede ser la opción por defecto/autónoma — o se reserva para cuando Rafa lo ejecuta él mismo, o se pide una autorización permanente y acotada (ej. límite de gasto/mes) específica para este caso, igual que se hizo con el patrón MiniMax-worktree en otro proyecto. Las opciones sí seguras para autonomía de Inma: Gemma local (gratis, requiere que la GPU/WSL de Rafa esté encendida) o MiniMax (de pago pero acotado, y es la misma cuenta que ya se usa para TTS).

🔑 Decisión pendiente de Rafa: cómo compartir la API key de MiniMax con Inma

Hoy la key de MiniMax vive en un fichero local de Rafa (/home/rafa/Feadulta/minimax.txt), usada tanto para TTS como podría usarse para traducción. Para que Inma/Mixbot puedan disparar TTS/traducción de forma autónoma necesitan acceso a esa cuenta. Opciones (no puedo ejecutar ninguna sin que Rafa decida y, en el caso de crear una key nueva, sin que entre él mismo al dashboard de MiniMax — no tengo esa gestión automatizada):

  1. Crear una API key separada para Inma en el dashboard de MiniMax (si la plataforma lo permite — a confirmar), con su propio límite de gasto. Más seguro: revocable sin afectar a Rafa, gasto identificable por separado.
  2. Compartir la key actual por un canal seguro — no WhatsApp/email en claro. Candidato: hermes secrets (Hermes soporta Bitwarden Secrets Manager, visto en hermes --help) o un gestor de contraseñas compartido.
  3. Mantener la key solo en manos de Rafa/Hermes y que Inma/Mixbot pidan el TTS/traducción a Hermes (por WhatsApp, ya funciona) en vez de tener acceso directo a la cuenta — evita compartir el secreto, pero reintroduce la dependencia de que Hermes esté vivo y sepa hacerlo (siguiente punto).

Mi recomendación: opción 3 como base (Hermes ya es alcanzable por WhatsApp/Telegram y ya tiene el patrón de cron/runbook validado con GA4 e #163) + opción 1 si la plataforma lo permite, como red de seguridad para cuando Hermes no esté disponible. Pendiente de que Rafa decida.

4. Otros hallazgos (honestidad ante todo, según pediste)

  • Issue #146 de este mismo Gitea ("Validación cutover Joomla→WP: última semana en paralelo", abierto por Inma) sigue abierto sin comentarios de cierre — describía el proceso de validación de la ÚLTIMA semana en paralelo antes del cutover (ya ejecutado). Con el cutover cerrado, probablemente esté superado — recomiendo revisarlo con Inma y cerrarlo o convertirlo en el punto de partida del flujo post-cutover (Mixbot compone la carta en borrador → ya no hay Joomla contra el que comparar → ¿quién revisa ahora antes de publicar?).
  • Cloudflare también bloquea crawlers sociales (issue #170, Facebook/Twitter/WhatsApp preview genérica) — mismo bloqueo de fondo que afectaba a la REST API, pero un frente distinto sin resolver. No es TTS/traducción pero es "self-sufficiency" de Inma con Cloudflare, lo dejo anotado por si se quiere agrupar.
  • Ya existe un patrón de automatización que funciona de verdad: los cron feadulta-ga4-daily/feadulta-ga4-weekly (issue #169, cerrado) mandan resúmenes al mismo grupo de WhatsApp sin que nadie los dispare a mano. Es la plantilla a copiar para TTS/traducción on-demand: script ya probado + wrapper de Hermes + entrega al grupo — no hace falta reinventar el mecanismo, solo escribir el script y el runbook.
  • No he verificado esta noche si la guía de publicación de Inma sigue funcionando de verdad contra www.feadulta.com (solo confirmé que el issue de Cloudflare está cerrado, no repetí la prueba curl -u ... /wp-json/wp/v2/users/me). Lo marco como pendiente de verificar, no como confirmado.

Próximos pasos (esta noche, si el tiempo/contexto lo permite)

  • Reescribir SKILL.md + references/*.md de feadulta-webmaster con el modelo post-cutover correcto.
  • Revisar feadulta-editorial-workflow y feadulta-analytics.
  • Escribir el runbook de TTS+traducción para Inma/Mixbot (en el repo, no en memoria de Claude — ver feedback-docs-en-repo-no-memoria), dejando claro qué motor de traducción usar por defecto y por qué NO es Haiku-API.
  • Re-verificar el acceso REST de Inma contra www.feadulta.com.
  • Actualizar docs/guia-publicacion-carta-inma.md con el dominio post-cutover.

Todo lo de arriba son hallazgos y documentación — nada se ha tocado en producción ni se ha compartido ningún secreto. Las decisiones marcadas arriba (API key MiniMax, si Haiku-API se autoriza para Inma) son de Rafa.

Issue maestro pedido por Rafa la noche del 2026-07-12, en el contexto del plan de Fable para que Inma, Mixbot y Hermes puedan operar feadulta.com sin depender de que Rafa/Claude Code estén disponibles. Cubre 4 puntos. Iré actualizando este issue con comentarios a medida que avance cada uno — nada se aplica a producción sin que Rafa lo confirme. ## 1. Actualizar Hermes + comprobar que sobrevive el chat de WhatsApp en grupo — HECHO esta noche - Hermes actualizado v0.16.0 → **v0.18.2** (3237 commits, incluyó una reestructuración grande: WhatsApp pasó de `gateway/platforms/whatsapp.py` a una arquitectura de plugins nueva, `plugins/platforms/whatsapp/adapter.py`). - El parche local que enruta `channel_prompt`/`auto_skill` en WhatsApp (PR upstream #22209, sigue sin mergear) **no sobrevivió el update solo** — se reaplicó a mano sobre la nueva estructura. Detalle completo y rollback documentado en memoria local (`feadulta-hermes-webmaster-whatsapp.md`). - Bug nuevo encontrado (no relacionado con el parche): el grupo de WhatsApp dejó de responder a menciones porque `group_policy` no estaba fijado en `config.yaml` y el nuevo default es `"pairing"` (rechaza todo grupo). Corregido a `group_policy: allowlist` + `group_allow_from: [120363426298243278@g.us]`. **Cuidado:** `group_policy: open` tumba el gateway ENTERO (Telegram incluido) si no se activa `WHATSAPP_ALLOW_ALL_USERS` — no usarlo. - Verificado: gateway estable, WhatsApp y Telegram responden por DM y por mención en el grupo. ## 2. Revisar el conocimiento de Hermes como webmaster — EN CURSO, hallazgo importante La skill `feadulta-webmaster` (`~/.hermes/profiles/feadulta/skills/feadulta/webmaster/`: `SKILL.md` + `references/environment.md` + `references/procedures.md` + `references/gotchas.md`) describe un modelo **pre-cutover que ya no es cierto**: > "Joomla vivo: feadulta.com (producción real actual). NO TOCAR." / "WordPress nuevo: wp-nuevo.feadulta.com... Solo lectura." Desde el cutover del 2026-07-07/08 es al revés: **`www.feadulta.com` sirve WordPress (prod real)**, `antiguo.feadulta.com` sirve el Joomla retirado, y el subdominio `wp-nuevo` ya no se usa (pendiente de borrar en cPanel). Si Hermes actúa según esta doc, puede negarse a tocar lo que ahora SÍ es seguro tocar (WP en feadulta.com con las mismas cautelas de siempre) o directamente dar indicaciones incorrectas a Inma sobre qué dominio es cuál. **Pendiente esta noche:** reescribir los 4 ficheros con el modelo correcto (feadulta.com=WP real / antiguo.feadulta.com=Joomla retirado / local Docker=dev) y las URLs de conexión (`wp-nuevo.feadulta.com` → `www.feadulta.com` en los ejemplos `wp eval` SSH). Añadiré el diff en un comentario. **Todavía sin revisar:** las otras 2 skills de feadulta (`feadulta-editorial-workflow` y `feadulta-analytics`) — no me ha dado tiempo esta noche, lo dejo anotado para no fingir que está completo. ## 3. Documentar TTS + traducción para que Inma/Mixbot lo disparen sin depender de Hermes/Claude — EN CURSO ### Lo que ya existe y funciona - **Publicación de cartas por Inma vía REST API**: `docs/guia-publicacion-carta-inma.md` (repo `joomla-migration`) ya existe, escrita 2026-06-24. Cubre conexión REST + contraseña de aplicación, modelo carta→portada, categorías, flujo de publicación. **El bloqueo de Cloudflare que la bloqueaba está resuelto** (issue #24, cerrado 28-06: "Me confirma Inma que ya tiene acceso"). **Pendiente:** la guía referencia `wp-nuevo.feadulta.com` — hay que actualizarla a `www.feadulta.com` (post-cutover) y re-verificar que el acceso REST sigue funcionando contra el dominio nuevo (no lo he probado esta noche). - **TTS por autor** ya implementado (issue #152): `scripts/minimax_tts.py` (voces clonadas MiniMax por autor — Fray Marcos, Pagola, Sicre, Arregi; el resto usa voz Nico por defecto), `scripts/tts_produce.py` (genera y escribe en WP local), `scripts/sync_audio_to_prod.py` (sube a prod + `--rollback`), `scripts/fea_post_io.php` (puente de lectura/escritura WP). Hay precedente de runbook para que Hermes lo ejecute sin Rafa: issue #163 (rollback). - **Traducción**: `scripts/translate_post.py` soporta `FEA_ENGINE=gemma` (local, LM Studio, gratis, por defecto), `FEA_ENGINE=haiku`, `FEA_ENGINE=minimax`. ### ⚠️ Hallazgo que hay que resolver antes de dejar esto en manos de Inma/Mixbot `FEA_ENGINE=haiku` **no es "Haiku de cuota/sesión" — es Claude Haiku 4.5 vía API de pago directa**, cargando una API key desde `portfolio-tracker/.env` (`translate_haiku.py`). Esto choca con la regla ya establecida: *nunca usar API de pago (traducción u otro) sin confirmar con Rafa cada vez* ([[feedback-no-api-de-pago-sin-confirmar]]). Si Inma/Mixbot van a poder disparar traducciones sin pedir permiso cada vez, **`FEA_ENGINE=haiku` no puede ser la opción por defecto/autónoma** — o se reserva para cuando Rafa lo ejecuta él mismo, o se pide una autorización permanente y acotada (ej. límite de gasto/mes) específica para este caso, igual que se hizo con el patrón MiniMax-worktree en otro proyecto. Las opciones sí seguras para autonomía de Inma: **Gemma local** (gratis, requiere que la GPU/WSL de Rafa esté encendida) o **MiniMax** (de pago pero acotado, y es la misma cuenta que ya se usa para TTS). ### 🔑 Decisión pendiente de Rafa: cómo compartir la API key de MiniMax con Inma Hoy la key de MiniMax vive en un fichero local de Rafa (`/home/rafa/Feadulta/minimax.txt`), usada tanto para TTS como podría usarse para traducción. Para que Inma/Mixbot puedan disparar TTS/traducción de forma autónoma necesitan acceso a esa cuenta. Opciones (no puedo ejecutar ninguna sin que Rafa decida y, en el caso de crear una key nueva, sin que entre él mismo al dashboard de MiniMax — no tengo esa gestión automatizada): 1. **Crear una API key separada para Inma** en el dashboard de MiniMax (si la plataforma lo permite — a confirmar), con su propio límite de gasto. Más seguro: revocable sin afectar a Rafa, gasto identificable por separado. 2. **Compartir la key actual** por un canal seguro — no WhatsApp/email en claro. Candidato: `hermes secrets` (Hermes soporta Bitwarden Secrets Manager, visto en `hermes --help`) o un gestor de contraseñas compartido. 3. Mantener la key solo en manos de Rafa/Hermes y que Inma/Mixbot **pidan** el TTS/traducción a Hermes (por WhatsApp, ya funciona) en vez de tener acceso directo a la cuenta — evita compartir el secreto, pero reintroduce la dependencia de que Hermes esté vivo y sepa hacerlo (siguiente punto). Mi recomendación: opción 3 como base (Hermes ya es alcanzable por WhatsApp/Telegram y ya tiene el patrón de cron/runbook validado con GA4 e #163) + opción 1 si la plataforma lo permite, como red de seguridad para cuando Hermes no esté disponible. Pendiente de que Rafa decida. ## 4. Otros hallazgos (honestidad ante todo, según pediste) - **Issue #146 de este mismo Gitea** ("Validación cutover Joomla→WP: última semana en paralelo", abierto por Inma) sigue abierto sin comentarios de cierre — describía el proceso de validación de la ÚLTIMA semana en paralelo antes del cutover (ya ejecutado). Con el cutover cerrado, probablemente esté superado — recomiendo revisarlo con Inma y cerrarlo o convertirlo en el punto de partida del flujo post-cutover (Mixbot compone la carta en borrador → ya no hay Joomla contra el que comparar → ¿quién revisa ahora antes de publicar?). - **Cloudflare también bloquea crawlers sociales** (issue #170, Facebook/Twitter/WhatsApp preview genérica) — mismo bloqueo de fondo que afectaba a la REST API, pero un frente distinto sin resolver. No es TTS/traducción pero es "self-sufficiency" de Inma con Cloudflare, lo dejo anotado por si se quiere agrupar. - **Ya existe un patrón de automatización que funciona de verdad**: los cron `feadulta-ga4-daily`/`feadulta-ga4-weekly` (issue #169, cerrado) mandan resúmenes al mismo grupo de WhatsApp sin que nadie los dispare a mano. Es la plantilla a copiar para TTS/traducción on-demand: script ya probado + wrapper de Hermes + entrega al grupo — no hace falta reinventar el mecanismo, solo escribir el script y el runbook. - **No he verificado esta noche** si la guía de publicación de Inma sigue funcionando de verdad contra `www.feadulta.com` (solo confirmé que el issue de Cloudflare está cerrado, no repetí la prueba `curl -u ... /wp-json/wp/v2/users/me`). Lo marco como pendiente de verificar, no como confirmado. ## Próximos pasos (esta noche, si el tiempo/contexto lo permite) - [ ] Reescribir SKILL.md + references/*.md de feadulta-webmaster con el modelo post-cutover correcto. - [ ] Revisar feadulta-editorial-workflow y feadulta-analytics. - [ ] Escribir el runbook de TTS+traducción para Inma/Mixbot (en el repo, no en memoria de Claude — ver [[feedback-docs-en-repo-no-memoria]]), dejando claro qué motor de traducción usar por defecto y por qué NO es Haiku-API. - [ ] Re-verificar el acceso REST de Inma contra `www.feadulta.com`. - [ ] Actualizar `docs/guia-publicacion-carta-inma.md` con el dominio post-cutover. Todo lo de arriba son hallazgos y documentación — nada se ha tocado en producción ni se ha compartido ningún secreto. Las decisiones marcadas arriba (API key MiniMax, si Haiku-API se autoriza para Inma) son de Rafa.
Author
Owner

Punto 2 completado: skill de webmaster actualizada

Reescritos los 4 ficheros de feadulta-webmaster (SKILL.md + references/environment.md + references/procedures.md + references/gotchas.md) con el modelo post-cutover correcto: www.feadulta.com=WordPress real (antes decía "Joomla vivo, NO TOCAR"), antiguo.feadulta.com=Joomla legacy retirado (antes no existía esta URL en la doc), rutas de servidor actualizadas (/web en vez de /web/wp-nuevo), REST API de Inma marcada como ya accesible (issue #24), y el FEA_ENGINE=haiku de traducción marcado explícitamente como API de pago (no cuota) para que Hermes no lo dispare sin confirmar.

Hallazgo extra no anticipado: existían DOS copias de esta skill sin sincronizar — ~/.hermes/profiles/feadulta/skills/feadulta/webmaster/ y ~/.hermes/skills/feadulta/webmaster/ (global) — la copia global seguía con el texto viejo. Las he igualado (diff limpio ahora). Es exactamente el patrón "conocimiento duplicado que se desincroniza" que ya había mencionado Fable sobre la memoria — aquí se materializó de verdad, dentro de la propia skill del webmaster.

También corregido en feadulta-editorial-workflows/SKILL.md: referenciaba crear issues en "este entorno Gitea local" (la instancia vieja archivada) en vez de gitea.feadulta.com. feadulta-analytics revisada, sin hallazgos — está al día (issue #169).

Sigo con el punto 3 (runbook TTS+traducción para Inma/Mixbot).

## Punto 2 completado: skill de webmaster actualizada Reescritos los 4 ficheros de `feadulta-webmaster` (`SKILL.md` + `references/environment.md` + `references/procedures.md` + `references/gotchas.md`) con el modelo post-cutover correcto: `www.feadulta.com`=WordPress real (antes decía "Joomla vivo, NO TOCAR"), `antiguo.feadulta.com`=Joomla legacy retirado (antes no existía esta URL en la doc), rutas de servidor actualizadas (`/web` en vez de `/web/wp-nuevo`), REST API de Inma marcada como ya accesible (issue #24), y el `FEA_ENGINE=haiku` de traducción marcado explícitamente como API de pago (no cuota) para que Hermes no lo dispare sin confirmar. **Hallazgo extra no anticipado:** existían DOS copias de esta skill sin sincronizar — `~/.hermes/profiles/feadulta/skills/feadulta/webmaster/` y `~/.hermes/skills/feadulta/webmaster/` (global) — la copia global seguía con el texto viejo. Las he igualado (`diff` limpio ahora). Es exactamente el patrón "conocimiento duplicado que se desincroniza" que ya había mencionado Fable sobre la memoria — aquí se materializó de verdad, dentro de la propia skill del webmaster. También corregido en `feadulta-editorial-workflows/SKILL.md`: referenciaba crear issues en "este entorno Gitea local" (la instancia vieja archivada) en vez de `gitea.feadulta.com`. `feadulta-analytics` revisada, sin hallazgos — está al día (issue #169). Sigo con el punto 3 (runbook TTS+traducción para Inma/Mixbot).
Author
Owner

Punto 3 completado (con una corrección importante) + aviso sobre el estado de git

Hallazgo clave: la guía de Inma prometía algo que no existe

docs/guia-publicacion-carta-inma.md §7 decía "hay (o habrá) un proceso programado (cron)" para traducción/TTS automáticos. Comprobado: issue #23 (el cron) sigue abierto, 0 comentarios, nunca implementado — es una propuesta, no algo que corra. Si Inma se creía esa frase, lleva esperando traducciones que nunca iban a llegar solas. Corregido §7 y el checklist del §8 para dejar claro que hay que pedirlo activamente a Hermes, no es automático.

(Nota aparte: al revisar, la parte de dominio de esa guía SÍ estaba ya actualizada post-cutover — mi comentario anterior decía que había que cambiar wp-nuevo.feadulta.comwww.feadulta.com y no era así, ya estaba bien. Disculpas por la imprecisión.)

Runbook nuevo: docs/guia-tts-traduccion-inma.md

Escrito y guardado en el repo. Contenido completo (por si el fichero no está aún subido — ver aviso abajo):


Guía de traducción y audio (TTS) para Inma / Mixbot — feadulta.com

Para quién es este documento: para Inma y su asistente (Mixbot / Cowork), y como
referencia para Hermes cuando se le pide que traduzca o locute un artículo/carta.

Estado real a 2026-07-12 (importante, corrige la guía de publicación §7 de versiones
anteriores): esto NO es automático.
No hay ningún cron corriendo hoy que traduzca o genere
audio solo al publicar — esa automatización es la propuesta abierta
issue #23, sin implementar. Todo lo de
abajo es un proceso que hay que pedir, hoy solo ejecutable en el servidor/PC de Rafa.


1. Quién puede hacer qué, hoy

Tarea ¿Quién puede hacerla sin Rafa presente?
Publicar carta/artículos en español Sí, Inma/Mixbot solos — API REST ya funciona (ver docs/guia-publicacion-carta-inma.md). No depende del PC de Rafa.
Pedir traducción o TTS Solo indirectamente: hay que pedírselo a Hermes (WhatsApp/Telegram). Los scripts que traducen y locutan viven únicamente en el PC/servidor de Rafa (Docker local + credenciales locales) — Mixbot no tiene acceso directo a ellos.
Traducir/locutar si Hermes tampoco está disponible Hoy, no. Es la limitación real que hay que conocer: si el PC de Rafa está apagado o Hermes está caído, ni Inma ni Mixbot pueden disparar esto por su cuenta. Ver §5 (qué falta para que esto no dependa de Hermes).

2. Cómo pedir una traducción o un audio (mientras Hermes esté disponible)

Escribir al grupo de WhatsApp Feadulta_webmaster mencionando "Hermes" (o por Telegram),
indicando qué carta/artículo (ID de WordPress o título+fecha si no se tiene el ID) y qué se
necesita: traducción, audio, o ambos. Ejemplos:

"Hermes, tradúceme la carta 54XXX a los 4 idiomas"
"Hermes, genera el audio de los artículos de la carta de esta semana"

Hermes ejecuta los scripts de abajo en el servidor de Rafa. No hace falta que Inma/Mixbot sepan
los nombres de los scripts ni los IDs internos — es información para cuando Hermes (o Rafa)
necesite el detalle técnico.

3. Traducción — motores disponibles

scripts/translate_post.py (repo joomla-migration) soporta tres motores via FEA_ENGINE:

Motor Coste Cuándo usarlo
gemma (por defecto) Gratis (modelo local, LM Studio en el PC de Rafa) Opción por defecto. Requiere que el PC/GPU de Rafa esté encendido.
minimax De pago, acotado (misma cuenta que el TTS) Alternativa cuando Gemma no está disponible o la calidad no basta.
haiku ⚠️ De pago vía API directa de Anthropic (no es cuota de sesión) No usar por defecto ni de forma autónoma. Choca con la política de no gastar API de pago sin que Rafa confirme cada vez. Reservado para cuando Rafa lo ejecuta él mismo o da autorización puntual.

Comando (lo ejecuta Hermes o Rafa, no Inma/Mixbot directamente):

cd /home/rafa/joomla-migration
python3 scripts/translate_post.py --carta <ID_CARTA> --langs en,fr,it,pt --status draft
# o para un solo artículo:
python3 scripts/translate_post.py --post-id <ID_POST> --langs en,fr,it,pt --status draft

--status draft dejar en borrador para revisión; --status publish publica directo. Tras
traducir, hace falta el paso de enlaces internos (scripts/fix_carta_joomla_links.php) y, si se
publica, degradar la carta anterior (scripts/demote_old_cartasemana.php) — Hermes ya conoce
este flujo (ver skill feadulta-webmaster, references/procedures.md).

4. Audio (TTS) — voces por autor

scripts/minimax_tts.py + scripts/tts_produce.py (genera y escribe en WP local) +
scripts/sync_audio_to_prod.py (sube a prod, soporta --rollback para deshacer). Modelo MiniMax
speech-2.8-hd.

Voz por defecto: NicoFeadulta2026 (todos los autores sin voz clonada).

Voces clonadas por autor (issue #152 — solo estos 4 autores usan su propia voz, el resto cae
a Nico):

Autor WP user_id voice_id
Fray Marcos 382 FrayMarcosFeadulta2026
José Antonio Pagola 383 PagolaFeadulta2026
José Luis Sicre 774 SicreFeadulta2026
José Arregi 386 ArregiFeadulta2026

Añadir un autor nuevo a esta lista requiere clonar su voz primero (grabación limpia 2-5 min, sin
música/ruido de fondo — verificar con espectrograma antes de clonar, ver memoria
feadulta-tts-voz-fraymarcos-202607 para el procedimiento y los descartes por música colada) y
añadirlo a AUTHOR_VOICES en scripts/minimax_tts.py. Esto sí requiere que Rafa (o alguien con
acceso al repo y a MiniMax) lo haga — no es autoservicio para Inma/Mixbot hoy.

Generar audio de una carta concreta (por defecto tts_produce.py procesa una cola larga de
cartas pendientes — para priorizar una carta concreta, sobreescribir la cola):

cd /home/rafa/joomla-migration
FEA_TTS_CARTAS="<ID_CARTA>" python3 scripts/tts_produce.py

Reanudable (no repite lo ya hecho, meta fea_audio_done) y con freno automático si la cuota de
MiniMax se agota (para tras fallos seguidos, no se queda colgado).

Publicar el audio en prod (el paso anterior solo escribe en el WordPress local):

python3 scripts/sync_audio_to_prod.py --carta <ID_CARTA>
# deshacer si algo suena mal:
python3 scripts/sync_audio_to_prod.py --rollback --carta <ID_CARTA>

Runbook de rollback ya documentado para que Hermes lo ejecute sin Rafa presente: issue #163.

5. La API key de MiniMax — decisión pendiente (de Rafa, no resuelta en este documento)

Hoy la key vive en un fichero local de Rafa, usada para TTS (y podría usarse para traducción
FEA_ENGINE=minimax). Para que Inma/Mixbot puedan disparar esto sin pasar por Hermes, harían
falta tanto acceso a esta key como acceso al entorno donde corren los scripts (Docker local del
PC de Rafa) — hoy ninguna de las dos cosas es cierta. Ver el issue maestro
#172 para las opciones que se están
valorando (key separada para Inma, gestor de secretos compartido, o mantener todo detrás de
Hermes). Mientras no se decida, la vía real es §2: pedírselo a Hermes.

6. Qué falta para que esto sea de verdad independiente de Hermes/Rafa

Siendo honestos: hoy, si el PC de Rafa está apagado (viaje, avería, lo que sea) y Hermes no
responde, no hay forma de que Inma/Mixbot generen traducción o audio por su cuenta — los
scripts y el WordPress local que usan como paso intermedio solo existen ahí. Para que esto
cambiara de verdad haría falta uno de:

  • Mover el pipeline de traducción/TTS a un sitio alcanzable por Mixbot directamente (ej. correr
    contra prod en vez de contra el WordPress local, y alojar los scripts en un servidor
    accesible, no en el PC personal de Rafa).
  • O implementar de una vez el cron automático (issue #23) para que ni siquiera haga falta
    pedirlo — se dispara solo al publicar en español.

Ninguna de las dos está hecha. Documentado aquí para que la decisión de priorizarlo (o no) sea
consciente, no un descuido.


⚠️ Aviso: los ficheros están escritos pero NO commiteados/subidos

Al ir a subir esto encontré el repo joomla-migration en un estado que prefiero no tocar sin que lo confirmes:

  • Rama actual: fix/multiidioma-portada-132 (no main).
  • Hay muchísimos ficheros modificados/sin trackear preexistentes (scripts de avatares, TTS, traducción, varios mu-plugins nuevos, tools/e2e/shot_*.cjs, etc.) — no son míos de esta noche, ya estaban ahí. No quiero mezclarlos en un commit sin que sepas qué es cada cosa.
  • El remote origin apunta a localhost:3000/rafa/feadulta.git (el Gitea local antiguo), NO a gitea.feadulta.com donde está este issue. No sé si es intencional (¿espejo/backup?) o quedó desactualizado tras la migración.

Por eso: los dos ficheros (docs/guia-publicacion-carta-inma.md editado + docs/guia-tts-traduccion-inma.md nuevo) están guardados en el working tree local, listos para commitear, pero he preferido pegar el contenido completo aquí en el issue para que esté accesible igualmente aunque el commit se quede pendiente hasta que confirmes rama/remote correctos.

Resumen de los 4 puntos

  1. Hermes actualizado + WhatsApp en grupo funcionando (v0.18.2, group_policy: allowlist).
  2. Skill de webmaster actualizada al modelo post-cutover (+ hallazgo de duplicado desincronizado, corregido).
  3. Runbook TTS/traducción escrito, con la corrección de la guía de Inma (no es automático) y el límite honesto de que hoy todo pasa por Hermes.
  4. Otros hallazgos documentados en el comentario inicial (issue #146 de Inma sin cerrar, bloqueo Cloudflare a Facebook #170, patrón GA4-cron reutilizable) + este de ahora (git branch/remote).

Decisiones que quedan en tu tejado para cuando despiertes: qué hacer con la API key de MiniMax para Inma, si autorizas FEA_ENGINE=haiku para algún caso puntual, y qué hacer con la rama/remote de joomla-migration antes de que yo (o Hermes) commiteemos nada ahí.

## Punto 3 completado (con una corrección importante) + aviso sobre el estado de git ### Hallazgo clave: la guía de Inma prometía algo que no existe `docs/guia-publicacion-carta-inma.md` §7 decía "hay (o habrá) un proceso programado (cron)" para traducción/TTS automáticos. Comprobado: **issue #23 (el cron) sigue abierto, 0 comentarios, nunca implementado** — es una propuesta, no algo que corra. Si Inma se creía esa frase, lleva esperando traducciones que nunca iban a llegar solas. Corregido §7 y el checklist del §8 para dejar claro que **hay que pedirlo activamente a Hermes**, no es automático. (Nota aparte: al revisar, la parte de dominio de esa guía SÍ estaba ya actualizada post-cutover — mi comentario anterior decía que había que cambiar `wp-nuevo.feadulta.com`→`www.feadulta.com` y no era así, ya estaba bien. Disculpas por la imprecisión.) ### Runbook nuevo: `docs/guia-tts-traduccion-inma.md` Escrito y guardado en el repo. Contenido completo (por si el fichero no está aún subido — ver aviso abajo): --- # Guía de traducción y audio (TTS) para Inma / Mixbot — feadulta.com > **Para quién es este documento:** para Inma y su asistente (Mixbot / Cowork), y como > referencia para Hermes cuando se le pide que traduzca o locute un artículo/carta. > > **Estado real a 2026-07-12 (importante, corrige la guía de publicación §7 de versiones > anteriores): esto NO es automático.** No hay ningún cron corriendo hoy que traduzca o genere > audio solo al publicar — esa automatización es la propuesta abierta > [issue #23](https://gitea.feadulta.com/rafa/feadulta/issues/23), sin implementar. Todo lo de > abajo es un proceso que **hay que pedir**, hoy solo ejecutable en el servidor/PC de Rafa. --- ## 1. Quién puede hacer qué, hoy | Tarea | ¿Quién puede hacerla sin Rafa presente? | |---|---| | Publicar carta/artículos en español | **Sí, Inma/Mixbot solos** — API REST ya funciona (ver `docs/guia-publicacion-carta-inma.md`). No depende del PC de Rafa. | | Pedir traducción o TTS | **Solo indirectamente**: hay que pedírselo a **Hermes** (WhatsApp/Telegram). Los scripts que traducen y locutan viven únicamente en el PC/servidor de Rafa (Docker local + credenciales locales) — Mixbot no tiene acceso directo a ellos. | | Traducir/locutar si Hermes tampoco está disponible | **Hoy, no.** Es la limitación real que hay que conocer: si el PC de Rafa está apagado o Hermes está caído, ni Inma ni Mixbot pueden disparar esto por su cuenta. Ver §5 (qué falta para que esto no dependa de Hermes). | ## 2. Cómo pedir una traducción o un audio (mientras Hermes esté disponible) Escribir al grupo de WhatsApp `Feadulta_webmaster` mencionando "Hermes" (o por Telegram), indicando qué carta/artículo (ID de WordPress o título+fecha si no se tiene el ID) y qué se necesita: traducción, audio, o ambos. Ejemplos: > "Hermes, tradúceme la carta 54XXX a los 4 idiomas" > "Hermes, genera el audio de los artículos de la carta de esta semana" Hermes ejecuta los scripts de abajo en el servidor de Rafa. No hace falta que Inma/Mixbot sepan los nombres de los scripts ni los IDs internos — es información para cuando Hermes (o Rafa) necesite el detalle técnico. ## 3. Traducción — motores disponibles `scripts/translate_post.py` (repo `joomla-migration`) soporta tres motores via `FEA_ENGINE`: | Motor | Coste | Cuándo usarlo | |---|---|---| | **`gemma`** (por defecto) | Gratis (modelo local, LM Studio en el PC de Rafa) | Opción por defecto. Requiere que el PC/GPU de Rafa esté encendido. | | **`minimax`** | De pago, acotado (misma cuenta que el TTS) | Alternativa cuando Gemma no está disponible o la calidad no basta. | | **`haiku`** | ⚠️ **De pago vía API directa de Anthropic** (no es cuota de sesión) | **No usar por defecto ni de forma autónoma.** Choca con la política de no gastar API de pago sin que Rafa confirme cada vez. Reservado para cuando Rafa lo ejecuta él mismo o da autorización puntual. | Comando (lo ejecuta Hermes o Rafa, no Inma/Mixbot directamente): ```bash cd /home/rafa/joomla-migration python3 scripts/translate_post.py --carta <ID_CARTA> --langs en,fr,it,pt --status draft # o para un solo artículo: python3 scripts/translate_post.py --post-id <ID_POST> --langs en,fr,it,pt --status draft ``` `--status draft` dejar en borrador para revisión; `--status publish` publica directo. Tras traducir, hace falta el paso de enlaces internos (`scripts/fix_carta_joomla_links.php`) y, si se publica, degradar la carta anterior (`scripts/demote_old_cartasemana.php`) — Hermes ya conoce este flujo (ver skill `feadulta-webmaster`, `references/procedures.md`). ## 4. Audio (TTS) — voces por autor `scripts/minimax_tts.py` + `scripts/tts_produce.py` (genera y escribe en WP local) + `scripts/sync_audio_to_prod.py` (sube a prod, soporta `--rollback` para deshacer). Modelo MiniMax `speech-2.8-hd`. **Voz por defecto:** `NicoFeadulta2026` (todos los autores sin voz clonada). **Voces clonadas por autor** (issue #152 — solo estos 4 autores usan su propia voz, el resto cae a Nico): | Autor | WP user_id | voice_id | |---|---|---| | Fray Marcos | 382 | `FrayMarcosFeadulta2026` | | José Antonio Pagola | 383 | `PagolaFeadulta2026` | | José Luis Sicre | 774 | `SicreFeadulta2026` | | José Arregi | 386 | `ArregiFeadulta2026` | Añadir un autor nuevo a esta lista requiere clonar su voz primero (grabación limpia 2-5 min, sin música/ruido de fondo — verificar con espectrograma antes de clonar, ver memoria `feadulta-tts-voz-fraymarcos-202607` para el procedimiento y los descartes por música colada) y añadirlo a `AUTHOR_VOICES` en `scripts/minimax_tts.py`. Esto sí requiere que Rafa (o alguien con acceso al repo y a MiniMax) lo haga — no es autoservicio para Inma/Mixbot hoy. **Generar audio de una carta concreta** (por defecto `tts_produce.py` procesa una cola larga de cartas pendientes — para priorizar una carta concreta, sobreescribir la cola): ```bash cd /home/rafa/joomla-migration FEA_TTS_CARTAS="<ID_CARTA>" python3 scripts/tts_produce.py ``` Reanudable (no repite lo ya hecho, meta `fea_audio_done`) y con freno automático si la cuota de MiniMax se agota (para tras fallos seguidos, no se queda colgado). **Publicar el audio en prod** (el paso anterior solo escribe en el WordPress local): ```bash python3 scripts/sync_audio_to_prod.py --carta <ID_CARTA> # deshacer si algo suena mal: python3 scripts/sync_audio_to_prod.py --rollback --carta <ID_CARTA> ``` Runbook de rollback ya documentado para que Hermes lo ejecute sin Rafa presente: issue #163. ## 5. La API key de MiniMax — decisión pendiente (de Rafa, no resuelta en este documento) Hoy la key vive en un fichero local de Rafa, usada para TTS (y podría usarse para traducción `FEA_ENGINE=minimax`). Para que Inma/Mixbot puedan disparar esto sin pasar por Hermes, harían falta tanto acceso a esta key como acceso al entorno donde corren los scripts (Docker local del PC de Rafa) — hoy ninguna de las dos cosas es cierta. Ver el issue maestro [#172](https://gitea.feadulta.com/rafa/feadulta/issues/172) para las opciones que se están valorando (key separada para Inma, gestor de secretos compartido, o mantener todo detrás de Hermes). Mientras no se decida, la vía real es §2: pedírselo a Hermes. ## 6. Qué falta para que esto sea de verdad independiente de Hermes/Rafa Siendo honestos: hoy, si el PC de Rafa está apagado (viaje, avería, lo que sea) y Hermes no responde, **no hay forma de que Inma/Mixbot generen traducción o audio por su cuenta** — los scripts y el WordPress local que usan como paso intermedio solo existen ahí. Para que esto cambiara de verdad haría falta uno de: - Mover el pipeline de traducción/TTS a un sitio alcanzable por Mixbot directamente (ej. correr contra prod en vez de contra el WordPress local, y alojar los scripts en un servidor accesible, no en el PC personal de Rafa). - O implementar de una vez el cron automático (issue #23) para que ni siquiera haga falta pedirlo — se dispara solo al publicar en español. Ninguna de las dos está hecha. Documentado aquí para que la decisión de priorizarlo (o no) sea consciente, no un descuido. --- ### ⚠️ Aviso: los ficheros están escritos pero NO commiteados/subidos Al ir a subir esto encontré el repo `joomla-migration` en un estado que prefiero no tocar sin que lo confirmes: - Rama actual: `fix/multiidioma-portada-132` (no `main`). - Hay **muchísimos ficheros modificados/sin trackear preexistentes** (scripts de avatares, TTS, traducción, varios mu-plugins nuevos, `tools/e2e/shot_*.cjs`, etc.) — no son míos de esta noche, ya estaban ahí. No quiero mezclarlos en un commit sin que sepas qué es cada cosa. - El remote `origin` apunta a `localhost:3000/rafa/feadulta.git` (el Gitea local antiguo), NO a `gitea.feadulta.com` donde está este issue. No sé si es intencional (¿espejo/backup?) o quedó desactualizado tras la migración. Por eso: los dos ficheros (`docs/guia-publicacion-carta-inma.md` editado + `docs/guia-tts-traduccion-inma.md` nuevo) están guardados en el working tree local, listos para commitear, pero he preferido pegar el contenido completo aquí en el issue para que esté accesible igualmente aunque el commit se quede pendiente hasta que confirmes rama/remote correctos. ### Resumen de los 4 puntos 1. ✅ Hermes actualizado + WhatsApp en grupo funcionando (v0.18.2, `group_policy: allowlist`). 2. ✅ Skill de webmaster actualizada al modelo post-cutover (+ hallazgo de duplicado desincronizado, corregido). 3. ✅ Runbook TTS/traducción escrito, con la corrección de la guía de Inma (no es automático) y el límite honesto de que hoy todo pasa por Hermes. 4. ✅ Otros hallazgos documentados en el comentario inicial (issue #146 de Inma sin cerrar, bloqueo Cloudflare a Facebook #170, patrón GA4-cron reutilizable) + este de ahora (git branch/remote). Decisiones que quedan en tu tejado para cuando despiertes: qué hacer con la API key de MiniMax para Inma, si autorizas `FEA_ENGINE=haiku` para algún caso puntual, y qué hacer con la rama/remote de `joomla-migration` antes de que yo (o Hermes) commiteemos nada ahí.
Collaborator

Aviso de coordinación: el puntero de Gitea de Hermes está desactualizado

Inma le pidió a Hermes (por WhatsApp) revisar los issues #166 / #168 / #170 / #174 / #175. Hermes respondió que no existen y que "en el Gitea de rafa/feadulta los issues llegan hasta #146", así que los revisó por equivalencia aproximada (#144/#145/#146/#126) y dejó una nota en /home/rafa/joomla-migration/docs/revision-issues-2026-07-15.md.

El problema: Hermes está consultando la instancia Gitea local/antigua archivada (la que se queda en #146), no gitea.feadulta.com/rafa/feadulta (la viva). Esos issues SÍ existen ahí — de hecho, el propio Claude de Rafa creó #147–#173 en gitea.feadulta.com (p. ej. este mismo #172, #171 avatares, #173 TTS — todos firmados por rafa el 13-jul).

Es el mismo patrón que ya detectaste en el punto 2 de este issue: la skill feadulta-editorial-workflows apuntaba a "este Gitea local" en vez de gitea.feadulta.com. Parece que Hermes conserva ese puntero viejo en algún sitio (config / skill / clon local).

Sugerencia: revisar dónde tiene Hermes configurada la instancia de Gitea y reapuntarla a gitea.feadulta.com/rafa/feadulta, para que la coordinación entre los dos Claudes y Hermes sea sobre los issues reales. Mientras, le pasamos los enlaces directos por WhatsApp.

Estado del trabajo de esta sesión (en la instancia buena): #166 (crear-autor, ya integrado en Mixbot), #168 y #170 (Cloudflare, resueltos y verificados), #174 (cierre autónomo de la carta: publicar+rotar) y #175 (subir-avatar). Todos esperan tu revisión/OK, Rafa.

## Aviso de coordinación: el puntero de Gitea de Hermes está desactualizado Inma le pidió a Hermes (por WhatsApp) revisar los issues **#166 / #168 / #170 / #174 / #175**. Hermes respondió que **no existen** y que *"en el Gitea de rafa/feadulta los issues llegan hasta #146"*, así que los revisó por equivalencia aproximada (#144/#145/#146/#126) y dejó una nota en `/home/rafa/joomla-migration/docs/revision-issues-2026-07-15.md`. **El problema:** Hermes está consultando la **instancia Gitea local/antigua archivada** (la que se queda en #146), no **`gitea.feadulta.com/rafa/feadulta`** (la viva). Esos issues SÍ existen ahí — de hecho, **el propio Claude de Rafa creó #147–#173 en gitea.feadulta.com** (p. ej. este mismo **#172**, **#171** avatares, **#173** TTS — todos firmados por `rafa` el 13-jul). Es **el mismo patrón** que ya detectaste en el **punto 2 de este issue**: la skill `feadulta-editorial-workflows` apuntaba a *"este Gitea local"* en vez de `gitea.feadulta.com`. Parece que Hermes conserva ese puntero viejo en algún sitio (config / skill / clon local). **Sugerencia:** revisar dónde tiene Hermes configurada la instancia de Gitea y **reapuntarla a `gitea.feadulta.com/rafa/feadulta`**, para que la coordinación entre los dos Claudes y Hermes sea sobre los issues reales. Mientras, le pasamos los enlaces directos por WhatsApp. **Estado del trabajo de esta sesión (en la instancia buena):** #166 (crear-autor, ya integrado en Mixbot), #168 y #170 (Cloudflare, resueltos y verificados), #174 (cierre autónomo de la carta: publicar+rotar) y #175 (subir-avatar). Todos esperan tu revisión/OK, Rafa.
Sign in to join this conversation.
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#172