crescō · release notes
design.cresco.so / release-notes
Sistema interno · documento vivo

De un PR a main,
a un número publicado.

Cada corte development → main se vuelve un release: versionado solo, asociado al proyecto del cliente, con los tasks y bugs que despliega, escrito en la voz de crescō. Dos agentes capturan y publican; una base es la fuente. La marca nunca postea en automático.

2
Agentes · cronista + editor
3
Bases · Releases · Channels · Piezas
1
Fuente · la base es el changelog
N
Canales · changelog hoy · social v2
01El flujo

Dos agentes, no uno

El cronista captura los hechos sin tono y los deja en la base. El editor los escribe en voz y espera tu visto bueno. Ningún agente le habla al otro: escriben y leen filas, lo que los hace reanudables, idempotentes y reversibles.

Agente 01El cronistaWebhook de GitHub al mergear. Factual, idempotente.

Corte dev→main

Se mergea el PR de release. El cronista lee el rango desde el último tag.

trigger

Resuelve contexto

Del repo: el cliente. De las magic words closes CSC-…: tasks, bugs y proyecto.

repo→customer

Calcula versión

Gitmoji de cada PR → semver por proyecto. Taggea main.

v1.3 → v1.4

Escribe Ready

Una fila por proyecto, en voz, lista para tu visto bueno.

status: ready
Única fuenteReleasesUna sola base. Versión, features, tasks y bugs viven acá.

La base de releases

Una fila por versión, relacionada a Customer · Project · Tasks · Bugs · Channels. Esta base es el changelog y es la cola de publicación. Tres vistas: cola · changelog · por cliente.

El buffer entre los dos relojes
Agente 02El editorWebhook de Notion al confirmar. Solo redacta. Tú curas. (v2)

Reacciona a Published

Al confirmar tú un changelog, el webhook lo despierta para ese release.

webhook · Notion

Redacta por canal

Arma la pieza leyendo la config de Channels. La deja en Draft.

lee config de Channels

Tú curas + posteas

Revisas la cola de borradores y publicas a tu ritmo.

máx 3/sem · canal

Social · posteado

Sale de tu cuenta personal. Nunca por PR, nunca en automático.

LinkedIn / X

Por qué dos

  • Disparadores distintos. El cronista reacciona al corte dev→main; el editor sigue el calendario de marca. Un cron solo obliga a un compromiso malo para ambos.
  • Tono distinto. Capturar hechos quiere precisión y cero adjetivos; escribir el número quiere voz.
  • Aprobación distinta. El changelog se escribe solo; el post social jamás. Si un agente publicara por PR, romperías «crescō no hace post diario».
¿Cron o webhook? Cero crons. Dos webhooks.

GitHub dispara al cronista al mergear dev→main; Notion dispara al editor cuando confirmas un changelog. La base es el buffer entre ambos — y de paso, el changelog mismo. v1 arranca solo con el cronista + tu confirmación.

02El límite del release

Qué es un release

El evento que dispara no es cada PR a main — es el PR development → main. Lo que el release incluye son las PRs que viajan en ese corte, resueltas por diff entre tags. Dos cosas distintas, dos campos distintos.

developmentdonde se acumula
feat · #341
Pantalla progreso
fix · #347
Edad corregida
feat · #349
Resumen mensual
Included PRs = #341 · #347 · #349
▲ Release PR · dev→main · #352
mainsolo releases
#
#
amedi-v1.3.2
amedi-v1.4.0

▲ El disparador

release pr · uno
  • ·El merge dev→main es el evento. El cronista corre acá, no por feature PR.
  • ·Se guarda como Release PR · #352

⊕ Lo que incluye

included prs · muchas
  • ·Las PRs entre v1.3.2 y el corte.
  • ·De sus magic words salen tasks, bugs y proyectos.

# La marca de agua

tag · por proyecto
  • ·Al mergear se taggea main por proyecto.
  • ·El rango se calcula por diff entre tags, no por SHA suelto → idempotente.

Monorepo: un corte dev→main puede tocar varios proyectos de un cliente → N releases de un PR. Versión y tag son por proyecto; el Release PR es compartido. Referencias: el «release PR» es justo el patrón de Release Please; el versionado por commits, el de semantic-release; la intención por pieza, la de Changesets — acá inferida del gitmoji que crescō ya usa.

03El modelo de datos

Tres bases, una fuente

Releases (modelo B: una fila por versión) es el corazón. Channels es la config de cada canal. Piezas es la unión Release×Channel — solo necesaria en v2, cuando cada canal lleva su propio body y estado.

▦ Releases

una fila por versión
  • Version SemVer · -pre · +build
  • Stage 0.x dev · ≥1.0 estable
  • Bump major · minor · patch
  • Status draft → ready → published
  • Customer · Project relations
  • Tasks · Bugs → Tasks (CSC)
  • Release PR · Included PRs
  • Tag · Build marca de agua · +sha
  • Channels → Channels
  • Released at fecha · orden · inmutable
  • Signed by obligatorio

◐ Channels

referencia · config
  • Surface web · social · msg · email
  • Publish mode auto · draft
  • Max/week cadencia (guardrail)
  • Format restricciones de pieza
  • Voice ref voz/02 · lanzamientos
  • Target url / handle
  • Active v1 = solo changelog

▤ Piezas v2

unión release × channel
  • Release → Releases
  • Channel → Channels
  • Body el copy de esa pieza
  • Status draft · ready · published
  • Scheduled · Published fechas
  • En v1 el changelog body vive en el Release; un solo canal auto, sin unión todavía.
Vista «cola» Releases · una fila = una versión
ReleaseBumpStatusCanalesClienteTasksBugsRelease PRIncluidosTagFirma
amedi · v1.4.0minorreadyChangelogAmediCSC-512CSC-514CSC-509dev→main #352#341#347#349amedi-v1.4.0Eugenia
mogos · v2.1.0minorpublishedChangelogMogosCSC-488CSC-490CSC-491dev→main #210#201#205mogos-v2.1.0Carlos
kenco · v0.3.1patchdraftChangelogKencoCSC-530CSC-530dev→main #61#58kenco-v0.3.1Carlos

El versionado es por proyecto: el cronista lee el último tag de ese proyecto y sube desde ahí, según el gitmoji de las PRs incluidas.

Versionado SemVer completo · MAJOR.MINOR.PATCH[-pre.N][+build]
SegmentoCuándo subeGatillo en crescōEjemplo
MAJORCambio que rompe compatibilidad hacia atrás💥 break · footer BREAKING CHANGE1.4.0 → 2.0.0
MINORFuncionalidad nueva, compatible✨ feat · 🎨 design1.3.2 → 1.4.0
PATCHBug fix compatible, sin tocar la interfaz🐛 fix1.4.0 → 1.4.1
-pre.N opcionalCorte previo, inestable, menor precedenciadeploy a staging / preview2.0.0-rc.1
+build opcionalMetadata de build, no afecta precedenciacommit / build del corte1.4.0+a1b2c3

Reglas SemVer que el cronista respeta

  • 0.y.z vs 1.0.0. Bajo 1.0 (Kenco v0.3.1) todo puede cambiar; 1.0.0 es el compromiso de no romper sin avisar con un MAJOR.
  • Reset a cero a la izquierda. Subir MINOR pone PATCH en 0 (2.0.1 → 2.1.0, no 2.1.1).
  • Un release publicado es inmutable. ¿Corrección? Versión nueva. El cronista nunca reescribe un published — la marca de agua por tag lo garantiza.
  • Precedencia. -pre < final (1.0.0-beta antes que 1.0.0). En Notion el orden real lo da Released at, no el string de versión (ordenar texto rompe: v1.10 < v1.9).

Fuera de alcance, a propósito

  • Rangos ^ / ~. Son del lado del consumidor (package.json): definen qué updates aceptas de una librería. Nuestros proyectos son apps que entregamos, no librerías que otros consumen por rango. No aplican a la base.
  • Cadenas largas alpha→beta→rc. El changelog público filtra a releases finales; el pre-release queda como campo interno opcional para cortes de preview.
04Channels

Los canales son una base, no un campo

Cada canal es una fila con su config. El guardrail vive como dato: el editor lee «máx 3/sem» y «auto vs borrador» de la base, no de su prompt. Añadir un canal nuevo es una fila, no un cambio de esquema.

ChannelSurfaceModoMáx/semFormatoTargetActivo
ChangelogWebautoEntrada versionada · porqué + bullets/{cliente}● activo
LinkedInSocialdraft3Post 800–1400 · cuenta personalin/{writer}○ v2
XSocialdraft3Hilo 5–9 · tensión → link@{writer}○ v2
WhatsAppMessagingdraft11 párrafo + link · lista opt-inbroadcast○ v2
NewsletterEmaildraft2Cuerpo completo · sin truncarinbox○ v2

Cambiar la cadencia de un canal, su modo o su voz es editar una fila, no tocar el agente. Eso mantiene a los dos agentes tontos y a la política en un solo lugar.

05Qué ve afuera

Misma versión, dos públicos

El cliente lee el changelog para saber qué cambió; el mercado lee LinkedIn para saber cómo pensamos. Ambos nacen de la misma fila madre, cada uno en su voz. El changelog se autopublica; lo social siempre es borrador.

changelog.cresco.so/amedi · público
v1.4.0nuevoarreglo
La pantalla que más nos costó escribir: cómo va
— Eugenia Medina, producto · 14 oct 2026

Las familias piden una pantalla de «cómo va» — no para compararse con otros, sino para confirmarse que lo están haciendo bien. Percentiles y rankings empujan lo contrario. Probamos cinco versiones antes de publicar.

  • Pantalla de progreso sin gráficos de competencia. CSC-512
  • Resumen mensual para compartir con el pediatra. CSC-514
  • — Arreglo del cálculo de edad corregida. CSC-509
LinkedIn · cuenta personal · borrador v2
E
Eugenia Medina
producto · crescō

Probamos cinco versiones de una pantalla antes de publicar una. Las primeras tres tenían gráficos. Todas se sentían mal.

Las familias en Amedi piden una pantalla de «cómo va». No para compararse con otros niños — para confirmarse a sí mismas que lo están haciendo bien.

La versión que salió no tiene ni un gráfico de competencia. Hitos del niño, en su ritmo.

Lo escribí completo → changelog.cresco.so/amedi

06Disparadores

Dos webhooks, dos compuertas

Nada de crons ni polling. El cronista reacciona a un webhook de GitHub (merge dev→main); el editor reacciona a un webhook de Notion (cuando confirmas un changelog). Las dos compuertas humanas son tuyas: confirmar el changelog y aprobar lo social. v1 es solo el cronista + tu confirmación; el editor entra en v2.

Ciclo de vida qué dispara cada paso · de un merge a un post
evento

Merge dev→main

Se corta el release.

⚡ webhook · GitHub→ cronista
estado

Release · Ready

Versión, tasks, bugs y changelog en voz. Aún sin publicar.

👤 confirmas
v1 termina acá

Published → changelog

La entrada aparece pública.

⚡ webhook · Notion→ editor · v2
v2 · estado

Pieza social · Draft

El editor redacta por canal. Solo borrador — no postea.

👤 curas + posteastú · máx 3/sem
v2

Posteado

Tú publicas en LinkedIn/X a tu ritmo.

Respuesta directa: el editor arranca con un webhook de Notion cuando una fila pasa a Published — o sea, justo cuando confirmaste el changelog. Solo redacta el borrador, nunca postea: tú curas la cola y publicas a tu ritmo (el guardrail máx 3/sem + tu aprobación). El batcheo vive en tu compuerta, no en el disparador. El cronista, en cambio, reacciona al webhook de GitHub al mergear, y nunca te espera.

v1 · ahoraEl cronista · captura⚡ webhook · merge dev→main

Qué hace: resuelve cliente/proyecto/tasks/bugs, sube el semver, taggea y escribe la fila Ready con el changelog en voz.

Salida: fila Ready; el changelog sale cuando tú la confirmas. Nunca: social.

v2 · despuésEl editor · redacta⚡ webhook · Notion Published

Qué hace: al confirmar tú un changelog, redacta la pieza por canal leyendo la config de Channels y la deja en Draft.

Respeta: solo borrador, nunca postea. Tú curas y publicas — máx por canal/semana, desde la base.

⚑ Guardrails que el sistema hace cumplir

  • Alguien firma siempre. Sin Signed by, el release no pasa a published.
  • Nunca «el equipo de crescō». El firmante rota; lo social sale de su cuenta personal.
  • Changelog continuo, social escaso. Solo el changelog se autopublica.
  • Idempotencia. La marca de agua es el tag — reanudar nunca duplica un release.
07El plan de build

Primero los hechos, después la voz

El orden importa: crear el modelo, probar la lógica del cronista en una corrida manual sobre PRs reales, y recién ahí programar. La voz y lo social vienen cuando el v1 esté probado.

Crear las bases en Notion v1

Channels (sembrada: solo changelog activo, modo auto) y Releases con la relación a Channels y los campos Release PR / Included PRs / Tag.

El cronista, corrida manual v1

Sobre los últimos cortes dev→main de Amedi: validar versionado, tag-diff, resolución de tasks/bugs y la copy en voz antes de automatizar nada.

Conectar el webhook del cronista v1

GitHub Action on: push → main que corre el skill. Resolver primero la autenticación a Notion (token de integración propio, no el MCP de claude.ai que puede faltar en headless).

Página de changelog v1

Vista pública de Notion filtrada Status=published · Customer=X. Después, opcional, servida desde cresco-design con permalinks + RSS.

Base Piezas + el editor v2

Activar canales sociales en Channels, crear la unión Piezas, el segundo skill que redacta por canal, y la automatización de Notion (Status=Published → webhook) que lo dispara.

Empaquetado dónde vive cada pieza · plugin cresco-pm

/release-notes

skill · v1 · el cronista
  • ·Corta un release del último dev→main: resuelve cliente/proyecto/tasks/bugs, calcula SemVer y escribe la fila Ready en Notion.
  • ·Manual (/cresco-pm:release-notes) y reusable por el schedule.

Webhooks

evento · el cuándo
  • ·GitHub Action on-merge dev→main → invoca el cronista.
  • ·Automatización de Notion (Status=Published) → invoca el editor.
  • ·El skill es el «cómo»; el webhook es el «cuándo». Cero polling.

/release-publish v2

skill · el editor
  • ·Toma los Ready y redacta la pieza por canal (LinkedIn/X) leyendo Channels. Humano aprueba.

Ambos skills se scaffoldean con skill-factory (ficha de 8 campos, voz de marca, registro de Notion verificado) y se shipean por PR a main → dispara el auto-update del plugin del equipo y el sync de la base «Skills» en Notion. El skill es la capacidad; la routine es la cadencia.

08Decisiones abiertas

Para que el algoritmo nazca completo

Ninguna bloquea el v1. Son las palancas para subir de «muy bueno» a «lo mejor que hay».

◆ Detección de breaking

Inferir major del gitmoji 💥 es frágil.

Recomiendo: leer también el footer BREAKING CHANGE: del commit o un label en el PR.

◆ Hotfix directo a main

A veces un fix urgente va → main sin pasar por development.

Recomiendo: el cronista tolera ese segundo disparador → patch release.

◆ Hosting del changelog

La vista pública de Notion es MVP, sin permalinks ni RSS.

Recomiendo: v1 con Notion; v2 servido desde cresco-design (permalink por versión + feed).

◆ Override de versión

El gitmoji no siempre captura la intención real del corte.

Recomiendo: una línea Release-As: minor en el PR dev→main como override manual.