Plan de autosuficiencia Inma/Mixbot/Hermes (para viaje de Rafa a Madrid) #172
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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
gateway/platforms/whatsapp.pya una arquitectura de plugins nueva,plugins/platforms/whatsapp/adapter.py).channel_prompt/auto_skillen 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).group_policyno estaba fijado enconfig.yamly el nuevo default es"pairing"(rechaza todo grupo). Corregido agroup_policy: allowlist+group_allow_from: [120363426298243278@g.us]. Cuidado:group_policy: opentumba el gateway ENTERO (Telegram incluido) si no se activaWHATSAPP_ALLOW_ALL_USERS— no usarlo.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:Desde el cutover del 2026-07-07/08 es al revés:
www.feadulta.comsirve WordPress (prod real),antiguo.feadulta.comsirve el Joomla retirado, y el subdominiowp-nuevoya 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.comen los ejemploswp evalSSH). Añadiré el diff en un comentario.Todavía sin revisar: las otras 2 skills de feadulta (
feadulta-editorial-workflowyfeadulta-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
docs/guia-publicacion-carta-inma.md(repojoomla-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 referenciawp-nuevo.feadulta.com— hay que actualizarla awww.feadulta.com(post-cutover) y re-verificar que el acceso REST sigue funcionando contra el dominio nuevo (no lo he probado esta noche).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).scripts/translate_post.pysoportaFEA_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=haikuno es "Haiku de cuota/sesión" — es Claude Haiku 4.5 vía API de pago directa, cargando una API key desdeportfolio-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=haikuno 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):hermes secrets(Hermes soporta Bitwarden Secrets Manager, visto enhermes --help) o un gestor de contraseñas compartido.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)
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.www.feadulta.com(solo confirmé que el issue de Cloudflare está cerrado, no repetí la pruebacurl -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)
www.feadulta.com.docs/guia-publicacion-carta-inma.mdcon 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.
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 (/weben vez de/web/wp-nuevo), REST API de Inma marcada como ya accesible (issue #24), y elFEA_ENGINE=haikude 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 (difflimpio 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 degitea.feadulta.com.feadulta-analyticsrevisada, sin hallazgos — está al día (issue #169).Sigo con el punto 3 (runbook TTS+traducción para Inma/Mixbot).
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.comy no era así, ya estaba bien. Disculpas por la imprecisión.)Runbook nuevo:
docs/guia-tts-traduccion-inma.mdEscrito 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
1. Quién puede hacer qué, hoy
docs/guia-publicacion-carta-inma.md). No depende del PC de Rafa.2. Cómo pedir una traducción o un audio (mientras Hermes esté disponible)
Escribir al grupo de WhatsApp
Feadulta_webmastermencionando "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 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(repojoomla-migration) soporta tres motores viaFEA_ENGINE:gemma(por defecto)minimaxhaikuComando (lo ejecuta Hermes o Rafa, no Inma/Mixbot directamente):
--status draftdejar en borrador para revisión;--status publishpublica directo. Trastraducir, hace falta el paso de enlaces internos (
scripts/fix_carta_joomla_links.php) y, si sepublica, degradar la carta anterior (
scripts/demote_old_cartasemana.php) — Hermes ya conoceeste 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--rollbackpara deshacer). Modelo MiniMaxspeech-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):
FrayMarcosFeadulta2026PagolaFeadulta2026SicreFeadulta2026ArregiFeadulta2026Añ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-202607para el procedimiento y los descartes por música colada) yañadirlo a
AUTHOR_VOICESenscripts/minimax_tts.py. Esto sí requiere que Rafa (o alguien conacceso al repo y a MiniMax) lo haga — no es autoservicio para Inma/Mixbot hoy.
Generar audio de una carta concreta (por defecto
tts_produce.pyprocesa una cola larga decartas pendientes — para priorizar una carta concreta, sobreescribir la cola):
Reanudable (no repite lo ya hecho, meta
fea_audio_done) y con freno automático si la cuota deMiniMax se agota (para tras fallos seguidos, no se queda colgado).
Publicar el audio en prod (el paso anterior solo escribe en el WordPress local):
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íanfalta 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:
contra prod en vez de contra el WordPress local, y alojar los scripts en un servidor
accesible, no en el PC personal de Rafa).
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-migrationen un estado que prefiero no tocar sin que lo confirmes:fix/multiidioma-portada-132(nomain).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.originapunta alocalhost:3000/rafa/feadulta.git(el Gitea local antiguo), NO agitea.feadulta.comdonde 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.mdeditado +docs/guia-tts-traduccion-inma.mdnuevo) 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
group_policy: allowlist).Decisiones que quedan en tu tejado para cuando despiertes: qué hacer con la API key de MiniMax para Inma, si autorizas
FEA_ENGINE=haikupara algún caso puntual, y qué hacer con la rama/remote dejoomla-migrationantes de que yo (o Hermes) commiteemos nada ahí.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 porrafael 13-jul).Es el mismo patrón que ya detectaste en el punto 2 de este issue: la skill
feadulta-editorial-workflowsapuntaba a "este Gitea local" en vez degitea.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.