Cierre autónomo de la carta: publicar + rotar categorías solo (rescata #161) y encadenar traducciones/audios (para el viaje de Rafa) #174
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?
Por qué este issue (y por qué "rescatamos" el #161)
El #161 (rotación de categorías) se quedó un poco aparcado, y creemos que fue por no estar claro PARA QUÉ lo necesitábamos. Ahora sí lo está: es la última pieza para que la carta se publique sola en la web y podamos cerrar el ciclo semanal sin depender de que estés disponible — justo lo que busca el #172 (tu viaje).
Contexto: qué pasó hoy con la carta 735
Compusimos la 735 en vivo con Mixbot (
--vivo). Todo perfecto: contenido, autores nuevos creados solos (endpoint #166 — Nina Schmedding creada automáticamente), 40 enlaces vivos, cocinero litúrgico, Salomé reutilizada, máster de BREVO en Verdana 12. PERO:Lo arreglamos a mano esta vez:
Verificado: la portada muestra "Buenos y malos" como actual y "Echar raíces" como semana pasada. ✅
Lo que pedimos (encaja con #165 y #172)
Por el reparto del #165, publicar la carta es nuestro. Nos falta automatizar el último paso: que Mixbot, al terminar en
--vivo, publique + rote solo (en vez de dejar borrador). Para hacerlo bien necesitamos tu OK y confirmar la lógica de rotación (tu #161):El flujo completo que perseguimos (y por qué te libera para el viaje)
Un ciclo lógico y autónomo:
La pregunta clave para cerrar la autonomía: ¿podemos disparar nosotros ese paso 2 (traducciones + audios, vía Hermes) al terminar la carta, para que TODO el ciclo corra solo sin depender de que estés disponible? Es exactamente el objetivo del #172 para que puedas irte de viaje tranquilo.
Qué hay que decidir
Con esto, la carta semanal quedaría de punta a punta sin cuellos de botella humanos. Gracias. 🙌
Relacionado: #161 (rotación), #165 (reparto post-Go-Live), #166 (alta de autores, ya integrado), #172 (autosuficiencia para el viaje).
Estado verificado hoy (15-jul) + hallazgo clave de la coordinación con Hermes
Nuestra parte (ES) — hecha:
Pendiente nuestro: el meta
_carta_idNO está puesto — verificado: la carta 54495 y sus artículos devuelvencarta_id: Noneporfea/v1/carta-id/{id}. Lo ponemos (valor = 54495) en cuanto se confirme el alcance (¿solo los artículos nuevos, o también multimedia y reutilizados?).Hallazgo clave (coordinación con Hermes por WhatsApp): los derivados (traducciones EN/FR/IT/PT + audios TTS) no pueden correr en automático todavía, y NO por falta de ganas, sino por un desajuste de infraestructura:
buenos-y-malosno existe en local, faltan varios artículos nuevos de la carta, y el ID 54495 en local corresponde a OTRO post (en | 15th Sunday in Ordinary Time).Implicación para la autonomía (#172, viaje de Rafa): mientras el pipeline de derivados dependa de que el entorno local de Rafa esté sincronizado a mano, no puede ejecutarse solo cuando Rafa no esté. Para autonomía real, ese pipeline debería trabajar contra producción (o auto-sincronizar local↔prod antes de correr).
Siguiente paso propuesto (de Hermes): prepara el checklist para que Rafa alinee el entorno local; cuando Rafa confirme "local alineado", Hermes arranca traducciones + TTS y avisa por WhatsApp.
(Nota: no confundir con el #176, que es de otro tema — el duplicado del informe de feedback diario, ya resuelto.)
Confirmación rotación (rescatando #161)
La cascada que aplicasteis a mano hoy es correcta, confirmadla y automatizadla tal cual:
⚠️ Recordatorio de #161: el endpoint
categoriessustituye el array completo, no solo añade/quita — hay que mandar todas las categorías vigentes del post en cada rotación (incluida la 21).Confirmado también: las traducciones NO rotan hasta que se publican — mientras estén en draft solo tocáis el ES, correcto.
Con esto tenéis luz verde para automatizar publish+rotate en
--vivo.Sobre el paso 2 (traducciones + TTS) — cómo se dispara
No hace falta que vuestro lado toque el pipeline de Hermes ni que este se invente nada. El flujo va a ser:
En cuanto la skill esté lista, el ciclo completo (ES autónomo por vuestra parte + derivados vía Hermes) queda cerrado sin depender de que yo esté disponible.
Dejo pendiente aparte la pregunta del alcance de
_carta_id(solo artículos nuevos vs. también multimedia/reutilizados) — la contesto en un comentario separado.(Edito este comentario: el anterior salió con markdown roto por un problema de escapado en terminal — este es el texto correcto.)
Skill de Hermes lista para el paso 2 (sync + traducción + TTS)
Creada
feadulta-carta-derivadosen~/.hermes/skills/feadulta/(SKILL.md +references/procedimiento-tecnico.md). Cubre el flujo completo desde que avisáis de una carta ES publicada+rotada hasta que queda con sus 4 idiomas y audio, sin que Hermes tenga que improvisar nada (pasos fijos, condiciones explícitas de "para y pregunta").Pieza que faltaba de verdad y ya está construida:
scripts/sync_carta_from_prod.py— copia el cluster de la carta (carta + artículos que enlaza) de prod a local preservando IDs, usandofea_parse_carta_sections()(la misma función que arma la portada) para descubrir el cluster sin depender de_carta_id. Reutilizafea_translate_helper.php(le añadí un subcomandocarta_sections, sin tocar el resto) igual que ya hacíasync_translations_to_prod.pypero en la dirección contraria. Detecta y avisa de conflictos (un ID local con contenido distinto al de prod, que es justo lo que os pasó con la 54495).Validado en dry-run real (solo lectura) contra la 735: descubrió los 33 posts del cluster correctamente — evangelio y lecturas ya traducidos, contenido EFFA reutilizado, y los 21 artículos nuevos de la carta, todos ES-only como dijisteis.
El resto del pipeline (
translate_post.py,publish_carta.php,rotate_cartas.php, TTS) ya existía y no hizo falta tocarlo —rotate_cartas.phpya es multi-idioma por sí solo (no toca un idioma hasta que tiene traducción publicada), así que confirma también lo que preguntabais del paso 2.Queda sin resolver aparte:
_carta_idde la 735 (pendiente de que Rafa defina el alcance) y el.envconFEA_PROD_WPLOADdesactualizado (#158).Cierre de la carta 735 — auditoría + correcciones (2026-07-15)
Revisión del ciclo completo (Mixbot + Hermes vía la skill
feadulta-carta-derivados) ya con la carta en los 4 idiomas + audio en prod. Resumen para que quede constancia:Mixbot — correcto. Rotación ES verificada en vivo (actual/pasada/archivo bien encadenados), autoras nuevas (Nina Schmedding, Silvia Martínez Cano) bien atribuidas.
Hermes — funcionó de punta a punta, con 3 fallos reales, ya corregidos:
FEA_TTS_IDSa partir defea_translate_helper.php carta_sections <ID>respetando el orden de las secciones.|||FIN>>>pegado al título en IT (#54639) y un carácter árabe suelto en PT (#54640). Corregido en prod por Hermes. Añadido a la skill un paso de sanity-check antes de publicar.Pendiente de decidir (no bloquea nada): Hermes no tiene token de Gitea en su perfil, así que no puede documentar/comentar aquí por sí mismo. Si se quiere autonomía completa del ciclo (encaja con #172), habría que darle uno propio.
Skill actualizada:
~/.hermes/skills/feadulta/feadulta-carta-derivados/SKILL.md(numeración de pasos corregida, prioridad TTS-en-orden > traducir a los ponentes cuando escasee cuota, paso explícito de publicar a prod, sanity-check de artefactos).Cierre de la carta 735 — auditoría + correcciones (2026-07-15)
Revisión del ciclo completo (Mixbot + Hermes vía la skill
feadulta-carta-derivados) ya con la carta en los 4 idiomas + audio en prod. Resumen para que quede constancia:Mixbot — correcto. Rotación ES verificada en vivo (actual/pasada/archivo bien encadenados), autoras nuevas (Nina Schmedding, Silvia Martínez Cano) bien atribuidas.
Hermes — funcionó de punta a punta, con 3 fallos reales, ya corregidos:
FEA_TTS_IDSa partir defea_translate_helper.php carta_sections <ID>respetando el orden de las secciones.|||FIN>>>pegado al título en IT (#54639) y un carácter árabe suelto en PT (#54640). Corregido en prod por Hermes. Añadido a la skill un paso de sanity-check antes de publicar.Pendiente de decidir (no bloquea nada): Hermes no tiene token de Gitea en su perfil, así que no puede documentar/comentar aquí por sí mismo. Si se quiere autonomía completa del ciclo (encaja con #172), habría que darle uno propio.
Skill actualizada:
~/.hermes/skills/feadulta/feadulta-carta-derivados/SKILL.md(numeración de pasos corregida, prioridad TTS-en-orden > traducir a los ponentes cuando escasee cuota, paso explícito de publicar a prod, sanity-check de artefactos).Publish + rotate implementado (con tu luz verde) — y un bug que apareció por el camino
Implementado en
mixbot.py. Con--vivo, al terminar la carta ahora hace el cierre completo solo: publica (antes se quedaba en borrador) y rota las categorías con la cascada que confirmaste.🐛 El bug del 21 (importante)
Al ir a automatizarlo descubrimos que Mixbot creaba la carta con
categories: [6, 71]— le faltaba la 21. La semana pasada se la pusimos a mano sin darnos cuenta de que el código no lo hacía. Es decir: si llegamos a automatizar sin mirar, la carta nueva nunca habría entrado en el archivo.Corregido: ahora nace con
[6, 21, 71], el 21 desde la creación como dices en el #161.Salvaguardas que le pusimos
00r_carta.docx: no publicamos una carta con enlaces rotos.fea/v1/lang) antes de tocarlo → las traducciones quedan intactas, como confirmaste.POST, para que no se nos olvide: el endpointcategoriessustituye, no añade.Pruebas (en simulación, sin tocar prod)
[6,21,71], 54254[21,22,71], 53984[21,71]).El estreno real será la carta 736. Verificado por ahora solo en simulación; te lo contamos cuando corra en vivo.
Siguiente paso del ciclo
Al cerrar, Mixbot imprime el recordatorio de avisar a Hermes con el ID de la carta para que arranque traducciones + audios, según el flujo que planteaste.
Sigue pendiente
El alcance del
_carta_id(¿solo artículos nuevos, o también multimedia y reutilizados?). En cuanto lo digas, lo ponemos.