043 — Automatización del flujo editorial
La promesa
Un solo archivo de logs que liste episodios sin triplicar filas cuando el mismo NNN-slug existe en system/episodes/, en sagas/ y en el legado projects/odisea-del-blog-maestro/, más un comando npm run content:new que no escriba basura SEO ni olvide la tarjeta visual en saga.
El síntoma
El glob amplio **/*.md mezclaba intención editorial con specs, y el archivo /blog solo miraba el prefijo projects/odisea-del-blog-maestro/, dejando fuera el log canónico en system/episodes/. Duplicados con el mismo nombre de fichero inflaban la tabla y confundían la ruta canónica.
La autopsia
Faltaba prioridad explícita al deduplicar (system > saga > projects) y rutas estáticas para system/episodes/ en [...slug].astro. La validación SEO estaba solo en reglas humanas y en el build Zod, no en el momento de crear el fichero.
La corrección
src/content.config.ts: loaderglobcon patronessystem/**,sagas/**,projects/**bajosrc/content/docs/.src/lib/docs-paths.ts:isEpisodeDocIdunifica tres orígenes;episodeCanonicalStemFromDocId+ prioridad para una sola fila por episodio.src/pages/blog/index.astro: orden pordateDESC y dedupe.src/pages/blog/[...slug].astro:getStaticPathsincluye entradassystem/episodes/.scripts/create-episode.mjs: auditoríatitle+metaDescription(≤160), doble guardado opcional con--saga/CAPRINI_ACTIVE_SAGA, llamada agenerateMissingSagaCards.scripts/create-episode.mjs+scripts/lib/auto-amplifier.mjs: al pasar Tone Guard se generaX Web Intentcon firmaHacker Capybara, se imprime[AMPLIFICATION_READY]y se abre navegador por defecto (con kill-switchTWITTER_INTENT_NO_OPEN=1).DOCS_ARCHITECTURE.md: mapa del flujo para humanos y agentes.
La lección
El ID estable del episodio es el stem del fichero (043-tema), no la ruta completa. Si el contrato de nombres se mantiene, podés migrar carpetas sin romper el archivo: el dedupe, el SEO al crearse y el Intent listo para difundir forman un triple candado contra deuda silenciosa.