Cierre autónomo de la carta: publicar + rotar categorías solo (rescata #161) y encadenar traducciones/audios (para el viaje de Rafa) #174

Open
opened 2026-07-14 23:51:13 +00:00 by inma · 6 comments
Collaborator

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:

  • La carta se quedó en borrador, y
  • la rotación de categorías no se hacía → la 734 ("Echar raíces") seguía como "actual" en la portada, junto a la 735.

Lo arreglamos a mano esta vez:

  1. Publicada la 735 (54495) → cat 6 (actual).
  2. La 734 (54254): quitar cat 6, poner cat 22 (semana pasada), mantener cat 21 (archivo).
  3. La 733 (53984): quitar cat 22, dejar en cat 21 (archivo).

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):

  • ¿Es correcta la cascada que usamos hoy? nueva → cat 6; la que estaba en 6 → cat 22 (y sigue en 21 acumulativo); la que estaba en 22 → sale de 22 y queda solo en cat 21.
  • ¿Los idiomas (traducciones) NO se rotan hasta que se publiquen? (nosotros solo tocamos el ES).
  • Cualquier matiz de tu #161 que debamos respetar (p.ej. exactamente cómo debe acumular la cat 21).

El flujo completo que perseguimos (y por qué te libera para el viaje)

Un ciclo lógico y autónomo:

  1. Nosotros / Mixbot: componer → publicar → rotar la carta ES (todo automático, tras la revisión de Inma).
  2. Tus derivados (traducciones EN/FR/IT/PT + audios TTS, que son tuyos según #165): una vez la carta ES está cerrada y categorizada, tocan estos. Pero según el #172, hoy NO son automáticos (hay que pedírselos a Hermes).

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

  1. ¿OK a que Mixbot publique + rote la carta ES automáticamente? (con la lógica de arriba, que te confirmamos). En cuanto digas que sí, lo implementamos.
  2. ¿Cómo disparamos las traducciones + audios al cerrar la carta, para el ciclo completo autónomo?

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).

## 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:** - La carta se quedó en **borrador**, y - **la rotación de categorías no se hacía** → la 734 ("Echar raíces") seguía como "actual" en la portada, junto a la 735. Lo arreglamos **a mano** esta vez: 1. Publicada la 735 (54495) → cat **6** (actual). 2. La 734 (54254): quitar cat 6, poner cat **22** (semana pasada), mantener cat **21** (archivo). 3. La 733 (53984): quitar cat 22, dejar en cat **21** (archivo). 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**): - **¿Es correcta la cascada que usamos hoy?** nueva → cat 6; la que estaba en 6 → cat 22 (y sigue en 21 acumulativo); la que estaba en 22 → sale de 22 y queda solo en cat 21. - **¿Los idiomas (traducciones) NO se rotan** hasta que se publiquen? (nosotros solo tocamos el ES). - Cualquier matiz de tu **#161** que debamos respetar (p.ej. exactamente cómo debe acumular la cat 21). ## El flujo completo que perseguimos (y por qué te libera para el viaje) Un ciclo lógico y autónomo: 1. **Nosotros / Mixbot:** componer → publicar → **rotar** la carta **ES** (todo automático, tras la revisión de Inma). 2. **Tus derivados** (traducciones EN/FR/IT/PT + audios TTS, que son tuyos según #165): una vez la carta ES está **cerrada y categorizada**, tocan estos. Pero según el **#172**, hoy **NO son automáticos** (hay que pedírselos a Hermes). **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 1. ✅ **¿OK** a que Mixbot **publique + rote** la carta ES automáticamente? (con la lógica de arriba, que te confirmamos). En cuanto digas que sí, lo implementamos. 2. ✅ **¿Cómo disparamos** las traducciones + audios al cerrar la carta, para el ciclo completo autónomo? 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).
Author
Collaborator

Estado verificado hoy (15-jul) + hallazgo clave de la coordinación con Hermes

Nuestra parte (ES) — hecha:

  • Carta 735 (post 54495 "Buenos y malos") compuesta en vivo, publicada y rotada a mano (ES-only: 6→22, archivo acumulativo en 21). Portada correcta, 40 enlaces vivos, máster de BREVO listo.

Pendiente nuestro: el meta _carta_id NO está puesto — verificado: la carta 54495 y sus artículos devuelven carta_id: None por fea/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:

  • El pipeline de traducción/TTS de Hermes trabaja sobre un WordPress Docker LOCAL de Rafa, no contra producción.
  • Ese espejo local está desfasado/divergido de prod: el slug buenos-y-malos no 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).
  • Si se lanza ahora, alto riesgo de traducir/locutar contenido equivocado o romper correspondencias de IDs. Hermes —muy bien— NO lo forzó.

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.)

## Estado verificado hoy (15-jul) + hallazgo clave de la coordinación con Hermes **Nuestra parte (ES) — hecha:** - Carta 735 (post **54495** "Buenos y malos") compuesta en vivo, **publicada** y **rotada** a mano (ES-only: 6→22, archivo acumulativo en 21). Portada correcta, 40 enlaces vivos, máster de BREVO listo. **Pendiente nuestro:** el meta **`_carta_id` NO está puesto** — verificado: la carta 54495 y sus artículos devuelven `carta_id: None` por `fea/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**: - El pipeline de traducción/TTS de Hermes **trabaja sobre un WordPress Docker LOCAL de Rafa**, no contra producción. - Ese espejo local **está desfasado/divergido de prod**: el slug `buenos-y-malos` no 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). - Si se lanza ahora, alto riesgo de **traducir/locutar contenido equivocado** o romper correspondencias de IDs. Hermes —muy bien— NO lo forzó. **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.)
Owner

Confirmación rotación (rescatando #161)

La cascada que aplicasteis a mano hoy es correcta, confirmadla y automatizadla tal cual:

  1. Nueva carta → cat 6 (actual) + cat 21 (archivo, desde la creación — ver #161, nunca se quita).
  2. La que estaba en 6 → pasa a cat 22 (semana pasada), sigue en 21.
  3. La que estaba en 22 → sale de 22, queda solo en 21.

⚠️ Recordatorio de #161: el endpoint categories sustituye 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:

  1. Cuando la carta ES quede publicada y rotada, vosotros notificáis a Hermes (el canal que ya usáis) con el ID de la carta.
  2. Hermes se encarga de todo lo demás: copia/sincroniza la carta (y sus artículos) de prod a su WP local, traduce (EN/FR/IT/PT), genera el TTS, y sube el resultado de vuelta a prod.
  3. Vamos a crear una skill específica para Hermes con este procedimiento (sync prod→local de la carta concreta antes de traducir/locutar, para evitar el problema de esta semana con el ID 54495 desalineado). Así Hermes no tiene que decidir nada por su cuenta ni arriesgarse a traducir contenido equivocado — solo sigue la skill.

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.)

## Confirmación rotación (rescatando #161) La cascada que aplicasteis a mano hoy es correcta, confirmadla y automatizadla tal cual: 1. **Nueva carta** → cat **6** (actual) + cat **21** (archivo, desde la creación — ver #161, nunca se quita). 2. **La que estaba en 6** → pasa a cat **22** (semana pasada), sigue en 21. 3. **La que estaba en 22** → sale de 22, queda solo en 21. ⚠️ Recordatorio de #161: el endpoint `categories` sustituye 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: 1. Cuando la carta ES quede publicada y rotada, **vosotros notificáis a Hermes** (el canal que ya usáis) con el ID de la carta. 2. **Hermes se encarga de todo lo demás**: copia/sincroniza la carta (y sus artículos) de prod a su WP local, traduce (EN/FR/IT/PT), genera el TTS, y sube el resultado de vuelta a prod. 3. Vamos a crear una **skill específica para Hermes** con este procedimiento (sync prod→local de la carta concreta antes de traducir/locutar, para evitar el problema de esta semana con el ID 54495 desalineado). Así Hermes no tiene que decidir nada por su cuenta ni arriesgarse a traducir contenido equivocado — solo sigue la skill. 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.)*
Owner

Skill de Hermes lista para el paso 2 (sync + traducción + TTS)

Creada feadulta-carta-derivados en ~/.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, usando fea_parse_carta_sections() (la misma función que arma la portada) para descubrir el cluster sin depender de _carta_id. Reutiliza fea_translate_helper.php (le añadí un subcomando carta_sections, sin tocar el resto) igual que ya hacía sync_translations_to_prod.py pero 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.php ya 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_id de la 735 (pendiente de que Rafa defina el alcance) y el .env con FEA_PROD_WPLOAD desactualizado (#158).

## Skill de Hermes lista para el paso 2 (sync + traducción + TTS) Creada `feadulta-carta-derivados` en `~/.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, usando `fea_parse_carta_sections()` (la misma función que arma la portada) para descubrir el cluster **sin depender de `_carta_id`**. Reutiliza `fea_translate_helper.php` (le añadí un subcomando `carta_sections`, sin tocar el resto) igual que ya hacía `sync_translations_to_prod.py` pero 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.php` ya 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_id` de la 735 (pendiente de que Rafa defina el alcance) y el `.env` con `FEA_PROD_WPLOAD` desactualizado (#158).
Owner

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:

  1. Orden del TTS por ID en vez de por el orden real de la carta (evangelio→artículos→eucaristía→multimedia→EFFA). Corregido en la skill: ahora se exige construir FEA_TTS_IDS a partir de fea_translate_helper.php carta_sections <ID> respetando el orden de las secciones.
  2. Artefactos de generación publicados en prod: el artículo de Juan José Aguirre (#54478) salió con |||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.
  3. Errores de traducción con Gemma en términos bíblicos/idiomáticos: "cizaña" mal traducido en FR/IT/PT en 2 artículos (#54492, #54494) y "la Hondura" traducido literalmente como el país "Honduras" en EN/FR/PT (#54476). Corregido en prod por Hermes (términos bíblicos estándar: ivraie/zizzania/joio; profundidad/depth/profondeur/profondità/profundidade).

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:** 1. **Orden del TTS por ID en vez de por el orden real de la carta** (evangelio→artículos→eucaristía→multimedia→EFFA). Corregido en la skill: ahora se exige construir `FEA_TTS_IDS` a partir de `fea_translate_helper.php carta_sections <ID>` respetando el orden de las secciones. 2. **Artefactos de generación publicados en prod**: el artículo de Juan José Aguirre (#54478) salió con `|||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. 3. **Errores de traducción con Gemma en términos bíblicos/idiomáticos**: "cizaña" mal traducido en FR/IT/PT en 2 artículos (#54492, #54494) y "la Hondura" traducido literalmente como el país "Honduras" en EN/FR/PT (#54476). Corregido en prod por Hermes (términos bíblicos estándar: ivraie/zizzania/joio; profundidad/depth/profondeur/profondità/profundidade). **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).
Owner

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:

  1. Orden del TTS por ID en vez de por el orden real de la carta (evangelio→artículos→eucaristía→multimedia→EFFA). Corregido en la skill: ahora se exige construir FEA_TTS_IDS a partir de fea_translate_helper.php carta_sections <ID> respetando el orden de las secciones.
  2. Artefactos de generación publicados en prod: el artículo de Juan José Aguirre (#54478) salió con |||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.
  3. Errores de traducción con Gemma en términos bíblicos/idiomáticos: "cizaña" mal traducido en FR/IT/PT en 2 artículos (#54492, #54494) y "la Hondura" traducido literalmente como el país "Honduras" en EN/FR/PT (#54476). Corregido en prod por Hermes (términos bíblicos estándar: ivraie/zizzania/joio; profundidad/depth/profondeur/profondità/profundidade).

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:** 1. **Orden del TTS por ID en vez de por el orden real de la carta** (evangelio→artículos→eucaristía→multimedia→EFFA). Corregido en la skill: ahora se exige construir `FEA_TTS_IDS` a partir de `fea_translate_helper.php carta_sections <ID>` respetando el orden de las secciones. 2. **Artefactos de generación publicados en prod**: el artículo de Juan José Aguirre (#54478) salió con `|||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. 3. **Errores de traducción con Gemma en términos bíblicos/idiomáticos**: "cizaña" mal traducido en FR/IT/PT en 2 artículos (#54492, #54494) y "la Hondura" traducido literalmente como el país "Honduras" en EN/FR/PT (#54476). Corregido en prod por Hermes (términos bíblicos estándar: ivraie/zizzania/joio; profundidad/depth/profondeur/profondità/profundidade). **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).
Author
Collaborator

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

  1. Solo cierra si TODO está vivo. Si algún enlace falla o queda alguno viejo, la carta se queda en borrador y NO se rota. Es la misma condición que gobierna la "erre" del 00r_carta.docx: no publicamos una carta con enlaces rotos.
  2. Idempotente. Si no queda otra carta en la cat 6, la rotación ya está hecha → no toca nada. Sin esta guarda, un segundo pase habría degradado la de la 22 al archivo (bug real que detectamos al diseñarlo).
  3. Solo ES. Comprueba el idioma de cada post (fea/v1/lang) antes de tocarlo → las traducciones quedan intactas, como confirmaste.
  4. Array completo siempre. Tu aviso del #161 está escrito como comentario justo donde se hace el POST, para que no se nos olvide: el endpoint categories sustituye, no añade.

Pruebas (en simulación, sin tocar prod)

  • Reproducido el escenario real de la 735 → resultado idéntico a lo que tiene producción ahora (54495 [6,21,71], 54254 [21,22,71], 53984 [21,71]).
  • Orden de escrituras correcto (la de 22 sale a archivo antes de meter la anterior en 22).
  • 2º pase seguido → 0 escrituras.
  • Escenario con traducciones publicadas en las cats 6 y 22 → no se tocó ninguna.

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.

## 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 1. **Solo cierra si TODO está vivo.** Si algún enlace falla o queda alguno viejo, la carta se queda en **borrador y NO se rota**. Es la misma condición que gobierna la "erre" del `00r_carta.docx`: no publicamos una carta con enlaces rotos. 2. **Idempotente.** Si no queda otra carta en la cat 6, la rotación ya está hecha → no toca nada. Sin esta guarda, **un segundo pase habría degradado la de la 22 al archivo** (bug real que detectamos al diseñarlo). 3. **Solo ES.** Comprueba el idioma de cada post (`fea/v1/lang`) antes de tocarlo → las traducciones quedan intactas, como confirmaste. 4. **Array completo siempre.** Tu aviso del #161 está escrito como comentario justo donde se hace el `POST`, para que no se nos olvide: el endpoint `categories` **sustituye**, no añade. ### Pruebas (en simulación, sin tocar prod) - Reproducido el escenario real de la 735 → resultado **idéntico** a lo que tiene producción ahora (54495 `[6,21,71]`, 54254 `[21,22,71]`, 53984 `[21,71]`). - Orden de escrituras correcto (la de 22 sale a archivo **antes** de meter la anterior en 22). - 2º pase seguido → **0 escrituras**. - Escenario con traducciones publicadas en las cats 6 y 22 → **no se tocó ninguna**. **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.
Sign in to join this conversation.
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#174