<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>changeloop blog</title><description>Release notes en la práctica y changelogs como artefacto de build.</description><link>https://changeloop.dev/</link><language>es-ES</language><item><title>Notas de versión de corrección de errores: cómo escribirlas</title><link>https://changeloop.dev/blog/es/bug-fix-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/bug-fix-release-notes/</guid><description>Las notas de corrección de errores funcionan si cada entrada nombra el síntoma, a quién afectó y qué hacer. Incluye reescrituras y reglas de seguridad.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Unas buenas notas de versión de corrección de errores describen lo que el usuario vio fallar, no lo que hizo mal el código. Cada entrada dice a quién afectó, desde cuándo, si la corrección es completa y si el lector tiene que hacer algo, aunque sea solo &amp;quot;no requiere ninguna acción&amp;quot;.&lt;/p&gt;
&lt;p&gt;La mayoría de los equipos copia una línea del mensaje de commit. La tabla muestra seis reescrituras, y las secciones siguientes explican las reglas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Antes (el mensaje de commit)&lt;/th&gt;
&lt;th&gt;Después (el síntoma)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Fixed null pointer in export handler&lt;/td&gt;
&lt;td&gt;Las exportaciones ya no fallan con &amp;quot;Algo salió mal&amp;quot; cuando un proyecto no tiene etiquetas. Vuelve a ejecutar cualquier exportación que haya fallado desde el 3 de septiembre.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolved race condition in sync worker&lt;/td&gt;
&lt;td&gt;Las ediciones hechas en dos dispositivos con pocos segundos de diferencia ya no se sobrescriben entre sí. No hay nada que hacer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fix timezone bug&lt;/td&gt;
&lt;td&gt;Los informes programados ahora se ejecutan a la hora que fijas. Las cuentas al este de UTC veían informes hasta un día antes desde el 12 de agosto. No requiere ningún cambio.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patched XSS in comment renderer&lt;/td&gt;
&lt;td&gt;Corrección de seguridad: un comentario manipulado podía ejecutar un script en el navegador de otro usuario. Actualiza hoy a la 4.2.1. No vimos explotación en nuestros registros.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed regression from 4.1.0&lt;/td&gt;
&lt;td&gt;La búsqueda vuelve a funcionar con consultas que contienen un guion. Falló en la 4.1.0 y está corregido en la 4.1.1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bug fixes and performance improvements&lt;/td&gt;
&lt;td&gt;Di cuáles. Mira la última sección.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cómo se escribe una entrada de corrección de error en las notas de versión?&lt;/h2&gt;
&lt;p&gt;Empieza con el síntoma en las palabras del usuario, luego a quién afectó y desde cuándo, luego el estado de la corrección y, por último, la acción. Una o dos frases suelen bastar. La causa en el código pertenece al pull request, donde un ingeniero la buscará.&lt;/p&gt;
&lt;p&gt;El lector busca una sola cosa: &amp;quot;¿era yo?&amp;quot;. Cuatro partes cubren casi cualquier entrada:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;El síntoma.&lt;/strong&gt; Lo que apareció en pantalla, en la respuesta de la API o en la factura. Cita el texto del error si lo hubo, porque la gente lo busca.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El alcance.&lt;/strong&gt; Qué plan, plataforma, versión de API o forma de los datos. &amp;quot;Cuentas con más de 50.000 filas&amp;quot; se puede comprobar. &amp;quot;Algunos usuarios&amp;quot; no.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El periodo.&lt;/strong&gt; Desde qué versión o fecha, para que el lector decida si el resultado raro de ayer fue el error.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La acción.&lt;/strong&gt; Volver a ejecutar, volver a sincronizar, actualizar, quitar un workaround, o nada en absoluto.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si los usuarios construyeron un workaround, la línea de acción es donde les dices que pueden eliminarlo.&lt;/p&gt;
&lt;h2&gt;¿Cuál es la diferencia entre una nota de versión y un changelog?&lt;/h2&gt;
&lt;p&gt;Un changelog es el registro completo y continuo de los cambios. Las notas de versión son un mensaje seleccionado y reescrito sobre un lanzamiento, para quien decide si le importa. En cuanto a las correcciones, el changelog lista todas y las notas abren con las que un lector pudo notar.&lt;/p&gt;
&lt;p&gt;Una errata en un tooltip pertenece solo al changelog. Un tipo de impuesto equivocado en las facturas pertenece a ambos. La división completa está en &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-vs-release-notes/&quot;&gt;changelog vs. notas de versión&lt;/a&gt;, y la forma de un buen conjunto de notas está en &lt;a href=&quot;https://changeloop.dev/blog/es/how-to-write-release-notes/&quot;&gt;cómo escribir notas de versión&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt; es una convención útil para el lado del registro. Reserva &amp;quot;Fixed&amp;quot; para cualquier corrección de errores y un encabezado &amp;quot;Security&amp;quot; aparte para las vulnerabilidades, que es la misma división que hace este artículo de cara al lector.&lt;/p&gt;
&lt;h2&gt;¿Una corrección de error es una actualización?&lt;/h2&gt;
&lt;p&gt;Sí. Una corrección de error cambia el producto, así que publicar una es una actualización. Bajo el &lt;a href=&quot;https://semver.org/&quot;&gt;versionado semántico&lt;/a&gt;, una corrección compatible hacia atrás es una versión de parche, por ejemplo de la 4.2.0 a la 4.2.1.&lt;/p&gt;
&lt;p&gt;Si el lector tiene que hacer algo es otra pregunta, y la nota debe responderla. Una corrección que cambia lo que observa un llamante correcto se acerca a un cambio incompatible, y &lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;breaking changes&lt;/a&gt; explica dónde está esa línea.&lt;/p&gt;
&lt;h2&gt;¿Cuándo merece una corrección su propia entrada y cuándo es una corrección menor?&lt;/h2&gt;
&lt;p&gt;Da a una corrección su propia entrada cuando un usuario pudo notar el error, perder tiempo o datos por su culpa, o construir un workaround a su alrededor. Agrúpala en una lista breve de &amp;quot;Correcciones menores&amp;quot; cuando nadie fuera de tu equipo pudo verla. Júzgala por la experiencia del lector, sea cual sea el tamaño del diff.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tiene su propia entrada&lt;/th&gt;
&lt;th&gt;Va en la lista de correcciones menores&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Reportada por un cliente o sufrida por muchos&lt;/td&gt;
&lt;td&gt;Fallo cosmético en una pantalla que casi nadie abre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Causó resultados erróneos, trabajos fallidos o trabajo perdido&lt;/td&gt;
&lt;td&gt;Errata, espaciado, un icono desalineado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requiere una acción del lector&lt;/td&gt;
&lt;td&gt;Corrección en una herramienta interna o página de admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Una regresión de un lanzamiento reciente&lt;/td&gt;
&lt;td&gt;Fallo visto solo en un entorno de pruebas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Afecta a facturación, permisos o datos&lt;/td&gt;
&lt;td&gt;Redacción de logs, subidas de dependencias sin efecto para el usuario&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Cada línea del grupo debe seguir diciendo algo: &amp;quot;Se corrigieron algunos problemas de interfaz&amp;quot; es un marcador de posición.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe sobre una regresión?&lt;/h2&gt;
&lt;p&gt;Nombra la versión que la introdujo, llámala regresión y da la versión que la corrige. Quienes sufrieron el error ya saben que falló, así que una admisión breve y directa les sirve más que una redacción vaga.&lt;/p&gt;
&lt;p&gt;Por ejemplo: &amp;quot;Los resultados de búsqueda para consultas con un guion salían vacíos en la 4.1.0. Está corregido en la 4.1.1. Si cambiaste tus consultas para evitar los guiones, puedes volver a las originales.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Mayor fiabilidad de la búsqueda&amp;quot; suena a evasiva para quien perdió una tarde por el error. Si la causa aún se está confirmando, dilo, como indica la guía sobre &lt;a href=&quot;https://changeloop.dev/blog/es/emergency-release-notes/&quot;&gt;notas de versión de emergencia&lt;/a&gt;: que la nota nunca suene más segura de lo que está el equipo.&lt;/p&gt;
&lt;h2&gt;¿Cómo se anuncia una corrección de seguridad?&lt;/h2&gt;
&lt;p&gt;Indica la gravedad con claridad, nombra las versiones afectadas y la versión que las corrige, di cuán urgente es actualizar e incluye el identificador CVE si existe. Publica los detalles solo cuando los usuarios puedan actuar sobre una corrección, siguiendo un proceso de divulgación coordinada cuando intervino quien lo reportó.&lt;/p&gt;
&lt;p&gt;La secuencia importa: quien lo reporta te avisa en privado, tú publicas la corrección y la nota pública sale cuando los usuarios pueden protegerse. &lt;a href=&quot;https://www.cisa.gov/coordinated-vulnerability-disclosure-process&quot;&gt;CISA&amp;#39;s coordinated vulnerability disclosure process&lt;/a&gt; coordina el reporte, el análisis y la divulgación pública de vulnerabilidades. Las &lt;a href=&quot;https://www.cve.org/ResourcesSupport/AllResources/CNARules&quot;&gt;CVE Numbering Authority rules&lt;/a&gt; rigen cómo se asignan y publican los registros CVE, y en GitHub un &lt;a href=&quot;https://docs.github.com/en/code-security/security-advisories/working-with-repository-security-advisories/about-repository-security-advisories&quot;&gt;repository security advisory&lt;/a&gt; te permite redactar el aviso en privado y solicitar un identificador.&lt;/p&gt;
&lt;p&gt;Una entrada de seguridad suele llevar cuatro datos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qué podría hacer un atacante, en una frase y sin una prueba de concepto.&lt;/li&gt;
&lt;li&gt;Las versiones afectadas y la versión que lo corrige.&lt;/li&gt;
&lt;li&gt;Cuán urgente es: &amp;quot;actualiza hoy&amp;quot; o &amp;quot;actualiza en tu próxima versión&amp;quot;.&lt;/li&gt;
&lt;li&gt;Si has visto explotación, y el crédito a quien lo reportó si estuvo de acuerdo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deja fuera los pasos del exploit.&lt;/p&gt;
&lt;h2&gt;¿Qué debe decir una nota sobre la corrección de una pérdida de datos?&lt;/h2&gt;
&lt;p&gt;Di qué datos se vieron afectados, cómo saber si los tuyos lo estuvieron y si se pueden recuperar. &amp;quot;No requiere ninguna acción&amp;quot; rara vez es cierto aquí, y la primera pregunta del lector es &amp;quot;se han perdido mis datos&amp;quot;.&lt;/p&gt;
&lt;p&gt;Una entrada útil da la condición que perdió datos (&amp;quot;borrar una carpeta mientras se ejecutaba una sincronización&amp;quot;), el periodo en el que era posible, una forma de comprobarlo (&amp;quot;abre la Papelera y busca elementos fechados entre el 3 y el 9 de septiembre&amp;quot;) y el camino de recuperación. Si los datos no se pueden recuperar, dilo. Contacta también directamente con los clientes afectados, porque la nota de versión no debería ser el único sitio donde alguien se entera de que sus datos se vieron afectados.&lt;/p&gt;
&lt;h2&gt;¿Por qué &amp;quot;Corrección de errores y mejoras de rendimiento&amp;quot; es una mala nota?&lt;/h2&gt;
&lt;p&gt;No le da al lector nada sobre lo que actuar y oculta las correcciones que alguien esperaba. Un cliente que reportó un cierre inesperado no puede saber si está corregido, y uno con un workaround no puede saber si debe quitarlo.&lt;/p&gt;
&lt;p&gt;Hay dos alternativas honestas. Si un lanzamiento no tiene nada que un lector pudiera notar, no publiques notas para él y deja que el changelog guarde el registro. Si tiene correcciones, lístalas en los términos del lector:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Antes:
  Corrección de errores y mejoras de rendimiento.

Después:
  Corregido: la exportación CSV fallaba en proyectos sin etiquetas.
  Corregido: el modo oscuro ocultaba el cursor en el cuadro de
  comentarios.
  Más rápido: el panel abre antes en espacios con más de 100
  proyectos.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿De dónde salen las notas de corrección de errores?&lt;/h2&gt;
&lt;p&gt;Salen del pull request que corrigió el error y del reporte que lo originó. Si las palabras de quien reportó viajan con la corrección, la mitad del síntoma ya está escrita.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-vs-bug-report/&quot;&gt;Solicitud de función vs bug&lt;/a&gt; explica por qué etiquetar bien un reporte decide quién se hace cargo. En Changeloop, un error reportado a través del widget se convierte en un issue de GitHub con la etiqueta &lt;code&gt;bug&lt;/code&gt;, y la entrada del changelog se redacta a partir del pull request fusionado y se retiene hasta que una persona la apruebe antes de publicarla. La &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;plantilla de notas de versión&lt;/a&gt; te da la misma forma de entrada para escribir a mano: síntoma, alcance, periodo, acción.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Qué deben incluir las notas de versión de corrección de errores?&lt;/strong&gt;
Cada entrada debe nombrar el síntoma que vio el usuario, a quién afectó, desde qué versión o fecha, si la corrección es completa y qué tiene que hacer el lector, incluido &amp;quot;nada&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Se debe listar cada corrección de error en las notas de versión?&lt;/strong&gt;
No. Lista las que un usuario pudo notar, por las que perdió tiempo o que rodeó con un workaround, y agrupa las correcciones cosméticas o internas en una lista breve de &amp;quot;Correcciones menores&amp;quot;. El changelog conserva cada corrección para quien necesite consultarla.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo se escriben las notas de versión de un error que introdujiste tú?&lt;/strong&gt;
Di que fue una regresión, nombra la versión que la introdujo y la que la corrige, e indica a los lectores si pueden quitar algún workaround. Una declaración directa se lee mejor que una redacción suavizada.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo se consultan las notas de versión de un producto que usas?&lt;/strong&gt;
Busca una página de changelog o de notas de versión enlazada desde el menú de ayuda, el pie de página o la documentación del producto, o en la pestaña de releases del repositorio en los proyectos de código abierto.&lt;/p&gt;
</content:encoded></item><item><title>Cómo pedir feedback a los clientes en tu producto</title><link>https://changeloop.dev/blog/es/how-to-ask-for-customer-feedback/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/how-to-ask-for-customer-feedback/</guid><description>Haz una pregunta concreta justo después de que el usuario haga algo, donde trabaja. Frases listas para cada momento y los malos enfoques que evitar.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Para pedir feedback a los clientes en un producto de software, haz una pregunta concreta sobre algo que el usuario acaba de hacer, en el lugar donde lo hizo. &amp;quot;¿Cómo te fue al exportar ese informe?&amp;quot; justo después de una exportación obtiene respuesta. &amp;quot;Cuéntanos qué piensas de nuestro producto&amp;quot; en un pie de página obtiene silencio. El resto de esta página son los momentos, los canales y las frases exactas.&lt;/p&gt;
&lt;p&gt;La mayoría de los consejos sobre este tema están escritos para tiendas y centros de atención. Un equipo de software sabe exactamente qué hizo el usuario hace un segundo, así que la pregunta puede ser sobre eso.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Momento&lt;/th&gt;
&lt;th&gt;Dónde preguntar&lt;/th&gt;
&lt;th&gt;Frase lista para usar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Justo al terminar una tarea&lt;/td&gt;
&lt;td&gt;En la app, junto al resultado&lt;/td&gt;
&lt;td&gt;&amp;quot;¿Esa exportación hizo lo que necesitabas?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tras el primer uso de una función nueva&lt;/td&gt;
&lt;td&gt;En la app, una sola vez&lt;/td&gt;
&lt;td&gt;&amp;quot;¿Qué intentabas hacer con la Edición masiva?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tras resolver un ticket de soporte&lt;/td&gt;
&lt;td&gt;En el hilo de soporte&lt;/td&gt;
&lt;td&gt;&amp;quot;¿Eso lo arregló, o sigue habiendo algo raro?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cuando un usuario se atasca o abandona un flujo&lt;/td&gt;
&lt;td&gt;Email, un día después&lt;/td&gt;
&lt;td&gt;&amp;quot;Te detuviste en el paso 3 de la configuración. ¿Qué te lo impidió?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tras 30 días de uso regular&lt;/td&gt;
&lt;td&gt;Email de una persona con nombre&lt;/td&gt;
&lt;td&gt;&amp;quot;¿Qué es lo único que cambiarías?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cuando un usuario cancela&lt;/td&gt;
&lt;td&gt;En el flujo de cancelación&lt;/td&gt;
&lt;td&gt;&amp;quot;¿Qué te hizo decidir irte hoy?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tras entregar algo que pidieron&lt;/td&gt;
&lt;td&gt;Donde lo pidieron&lt;/td&gt;
&lt;td&gt;&amp;quot;Pediste importar CSV. Ya está disponible. ¿Cubre tu caso?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuál es el mejor momento para pedir feedback?&lt;/h2&gt;
&lt;p&gt;El mejor momento es justo después de que el usuario termine algo, mientras el detalle sigue fresco en su cabeza. Una pregunta que sigue a una acción recibe una respuesta sobre esa acción. Una pregunta que llega de la nada recibe una respuesta sobre el estado de ánimo de la persona en ese momento, o ninguna.&lt;/p&gt;
&lt;p&gt;No preguntes al registrarse, porque nadie ha usado nada todavía. No preguntes en medio de una tarea, porque interrumpes justo lo que quieres entender. Cuando una persona ha respondido, déjala tranquila hasta que tengas algo que contarle.&lt;/p&gt;
&lt;h2&gt;¿Dónde se debe pedir feedback a los clientes?&lt;/h2&gt;
&lt;p&gt;Pregunta en el lugar donde ocurrió la experiencia. Un aviso dentro de la app encaja con una pregunta sobre una pantalla. El hilo de soporte encaja con una pregunta sobre una corrección. El email encaja con una pregunta sobre una semana de uso, o sobre un flujo que la persona abandonó. Una llamada encaja con las preguntas que no puedes prever.&lt;/p&gt;
&lt;p&gt;Cada canal da un tipo distinto de respuesta:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dentro de la app:&lt;/strong&gt; respuestas breves, inmediatas y concretas, pero solo de quienes están presentes. De los usuarios que se fueron no oyes nada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hilo de soporte:&lt;/strong&gt; de gente que ya estaba lo bastante frustrada como para escribir. Bueno para encontrar lo que está roto, malo para juzgar el resto del producto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email:&lt;/strong&gt; respuestas más largas de menos personas, y la única forma de llegar a usuarios que se han quedado callados. Escríbelo como una nota breve de una persona con nombre, con una sola pregunta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entrevista:&lt;/strong&gt; la forma de entender por qué la gente hace las cosas. Pídeles que te enseñen cómo trabajan y quédate callado mientras lo hacen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/es/feedback-signal-quality/&quot;&gt;Calidad de la señal del feedback&lt;/a&gt; explica cómo valorar lo que te dice cada canal.&lt;/p&gt;
&lt;h2&gt;¿Cómo se pide feedback de forma profesional?&lt;/h2&gt;
&lt;p&gt;Sé específico sobre la cosa, di por qué preguntas y haz que responder cueste menos de un minuto. Una petición profesional nombra el momento, deja claro que una persona leerá la respuesta y no se disculpa por la interrupción.&lt;/p&gt;
&lt;p&gt;Nombra la acción exacta (&amp;quot;la exportación que acabas de lanzar&amp;quot;), pide una sola cosa, usa un cuadro de texto libre sin campos obligatorios y firma con un nombre de pila.&lt;/p&gt;
&lt;h2&gt;¿Qué frase es buena para pedir feedback?&lt;/h2&gt;
&lt;p&gt;Una buena frase es una pregunta sobre un momento concreto que se puede responder en pocas palabras. Compara las dos columnas de abajo. Las de la izquierda se pueden responder con un encogimiento de hombros. Las de la derecha obligan a la persona a recordar algo real.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Petición débil&lt;/th&gt;
&lt;th&gt;Petición más sólida&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&amp;quot;¿Algún comentario?&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;¿Qué fue lo más difícil al configurar esto?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;¿Qué te parece nuestro producto?&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;¿Para qué usaste esto la semana pasada?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;Valora tu experiencia del 1 al 10.&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;¿Conseguiste hacer hoy lo que venías a hacer?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;Dinos cómo podemos mejorar.&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;¿Qué es lo que más te frenó esta semana?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;¿Nos recomendarías?&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;¿A quién se lo enseñaste por última vez y qué le dijiste?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Otra que funciona casi en cualquier parte: &amp;quot;¿Qué usas en su lugar cuando esto no te sirve?&amp;quot; Saca a la luz al verdadero competidor, que a menudo es una hoja de cálculo.&lt;/p&gt;
&lt;h2&gt;¿Cuáles son las peores formas de pedir feedback?&lt;/h2&gt;
&lt;p&gt;Las peores peticiones son amplias, tempranas, largas o tendenciosas. Comparten un problema: la persona no puede responder sin hacer el trabajo de pensar que te correspondía a ti.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;Por favor, rellena nuestra encuesta de 20 preguntas.&amp;quot;&lt;/strong&gt; Quienes la terminan son los que tienen más tiempo libre o las opiniones más fuertes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un popup en la primera página tras iniciar sesión.&lt;/strong&gt; El usuario vino a hacer algo y se lo bloqueaste. Cerrarlo es la única respuesta sensata.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;¡Nos encantaría conocer tu opinión!&amp;quot; sin ninguna pregunta.&lt;/strong&gt; Le pide al usuario que invente el tema.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una pregunta tendenciosa: &amp;quot;¿Cuánto te encanta el nuevo panel?&amp;quot;&lt;/strong&gt; Obtienes acuerdo y no aprendes nada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una valoración sin seguimiento.&lt;/strong&gt; Un 6 sobre 10 te dice el ánimo. No te dice qué cambiar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preguntar y luego callarse.&lt;/strong&gt; Esto te cuesta la siguiente ronda, como se explica más abajo.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;¿Cómo se llama el feedback de los clientes sobre un producto?&lt;/h2&gt;
&lt;p&gt;El feedback sobre un producto suele llamarse feedback de producto, y se divide en dos tipos. Un informe de error dice que algo no funciona como debería. Una solicitud de función dice que falta algo. La distinción decide quién lo mira primero, y &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-vs-bug-report/&quot;&gt;solicitud de función vs bug&lt;/a&gt; traza esa línea. Un tercer tipo, el elogio, vale la pena conservarlo y citarlo con permiso.&lt;/p&gt;
&lt;p&gt;Un formulario de feedback que ofrece &amp;quot;Bug&amp;quot; y &amp;quot;Feature request&amp;quot; como primera opción hace esa primera clasificación por ti.&lt;/p&gt;
&lt;h2&gt;¿Qué haces con las respuestas?&lt;/h2&gt;
&lt;p&gt;Pon cada respuesta donde el equipo ya trabaja, con las palabras de la persona intactas. Una sola línea de texto citado vale más que tu resumen. Etiquétala por tipo y urgencia aproximada, fusiona las repetidas y decide: construirla, aparcarla o rechazarla.&lt;/p&gt;
&lt;p&gt;Rechazar también cuenta como respuesta. &amp;quot;No vamos a construir esto, y este es el motivo&amp;quot; pone fin a la espera, y &lt;a href=&quot;https://changeloop.dev/blog/es/declining-feature-requests/&quot;&gt;rechazar una solicitud de función&lt;/a&gt; tiene frases para ello. Para la fontanería, &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-tracking/&quot;&gt;seguimiento de solicitudes de funciones&lt;/a&gt; describe cómo reunir solicitudes de cinco canales en una sola lista. Si recibes las solicitudes por escrito, una &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-template/&quot;&gt;plantilla de solicitud de función&lt;/a&gt; las mantiene comparables.&lt;/p&gt;
&lt;p&gt;El widget de Changeloop registra cada envío como un issue de GitHub, de modo que el feedback llega junto al código que lo arreglará. Con cualquier herramienta la regla es la misma: una lista, un responsable, ninguna respuesta olvidada en la bandeja de alguien.&lt;/p&gt;
&lt;h2&gt;¿Por qué contar lo que se entregó?&lt;/h2&gt;
&lt;p&gt;Le demuestra a la persona que responder valió la pena. Un usuario que te dijo algo y luego oye &amp;quot;esto ya está disponible, gracias&amp;quot; tiene un motivo para responder otra vez. Quien no oye nada concluye que nadie lee ese cuadro.&lt;/p&gt;
&lt;p&gt;Así que el último paso de preguntar es una respuesta. Cuéntale a cada persona que lo pidió cuándo se entrega su solicitud, en sus propios términos y por el canal que usó. &lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;Cerrar el ciclo de feedback del cliente&lt;/a&gt; describe el mecanismo: la entrada publicada del changelog es lo que dispara el mensaje, de modo que al solicitante solo se le avisa cuando el cambio ya está en producción. En Changeloop, cuando el feedback del widget se convirtió en un issue de GitHub y el pull request fusionado lo cierra, aprobar la entrada publica un comentario &amp;quot;Shipped&amp;quot; en ese issue y muestra al autor la entrada en el widget; los issues creados a mano y los repositorios de GitLab o Bitbucket no reciben comentario. Nuestra documentación enumera la &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;configuración del widget y del feed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Una respuesta puede ser corta: &amp;quot;Pediste importar CSV en marzo. Ya está disponible hoy, y así funciona.&amp;quot; Además te da la mejor pregunta siguiente: si cubre lo que necesitaba.&lt;/p&gt;
&lt;h2&gt;Un plan para empezar&lt;/h2&gt;
&lt;p&gt;Elige un momento de la tabla de arriba, aquel en el que los usuarios más a menudo tienen éxito o se rinden. Escribe una pregunta para él, ponla en un solo canal y lee cada respuesta durante dos semanas antes de añadir un segundo aviso. Responde a quien te haya dado algo concreto.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Con qué frecuencia se debe pedir feedback a los clientes?&lt;/strong&gt;
Vincula las peticiones a eventos, no a un calendario. Un usuario debería ver como máximo un aviso por semana, y ninguno justo después de responder uno. El siguiente mensaje tras un feedback debe ser una respuesta sobre lo que pasó con él.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo se pide feedback sin molestar a los usuarios?&lt;/strong&gt;
Pregunta después de una tarea, nunca en medio de una, limítate a una pregunta y haz que sea fácil descartarla. Respeta un descarte durante unas semanas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Se debe ofrecer un incentivo a cambio de feedback?&lt;/strong&gt;
Normalmente no hace falta. Una pregunta concreta y una respuesta visible pesan más que una tarjeta regalo, y los incentivos atraen a quienes quieren la recompensa. Resérvalos para las entrevistas, donde pides 20 minutos del tiempo de alguien.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Y si nadie responde?&lt;/strong&gt;
Acota la pregunta y acércala al momento, por ejemplo una pantalla, preguntada justo después de usarla. Si sigue sin respuesta, escribe por email a un puñado de usuarios y usa esas conversaciones para redactar mejores avisos.&lt;/p&gt;
</content:encoded></item><item><title>Ejemplos de roadmap de producto: seis formatos</title><link>https://changeloop.dev/blog/es/product-roadmap-examples/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/product-roadmap-examples/</guid><description>Seis ejemplos de roadmap de producto con entradas realistas: Now/Next/Later, trimestral, por temas, por resultados, pública y de releases, con sus fallos.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Los ejemplos de roadmap de producto que vale la pena copiar se reducen a seis formatos: Now/Next/Later,
una línea de tiempo trimestral, una roadmap por temas, una por resultados, una roadmap pública y una
roadmap interna de releases. Cada uno responde una pregunta distinta para un lector distinto, así que
el ejemplo correcto es el que encaja con quien va a leer la tuya. El diseño se decide al final.&lt;/p&gt;
&lt;p&gt;Todos los ejemplos de abajo son para un producto inventado, una app de tareas para equipos pequeños, y
cada elemento es ficticio. Lo que importa es la forma: qué va en cada espacio, cómo es una entrada real
y qué hace que ese formato se rompa pasado un trimestre.&lt;/p&gt;
&lt;h2&gt;¿Cuáles son buenos ejemplos de roadmap de producto?&lt;/h2&gt;
&lt;p&gt;Un buen ejemplo de roadmap es corto, nombra a un lector y hace un solo tipo de promesa. Elige el formato
según la promesa que estés dispuesto a cumplir: una dirección, una fecha, un tema de trabajo, un
resultado, un compromiso público o un calendario de entregas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Formato&lt;/th&gt;
&lt;th&gt;Pensado para&lt;/th&gt;
&lt;th&gt;Funciona cuando&lt;/th&gt;
&lt;th&gt;Falla cuando&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Now/Next/Later&lt;/td&gt;
&lt;td&gt;Toda la empresa&lt;/td&gt;
&lt;td&gt;Los planes cambian a menudo&lt;/td&gt;
&lt;td&gt;&amp;quot;Next&amp;quot; se llena y se vuelve una cola&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Línea de tiempo trimestral&lt;/td&gt;
&lt;td&gt;Ventas, soporte, dirección&lt;/td&gt;
&lt;td&gt;Las fechas son restricciones reales&lt;/td&gt;
&lt;td&gt;Las fechas se retrasan y nadie las actualiza&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Por temas&lt;/td&gt;
&lt;td&gt;Dirección, nuevas incorporaciones&lt;/td&gt;
&lt;td&gt;Quieres explicar el porqué&lt;/td&gt;
&lt;td&gt;Los temas se vuelven tan amplios que todo cabe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Por resultados&lt;/td&gt;
&lt;td&gt;Producto e ingeniería&lt;/td&gt;
&lt;td&gt;Puedes medir el objetivo&lt;/td&gt;
&lt;td&gt;La métrica no tiene responsable ni datos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pública&lt;/td&gt;
&lt;td&gt;Clientes&lt;/td&gt;
&lt;td&gt;Puedes mantenerla pequeña&lt;/td&gt;
&lt;td&gt;Se convierte en un volcado del backlog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interna de releases&lt;/td&gt;
&lt;td&gt;Ingeniería, QA, soporte&lt;/td&gt;
&lt;td&gt;Varios equipos entregan juntos&lt;/td&gt;
&lt;td&gt;Se confunde con la estrategia&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cómo es cada ejemplo de roadmap de producto?&lt;/h2&gt;
&lt;p&gt;Cada formato se muestra con entradas realistas, seguido de a quién le sirve, cuándo aguanta y cómo
suele fallar.&lt;/p&gt;
&lt;h3&gt;Now/Next/Later&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;NOW (en desarrollo este mes)
  Vistas guardadas en la bandeja
  Exportación CSV que funcione en cuentas grandes
NEXT (decidido, orden sin fijar)
  SSO para el plan Team
  Notificaciones de Slack
LATER (una dirección, sin compromiso)
  App móvil
  Registro de auditoría
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Este sirve a una empresa que no quiere prometer fechas, algo habitual en equipos en fase temprana.
Aguanta porque las tres columnas describen cuánta certeza tienes: &amp;quot;now&amp;quot; está en marcha, &amp;quot;next&amp;quot; está
decidido, &amp;quot;later&amp;quot; es una esperanza. Falla cuando &amp;quot;later&amp;quot; se convierte en el sitio donde aparcar cada
idea que nadie quiere rechazar, y cuando &amp;quot;next&amp;quot; adquiere en silencio un orden y una fecha sin que nadie
lo llame calendario.&lt;/p&gt;
&lt;h3&gt;Línea de tiempo o roadmap trimestral&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;T4 2026
  Oct   Vistas guardadas en la bandeja
  Nov   Beta de SSO con cinco socios de diseño
  Dic   SSO disponibilidad general
T1 2027
  Ene   Notificaciones de Slack
  Mar   Registro de auditoría (solo exportar)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Este sirve a ventas, soporte y finanzas, que necesitan planificar en torno a algo. Funciona cuando las
fechas son restricciones reales, como un contrato, una conferencia o un plazo de cumplimiento normativo.
Falla cuando las fechas son suposiciones, porque un mes en una roadmap se convierte en una promesa en
una presentación de ventas en pocas semanas. Si usas este formato, marca cada trimestre como
comprometido o previsto, y haz que el segundo trimestre sea visiblemente más blando que el primero.&lt;/p&gt;
&lt;h3&gt;Roadmap por temas&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TEMA: Experiencia de la primera semana
  Importar desde CSV y Trello
  Plantillas iniciales
TEMA: Listos para equipos más grandes
  SSO
  Registro de auditoría
  Permisos por rol
TEMA: Menos pasos manuales
  Notificaciones de Slack
  Tareas recurrentes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Este sirve para las actualizaciones a la dirección y para quien se incorpora, porque explica por qué
existe el trabajo antes de listarlo. Aguanta cuando cada tema corresponde a una razón por la que a un
cliente le importaría. Falla cuando los temas son tan amplios (&amp;quot;Crecimiento&amp;quot;, &amp;quot;Calidad&amp;quot;) que cada
elemento cabe bajo cada uno, y entonces la agrupación no explica nada.&lt;/p&gt;
&lt;h3&gt;Roadmap por resultados&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;OBJETIVO: Más equipos nuevos terminan la configuración
  Métrica: config. en 7 días, del 40% al 55%
  Apuestas: importar desde CSV, plantillas iniciales
OBJETIVO: Menos tickets de soporte sobre exportaciones
  Métrica: tickets de export. por semana, de 30 a 10
  Apuestas: arreglo de export. en cuentas grandes,
            página de estado de exportación
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Las cifras son ilustrativas, y lo importante es la estructura: un objetivo, una métrica con punto de
partida y meta, y las apuestas que vas a probar. Sirve a equipos de producto e ingeniería a quienes se
confía la elección de la solución. Funciona cuando la métrica existe y alguien es responsable de ella.
Falla cuando el objetivo no se puede medir, o cuando las &amp;quot;apuestas&amp;quot; son la misma lista de funciones de
antes con una frase de resultado pegada encima.&lt;/p&gt;
&lt;h3&gt;Roadmap pública para clientes&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PLANIFICADO
  Vistas guardadas en la bandeja
EN DESARROLLO
  Notificaciones de Slack
ENTREGADO
  Exportación CSV para cuentas grandes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Es el formato más pequeño y el que hace la promesa más fuerte. Sirve a los clientes, que quieren saber
si se escuchó su petición. Aguanta con muy pocos elementos, sin fechas y con títulos escritos con las
palabras del cliente. Falla como volcado del backlog: cada &amp;quot;quizá&amp;quot; que listas es una promesa
por la que alguien preguntará más adelante. La mecánica para llevar una desde tu issue tracker está en
&lt;a href=&quot;https://changeloop.dev/blog/es/public-roadmap/&quot;&gt;una roadmap pública en tres columnas&lt;/a&gt;, así que aquí no se repite.&lt;/p&gt;
&lt;h3&gt;Roadmap interna de releases&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Release&lt;/th&gt;
&lt;th&gt;Objetivo&lt;/th&gt;
&lt;th&gt;Responsable&lt;/th&gt;
&lt;th&gt;Depende de&lt;/th&gt;
&lt;th&gt;Estado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;td&gt;14 oct&lt;/td&gt;
&lt;td&gt;Plataforma&lt;/td&gt;
&lt;td&gt;Actualización del servicio de auth&lt;/td&gt;
&lt;td&gt;Código completo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.3&lt;/td&gt;
&lt;td&gt;11 nov&lt;/td&gt;
&lt;td&gt;Bandeja&lt;/td&gt;
&lt;td&gt;API de vistas guardadas&lt;/td&gt;
&lt;td&gt;En curso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;td&gt;9 dic&lt;/td&gt;
&lt;td&gt;Plataforma&lt;/td&gt;
&lt;td&gt;Contrato con proveedor de SSO&lt;/td&gt;
&lt;td&gt;Bloqueado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Este sirve a ingeniería, QA y soporte, que necesitan saber qué se entrega junto y qué bloquea a qué.
Funciona cuando es exacto a la semana y tiene un responsable por fila. Falla cuando alguien lo confunde
con estrategia: un calendario de entregas dice qué sale por la puerta y cuándo, y no dice nada sobre si
esas releases eran las apuestas correctas.&lt;/p&gt;
&lt;h2&gt;¿Qué formato de roadmap de producto deberías elegir?&lt;/h2&gt;
&lt;p&gt;Elige primero por lector y después por cuánta certeza tienes de verdad. Si no puedes nombrar quién lee
la roadmap y qué decisión le ayuda a tomar, ninguno de los ejemplos de arriba la
salvará.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clientes que preguntan &amp;quot;¿me habéis escuchado?&amp;quot;&lt;/strong&gt; Usa el formato público y mantenlo en un puñado de
elementos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ventas y soporte que preguntan &amp;quot;¿puedo darle una fecha al cliente?&amp;quot;&lt;/strong&gt; Usa la línea de tiempo
trimestral, con lo comprometido y lo previsto claramente separados.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La dirección que pregunta &amp;quot;¿por qué este trabajo?&amp;quot;&lt;/strong&gt; Usa temas, o resultados si tienes los datos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un equipo que cambia de rumbo cada mes.&lt;/strong&gt; Usa Now/Next/Later y resiste la tentación de ponerle
fechas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ingenieros que preguntan &amp;quot;¿qué sale cuándo?&amp;quot;&lt;/strong&gt; Usa la roadmap de releases, y mantenla aparte de la
estratégica.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La mayoría de los equipos acaba con dos: una roadmap estratégica en una de las
cuatro primeras formas y, debajo, un calendario de releases. La roadmap pública es entonces una vista
filtrada de la estratégica, que muestra solo aquello por lo que aceptas que te pidan cuentas.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe una roadmap de producto?&lt;/h2&gt;
&lt;p&gt;Se escribe nombrando al lector, eligiendo el formato que encaja con su pregunta, listando solo los
elementos que defenderías en una reunión y dando a cada uno un estado y un responsable. Después,
decide cada cuánto se revisará antes de publicarla.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Nombra al lector y la decisión.&lt;/strong&gt; &amp;quot;Soporte decide qué decirle a los clientes sobre SSO&amp;quot; es un
motivo. &amp;quot;Todos deberían ver la roadmap&amp;quot; no te da nada para diseñar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parte de lo que ya sabes.&lt;/strong&gt; Las solicitudes abiertas,
&lt;a href=&quot;https://changeloop.dev/blog/es/prioritizing-feature-requests/&quot;&gt;ordenadas con una regla que puedas explicar&lt;/a&gt;, son mejor
materia prima que una lluvia de ideas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Escribe cada elemento como un resultado para el cliente.&lt;/strong&gt; &amp;quot;Conserva un filtro que usas a menudo&amp;quot;
se lee mejor que &amp;quot;Implementar persistencia de vistas guardadas&amp;quot;, y le dice al cliente si es su
problema.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decide qué no contendrá la roadmap.&lt;/strong&gt; Fechas, estimaciones y un backlog de ideas son las tres
exclusiones habituales.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fija una fecha de revisión.&lt;/strong&gt; Una roadmap sin revisión programada tiene un funeral sin programar.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;¿Cómo mantienes actualizada una roadmap de producto?&lt;/h2&gt;
&lt;p&gt;Se mantiene actualizada moviendo los elementos cuando se mueve el trabajo, desde el mismo lugar donde se
sigue el trabajo, y registrando lo ocurrido cuando un elemento se entrega o se descarta. Una roadmap que
alguien actualiza a mano en otra herramienta se queda obsoleta porque no es el trabajo diario de nadie.&lt;/p&gt;
&lt;p&gt;La fuente de verdad más barata es el issue tracker. Si cada columna de la roadmap corresponde a una
etiqueta del issue, la roadmap cambia cuando cambia la etiqueta, y nada se reescribe. La versión de
Changeloop usa las etiquetas &lt;code&gt;roadmap:planned&lt;/code&gt;, &lt;code&gt;roadmap:building&lt;/code&gt; y &lt;code&gt;roadmap:shipped&lt;/code&gt;, y cuando un
issue lleva dos, gana la más avanzada. Mover una tarjeta a entregado sigue siendo su propio cambio de
etiqueta, así que hazlo parte de la revisión en la que apruebas la entrada del changelog.&lt;/p&gt;
&lt;p&gt;Esa entrada es la otra mitad. Cuando un elemento se entrega, el changelog dice qué cambió en términos
del cliente, y se le puede avisar a quien lo pidió. Cerrar ese ciclo es el sentido del
&lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;ciclo de feedback del cliente&lt;/a&gt;, y la roadmap es el tramo de ese ciclo
que el cliente puede ver antes de que algo se entregue. Si descartas un elemento, dilo; un &amp;quot;no&amp;quot; público
cierra también esa solicitud, y &lt;a href=&quot;https://changeloop.dev/blog/es/declining-feature-requests/&quot;&gt;rechazar una solicitud de función&lt;/a&gt; explica cómo
redactarlo. Los equipos que quieran ver cómo se leen las entradas terminadas pueden consultar
&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;ejemplos de changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es el formato de roadmap de producto más sencillo?&lt;/strong&gt;
Now/Next/Later. Tiene tres columnas, no necesita fechas y agrupa los elementos por certeza. Para un
equipo pequeño que cambia de rumbo a menudo, es también el formato más difícil de equivocar de forma
vergonzosa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuántos elementos debe tener una roadmap de producto?&lt;/strong&gt;
Menos de los que crees. Con menos de diez en todas las columnas basta para una roadmap pública, y
una estratégica interna rara vez necesita más de una docena. Pasado eso, es un backlog con un encabezado
más bonito.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debe una roadmap de producto incluir fechas?&lt;/strong&gt;
Solo si las fechas son restricciones reales, y entonces solo para el trimestre más cercano. Más allá,
usa columnas o temas. Una fecha en una roadmap se convierte en un compromiso en una conversación de
ventas, lo hayas querido o no.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la diferencia entre una roadmap de producto y un plan de releases?&lt;/strong&gt;
Una roadmap dice qué piensas construir y por qué. Un plan de releases dice qué versión sale en qué
fecha y quién es responsable. La roadmap cambia cuando cambia tu estrategia, y el plan de releases
cambia cuando cambia el trabajo.&lt;/p&gt;
</content:encoded></item><item><title>Proceso de gestión de releases para publicar a menudo</title><link>https://changeloop.dev/blog/es/release-management-process/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/release-management-process/</guid><description>Un proceso de gestión de releases en siete pasos, con responsable y criterios de salida para cada uno, más las métricas DORA y un indicador más que seguir.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un proceso de gestión de releases es el conjunto de pasos que lleva un cambio desde &amp;quot;fusionado&amp;quot; hasta &amp;quot;en producción y explicado a las personas a las que afecta&amp;quot;. Para un equipo que publica a menudo, se reduce a siete pasos: planificar el alcance, aislar el cambio, compilar y probar, aprobar, desplegar y verificar, comunicar, y revisar. Cada paso necesita un responsable con nombre y un criterio de salida, o deja de ocurrir sin que nadie lo note.&lt;/p&gt;
&lt;p&gt;Esta guía supone un equipo de 5 a 50 ingenieros que despliegan cada semana o cada día y quieren que el proceso no estorbe.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paso&lt;/th&gt;
&lt;th&gt;Responsable&lt;/th&gt;
&lt;th&gt;Criterios de salida&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1. Planificar el alcance&lt;/td&gt;
&lt;td&gt;Producto o tech lead&lt;/td&gt;
&lt;td&gt;La lista de cambios de esta release está escrita, y lo arriesgado está marcado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Rama o flag&lt;/td&gt;
&lt;td&gt;El ingeniero dueño del cambio&lt;/td&gt;
&lt;td&gt;El trabajo está en una rama de vida corta o tras un flag, para que main siga siendo publicable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Compilar y probar&lt;/td&gt;
&lt;td&gt;CI, con el autor de guardia para los fallos&lt;/td&gt;
&lt;td&gt;Pipeline en verde sobre el commit exacto que se va a publicar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Aprobar&lt;/td&gt;
&lt;td&gt;Revisor, más el release manager en cambios arriesgados&lt;/td&gt;
&lt;td&gt;Revisión hecha, vía de rollback nombrada, decisión de seguir o no registrada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Desplegar y verificar&lt;/td&gt;
&lt;td&gt;Release manager o ingeniero de guardia&lt;/td&gt;
&lt;td&gt;Desplegado, smoke checks superados, tasa de errores y latencia iguales a la referencia previa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Comunicar&lt;/td&gt;
&lt;td&gt;Quien entiende el cambio, editado por alguien que no&lt;/td&gt;
&lt;td&gt;Notas de versión publicadas donde las leen los usuarios, soporte y ventas informados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Revisar&lt;/td&gt;
&lt;td&gt;Release manager&lt;/td&gt;
&lt;td&gt;Métricas leídas, todo lo que salió mal tiene un responsable y una solución&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué es el proceso de gestión de releases?&lt;/h2&gt;
&lt;p&gt;Es el camino repetible que sigue un cambio para llegar a los usuarios: alcance, compilación, pruebas, aprobación, despliegue, verificación, anuncio y balance. Escribirlo sirve para que cada release siga el mismo camino, de modo que una persona de vacaciones, alguien recién incorporado o un ingeniero de guardia a las 2 de la madrugada puedan ejecutarlo sin preguntar a nadie cómo funciona.&lt;/p&gt;
&lt;h2&gt;¿Cuáles son los distintos tipos de gestión de releases?&lt;/h2&gt;
&lt;p&gt;Hay tres tipos prácticos: despliegue continuo, releases programadas y gestión de cambios regulada. Se diferencian en cuánto ocurre antes de una release y cuánto está automatizado. El despliegue continuo publica cada cambio fusionado, las releases programadas agrupan cambios en un tren, y la gestión de cambios regulada añade aprobación formal y un rastro de auditoría.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Despliegue continuo&lt;/th&gt;
&lt;th&gt;Releases programadas&lt;/th&gt;
&lt;th&gt;Gestión de cambios regulada o ITIL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Unidad de release&lt;/td&gt;
&lt;td&gt;Un pull request fusionado&lt;/td&gt;
&lt;td&gt;Un lote, semanal o quincenal&lt;/td&gt;
&lt;td&gt;Una solicitud de cambio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paso de alcance&lt;/td&gt;
&lt;td&gt;Implícito, la fusión es el alcance&lt;/td&gt;
&lt;td&gt;Reunión de planificación de la release&lt;/td&gt;
&lt;td&gt;Registro de cambio con clasificación de riesgo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aprobación&lt;/td&gt;
&lt;td&gt;Revisión de código más comprobaciones automáticas&lt;/td&gt;
&lt;td&gt;El release manager aprueba el lote&lt;/td&gt;
&lt;td&gt;Comité asesor de cambios o aprobador delegado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control de riesgo&lt;/td&gt;
&lt;td&gt;Feature flags, canarios, rollback rápido&lt;/td&gt;
&lt;td&gt;Periodo en staging, release candidate&lt;/td&gt;
&lt;td&gt;Plan de marcha atrás documentado, ventana de mantenimiento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cadencia típica&lt;/td&gt;
&lt;td&gt;Muchas al día&lt;/td&gt;
&lt;td&gt;Semanal a mensual&lt;/td&gt;
&lt;td&gt;La fija el calendario de cambios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Punto débil&lt;/td&gt;
&lt;td&gt;Nadie cuenta a los usuarios qué cambió&lt;/td&gt;
&lt;td&gt;Los lotes grandes esconden el cambio que rompió algo&lt;/td&gt;
&lt;td&gt;El tiempo de proceso eclipsa el propio cambio&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La mayoría de los equipos son una mezcla. Un producto SaaS puede desplegar de forma continua mientras su app móvil sale en un tren semanal, y el único servicio de pagos que importa a los auditores sigue un registro de cambios formal. Elige el tipo por servicio, no por empresa. Cuando los cambios solo se exponen de forma gradual, la release y el anuncio pasan a ser eventos separados, el caso que se trata en &lt;a href=&quot;https://changeloop.dev/blog/es/feature-flags-feature-requests/&quot;&gt;notas de versión con feature flags&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cuáles son las responsabilidades de un release manager?&lt;/h2&gt;
&lt;p&gt;Un release manager es dueño del camino que sigue un cambio hasta producción. Lleva el calendario de releases, decide si un cambio está listo, ejecuta o supervisa el despliegue, toma la decisión de rollback, se asegura de que se avise a los usuarios y dirige la revisión posterior.&lt;/p&gt;
&lt;p&gt;Antes de la release, confirma el alcance y comprueba que todo cambio arriesgado tiene una vía de rollback. Durante ella, ejecuta la checklist de despliegue, vigila los primeros minutos de las métricas de producción y decide el rollback pronto. Después confirma que las notas salieron y anota qué corregir en el proceso.&lt;/p&gt;
&lt;p&gt;En un equipo pequeño, rota el rol cada semana y escribe la checklist para que nadie necesite conocimiento tribal. Un &lt;a href=&quot;https://changeloop.dev/blog/es/monorepo-changelogs/&quot;&gt;monorepo&lt;/a&gt; con muchos paquetes que se publican de forma independiente suele necesitar un responsable de release por paquete, o el rol se convierte en un cuello de botella.&lt;/p&gt;
&lt;h2&gt;¿Cuáles son los KPI clave de la gestión de releases?&lt;/h2&gt;
&lt;p&gt;Sigue las métricas de entrega de software de DORA y añade una propia: cuánto tardan en avisar a los usuarios. La investigación de DORA identifica cinco métricas, divididas en rendimiento (tiempo de entrega de cambios, frecuencia de despliegue, tiempo de recuperación de despliegues fallidos) e inestabilidad (tasa de fallos de cambios, tasa de retrabajo de despliegues).&lt;/p&gt;
&lt;p&gt;La guía de DORA las define en términos sencillos (&lt;a href=&quot;https://dora.dev/guides/dora-metrics/&quot;&gt;dora.dev, software delivery metrics&lt;/a&gt;):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;KPI&lt;/th&gt;
&lt;th&gt;Qué mide&lt;/th&gt;
&lt;th&gt;A qué estar atento&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tiempo de entrega de cambios&lt;/td&gt;
&lt;td&gt;Tiempo desde el commit en el control de versiones hasta el despliegue en producción&lt;/td&gt;
&lt;td&gt;Un número creciente suele indicar colas en la revisión o la aprobación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frecuencia de despliegue&lt;/td&gt;
&lt;td&gt;Cada cuánto despliegas, o el tiempo entre despliegues&lt;/td&gt;
&lt;td&gt;Si la frecuencia cae, los lotes están creciendo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiempo de recuperación de despliegues fallidos&lt;/td&gt;
&lt;td&gt;Tiempo para recuperarse de un despliegue que requiere intervención inmediata&lt;/td&gt;
&lt;td&gt;Aquí aparecen los problemas de rollback y de alertas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tasa de fallos de cambios&lt;/td&gt;
&lt;td&gt;Proporción de despliegues que requieren un rollback o un hotfix&lt;/td&gt;
&lt;td&gt;Sube cuando los lotes son demasiado grandes o las pruebas escasas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tasa de retrabajo de despliegues&lt;/td&gt;
&lt;td&gt;Proporción de despliegues no planificados y causados por un incidente en producción&lt;/td&gt;
&lt;td&gt;Señal de que las correcciones salen más rápido que las lecciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiempo hasta avisar a los usuarios&lt;/td&gt;
&lt;td&gt;Minutos desde el despliegue en producción hasta una nota publicada de cara al usuario&lt;/td&gt;
&lt;td&gt;Mídelo tú mismo, ningún marco lo ofrece&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;El material más antiguo lista cuatro métricas clave y llama a la recuperación &amp;quot;time to restore&amp;quot;. La guía actual usa las cinco de arriba.&lt;/p&gt;
&lt;p&gt;La misma guía advierte contra tratarlas como objetivos. Fijar una meta como &amp;quot;todo se despliega varias veces al día a fin de año&amp;quot; invita a los equipos a manipular las cifras, y las métricas están pensadas para leerse por aplicación o servicio, no mezcladas en toda la empresa. Su consejo práctico para mejorarlas todas es reducir el tamaño de cada cambio, porque los cambios pequeños son más fáciles de revisar, de pasar por el pipeline y de recuperar.&lt;/p&gt;
&lt;h2&gt;¿Cómo encaja la comunicación de la release en el proceso de gestión de releases?&lt;/h2&gt;
&lt;p&gt;Es el paso seis, y tiene un responsable y un criterio de salida como todos los demás: notas publicadas donde las leen los usuarios, y los equipos internos informados. Es el paso que los equipos más omiten, porque las herramientas de despliegue informan de éxito en el instante en que el código está en producción.&lt;/p&gt;
&lt;p&gt;La forma más barata de mantener este paso en plazo es escribir la entrada cuando el cambio se fusiona, no cuando se publica la release. El pull request ya contiene el título, el autor, el issue enlazado y el contexto. Un borrador construido a partir de él se edita, no se escribe de memoria una semana después. Esa es la idea detrás de la &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-automation/&quot;&gt;automatización de changelog&lt;/a&gt;: derivar un borrador al fusionar, retenerlo hasta que una persona lo apruebe y luego publicarlo en todas partes desde una sola fuente. Changeloop funciona así: redacta entradas a partir de pull requests fusionados con IA y las retiene para su aprobación antes de publicar nada.&lt;/p&gt;
&lt;p&gt;Conviene prever dos variaciones. Soporte y ventas necesitan una nota distinta de la de los clientes, para lo que sirven las &lt;a href=&quot;https://changeloop.dev/blog/es/internal-release-notes/&quot;&gt;notas de release internas&lt;/a&gt;. Una release provocada por un incidente no tiene tiempo para el ciclo normal de redacción, así que ten lista una plantilla corta, como se describe en &lt;a href=&quot;https://changeloop.dev/blog/es/emergency-release-notes/&quot;&gt;notas de versión de emergencia&lt;/a&gt;. La &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;plantilla de notas de versión&lt;/a&gt; te da una forma de partida para la versión de cara al cliente.&lt;/p&gt;
&lt;h2&gt;¿Cómo mantienes el proceso ligero?&lt;/h2&gt;
&lt;p&gt;Automatiza todo criterio de salida que una máquina pueda comprobar, y reserva a las personas para los juicios. Un pipeline en verde, una marca de despliegue en los paneles y una entrada de changelog en borrador por cada pull request fusionado se pueden comprobar. Que un plan de rollback sea creíble, o que las notas tengan sentido para un cliente, requiere a una persona.&lt;/p&gt;
&lt;p&gt;Para probar el proceso, elige una release del mes pasado y pregunta si alguien ajeno al equipo podría saber, solo por el registro escrito, qué se publicó, quién lo aprobó, cómo se verificó y cuándo se avisó a los usuarios. Cualquier hueco es tu próxima mejora.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la diferencia entre la gestión de releases y la gestión de cambios?&lt;/strong&gt;
La gestión de releases consigue que un conjunto de cambios se compile, pruebe, despliegue y anuncie. La gestión de cambios, en el sentido de ITIL, es el proceso de aprobación y de riesgo alrededor de cada cambio. Los equipos que publican a menudo integran la aprobación en la revisión de código y las comprobaciones automáticas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Con qué frecuencia deberíamos publicar?&lt;/strong&gt;
Tan a menudo como permitan tus pruebas y tu vía de rollback, que para muchos equipos web es a diario o más. La recomendación de DORA es reducir el tamaño de cada cambio, ya que los cambios pequeños son más fáciles de revisar y de recuperar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Necesitan los equipos pequeños un release manager?&lt;/strong&gt;
Necesitan las responsabilidades, pero no necesariamente el título. Rota el rol entre ingenieros, da a quien esté de turno una checklist escrita y asegúrate de que alguien es dueño de cada uno de los siete pasos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué debe incluir una checklist de release?&lt;/strong&gt;
Alcance confirmado, pipeline en verde sobre el commit que se publica, vía de rollback nombrada, aprobación registrada, smoke checks tras el despliegue, métricas comparadas con la referencia, notas de versión publicadas, soporte informado y una revisión programada. Mantenla en una página.&lt;/p&gt;
</content:encoded></item><item><title>Ejemplos de notas de versión para cada tipo de cambio</title><link>https://changeloop.dev/blog/es/release-notes-examples/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/release-notes-examples/</guid><description>Ejemplos de notas de versión para función, corrección, cambio incompatible, seguridad, deprecación, tienda de apps y nota interna, y por qué sirven.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Los mejores ejemplos de notas de versión son cortos, nombran a quién afectan y dicen qué hacer a continuación. Abajo hay un ejemplo por cada tipo de cambio que vas a publicar, con la razón por la que funciona, para que copies la forma y pongas tus propios datos.&lt;/p&gt;
&lt;p&gt;Todos los ejemplos son inventados, para una app de facturación ficticia llamada Tidepool.&lt;/p&gt;
&lt;h2&gt;¿Qué tienen en común los buenos ejemplos de notas de versión?&lt;/h2&gt;
&lt;p&gt;Cuentan a los usuarios qué cambió y qué deben hacer al respecto, si es que deben hacer algo, con las palabras de los usuarios. Cada tipo de cambio tiene un trabajo distinto, así que la forma varía entre ellos.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo de cambio&lt;/th&gt;
&lt;th&gt;La entrada debe decir&lt;/th&gt;
&lt;th&gt;Dónde va&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Función nueva&lt;/td&gt;
&lt;td&gt;Qué puede hacer ahora el lector y quién la recibe&lt;/td&gt;
&lt;td&gt;Arriba de las notas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mejora&lt;/td&gt;
&lt;td&gt;Qué se volvió más rápido o más fácil, con una cifra si la tienes&lt;/td&gt;
&lt;td&gt;Después de las funciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corrección de error&lt;/td&gt;
&lt;td&gt;El síntoma que vio el lector, y que ya está corregido&lt;/td&gt;
&lt;td&gt;Después de las mejoras&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cambio incompatible&lt;/td&gt;
&lt;td&gt;A quién afecta, la fecha, la migración&lt;/td&gt;
&lt;td&gt;Primero, siempre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corrección de seguridad&lt;/td&gt;
&lt;td&gt;Qué estuvo expuesto, si se explotó, qué hacer&lt;/td&gt;
&lt;td&gt;Primero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deprecación&lt;/td&gt;
&lt;td&gt;Qué desaparece, la fecha final, el reemplazo&lt;/td&gt;
&lt;td&gt;Cerca de arriba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nota de tienda de apps&lt;/td&gt;
&lt;td&gt;Una frase sencilla por cambio, dentro del límite de caracteres&lt;/td&gt;
&lt;td&gt;Ficha de la tienda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nota interna&lt;/td&gt;
&lt;td&gt;Qué cambió y qué decir a los clientes&lt;/td&gt;
&lt;td&gt;Canales de soporte y ventas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cómo es una buena nota de función nueva?&lt;/h2&gt;
&lt;p&gt;Una buena nota de función abre con lo que el lector puede hacer ahora y nombra los planes o roles que la reciben. Se salta la implementación.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Envía facturas en el idioma del cliente.&lt;/strong&gt;
Ahora puedes elegir un idioma para cada cliente, y sus facturas, recordatorios y página de pago lo
siguen. Francés, alemán, español y portugués están disponibles en todos los planes. Configúralo en
la página del cliente, en Preferencias de facturación.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;El titular es una frase que el lector diría en voz alta, y el cuerpo da el alcance y el lugar. Un lector que solo ojea la línea en negrita igualmente sabe qué se entregó. El método completo está en &lt;a href=&quot;https://changeloop.dev/blog/es/how-to-write-release-notes/&quot;&gt;cómo escribir notas de versión&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cómo es una buena nota de mejora?&lt;/h2&gt;
&lt;p&gt;Una nota de mejora describe un cambio que el lector notará, y le pone una cifra medida cuando existe. Sin cifra, di qué ya no tiene que hacer el lector.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;La lista de facturas carga unas tres veces más rápido.&lt;/strong&gt;
Las cuentas con más de 5.000 facturas esperaban unos nueve segundos para ver la lista. Ahora se
abre en unos tres. No requiere ninguna acción.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;quot;Mejoras de rendimiento&amp;quot; no le dice nada al lector, mientras que nueve segundos frente a tres es una afirmación que puede comprobar el lunes por la mañana. El cierre &amp;quot;No requiere ninguna acción&amp;quot; responde a la pregunta que se hace todo lector.&lt;/p&gt;
&lt;h2&gt;¿Cómo es una buena nota de corrección de error?&lt;/h2&gt;
&lt;p&gt;Una nota de corrección describe el síntoma que vio el usuario, no la causa en el código, y dice si tiene que rehacer algo. Las correcciones que nadie notó pueden ir en la lista del final.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Corregido: correos de recordatorio enviados dos veces el día del vencimiento.&lt;/strong&gt;
Algunos clientes recibieron dos recordatorios idénticos si su factura vencía el último día de un
mes. Ya está corregido. Los recordatorios ya enviados no se ven afectados, y nadie necesita reenviar
nada.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;El titular empieza por &amp;quot;Corregido&amp;quot; para que quien ojea pueda clasificarlo de un vistazo, y la condición real (el último día del mes) viene enseguida.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escriben las notas de versión de un cambio incompatible?&lt;/h2&gt;
&lt;p&gt;La nota de un cambio incompatible empieza con la fecha y el grupo afectado, y luego da la migración en la misma entrada. Va primero en las notas de versión, porque es la única entrada que el lector no puede perderse.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Las firmas de webhook serán obligatorias el 1 de diciembre de 2026.&lt;/strong&gt;
A partir de esa fecha, Tidepool dejará de enviar payloads de webhook sin firmar. Afecta a quien reciba
webhooks sin comprobar el encabezado &lt;code&gt;Tidepool-Signature&lt;/code&gt;. Para migrar, verifica el encabezado con
el secreto que está en Ajustes, Desarrolladores. Si ya verificas las firmas, no requiere ninguna
acción.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La fecha está en el titular, así que sobrevive a una lectura rápida. El grupo afectado se nombra por lo que hace, y la última frase libera a quienes ya están bien, lo que reduce la carga de soporte. La guía sobre &lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;breaking changes&lt;/a&gt; explica cómo decidir si un cambio cuenta.&lt;/p&gt;
&lt;h2&gt;¿Cómo es una nota de corrección de seguridad?&lt;/h2&gt;
&lt;p&gt;Una nota de seguridad dice qué estuvo expuesto, si alguien lo explotó, a quién afecta y qué deben hacer. Mantenla factual y tranquila.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Seguridad: los enlaces de restablecimiento de contraseña podían reutilizarse.&lt;/strong&gt;
Entre el 3 y el 17 de septiembre de 2026, un enlace de restablecimiento de contraseña seguía siendo
válido después de usarse una vez. No encontramos señales de que se explotara. Ya está corregido, y
todos los enlaces de restablecimiento pendientes se han invalidado. Si pediste un restablecimiento
en ese periodo, solicita un enlace nuevo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La ventana exacta permite al lector juzgar su propia exposición, y la frase sobre la explotación responde la primera pregunta que todos hacen. &amp;quot;Un posible problema&amp;quot; suena a encubrimiento, así que di lo que sabes.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe un aviso de deprecación?&lt;/h2&gt;
&lt;p&gt;Un aviso de deprecación nombra lo que se retira, da una fecha final firme y señala el reemplazo.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;El endpoint v1 de facturas queda deprecado y termina el 1 de marzo de 2027.&lt;/strong&gt;
&lt;code&gt;GET /v1/invoices&lt;/code&gt; sigue funcionando hasta el 1 de marzo de 2027, y después devuelve &lt;code&gt;410 Gone&lt;/code&gt;.
Usa &lt;code&gt;GET /v2/invoices&lt;/code&gt;, que devuelve los mismos campos más &lt;code&gt;currency&lt;/code&gt;. Las respuestas de v1 ahora
incluyen un encabezado &lt;code&gt;Sunset&lt;/code&gt; con la fecha final. Hay una guía de migración lado a lado en la
documentación.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;El nombre del endpoint está en el titular, porque los afectados lo buscan, y el reemplazo queda junto a la retirada. El encabezado &lt;code&gt;Sunset&lt;/code&gt; indica a los desarrolladores qué llamadas siguen usando la versión antigua. El tratamiento más largo está en &lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;deprecar una API&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cómo es una nota de versión para una tienda de apps?&lt;/h2&gt;
&lt;p&gt;Una nota de tienda son dos o tres frases sencillas, porque la mayoría solo lee la primera línea. Empieza con el cambio que un usuario notaría.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Escanea un recibo en papel y Tidepool rellena el importe, la fecha y el proveedor. El modo oscuro
ahora sigue el ajuste de tu teléfono. También corregimos un cierre inesperado al abrir una factura
desde una notificación.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;El cambio más útil va primero, y la corrección nombra la situación que fallaba. No hay número de versión ni &amp;quot;corrección de errores y mejoras&amp;quot;. &lt;a href=&quot;https://changeloop.dev/blog/es/mobile-app-release-notes/&quot;&gt;Notas de versión para apps móviles&lt;/a&gt; cubre las reglas propias de cada tienda.&lt;/p&gt;
&lt;h2&gt;¿Qué debe incluir una nota de versión interna?&lt;/h2&gt;
&lt;p&gt;Una nota interna es la versión para soporte y ventas. Añade lo que la nota pública omite: qué decir y qué evitar prometer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Las facturas multilingües se publicaron hoy (todos los planes).&lt;/strong&gt;
Soporte: los clientes configuran el idioma en Preferencias de facturación, y las facturas existentes
conservan su idioma original. El italiano aún no está disponible. Ventas: está abierto a todos los
planes, así que no lo presentéis como una mejora de plan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cada audiencia tiene su propia línea etiquetada, y la nota marca el límite (&amp;quot;El italiano aún no está disponible&amp;quot;) antes de que un cliente pregunte. El artículo sobre &lt;a href=&quot;https://changeloop.dev/blog/es/internal-release-notes/&quot;&gt;notas de release internas&lt;/a&gt; cubre el formato y los canales.&lt;/p&gt;
&lt;h2&gt;¿Cómo es una mala nota de versión, reescrita?&lt;/h2&gt;
&lt;p&gt;Una mala nota lista lo que hizo el equipo en vez de lo que recibe el lector. Se arregla poniendo el resultado al frente y eliminando el vocabulario interno.&lt;/p&gt;
&lt;p&gt;Antes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;v3.8.1&lt;/strong&gt; Se refactorizó el planificador de recordatorios. Se corrigió una condición de carrera en
&lt;code&gt;ReminderJob&lt;/code&gt;. Se actualizó &lt;code&gt;bull&lt;/code&gt; a 4.12. Mejoras varias.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Después:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Los correos de recordatorio ya no salen dos veces.&lt;/strong&gt;
Los clientes con una factura que vencía el último día de un mes podían recibir dos recordatorios.
Eso está corregido, y los recordatorios ya enviados no hace falta reenviarlos. No requiere ninguna
acción.&lt;/p&gt;
&lt;p&gt;También en 3.8.1: &lt;code&gt;bull&lt;/code&gt; actualizado a 4.12.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La subida de dependencia pasó a una línea del pie, y la condición de carrera se convirtió en un síntoma que un cliente reconocería.&lt;/p&gt;
&lt;h2&gt;¿Cómo mantienes la coherencia de las notas de versión entre lanzamientos?&lt;/h2&gt;
&lt;p&gt;Redacta cada entrada cuando el cambio se fusiona, y haz que una persona la apruebe antes de publicarla.&lt;/p&gt;
&lt;p&gt;Changeloop funciona así: redacta una entrada a partir de cada pull request fusionado con IA y la retiene hasta que una persona la apruebe. El paso de aprobación es donde un editor aplica las reglas de arriba. Para fijar primero el formato, parte de la &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;plantilla de notas de versión&lt;/a&gt;, y mira los &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;ejemplos de changelog&lt;/a&gt; para ver cómo son las páginas terminadas.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Qué son las notas de versión nuevas?&lt;/strong&gt;
Las notas de versión nuevas son el mensaje que se publica con el último lanzamiento de un producto, y describen qué cambió y qué deben hacer los usuarios. Cubren funciones, mejoras, correcciones y cambios incompatibles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la diferencia entre una nota de versión y un changelog?&lt;/strong&gt;
El changelog lo guarda todo, para quien quiera el historial entero. Una nota de versión elige de ahí: un lanzamiento, escrito para los lectores que deciden si les importa. La comparación completa está en &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-vs-release-notes/&quot;&gt;changelog vs. notas de versión&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué significa notas de versión?&lt;/strong&gt;
Las notas de versión cuentan a los usuarios qué cambió en un lanzamiento. La expresión abarca cualquier texto que explique qué se entregó, desde el texto de &amp;quot;Novedades&amp;quot; de una tienda de apps hasta una página en el sitio web de una empresa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuánto debe durar cada entrada de las notas de versión?&lt;/strong&gt;
De dos a cuatro frases bastan para la mayoría de las entradas: el resultado, a quién afecta y qué hacer. Un cambio incompatible o una corrección de seguridad pueden ser más largos porque necesitan una fecha o una migración.&lt;/p&gt;
</content:encoded></item><item><title>Versionado de la API de Stripe: cómo funciona y qué copiar</title><link>https://changeloop.dev/blog/es/stripe-api-versioning/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/stripe-api-versioning/</guid><description>Stripe fija cada cuenta a una versión con fecha y deja que cualquier petición la sustituya. Cómo funciona, qué cuesta y qué puede copiar una API pequeña.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;El versionado de la API de Stripe funciona por fechas. Cada cuenta está fijada a una versión de la API que lleva el nombre de una fecha de lanzamiento, y cualquier petición individual puede sustituir esa fijación con un encabezado &lt;code&gt;Stripe-Version&lt;/code&gt;. En el momento de escribir esto (octubre de 2026), la versión actual en la documentación de Stripe es &lt;code&gt;2026-09-30.endive&lt;/code&gt;, y el mismo esquema es algo que una API mucho más pequeña puede copiar en un fin de semana.&lt;/p&gt;
&lt;p&gt;Cada dato sobre Stripe de abajo procede de las propias páginas de Stripe, enlazadas donde se usa.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mecanismo&lt;/th&gt;
&lt;th&gt;Qué hace Stripe&lt;/th&gt;
&lt;th&gt;Fuente&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Nombre de versión&lt;/td&gt;
&lt;td&gt;Una fecha, más un nombre de lanzamiento desde 2024 (&lt;code&gt;2026-09-30.endive&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versión por defecto&lt;/td&gt;
&lt;td&gt;Fijada en la cuenta, se cambia en Workbench&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sustitución por petición&lt;/td&gt;
&lt;td&gt;Encabezado &lt;code&gt;Stripe-Version&lt;/code&gt;, o la opción del SDK&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;Upgrades&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhooks&lt;/td&gt;
&lt;td&gt;Se generan en la versión fijada en el endpoint&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;Upgrades&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cadencia&lt;/td&gt;
&lt;td&gt;Lanzamientos mensuales sin cambios incompatibles, un lanzamiento mayor dos veces al año&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versiones antiguas&lt;/td&gt;
&lt;td&gt;Siguen funcionando mediante módulos internos de cambio de versión&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stripe.com/blog/api-versioning&quot;&gt;Engineering post&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cómo funciona el versionado de la API de Stripe?&lt;/h2&gt;
&lt;p&gt;Stripe da a cada cuenta una versión de API por defecto, y toda petición que no nombra una versión usa esa. Quien llama decide cuándo pasar a otra, cambiando la versión por defecto o fijando una versión en peticiones individuales.&lt;/p&gt;
&lt;p&gt;La publicación de ingeniería de Stripe dice que la cuenta queda fijada la primera vez que hace una petición a la API: se &amp;quot;fija automáticamente a la versión más reciente disponible&amp;quot;, y desde entonces cada llamada recibe esa versión de forma implícita.&lt;/p&gt;
&lt;p&gt;La cadena de versión es una fecha. Desde el lanzamiento &lt;code&gt;2024-09-30.acacia&lt;/code&gt; lleva además un nombre, como en &lt;code&gt;2026-09-30.endive&lt;/code&gt;. La fecha ordena las versiones, y el nombre indica a qué familia de lanzamiento mayor pertenece una versión.&lt;/p&gt;
&lt;h2&gt;¿Cómo eliges la versión en cada petición?&lt;/h2&gt;
&lt;p&gt;Envía el encabezado &lt;code&gt;Stripe-Version&lt;/code&gt; en la petición, o fija la versión en el SDK. La guía de actualización de Stripe muestra la forma con encabezado, y la misma llamada funciona en entornos reales y de prueba.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;curl https://api.stripe.com/v1/charges \
  -u &amp;quot;$STRIPE_SECRET_KEY:&amp;quot; \
  -H &amp;quot;Stripe-Version: 2026-09-30.endive&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La guía de Stripe señala que, cuando fijas la versión de forma global o por petición en un SDK, los objetos de respuesta llegan en esa versión.&lt;/p&gt;
&lt;p&gt;Stripe también desaconseja apoyarse en la versión por defecto de la cuenta. En sus palabras, especifica la versión en cada petición, con el encabezado o con un SDK fijado, para que sea tu código quien decide la versión y no un ajuste del panel.&lt;/p&gt;
&lt;p&gt;Los SDK fijan la versión de manera distinta según el lenguaje. La documentación dice que las versiones recientes de las bibliotecas de tipado dinámico usan la versión de API que era la última cuando salió esa versión del SDK, y las de tipado fuerte (Java, Go y .NET) quedan fijadas a ella. Instalar una versión de la biblioteca es, en la práctica, elegir una versión de la API.&lt;/p&gt;
&lt;h2&gt;¿Qué pasa con los webhooks cuando cambia la versión?&lt;/h2&gt;
&lt;p&gt;Un evento de webhook se genera en la versión de API asociada a su endpoint, no en la versión que usa el código de tu servidor. La documentación de Stripe dice que los eventos usan la versión fijada al crear el endpoint y, si no, la versión por defecto de la cuenta. Cambiar la versión de tu SDK no cambia lo que recibe tu manejador de webhooks.&lt;/p&gt;
&lt;p&gt;Por eso tu camino de peticiones y tu camino de eventos pueden estar en dos versiones distintas. En los destinos de eventos, &lt;code&gt;snapshot_api_version&lt;/code&gt; solo se fija al crear el destino, así que otra versión significa un destino nuevo.&lt;/p&gt;
&lt;p&gt;El camino de actualización de Stripe para esto es una ejecución en paralelo. Crea un endpoint nuevo en la versión de destino, envía los mismos eventos a ambos, enseña al manejador a procesar uno e ignorar el otro, cambia y desactiva el endpoint antiguo. Como cada evento llega dos veces durante el solapamiento, el manejador tiene que ser idempotente. Es un buen patrón para copiar en cualquier API que emita eventos, y &lt;a href=&quot;https://changeloop.dev/blog/es/webhook-changelog/&quot;&gt;un changelog de webhooks&lt;/a&gt; es donde anuncias los cambios de payload que lo hacen necesario.&lt;/p&gt;
&lt;h2&gt;¿Qué son los lanzamientos mensuales y los mayores?&lt;/h2&gt;
&lt;p&gt;Desde el lanzamiento &lt;code&gt;2024-09-30.acacia&lt;/code&gt;, Stripe publica una versión nueva de la API cada mes sin cambios incompatibles, y emite un lanzamiento mayor dos veces al año que empieza con una versión que contiene cambios incompatibles. Su página de versionado dice que puedes pasar a cualquier lanzamiento mensual sin actualizar tu código, mientras que un lanzamiento mayor puede exigir cambios.&lt;/p&gt;
&lt;p&gt;Los lanzamientos mayores llevan nombre. La página de versionado da Basil como ejemplo, y el anuncio del proceso por parte de Stripe dice que los nombres proceden de plantas, empezando por Acacia, y que los lanzamientos mensuales conservan el nombre del lanzamiento mayor anterior para señalar que es seguro actualizar a ellos. El &lt;a href=&quot;https://docs.stripe.com/changelog&quot;&gt;changelog&lt;/a&gt; de Stripe lista los nombres en uso, y en el momento de escribir esto la entrada más reciente es &lt;code&gt;2026-09-30.endive&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Así, la fecha responde a &amp;quot;qué tan nueva&amp;quot; y el nombre responde a &amp;quot;si es un límite con cambios incompatibles&amp;quot;. El anuncio de Stripe también deja espacio para excepciones: se reserva el derecho de publicar un cambio incompatible fuera de ciclo cuando una integración se vería gravemente afectada sin él. El anuncio está en &lt;a href=&quot;https://stripe.com/blog/introducing-stripes-new-api-release-process&quot;&gt;Stripe&amp;#39;s new API release process&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cuál es la última versión de la API de Stripe?&lt;/h2&gt;
&lt;p&gt;En el momento de escribir esto (octubre de 2026), la página de versionado de Stripe indica que la versión actual es &lt;code&gt;2026-09-30.endive&lt;/code&gt;, y su changelog lista la misma versión como la más reciente. Stripe publica una versión nueva cada mes, así que cualquier cadena impresa en un artículo envejece rápido. Lee el changelog en vivo antes de fijar nada, y fija la versión contra la que hiciste las pruebas.&lt;/p&gt;
&lt;h2&gt;¿Cómo mantiene Stripe funcionando las versiones antiguas?&lt;/h2&gt;
&lt;p&gt;Stripe mantiene vivas las versiones antiguas escribiendo cada cambio incompatible como un módulo de cambio de versión autocontenido y aplicando los módulos hacia atrás desde la forma más reciente de los datos. Su &lt;a href=&quot;https://stripe.com/blog/api-versioning&quot;&gt;publicación de ingeniería sobre el versionado de la API&lt;/a&gt; describe el mecanismo.&lt;/p&gt;
&lt;p&gt;Cada módulo declara qué cambia, documenta el cambio e incluye una función de transformación. La publicación da el ejemplo de un campo que pasa de cadena a hash. Para construir una respuesta, el sistema determina la versión de destino, retrocede en el tiempo y aplica cada módulo que encuentra por el camino hasta llegar a esa versión.&lt;/p&gt;
&lt;p&gt;De ese diseño se siguen dos efectos secundarios, y la publicación nombra ambos. Como los módulos declaran los campos y recursos que tocan, Stripe puede generar su changelog de la API a partir de ellos al desplegar. Y como se conoce la versión de la cuenta, la documentación puede adaptarse a ella y avisar de los cambios incompatibles desde esa versión.&lt;/p&gt;
&lt;h2&gt;¿Cuánto cuesta, y qué debería copiar una API más pequeña?&lt;/h2&gt;
&lt;p&gt;El versionado cuesta atención de ingeniería, y Stripe lo dice. La publicación de ingeniería reconoce una carga de mantenimiento y plantea el objetivo de que cuanto menos haya que pensar en el comportamiento antiguo al escribir código nuevo, mejor. También describe revisiones ligeras de la API antes del lanzamiento, para evitar tener que cambiar de versión.&lt;/p&gt;
&lt;p&gt;Una API pequeña no puede permitirse una cadena de módulos para cada versión antigua, y no la necesita. Copia las partes que aportan el valor:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Versiones con fecha.&lt;/strong&gt; Una fecha no exige juzgar qué cuenta como &amp;quot;mayor&amp;quot;, y quien llama puede leerla. El artículo de &lt;a href=&quot;https://changeloop.dev/blog/es/api-versioning-best-practices/&quot;&gt;buenas prácticas de versionado&lt;/a&gt; lo compara con los esquemas por URL y por encabezado.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una versión por defecto fijada.&lt;/strong&gt; Fija la cuenta o la clave a la versión del primer uso, para que la API nunca se mueva bajo una integración que funciona.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una sustitución por petición.&lt;/strong&gt; Un encabezado que permita a quien llama probar una versión nueva en una sola llamada, en producción, antes de comprometerse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una versión en el endpoint del webhook.&lt;/strong&gt; Los payloads de eventos son donde más se sorprende a quien llama.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una entrada de changelog por versión.&lt;/strong&gt; Haz que nombre la versión, la fecha, a quién afecta y qué hacer. &lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;Qué cuenta como incompatible&lt;/a&gt; es la prueba de qué merece entrar en una versión nueva, y el artículo sobre el &lt;a href=&quot;https://changeloop.dev/blog/es/api-changelog/&quot;&gt;changelog de API&lt;/a&gt; cubre la propia entrada.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sáltate la cadena de módulos hasta que el número de versiones soportadas te obligue. Dos o tres versiones vivas se pueden manejar con unas pocas ramas y una fecha de sunset, algo que &lt;a href=&quot;https://changeloop.dev/blog/es/sunsetting-api-version/&quot;&gt;retirar una versión de API&lt;/a&gt; recorre paso a paso.&lt;/p&gt;
&lt;p&gt;Si publicas un changelog con fechas, el historial de versiones vale lo que valgan sus entradas. En &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Changeloop&lt;/a&gt;, se crea una entrada en borrador a partir de cada pull request fusionado y se retiene hasta que una persona la apruebe antes de publicarla en la página de changelog y en el feed. Ahí es donde se escribe la entrada de cada versión, y la única puerta humana es la revisión que dice qué debe hacer quien llama.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la última versión de la API de Stripe?&lt;/strong&gt;
En el momento de escribir esto (octubre de 2026), la página de versionado de Stripe indica que la versión actual es &lt;code&gt;2026-09-30.endive&lt;/code&gt;. Stripe emite una versión nueva cada mes, así que consulta su changelog antes de fijarla, y escribe la versión en tu código en lugar de depender de la versión por defecto de la cuenta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo fijo la versión de la API de Stripe en una petición?&lt;/strong&gt;
Envía el encabezado &lt;code&gt;Stripe-Version&lt;/code&gt;, por ejemplo &lt;code&gt;Stripe-Version: 2026-09-30.endive&lt;/code&gt;, o fija la versión en tu SDK del lado del servidor, de forma global o por petición. Sin ninguno de los dos, la petición usa la versión por defecto de tu cuenta, que tú fijas en Workbench.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Los webhooks usan la misma versión de la API de Stripe que mis peticiones?&lt;/strong&gt;
No necesariamente. Los eventos de webhook usan la versión fijada al crear el endpoint, y la versión por defecto de la cuenta si no se fijó ninguna. Actualizar tu SDK no cambia el payload que recibe tu manejador de webhooks, así que actualiza los endpoints por separado y pruébalos en paralelo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿El versionado por fechas al estilo Stripe es adecuado para una API pequeña?&lt;/strong&gt;
Las versiones con fecha, una versión por defecto fijada, un encabezado por petición y una entrada de changelog por versión son baratos y vale la pena copiarlos. La cadena interna de módulos de cambio de versión no lo es, hasta que soportes muchas versiones antiguas a la vez. Empieza con dos versiones vivas y una fecha de sunset para la más antigua.&lt;/p&gt;
</content:encoded></item><item><title>Quién escribe el changelog, y quién debería</title><link>https://changeloop.dev/blog/es/changelog-entry-ownership/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/changelog-entry-ownership/</guid><description>¿Quién escribe el changelog? Quien abre el PR sabe qué cambió; la PM, por qué importa. Ninguna sola escribe una entrada útil, y elegir una lo deja viejo.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Pregúntale a un equipo quién escribe el changelog y la respuesta honesta suele ser &amp;quot;quien se
acuerde&amp;quot;, que es el mismo modo de fallo que &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-ci-enforcement/&quot;&gt;exigir una entrada de changelog en CI&lt;/a&gt;
existe para arreglar a nivel mecánico. Pero forzar que una entrada exista no decide quién está
cualificada para escribir una buena, y los equipos que se saltan esa pregunta tienden a recurrir
por defecto a quien sea más fácil de obligar, normalmente quien abrió el PR, sin comprobar si esa
es realmente la persona que puede escribirla bien.&lt;/p&gt;
&lt;h2&gt;¿Por qué quien abre el PR no es automáticamente quien mejor escribe el changelog?&lt;/h2&gt;
&lt;p&gt;Porque conoce la implementación, no necesariamente el impacto, y son dos tipos de conocimiento
distintos. &lt;a href=&quot;https://changeloop.dev/blog/es/conventional-commits-changelog/&quot;&gt;Dónde se detienen los conventional commits&lt;/a&gt;
cubre esta brecha desde el lado del mensaje de commit: &lt;code&gt;fix(auth): reject expired refresh tokens&lt;/code&gt;
es correcto e inútil para una clienta, y quien escribió ese arreglo suele ser la persona menos
preparada para traducirlo, porque ha estado pensando en términos del bug durante horas y ha
perdido la vista externa de lo que una usuaria realmente experimentó. Esta es la misma razón por la que existen las escritoras técnicas como profesión: traducir la
implementación en impacto es una habilidad distinta de haber construido la cosa, y requiere
práctica sin importar lo buena que sea la desarrolladora en el propio código.&lt;/p&gt;
&lt;h2&gt;¿Eso significa que producto o soporte deberían escribir cada entrada en su lugar?&lt;/h2&gt;
&lt;p&gt;No, porque tienen la brecha opuesta: saben qué le importa a las usuarias pero no siempre qué se
lanzó realmente, lo que produce entradas legibles pero ocasionalmente equivocadas en alcance, una
afirmación de &amp;quot;ahora soporta X&amp;quot; para una función que sigue detrás de un flag, o un arreglo descrito
como completo cuando solo cubre uno de tres casos. El modo de fallo de las entradas escritas por
desarrolladoras es ilegible-pero-preciso; el modo de fallo de las entradas escritas por PMs es
legible-pero-sin-verificar. Ningún rol es dueño de las dos mitades de lo que necesita una buena
entrada.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rol&lt;/th&gt;
&lt;th&gt;Suele acertar en&lt;/th&gt;
&lt;th&gt;Suele fallar en&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Desarrolladora que escribió el código&lt;/td&gt;
&lt;td&gt;Alcance exacto de lo que cambió&lt;/td&gt;
&lt;td&gt;Enmarcarlo para alguien que no lo construyó&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PM o responsable de soporte&lt;/td&gt;
&lt;td&gt;Por qué le importa a la usuaria&lt;/td&gt;
&lt;td&gt;Límites precisos de lo que realmente se lanzó&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dueña dedicada del changelog&lt;/td&gt;
&lt;td&gt;Voz consistente, contrasta el alcance&lt;/td&gt;
&lt;td&gt;Necesita a las dos de arriba para contrastar con&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cómo es realmente un modelo de propiedad que funciona?&lt;/h2&gt;
&lt;p&gt;Un borrador de quien esté más cerca del cambio, revisado por quien esté más cerca de la usuaria,
con una persona nombrada responsable de la redacción final en vez de que todas asuman que alguien
más atrapará los problemas. El borrador necesita existir y ser preciso más de lo que necesita ser bueno; una
frase tosca escrita por una desarrolladora que diga correctamente qué cambió es un mejor punto de
partida que una pulida pero sin verificar, porque reescribir por claridad es más fácil que
reescribir por corrección. El paso de revisión es donde una PM o responsable de soporte lee el
borrador y hace la única pregunta que atrapa la brecha de legibilidad: entendería esto si no
hubiera visto el código.&lt;/p&gt;
&lt;h2&gt;¿Debería ser siempre la misma persona la responsable, o rota?&lt;/h2&gt;
&lt;p&gt;Nombrada y estable gana a rotativa, al menos para la aprobación final. Una responsable rotativa
significa que cada entrada la revisa alguien que re-deriva las convenciones del equipo desde cero,
que es exactamente cómo la voz se desvía entrada tras entrada y una lectora empieza a notar que el
changelog lo escribió un comité. Una sola persona, o un grupo estable muy pequeño, acumula los
criterios con el tiempo, cuándo decir &amp;quot;mejorado&amp;quot; frente a nombrar la cifra específica, cuándo un
arreglo necesita su propia entrada frente a plegarse en un lote, y ese criterio vale más que
distribuir el trabajo por igual.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Borrador (desarrolladora, del PR):
&amp;quot;Fixed pagination cursor not respecting the `sort` param
in some edge cases.&amp;quot;

Revisado (dueña del changelog, contrastado con el PR real):
&amp;quot;Corregido: las exportaciones ordenadas por fecha podían
devolver resultados fuera de orden más allá de la primera
página. Ahora consistente en todas las páginas.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Un equipo pequeño necesita tanto proceso para una línea de texto?&lt;/h2&gt;
&lt;p&gt;No los roles como personas separadas, pero los dos pasos siguen importando incluso en solitario.
Un equipo de una persona es a la vez la desarrolladora y la revisora, y la disciplina que
sobrevive a esa escala es hacer la revisión como un pase mental separado, no saltar directamente
de escribir el arreglo a publicar una descripción de él en el mismo aliento. La trampa a pequeña
escala es saltarse el segundo pase por completo, no la falta de una segunda persona, porque nadie
externo lo obliga, y la brecha de precisión que ese pase existe para atrapar no desaparece solo
porque la misma persona pudiera en teoría notar su propio punto ciego.&lt;/p&gt;
&lt;h2&gt;¿Qué pasa cuando nadie es responsable de la entrada final?&lt;/h2&gt;
&lt;p&gt;El changelog se degrada de forma desigual en vez de fallar del todo, lo cual es peor porque nadie
lo nota hasta que una lectora lo señala. Algunas entradas se mantienen precisas porque a quien las
escribió le importó; otras se vuelven vagas, &amp;quot;varias mejoras y correcciones de errores&amp;quot;, porque
quien las escribió iba rápido y nadie lo detectó antes de publicar. Las restricciones de formato de
&lt;a href=&quot;https://changeloop.dev/blog/es/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt; atrapan la deriva estructural, fechas
faltantes, categorías equivocadas, pero nada en una plantilla atrapa una entrada vaga que está
técnicamente bien formateada, que es exactamente la brecha que una dueña nombrada está ahí para
cerrar.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿La dueña del changelog debería ser un rol de ingeniería o de producto?&lt;/strong&gt;
Cualquiera puede funcionar si la persona tiene tanto fluidez técnica para verificar el alcance
como suficiente distancia de la implementación para escribir para una lectora externa; el título
importa menos que si puede hacer las dos mitades, o sabe a quién preguntarle por la mitad que no
puede.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Alguna vez es apropiado un horario rotativo tipo guardia para la propiedad del changelog?&lt;/strong&gt;
Para volumen, a veces, si el equipo es demasiado pequeño para que una persona lo revise todo; para
voz y criterio, no, porque eso es exactamente lo que erosiona la rotación. Una rotación que
comparte la carga de redacción mientras mantiene una revisora estable obtiene el beneficio sin la
deriva.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la señal más rápida de que algo va mal con la configuración actual de propiedad?&lt;/strong&gt;
Entradas que son precisas pero ilegibles, o legibles pero equivocadas en alcance, en un patrón que
sigue a quién las escribió. Si la calidad correlaciona con la autora en vez de mantenerse
consistente, la propiedad es la brecha, no la habilidad de escribir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿La automatización reduce cuánto importa la propiedad?&lt;/strong&gt;
Reduce cuánta escritura hace falta, no cuánto criterio hace falta. &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-automation/&quot;&gt;Automatización de
changelog&lt;/a&gt; cubre lo que un pipeline puede generar con seguridad,
formateo, publicación, cross-posting; la redacción, la agrupación y qué cuenta como digno de
mención siguen siendo decisiones humanas sin importar cuánto del pipeline esté automatizado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué pasa si quien abrió el PR y quien revisa no están de acuerdo con la redacción?&lt;/strong&gt;
Decide quien revisa, porque la pregunta que responde, entendería esto una lectora externa, es la
que ese rol existe para proteger. Eso no vuelve inútil la lectura de la desarrolladora: si el
desacuerdo es sobre precisión en vez de redacción, quien revisa cede, porque el alcance es la mitad
que le toca acertar a quien escribió el código. Separar los dos tipos de desacuerdo, redacción
frente a precisión, evita que la mayoría de estos casos se conviertan en un punto muerto.&lt;/p&gt;
</content:encoded></item><item><title>Notas de versión de emergencia: escribir bajo presión real</title><link>https://changeloop.dev/blog/es/emergency-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/emergency-release-notes/</guid><description>Un lanzamiento impulsado por un incidente necesita notas escritas en minutos, no días, y el proceso habitual de redacción asume tiempo que no tienes.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;La mayoría de las notas de versión se escriben después de que el código está listo, se revisan con
calma y se publican en un calendario que no tiene nada que ver con la urgencia con la que alguien
necesita leerlas. Un lanzamiento de emergencia, un parche de seguridad, un bug de pérdida de
datos, la corrección de una caída, invierte todas esas condiciones a la vez: las notas necesitan
existir antes de que la mayoría de la gente normalmente empezaría a escribirlas, apenas reciben
revisión, y las lee gente que está preocupada en vez de tranquila. &lt;a href=&quot;https://changeloop.dev/blog/es/how-to-write-release-notes/&quot;&gt;Cómo escribir notas de
versión&lt;/a&gt; cubre el proceso normal; esto es sobre lo que
cambia cuando no queda tiempo para seguirlo.&lt;/p&gt;
&lt;h2&gt;¿Cuál es la única cosa que una nota de emergencia tiene que acertar si no acierta nada más?&lt;/h2&gt;
&lt;p&gt;Si la lectora necesita hacer algo, dicho en la primera frase, sin ningún marco antes. Una lectora
que llega a una nota de versión impulsada por un incidente a menudo ya está preocupada, por haberse
enterado del problema por una página de estado, un hilo de soporte, o sus propias usuarias, y una
nota que empieza con contexto antes del elemento de acción se lee como retención de información
justo en las circunstancias donde retener se lee peor. &amp;quot;No se necesita ninguna acción, esto parchea
una vulnerabilidad que no requería datos de usuario para explotarse&amp;quot; y &amp;quot;Actualiza inmediatamente:
este lanzamiento corrige un bug que podía mostrar los datos de una cuenta a otra&amp;quot; son ambas una
frase, y las dos hacen todo el trabajo que una lectora en pánico necesita antes de leer cualquier
otra cosa.&lt;/p&gt;
&lt;h2&gt;¿Sigue aplicando el pase de edición habitual cuando no hay tiempo para uno?&lt;/h2&gt;
&lt;p&gt;El instinto de comprimir sobrevive incluso cuando el proceso de múltiples borradores que
normalmente lo produce no lo hace. &lt;a href=&quot;https://changeloop.dev/blog/es/how-to-write-release-notes/&quot;&gt;La reescritura&lt;/a&gt; describe
recortar un primer borrador verboso hasta su frase esencial; bajo presión de tiempo a menudo no
hay un primer borrador que recortar, lo que significa que la disciplina tiene que correr en tu
cabeza mientras escribes en vez de como un pase separado después. La forma más rápida de
aproximarla: escribe la frase que dirías en voz alta a alguien que pregunta &amp;quot;qué necesito saber&amp;quot;,
luego para, porque esa frase suele ser tanto la más rápida de producir como la única que una
lectora en ese estado realmente procesará.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nota de versión normal&lt;/th&gt;
&lt;th&gt;Nota de versión de emergencia&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Escrita tras revisión de código, antes de publicar&lt;/td&gt;
&lt;td&gt;A menudo escrita junto con el arreglo, antes de revisión completa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimizada para escaneabilidad entre muchas entradas&lt;/td&gt;
&lt;td&gt;Optimizada para que una entrada se lea de forma aislada, bajo estrés&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Puede aplazar detalle a un changelog enlazado&lt;/td&gt;
&lt;td&gt;Debería anteponer el único hecho más importante&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;El marco y el contexto son bienvenidos&lt;/td&gt;
&lt;td&gt;El marco antes del elemento de acción se lee como demora&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Alguna vez está bien publicar una nota antes de estar del todo segura de qué causó el problema?&lt;/h2&gt;
&lt;p&gt;Sí, si la nota es honesta sobre esa incertidumbre en vez de dar a entender una confianza que no
tienes. &amp;quot;Hemos desplegado un arreglo para tasas de error elevadas en el checkout; todavía estamos
confirmando la causa raíz y actualizaremos esta nota&amp;quot; es defendible y compra tiempo correctamente;
una nota que afirma una causa específica que en realidad no has confirmado es el tipo de
suposición que se convierte en lo que la gente te cita después si resulta equivocada. La
disciplina que importa aquí no es la velocidad del diagnóstico, es nunca dejar que la confianza de
la nota exceda la confianza real del equipo, porque una afirmación técnica equivocada en una nota
de emergencia hace más daño a la confianza que una incógnita admitida.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Demasiado seguro, sin verificar:
&amp;quot;Corregido: una condición de carrera en el manejador
del webhook de pago causó cobros duplicados.&amp;quot;

Honesto bajo presión de tiempo:
&amp;quot;Corregido: a algunas clientas se les cobró dos veces
por un mismo pedido. Hemos detenido nuevas ocurrencias
y estamos reembolsando a las cuentas afectadas en 24
horas. Investigando la causa raíz.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Una nota de emergencia debería decir qué causó el problema, o solo que ya está arreglado?&lt;/h2&gt;
&lt;p&gt;Di qué está arreglado y qué debería hacer la lectora; guarda la causa raíz para un seguimiento una
vez que de verdad se sepa, no se adivine. Una lectora en medio de un incidente quiere exactamente
dos hechos, si esto está resuelto y si le afecta, y una explicación de causa raíz, incluso una
precisa, compite con esos dos hechos por atención en el peor momento posible para perderla. El
postmortem, publicado por separado una vez que la investigación termina, es donde pertenece la
causa raíz; mezclar los dos documentos bajo presión de tiempo produce una nota más lenta de
escribir y más lenta de leer, lo opuesto de lo que necesita una emergencia.&lt;/p&gt;
&lt;h2&gt;¿El problema de la actualización forzada de las apps móviles aplica aquí también?&lt;/h2&gt;
&lt;p&gt;El mismo principio, más comprimido. &lt;a href=&quot;https://changeloop.dev/blog/es/mobile-app-release-notes/&quot;&gt;Notas de versión para apps móviles&lt;/a&gt;
cubre las actualizaciones forzadas, donde la nota tiene que decir el motivo y la fecha límite antes
que nada porque la lectora ya está molesta por no tener opción; una nota de versión de emergencia
web suele ser opt-in para la lectora en el sentido de que ella elige si actuar sobre ella, pero el
mismo instinto de &amp;quot;declara la restricción primero&amp;quot; aplica, solo que por una razón distinta: no
molestia, urgencia.&lt;/p&gt;
&lt;h2&gt;¿Cómo evitas que una nota de emergencia se lea como una admisión de culpa cuando no debería?&lt;/h2&gt;
&lt;p&gt;Describe el arreglo y su efecto, no la culpa, y resiste el impulso de disculparte en exceso, lo
cual se lee como relleno para una lectora que quiere los dos hechos de arriba. &amp;quot;Encontramos y
corregimos un bug que afectaba a algunas exportaciones&amp;quot; dice lo que pasó sin asignarle drama;
&amp;quot;Lamentamos muchísimo este problema serio que afectó a nuestras valiosas clientas&amp;quot; retrasa la
información útil una frase entera para entregar un momento emocional que la lectora no pidió. Una
nota corta y factual no es fría, es respetuosa con el estado real de la lectora, que bajo presión
real es impaciencia, no necesidad de consuelo.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Una nota de versión de emergencia debería pasar por el mismo proceso de revisión que una normal?&lt;/strong&gt;
Uno más ligero, no ninguno: una sola revisora rápida comprobando que la nota no exagera certeza
vale los pocos minutos que cuesta, porque el riesgo de que una afirmación técnica sin revisar sea
errónea es más alto precisamente porque se escribió rápido.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Está bien publicar una nota de emergencia sin ningún enlace a más detalle?&lt;/strong&gt;
Solo brevemente. Una nota sin enlace funciona como lo primero que se publica; añade uno a una
página de estado o seguimiento en cuanto exista alguno de los dos, porque una lectora que quiere
más que la única frase que le diste necesita algún sitio adonde ir, aunque ese sitio diga &amp;quot;más
detalle pronto&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Alguna vez debería omitirse por completo una nota de emergencia, dejando que el arreglo se publique en silencio?&lt;/strong&gt;
Solo para problemas que ninguna lectora pudo haber notado ni haber sido afectada por ellos; si hay
alguna posibilidad de que una lectora experimentara el problema, la nota es lo que le dice que ya
terminó, y el silencio se lee como que el problema quizá todavía esté activo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuánto tiempo debería una nota de emergencia quedarse fijada o destacada después de resolverse el incidente?&lt;/strong&gt;
Hasta que se cierre la ventana de ansiedad inmediata, típicamente uno o dos días, luego puede
plegarse en el changelog normal como cualquier otra entrada; una nota que se queda fijada durante
semanas empieza a leerse como una preocupación sin resolver en vez de resuelta.&lt;/p&gt;
</content:encoded></item><item><title>Breaking changes de Protobuf: qué sobrevive en el wire</title><link>https://changeloop.dev/blog/es/grpc-protobuf-api-changes/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/grpc-protobuf-api-changes/</guid><description>Los breaking changes de Protobuf ocurren en el wire, no en la URL. Algunos cambios de campo en gRPC son gratis, otros rompen a cada cliente en silencio.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Una API REST cambia cuando cambia una forma JSON, y la mayor parte de esa forma es visible en la
respuesta que puedes leer en un navegador. Una API gRPC cambia cuando cambia un archivo &lt;code&gt;.proto&lt;/code&gt;,
y el formato binario de wire de Protocol Buffers tiene sus propias reglas sobre qué puede tolerar
un cliente que no tienen nada que ver con lo que dicen los nombres de los campos. Dos ediciones
que se ven igual de pequeñas en un diff, renumerar un campo frente a añadir uno, caen en lados
opuestos de una línea que &lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;breaking changes&lt;/a&gt; traza en general: una es
invisible para cada cliente existente, la otra los rompe a todos a la vez. Distinguir los breaking
changes de Protobuf de los cambios seguros significa leer las propias reglas del formato de wire,
no adivinar a partir de cómo se ve el cambio en un diff de &lt;code&gt;.proto&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;¿Por qué importa más la numeración de campos que el nombre de campo en Protobuf?&lt;/h2&gt;
&lt;p&gt;Porque el formato de wire codifica los campos por número, no por nombre. El código generado en
cada lenguaje lee y escribe esos números; el nombre de campo &lt;code&gt;email&lt;/code&gt; en tu archivo &lt;code&gt;.proto&lt;/code&gt; es una
comodidad para humanos que nunca toca los bytes binarios enviados por la red. Renombrar un campo,
&lt;code&gt;email&lt;/code&gt; a &lt;code&gt;email_address&lt;/code&gt;, es seguro en el wire binario mientras el número se mantenga
igual, lo cual sorprende a ingenieras acostumbradas a REST, donde una clave JSON renombrada es
exactamente el tipo de cambio que rompe a un cliente. La excepción es ese mismo caso de REST: los
&lt;a href=&quot;https://protobuf.dev/programming-guides/json/&quot;&gt;formatos ProtoJSON y de texto&lt;/a&gt; serializan el nombre,
así que un renombrado rompe el transcoding JSON (un grpc-gateway, por ejemplo), los archivos en
formato de texto y las field masks. Renumerar ese mismo campo, manteniendo el
nombre pero cambiando &lt;code&gt;1&lt;/code&gt; a &lt;code&gt;7&lt;/code&gt;, es exactamente lo contrario: invisible en una revisión de código
que solo muestra nombres, y corrompe cada mensaje que un cliente envía o recibe a partir de ese
punto.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cambio&lt;/th&gt;
&lt;th&gt;Seguro en el wire&lt;/th&gt;
&lt;th&gt;Por qué&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Renombrar un campo, mantener su número&lt;/td&gt;
&lt;td&gt;Binario sí, JSON y texto no&lt;/td&gt;
&lt;td&gt;La codificación binaria usa el número; ProtoJSON y el formato de texto usan el nombre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cambiar el número de un campo&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Cada mensaje existente ahora se lee como el campo equivocado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Añadir un campo nuevo con número nuevo&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Los clientes antiguos ignoran campos que no reconocen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eliminar un campo, reutilizar su número antiguo para otra cosa&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Los datos antiguos se decodifican en el campo nuevo equivocado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cambiar el tipo de un campo de forma incompatible (p. ej. &lt;code&gt;int32&lt;/code&gt; a &lt;code&gt;string&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;La codificación de wire difiere por tipo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué hace diferente eliminar un campo respecto a hacerlo en una respuesta JSON REST?&lt;/h2&gt;
&lt;p&gt;El número se vuelve radiactivo. La &lt;a href=&quot;https://protobuf.dev/programming-guides/proto3/&quot;&gt;propia guía de Protobuf&lt;/a&gt;
recomienda marcar el número de un campo eliminado como &lt;code&gt;reserved&lt;/code&gt; en vez de dejar que se reutilice, porque la reutilización es
donde ocurre el daño real: un cliente que todavía corre código generado del mes pasado envía un
mensaje usando el número antiguo del campo para el significado antiguo, y el servidor, que ahora
espera que ese número signifique otra cosa, malinterpreta los datos en silencio en vez de
rechazarlos de plano. REST no tiene una trampa equivalente, porque una clave JSON eliminada
simplemente deja de aparecer; no hay forma de que la petición de un cliente antiguo se
reinterprete calladamente como otra cosa. Un archivo &lt;code&gt;.proto&lt;/code&gt; con &lt;code&gt;reserved 4, 9, 12;&lt;/code&gt; al
principio de un mensaje es una cicatriz permanente, y ese es el punto: evita que el número se le
dé a un campo nuevo por parte de alguien que no conocía su historia.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-protobuf&quot;&gt;message Invoice {
  reserved 4; // era `legacy_customer_id`, eliminado el 2026-06-01
  reserved &amp;quot;legacy_customer_id&amp;quot;; // también el nombre, para JSON/texto
  string customer_id = 5;
  string status = 6;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Añadir un campo llega a necesitar una entrada de changelog?&lt;/h2&gt;
&lt;p&gt;Normalmente no una entrada de breaking change, pero a menudo sí una normal, porque &amp;quot;seguro en el
wire&amp;quot; e &amp;quot;invisible para una lectora a quien le importa&amp;quot; son afirmaciones distintas. Añadir un
campo a un mensaje de respuesta no cuesta nada estructuralmente, los clientes antiguos decodifican
el mensaje e ignoran el campo nuevo automáticamente. Pero quien construye una integración nueva
contra ese servicio no tiene forma de saber que el campo existe a menos que alguien se lo diga,
porque nada en un build exitoso o un test que pasa hace visible un campo opcional nuevo.
&lt;a href=&quot;https://changeloop.dev/blog/es/api-changelog/&quot;&gt;Changelog de API&lt;/a&gt; cubre en general qué debe una entrada aditiva a quien
la lee; la razón específica de gRPC para escribir una de todos modos es que no hay equivalente a
navegar una respuesta REST en un depurador para notar que apareció una clave nueva.&lt;/p&gt;
&lt;h2&gt;¿En qué se diferencia esto de lo que enfrentan quienes llaman a GraphQL?&lt;/h2&gt;
&lt;p&gt;Las reglas para las adiciones coinciden, pero la exposición es distinta. &lt;a href=&quot;https://changeloop.dev/blog/es/graphql-schema-deprecation/&quot;&gt;Deprecación de esquema en GraphQL&lt;/a&gt;
cubre un modelo donde un cliente solo recibe los campos que pide explícitamente, lo que hace que
los cambios aditivos sean esencialmente libres de riesgo y las eliminaciones el único peligro real.
Los clientes gRPC, en cambio, reciben lo que sea que el servidor envíe y decodifican todo contra su
propia copia compilada del esquema; la exposición de un cliente no está limitada por lo que pidió,
solo por lo que su código generado sabe leer. Esa diferencia importa para escribir changelogs: una
entrada de GraphQL puede razonablemente asumir que los clientes están protegidos de campos que no
pidieron, y una entrada de gRPC no puede asumir eso en absoluto.&lt;/p&gt;
&lt;h2&gt;¿Versionar un servicio gRPC funciona igual que &lt;code&gt;/v1/&lt;/code&gt;, &lt;code&gt;/v2/&lt;/code&gt; de REST?&lt;/h2&gt;
&lt;p&gt;El mecanismo es distinto aunque la intención sea la misma. &lt;a href=&quot;https://changeloop.dev/blog/es/api-versioning-best-practices/&quot;&gt;Qué son v1 y v2 en una API
REST&lt;/a&gt; cubre el versionado como rutas de URL paralelas que
sirven contratos distintos; los servicios gRPC típicamente versionan a través del nombre del
paquete en el propio archivo &lt;code&gt;.proto&lt;/code&gt;, &lt;code&gt;payments.v1.InvoiceService&lt;/code&gt; se convierte en
&lt;code&gt;payments.v2.InvoiceService&lt;/code&gt;, lo cual cambia el nombre de servicio totalmente cualificado que un
cliente marca en vez de un segmento de URL que pide. Ambos enfoques resuelven el mismo problema,
dejar que un contrato antiguo siga funcionando mientras existe uno nuevo, pero un equipo que viene
de REST a menudo busca un número de versión en el lugar equivocado y se pierde que la declaración
del paquete está haciendo ese trabajo.&lt;/p&gt;
&lt;h2&gt;¿Qué debería nombrar realmente una entrada de changelog de gRPC?&lt;/h2&gt;
&lt;p&gt;El mensaje, el número de campo y si es aditivo o una eliminación que requiere migración, en ese
orden de importancia para una lectora que decide si actuar. &amp;quot;Añadido &lt;code&gt;shipping_address&lt;/code&gt; (campo 8)
a &lt;code&gt;Order&lt;/code&gt;&amp;quot; le dice a quien integra todo lo necesario para actualizar código generado y empezar a
usarlo. &amp;quot;Reservado el campo 4 en &lt;code&gt;Invoice&lt;/code&gt;, &lt;code&gt;legacy_customer_id&lt;/code&gt; ya no existe&amp;quot; le dice que revise
si algo en su base de código todavía lee ese campo, algo que una nota al estilo REST &amp;quot;se eliminó un
campo de la respuesta&amp;quot; no comunica con la misma urgencia, porque las eliminaciones REST solo
devuelven menos datos mientras la reutilización de campos de Protobuf los corrompe activamente.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Se puede cambiar el tipo de un campo alguna vez sin romper el formato de wire?&lt;/strong&gt;
Solo dentro de grupos compatibles específicos que documenta Protobuf, como ampliar &lt;code&gt;int32&lt;/code&gt; a
&lt;code&gt;int64&lt;/code&gt; en algunos casos. Trata cualquier cambio de tipo como rompedor a menos que lo hayas
comprobado contra la propia tabla de compatibilidad de Protobuf; asumir compatibilidad por
analogía con el sistema de tipos de un lenguaje es cómo esto sale mal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deprecar un campo en Protobuf funciona como la directiva &lt;code&gt;@deprecated&lt;/code&gt; de GraphQL?&lt;/strong&gt;
De forma parecida: Protobuf soporta una opción de campo &lt;code&gt;[deprecated = true]&lt;/code&gt; que las herramientas
pueden mostrar. Ninguna de las dos se aplica a la fuerza: un servidor GraphQL sigue respondiendo a
una consulta sobre un campo deprecado, y un cliente protobuf sigue codificándolo. Ambas son
informativas y necesitan el mismo respaldo de changelog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Renumerar es alguna vez seguro si controlas cada cliente?&lt;/strong&gt;
En un sistema totalmente cerrado, en principio, pero elimina toda la propiedad de seguridad para
la que existen los números de campo, y &amp;quot;controlamos cada cliente&amp;quot; es una afirmación que deja de
ser cierta en el momento en que un build queda en caché, un despliegue se retrasa, o se añade un
cliente que nadie recordaba. Reserva el número en vez de reutilizarlo, incluso internamente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Los servicios gRPC necesitan una página de changelog como una API REST pública?&lt;/strong&gt;
Solo si equipos externos los consumen sin leer diffs de &lt;code&gt;.proto&lt;/code&gt; directamente, la misma prueba de
&amp;quot;quién está del otro lado&amp;quot; que &lt;a href=&quot;https://changeloop.dev/blog/es/internal-api-changelog/&quot;&gt;changelogs de API interna&lt;/a&gt;
aplica en general. Un servicio gRPC que solo consumen otros servicios del mismo equipo suele poder
saltarse un changelog formal en favor del historial de commits, porque quien lo lee ya tiene el
esquema abierto.&lt;/p&gt;
</content:encoded></item><item><title>Formatos de archivo de changelog: JSON, YAML o solo Markdown</title><link>https://changeloop.dev/blog/es/changelog-file-formats/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/changelog-file-formats/</guid><description>El formato de un archivo de changelog decide si puede alimentar una página y un widget, o solo lo lee alguien. Markdown, JSON y YAML cuestan distinto.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;La mayoría de equipos empieza un changelog como archivo Markdown porque es el camino de menor
resistencia: legible en el diff de un pull request, legible en GitHub sin renderizar nada, y
familiar para cualquiera que haya escrito alguna vez un README. Esa elección funciona bien hasta
que algo distinto de una persona necesita leer el archivo, una página, un widget, un resumen por
email, y entonces el formato deja de ser gratis. &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-automation/&quot;&gt;Automatización de changelog&lt;/a&gt;
cubre el requisito estructural en general, un tipo, una fecha, un cuerpo y un enlace; esto trata
de qué formato de archivo entrega realmente esa estructura y qué cuesta llegar ahí con cada uno.&lt;/p&gt;
&lt;h2&gt;¿Qué tiene de malo un changelog en Markdown simple?&lt;/h2&gt;
&lt;p&gt;Nada, hasta que algo necesita volver a parsearlo en campos. Un encabezado, una fecha y una lista
debajo es trivial de leer para una persona y genuinamente difícil de parsear con fiabilidad,
porque Markdown no tiene esquema: la fecha podría estar en el encabezado, en negrita en la primera
línea, o directamente ausente en una entrada antigua, y cada una de esas variantes es Markdown
válido que una persona lee correctamente y un parser no. Los equipos que automatizan un changelog
en Markdown suelen acabar escribiendo un parser a medida basado en regex que se rompe la primera
vez que el formato de una entrada se desvía aunque sea ligeramente, lo cual es frecuente, porque
nada obliga a la consistencia al escribir.&lt;/p&gt;
&lt;h2&gt;¿Qué aporta realmente un formato estructurado?&lt;/h2&gt;
&lt;p&gt;Una garantía de que cada entrada tiene la misma forma, comprobada al escribir la entrada en lugar
de adivinada al leerla. Un archivo JSON o YAML con un esquema definido, tipo, fecha, versión,
audiencia, cuerpo, enlace, falla de forma ruidosa si falta un campo obligatorio, igual que lo
haría una respuesta de API estricta; un archivo Markdown simplemente renderiza lo que haya,
correcto o no. Esa diferencia es invisible hasta el día en que un script necesita la fecha de cada
entrada para ordenar un feed, y la mitad de las entradas la tienen en un sitio distinto.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# CHANGELOG.yml
- date: 2026-09-05
  type: breaking
  version: v2
  audience: api
  body: &amp;quot;POST /invoices now rejects a currency mismatch instead of silently converting.&amp;quot;
  link: /blog/api-changelog/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Eso significa que el archivo legible por humanos tiene que desaparecer?&lt;/h2&gt;
&lt;p&gt;No, e intentar que un archivo YAML o JSON sirva a la vez como lo que una persona lee en un pull
request suele ser un error en la dirección contraria: revisar un diff de JSON anidado es peor que
revisar una frase en prosa, y una revisora que tiene que parsear mentalmente una estructura de
datos para detectar un error de redacción es una revisora que acabará dejando de detectar errores
de redacción. Los dos formatos pueden coexistir: los datos estructurados son la fuente de verdad
que lee una pipeline de automatización, y un renderizado generado en Markdown o HTML es lo que una
persona realmente revisa y lee, producido a partir del archivo estructurado en lugar de mantenido
a mano en paralelo.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Formato&lt;/th&gt;
&lt;th&gt;Legible por humanos tal cual&lt;/th&gt;
&lt;th&gt;Parseable por máquina sin código a medida&lt;/th&gt;
&lt;th&gt;Fallo habitual&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Forma inconsistente de las entradas rompe parsers ingenuos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Pobre&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Verboso; fácil de editar a mano hacia JSON inválido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;Aceptable&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Sensible a espacios; una mala indentación es un error de parseo silencioso, no ruidoso&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué formato estructurado es realmente más fácil de editar a mano, JSON o YAML?&lt;/h2&gt;
&lt;p&gt;YAML, para quien escribe entradas a mano en lugar de mediante un generador, porque elimina el
comillado y el emparejamiento de llaves que JSON exige para cada cadena y objeto anidado. La
contrapartida es que la sensibilidad de YAML a los espacios falla en silencio de una forma en que
los desajustes de llaves de JSON normalmente no lo hacen: un parser JSON rechaza directamente una
entrada malformada, mientras que un parser YAML puede aceptar un archivo mal indentado y
simplemente parsearlo en la estructura equivocada, lo cual es un fallo peor porque nada os dice
que ha pasado. Si las entradas solo las escribe siempre un script, esta contrapartida
prácticamente desaparece y el parseo más estricto de JSON se convierte en la opción por defecto
más segura.&lt;/p&gt;
&lt;h2&gt;¿Una página de changelog necesita su propio formato estructurado, separado del archivo que la alimenta?&lt;/h2&gt;
&lt;p&gt;No uno separado, el mismo renderizado de otra forma. &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-page/&quot;&gt;Una página de changelog&lt;/a&gt;
cubre cómo hacer la página misma legible por máquinas mediante un feed JSON y marcado schema.org;
ese feed es salida generada, no una segunda fuente de verdad que mantener sincronizada con el
archivo subyacente. Mantener datos estructurados a mano en dos sitios, un archivo fuente y el feed
de una página, es como los dos acaban divergiendo, así que la decisión de formato de archivo que
se toma aquí debería ser la única cosa de la que todo lo demás, página, widget, email, se genera,
nunca se copia a mano.&lt;/p&gt;
&lt;h2&gt;¿Merece la pena el coste de migrar un changelog en Markdown existente a un formato estructurado?&lt;/h2&gt;
&lt;p&gt;Normalmente solo una vez que la automatización es el objetivo real, no antes. Un proyecto de una
sola persona que publica un archivo Markdown en un README de GitHub no tiene una necesidad real de
automatización, y convertirlo a YAML no compra nada más que ceremonia. La conversión se paga sola
en el momento en que más de un consumidor final, una página, un email de resumen, un feed público,
necesita leer los mismos datos, porque ese es exactamente el punto en el que las inconsistencias
de un parser de Markdown empiezan a producir salida visiblemente equivocada en lugar de solo ser
molestas de mantener.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Se puede hacer parseable un changelog en Markdown sin cambiar de formato por completo?&lt;/strong&gt;
Parcialmente, con frontmatter: un pequeño bloque YAML al principio de cada entrada (fecha, tipo,
versión) junto a un cuerpo en Markdown para la prosa. Esto consigue los campos estructurados que
necesita un parser sin forzar toda la entrada a JSON o YAML, y es un término medio razonable para
un equipo que aún no está listo para una migración completa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Importa el formato del archivo para el SEO o para cómo posiciona una página de changelog?&lt;/strong&gt;
No directamente. Los buscadores leen la página renderizada, no el archivo fuente, así que el
formato del archivo les es invisible; lo que importa para la página en sí es si es legible por
máquinas por derecho propio, lo cual es un asunto separado de qué la genera.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería pasar cada entrada de changelog por el mismo archivo, o se pueden repartir los tipos en varios archivos?&lt;/strong&gt;
Un solo archivo es más simple hasta que el volumen de entradas lo hace incómodo de diferenciar o
revisar; dividir por año o por categoría es una válvula de escape razonable en cuanto los diffs de
un único archivo se vuelven demasiado grandes para revisar con sensatez, pero añade un paso de
fusión antes de que nada, aguas abajo, pueda leer &amp;quot;todas las entradas&amp;quot; como una sola lista.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Existe un formato estándar de archivo de changelog, como existe un estándar para RSS?&lt;/strong&gt;
No uno ampliamente adoptado. Keep a Changelog propone una convención en Markdown, y varias
herramientas tienen el suyo; un &lt;a href=&quot;https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md&quot;&gt;changeset&lt;/a&gt;
es un archivo Markdown con frontmatter YAML que nombra el paquete y el salto de versión, que es el
patrón de frontmatter descrito arriba. Ninguno es un formato que otras herramientas lean de fábrica como los lectores de RSS entienden
RSS universalmente.&lt;/p&gt;
</content:encoded></item><item><title>Solicitudes duplicadas: fusionar sin perder la voz original</title><link>https://changeloop.dev/blog/es/duplicate-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/duplicate-feature-requests/</guid><description>Agrupar solicitudes de función duplicadas protege el recuento. Fusionarlas sin cuidado pierde la redacción que hacía útil a una, la pérdida más pequeña.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tres clientas piden la misma capacidad en tres semanas distintas, con tres redacciones distintas,
y un proceso de triaje construido para atrapar duplicados hace su trabajo: las agrupa, las cuenta
como una sola solicitud con tres votos, y el backlog queda limpio. Esa es la parte fácil. &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-tracking/&quot;&gt;Qué
etiquetas merecen la pena&lt;/a&gt; cubre agrupar por capacidad
subyacente antes de triagiar por redacción como la solución mecánica a los duplicados; lo que no
cubre es qué pasa con las palabras mismas una vez que tres solicitudes se convierten en una sola
línea, y esa pérdida suele ser mayor que el problema de contar duplicados que resolvió.&lt;/p&gt;
&lt;h2&gt;¿Qué se pierde realmente cuando se fusionan duplicados?&lt;/h2&gt;
&lt;p&gt;La redacción específica que usó cada solicitante, que a menudo es más informativa que el recuento
de votos en el que colapsa. Una clienta podría pedir &amp;quot;una forma de exportar resultados
filtrados&amp;quot;, otra &amp;quot;exportación CSV que respete mis filtros guardados&amp;quot;, y una tercera &amp;quot;exportación
que no incluya columnas ocultas&amp;quot;. Las tres son la misma solicitud subyacente, agrupada
correctamente, pero cada redacción lleva un énfasis ligeramente distinto sobre lo que le importa a
esa persona, y una fusión que solo conserva la redacción de la primera petición descarta por
completo las otras dos. El recuento sobrevive; la textura que ayudaría a alguien a construir la
versión correcta de la función, no.&lt;/p&gt;
&lt;h2&gt;¿Por qué importa la textura si el recuento de votos ya dice que existe demanda?&lt;/h2&gt;
&lt;p&gt;Porque demanda y diseño son preguntas distintas, y solo la redacción específica responde la
segunda. Diez votos en &amp;quot;exportación&amp;quot; le dice a un equipo que vale la pena construir la función; no
dice nada sobre si &amp;quot;exportación&amp;quot; significa CSV, PDF, un email programado o un endpoint de API, y
una fusión que descarta nueve de las diez peticiones originales a favor de la redacción de la
primera puede estrechar en silencio la especificación a lo que fuera que pidiera esa primera
solicitante, aunque las otras nueve quisieran algo sutilmente distinto. &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-tracking/&quot;&gt;Qué debería registrar
realmente una solicitud de función&lt;/a&gt; cubre este mismo hueco
desde el lado de la recepción; fusionar duplicados es donde vuelve a aparecer después de la
recepción, justo en el punto donde un equipo más necesita el rango de lo que realmente se pidió.&lt;/p&gt;
&lt;h2&gt;¿Cómo es un proceso de fusión que conserva la redacción en lugar de descartarla?&lt;/h2&gt;
&lt;p&gt;Añadir en lugar de reemplazar. El elemento canónico conserva un único título para la vista del
backlog, pero la redacción original de cada petición fusionada queda adjunta a él, ya sea como
lista de citas o como tickets fuente enlazados, para que cualquiera que revise el elemento más
tarde pueda ver el rango real de lo que la gente pidió en lugar del resumen de una persona del
equipo. Esto cuesta casi nada de construir, un campo en el ticket en lugar de un sistema nuevo, y
es la diferencia entre una fusión que comprime información y una que solo comprime cómo se
muestra.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Función: Exportación CSV filtrada
Votos: 12
Solicitudes fusionadas:
  - &amp;quot;una forma de exportar resultados filtrados&amp;quot; (acct_4421)
  - &amp;quot;exportación CSV que respete mis filtros guardados&amp;quot; (acct_8832)
  - &amp;quot;exportación que no incluya columnas ocultas&amp;quot; (acct_1097)
  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Todo duplicado merece fusionarse, o hay coincidencias falsas?&lt;/h2&gt;
&lt;p&gt;Algunas son coincidencias falsas, y tratar &amp;quot;suena parecido&amp;quot; como &amp;quot;es la misma solicitud&amp;quot; es su
propio modo de fallo. &amp;quot;Déjame exportar mis datos&amp;quot; y &amp;quot;déjame exportar solo la vista filtrada&amp;quot;
pueden agruparse por una coincidencia de palabra clave en &amp;quot;exportar&amp;quot; mientras en realidad
describen dos alcances distintos de la misma capacidad general; fusionarlas o infla el recuento
de votos para la cosa equivocada o, peor, lanza la versión más estrecha porque llegó primero por
casualidad. Una pasada humana sobre la agrupación, aunque sea rápida, atrapa esto antes de que se
acumule; una coincidencia automática por similitud sola fusionará de más por vocabulario y de
menos por intención.&lt;/p&gt;
&lt;h2&gt;¿Cuándo debería ejecutarse realmente la detección de duplicados, al recibirlos o después?&lt;/h2&gt;
&lt;p&gt;Ambos, por razones distintas. Comprobar al recibirlos atrapa el caso obvio, una solicitud nueva que
repite algo ya abierto, antes de que se convierta en su propia línea sin rastrear; una búsqueda por
similitud contra las solicitudes abiertas en el momento del envío resuelve la mayoría de estos casos
sin que intervenga ninguna persona. Un segundo pase más tarde, con un ritmo más lento, atrapa el
caso que la comprobación inicial se pierde: dos solicitudes que usaron un lenguaje lo bastante
distinto como para escapar en su momento a una coincidencia por palabra clave o por embedding, pero
que resultan, una vez que un equipo ha visto una docena de variaciones, describir la misma capacidad
subyacente. Saltarse el segundo pase deja casi-duplicados dispersos bajo títulos separados
indefinidamente, cada uno con su propio recuento pequeño de votos que nunca suma el número que
habría conseguido que se construyera.&lt;/p&gt;
&lt;h2&gt;¿Debería saber la solicitante que su petición se fusionó en un elemento existente?&lt;/h2&gt;
&lt;p&gt;Sí, y esta es la misma disciplina que &lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;cerrar el bucle de feedback del cliente&lt;/a&gt;
aplicada un paso antes de lo habitual: una solicitante que envió algo y nunca vuelve a saber nada
concluye que su petición no fue a ningún lado, aunque se fusionara correctamente en un elemento
con otros once votos que acabó lanzándose. Un reconocimiento breve, &amp;quot;hemos combinado esto con una
solicitud existente que otras personas también han hecho&amp;quot;, cuesta un mensaje y evita que una
clienta reenvíe la misma petición cada pocos meses porque no tiene visibilidad de si alguna vez se
rastreó de verdad.&lt;/p&gt;
&lt;h2&gt;¿Fusionar cambia a quién se le da crédito cuando la función se lanza?&lt;/h2&gt;
&lt;p&gt;Debería incluir a todo el mundo, no solo a quien la envió primero. &lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;Cerrar el bucle de
feedback&lt;/a&gt; cubre avisar a quien pidió algo cuando se lanza; para
un elemento fusionado eso significa cada cuenta adjunta a la fusión, no solo aquella cuya
redacción se convirtió en el título canónico, porque desde la perspectiva de cada solicitante ella
pidió esto y se lanzó, sin importar de quién fuera la redacción que un proceso de triaje decidiera
conservar. Con changeloop eso significa que el pull request nombra cada issue vinculado
(&lt;code&gt;Fixes #142, fixes #187&lt;/code&gt;); un issue que no nombra no recibe ningún comentario.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuánta redacción vale la pena conservar por solicitud fusionada, una cita o un enlace completo al ticket?&lt;/strong&gt;
Una cita corta suele bastar para el caso común, ya que su propósito es dejar que quien revisa vea
el rango de redacciones de un vistazo; conservad también el enlace completo al ticket cuando el
original tuviera contexto extra significativo, como una captura de pantalla o una descripción
detallada de flujo que una cita de una línea aplanaría.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Conservar la redacción de cada duplicado hace más difícil escanear el backlog?&lt;/strong&gt;
No, si está colapsada por defecto. El título canónico es lo que ve quien revisa por encima; la
redacción fusionada está a un clic o un despliegue de distancia, presente para quien hace
investigación más profunda pero sin saturar la vista de quien solo cuenta votos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué pasa si dos solicitudes parecen idénticas pero resultan querer cosas distintas una vez construidas?&lt;/strong&gt;
Volved a separarlas en cuanto quede claro, y tratad la fusión original como una decisión razonable
tomada con la información disponible en ese momento, no como un error que evitar repetir. Un
sistema de agrupación que nunca deshace nada acabará teniendo unas cuantas fusiones equivocadas
horneadas permanentemente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Hay un umbral de votos a partir del cual una solicitud fusionada debería recibir una revisión humana de la redacción subyacente?&lt;/strong&gt;
No un número fijo, pero cualquier solicitud que se acerque a una decisión de construcción lo
merece sin importar el recuento de votos, porque ese es el punto donde la diferencia entre
&amp;quot;exportación&amp;quot; y &amp;quot;exportación como CSV con filtros guardados&amp;quot; deja de ser un matiz y empieza a ser
la especificación.&lt;/p&gt;
</content:encoded></item><item><title>Deprecación en GraphQL sin número de versión</title><link>https://changeloop.dev/blog/es/graphql-schema-deprecation/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/graphql-schema-deprecation/</guid><description>GraphQL no tiene v1 ni v2 en la URL. Los campos se deprecan uno a uno con una directiva, en un esquema compartido, y eso cambia lo que exige un changelog.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Una API REST puede publicar &lt;code&gt;/v2/&lt;/code&gt; junto a &lt;code&gt;/v1/&lt;/code&gt; y dejar que cada consumidor migre a su propio
ritmo. GraphQL tiene un esquema en un endpoint, y cada cliente, la app móvil con el build del año
pasado y el dashboard interno desplegado esta mañana, consulta el mismo grafo. No hay URL que
bifurcar. Deprecar un campo significa marcarlo como deprecado en el mismo sitio, en un esquema del
que todo el mundo ya depende, lo que hace que la disciplina sea distinta de REST aunque el
problema de fondo, decirle a quien consume que algo va a desaparecer, sea el mismo que cubre
&lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;deprecación de API&lt;/a&gt; en general.&lt;/p&gt;
&lt;h2&gt;¿Cómo marca GraphQL un campo como deprecado, si no hay versión que subir?&lt;/h2&gt;
&lt;p&gt;Con la directiva &lt;a href=&quot;https://spec.graphql.org/October2021/#sec--deprecated&quot;&gt;&lt;code&gt;@deprecated&lt;/code&gt;&lt;/a&gt;, aplicada directamente sobre el campo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-graphql&quot;&gt;type Product {
  price: Float @deprecated(reason: &amp;quot;Use priceV2 for multi-currency support.&amp;quot;)
  priceV2: Money
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El campo sigue siendo consultable. No desaparece, no devuelve un 404, no cambia de
comportamiento; solo lleva una nota legible por máquina que la mayoría de herramientas GraphQL,
GraphiQL, Apollo Studio, linters de esquema, mostrarán a quien navegue el esquema o escriba una
query contra él. Ese es todo el mecanismo. No hay un endpoint de deprecación separado, ni
cabecera, ni documento adicional exigido por la especificación, lo cual es a la vez el atractivo
y la trampa: la directiva es fácil de añadir y fácil de ignorar, porque nada obliga a un cliente a
fijarse en ella.&lt;/p&gt;
&lt;h2&gt;¿Alguien llega a ver realmente el motivo de la deprecación?&lt;/h2&gt;
&lt;p&gt;Solo quien usa el esquema directamente, por introspección o un editor consciente del esquema, y
ese es un público más pequeño que el lector habitual de un changelog de API. Una app móvil
construida contra una query hace seis meses ya tiene esa query horneada en su binario; seguirá
pidiendo &lt;code&gt;price&lt;/code&gt; y seguirá recibiendo una respuesta, deprecado o no, hasta que alguien reconstruya
la app con el campo nuevo y publique una actualización. La directiva le dice a una desarrolladora
que escribe código nuevo que no use el campo viejo. No hace nada por el cliente que ya está
publicado y en funcionamiento.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mecanismo&lt;/th&gt;
&lt;th&gt;A quién alcanza&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Directiva &lt;code&gt;@deprecated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Desarrolladoras navegando el esquema o escribiendo queries nuevas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fallos de CI del linter de esquema&lt;/td&gt;
&lt;td&gt;El equipo dueño del código cliente, si tiene uno configurado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Una entrada de changelog&lt;/td&gt;
&lt;td&gt;Quien la lea, incluido un equipo cliente sin linter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nada (el campo simplemente funciona)&lt;/td&gt;
&lt;td&gt;Un cliente ya construido que usa el campo antiguo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Debería un campo deprecado tener también una entrada de changelog?&lt;/h2&gt;
&lt;p&gt;Sí, y hace más trabajo que la directiva sola, porque un changelog alcanza a gente que la
directiva no puede: un equipo socio que consume el grafo sin navegar su esquema, un cliente
construido contra una copia cacheada del esquema de hace meses, cualquiera que solo se enteraría
leyendo prosa. &lt;a href=&quot;https://changeloop.dev/blog/es/api-changelog/&quot;&gt;Changelog de API&lt;/a&gt; cubre en general qué le debe una
entrada a quien consume; una entrada de GraphQL debe una cosa que REST rara vez tiene que
explicitar, porque quien consume REST la infiere del número de versión: si el campo antiguo
todavía funciona hoy, todavía funciona con una advertencia, o de hecho ha dejado de devolver
datos. La directiva sola no responde nada de eso para quien nunca abrió el esquema.&lt;/p&gt;
&lt;h2&gt;¿Cuándo es realmente seguro eliminar un campo del esquema?&lt;/h2&gt;
&lt;p&gt;Solo cuando los logs de queries muestran que nadie lo pide, que es una pregunta de uso, no de
calendario. Un campo puede llevar &lt;code&gt;@deprecated&lt;/code&gt; durante un año y seguir siendo crítico para un
cliente que nunca se reconstruyó; eliminarlo en un calendario fijo, como suele hacer un
&lt;code&gt;Sunset&lt;/code&gt; de REST, rompe ese cliente sin ninguna advertencia sobre la que pueda actuar, porque
GraphQL no le da nada sobre lo que actuar más allá de la directiva que nunca leyó. Registrad el
uso a nivel de campo antes de comprometeros con una fecha de eliminación, y tratad cualquier
recuento de queries distinto de cero como una pausa, no como una cuenta atrás.&lt;/p&gt;
&lt;h2&gt;¿Añadir un campo tiene el mismo riesgo que en una API REST?&lt;/h2&gt;
&lt;p&gt;Menos, para un campo nuevo, porque un cliente GraphQL solo recibe los campos que pide
explícitamente. Añadir &lt;code&gt;priceV2&lt;/code&gt; junto a &lt;code&gt;price&lt;/code&gt; no puede romper una query existente de la forma
en que añadir un campo a una respuesta JSON de REST puede romper un deserializador estricto,
porque nada obliga al cliente a pedir el campo nuevo. Añadir un valor a un enum existente es la
excepción que vale la pena nombrar en el mismo aliento: un cliente que distingue exhaustivamente
cada valor del enum, algo que los lenguajes fuertemente tipados fomentan, se rompe en cuanto llega
un valor nuevo, lo haya pedido o no alguna query. La seguridad solo se sostiene para campos y
miembros de union en los que el cliente opta explícitamente; no se sostiene para un conjunto
cerrado que el código del cliente enumera a mano.&lt;/p&gt;
&lt;h2&gt;¿Qué necesita una entrada de changelog de GraphQL que una de REST no?&lt;/h2&gt;
&lt;p&gt;La forma de la query, no solo el nombre del campo, porque &amp;quot;el campo &lt;code&gt;price&lt;/code&gt; está deprecado&amp;quot; le
falta la pieza que quien consume realmente necesita: qué tipos y qué queries lo tocan. Una
entrada útil nombra el tipo, el campo, el campo de reemplazo y, si podéis generarlo, las queries
reales en producción que todavía piden la forma antigua. Esa última pieza, atar el aviso de
deprecación al uso real, es lo que quien consume REST obtiene gratis de los logs del servidor
sobre una URL y quien consume GraphQL no, porque cada query golpea el mismo endpoint sin importar
qué pida.&lt;/p&gt;
&lt;h2&gt;¿Algo más allá de un campo puede llevar la directiva &lt;code&gt;@deprecated&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;Los valores de enum, usando la misma directiva en la propia definición del valor en vez de en la
del campo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-graphql&quot;&gt;enum ShippingMethod {
  STANDARD
  EXPRESS
  OVERNIGHT @deprecated(reason: &amp;quot;Use EXPRESS with priority: true instead.&amp;quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La especificación define &lt;code&gt;@deprecated&lt;/code&gt; para exactamente dos ubicaciones, una definición de campo o
un valor de enum, y nada más en la versión estable; la deprecación a nivel de argumento o de campo
de input solo existe en lenguaje de borrador posterior, no en lo que implementan hoy la mayoría de
los servidores. Un valor de enum marcado así sigue siendo un valor legal que un servidor puede
seguir devolviendo o aceptando, la misma promesa de no ruptura que hace un campo deprecado, que es
lo que permite lanzarlo con seguridad antes de eliminar el valor de verdad.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿GraphQL soporta algo parecido a un header Sunset para todo un endpoint?&lt;/strong&gt;
No, porque normalmente solo hay un endpoint. El calendario de deprecación vive a nivel de campo,
en el texto del motivo de la directiva &lt;code&gt;@deprecated&lt;/code&gt; y en el changelog o guía de migración que un
equipo publique junto a él, no en una cabecera de respuesta que un cliente pueda leer
programáticamente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Se puede eliminar un campo deprecado y volver a añadirlo después con un tipo distinto?&lt;/strong&gt;
Solo con un nombre de campo nuevo. Reintroducir el mismo nombre de campo con un tipo cambiado es
exactamente el breaking change que el ciclo de deprecación existe para evitar; dadle al
reemplazo su propio nombre, como hace &lt;code&gt;priceV2&lt;/code&gt;, y dejad que el antiguo se extinga por completo
antes de que el nombre quede libre para reutilizarse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería el texto del motivo de &lt;code&gt;@deprecated&lt;/code&gt; enlazar a la entrada de changelog?&lt;/strong&gt;
Sí, cuando las herramientas del esquema lo permitan. El campo de motivo acepta una cadena de
texto simple, y una URL dentro de esa cadena es el camino más corto desde una desarrolladora
mirando la salida de introspección hasta la explicación más completa que puede dar una entrada de
changelog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Un cambio de esquema en GraphQL es alguna vez compatible hacia atrás de una forma que REST no lo es?&lt;/strong&gt;
Los cambios aditivos de campo, sí, por la razón de arriba: quien consume solo recibe lo que pide.
Los valores nuevos de enum son la excepción, porque un cliente que enumera un conjunto cerrado
puede romperse con uno que no esperaba. Las eliminaciones y los cambios de tipo son exactamente tan
rompedores como sus equivalentes REST.&lt;/p&gt;
</content:encoded></item><item><title>Cómo escribir una guía de migración de API</title><link>https://changeloop.dev/blog/es/api-migration-guide/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/api-migration-guide/</guid><description>Una guía de migración de API convierte un cambio incompatible en una checklist en vez de una caída. Qué necesita, y por qué una entrada no basta sola.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Una guía de migración de API es el documento que convierte un cambio incompatible en una checklist
en lugar de una caída: qué cambió, qué hacer al respecto, y para cuándo. Una entrada de changelog
puede nombrar un cambio incompatible en dos frases; una guía de migración es lo que quien llama
abre realmente cuando esas dos frases dicen &amp;quot;esto te rompe&amp;quot; y necesita saber exactamente qué
editar. Publicar la entrada sin la guía es cómo quien llama se entera de un cambio incompatible
por un ticket de soporte en vez de por el documento escrito para evitarlo.&lt;/p&gt;
&lt;h2&gt;¿Qué es una guía de migración de API?&lt;/h2&gt;
&lt;p&gt;Un documento paso a paso que lleva a quien llama desde la forma antigua de una API hasta la nueva,
escrito para alguien con código que cambiar, no para alguien que decide si adoptar la API. Esa
distinción importa: una guía de migración asume una integración existente y tráfico de producción
existente, así que tiene que cubrir el rollback, la migración parcial, y cómo saber si la
migración funcionó, nada de lo cual necesita una guía de primera integración.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Documento&lt;/th&gt;
&lt;th&gt;Asume&lt;/th&gt;
&lt;th&gt;Responde&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Guía de migración&lt;/td&gt;
&lt;td&gt;Una integración existente&lt;/td&gt;
&lt;td&gt;¿Cómo paso de la forma antigua a la nueva?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entrada de changelog&lt;/td&gt;
&lt;td&gt;Nada, solo que la lectora revisa&lt;/td&gt;
&lt;td&gt;¿Qué cambió, y cuándo?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Referencia de API&lt;/td&gt;
&lt;td&gt;Nada, o una primera integración&lt;/td&gt;
&lt;td&gt;¿Qué hace este endpoint?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aviso de depreciación&lt;/td&gt;
&lt;td&gt;Una integración usando lo antiguo&lt;/td&gt;
&lt;td&gt;¿Cuándo deja de funcionar esto?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Una guía de migración suele estar entre los dos últimos: un aviso de depreciación pone en marcha
un reloj, y la guía de migración es lo que quien llama sigue antes de que ese reloj se agote.&lt;/p&gt;
&lt;h2&gt;¿Cuándo necesita un cambio una guía de migración, y no solo una entrada de changelog?&lt;/h2&gt;
&lt;p&gt;Cuando hay más de un paso entre el comportamiento antiguo y el nuevo, o cuando el cambio toca
suficientes puntos de llamada como para que quien llama se beneficie de un ejemplo trabajado más
que de una descripción. &lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;Qué es un cambio incompatible, y cómo lanzarlo&lt;/a&gt;
cubre la prueba de si un cambio es incompatible; si la respuesta es sí, la segunda pregunta es si
el arreglo es una edición de una línea o una migración de verdad. Un campo renombrado puede
manejarlo quien llama solo con la entrada de changelog. Un cambio en autenticación, paginación o
manejo de errores casi siempre se gana una guía, porque el código de reemplazo correcto no es
obvio a partir de una descripción de una frase.&lt;/p&gt;
&lt;h2&gt;¿Qué necesita contener una guía de migración?&lt;/h2&gt;
&lt;p&gt;Cinco cosas, y saltarse cualquiera de ellas es cómo una guía se convierte en una página que quien
llama lee una vez y luego abandona por ensayo y error. El código antiguo, mostrado tal como
aparecería realmente en un proyecto. El código nuevo, mostrado igual, no como una descripción
abstracta de la diferencia. Qué se rompe si no se cambia nada, dicho claramente, porque &amp;quot;nada&amp;quot; es
una respuesta válida y común que quien llama igual necesita oír explícitamente. Una forma de
verificar que la migración funcionó, como un campo de respuesta o un código de estado a comprobar.
Y un calendario: cuándo deja de funcionar el comportamiento antiguo, y si ambas formas están
disponibles mientras tanto.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## Migrando campos de moneda de float a entero (v3.0.0)

Antes:
  { &amp;quot;amount&amp;quot;: 19.99 }

Después:
  { &amp;quot;amount&amp;quot;: 1999 }  // unidad monetaria más pequeña (centavos)

Qué cambia: `amount` ahora es un entero en la unidad más pequeña de
la moneda de la cuenta. El código que lee `amount` como float leerá
un valor 100 veces demasiado grande a partir del 1 de octubre de 2026.

Verificar: tras migrar, un cargo de 19,99 debería leerse como
`amount: 1999`, no como `amount: 19.99`.

Calendario: v2 sigue devolviendo floats hasta el 15 de enero de 2027.
v3 devuelve enteros desde el lanzamiento. Ambas versiones están
activas ahora.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cada una de esas cinco cosas responde a una pregunta que quien llama tendría que adivinar o
preguntar al soporte, y ese es el coste real que ahorra una guía de migración.&lt;/p&gt;
&lt;h2&gt;¿Quién debería escribirla, y cuándo?&lt;/h2&gt;
&lt;p&gt;Quien diseñó el cambio, en el mismo momento en que se lanza, no un equipo de soporte
reconstruyéndola a partir de tickets después. Quien tomó la decisión sabe qué partes del
comportamiento antiguo nadie debería haber asumido y cuáles eran un contrato accidental; una guía
escrita después por alguien sin ese contexto tiende a sobreexplicar lo obvio o a pasar por alto el
único caso límite que realmente rompe a la gente. La guía y la entrada de changelog que anuncia el
cambio incompatible deberían salir juntas, con la entrada enlazando a la guía en vez de repetirla.&lt;/p&gt;
&lt;h2&gt;¿Cómo se relaciona esto con el versionado y el changelog de API?&lt;/h2&gt;
&lt;p&gt;Directamente: una guía de migración es la versión detallada de lo que una entrada MAJOR en
&lt;a href=&quot;https://changeloop.dev/blog/es/semantic-versioning-changelog/&quot;&gt;semantic versioning y tu changelog&lt;/a&gt; solo resume en una
frase. La entrada de changelog dice que un cambio es incompatible y a grandes rasgos qué cambió;
la guía de migración es el enlace que esa entrada debería llevar. &lt;a href=&quot;https://changeloop.dev/blog/es/api-changelog/&quot;&gt;Changelog de API: qué publicar y quién lo lee&lt;/a&gt;
lista la guía de migración como uno de cinco documentos que mantiene una API, cada uno respondiendo
una pregunta distinta; esta es la que responde &amp;quot;cómo paso realmente de A a B&amp;quot;, y se gana su propia
página precisamente porque esa respuesta suele ser demasiado larga para una entrada de changelog.&lt;/p&gt;
&lt;h2&gt;¿Cuánto tiempo debería seguir publicada una guía de migración?&lt;/h2&gt;
&lt;p&gt;Al menos mientras el comportamiento antiguo siga siendo alcanzable, e idealmente después también.
Quien migra dieciocho meses tarde, tras ignorar tres avisos de depreciación, sigue necesitando la
guía, y borrarla el día en que se apaga el comportamiento antiguo solo garantiza que quien más la
necesita no la encuentre. Mantenla en una URL estable y actualiza la sección de calendario en vez
de retirar la página. La propia &lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;guía de actualización&lt;/a&gt; de Stripe
es un ejemplo público de este patrón: una sola página, mantenida al día lanzamiento tras
lanzamiento, en lugar de un documento nuevo por versión que queda obsoleto en cuanto sale el
siguiente. Tu propia guía merece un sitio igual de fácil de encontrar, junto a
&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;la documentación&lt;/a&gt; que quien llama ya está leyendo, en vez de enterrada en un archivo de
blog.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Necesita cada cambio incompatible una guía de migración?&lt;/strong&gt;
No. Un cambio que quien llama puede resolver solo con la entrada de changelog, como un campo
renombrado con un reemplazo obvio, no necesita una guía aparte. Un cambio que toca varios puntos
de llamada o necesita un ejemplo trabajado, sí.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería una guía de migración vivir con la documentación de la API o en el changelog?&lt;/strong&gt;
Con la documentación, enlazada desde la entrada de changelog. La entrada es lo primero que ve una
suscriptora; la guía es lo que necesita en cuanto decide actuar, y pertenece junto al material de
referencia que quien llama ya está usando.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la diferencia entre una guía de migración y un aviso de depreciación?&lt;/strong&gt;
Un aviso de depreciación indica que algo va a desaparecer y para cuándo. Una guía de migración son
las instrucciones de qué hacer al respecto. Un aviso de depreciación sin guía de migración
enlazada le da a quien llama un plazo sin decirle cómo cumplirlo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían documentarse tanto el comportamiento antiguo como el nuevo durante una ventana de migración?&lt;/strong&gt;
Sí, en la misma página si es posible, para que quien llama vea exactamente qué cambió en vez de
reconstruirlo a partir de dos documentos separados escritos en momentos distintos.&lt;/p&gt;
</content:encoded></item><item><title>Un check de changelog para GitHub Actions</title><link>https://changeloop.dev/blog/es/changelog-ci-enforcement/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/changelog-ci-enforcement/</guid><description>Un check de changelog en GitHub Actions rechaza el merge sin entrada, porque un paso que depende de la memoria falla siempre. Y qué rompe ese check.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Todo equipo que mantiene un changelog a mano ha tenido la misma conversación tras el mismo
incidente: un lanzamiento salió sin entrada, alguien pregunta por qué, y la respuesta honesta es
que la persona que la habría escrito iba con prisa y el paso del changelog solo vivía en la
memoria. &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-automation/&quot;&gt;Automatización de changelog&lt;/a&gt; cubre qué puede automatizar
con seguridad una pipeline y qué todavía necesita a una persona; un check de changelog en CI es la
otra mitad de este problema, porque automatizar la escritura no ayuda si nadie está obligado a
activarla en primer lugar. GitHub Actions es donde la mayoría de los equipos ya ejecutan sus checks
de pull request, así que ahí es también donde vive este.&lt;/p&gt;
&lt;h2&gt;¿Por qué falla &amp;quot;le pedimos a la gente que añada una entrada&amp;quot; con un patrón predecible?&lt;/h2&gt;
&lt;p&gt;Porque compite por atención con todo lo demás en un pull request, y es la única parte sin
consecuencia inmediata por saltársela. Los tests fallan a gritos y bloquean el merge. Una entrada
de changelog faltante no bloquea nada, así que pierde en cuanto alguien tiene prisa, que en la
práctica es casi siempre. Una política impuesta por la memoria se degrada exactamente al ritmo que
cabría esperar: bien las primeras semanas tras acordarla, luego abandonada en silencio en cuanto
la persona a quien le importaba se va de vacaciones o cambia de equipo.&lt;/p&gt;
&lt;h2&gt;¿Qué verifica en realidad un check de CI para una entrada de changelog?&lt;/h2&gt;
&lt;p&gt;No la calidad de la redacción, solo que una entrada existe y está bien formada, que es el alcance
correcto para un check de changelog que corre en CI en vez de en la cabeza de una persona. Una
forma habitual: el check mira el diff del PR y exige o bien un archivo nuevo en
un directorio de changesets (el patrón que usan &lt;a href=&quot;https://github.com/changesets/changesets&quot;&gt;Changesets&lt;/a&gt;
y herramientas similares) o una línea modificada en un archivo de changelog, y falla el build si
no existe ninguno de los dos. La revisión de qué dice realmente la entrada sigue pasando donde
siempre pasó, en el code review, porque ese juicio no pertenece a un script.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Qué verifica el check de CI&lt;/th&gt;
&lt;th&gt;Qué no verifica&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Existe un changeset o una línea de changelog en el diff&lt;/td&gt;
&lt;td&gt;Si la redacción es clara&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;La entrada referencia el paquete correcto, en un monorepo&lt;/td&gt;
&lt;td&gt;Si el cambio merece siquiera una entrada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;El archivo es sintácticamente válido (frontmatter, forma JSON)&lt;/td&gt;
&lt;td&gt;Si la entrada es honesta sobre el impacto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Necesita uno cada PR, o hay cambios exentos?&lt;/h2&gt;
&lt;p&gt;Algunos están exentos, y la lista de excepciones es donde estos sistemas realmente se construyen
o se abandonan. Un bump de dependencia sin efecto visible, un cambio solo de tests, un refactor
interno sin cambio de comportamiento: ninguno debería obligar a quien contribuye a inventar una
entrada de changelog para algo que a nadie que lea el changelog le importa. El patrón que
funciona es una etiqueta o flag que quien contribuye puede aplicar (&lt;code&gt;no-changelog-needed&lt;/code&gt;) y que
satisface el check de CI sin archivo, revisada por quien apruebe el PR, de modo que la propia
excepción pasa por el mismo escrutinio que pasaría una entrada.&lt;/p&gt;
&lt;h2&gt;¿Qué pasa con las excepciones legítimas, como un hotfix urgente?&lt;/h2&gt;
&lt;p&gt;El gate pertenece al merge, no al deploy: un hotfix bajo presión real de
tiempo puede mergear con una entrada de marcador de posición o un ticket de seguimiento, siempre
que el check de CI se satisfaga con la intención en vez de solo con un párrafo terminado; algunos
equipos aceptan un stub de una línea que una mantenedora pule antes del siguiente corte de
lanzamiento. Lo que el gate nunca debería permitir es saltarse el paso en silencio, porque un
stub que se olvida es un fallo menor que una entrada que nunca existió, y un stub al menos deja un
rastro que alguien puede encontrar después.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# .github/workflows/changelog-check.yml
on:
  pull_request:
    types: [opened, synchronize, reopened, labeled, unlabeled]
jobs:
  changelog:
    if: &amp;gt;-
      !contains(github.event.pull_request.labels.*.name,
      &amp;#39;no-changelog-needed&amp;#39;)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # el diff necesita la rama base
      - name: Require changelog entry
        run: |
          base=&amp;quot;origin/${{ github.base_ref }}&amp;quot;
          if ! git diff --name-only &amp;quot;$base&amp;quot;...HEAD \
              | grep -q &amp;#39;^\.changeset/&amp;#39;; then
            echo &amp;quot;No changeset. Add one, or have a maintainer&amp;quot;
            echo &amp;quot;apply the no-changelog-needed label.&amp;quot;
            exit 1
          fi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Cómo se sabe que el check en sí es correcto antes de que empiece a bloquear PRs reales?&lt;/h2&gt;
&lt;p&gt;Abre primero un pull request de prueba contra una rama desechable: uno con un changeset, uno sin
él, y uno con la etiqueta de excepción, y confirma que los tres obtienen el resultado esperado antes
de que el check aplique al trabajo de cualquier otra persona. Un check de changelog que falla
abierto, aprobando todos los PRs porque una condición se escribió al revés, es peor que no tener
ningún check, porque parece cobertura que en realidad no existe. &lt;code&gt;workflow_dispatch&lt;/code&gt; sobre el mismo
archivo, ejecutado a mano contra un par de PRs recientes ya mergeados, atrapa la mayoría de estos
errores sin necesitar un pull request en vivo.&lt;/p&gt;
&lt;h2&gt;¿La misma idea funciona fuera de GitHub Actions?&lt;/h2&gt;
&lt;p&gt;La forma se traslada igual, solo cambia la sintaxis. GitLab CI expresa la misma regla como un
bloque &lt;code&gt;rules&lt;/code&gt; de un job que comprueba &lt;code&gt;$CI_MERGE_REQUEST_LABELS&lt;/code&gt; en vez de un &lt;code&gt;if&lt;/code&gt; de GitHub
Actions, y una aprobación obligatoria del merge request puede sustituir al paso de revisión de la
excepción. El check que describe este artículo es de GitHub Actions porque esa es la plataforma en
la que ya está la mayoría de los equipos que lo leen, pero el requisito de fondo, un gate verificado
por máquina en vez de una convención pedida de palabra, es el mismo en cualquier sitio donde CI
corra antes de un merge.&lt;/p&gt;
&lt;h2&gt;¿Funciona igual en un monorepo?&lt;/h2&gt;
&lt;p&gt;Necesita una pieza más: para qué paquete es la entrada. &lt;a href=&quot;https://changeloop.dev/blog/es/monorepo-changelogs/&quot;&gt;Changelogs de
monorepo&lt;/a&gt; cubre por qué un único archivo para todo el repo deja de
funcionar en cuanto los paquetes se lanzan de forma independiente; el check de CI hereda ese mismo
requisito; un changeset que no nombra un paquete no es evidencia útil de que el changelog correcto
se vaya a actualizar, solo de que algún archivo cambió en algún lugar del diff. Las herramientas
construidas para esto (Changesets es la habitual en el ecosistema de JavaScript) piden a quien
contribuye elegir el paquete afectado y un bump de semver en el mismo momento en que se crea el
changeset, así que el check de CI obtiene ambas piezas gratis en vez de inferirlas después.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿El check de CI debería bloquear el merge, o solo avisar?&lt;/strong&gt;
Bloquear. Un aviso es funcionalmente idéntico a pedirlo por favor, que es justo lo que ya falló.
La etiqueta de excepción existe precisamente para que un caso genuino de solo-aviso tenga igual un
camino legítimo a través del mismo gate estricto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Quién revisa si una etiqueta de excepción se aplicó correctamente?&lt;/strong&gt;
Quien apruebe el pull request, como parte de la revisión que ya está haciendo de todos modos. La
etiqueta nunca debería auto-aplicarse sin revisión, o se convierte en el mismo atajo silencioso
que el gate estaba pensado para cerrar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Exigir esto en CI reemplaza la necesidad de una pipeline de automatización de changelog?&lt;/strong&gt;
No, la alimenta. &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-automation/&quot;&gt;Automatización de changelog&lt;/a&gt; cubre convertir
entradas estructuradas en una página, un feed y un correo; el check de CI es lo que garantiza que
esas entradas estructuradas existan para automatizarlas en primer lugar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la versión más pequeña de esto que vale la pena construir primero?&lt;/strong&gt;
Un único check que falla si no cambió ningún archivo bajo un directorio de changelog designado,
con una etiqueta de excepción. El enrutado por paquete y la inferencia de semver para un monorepo
pueden llegar después; el hábito central, una entrada existe o alguien dijo explícitamente que no
hace falta, es lo que vale la pena tener desde el primer día.&lt;/p&gt;
</content:encoded></item><item><title>Cómo rechazar una solicitud sin perder a la clienta</title><link>https://changeloop.dev/blog/es/declining-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/declining-feature-requests/</guid><description>Cerrar el círculo suele significar decir que algo se lanzó. La mitad difícil es decir que no, de una forma que no dañe la relación con la clienta.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cerrar el círculo suele significar decirle a alguien que su solicitud se lanzó. La mitad difícil,
para la que la mayoría de sistemas de seguimiento no tiene ningún proceso, es decir que no. La
mayoría de las solicitudes de funciones nunca se lanzan, lo que significa que la mayor parte del
cierre de círculo que un producto realmente debe a sus usuarias es un rechazo, no un anuncio, y un
rechazo mal gestionado cuesta más buena voluntad de la que habría costado el silencio. Bien
gestionado, puede costar casi nada, porque lo que la mayoría de quienes solicitan algo quieren de
verdad es saber que fueron escuchadas, no la función en sí.&lt;/p&gt;
&lt;h2&gt;¿Por qué importa rechazar bien tanto como lanzar bien?&lt;/h2&gt;
&lt;p&gt;Porque el silencio se lee como un rechazo sin explicación, y un no explicado se lee como atención.
Quien no oye nada asume que su solicitud fue ignorada o se perdió, y ambas conclusiones le enseñan
a dejar de molestarse en preguntar, que es el mismo resultado que obtiene un producto con un
rechazo real, solo que llega más despacio y con más resentimiento por el camino. Una respuesta que
dice que no, con claridad y con un motivo, cierra el círculo tan completamente como una función
lanzada, y lo hace más rápido.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Respuesta&lt;/th&gt;
&lt;th&gt;Qué aprende quien pidió&lt;/th&gt;
&lt;th&gt;Coste para la relación&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Silencio&lt;/td&gt;
&lt;td&gt;Nadie leyó, o a nadie le importa&lt;/td&gt;
&lt;td&gt;Alto, y se acumula con cada futura solicitud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Respuesta automática sin motivo&lt;/td&gt;
&lt;td&gt;Está en cola en algún lugar, indefinidamente&lt;/td&gt;
&lt;td&gt;Medio; gana tiempo pero no confianza&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rechazo con motivo&lt;/td&gt;
&lt;td&gt;Se leyó, se consideró y se respondió&lt;/td&gt;
&lt;td&gt;Bajo, si el motivo es honesto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rechazo con alternativa&lt;/td&gt;
&lt;td&gt;La necesidad real fue realmente escuchada&lt;/td&gt;
&lt;td&gt;El más bajo; suele generar confianza&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué hace que un rechazo caiga mal?&lt;/h2&gt;
&lt;p&gt;Casi siempre tres cosas, combinadas. Genericidad: un &amp;quot;gracias por tu feedback&amp;quot; enlatado que no
menciona qué se pidió realmente se lee como si no se hubiera leído en absoluto, aunque sí se haya
leído. Retraso: un rechazo que llega seis meses después de la solicitud, cuando quien preguntó ya
olvidó haberlo hecho, se siente peor que un no rápido, porque implica que la solicitud estuvo
parada en vez de considerada y rechazada. Y un motivo que no aguanta: &amp;quot;no está en nuestro roadmap&amp;quot;
no responde nada, mientras que &amp;quot;esto requeriría rediseñar cómo funcionan los permisos, y no
planeamos tocar eso este año&amp;quot; le da a quien preguntó algo que realmente puede evaluar y, si le
importa lo suficiente, escalar o rodear.&lt;/p&gt;
&lt;h2&gt;¿Qué debería decir realmente un buen rechazo?&lt;/h2&gt;
&lt;p&gt;Cuatro cosas, en este orden: un reconocimiento que nombre la solicitud concreta, no una paráfrasis
genérica; el motivo real, dicho con honestidad incluso cuando el motivo honesto es &amp;quot;esto no encaja
con hacia dónde va el producto&amp;quot; en vez de una excusa más suave; si la puerta está cerrada o
simplemente no está abierta ahora, porque eso necesita tonos muy distintos; y, cuando exista, una
alternativa que atienda la necesidad subyacente aunque no sea la función pedida literalmente.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Hola Jamie,

Gracias por la solicitud de añadir importación masiva por CSV para
invitaciones de equipo. Lo revisamos, y no lo vamos a construir:
nuestro flujo de invitaciones se basa en revisar individualmente cada
miembro nuevo por seguridad, y la importación masiva iría en contra
de eso por diseño, no por descuido.

Si el problema real es invitar a un equipo grande rápido, la API
soporta invitaciones individuales por script, lo que te da casi toda
la velocidad sin saltarte la revisión: [enlace]. Avísame si quieres
ayuda para configurarlo.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fíjate en lo que hace esto que una plantilla no puede: nombra la función real, da un motivo ligado
a una decisión de diseño real en vez de una política vaga, y ofrece un camino que resuelve el
problema subyacente en vez de solo cerrar el ticket.&lt;/p&gt;
&lt;h2&gt;¿En qué se diferencia de cerrar el círculo con una función lanzada?&lt;/h2&gt;
&lt;p&gt;La mecánica es parecida, el tono no. &lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;Cerrar el círculo de feedback con el cliente&lt;/a&gt;
cubre el caso lanzado, donde el mensaje son buenas noticias y el riesgo principal es olvidar
enviarlo. Un rechazo son malas noticias, o al menos noticias no deseadas, y necesita más cuidado en
el motivo dado y menos automatización en la entrega: una notificación de función lanzada puede ser
un comentario con plantilla disparado por un cambio de estado, pero un rechazo que se lee como
plantilla es exactamente el fallo que este enfoque entero intenta evitar. Ambos comparten un
requisito, eso sí: la solicitud original tiene que seguir vinculada a quien la hizo, la misma
disciplina de seguimiento que cubre &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-tracking/&quot;&gt;seguimiento de solicitudes de funciones&lt;/a&gt;,
o no hay forma de enviar ninguno de los dos mensajes individualmente.&lt;/p&gt;
&lt;h2&gt;¿Debería un rechazo ser público, como un estado en un roadmap público?&lt;/h2&gt;
&lt;p&gt;Normalmente el motivo concreto no, aunque el estado sí. &lt;a href=&quot;https://changeloop.dev/blog/es/public-roadmap/&quot;&gt;Roadmap público&lt;/a&gt;
cubre etiquetas de estado que quien pidió algo puede consultar sin volver a preguntar, y un estado
&amp;quot;rechazado&amp;quot; o &amp;quot;no planeado&amp;quot; puede formar parte de ese sistema. Pero el motivo detallado, sobre
todo cuando toca prioridades internas o contexto poco favorecedor, suele valer más en la respuesta
individual que en una página de estado pública, donde la misma redacción tiene que funcionar para
cada lectora en vez de para la única persona que realmente preguntó.&lt;/p&gt;
&lt;h2&gt;¿Merece cada solicitud rechazada una respuesta individual?&lt;/h2&gt;
&lt;p&gt;Toda solicitud de una persona nombrada y contactable sí, al menos una breve. Solicitudes de alto
volumen, duplicadas o anónimas son la excepción: agrupar solicitudes similares y responder una vez
por grupo, o actualizar una etiqueta de estado compartida, es razonable cuando las respuestas
individuales de verdad no escalan. La línea a mantener es que &amp;quot;no podemos responder a todos
individualmente&amp;quot; debería ser una restricción operativa real, comprobada contra el volumen real, no
una excusa por defecto para saltarse una respuesta que habría tomado dos minutos.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Es mejor rechazar rápido con un motivo débil, o tomarse tiempo para uno bueno?&lt;/strong&gt;
Rápido, con un motivo honesto, gana a cualquiera de los dos por separado. Una respuesta rápida con
un motivo real, aunque sea breve, supera a una respuesta lenta con uno pulido; el propio retraso
es parte de lo que daña la confianza.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería un rechazo prometer alguna vez revisar la solicitud más adelante?&lt;/strong&gt;
Solo si es realmente probable y hay un mecanismo para revisarla de verdad, como una etiqueta que
la haga resurgir en un ciclo de planificación. Un vago &amp;quot;lo tendremos en cuenta&amp;quot; sin ese mecanismo
es funcionalmente lo mismo que el silencio, solo que dicho con más amabilidad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Y si el motivo honesto es algo que la empresa no puede compartir, como una preocupación competitiva?&lt;/strong&gt;
Dilo directamente en vez de inventar un motivo más suave. &amp;quot;No podemos compartir el razonamiento
concreto aquí, pero esto no es algo que planeemos construir&amp;quot; es más honesto, y se respeta más, que
una explicación inventada que se cae ante una pregunta de seguimiento.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Rechazar una solicitud significa que debería borrarse del seguimiento?&lt;/strong&gt;
No. Consérvala, etiquetada como rechazada con el motivo, para que forme parte del patrón contra el
que se agrupa la siguiente solicitud similar, y para que un contexto cambiado más adelante (una
nueva integración, una nueva prioridad de equipo) pueda hacerla resurgir en vez de empezar la
evaluación de cero.&lt;/p&gt;
</content:encoded></item><item><title>Notas de versión de feature flags: qué decir, y cuándo</title><link>https://changeloop.dev/blog/es/feature-flags-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/feature-flags-feature-requests/</guid><description>Las notas de versión de feature flags separan fusionar y lanzar, que con un flag ya no coinciden. Cerrar el ciclo antes anuncia una función invisible.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cerrar el ciclo de una solicitud de función asume un momento limpio en el que la cosa se lanzó. Un feature flag elimina ese momento, y por eso las notas de versión de feature flags son tan difíciles de sincronizar. El código se fusiona, el flag existe, y durante días o semanas
después la función está a la vez viva en producción e invisible para casi todos los que podrían
querer usarla, incluyendo, a menudo, a la persona que la pidió originalmente. Avisar demasiado
pronto la lleva a toparse con una función que todavía no está ahí. Avisar demasiado tarde hace que
el ciclo que se suponía iba a generar confianza se lea, en cambio, como olvidado.&lt;/p&gt;
&lt;h2&gt;¿Por qué un flag rompe la secuencia habitual de &amp;quot;lanzarlo, avisar&amp;quot;?&lt;/h2&gt;
&lt;p&gt;Porque divide un evento en al menos dos: el código volviéndose vivo, y el flag activándose para
una cuenta concreta. Todo proceso para cerrar un ciclo de feedback asume que esas dos cosas pasan
juntas, lo cual es cierto para la mayoría de los lanzamientos y falso para cualquier cosa
controlada por un flag usado para despliegue escalonado, segmentación o como interruptor de
emergencia. &lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;Cerrar el ciclo de feedback del cliente&lt;/a&gt; describe
avisarle a quien pidió la función justo en el momento en que se aprueba y publica una entrada de
changelog; ese paso está escrito para el caso en que publicar la entrada y que la función sea
usable son el mismo momento, y un flag es exactamente el caso en que no lo son.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Momento&lt;/th&gt;
&lt;th&gt;Qué es cierto&lt;/th&gt;
&lt;th&gt;¿Debería avisarse ya a quien lo pidió?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Código fusionado, flag apagado en todas partes&lt;/td&gt;
&lt;td&gt;La función existe, nadie puede usarla&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag activado para la cuenta de quien lo pidió&lt;/td&gt;
&lt;td&gt;La función existe, esa persona específica puede usarla&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag activado para un porcentaje de despliegue que la excluye&lt;/td&gt;
&lt;td&gt;La función existe, esa persona todavía no puede usarla&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag eliminado por completo, la función simplemente está activa&lt;/td&gt;
&lt;td&gt;La función existe para todos&lt;/td&gt;
&lt;td&gt;Sí, si aún no se avisó&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuál es la regla real para saber cuándo avisar a alguien?&lt;/h2&gt;
&lt;p&gt;Avisar cuando el flag está activado para su cuenta, no cuando el código se fusiona ni cuando se
crea el flag. Esa única regla cubre cada fila de la tabla de arriba, porque ata el aviso al único
hecho que realmente le importa a quien lo pidió: si puede, en este momento, ir a usar la cosa. Un
aviso atado a la fusión o a la creación del flag es en realidad un reporte de avance de
ingeniería, y quien pidió una función no quiere un reporte de avance, quiere saber cuándo ir a
mirar.&lt;/p&gt;
&lt;h2&gt;¿Eso significa que quien lo pidió necesita acceso anticipado o especial?&lt;/h2&gt;
&lt;p&gt;No necesariamente, y forzarlo crea su propio problema. Si el flag se está desplegando
gradualmente por razones de carga o estabilidad, mover una cuenta al frente de la cola solo para
cerrar un ciclo más rápido socava la razón por la que el despliegue está escalonado en primer
lugar. Las opciones honestas son: esperar a que la cuenta de quien lo pidió llegue al despliegue
de forma natural y avisarle entonces, o, si la urgencia lo justifica, activarle el flag antes de
forma deliberada, como una decisión real de quien sea dueño del despliegue, no como efecto
secundario de querer mandar un aviso.&lt;/p&gt;
&lt;h2&gt;¿Y si el flag es un interruptor de emergencia, no un mecanismo de despliegue?&lt;/h2&gt;
&lt;p&gt;Entonces la suposición segura se invierte. Un flag pensado para poder desactivar rápidamente una
función, en vez de escalonar su lanzamiento, suele significar que la función está pensada para
estar completamente activa en cuanto se crea, y el flag existe por seguridad, no por secuencia. En
ese caso, avisar a quien lo pidió en el momento del despliegue es correcto, igual que en cualquier
lanzamiento sin flag; la existencia del flag es un detalle operativo que no debería cambiar cuándo
se cierra el ciclo. La distinción que importa es para qué está el flag, no si existe uno.&lt;/p&gt;
&lt;h2&gt;¿El flag cambia lo que deberían decir las notas de versión de feature flags?&lt;/h2&gt;
&lt;p&gt;Cambia cuándo se publica, no lo que contiene. Una entrada publicada en el momento en que el flag
está activo para el 100 % de las cuentas se lee exactamente como una entrada de changelog normal,
y así debe ser; quien la encuentre después no tiene motivo para saber que alguna vez hubo un flag
de por medio. Lo que no debería hacer es publicarse mientras el flag solo está activo para un
pequeño porcentaje de despliegue, porque una entrada pública de changelog manda a todo el que la
lea, incluyendo cuentas sin el flag, a buscar una función que no van a encontrar, lo cual es una
versión peor del mismo problema, a escala de todo el producto en vez de a escala de quien lo pidió.
Esa regla de tiempos es toda la diferencia entre las notas de versión de feature flags y una entrada
normal: el contenido es el mismo, solo cambia la fecha de publicación.
&lt;a href=&quot;https://changeloop.dev/blog/es/how-to-write-release-notes/&quot;&gt;Cómo escribir notas de versión&lt;/a&gt; cubre la disciplina de &amp;quot;no
se necesita ninguna acción&amp;quot; que también aplica aquí: hay que decirle a quien lee si esto le aplica
a ella, no solo que existe en algún lugar.&lt;/p&gt;
&lt;h2&gt;¿Los emails de novedades del producto deberían tratar distinto a una función con flag?&lt;/h2&gt;
&lt;p&gt;Sí, sobre todo retrasándola en vez de reescribirla. &lt;a href=&quot;https://changeloop.dev/blog/es/product-update-email/&quot;&gt;La plantilla de email de novedades del
producto&lt;/a&gt; cubre las notificaciones dirigidas frente a los resúmenes
amplios; una función con flag es un caso en el que el momento de una notificación dirigida hay que
verificarlo contra el propio estado del flag de quien la recibe antes de enviarla, algo que un
resumen amplio no puede hacer fácilmente en absoluto, lo cual es una razón más por la que un
resumen es el canal equivocado para cualquier cosa que sigue a mitad de despliegue.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Debería decirle a quien lo pidió que su función &amp;quot;está por llegar&amp;quot; en cuanto el flag existe pero no está activo para ella?&lt;/strong&gt;
Solo si hay una fecha real y cercana adjunta, y aun así con moderación. Un &amp;quot;está por llegar&amp;quot; sin
fecha se lee, pasado suficiente tiempo, igual que el silencio, y crea una segunda promesa que
también hay que rastrear y cumplir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Quién decide cuándo un flag está lo bastante avanzado como para cerrar el ciclo?&lt;/strong&gt;
Quien sea dueño del despliegue, no quien sea dueño de la notificación. Quien tiene el despliegue
sabe si el &amp;quot;100 % de las cuentas&amp;quot; está a punto de llegar o todavía a semanas; atar el paso de
cerrar el ciclo a su estado, en vez de a una fecha fija de calendario, mantiene honesto el aviso.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Una función tras un flag permanente (que nunca se elimina del todo) llega a tener una entrada pública de changelog?&lt;/strong&gt;
Sí, en cuanto alcanza lo que sea que &amp;quot;disponibilidad general&amp;quot; signifique para ese producto, aunque
el flag en sí se quede en el código para siempre por razones operativas. La entrada de changelog
trata sobre la disponibilidad para quien lee, no sobre el detalle de implementación de cómo se
logra esa disponibilidad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Y si el flag se elimina y la función se mata en lugar de lanzarse?&lt;/strong&gt;
Eso es un rechazo, no un aviso de lanzamiento, y merece el mismo cuidado que cualquier otro
rechazo. &lt;a href=&quot;https://changeloop.dev/blog/es/declining-feature-requests/&quot;&gt;Cómo rechazar una solicitud de función&lt;/a&gt; cubre qué
debe decir ese mensaje; cerrar el ciclo con honestidad a veces significa cerrarlo con un no.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Las notas de versión de feature flags necesitan una plantilla distinta de una entrada normal?&lt;/strong&gt;
Ningún cambio de plantilla, solo un paso de verificación antes de publicar: comprobar el estado del
flag para la cuenta que preguntó, no solo que el código se fusionó, y retener la entrada hasta que
esa comprobación pase. Todo lo demás sobre la entrada, la redacción, la longitud, la disciplina de
FAQ, sigue igual que en cualquier otra nota de versión.&lt;/p&gt;
</content:encoded></item><item><title>Seguimiento de solicitudes de funciones, sin perderlas</title><link>https://changeloop.dev/blog/es/feature-request-tracking/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/feature-request-tracking/</guid><description>El seguimiento de solicitudes de funciones suele fallar de dos formas: no llegan a ningún sitio, o a uno que nadie mira. Un sistema que resiste ambas.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;El seguimiento de solicitudes de funciones falla casi siempre de una de dos formas. O las
solicitudes no tienen adónde ir, así que viven en bandejas de entrada y hilos de Slack donde se
olvidan una a una, o tienen un sitio al que ir que nadie vuelve a revisar, así que se olvidan
todas juntas. Un sistema que funciona tiene que resistir ambos fallos: necesita un único lugar
donde caiga cada solicitud, y una razón para volver a abrir ese lugar el mes que viene.&lt;/p&gt;
&lt;h2&gt;¿De dónde vienen realmente las solicitudes de funciones?&lt;/h2&gt;
&lt;p&gt;De más canales de los que la mayoría de los sistemas de seguimiento contemplan. Un ticket de
soporte que incluye un &amp;quot;estaría bien si&amp;quot;. Un comentario en una roadmap pública. Una llamada de
ventas donde una candidata nombra la única cosa que bloquea el trato. Un widget dentro del
producto. Cada canal tiene su propia dueña y sus propias herramientas, y por eso las solicitudes
se dispersan: la cola de tickets de soporte y el backlog del equipo de producto rara vez son el
mismo sistema, y una solicitud que solo llega a uno de los dos, en la práctica, solo llegó a un
departamento.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Origen&lt;/th&gt;
&lt;th&gt;Dueña habitual&lt;/th&gt;
&lt;th&gt;Dónde suele morir&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tickets de soporte&lt;/td&gt;
&lt;td&gt;Equipo de soporte&lt;/td&gt;
&lt;td&gt;Cerrado como resuelto, nunca revisado de nuevo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llamadas de ventas&lt;/td&gt;
&lt;td&gt;Ventas / gestión de cuentas&lt;/td&gt;
&lt;td&gt;Un campo del CRM que nadie en producto lee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Widget en el producto&lt;/td&gt;
&lt;td&gt;Producto&lt;/td&gt;
&lt;td&gt;Un formulario enviado sin seguimiento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comentarios en la roadmap&lt;/td&gt;
&lt;td&gt;Quien haya construido la roadmap&lt;/td&gt;
&lt;td&gt;El propio hilo de comentarios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redes sociales / reseñas&lt;/td&gt;
&lt;td&gt;Marketing o nadie&lt;/td&gt;
&lt;td&gt;Capturado una vez y luego olvidado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Un único formulario de entrada para cada canal no funciona, porque nadie lo adopta. Lo que funciona
es un destino al que cada canal encamine, aunque el enrutamiento sean cinco minutos diarios de
copiar y pegar hasta que se automatice.&lt;/p&gt;
&lt;h2&gt;¿Qué es lo que realmente rompe el seguimiento de solicitudes?&lt;/h2&gt;
&lt;p&gt;Casi siempre dos cosas. La primera es un destino inexistente: las solicitudes se responden en el
canal donde llegaron y nunca quedan registradas en ningún sitio duradero, así que la misma
solicitud de tres clientes distintos parece tres respuestas puntuales sin relación en vez de una
sola señal. La segunda, más frecuente, es un destino que se llena y deja de leerse. Una hoja de
cálculo con 400 filas sin filtrar ya no es un sistema de seguimiento; es un archivo que resulta
ser escribible.&lt;/p&gt;
&lt;p&gt;El segundo fallo es el más peligroso, porque parece que el seguimiento funciona. Las solicitudes
se registran. Nada parece roto hasta que alguien pregunta &amp;quot;cuántas personas han pedido X&amp;quot; y la
respuesta honesta es &amp;quot;tendríamos que leer las 400 filas para saberlo&amp;quot;.&lt;/p&gt;
&lt;h2&gt;¿Qué debería registrar realmente una solicitud de función?&lt;/h2&gt;
&lt;p&gt;Lo suficiente para responder tres preguntas más adelante sin releer el mensaje original: qué se
pidió, a ser posible con las propias palabras de quien lo pidió; quién lo pidió, y cómo
contactarla si la respuesta acaba siendo &amp;quot;lo construimos&amp;quot;; y qué haría falta para saber si es
una petición habitual o un caso aislado. Una cita textual vale más que una paráfrasis, porque una
paráfrasis escrita por quien triagió la solicitud ya lleva su propia lectura incorporada, y esa
lectura es justo lo que una segunda persona no puede comprobar seis meses después.&lt;/p&gt;
&lt;h2&gt;¿Qué etiquetas merecen la pena?&lt;/h2&gt;
&lt;p&gt;Dos, y responden preguntas distintas. Una etiqueta de &lt;strong&gt;tipo&lt;/strong&gt; separa una solicitud de función de
un reporte de error, porque ambos necesitan dueñas y plazos distintos, y mezclarlos en una sola
cola deja que las quejas más ruidosas desplacen a las peticiones. Una etiqueta de &lt;strong&gt;prioridad&lt;/strong&gt;,
reducida a un conjunto pequeño como low, medium y high, separa &amp;quot;bloquea a alguien el uso del
producto&amp;quot; de &amp;quot;estaría bien&amp;quot;, porque ambas merecen tiempos de respuesta muy distintos y ninguna
debería heredar el ritmo de la otra. Poner bien la
etiqueta de &lt;strong&gt;tipo&lt;/strong&gt; asume que la solicitud es lo que dice ser; &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-vs-bug-report/&quot;&gt;cuando una solicitud de función
es en realidad un bug&lt;/a&gt; cubre el caso en que las propias
palabras de una clienta apuntan esa etiqueta en la dirección equivocada.&lt;/p&gt;
&lt;p&gt;El triaje automatizado puede aplicar ambas en el momento en que llega la solicitud. En
changeloop, un envío desde el widget recibe la etiqueta &lt;code&gt;feature-request&lt;/code&gt; o &lt;code&gt;bug&lt;/code&gt; y una etiqueta
&lt;code&gt;priority:low|medium|high&lt;/code&gt; en el mismo paso, más una marca &lt;code&gt;from-widget&lt;/code&gt; para que el origen sea
visible sin abrir el elemento. Eso basta para filtrar el backlog en un minuto en lugar de una
tarde: muéstrame cada solicitud de función de alta prioridad llegada por el widget este mes.&lt;/p&gt;
&lt;p&gt;Una tercera etiqueta merece la pena en cuanto existe una roadmap pública: un estado que la
persona que pidió algo pueda comprobar por su cuenta. &lt;a href=&quot;https://changeloop.dev/blog/es/public-roadmap/&quot;&gt;Roadmap pública&lt;/a&gt;
cubre por completo los estados planned, building y shipped; en resumen, esa etiqueta convierte
una cola privada en algo que quien pidió algo puede consultar sin volver a preguntar.&lt;/p&gt;
&lt;h2&gt;¿Cómo se decide qué construir a continuación?&lt;/h2&gt;
&lt;p&gt;Agrupar antes de contar. Diez solicitudes formuladas de forma distinta para la misma capacidad
subyacente se leen como diez filas dispersas en una hoja de cálculo, y como una señal fuerte en
cuanto se agrupan, y esa agrupación suele ser el paso que falta, no el conteo. Un conteo en bruto
sin agrupar tiende a premiar la función con el nombre más pegadizo, no la que tiene más demanda
real detrás.&lt;/p&gt;
&lt;p&gt;Ponderar por quién pide, no solo por cuántos piden. Una solicitud de una cuenta cerca de renovar
lleva una urgencia distinta a la misma solicitud de un registro de prueba, y un sistema de
seguimiento que descarta ese contexto a favor de un recuento desnudo está optimizando por el
número más fácil de calcular, no por el más útil.&lt;/p&gt;
&lt;p&gt;Cada decisión aquí también produce solicitudes que pierden, y esas merecen respuesta también;
&lt;a href=&quot;https://changeloop.dev/blog/es/declining-feature-requests/&quot;&gt;cómo rechazar una solicitud de función&lt;/a&gt; cubre qué decir a
quienes no lograron que su petición saliera adelante. Agrupar y ponderar es solo la mitad de &amp;quot;qué
construir a continuación&amp;quot;; &lt;a href=&quot;https://changeloop.dev/blog/es/prioritizing-feature-requests/&quot;&gt;cómo priorizar solicitudes de funciones&lt;/a&gt;
cubre los marcos reales, RICE, ponderación por ingresos y recuentos brutos, y dónde falla cada uno.&lt;/p&gt;
&lt;h2&gt;¿Cómo se cierra el círculo cuando algo se lanza?&lt;/h2&gt;
&lt;p&gt;Este es el paso que los sistemas de seguimiento más se saltan, y el que quienes pidieron algo
realmente notan. &lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;Cerrar el círculo de feedback con el cliente&lt;/a&gt;
cubre la mecánica completa; lo que corresponde aquí es que cerrar el círculo solo funciona si la
solicitud original quedó vinculada a la persona. Una plantilla de solicitud de función construida
a partir de un issue de GitHub, con la identidad de quien pidió el cambio ligada al propio issue
en lugar de enterrada en un comentario, es lo que hace posible una notificación automática de
&amp;quot;lanzado&amp;quot; en vez de una que alguien tiene que recordar enviar. &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-template/&quot;&gt;Plantilla de solicitud de función&lt;/a&gt;
muestra la plantilla concreta y para qué sirve cada campo.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Qué herramienta debería usar para el seguimiento de solicitudes de funciones?&lt;/strong&gt;
Lo que el equipo ya revisa a diario supera a cualquier herramienta dedicada que nadie abre. Un
tracker de issues de GitHub funciona bien si ingeniería ya vive ahí; un tablero ligero funciona
bien si producto vive ahí. La herramienta importa menos que si se vuelve a consultar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo evito que se dupliquen las solicitudes de funciones?&lt;/strong&gt;
Agrupar por capacidad subyacente antes de triagiar por redacción. Buscar entre las solicitudes
existentes antes de crear una nueva atrapa la mayoría de los duplicados; una agrupación mensual
atrapa el resto.
&lt;a href=&quot;https://changeloop.dev/blog/es/duplicate-feature-requests/&quot;&gt;Fusionar duplicados sin perder la voz original&lt;/a&gt; cubre qué
hacer con la redacción una vez hecha la agrupación en sí, para que la fusión no estreche en
silencio la solicitud a lo que fuera que pidiera la primera petición en llegar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Toda solicitud de función debería recibir respuesta?&lt;/strong&gt;
Toda debería recibir un acuse de recibo, aunque sea breve, pero no toda necesita una decisión de
inmediato. Un estado visible, como una etiqueta de roadmap que la persona pueda comprobar por su
cuenta, sustituye la mayoría de las respuestas individuales que un equipo debería dar de otro
modo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la diferencia entre el seguimiento de solicitudes y una roadmap pública?&lt;/strong&gt;
El seguimiento es el registro interno de cada petición, incluidas las que nunca se lanzarán. Una
roadmap pública es el subconjunto al que un equipo se compromete públicamente, con un estado que
quien pidió algo puede ver sin volver a preguntar.&lt;/p&gt;
</content:encoded></item><item><title>Cuando una solicitud de función es en realidad un bug</title><link>https://changeloop.dev/blog/es/feature-request-vs-bug-report/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/feature-request-vs-bug-report/</guid><description>Un ticket que pide un nuevo ajuste puede ser un workaround para un bug oculto. La etiqueta equivocada la manda a la dueña y la cola equivocadas.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;quot;¿Podéis añadir un ajuste para aumentar el límite de exportación?&amp;quot; se lee como una solicitud de
función, y la mayoría de sistemas de triaje la etiquetan así en el acto. A veces lo es. A veces la
exportación falla en un número por debajo del límite documentado por culpa de un bug, y la
clienta, incapaz de ver el código, se ha inventado la solución más plausible que puede describir:
dadme un número más grande y a lo mejor funciona. &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-tracking/&quot;&gt;Qué etiquetas merecen la
pena&lt;/a&gt; cubre la etiqueta de tipo que divide un backlog en
solicitudes de función y bugs; este es el caso en que las propias palabras de una clienta apuntan
la etiqueta en la dirección equivocada, y el coste de equivocarse es una deriva lenta hacia un
backlog lleno de peticiones que nadie quiere de verdad en cuanto se mira debajo.&lt;/p&gt;
&lt;h2&gt;¿Cómo es una solicitud de función que en realidad es un bug?&lt;/h2&gt;
&lt;p&gt;Nombra un workaround en vez del problema. Una solicitud de función genuina suele describir un
resultado que el producto no soporta en absoluto: &amp;quot;dejadme programar esto para más tarde&amp;quot;,
&amp;quot;añadid un modo oscuro&amp;quot;. Un bug mal clasificado describe un número, umbral o comportamiento
específico que suena a ajuste faltante pero en realidad es un síntoma: &amp;quot;aumentad el timeout&amp;quot;,
&amp;quot;añadid una opción de reintento&amp;quot;, &amp;quot;dejadme exportar más filas de una vez&amp;quot;. La señal es que quien
lo pide propone una implementación, un ajuste, un interruptor, una anulación, en vez de describir
un objetivo, porque ya probó la función tal como está documentada y no hizo lo que la
documentación dice que debería.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Señal&lt;/th&gt;
&lt;th&gt;Solicitud de función&lt;/th&gt;
&lt;th&gt;Bug disfrazado de solicitud de función&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Qué describe quien lo pide&lt;/td&gt;
&lt;td&gt;Un resultado que el producto no puede hacer&lt;/td&gt;
&lt;td&gt;Un parámetro que quiere cambiar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Si el comportamiento documentado ya cubre esto&lt;/td&gt;
&lt;td&gt;No, falta de verdad&lt;/td&gt;
&lt;td&gt;Sí, pero no funciona como está documentado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Si más esfuerzo hace que la petición desaparezca&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;A veces, si el bug depende de un umbral&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adónde debería enrutarse&lt;/td&gt;
&lt;td&gt;Backlog de producto&lt;/td&gt;
&lt;td&gt;Cola de bugs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Por qué importa esto más de lo que parece?&lt;/h2&gt;
&lt;p&gt;Porque las dos colas tienen dueñas, plazos y criterios de éxito distintos, y un bug archivado como
solicitud de función se prioriza frente a solicitudes de función, compitiendo por atención con
lagunas de producto reales en vez de arreglarse en el plazo que merece un bug. &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-tracking/&quot;&gt;Cómo rastrear
solicitudes de función&lt;/a&gt; cubre por qué mezclar bugs y funciones
en una sola cola deja que las quejas más ruidosas desplacen a las peticiones reales; una solicitud
de función que en secreto es un bug causa el daño contrario, se queda en el backlog de producto
acumulando votos para una &amp;quot;función&amp;quot; que desaparecería en cuanto se arreglara el bug de fondo, lo
que desperdicia la señal de priorización para todo el que lea ese backlog.&lt;/p&gt;
&lt;h2&gt;¿Cómo se distingue cuando las propias palabras de la clienta apuntan en la dirección equivocada?&lt;/h2&gt;
&lt;p&gt;Pregunta qué esperaba que pasara, no qué quiere que añadáis. &amp;quot;La exportación se topó en 500 filas
y necesito 2.000, ¿podéis subir el límite?&amp;quot; suena a solicitud de función de subida de límite hasta
que la pregunta de seguimiento, &amp;quot;¿500 es el límite documentado?&amp;quot;, revela que el número documentado
era 5.000 y la exportación falla antes de tiempo. Esa única pregunta, qué esperaba frente a qué
pasó, hace la mayor parte del trabajo de clasificación, porque una solicitud de función genuina no
tiene un comportamiento documentado del que quede por debajo; no hay nada que esperar porque la
capacidad todavía no existe.&lt;/p&gt;
&lt;h2&gt;¿Deberían decidir esto los agentes de soporte o las ingenieras?&lt;/h2&gt;
&lt;p&gt;Los agentes de soporte hacen la primera pasada, porque ven el ticket primero, pero la etiqueta
debería ser fácil de cambiar y barata de equivocar, no una decisión de una sola vez que fija el
elemento en la cola equivocada para siempre. Una segunda comprobación ligera, una ingeniera que
revise semanalmente las nuevas etiquetas de &amp;quot;solicitud de función&amp;quot; buscando algo que huela a bug
disfrazado, atrapa las que un agente de soporte sin contexto del código no podría haber
identificado. No hace falta que sea formal; es más un vistazo de cinco minutos que un proceso de
revisión.&lt;/p&gt;
&lt;h2&gt;¿Cambia el cierre del ciclo una vez encontrado el bug real?&lt;/h2&gt;
&lt;p&gt;Sí, y mejora el mensaje que podéis enviar. &lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;Cerrar el bucle de feedback del
cliente&lt;/a&gt; cubre avisar a quien pidió algo cuando se lanza; un bug
recategorizado recibe una versión mejor de ese mensaje, porque &amp;quot;encontramos y arreglamos el bug
detrás de esto&amp;quot; suena a competencia, mientras que &amp;quot;construimos la función que pediste&amp;quot; habría sido
cierto solo por accidente, porque la solicitud de función real, un límite de exportación de verdad
más alto, puede que nunca llegue a construirse una vez que el bug desaparece y el límite original
de 5.000 filas es suficiente.&lt;/p&gt;
&lt;h2&gt;¿Qué pasa si nunca se detecta la mala clasificación?&lt;/h2&gt;
&lt;p&gt;El backlog se llena de peticiones que parecen demanda real y no lo son, y las decisiones de
priorización tomadas contra ese backlog heredan la distorsión. Una &amp;quot;función&amp;quot; con cuarenta votos
podría ser en realidad cuarenta personas topándose con el mismo bug, y construir la petición
literal, un ajuste para subir un límite que nunca fue la verdadera restricción, entrega complejidad
que no arregla nada, mientras el bug de fondo sigue generando nuevas &amp;quot;solicitudes de función&amp;quot; de
clientas que aún no han encontrado este hilo.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Vale la pena añadir un paso formal para comprobar cada solicitud de función contra bugs conocidos?&lt;/strong&gt;
No un paso formal, más bien un hábito: quien triaje una nueva solicitud de función debería
preguntar &amp;quot;¿el comportamiento documentado ya dice que hace esto?&amp;quot; antes de poner la etiqueta,
porque esa sola pregunta atrapa la mayoría de las mal clasificadas sin añadir sobrecarga de
proceso.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Y si la clienta insiste en que es una solicitud de función incluso después de encontrar el bug?&lt;/strong&gt;
Explicad qué encontrasteis y por qué el ajuste que proponía ya no haría falta una vez arreglado el
bug. La mayoría de clientas piden un workaround porque asumieron que el arreglo real no estaba
disponible, no porque quisieran específicamente ese ajuste.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Un elemento recategorizado pierde los votos o comentarios que acumuló como solicitud de función?&lt;/strong&gt;
Debería conservarlos, visibles, porque esos votos son la evidencia que llevó a encontrar el bug en
primer lugar, y esconder ese rastro hace más difícil detectar la misma mala clasificación la
próxima vez, en un ticket distinto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede pasar al revés, un bug que en realidad es una solicitud de función?&lt;/strong&gt;
Menos a menudo, pero sí: &amp;quot;esto está roto&amp;quot; a veces significa &amp;quot;esto no hace lo que asumí que
haría&amp;quot;, que es una capacidad faltante, no un defecto. La misma pregunta, qué esperaba frente a qué
está documentado, clasifica también en esta dirección.&lt;/p&gt;
</content:encoded></item><item><title>Tickets de soporte vs. solicitudes: ¿en qué confías?</title><link>https://changeloop.dev/blog/es/feedback-signal-quality/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/feedback-signal-quality/</guid><description>Un ticket de soporte y un tablero de solicitudes miden cosas distintas, y tratar un pico en uno como equivalente al otro produce prioridades erróneas.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un tablero de solicitudes de funciones captura lo que las usuarias piden cuando tienen tiempo de
sentarse y describir lo que quieren. Un ticket de soporte captura en qué están atascadas las
usuarias ahora mismo, a menudo molestas, a menudo sin el vocabulario para describir con claridad
la solicitud subyacente. Ambos son señal real, y los equipos que solo miran uno de los dos terminan
resolviendo el problema equivocado con confianza, porque cada canal sobrerrepresenta
sistemáticamente un tipo distinto de usuaria y un tipo distinto de necesidad. &lt;a href=&quot;https://changeloop.dev/blog/es/prioritizing-feature-requests/&quot;&gt;Priorizar
solicitudes de funciones&lt;/a&gt; cubre clasificar lo que ya está
en el tablero; esto trata de la brecha entre lo que llega al tablero y lo que solo aparece jamás
como ticket de soporte.&lt;/p&gt;
&lt;h2&gt;¿Por qué el mismo problema subyacente aparecería en un canal y no en el otro?&lt;/h2&gt;
&lt;p&gt;Porque los dos canales tienen costos de activación distintos, y el tamaño de ese costo determina
quién lo supera. Presentar una solicitud de función requiere iniciativa: una usuaria tiene que
creer que vale la pena articular el pedido, encontrar el tablero, y escribir algo coherente, lo que
selecciona usuarias comprometidas y pacientes que ya están invertidas en el producto. Presentar un
ticket de soporte requiere casi ninguna iniciativa en comparación, a menudo solo un clic en &amp;quot;ayuda&amp;quot;
en medio de una tarea, lo que significa que captura usuarias frustradas en el momento, incluidas
las que nunca se habrían molestado con un tablero de solicitudes. Una brecha real en el producto
puede ser invisible en el tablero de funciones y ruidosa en soporte simplemente porque las usuarias
que la sufren son las menos propensas a presentar una solicitud formal.&lt;/p&gt;
&lt;h2&gt;¿El volumen de tickets sobre una función faltante significa lo mismo que el conteo de votos por ella?&lt;/h2&gt;
&lt;p&gt;No, porque miden poblaciones distintas bajo condiciones distintas. Una solicitud de función con
cien votos representa cien personas que se tomaron el tiempo de encontrar y apoyar un pedido
existente, lo que es una señal fuerte de demanda duradera y considerada. Cien tickets de soporte
sobre la misma brecha subyacente, presentados en el mismo período, probablemente representan
usuarias chocando contra un muro en el momento, algunas de las cuales lo olvidarían por completo
una vez pasada la fricción inmediata. Tratar ambos como señal equivalente de &amp;quot;cien personas quieren
esto&amp;quot; sobrepondera el volumen de tickets, porque los tickets son baratos de generar y los votos no.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tablero de solicitudes&lt;/th&gt;
&lt;th&gt;Tickets de soporte&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Requiere iniciativa para presentar&lt;/td&gt;
&lt;td&gt;Requiere casi ninguna&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Captura demanda considerada y duradera&lt;/td&gt;
&lt;td&gt;Captura frustración en el momento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sesga hacia usuarias comprometidas y pacientes&lt;/td&gt;
&lt;td&gt;Captura usuarias que nunca usarían el tablero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un conteo de votos es señal real de compromiso&lt;/td&gt;
&lt;td&gt;Un conteo de tickets refleja fricción, no siempre deseo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué significa que una función tenga tickets de soporte pero casi ningún voto en el tablero?&lt;/h2&gt;
&lt;p&gt;A menudo, que la solicitud existe pero las usuarias que la sufren no saben que el tablero existe,
no creen que votar sirva de algo, o chocan con el problema con tan poca frecuencia que no se
molestan en cambiar de canal para registrarlo formalmente. Esta es exactamente la población que un
tablero de solicitudes pierde estructuralmente, y un conteo bajo de votos aquí es evidencia de
una brecha de medición, no de poca demanda. Trata un grupo de tickets de soporte alrededor de una
función faltante como su propia señal digna de registrar tú misma en el tablero, en nombre de las
usuarias, en vez de desconfiar de los tickets, para que no sea invisible
para quien prioriza solo con conteos de votos.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;El tablero se lee como baja prioridad:
&amp;quot;Export to CSV&amp;quot;: 4 votos en 6 meses

Soporte cuenta una historia distinta:
&amp;quot;Export to CSV&amp;quot;: 31 tickets en el mismo período, cada
uno de una cuenta distinta, cada uno cerrado con &amp;quot;no
soportado actualmente, pasaremos el feedback&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Un pico en tickets de soporte siempre significa que el problema subyacente es una función faltante?&lt;/h2&gt;
&lt;p&gt;No, y aquí es donde los dos canales pueden engañar en la dirección opuesta. Un pico de tickets se
debe igual de a menudo a una interfaz confusa alrededor de una función que ya existe, a un error, o
a un cambio que salió sin explicación adecuada, nada de lo cual se resuelve construyendo algo
nuevo. Leer cada pico de tickets como &amp;quot;las usuarias quieren una función que no tenemos&amp;quot; produce un
roadmap lleno de cosas que en realidad eran brechas de documentación o problemas de usabilidad
disfrazados. El ticket de soporte te dice dónde está la fricción; no te dice por sí solo si la
solución es una función nueva, un cambio de interfaz, o un mejor artículo de ayuda, y confundir eso
desperdicia tiempo de ingeniería en la solución equivocada.&lt;/p&gt;
&lt;h2&gt;¿Cómo deberían combinarse realmente las dos señales al decidir qué construir?&lt;/h2&gt;
&lt;p&gt;Usa los tickets para encontrar dónde está la fricción, y usa el tablero de solicitudes, más
contacto directo donde el tablero esté flaco, para confirmar cómo se ve realmente el resultado
deseado. Un grupo de tickets identifica un problema real y sentido; rara vez especifica la
solución con precisión suficiente para construir contra ella, porque una usuaria frustrada en una
conversación de soporte describe síntomas, no especificaciones. El tablero de solicitudes, cuando
tiene suficientes votos sobre el mismo problema subyacente, tiende a llevar más del detalle de &amp;quot;qué
satisfaría esto en realidad&amp;quot;, porque escribir una solicitud ya es un acto de especificar lo que se
quiere, no solo reportar lo que está mal.&lt;/p&gt;
&lt;h2&gt;¿Deberían las agentes de soporte registrar tickets como solicitudes de funciones ellas mismas?&lt;/h2&gt;
&lt;p&gt;Sí, y este es el arreglo de mayor apalancamiento para la brecha entre los dos canales. Una agente
que reconoce un ticket como una solicitud de función disfrazada, en vez de solo resolverlo y
seguir adelante, puede registrarlo en el tablero en nombre de la clienta, lo que cierra la brecha
de medición directamente en vez de exigir que la clienta descubra y use un segundo canal. Esto solo
funciona si registrar toma segundos, no minutos, para la agente, para que la fricción de hacerlo
sea menor que la fricción de simplemente cerrar el ticket y pasar al siguiente.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían descontarse los votos de solicitudes de funciones si todos vienen de una misma cuenta o equipo?&lt;/strong&gt;
Sí, ponderar por cuentas u organizaciones distintas en vez de por conteo bruto de votos, porque
cinco votos de cinco personas en la misma empresa representan las prioridades de una clienta, no
cinco confirmaciones independientes de demanda.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Vale la pena construir una función que aparece mucho en tickets pero casi no tiene votos?&lt;/strong&gt;
A menudo sí, siempre que el volumen de tickets venga genuinamente de cuentas distintas y la
necesidad subyacente esté confirmada en vez de asumida; trata el conteo bajo de votos como un
artefacto de medición del costo de activación del tablero, no como evidencia de que la demanda no
es real.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo distinguir a simple vista un ticket de confusión de interfaz de un ticket genuino de función faltante?&lt;/strong&gt;
Mira si la resolución consiste en explicar una capacidad existente o disculparse por una faltante.
Un patrón de resoluciones &amp;quot;ah, en realidad está justo ahí&amp;quot; apunta a un problema de interfaz o de
descubribilidad; un patrón de &amp;quot;eso todavía no lo soportamos&amp;quot; apunta a una brecha real.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Importa tanto esta distinción con un volumen de soporte muy pequeño?&lt;/strong&gt;
Menos mecánicamente, ya que un puñado de tickets es fácil de leer individualmente sin necesitar
análisis agregado, pero el sesgo subyacente, los tickets sobrerrepresentan usuarias frustradas y
subrrepresentan a las pacientes, está presente en cualquier escala y vale la pena tenerlo en mente
incluso cuando lees cada ticket tú misma.&lt;/p&gt;
</content:encoded></item><item><title>Tags de git, lanzamientos y tu changelog</title><link>https://changeloop.dev/blog/es/git-tags-releases-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/git-tags-releases-changelog/</guid><description>Un tag de git, un lanzamiento y una entrada de changelog son tres registros de un evento. Confundirlos desvía el changelog. Cómo deben encajar.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un tag de git, un lanzamiento y una entrada de changelog son tres registros distintos del mismo
evento, y confundirlos hace que un changelog se desvíe en silencio de lo que realmente se lanzó.
Un tag marca un commit. Un lanzamiento empaqueta ese tag con artefactos y una descripción. Una
entrada de changelog explica, en términos que puede usar una lectora fuera del repositorio, qué
cambió. Suelen ocurrir muy cerca en el tiempo, y precisamente por eso es fácil tratarlos como un
solo paso en vez de tres, y precisamente por eso la brecha solo se hace visible meses después,
cuando alguien pregunta &amp;quot;qué se lanzó en v2.4&amp;quot; y la respuesta honesta requiere excavar de verdad.&lt;/p&gt;
&lt;h2&gt;¿Cuál es la diferencia real entre los tres?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Registro&lt;/th&gt;
&lt;th&gt;Vive en&lt;/th&gt;
&lt;th&gt;Escrito para&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tag de git&lt;/td&gt;
&lt;td&gt;El repositorio, como referencia&lt;/td&gt;
&lt;td&gt;Quien haga checkout de ese commit exacto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lanzamiento&lt;/td&gt;
&lt;td&gt;El hospedador de código (GitHub, GitLab)&lt;/td&gt;
&lt;td&gt;Quien descargue un build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entrada de changelog&lt;/td&gt;
&lt;td&gt;El propio changelog del producto&lt;/td&gt;
&lt;td&gt;Quien use el producto, no solo el repo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Un tag es el más mecánico de los tres: &lt;code&gt;git tag v2.4.0&lt;/code&gt; y listo, sin ningún requisito de que algo
explique qué contiene. Un lanzamiento añade una descripción y, normalmente, artefactos
descargables, y su audiencia sigue siendo desarrolladoras que saben qué es una página de
lanzamiento. Una entrada de changelog es el único de los tres escrito para una lectora que quizá
nunca abra el repositorio, por lo que es el que necesita más atención editorial y el más propenso
a saltarse bajo presión de plazos.&lt;/p&gt;
&lt;h2&gt;¿Necesita cada tag de git una entrada de changelog?&lt;/h2&gt;
&lt;p&gt;No, y tratarlos como uno a uno es un error habitual. Un tag puede marcar un hito interno, un
release candidate, o un hotfix que nunca llega a la mayoría de usuarias; ninguno de esos
necesariamente necesita una entrada pública. La prueba es la misma que decide si algo pertenece a
un changelog: si una usuaria o quien llama lo notaría o le importaría. La mayoría de tags pasan
esa prueba. Algunos, como un tag creado solo para disparar una pipeline de CI, nunca.&lt;/p&gt;
&lt;h2&gt;¿Necesita cada entrada de changelog su propio tag?&lt;/h2&gt;
&lt;p&gt;No siempre, y aquí es donde divergen los equipos que despliegan continuamente de los que lanzan
paquetes versionados. Un producto SaaS que despliega varias veces al día puede agrupar varios
despliegues bajo una entrada de changelog datada sin un tag 1:1 por despliegue; una biblioteca
publicada en un registro de paquetes suele necesitar un tag por versión publicada. Los módulos de Go
y Swift Package Manager resuelven versiones a partir de los propios tags; en npm o PyPI el registro
guarda la versión publicada, y el tag es la forma de relacionar esa versión con su código fuente. Un
repositorio con varios paquetes versionados de forma independiente necesita decidir esto por
paquete, no una sola vez para todo el repo; &lt;a href=&quot;https://changeloop.dev/blog/es/monorepo-changelogs/&quot;&gt;changelogs de monorepo&lt;/a&gt;
cubre cómo deberían dividirse los prefijos de tag y el alcance del changelog según los límites de
paquete, no de carpeta.
&lt;a href=&quot;https://changeloop.dev/blog/es/semantic-versioning-changelog/&quot;&gt;Semantic versioning y tu changelog&lt;/a&gt; cubre cómo debería
mapearse el número de versión a las categorías de changelog; los tags son el mecanismo que hace
verificable un número de versión contra el código real.&lt;/p&gt;
&lt;h2&gt;¿Cómo debería relacionarse la descripción de un lanzamiento con la entrada de changelog?&lt;/h2&gt;
&lt;p&gt;Pueden ser el mismo texto, pero solo si la audiencia de ambos es realmente la misma, lo cual es
más raro de lo que parece. Una página de lanzamiento en un hospedador de código la leen casi
exclusivamente desarrolladoras; si un producto también tiene usuarias no técnicas leyendo el
changelog, duplicar la descripción del lanzamiento tal cual envía términos internos y una
redacción centrada en código a una lectora que necesitaba la versión en lenguaje llano. El patrón
más limpio: escribir la entrada de changelog como el artefacto principal orientado a la lectora, y
dejar que la descripción del lanzamiento la enlace o mantenga un resumen más corto y técnico para
la audiencia que ya está cómoda ahí.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Lanzamiento v2.4.0 (GitHub, para desarrolladoras)
Sube el pipeline de informes al nuevo motor de agregación. Ver el
changelog para el resumen orientado al cliente:
https://example.com/changelog#v2.4.0

## 2026-09-07 (Changelog, orientado al cliente)
### Added
- Los informes ahora cargan en menos de un segundo, incluso para
  cuentas con más de un millón de filas.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El mismo lanzamiento, dos documentos, cada uno con su propia redacción para su propia lectora.&lt;/p&gt;
&lt;h2&gt;¿De dónde sale realmente la entrada de changelog?&lt;/h2&gt;
&lt;p&gt;De dos puntos de partida, y la mayoría de pipelines reales son una mezcla de ambos. Puede
generarse a partir de mensajes de commit en el momento del tag, lo cual es rápido y nunca se pierde
un pull request mergeado; &lt;a href=&quot;https://changeloop.dev/blog/es/conventional-commits-changelog/&quot;&gt;de conventional commits a changelog&lt;/a&gt;
cubre ese pipeline por completo. O puede escribirse a mano, separada del tag por completo,
sincronizada con el momento en que una función se considera terminada en vez del momento en que se
mergea el código. Las entradas generadas son consistentes pero heredan cada mensaje de commit vago;
las escritas a mano son más claras pero necesitan a alguien que las escriba de verdad. La mayoría
de equipos que automatizan igual mantienen un repaso ligero de edición sobre el texto generado
antes de que se convierta en la entrada pública, la misma disciplina que recomienda
&lt;a href=&quot;https://changeloop.dev/blog/es/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog, en la práctica&lt;/a&gt;, sin importar de dónde
venga originalmente el texto en bruto.&lt;/p&gt;
&lt;h2&gt;¿Qué se rompe cuando los tres se desincronizan?&lt;/h2&gt;
&lt;p&gt;La confianza en el que la lectora haya consultado primero. Un tag que existe sin entrada de
changelog correspondiente parece, desde el lado de quien lee el changelog, que esa semana no pasó
nada. Una entrada de changelog sin tag o lanzamiento correspondiente hace imposible que alguien
depurando un problema en producción haga checkout del código exacto que estaba en vivo cuando se
publicó una entrada. La solución no es automatización perfecta, es una única fuente de verdad para
la correspondencia: un lugar, aunque sea solo la propia checklist del proceso de lanzamiento, que
diga que un cambio publicable recibe los tres, en el mismo commit o pull request que lo introduce.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían generarse automáticamente las entradas de changelog a partir de tags de git?&lt;/strong&gt;
Pueden ser un punto de partida, pero un tag solo no lleva ninguna descripción orientada a la
lectora, solo un rango de commits. La generación automatizada necesita leer los mensajes de commit
dentro de ese rango, no solo la existencia del tag, para producir algo utilizable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Y si no etiquetamos cada lanzamiento?&lt;/strong&gt;
Entonces la entrada de changelog se convierte en el registro principal, y aun así debería llevar
una fecha y, si el producto tiene uno, un número de versión, para que la entrada siga siendo algo
a lo que una lectora pueda referirse después incluso sin un tag correspondiente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían tener entrada de changelog los tags pre-lanzamiento (como &lt;code&gt;v2.4.0-rc.1&lt;/code&gt;)?&lt;/strong&gt;
En general no. Un release candidate es para pruebas internas o beta, y una entrada de changelog
para él entrena a las lectoras a esperar entradas para versiones que quizá nunca se lancen tal
cual. Reserva las entradas para tags que alcanzan disponibilidad general.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede una sola entrada de changelog cubrir varios tags de git?&lt;/strong&gt;
Sí, y a menudo debería para equipos que etiquetan con frecuencia. Agrupa tags relacionados bajo
una entrada datada que describa el cambio neto, en vez de publicar una entrada delgada por tag que
fragmenta una función entre varias lecturas.&lt;/p&gt;
</content:encoded></item><item><title>Changelogs de API internas: qué cambia para el otro equipo</title><link>https://changeloop.dev/blog/es/internal-api-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/internal-api-changelog/</guid><description>Un changelog de API pública tiene un público al que no puedes contactar. Uno interno tiene un público a dos pisos, y eso cambia lo que debe incluir.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cada otro artículo de este hub asume que quien llama a una API está fuera de la empresa: la
ingeniera de una clienta, una socia, alguien que encontró la documentación por su cuenta. Muchas
APIs tienen un tipo de consumidor totalmente distinto, un equipo al otro lado del pasillo o a dos
pisos de distancia, y eso cambia el cálculo de qué le debe un changelog, porque un mensaje de
Slack lo alcanza y normalmente nunca se abre un ticket de soporte. La mayoría de los equipos
concluye de esto que las APIs internas no necesitan changelog. Lo que realmente necesitan es uno
distinto.&lt;/p&gt;
&lt;h2&gt;¿Qué hace diferente al changelog de una API interna del de una pública?&lt;/h2&gt;
&lt;p&gt;El público es alcanzable directamente, lo que elimina la razón principal por la que existen la
mayoría de los changelogs de API públicos: transmitir a consumidores a los que no se puede
contactar individualmente. El equipo dueño de una API interna suele saber exactamente qué otros
equipos la llaman, a veces hasta el servicio específico. Eso hace que un mensaje dirigido, no un
feed público, sea el valor predeterminado natural, y por eso las APIs internas tan a menudo
terminan sin ningún changelog: el equipo dueño le avisa a los dos o tres equipos que recuerda,
asumiendo que eso cubre a todos.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Changelog de API pública&lt;/th&gt;
&lt;th&gt;Changelog de API interna&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Quién lo lee&lt;/td&gt;
&lt;td&gt;Cualquier consumidor externo, casi siempre inalcanzable directamente&lt;/td&gt;
&lt;td&gt;Un conjunto pequeño y generalmente conocido de equipos internos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canal predeterminado&lt;/td&gt;
&lt;td&gt;Una página y un feed&lt;/td&gt;
&lt;td&gt;Un mensaje a los equipos que llaman, idealmente también una página&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mayor riesgo&lt;/td&gt;
&lt;td&gt;Un consumidor se pierde la entrada por completo&lt;/td&gt;
&lt;td&gt;El equipo dueño olvida un consumidor del que no recuerda que existe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qué reemplaza &amp;quot;no sabemos quién nos llama&amp;quot;&lt;/td&gt;
&lt;td&gt;Nada; publicar ampliamente&lt;/td&gt;
&lt;td&gt;Un registro real de consumidores, mantenido al día&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Por qué falla &amp;quot;simplemente le avisamos a los equipos que nos llaman&amp;quot;?&lt;/h2&gt;
&lt;p&gt;Porque el conjunto de consumidores nunca es tan pequeño ni tan estático como recuerda el equipo
dueño. Un servicio construido para un consumidor gana un segundo seis meses después, mediante una
integración que nadie anunció, y la lista mental de &amp;quot;quién nos llama&amp;quot; del equipo dueño ya está
equivocada sin que nadie lo note. El fallo es ordinario y común, el resultado predeterminado de
confiar en la memoria en vez de en un registro, no una señal de que alguien fue descuidado.
&lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;Qué es un breaking change&lt;/a&gt;
cubre cómo decidir si un cambio de API cuenta como rompedor en primer lugar; el caso interno añade
una segunda pregunta más difícil encima de esa, que es saber a quién avisar.&lt;/p&gt;
&lt;h2&gt;¿Una API interna necesita siquiera una página de changelog al estilo público?&lt;/h2&gt;
&lt;p&gt;Casi siempre sí, aunque el canal principal sea directo. Una página le da al mensaje directo algo a
qué enlazar, así que la notificación puede ser corta (&amp;quot;breaking change en &lt;code&gt;/v2/accounts&lt;/code&gt;, detalles
aquí&amp;quot;) en lugar de intentar llevar toda la explicación en un mensaje de chat que va a desaparecer
al hacer scroll. También se convierte en lo que un equipo nuevo, o uno que se perdió el mensaje
directo, puede revisar cuando su integración se rompe y trata de entender por qué. La página no
necesita estar pulida ni ser pública; necesita ser enlazable y sobrevivir al hilo de Slack que la
anunció.&lt;/p&gt;
&lt;h2&gt;¿Quién mantiene realmente la lista de consumidores?&lt;/h2&gt;
&lt;p&gt;El equipo dueño, y hay que tratarla como un artefacto real, no como conocimiento tribal. La
versión más barata es un archivo en el propio repositorio de la API, una lista corta de servicios
consumidores con una responsable por entrada, actualizada cada vez que se construye una nueva
integración, la misma disciplina que cualquier declaración de dependencias. La alternativa,
preguntar por ahí antes de cada breaking change, funciona hasta el día en que alguien se olvida de
preguntarle a la persona correcta, y una API interna que se rompe en silencio para un equipo es un
incidente más pequeño que uno público, pero sigue siendo un incidente, normalmente descubierto por
la guardia de ese propio equipo en vez de por quien es dueña de la API.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# consumers.yml
- service: billing-service
  owner: &amp;quot;#team-billing&amp;quot;
  since: 2026-03-01
- service: reporting-pipeline
  owner: &amp;quot;#team-analytics&amp;quot;
  since: 2026-06-14
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un archivo así convierte &amp;quot;a quién tenemos que avisar&amp;quot; en una consulta en lugar de una pregunta.
Herramientas construidas exactamente para este problema, como el &lt;a href=&quot;https://backstage.io/docs/features/software-catalog/system-model/&quot;&gt;catálogo de servicios de
Backstage&lt;/a&gt;, modelan las APIs
como entidades de primera clase con consumidores declarados por la misma razón: en cuanto una
organización tiene suficientes servicios internos, la memoria de nadie sobre quién llama a qué se
mantiene precisa por sí sola, y algo tiene que guardar el registro en su lugar. &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;La
documentación&lt;/a&gt; de la herramienta que ya uses internamente suele ser el sitio correcto donde
mirar antes de construir una a medida.&lt;/p&gt;
&lt;h2&gt;¿Qué pertenece a una entrada de changelog interna que una pública no necesitaría?&lt;/h2&gt;
&lt;p&gt;Más especificidad operativa, porque quien lee es otra ingeniera que va a actuar sobre esto dentro
de la misma infraestructura, no a leerlo como un resumen. En qué entornos está viva la
modificación y cuándo, porque los servicios internos a menudo se promueven por etapas que un
consumidor público nunca ve. Si el cambio requiere una actualización de configuración o de
biblioteca cliente del lado del consumidor, formulada como un comando si existe uno. Y, porque los
consumidores internos suelen poder coordinar la solución directamente con el equipo dueño, un
contacto con nombre en lugar de un canal de soporte: &amp;quot;avisa a @maria si esto rompe algo&amp;quot; es una
línea perfectamente razonable en una entrada interna y una extraña en un changelog de API pública.&lt;/p&gt;
&lt;h2&gt;¿Esto aplica igual a un changelog dentro de un monorepo?&lt;/h2&gt;
&lt;p&gt;Agudiza el mismo problema en lugar de reemplazarlo. &lt;a href=&quot;https://changeloop.dev/blog/es/monorepo-changelogs/&quot;&gt;Changelogs de monorepo&lt;/a&gt;
cubre cuándo un paquete necesita su propio changelog; una API interna que es uno de varios paquetes
en un monorepo igual necesita que sus consumidores estén rastreados explícitamente, porque estar
en el mismo repositorio que quienes la llaman no significa que vayan a notar un cambio a menos que
algo les diga que miren. La cercanía en el repo no es lo mismo que la cercanía en la atención.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Una API solo interna necesita changelog si tiene un único consumidor?&lt;/strong&gt;
Apenas, y un mensaje directo a ese único equipo suele bastar. El changelog se justifica en cuanto
hay más de un consumidor, o en cuanto la lista de consumidores ha sorprendido alguna vez al equipo
dueño, porque esa es la señal de que la memoria sola ya no es confiable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Los cambios de API internos deberían pasar por la misma revisión que los públicos?&lt;/strong&gt;
La redacción puede ser más ligera, porque quien lee es una colega y no una consumidora externa,
pero la decisión de si un cambio es rompedor merece el mismo cuidado en ambos casos. Una
consumidora interna igual tiene código en producción que depende del comportamiento anterior.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo se averigua quién llama a una API interna si nunca se registró?&lt;/strong&gt;
Los logs del servidor o los datos de tráfico de un service mesh son la respuesta honesta si nunca
se mantuvo un registro de consumidores; trata ese descubrimiento como el momento de empezar uno,
no como una limpieza puntual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Un mensaje de Slack basta, o un cambio interno igual necesita una entrada formal de changelog?&lt;/strong&gt;
Ambos, para cualquier cosa que no sea puramente aditiva. El mensaje es lo que se lee a tiempo; la
entrada es lo que un equipo investigando un problema semanas después, que nunca vio el mensaje,
puede encontrar de todos modos.&lt;/p&gt;
</content:encoded></item><item><title>Notas de release internas: quién más debe saberlo</title><link>https://changeloop.dev/blog/es/internal-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/internal-release-notes/</guid><description>Soporte y ventas suelen enterarse de un lanzamiento por una clienta confundida. Las notas internas lo arreglan, con una forma distinta a las públicas.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Todos los demás artículos de este hub asumen que quien lee una nota de release es una clienta.
Soporte, ventas y customer success también leen, o lo intentan, y la mayoría se entera de lo que se
lanzó porque una clienta pregunta por ello primero. Ese orden está al revés, y también es el
predeterminado en la mayoría de empresas, porque el proceso de lanzamiento termina en el momento en
que sale la nota de cara al cliente, y nadie construyó un segundo paso, más pequeño, para la gente
que tiene que responder preguntas sobre ello una hora después.&lt;/p&gt;
&lt;h2&gt;¿Qué es una nota de release interna, y en qué se diferencia de una de cara al cliente?&lt;/h2&gt;
&lt;p&gt;Es un documento más corto, escrito para gente que ya conoce el producto a fondo, que les dice qué
cambió y qué hacer al respecto en su trabajo concreto. Un agente de soporte no necesita el marco
pulido que usa un anuncio de cara al cliente; necesita saber cómo se ve el cambio en el producto
ahora mismo, cuál será la pregunta más probable sobre él, y si hay tickets abiertos afectados. Una
nota de cara al cliente vende el cambio. Una interna equipa a alguien para manejarlo.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Público&lt;/th&gt;
&lt;th&gt;Qué necesita saber&lt;/th&gt;
&lt;th&gt;Dónde lo necesita&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Soporte&lt;/td&gt;
&lt;td&gt;Qué cambió en la interfaz, preguntas probables, tickets abiertos afectados&lt;/td&gt;
&lt;td&gt;Donde ya buscan respuestas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ventas&lt;/td&gt;
&lt;td&gt;Qué desbloquea para un trato, qué todavía no hace&lt;/td&gt;
&lt;td&gt;Donde se preparan para llamadas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer success&lt;/td&gt;
&lt;td&gt;Qué decirle a clientas existentes, y quién lo pidió&lt;/td&gt;
&lt;td&gt;Donde planifican el contacto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dirección&lt;/td&gt;
&lt;td&gt;Qué se lanzó frente a lo prometido, y cuándo&lt;/td&gt;
&lt;td&gt;Un resumen corto y recurrente, no por lanzamiento&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Por qué los equipos internos se enteran tarde de los lanzamientos?&lt;/h2&gt;
&lt;p&gt;Porque el proceso de lanzamiento suele construirse alrededor de un solo artefacto, la nota de cara
al cliente o la entrada de changelog, y se asume que todo lo interno se deriva de leer ese único
documento. No es así. Los agentes de soporte están ocupados con el ticket que tienen delante, no
navegando un changelog en busca de contexto, y una nota escrita para una clienta a menudo omite
justo el detalle operativo que necesita una agente, como a qué plan está limitado el feature o cómo
se ve el mensaje de error cuando falla. Para cuando una clienta pregunta, la agente está leyendo la
misma nota pública que acaba de leer la clienta, sin ninguna ventaja.&lt;/p&gt;
&lt;h2&gt;¿Qué debería decir una nota interna que una de cara al cliente no dice?&lt;/h2&gt;
&lt;p&gt;Los detalles operativos que una nota de cara al cliente deja fuera a propósito. Qué planes o
cuentas lo tienen. Cómo se ve cuando algo falla, y qué decirle a una clienta que se topa con eso.
Si cierra alguna solicitud o ticket abierto, y cuáles, para que una agente que trabaja un ticket
relacionado sepa que debe revisarlo. Quién en el equipo es responsable si una pregunta va más allá
de lo que cubre la nota. Nada de esto pertenece a la versión de cara al cliente, escrita para
leerse una vez por alguien fuera de la empresa; todo esto es justo lo que necesita alguien que
responde la misma pregunta cuarenta veces por semana.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Nota interna: exportación CSV masiva (sale el 08-09-2026)

- Limitado a planes Team y Enterprise. Free y Pro no ven cambio.
- Fallo común: exportaciones de más de 50k filas dan timeout;
  problema conocido, corrección seguida aparte. Decirle a la
  clienta que filtre por rango de fechas.
- Cierra 14 solicitudes abiertas etiquetadas `bulk-export`.
  Plantilla de respuesta en el documento compartido.
- Responsable: equipo de plataforma, #platform-eng para lo que
  quede fuera de esta nota.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cuatro líneas que una agente de soporte puede usar de inmediato, ninguna de las cuales
pertenecería a la entrada pública del changelog para el mismo feature.&lt;/p&gt;
&lt;h2&gt;¿Quién debería escribirla, y cuándo?&lt;/h2&gt;
&lt;p&gt;Quien escribe la nota de cara al cliente suele ser la persona indicada, porque ya tiene todo el
contexto, pero debería ser un pase corto y separado en vez de intentar que un solo documento sirva
a las dos audiencias. Fusionarlas produce una nota de cara al cliente cargada de detalle interno, o
una nota interna demasiado pulida para ser realmente útil, y en la práctica es más rápido escribir
dos documentos cortos que negociar uno solo para que sirva a dos públicos a la vez. El momento
importa más que la autoría: la nota interna tiene que salir antes que la de cara al cliente,
aunque sea por unas horas, para que soporte nunca se entere de un cambio en el mismo sitio que una
clienta.&lt;/p&gt;
&lt;h2&gt;¿Dónde debería vivir para que soporte la encuentre justo cuando llega un ticket?&lt;/h2&gt;
&lt;p&gt;Donde el equipo ya busca cosas cuando llega un ticket, no en un changelog aparte que nadie tiene
motivo para abrir por su cuenta. Un equipo de soporte que usa una base de conocimiento compartida
necesita la nota ahí, enlazada desde donde ya se etiquetan los tickets de esa parte del producto.
Un equipo que vive en un canal compartido la necesita publicada ahí, buscable, en el momento en
que es relevante, en vez de enterrada en un resumen diario que ojean una vez. El patrón de cara al
cliente de &lt;a href=&quot;https://changeloop.dev/blog/es/product-update-email/&quot;&gt;notificación dirigida frente a digest&lt;/a&gt; aplica aquí
también: una nota interna sobre un cambio concreto e inminente debería llegar directamente al
equipo, no esperar a un resumen semanal que llega después de que ya exista el primer ticket.&lt;/p&gt;
&lt;h2&gt;¿Necesita el mismo rigor de revisión que la externa?&lt;/h2&gt;
&lt;p&gt;Menos, y eso es intencional. Una nota de cara al cliente representa a la empresa públicamente y se
gana un pase de edición cuidadoso; una nota interna existe para ser rápida y concreta, y exigirle
el mismo nivel de pulido suele ser justo lo que hace que los equipos dejen de escribirla del todo.
Una nota interna rápida y algo tosca que sale una hora antes del lanzamiento le gana a una pulida
que llega al día siguiente, cuando el primer ticket de soporte ya llegó confundido.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían las notas de release internas pasar por el mismo proceso de aprobación que las de cara al cliente?&lt;/strong&gt;
No. Un pase más ligero y rápido es justo el objetivo. Exigir la misma revisión convierte una nota
interna del mismo día en una de la semana siguiente, para cuando soporte ya respondió la pregunta
sin ella.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Quién es responsable de las notas de release internas si no hay un rol dedicado de comunicación interna?&lt;/strong&gt;
Quien escribe la nota de cara al cliente, como un segundo pase corto justo después. No necesita una
responsable separada, solo el hábito de no tratar la nota de cara al cliente como el único
artefacto que produce un lanzamiento.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Las notas de release internas necesitan su propio changelog o archivo?&lt;/strong&gt;
Un lugar buscable le gana a un archivo cronológico por el que nadie navega. Si soporte ya tiene una
base de conocimiento, la nota pertenece ahí, etiquetada al feature, en vez de en un changelog
interno aparte que solo ayuda a quien ya sabe la fecha en que se lanzó.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es el riesgo de saltarse las notas de release internas en cambios pequeños?&lt;/strong&gt;
Los cambios pequeños son justo aquellos por los que soporte recibe preguntas sin previo aviso,
porque un cambio pequeño rara vez recibe un anuncio a nivel de empresa. El tamaño de la nota de
release debería escalar con el tamaño del cambio; nunca debería caer a cero solo porque el cambio
fue menor.&lt;/p&gt;
</content:encoded></item><item><title>Notas de versión para apps móviles: qué recorta el límite</title><link>https://changeloop.dev/blog/es/mobile-app-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/mobile-app-release-notes/</guid><description>App Store y Play Store dan pocas líneas visibles y sin enlaces. Lo que funciona en un changelog web se rompe con ese presupuesto tan corto y estricto.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Todo en este hub sobre escribir notas de versión asume una página que se controla por completo:
cualquier longitud, enlaces que funcionan, formato que se renderiza. Las notas de versión de una
app móvil viven dentro de la caja de otra empresa. Apple da alrededor de 4.000 caracteres pero solo
muestra las primeras líneas antes de que se toque &amp;quot;más&amp;quot;; Google da un espacio similar con el mismo
problema efectivo de vista previa, y ninguna de las dos plataformas renderiza un enlace clicable
dentro del texto. Las reglas de &lt;a href=&quot;https://changeloop.dev/blog/es/how-to-write-release-notes/&quot;&gt;cómo escribir notas de versión que la gente realmente lee&lt;/a&gt;
siguen aplicando: decir qué cambió y qué tiene que hacer quien lee, pero el espacio para hacerlo es
una fracción de lo que permite una página de changelog, y los recortes tienen que ser deliberados,
no accidentales.&lt;/p&gt;
&lt;h2&gt;¿Qué cabe realmente en la vista previa visible?&lt;/h2&gt;
&lt;p&gt;La primera línea o dos, entre unos 80 y 170 caracteres según el dispositivo y el tamaño de fuente,
antes de que quien lee tenga que tocar para expandir. Ese es todo el presupuesto para la parte de
la nota de versión que decide si alguien va a leer el resto, y significa que la frase más
importante tiene que ir primero, no el número de versión, ni un saludo, ni un encabezado de
categoría. Una nota de versión que empieza con &amp;quot;Novedades de esta versión:&amp;quot; ya gastó un tercio de
su espacio visible en cuatro palabras que no le dicen nada a quien lee.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plataforma&lt;/th&gt;
&lt;th&gt;Límite total aproximado&lt;/th&gt;
&lt;th&gt;Vista previa efectiva antes de &amp;quot;más&amp;quot;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;App Store (iOS)&lt;/td&gt;
&lt;td&gt;~4.000 caracteres&lt;/td&gt;
&lt;td&gt;2-3 líneas, unos 80-170 caracteres&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Play&lt;/td&gt;
&lt;td&gt;~500 caracteres por idioma, algunos campos más cortos&lt;/td&gt;
&lt;td&gt;2-3 líneas, similar a iOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambas&lt;/td&gt;
&lt;td&gt;Sin enlaces clicables en el campo de notas de versión&lt;/td&gt;
&lt;td&gt;N/D&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿La regla de &amp;quot;qué puedes hacer ahora, qué se te debe&amp;quot; sigue funcionando a esta longitud?&lt;/h2&gt;
&lt;p&gt;Sí, y se vuelve más estricta, no distinta. Una frase por entrada, verbo primero, sin
introducción: &amp;quot;Exporta tus datos como CSV desde Ajustes.&amp;quot; le gana a &amp;quot;Hemos añadido la capacidad
de que ahora los usuarios puedan exportar sus datos en formato CSV&amp;quot; usando un tercio de las
palabras para decir lo mismo. A la longitud de una página de changelog, una frase algo verborrágica
le cuesta a quien lee medio segundo. A la longitud de una nota de versión móvil, esa misma
verborragia puede empujar la frase entera fuera de la vista previa visible, así que quien lee
nunca ve el verbo que le habría dicho qué cambió.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Malo, gasta la vista previa en el marco:
&amp;quot;¡Estamos emocionados de traerte una nueva actualización
llena de mejoras! Sigue leyendo para más detalles.&amp;quot;

Bueno, todo el valor en la primera línea:
&amp;quot;Exporta tus datos como CSV. El modo oscuro ahora respeta
la configuración del sistema. Se corrigió un fallo al abrir
enlaces compartidos.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Qué hay que recortar que una entrada de changelog web normalmente conservaría?&lt;/h2&gt;
&lt;p&gt;Los enlaces, primero, porque ninguna de las dos tiendas los renderiza como clicables, así que una
URL en el texto es peso muerto que quien lee tendría que retipear. Si la entrada necesita un
destino, di qué tocar dentro de la app en su lugar: &amp;quot;Ve los nuevos filtros en Ajustes &amp;gt; Búsqueda&amp;quot;
funciona; &amp;quot;Lee más en example.com/blog/filtros&amp;quot; no funciona en esta superficie. Segundo, cualquier
cosa condicional o específica de un público: un changelog web puede decir &amp;quot;si usas la API, esto te
afecta&amp;quot;, pero un listado de tienda llega a cada usuario instalado a la vez, así que una línea
condicional se lee como ruido para el 95 % al que no le aplica. Pon el detalle condicional en un
mensaje dentro de la app en su lugar, activado para las cuentas a las que realmente concierne.&lt;/p&gt;
&lt;h2&gt;¿Cada lanzamiento debería tener sus propias notas, o está bien reutilizar &amp;quot;correcciones de errores y mejoras de rendimiento&amp;quot;?&lt;/h2&gt;
&lt;p&gt;Reutilízalo para lanzamientos que genuinamente sean eso, pero audita cuán a menudo es realmente
cierto. &lt;a href=&quot;https://changeloop.dev/blog/es/how-to-write-release-notes/&quot;&gt;Cómo escribir notas de versión&lt;/a&gt; ya cubre por qué
esa frase delata una nota escrita desde adentro en vez de para quien lee; en móvil hace un daño
doble, porque las notas de versión de la tienda son uno de los pocos lugares donde algunos
usuarios ven algo entre actualizaciones, y una larga racha de &amp;quot;correcciones de errores y mejoras
de rendimiento&amp;quot; se lee como si la app no cambiara, lo cual es una impresión peor que no tener
notas en absoluto durante ese tramo.&lt;/p&gt;
&lt;h2&gt;¿Las notas de versión afectan si la gente actualiza la app?&lt;/h2&gt;
&lt;p&gt;Indirectamente, a través de la visibilidad más que de la persuasión. La mayoría de los usuarios
actualiza automáticamente y nunca lee las notas antes de actualizar; las notas importan más para
la minoría que revisa las actualizaciones manualmente, y para quienes reseñan o hacen prensa y
repasan el historial de un listado de tienda. Escribir para ese público más pequeño igual vale la
pena, porque un listado con un historial real de entradas específicas y fechadas se lee como una
app mantenida activamente, y un listado con un año de &amp;quot;correcciones de errores y mejoras de
rendimiento&amp;quot; no, sin importar cuánto se haya lanzado en realidad en ese tiempo.&lt;/p&gt;
&lt;h2&gt;¿Y una actualización forzada, donde la nota tiene que explicar por qué el usuario no tiene opción?&lt;/h2&gt;
&lt;p&gt;Indica la razón y el plazo en la primera línea, antes que nada, porque una actualización forzada
es el único caso en que quien lee ya está molesta antes de empezar a leer. &amp;quot;Esta actualización es
necesaria para seguir sincronizando tus datos. Actualiza antes del [fecha] para evitar
interrupciones.&amp;quot; dice qué hacer y por qué en una sola frase; enterrar esa razón bajo tres líneas de
notas de funciones sin relación se lee como si la app estuviera escondiendo la parte incómoda.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Las notas de versión móviles deberían coincidir con el changelog web del mismo lanzamiento?&lt;/strong&gt;
Cubrir los mismos cambios subyacentes, pero no palabra por palabra. El changelog web puede
permitirse la explicación completa; la nota móvil necesita esos mismos hechos comprimidos en una
frase con el verbo primero, lo que normalmente significa que es una reescritura, no una copia.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Vale la pena localizar las notas de versión móviles para cada idioma soportado?&lt;/strong&gt;
Sí, más que para un changelog web, porque el listado de la tienda suele ser la única superficie
localizada que algunos usuarios ven entre sesiones, y ambas plataformas soportan notas de versión
por idioma sin trabajo de ingeniería adicional más allá de la traducción en sí.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué tan larga debería ser una nota de versión móvil si no hay un límite que obligue a la brevedad?&lt;/strong&gt;
Corta de todos modos. El techo de 4.000 caracteres de iOS rara vez es la restricción real; lo es la
vista previa de 2-3 líneas, y escribir más allá de lo que muestra esa vista previa solo significa
que menos gente lee la parte que importaba.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Las notas de versión necesitan el número de versión en el texto visible?&lt;/strong&gt;
No. La tienda ya muestra el número de versión junto a las notas. Repetirlo dentro del texto gasta
caracteres visibles en información que quien lee ya tiene delante.&lt;/p&gt;
</content:encoded></item><item><title>Changelogs en monorepo: ¿uno solo, o uno por paquete?</title><link>https://changeloop.dev/blog/es/monorepo-changelogs/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/monorepo-changelogs/</guid><description>Un monorepo puede llevar un changelog para todo el repo o uno por paquete, y elegir mal hace cada lanzamiento demasiado ruidoso o demasiado disperso.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un monorepo aloja varias cosas desplegables por separado en un solo repositorio, y un changelog
tiene que responder primero una pregunta: ¿al lector le importa el repo, o le importa un paquete
concreto dentro de él? La mayoría de equipos nunca deciden esto a propósito. Empiezan con un
changelog porque hay un repo, van añadiendo paquetes, y terminan con un log donde alguien que usa
la CLI tiene que pasar cuarenta entradas del backend que no le importan para encontrar la que
lanzó su corrección. Lo que decide la forma correcta no es la estructura del repositorio, sino
quién lee el log y qué es lo que ya sabe que está buscando.&lt;/p&gt;
&lt;h2&gt;¿Qué hace distinto el changelog de un monorepo del de un repo único?&lt;/h2&gt;
&lt;p&gt;Un changelog de repo único tiene un público implícito: todo el mundo que usa lo único que ese repo
construye. El público de un monorepo se divide por paquete, y los paquetes dentro del mismo repo
suelen lanzarse en calendarios distintos, a consumidores distintos, con niveles de estabilidad
distintos. Una biblioteca publicada en un registro y una herramienta de administración interna
pueden vivir en el mismo monorepo y no tener casi nada en común para quien lee el changelog.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Forma del repo&lt;/th&gt;
&lt;th&gt;Lector típico&lt;/th&gt;
&lt;th&gt;Changelog que encaja&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Una sola app desplegable&lt;/td&gt;
&lt;td&gt;Todo el mundo que usa el producto&lt;/td&gt;
&lt;td&gt;Un log, para todo el repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workspace de bibliotecas (varios paquetes publicados)&lt;/td&gt;
&lt;td&gt;Quien depende de un paquete concreto&lt;/td&gt;
&lt;td&gt;Un log por paquete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App más herramientas internas&lt;/td&gt;
&lt;td&gt;Dos públicos distintos sin solape&lt;/td&gt;
&lt;td&gt;Dividido por público, no por carpeta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App más su propio SDK&lt;/td&gt;
&lt;td&gt;Usuarios del producto, e integradores del SDK&lt;/td&gt;
&lt;td&gt;Dos logs: uno del producto, otro del SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Necesita cada paquete su propio changelog?&lt;/h2&gt;
&lt;p&gt;Solo los que tienen un público independiente. Un paquete publicado en un registro necesita su
propio log, porque quien lo instala no tiene motivo para leer nada más del repo, y las
herramientas de lanzamiento para monorepos como &lt;a href=&quot;https://lerna.js.org/&quot;&gt;Lerna&lt;/a&gt; y Changesets escriben
un &lt;code&gt;CHANGELOG.md&lt;/code&gt; por paquete, junto a su &lt;code&gt;package.json&lt;/code&gt;. Una utilidad interna con un único consumidor, la app que ya vive en el
mismo repo, no necesita un log separado; incorporar sus cambios en las entradas de esa app es más
útil que un segundo archivo que nadie fuera del equipo abre.&lt;/p&gt;
&lt;p&gt;La prueba es la misma que decide si una entrada cualquiera pertenece a un changelog: si el lector
lo notaría o le importaría, y si puede actuar al saberlo. Aplícala por paquete, no por carpeta, y
un repo con doce paquetes puede terminar con dos changelogs reales y diez paquetes que
simplemente no necesitan ninguno.&lt;/p&gt;
&lt;h2&gt;¿Cómo se sabe qué paquete causó qué entrada de changelog?&lt;/h2&gt;
&lt;p&gt;Etiqueta cada entrada con su paquete en el momento en que se escribe, no después inspeccionando
qué archivos tocó un commit. Un commit que corrige una biblioteca interna compartida puede
producir una entrada de changelog en cada paquete que depende de ella, y las rutas de archivo por
sí solas no pueden decir cuál de esas entradas derivadas necesita ver realmente el lector; solo
una persona que decide &amp;quot;esto es visible para quien usa el paquete A y no para quien usa el paquete
B&amp;quot; puede hacerlo. Los &lt;a href=&quot;https://changeloop.dev/blog/es/conventional-commits-changelog/&quot;&gt;conventional commits&lt;/a&gt; ayudan aquí
mecánicamente, nombrando el paquete en cada commit, pero el scope solo produce un borrador. La
misma regla de dos capas de ese artículo aplica por paquete: un borrador con el scope correcto
sigue necesitando un pase humano antes de estar redactado para el lector real de ese paquete.&lt;/p&gt;
&lt;h2&gt;¿Qué necesita un changelog compartido que uno de repo único no necesita?&lt;/h2&gt;
&lt;p&gt;Una etiqueta de paquete en cada entrada, al principio, antes de la descripción, para que un
lector que revisa el log pueda saltarse en una sola pasada todo lo que no es suyo. Sin esa
etiqueta, un log compartido se lee como un feed aleatorio, y un lector que se interesa por un
paquete no tiene forma de filtrarlo salvo memorizar qué líneas importan, algo que nadie hace
pasada la primera semana.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 2026-09-07

### [cli] Añadido
- `acme push --dry-run` muestra qué se enviaría sin enviarlo.

### [core] Corregido
- El backoff de reintentos ya no se reinicia con una solicitud
  exitosa que devuelve un cuerpo vacío.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dos entradas, dos públicos, un vistazo para distinguirlas. Un flujo al estilo
&lt;a href=&quot;https://github.com/changesets/changesets/blob/main/docs/intro-to-using-changesets.md&quot;&gt;Changesets&lt;/a&gt;
integra este etiquetado directamente en el proceso de lanzamiento: quien contribuye escribe una
nota corta y con scope de paquete junto a su cambio, y la herramienta ensambla los changelogs por
paquete y los saltos de versión a partir de esas notas en el momento del lanzamiento, en lugar de
intentar reconstruir los límites de paquete a posteriori a partir de un historial de commits
fusionado.&lt;/p&gt;
&lt;h2&gt;¿Cómo se relaciona el versionado con un changelog de monorepo?&lt;/h2&gt;
&lt;p&gt;Los paquetes versionados de forma independiente necesitan su propio changelog porque tienen su
propio número de versión, y un changelog compartido no puede expresar &amp;quot;el paquete A pasó de 2.1 a
2.2 mientras el paquete B se quedó en 1.4&amp;quot; sin convertirse en dos logs dentro de un archivo.
&lt;a href=&quot;https://changeloop.dev/blog/es/semantic-versioning-changelog/&quot;&gt;Semantic versioning y tu changelog&lt;/a&gt; cubre cómo debería
mapearse un número de versión a las categorías del changelog; en un monorepo ese mapeo hay que
aplicarlo por paquete, porque un breaking change en un paquete no lo es para un paquete hermano
que no depende de él.&lt;/p&gt;
&lt;p&gt;Un repo que lanza un producto como una sola unidad desplegable, aunque esté construido a partir de
muchos paquetes internos, no tiene este problema: los paquetes comparten versión porque siempre se
lanzan juntos, y un único changelog es lo correcto.&lt;/p&gt;
&lt;h2&gt;¿Cómo encajan los tags de git en un monorepo?&lt;/h2&gt;
&lt;p&gt;Aplica la misma regla de &lt;a href=&quot;https://changeloop.dev/blog/es/git-tags-releases-changelog/&quot;&gt;tags de git, releases y tu changelog&lt;/a&gt;,
por paquete: un paquete con versión propia necesita su propio prefijo de tag, típicamente
&lt;code&gt;nombre-del-paquete@1.4.0&lt;/code&gt; en lugar de un &lt;code&gt;v1.4.0&lt;/code&gt; desnudo que no puede decir a qué paquete
pertenece. Un monorepo etiquetado solo con números de versión desnudos no puede responder después
&amp;quot;qué había en &lt;code&gt;core&lt;/code&gt; cuando &lt;code&gt;cli&lt;/code&gt; lanzó la 2.2&amp;quot;, porque nada en disco registra a qué paquete
pertenecía realmente ese tag.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Necesito un changelog separado para cada paquete de un monorepo?&lt;/strong&gt;
Solo para los paquetes con público independiente, casi siempre cualquier cosa publicada en un
registro. Un paquete con un único consumidor interno que ya vive en el mismo repo puede
incorporarse al log de ese consumidor en lugar de mantener uno propio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué etiqueta una entrada de changelog con el paquete correcto?&lt;/strong&gt;
La persona que escribe la entrada, en el momento de escribirla, no un escaneo automático de rutas
de archivo modificadas. Un cambio en una biblioteca compartida puede producir una entrada distinta
en cada paquete que depende de ella, y solo una persona puede decidir qué debe decir realmente cada
una de esas entradas derivadas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería un monorepo usar un único número de versión para todo?&lt;/strong&gt;
Solo si cada paquete siempre se lanza junto con los demás. Si los paquetes alguna vez se publican
de forma independiente, necesitan versiones independientes, y las versiones independientes
necesitan changelogs independientes para tener sentido.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Una herramienta de changelog para monorepo reemplaza el paso de edición humana?&lt;/strong&gt;
No. Herramientas como Changesets automatizan recopilar y ensamblar notas por paquete en el momento
del lanzamiento; la nota en sí, escrita en el lenguaje del lector en vez del de quien contribuye,
sigue siendo trabajo de una persona, igual que en cualquier otra pipeline de changelog.&lt;/p&gt;
</content:encoded></item><item><title>Cómo anunciar una función nueva (sin silencio)</title><link>https://changeloop.dev/blog/es/new-feature-announcement/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/new-feature-announcement/</guid><description>La mayoría de los anuncios de funciones mueren en un canal que nadie lee dos veces. Dónde anunciar, qué decir primero y cómo llegar a quien lo pidió.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;La mayoría de los anuncios de funciones mueren en un canal que nadie lee dos veces: un tuit que
pasa desapercibido, un correo del día del lanzamiento enterrado bajo los otros doce que recibió
una suscriptora esa semana, un mensaje de Slack en un canal que la mitad del equipo silenció
hace meses. La función se lanzó. Casi nadie que la hubiera usado se enteró. Arreglar eso tiene
menos que ver con escribir un mejor anuncio y más con elegir el canal correcto para la lectora
correcta, y llegar directamente a quienes lo pidieron en lugar de confiar en que noten un
mensaje general.&lt;/p&gt;
&lt;h2&gt;¿Dónde debería anunciarse realmente una función nueva?&lt;/h2&gt;
&lt;p&gt;En más de un sitio, porque &amp;quot;todo el mundo lee el mismo canal&amp;quot; nunca es cierto. Una entrada de
changelog o feed sirve a la lectora que revisa según su propio ritmo y quiere el registro
permanente y fechado. Un aviso dentro de la app sirve a la lectora que ya está usando el producto
y usaría la función hoy si supiera que existe. El correo sirve a la lectora que no está
actualmente en el producto pero volvería por la actualización adecuada. Las redes sociales
sirven alcance más allá de las usuarias existentes, casi sin segmentación.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Canal&lt;/th&gt;
&lt;th&gt;Mejor para&lt;/th&gt;
&lt;th&gt;Debilidad&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Changelog / feed&lt;/td&gt;
&lt;td&gt;El registro permanente; lectoras que revisan a su ritmo&lt;/td&gt;
&lt;td&gt;No hace nada por quien nunca revisa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aviso en la app&lt;/td&gt;
&lt;td&gt;Usuarias que ya están ahí y actuarían hoy&lt;/td&gt;
&lt;td&gt;No llega a nadie que no esté conectado ahora mismo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correo&lt;/td&gt;
&lt;td&gt;Usuarias inactivas que volverían por esto&lt;/td&gt;
&lt;td&gt;Fácil de enterrar bajo otro correo; necesita un buen asunto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redes sociales&lt;/td&gt;
&lt;td&gt;Alcance más allá de las usuarias actuales&lt;/td&gt;
&lt;td&gt;Casi sin segmentación; vida útil corta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Ninguno de los cuatro basta por sí solo. &lt;a href=&quot;https://changeloop.dev/blog/es/what-is-a-changelog/&quot;&gt;El changelog&lt;/a&gt; es el único documento que debería llevar
todo lanzamiento sin importar el tamaño, porque es el registro al que todo lo demás remite; los
otros tres son amplificación añadida encima, elegida según lo grande que sea realmente la
función.&lt;/p&gt;
&lt;h2&gt;¿Qué debería decir primero el anuncio?&lt;/h2&gt;
&lt;p&gt;El resultado, no el mecanismo. &amp;quot;Añadimos una capa de caché al endpoint de informes&amp;quot; describe lo
que construyó el equipo. &amp;quot;Los informes ahora cargan en menos de un segundo&amp;quot; describe lo que
cambió para la lectora, y esa es la frase que consigue el clic, porque responde &amp;quot;qué gano yo con
esto&amp;quot; en la primera cláusula en vez de en la tercera. El mecanismo pertenece a la entrada del
changelog o a la página de detalle, no al titular.&lt;/p&gt;
&lt;p&gt;Ir con datos concretos por delante de los adjetivos. &amp;quot;Una experiencia de informes más rápida y
potente&amp;quot; no le dice a la lectora nada sobre lo que puede hacer; &amp;quot;los informes ahora cargan en
menos de un segundo y se pueden filtrar por estado&amp;quot; le dice exactamente qué cambió y qué probar.
La segunda versión también resulta más creíble, porque una afirmación vaga suena exactamente
como suena el texto de marketing cuando no hay nada concreto que decir.&lt;/p&gt;
&lt;h2&gt;¿En qué se diferencia de un correo de actualización de producto?&lt;/h2&gt;
&lt;p&gt;Se solapan pero no son lo mismo. &lt;a href=&quot;https://changeloop.dev/blog/es/product-update-email/&quot;&gt;Correo de actualización de producto&lt;/a&gt;
cubre el canal de correo específicamente, incluida la cadencia, los asuntos, y cuándo un resumen
supera a un envío puntual. Un anuncio de función nueva es el evento subyacente; el correo es uno
de los cuatro canales anteriores que podría llevarlo, elegido cuando la función es lo bastante
grande como para justificar un envío dedicado en lugar de ir dentro del próximo resumen. Una
función pequeña se gana una entrada de changelog y quizá un aviso en la app. Una significativa se
gana los cuatro canales, coordinados en el tiempo.&lt;/p&gt;
&lt;h2&gt;¿Cómo llegar a las personas concretas que lo pidieron?&lt;/h2&gt;
&lt;p&gt;Este es el anuncio con mejor retorno que casi todos los equipos se saltan. Si diez clientes
pidieron una función por su nombre, esas diez personas merecen una nota directa y personal en el
momento en que se lanza, al margen de cualquier anuncio más amplio que salga. &lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;Cerrar el círculo de feedback con el cliente&lt;/a&gt;
cubre la mecánica completa; el resumen aquí es que esto solo funciona si la solicitud original
quedó vinculada a quien la pidió, lo cual es más un &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-tracking/&quot;&gt;problema de seguimiento&lt;/a&gt;
que un problema de anuncio. En changeloop, cuando el feedback del widget se convirtió en un issue
de GitHub y el pull request mergeado lo cierra (&lt;code&gt;fixes #142&lt;/code&gt;), aprobar la entrada del changelog
publica una sola vez el comentario &amp;quot;Shipped — &lt;title&gt;&amp;quot; en ese issue, que enlaza de vuelta a la
entrada en vivo, y quien envió el feedback ve la entrada lanzada en el widget. Nadie tiene que
acordarse de decírselo. Los issues creados a mano, y los repositorios de GitLab o Bitbucket, no
reciben el comentario.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe la propia entrada?&lt;/h2&gt;
&lt;p&gt;La misma disciplina que cualquier otra entrada de notas de la versión: empezar con lo que la
lectora ya puede hacer, seguir con la configuración necesaria, y saltarse la justificación
interna. &lt;a href=&quot;https://changeloop.dev/blog/es/how-to-write-release-notes/&quot;&gt;Cómo escribir notas de la versión&lt;/a&gt; cubre el método
completo; un anuncio de función nueva es el caso de mayor riesgo, porque es la entrada con más
probabilidades de capturarse en pantalla, reenviarse y ser leída por alguien que nunca ha visto
el changelog del producto.&lt;/p&gt;
&lt;h2&gt;¿Cuándo no conviene anunciar algo ampliamente?&lt;/h2&gt;
&lt;p&gt;Cuando la función todavía se está desplegando a un subconjunto de cuentas, es realmente una beta,
o tiene un precio o un bloqueo tal que nueve de cada diez lectoras de un anuncio amplio todavía
no podrían usarla. Un anuncio amplio para una función que nueve de cada diez lectoras no pueden
usar se lee como un anzuelo, y quema la confianza en el próximo anuncio más de lo que genera
entusiasmo en este. La solución no es el silencio, es el alcance: avisar directamente a las
cuentas elegibles y guardar los canales amplios hasta que la disponibilidad alcance al anuncio.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Toda función nueva merece su propio anuncio?&lt;/strong&gt;
Todas se ganan una entrada de changelog. Solo las lo bastante significativas como para cambiar
cómo alguien usa el producto, o las que se pidieron por nombre explícitamente, se ganan los
canales más amplios como el correo o las redes sociales.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es el mejor canal para una función pequeña?&lt;/strong&gt;
Solo el changelog, más un aviso en la app si la función es descubrible dentro de un flujo en el
que la usuaria ya está. El correo y las redes sociales merecen la pena para funciones que
justifican pedir atención.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo se anuncia una función a las personas que específicamente la pidieron?&lt;/strong&gt;
Mantener la solicitud vinculada a quien la pidió desde el momento en que se registra, y notificar
individualmente cuando se lanza, aparte de cualquier anuncio más amplio. Una etiqueta de estado
compartida que quien pidió algo pueda comprobar también reduce cuántos mensajes individuales
hacen falta en primer lugar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Necesita una captura de pantalla el anuncio de una función?&lt;/strong&gt;
Para cualquier cosa visual, sí; una función descrita pero no vista se salta con mucha más
frecuencia que una de la que las lectoras pueden ver una vista previa. Para una API o una
capacidad de backend, un fragmento de código breve cumple la misma función que una captura de
pantalla en un cambio de interfaz.&lt;/p&gt;
</content:encoded></item><item><title>Cómo priorizar solicitudes de funciones que se acumulan</title><link>https://changeloop.dev/blog/es/prioritizing-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/prioritizing-feature-requests/</guid><description>Un backlog deja abierta la pregunta difícil: qué solicitud sale primero. Los marcos que sirven, dónde falla cada uno, y qué esconde el recuento de votos.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Rastrear solicitudes de funciones resuelve dónde viven. No resuelve cuál sale primero, y esa
segunda pregunta es en la que los equipos realmente se atascan. Un backlog de trescientas
solicitudes, agrupadas y etiquetadas, sigue necesitando una regla de decisión, porque &amp;quot;construye lo
más pedido&amp;quot; solo funciona hasta que dos solicitudes están reñidas y una tercera tiene una
defensora ruidosa, que es la mayoría de semanas. Los marcos de abajo no son respuestas que
compiten por la misma pregunta. Cada uno encaja con un tipo distinto de solicitud, y usar uno solo
para todas suele ser el verdadero error.&lt;/p&gt;
&lt;h2&gt;¿Qué hace distinto priorizar solicitudes de funciones de priorizar un roadmap?&lt;/h2&gt;
&lt;p&gt;Una decisión de roadmap parte de la estrategia y pregunta qué construir. Una decisión sobre una
solicitud de función parte de una demanda que ya existe y pregunta si actuar sobre ella, y ambas
tiran en direcciones distintas con la frecuencia suficiente para que una solicitud tenga mucha
demanda y aun así sea incorrecto construirla, o tenga poca demanda y aun así valga la pena porque
desbloquea una cuenta estratégica. Tratar cada solicitud como un voto de roadmap se salta esa
comprobación.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Marco&lt;/th&gt;
&lt;th&gt;Qué pesa&lt;/th&gt;
&lt;th&gt;Dónde falla&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Recuento bruto de peticiones&lt;/td&gt;
&lt;td&gt;Cuánta gente pidió&lt;/td&gt;
&lt;td&gt;Premia nombres pegadizos sobre demanda real&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RICE&lt;/td&gt;
&lt;td&gt;Alcance, impacto, confianza, esfuerzo&lt;/td&gt;
&lt;td&gt;Necesita estimaciones que nadie tiene para una solicitud nueva&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ponderado por ingresos&lt;/td&gt;
&lt;td&gt;Quién pidió, según el valor de la cuenta&lt;/td&gt;
&lt;td&gt;Ignora solicitudes de cuentas que aún no valen mucho&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Votos públicos&lt;/td&gt;
&lt;td&gt;Señal visible y de bajo esfuerzo&lt;/td&gt;
&lt;td&gt;Solo llega a usuarios que ya saben dónde mirar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué es RICE, y funciona con solicitudes de funciones?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.intercom.com/blog/rice-simple-prioritization-for-product-managers/&quot;&gt;RICE&lt;/a&gt; puntúa una
idea en alcance, impacto, confianza y esfuerzo, y luego divide los tres primeros entre el cuarto
para obtener un número comparable. Se creó para ideas de roadmap en las que un equipo ya cree, donde
la parte difícil es comparar apuestas distintas entre sí. Las solicitudes de funciones ya traen un
número de alcance, el recuento de gente que pidió, que es más concreto que el alcance que suele
tener una idea de roadmap nueva. Donde RICE se tensiona con una solicitud es en confianza e
impacto: un equipo puede estar seguro de que una solicitud es real y aun así no tener base para
saber cuánto moverá una métrica, porque &amp;quot;impacto&amp;quot; para una solicitud que ya tiene nombre y rastro
de usuarios reales es un tipo de estimación distinto al impacto de una idea que nadie fuera de la
sala ha visto todavía.&lt;/p&gt;
&lt;p&gt;Usa RICE para solicitudes que se están considerando en serio y no están decididas. No lo apliques a
cada solicitud entrante; el esfuerzo de puntuar solo se justifica en las que están lo bastante
reñidas como para necesitar un desempate.&lt;/p&gt;
&lt;h2&gt;¿Debería ponderarse por ingresos, o por quién pidió?&lt;/h2&gt;
&lt;p&gt;Por quién pidió, pero no solo por ingresos. Una cuenta cerca de renovar, una cuenta que ya ha
escalado antes, y una cuenta cuya solicitud desbloquea un trato en curso llevan una urgencia que
una cifra de ingresos plana no captura por sí sola, y una solicitud de un registro de prueba
puede seguir importando si bloquea una decisión que pronto se convierte en ingresos. La
ponderación por ingresos es la más fácil de calcular de todas estas, y por eso mismo la más fácil
de sobreconfiar: quita correctamente ruido de cuentas sin interés real, y con la misma facilidad
puede degradar una solicitud que traería una cuenta mucho más grande que aún está en el embudo.&lt;/p&gt;
&lt;h2&gt;¿Qué papel juegan realmente los votos?&lt;/h2&gt;
&lt;p&gt;Una señal barata y continua para solicitudes que ya existen, y una mala forma de descubrir qué
solicitudes deberían existir en primer lugar. Un recuento de votos solo llega a los usuarios que
ya encontraron la solicitud y decidieron que merecía un clic, lo que significa que el total de
votos de un roadmap público refleja tanto visibilidad como demanda: una solicitud antigua cerca de
lo alto de la lista sigue acumulando votos en parte porque es fácil de encontrar, y una solicitud
más nueva e igual de real empieza desde cero. El artículo sobre la
&lt;a href=&quot;https://changeloop.dev/blog/es/public-roadmap/&quot;&gt;roadmap pública&lt;/a&gt; defiende dejar los votos fuera de la roadmap por
completo. Trata los votos como una
señal que necesita agruparse y ponderarse por antigüedad, no como una clasificación que se
construye de arriba a abajo.
&lt;a href=&quot;https://changeloop.dev/blog/es/feedback-signal-quality/&quot;&gt;Tickets de soporte vs. solicitudes&lt;/a&gt; cubre el otro punto ciego
en los conteos de votos: una brecha real puede generar casi ningún voto si las usuarias que la
sufren nunca encuentran el tablero, mientras aparece con fuerza en soporte.&lt;/p&gt;
&lt;h2&gt;¿Cuándo gana la cliente más ruidosa, y es un problema?&lt;/h2&gt;
&lt;p&gt;A veces, y solo es un problema cuando nadie lo nota. Una cliente que escala con frecuencia, escribe
tickets detallados o tiene línea directa con alguien del equipo verá sus solicitudes atendidas más
rápido que una cliente más callada con una petición igual de válida, y un proceso de priorización
que nunca lo comprueba favorecerá sistemáticamente a quien más insiste, no a quien tiene el caso
más sólido. Las clientas ruidosas no son el problema que hay que arreglar; sus solicitudes suelen
ser genuinamente importantes. La solución es un hábito: revisar el backlog por origen
periódicamente y comprobar si el mismo puñado de cuentas explica la mayor parte de lo lanzado
últimamente, y preguntarse si eso coincide con dónde está la demanda real.&lt;/p&gt;
&lt;h2&gt;¿Cómo se convierte una decisión de priorización en una respuesta?&lt;/h2&gt;
&lt;p&gt;Cada decisión aquí produce ganadoras y perdedoras, y ambas merecen una respuesta que nombre el
razonamiento real, no solo un cambio de estado sin explicación. &lt;a href=&quot;https://changeloop.dev/blog/es/declining-feature-requests/&quot;&gt;Cómo rechazar una solicitud de
función&lt;/a&gt; cubre qué decir a una solicitud que perdió, de una
forma que mantiene la relación intacta en vez de leerse como un rechazo genérico. El trabajo de
agrupar y etiquetar que hace posible todo esto en primer lugar se cubre en &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-tracking/&quot;&gt;seguimiento de
solicitudes de funciones&lt;/a&gt;; la priorización solo funciona sobre
solicitudes que ya estaban registradas y agrupadas lo bastante bien como para compararlas.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es el mejor marco para priorizar solicitudes de funciones?&lt;/strong&gt;
Ninguno por sí solo. Usa recuentos brutos para encontrar la señal más ruidosa, RICE para comparar
una lista corta de candidatas serias, y una comprobación de ingresos o de cuenta para detectar
casos donde una demanda silenciosa de una cuenta estratégica pesa más que un grupo más ruidoso pero
de menor importancia.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían priorizarse las solicitudes de funciones igual que las ideas de roadmap?&lt;/strong&gt;
No. Las ideas de roadmap parten de la estrategia; las solicitudes de funciones parten de una
demanda que ya existe. Puntuarlas juntas hace que una apuesta estratégica bien argumentada pero con
poca demanda existente pierda de forma consistente frente a una solicitud que simplemente tiene
más gente que la pidió.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Los votos de un roadmap público reflejan la demanda con precisión?&lt;/strong&gt;
Solo entre la gente que ya encontró la solicitud. Las solicitudes más antiguas y visibles
acumulan votos más rápido, sin importar cuánta demanda real haya detrás de una más nueva, así que
trata los totales de votos como una señal, agrupada y ponderada por antigüedad, no como una
clasificación que se construye en orden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Con qué frecuencia deberían reevaluarse las prioridades de solicitudes de funciones?&lt;/strong&gt;
En un ciclo fijo, no solo cuando alguien escala. Una revisión mensual o trimestral que reagrupa
solicitudes y revisa la ponderación detecta desviaciones, como un puñado de cuentas que domina lo
que se lanza, que un proceso puramente reactivo nunca detecta por sí solo.&lt;/p&gt;
</content:encoded></item><item><title>Notas de versión enterprise: qué cambia para una sola cuenta</title><link>https://changeloop.dev/blog/es/private-release-notes-enterprise/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/private-release-notes-enterprise/</guid><description>Las notas de versión enterprise para un cliente en un build privado deben ajustarse a su instancia. Si no, filtran el roadmap o confunden a su soporte.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un producto SaaS público envía las mismas notas de versión a todo el mundo, porque todo el mundo
está en la misma versión. Una clienta enterprise en una versión fija, una instancia dedicada, o un
subconjunto del producto con feature flags rompe ese supuesto: las notas de versión que describen
qué cambió para ella no son las mismas que las de tu blog público, y enviarle las públicas de todos
modos o bien la confunde con cambios que aún no tiene, o, peor, le cuenta sobre una función que el
equipo de cuenta de otra clienta enterprise te pidió expresamente retener de la suya un mes más.
&lt;a href=&quot;https://changeloop.dev/blog/es/release-notes-best-practices/&quot;&gt;Buenas prácticas para notas de versión&lt;/a&gt; cubre el oficio
general; esto trata de escribir notas de versión enterprise para el problema de ajuste que aparece
en cuanto tienes clientas que no están todas en el mismo build.&lt;/p&gt;
&lt;h2&gt;¿Por qué no puede una clienta enterprise simplemente leer el changelog público?&lt;/h2&gt;
&lt;p&gt;Porque describe una versión que quizás todavía no ejecuta, funciones a las que quizás no tiene
acceso, y un calendario que no coincide con el suyo. Una clienta fija a un ciclo de lanzamiento
trimestral que lee sobre una función que salió a la capa pública la semana pasada no tiene forma
de saber, solo con el changelog público, si esa función le llegará la semana que viene o el
próximo trimestre. El changelog público responde &amp;quot;qué cambió en el producto&amp;quot;; la pregunta real de
una clienta enterprise es &amp;quot;qué cambió en la versión que estoy ejecutando, y cuándo recibo el
resto&amp;quot;, algo que el changelog público nunca estuvo escrito para responder.&lt;/p&gt;
&lt;h2&gt;¿Qué necesita una nota de versión privada que una pública no necesita?&lt;/h2&gt;
&lt;p&gt;Un identificador de versión o entorno contra el que la clienta pueda verificar de verdad, y una
declaración explícita de qué no le ha llegado todavía. &amp;quot;Esta versión incluye las mejoras de
exportación masiva de nuestro lanzamiento público 4.3, pero no el nuevo modelo de permisos, que
llega en tu próxima actualización programada&amp;quot; le dice a una administradora enterprise exactamente
dónde está su instancia respecto al producto en general. Una nota de versión pública nunca necesita
este encuadre porque solo hay una instancia respecto a la cual ser relativa; una privada carece de
sentido sin él.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Notas de versión públicas&lt;/th&gt;
&lt;th&gt;Notas de versión privadas (enterprise)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Una versión, una audiencia&lt;/td&gt;
&lt;td&gt;Múltiples versiones, audiencias segmentadas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asume que la lectora tiene cada función descrita&lt;/td&gt;
&lt;td&gt;Debe decir qué tiene y qué no tiene la lectora&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sincronizadas con el lanzamiento público&lt;/td&gt;
&lt;td&gt;Sincronizadas con la ventana propia de actualización de la clienta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Se puede hacer completamente pública de inmediato&lt;/td&gt;
&lt;td&gt;Puede necesitar ocultar puntos que otras clientas aún no tienen&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Alguna vez está bien simplemente retrasar el envío de las notas públicas a clientas enterprise en vez de escribir unas separadas?&lt;/h2&gt;
&lt;p&gt;Solo si su versión de verdad coincide con la pública en ese momento, lo cual es más raro de lo que
suena en cuanto tienes más de un par de cuentas enterprise en calendarios distintos. Retrasar las
notas públicas funciona como parche para una clienta que va una versión atrás y está por
alcanzarla; se rompe en el momento en que dos clientas enterprise están en versiones distintas
entre sí, porque entonces ya no hay &amp;quot;las notas&amp;quot; únicas que retrasar, solo una matriz de lo que
tiene cada una. En ese punto, ajustar las notas por cuenta, aunque sea solo una vista filtrada de
las mismas entradas subyacentes, deja de ser opcional.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Notas públicas, enviadas a una cuenta enterprise que
todavía no tiene la función:
&amp;quot;New: Bulk export now supports custom column ordering.&amp;quot;
(Confuso: la admin lo prueba y no está.)

Notas enterprise ajustadas para la misma cuenta:
&amp;quot;Available in your next update (scheduled for 2026-10-15):
bulk export with custom column ordering. Not yet available
on your current version (3.8).&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Quién dentro de la organización de la clienta lee esto realmente, y eso cambia cómo se escribe?&lt;/h2&gt;
&lt;p&gt;Normalmente una administradora de TI o una contacto de customer success en vez de una usuaria
final, y eso cambia lo que cuenta como útil. Una usuaria final quiere saber qué se ve distinto en
su pantalla; una administradora enterprise quiere saber qué cambió en permisos, manejo de datos,
configuración de SSO, o cualquier cosa que afecte cómo gestiona el despliegue para sus propias
usuarias, porque será ella quien responda las preguntas internas. Una nota de versión privada que
se lee como un changelog de consumidor, todo botones nuevos y relucientes y nada de detalle
operativo, obliga a la administradora a rebuscar la información que en realidad necesitaba.&lt;/p&gt;
&lt;h2&gt;¿Cómo interactúa esto con un roadmap público o un changelog público que ya lista la misma función?&lt;/h2&gt;
&lt;p&gt;Con cuidado, porque una clienta que lea ambos notará cualquier inconsistencia. Si tu changelog
público ya anunció una función que una cuenta enterprise específica todavía no tiene, su nota de
versión privada necesita reconocer esa brecha en vez de fingir que la entrada pública no existe;
una administradora que vio el anuncio público y recibe notas privadas que lo ignoran asumirá o bien
que te olvidaste de ella, o que algo está roto. &lt;a href=&quot;https://changeloop.dev/blog/es/public-roadmap/&quot;&gt;Roadmap pública&lt;/a&gt; cubre
cómo mantener un roadmap honesto sobre qué se lanzó frente a qué está planeado; la versión
enterprise de esa honestidad en notas de versión es nombrar directamente la brecha entre lo público
y lo suyo.&lt;/p&gt;
&lt;h2&gt;¿Necesita una empresa pequeña con solo una o dos clientas enterprise tanta estructura?&lt;/h2&gt;
&lt;p&gt;No el sistema completamente segmentado, pero la disciplina central, decir con claridad en qué
versión está la clienta y qué tiene y qué no tiene, importa en cualquier escala en cuanto tienes
aunque sea una clienta que no está en tu build más reciente. El modo de falla que esto previene,
una administradora confundida sobre si un anuncio público le aplica, cuesta un ticket de soporte y
un golpe a la confianza sin importar si tienes dos cuentas enterprise o doscientas.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían las notas de versión privadas mencionar alguna vez funciones que otras clientas ya tienen pero esta no?&lt;/strong&gt;
Solo si es relevante para su propio calendario, expresado como &amp;quot;llega en tu próxima actualización&amp;quot;
en vez de como comparación con otras clientas. Nombrar lo que tiene otra clienta específica cruza
un territorio que no te corresponde revelar; nombrar lo que llega específicamente a esta clienta es
exactamente la información que necesita.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Pueden las mismas entradas de changelog subyacentes alimentar tanto notas públicas como privadas?&lt;/strong&gt;
Sí, y ese suele ser el enfoque más mantenible: etiqueta las entradas según a qué versiones o
niveles aplican, y luego filtra por audiencia al publicar en vez de escribir dos documentos
totalmente separados que inevitablemente se desincronizan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué pasa si una clienta enterprise pide explícitamente estar en las notas públicas en vez de en un feed privado?&lt;/strong&gt;
Respétalo, pero confirma que entiende que las notas públicas asumen la versión pública, y señala tú
misma por escrito la brecha si su versión difiere de lo descrito. Esa confirmación escrita es lo
que te protege después si actúa según notas públicas que en realidad no aplicaban a su build.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Con cuánta anticipación debería avisarse a una clienta enterprise sobre una función a la que tendrá acceso en el próximo lanzamiento?&lt;/strong&gt;
En cuanto la fecha esté confirmada, no solo al momento del lanzamiento, porque las administradoras
enterprise a menudo necesitan planear su propia comunicación interna o capacitación alrededor de
una función que llega, y una notificación el mismo día no les deja margen para eso.&lt;/p&gt;
</content:encoded></item><item><title>Semantic versioning y tu changelog</title><link>https://changeloop.dev/blog/es/semantic-versioning-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/semantic-versioning-changelog/</guid><description>Semantic versioning le dice a quien llama cuánto puede dolerle un lanzamiento antes de leer el changelog. Qué promete cada número y qué debe una entrada.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Semantic versioning le dice a quien llama cuánto puede dolerle un lanzamiento antes de leer una
sola entrada del changelog. Pasar de &lt;code&gt;2.4.1&lt;/code&gt; a &lt;code&gt;2.5.0&lt;/code&gt; dice: nueva capacidad, nada se rompe.
Pasar de &lt;code&gt;2.5.0&lt;/code&gt; a &lt;code&gt;3.0.0&lt;/code&gt; dice: lee esta entrada antes de actualizar. El changelog y el número
de versión están pensados para afirmar lo mismo en dos formatos, y la mayor parte de la fricción
entre ambos aparece justo cuando no coinciden, lo cual pasa más a menudo de lo que la
especificación sugeriría.&lt;/p&gt;
&lt;h2&gt;¿Qué promete realmente cada número de una versión?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://semver.org/&quot;&gt;Semantic versioning&lt;/a&gt; define tres números, &lt;code&gt;MAJOR.MINOR.PATCH&lt;/code&gt;, cada uno
con una regla estricta sobre qué lo activa. Un salto MAJOR significa un cambio incompatible: algo
que una integración correcta y existente podría notar y por lo que tendría que cambiar. Un salto
MINOR significa nueva funcionalidad compatible hacia atrás: nada existente se rompe, algo nuevo
está disponible. Un salto PATCH significa un arreglo compatible hacia atrás: el comportamiento se
acerca más a lo documentado, y nadie que dependiera del comportamiento anterior a propósito
debería notar nada.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Salto&lt;/th&gt;
&lt;th&gt;Significado&lt;/th&gt;
&lt;th&gt;La entrada debería leerse como&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;MAJOR (&lt;code&gt;1.x.x&lt;/code&gt; -&amp;gt; &lt;code&gt;2.0.0&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Un cambio incompatible&lt;/td&gt;
&lt;td&gt;&amp;quot;Esto requiere acción antes de actualizar&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MINOR (&lt;code&gt;1.2.x&lt;/code&gt; -&amp;gt; &lt;code&gt;1.3.0&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Nueva capacidad compatible&lt;/td&gt;
&lt;td&gt;&amp;quot;Esto ya está disponible, nada más cambió&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PATCH (&lt;code&gt;1.2.3&lt;/code&gt; -&amp;gt; &lt;code&gt;1.2.4&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Un arreglo compatible&lt;/td&gt;
&lt;td&gt;&amp;quot;Esto ahora se comporta como estaba documentado&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La tabla también sirve como prueba a la inversa: si una entrada no se lee como su fila, o el
número de versión está mal, o la entrada está vendiendo de más o de menos lo que realmente pasó.&lt;/p&gt;
&lt;h2&gt;¿Qué cuenta como cambio incompatible a efectos de versionado?&lt;/h2&gt;
&lt;p&gt;La misma prueba que decide si algo pertenece a un changelog de API: si una llamada correcta,
escrita contra el comportamiento anterior y sin tocar desde entonces, podría comportarse distinto
por este cambio. &lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;Qué es un cambio incompatible y cómo lanzarlo&lt;/a&gt; cubre
la decisión al completo, incluidos los casos que parecen incompatibles y no lo son, y los que
parecen pequeños y no lo son. En resumen para el versionado: si la respuesta es sí, el salto es
MAJOR sin importar cuánto código haya tocado internamente el cambio. Los números de versión
siguen la consecuencia para quien llama, no el esfuerzo del equipo.&lt;/p&gt;
&lt;h2&gt;¿Cómo debería relacionarse una entrada de changelog con un salto de versión?&lt;/h2&gt;
&lt;p&gt;Una entrada, una categoría de salto, dicha desde el principio. El patrón de la tabla continúa
directamente: una entrada incompatible va bajo la versión que la introdujo, redactada primero
como advertencia y después como descripción. Una entrada aditiva va bajo su versión MINOR,
redactada como disponibilidad. Un arreglo va bajo su versión PATCH, redactado como corrección.
Mezclar categorías en una entrada, como meter un cambio incompatible en el mismo párrafo que un
arreglo sin relación, es la forma en que una lectora se pierde justo lo único que realmente
importaba.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 3.0.0 (2026-09-07)

### Changed
- **BREAKING:** `GET /reports` ahora devuelve los importes como
  enteros en la unidad monetaria más pequeña (centavos) en lugar de
  decimales. Actualiza cualquier código que lea `amount` directamente.

## 2.9.0 (2026-09-01)

### Added
- Los informes ahora se pueden filtrar por `status`.

## 2.8.4 (2026-08-28)

### Fixed
- `GET /reports?status=` devolvía una página vacía en vez de un 400
  para un estado desconocido.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Leído de arriba abajo, el número de versión y la etiqueta de sección dicen lo mismo dos veces, y
ese es justo el objetivo: una lectora que solo repasa los encabezados obtiene una lectura de
riesgo correcta antes de abrir una sola línea.&lt;/p&gt;
&lt;h2&gt;¿La regla de cambio incompatible aplica igual antes de la 1.0.0?&lt;/h2&gt;
&lt;p&gt;No, y aquí es donde viene la mayor parte de la confusión sobre &amp;quot;eso fue realmente incompatible&amp;quot;.
SemVer es explícito en que la versión mayor cero, &lt;code&gt;0.y.z&lt;/code&gt;, es para desarrollo inicial: cualquier
cosa puede cambiar en cualquier momento, y la API pública no debería considerarse estable. Un salto
de &lt;code&gt;0.4.0&lt;/code&gt; a &lt;code&gt;0.5.0&lt;/code&gt; puede llevar un cambio incompatible sin violar la especificación, porque la
garantía de versión mayor solo empieza en cuanto un proyecto lanza &lt;code&gt;1.0.0&lt;/code&gt;. Una entrada de changelog
sigue debiéndoles a las lectoras la misma honestidad sobre qué se rompió; lo único que cambia es que
el número de versión en sí no es la señal en la que confiar antes de que llegue la 1.0.0.&lt;/p&gt;
&lt;h2&gt;¿Y si tu producto no lanza versiones discretas?&lt;/h2&gt;
&lt;p&gt;La mayoría de los productos SaaS despliegan de forma continua y nunca muestran un número de
versión a quien llama, lo que no elimina la necesidad de esta disciplina, solo el número que
normalmente la llevaría. La entrada de changelog tiene que hacer todo el trabajo sola: decir con
claridad si un cambio es incompatible, aditivo o un arreglo, con las mismas tres palabras que usa
semantic versioning, incluso sin un campo de versión al que atarlas. Algunos equipos mantienen
una versión puramente interna solo para anclar entradas de changelog a algo enlazable, sin
mostrarla nunca directamente a quien llama.&lt;/p&gt;
&lt;h2&gt;¿Cómo se aplica esto específicamente a un changelog de API?&lt;/h2&gt;
&lt;p&gt;De forma más estricta que en casi cualquier otro sitio, porque quienes llaman a una API son
código, no personas que puedan encogerse de hombros ante un cambio inesperado. &lt;a href=&quot;https://changeloop.dev/blog/es/api-changelog/&quot;&gt;Changelog de API: qué publicar y quién lo lee&lt;/a&gt;
cubre la forma completa de ese documento; la disciplina de versionado aquí es lo que mantiene
honestas sus secciones de cambios incompatibles y aditivos. Una API que ofrece varias versiones a
la vez, como &lt;code&gt;v1&lt;/code&gt; y &lt;code&gt;v2&lt;/code&gt; servidas en paralelo durante una ventana de migración, está aplicando
semantic versioning en la práctica a escala de toda la interfaz en lugar de un solo paquete, y el
mismo vocabulario de tres palabras sigue aplicándose a cada entrada.&lt;/p&gt;
&lt;h2&gt;¿Qué dice Keep a Changelog sobre el versionado?&lt;/h2&gt;
&lt;p&gt;Se vincula directamente por nombre con semantic versioning y recomienda el mismo vocabulario de
categorías que usa este artículo: Added, Changed, Deprecated, Removed, Fixed, Security. &lt;a href=&quot;https://changeloop.dev/blog/es/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog, en la práctica&lt;/a&gt;
recorre cómo adoptar esa especificación, incluidos los puntos donde los equipos suelen desviarse.
La coincidencia no es casualidad: ambas especificaciones intentan resolver el mismo problema
desde extremos opuestos, una estandariza el número de versión y la otra la entrada que lo
explica.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Necesita toda entrada de changelog un número de versión?&lt;/strong&gt;
Si el producto lanza versiones, sí, porque el número permite a una lectora saltar directamente a
&amp;quot;cuánto me afecta esto&amp;quot; sin leer la entrada primero. Si el producto despliega de forma continua
sin campo de versión, la redacción de la entrada tiene que llevar esa señal sola.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la diferencia entre un salto MAJOR y una entrada de cambio incompatible?&lt;/strong&gt;
Deberían ser el mismo evento descrito de dos formas. El número de versión es la señal legible
por máquinas (las herramientas de quien llama pueden reaccionar a ella); la entrada de changelog
es la explicación legible por humanos de qué cambió concretamente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede un lanzamiento PATCH ser incompatible?&lt;/strong&gt;
Por definición no debería. Si aun así se publicó uno, no edites ni vuelvas a etiquetar la versión
publicada: la &lt;a href=&quot;https://semver.org/#what-do-i-do-if-i-accidentally-release-a-backward-incompatible-change-as-a-minor-version&quot;&gt;FAQ de SemVer&lt;/a&gt;
dice que publiques una nueva versión que restaure la compatibilidad, o una nueva MAJOR si la
ruptura se queda, y que documentes la versión problemática para que los usuarios sepan saltársela.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Necesitan los cambios puramente internos un salto de versión?&lt;/strong&gt;
No. Semantic versioning sigue la interfaz pública. Una refactorización sin efecto observable
para quien llama no necesita salto ni entrada de changelog, aunque haya sido trabajo de
ingeniería importante.&lt;/p&gt;
</content:encoded></item><item><title>El header sunset de una API, y cuándo enviarlo</title><link>https://changeloop.dev/blog/es/sunsetting-api-version/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/sunsetting-api-version/</guid><description>El header sunset de una API dice cuándo una versión dejará de responder, a diferencia de una deprecación. Qué cubre RFC 8594 y qué aporta un brownout.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;Sunset&lt;/code&gt; es un único header de respuesta, definido en &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8594&quot;&gt;RFC 8594&lt;/a&gt;,
que le dice a un llamante cuándo un recurso dejará de responder. &lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;Deprecación de
API&lt;/a&gt; cubre el calendario completo de anunciar-recordar-degradar-retirar
y los avisos que lo acompañan; esto trata de la única señal legible por máquina en ese calendario,
qué dice en realidad, y el único caso en que la propia RFC dice que no hay que enviarla.&lt;/p&gt;
&lt;h2&gt;¿Qué dice el header Sunset, y qué no dice?&lt;/h2&gt;
&lt;p&gt;Lleva una única fecha HTTP, el punto en el que se espera que el recurso deje de responder:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sunset: Sat, 31 Dec 2028 23:59:59 GMT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La RFC lo llama una pista, no una garantía: no promete que el recurso seguirá funcionando hasta ese
momento exacto, y no dice nada sobre cómo se verá el fallo después. Los llamantes pueden recibir un
4xx, una redirección, o ninguna respuesta; el header no distingue. Una fecha ya pasada significa
&amp;quot;ahora, o en cualquier momento&amp;quot; en vez de un error en el valor. Nada de esto lo hace cumplir el
protocolo. Un cliente que nunca lee el header se comporta exactamente como siempre lo ha hecho, y
descubre que el recurso desapareció de la misma forma en que lo habría descubierto de todos modos.&lt;/p&gt;
&lt;h2&gt;¿Cuándo deberías enviarlo en realidad?&lt;/h2&gt;
&lt;p&gt;Solo cuando el recurso vaya a dejar de responder de verdad, no mientras simplemente ya no es la
opción recomendada. La RFC es explícita en que la deprecación ocurre en dos etapas, y el campo del
header Sunset pertenece solo a la segunda: la API sigue completamente operativa durante la primera
etapa, el anuncio de que una versión ya no es la preferida, y el campo no aplica ahí. Aplica en
cuanto la versión de verdad tiene programado dejar de responder.&lt;/p&gt;
&lt;p&gt;Eso encaja directamente con el calendario de deprecación: el header &lt;code&gt;Deprecation&lt;/code&gt; sale desde el
primer día, en el paso del anuncio; &lt;code&gt;Sunset&lt;/code&gt; describe la fecha en que el comportamiento antiguo de
verdad se detendrá, la misma fecha que &lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;el calendario de cuatro pasos&lt;/a&gt;
llama la retirada. Enviar &lt;code&gt;Sunset&lt;/code&gt; el primer día no está mal, porque la fecha ya está fijada para
entonces, pero enviarlo sin haber anunciado también una deprecación, o fijarlo para una versión que
en realidad no te has comprometido a retirar, le dice a los llamantes algo que todavía no has
decidido.&lt;/p&gt;
&lt;h2&gt;¿Interactúa con el cacheo?&lt;/h2&gt;
&lt;p&gt;No, y la RFC lo dice directamente: &lt;code&gt;Sunset&lt;/code&gt; y el cacheo HTTP resuelven problemas sin relación entre
sí y deben leerse como complementarios, no como superpuestos. Los headers de caché dicen cuándo es
seguro reutilizar una copia cacheada; &lt;code&gt;Sunset&lt;/code&gt; no dice nada sobre el estado actual del recurso, solo
que el recurso en sí dejará de existir. Una respuesta puede ser totalmente cacheable hasta el mismo
momento en que se retira. No uses uno para aproximar el otro, ni asumas que un &lt;code&gt;max-age&lt;/code&gt; largo
cancela una fecha de sunset cercana, ni al revés.&lt;/p&gt;
&lt;h2&gt;¿Puede un solo header retirar más de un endpoint?&lt;/h2&gt;
&lt;p&gt;El header aplica al recurso que lo devolvió, pero la RFC permite que un servicio documente un
alcance más amplio: una fecha Sunset en el recurso raíz de una API puede definirse para significar
que toda la API desaparece, no solo esa URL. La trampa es que esto solo funciona para llamantes que
ya conocen tu regla de alcance. Un llamante que lee el header al pie de la letra ve un sunset en el
único recurso que pidió y nada más, así que un alcance más amplio tiene que quedar escrito en algún
sitio donde un llamante pueda encontrarlo, no dado por sentado.&lt;/p&gt;
&lt;h2&gt;¿Qué debería acompañar al header?&lt;/h2&gt;
&lt;p&gt;Un link a donde se explica la retirada. RFC 8594 registra su propia relación de link &lt;code&gt;sunset&lt;/code&gt;
exactamente para esto: apuntar a un recurso que describe la política de retirada, la fecha próxima,
o cómo migrar, por separado de la fecha desnuda del header.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Sunset: Sat, 31 Dec 2028 23:59:59 GMT
Link: &amp;lt;https://example.com/docs/sunset-policy&amp;gt;; rel=&amp;quot;sunset&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Apuntar ese link a tus propios &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;ejemplos de changelog&lt;/a&gt; o a una página de
migración dedicada convierte un header que casi ningún código cliente inspecciona en algo que una
persona que sí investiga encuentra de inmediato. Combínalo con la relación &lt;code&gt;successor-version&lt;/code&gt; de
&lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/#which-headers-should-a-deprecated-endpoint-send&quot;&gt;los headers de deprecación&lt;/a&gt;
y un llamante obtiene tanto a dónde ir como qué reemplaza a este, solo con la respuesta.&lt;/p&gt;
&lt;h2&gt;¿Cómo se ve esto de principio a fin?&lt;/h2&gt;
&lt;p&gt;Supón que &lt;code&gt;v1&lt;/code&gt; desaparece el 1 de marzo de 2027. El anuncio de deprecación del primer día añade
&lt;code&gt;Deprecation&lt;/code&gt; y &lt;code&gt;Link: rel=&amp;quot;successor-version&amp;quot;&lt;/code&gt; a cada respuesta de &lt;code&gt;v1&lt;/code&gt;, según &lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;los headers de
deprecación&lt;/a&gt;, pero espera con &lt;code&gt;Sunset&lt;/code&gt; hasta que la fecha de retirada
esté fijada de verdad en vez de ser un marcador de posición. Una vez que lo está, cada respuesta de
&lt;code&gt;v1&lt;/code&gt; lleva:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Deprecation: @1756425600
Sunset: Mon, 01 Mar 2027 00:00:00 GMT
Link: &amp;lt;https://api.example.com/v2/reports&amp;gt;; rel=&amp;quot;successor-version&amp;quot;
Link: &amp;lt;https://example.com/docs/sunset-policy&amp;gt;; rel=&amp;quot;sunset&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El gateway o el monitoreo de un llamante puede alertar sobre cualquiera de los dos headers de forma
independiente: &lt;code&gt;Deprecation&lt;/code&gt; dice que existe una versión más nueva, &lt;code&gt;Sunset&lt;/code&gt; dice que esta tiene un
reloj corriendo. Ningún header necesita cambiar antes del 1 de marzo; lo que cambia es la respuesta
en sí, el día señalado, y durante cualquier ventana de brownout programada antes.&lt;/p&gt;
&lt;h2&gt;¿Un brownout cambia lo que dice el header?&lt;/h2&gt;
&lt;p&gt;El valor del header no necesita moverse por un brownout programado: la fecha de sunset sigue siendo
la fecha de sunset, falle o no el recurso de forma intermitente antes de ella. Lo que cambia es la
respuesta, no el header. Programar ventanas breves de &lt;code&gt;410 Gone&lt;/code&gt; en las semanas previas a la fecha
anunciada, como describe &lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;Deprecación de API&lt;/a&gt;, es lo que convierte el
primer contacto de un llamante con el fallo en un ensayo en vez de la cosa real el día en que llega
la fecha del header.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Algún cliente HTTP o herramienta real lee de verdad el header Sunset?&lt;/strong&gt;
Raramente, del lado del cliente. Su valor está sobre todo en quien opera la infraestructura entre tú
y el llamante: un gateway de API o una herramienta de monitoreo que configures para vigilar el
header puede alertar a tu propio equipo, o al de una socia, mucho antes de que el código del
llamante lo note siquiera. Trátalo como una señal alrededor de la cual construyes herramientas, no
como una que puedas asumir que el otro lado ya tiene.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Es &lt;code&gt;Sunset&lt;/code&gt; lo mismo que &lt;code&gt;Cache-Control: max-age&lt;/code&gt;?&lt;/strong&gt;
No. &lt;code&gt;max-age&lt;/code&gt; trata de cuánto tiempo sigue siendo válida una copia cacheada; &lt;code&gt;Sunset&lt;/code&gt; trata de
cuándo el recurso deja de existir del todo. Una respuesta puede llevar un &lt;code&gt;max-age&lt;/code&gt; corto y una
fecha &lt;code&gt;Sunset&lt;/code&gt; a años de distancia, o al revés, y ningún header limita al otro.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puedo enviar Sunset para un solo campo que desaparece, no para todo el endpoint?&lt;/strong&gt;
No, el header tiene alcance de recurso, es decir la URL, no un campo dentro de su cuerpo de
respuesta. Para un campo, un parámetro o un valor de enum que desaparece mientras el endpoint en sí
sigue en pie, usa el header &lt;code&gt;Deprecation&lt;/code&gt; y una entrada de changelog en su lugar; &lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;Deprecación de
API&lt;/a&gt; cubre cómo anunciar exactamente ese tipo de cambio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué pasa si la fecha de sunset necesita moverse?&lt;/strong&gt;
Actualiza el valor del header y dilo en la entrada de changelog que la anunció originalmente;
cambiar una fecha publicada en silencio es cómo un llamante decide que ninguna de tus fechas es
real. La RFC enmarca el valor como una pista precisamente porque las fechas a veces sí se mueven,
pero una fecha movida sin explicación te cuesta también la siguiente.&lt;/p&gt;
</content:encoded></item><item><title>Changelogs de webhooks: el breaking change que nadie pidió</title><link>https://changeloop.dev/blog/es/webhook-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/webhook-changelog/</guid><description>Un cambio en el payload de un webhook rompe en silencio, porque nadie lo rechaza. Qué hace que un cambio de payload sea rompedor y cómo versionarlo.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un changelog de API REST existe porque un consumidor puede elegir rechazar una respuesta que no
entiende, o al menos registrar un error lo bastante ruidoso para que alguien lo note. Un receptor
de webhook rara vez hace ninguna de las dos cosas. Recibe un POST, lee los campos que espera, y si
un campo se movió, cambió de tipo o desapareció, el endpoint o bien falla en silencio dentro de un
job en segundo plano que nadie vigila o, peor, sigue funcionando con un valor incorrecto que nunca
validó. &lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;Qué es un breaking change&lt;/a&gt; cubre la definición general; un
payload de webhook necesita su propia respuesta, porque el modo de fallo es distinto al de un
endpoint que alguien llama a propósito.&lt;/p&gt;
&lt;h2&gt;¿Por qué un cambio de payload de webhook rompe distinto que un cambio en la respuesta de una API?&lt;/h2&gt;
&lt;p&gt;Porque la dirección de la petición está invertida. Un consumidor REST inicia la llamada y puede
añadir una cabecera de versión, reintentar ante un 4xx o leer un aviso de deprecación en la
respuesta. Un receptor de webhook no inició nada de eso: tu servidor decidió enviar, decidió
cuándo, y decidió qué forma tendría el cuerpo. La única palanca del receptor es la validación que
escribió cuando se construyó la integración, y la mayoría de integraciones se construyen una vez,
funcionan, y nadie las revisa de nuevo hasta que se rompen. Esa asimetría es todo el motivo por el
que un cambio de payload de webhook merece más cautela que el mismo cambio en un cuerpo de
respuesta que un consumidor pidió activamente.&lt;/p&gt;
&lt;h2&gt;¿Qué cuenta realmente como breaking change en un payload de webhook?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cambio&lt;/th&gt;
&lt;th&gt;Rompedor para la mayoría de receptores&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Añadir un campo nuevo&lt;/td&gt;
&lt;td&gt;No, si los receptores ignoran campos desconocidos (verifica esta suposición, no la des por hecha)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eliminar un campo&lt;/td&gt;
&lt;td&gt;Sí, si algo lo lee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Renombrar un campo&lt;/td&gt;
&lt;td&gt;Sí, funcionalmente idéntico a eliminar el antiguo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cambiar el tipo de un campo (string a objeto)&lt;/td&gt;
&lt;td&gt;Sí, casi siempre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reordenar campos en el cuerpo JSON&lt;/td&gt;
&lt;td&gt;No, para cualquier receptor que parsee por clave, que deberían ser todos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cambiar el nombre o tipo de evento&lt;/td&gt;
&lt;td&gt;Sí, si los receptores filtran o enrutan por él&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La fila de &amp;quot;añadir un campo es seguro&amp;quot; es la que más se apoyan los equipos y la que más vale la
pena verificar en vez de asumir. Un parser JSON permisivo ignora campos desconocidos por defecto,
pero un receptor que deserializa en un esquema estricto, varios lenguajes tipados lo hacen sin
configuración extra, puede rechazar todo el payload en cuanto aparece un campo inesperado. Añadir
un campo es seguro para tu webhook solo si sabes cómo parsean los receptores, no porque JSON en sí
sea permisivo.&lt;/p&gt;
&lt;h2&gt;¿Cómo se versiona un payload de webhook?&lt;/h2&gt;
&lt;p&gt;Más o menos como para una respuesta de API, con un matiz: el receptor nunca envía una petición,
así que no puede pedir una versión, y el emisor tiene que indicarla. Puede ir en el cuerpo o en una
cabecera de la petición de la propia entrega;
&lt;a href=&quot;https://docs.github.com/en/webhooks/webhook-events-and-payloads&quot;&gt;las entregas de GitHub&lt;/a&gt; llevan
&lt;code&gt;X-GitHub-Event&lt;/code&gt; y &lt;code&gt;X-GitHub-Hook-ID&lt;/code&gt;, y la
&lt;a href=&quot;https://github.com/standard-webhooks/standard-webhooks/blob/main/spec/standard-webhooks.md&quot;&gt;especificación Standard Webhooks&lt;/a&gt;
pone sus metadatos en cabeceras &lt;code&gt;webhook-*&lt;/code&gt;. Un campo de versión en el payload (&lt;code&gt;&amp;quot;payload_version&amp;quot;: 2&lt;/code&gt;) es la opción más barata y
funciona cuando los receptores están dispuestos a bifurcar según él. Un tipo de evento versionado
(&lt;code&gt;invoice.updated&lt;/code&gt; se convierte en &lt;code&gt;invoice.updated.v2&lt;/code&gt; como un evento distinto al que un receptor
se suscribe voluntariamente) cuesta más de construir pero significa que la forma antigua sigue
llegando a quien nunca migró, lo cual importa más aquí que en un endpoint REST porque no puedes
llamar a cada receptor para pedirle que actualice. Un ajuste por suscripción, elegido al registrar
el endpoint del webhook, adelanta la decisión en vez de bifurcar en cada entrega, y es la opción
correcta cuando ya tienes un registro de suscripción al que engancharlo.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST /endpoint-del-receptor
{
  &amp;quot;event&amp;quot;: &amp;quot;invoice.updated&amp;quot;,
  &amp;quot;payload_version&amp;quot;: 2,
  &amp;quot;data&amp;quot;: { &amp;quot;invoice_id&amp;quot;: &amp;quot;inv_123&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;paid&amp;quot; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Cómo sabes siquiera quién está escuchando?&lt;/h2&gt;
&lt;p&gt;Peor que la versión equivalente de este problema en un changelog de API, porque un webhook no
tiene un registro de peticiones entrantes en tu lado que nombre al consumidor; solo tienes tu
propio registro de entregas salientes, que te dice que un endpoint recibió un 200, no qué hizo con
el cuerpo. Rastrea al menos dos cosas: cada endpoint registrado con una dueña, la misma disciplina
que &lt;a href=&quot;https://changeloop.dev/blog/es/internal-api-changelog/&quot;&gt;los changelogs de API interna&lt;/a&gt; recomiendan para consumidores
internos, y tu tasa de fallos de entrega por endpoint tras un cambio de payload. Un pico de
respuestas 4xx o 5xx desde un endpoint justo después de un cambio es lo más cercano a un stack
trace que vas a obtener, y a menudo es la única señal de que un receptor se rompió, porque el
equipo que lo opera puede tardar días en notarlo.&lt;/p&gt;
&lt;h2&gt;¿Debería un changelog de webhooks estar separado del changelog de API?&lt;/h2&gt;
&lt;p&gt;Una sección aparte en la misma página, no una publicación distinta.
&lt;a href=&quot;https://changeloop.dev/blog/es/api-changelog/&quot;&gt;Un changelog de API&lt;/a&gt; ya establece quién lo lee y cómo se suscribe; un
cambio de payload de webhook pertenece al mismo feed, etiquetado con la claridad suficiente para
que una desarrolladora del lado receptor que busca &amp;quot;esto afecta a mi integración&amp;quot; pueda filtrarlo,
porque una consumidora de webhooks a menudo no tiene otro motivo para revisar un changelog general
de API y solo lo encontrará si alguien la enlaza directamente ahí.&lt;/p&gt;
&lt;h2&gt;¿Cómo debería ser una ventana de deprecación razonable para un payload de webhook?&lt;/h2&gt;
&lt;p&gt;Más larga que la deprecación REST equivalente, porque migrar del lado receptor normalmente
significa que otro equipo, uno con el que quizá no tengas línea directa, tiene que notarlo,
planificarlo y lanzarlo sin urgencia propia. Un mes es un mínimo razonable para un campo que el
receptor plausiblemente sigue parseando con una librería permisiva; tres meses o más es más seguro
para eliminar un campo que un esquema estricto rechazaría por completo. Envía la forma antigua y
la nueva juntas durante la ventana cuando sea posible (el campo antiguo &lt;code&gt;status&lt;/code&gt; y su
reemplazo de la versión 2 en el mismo payload), porque un receptor que lee el campo antiguo sigue
funcionando sin tocar su código, y uno que ya migró simplemente ignora el campo que ya no
necesita.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Los consumidores de webhooks necesitan confirmar un cambio de payload antes de que se publique?&lt;/strong&gt;
No existe un mecanismo de confirmación por defecto, y por eso la ventana de deprecación importa
más aquí que en una API REST: nadie confirma estar listo, así que la ventana tiene que ser lo
bastante larga para que la mayoría de receptores migre por su cuenta antes de que la forma antigua
desaparezca.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Alguna vez es seguro añadir campos desconocidos sin avisar?&lt;/strong&gt;
Solo una vez que has verificado, no asumido, que tus receptores parsean de forma permisiva. Una
entrada de changelog cuesta poco y elimina la incertidumbre; añadir campos en silencio asumiendo
que &amp;quot;los parsers JSON ignoran los extras&amp;quot; rompe a cualquier receptor con deserialización estricta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la forma más rápida de detectar un receptor de webhook roto tras un cambio de payload?&lt;/strong&gt;
Una tasa de fallos de entrega por endpoint, observada en las horas justo después del cambio. No te
dirá qué se rompió, solo que algo se rompió, pero es la señal más temprana y a menudo la única que
obtendrás.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿La lógica de reintentos ayuda a los receptores a sobrevivir a un cambio de payload?&lt;/strong&gt;
No. Un reintento reenvía el mismo payload nuevo; no vuelve a una forma que el receptor pueda
parsear. Un cambio de payload rompe a un receptor en la primera entrega y en cada reintento
siguiente de la misma forma.&lt;/p&gt;
</content:encoded></item><item><title>Changelog: qué es, con un ejemplo de entrada</title><link>https://changeloop.dev/blog/es/what-is-a-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/what-is-a-changelog/</guid><description>Un changelog es el registro fechado de lo que cambió en un producto. Con un ejemplo de entrada, la diferencia con las release notes y dónde publicarlo.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un changelog es el registro fechado de lo que cambió en un producto, escrito para las personas a
quienes afecta el cambio, no para el equipo que lo lanzó. Cada entrada nombra un cambio, dice
cuándo entró en vigor y dice qué debe hacer la lectora al respecto, que en la mayoría de las
entradas es nada. Esa última parte es lo que separa un changelog de un registro de commits: un
registro de commits es para quienes escribieron el código, y un changelog es para quienes lo
usan.&lt;/p&gt;
&lt;h2&gt;¿Qué es un changelog, exactamente?&lt;/h2&gt;
&lt;p&gt;Una lista de entradas fechadas, la más reciente primero, cada una describe un solo cambio en
términos que la lectora puede comprobar. No lo que el equipo construyó, sino lo que ahora es
distinto. &amp;quot;Refactorizado el servicio de facturación&amp;quot; es un mensaje de commit. &amp;quot;Las facturas
ahora muestran el impuesto como una línea separada&amp;quot; es una entrada de changelog, porque le dice
a la lectora algo que puede verificar en su propia cuenta.&lt;/p&gt;
&lt;p&gt;El formato es antiguo y deliberadamente sencillo: un encabezado por lanzamiento o por día, una
lista corta debajo, a veces una etiqueta de categoría. &lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;
es la especificación más citada para esta forma, y existe porque la mayoría de los proyectos que
se saltan una especificación acaban volcando su historial de commits en su lugar, lo que
responde a una pregunta distinta de la que trajo la lectora.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Documento&lt;/th&gt;
&lt;th&gt;Escrito para&lt;/th&gt;
&lt;th&gt;Responde&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Changelog&lt;/td&gt;
&lt;td&gt;Cualquiera que use el producto&lt;/td&gt;
&lt;td&gt;¿Qué cambió, y cuándo?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registro de commits&lt;/td&gt;
&lt;td&gt;El equipo que escribió el código&lt;/td&gt;
&lt;td&gt;¿Qué se hizo, y en qué orden?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notas de la versión&lt;/td&gt;
&lt;td&gt;Usuarias decidiendo si actualizar&lt;/td&gt;
&lt;td&gt;¿Qué puedo hacer ahora que antes no podía?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notas de parche&lt;/td&gt;
&lt;td&gt;Jugadoras o usuarias de un fix concreto&lt;/td&gt;
&lt;td&gt;¿Qué arregló exactamente este lanzamiento?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roadmap&lt;/td&gt;
&lt;td&gt;Cualquiera que se pregunte qué sigue&lt;/td&gt;
&lt;td&gt;¿Qué está planeado, y en qué punto va?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Los cinco se solapan en la práctica, pero no son el mismo documento, y la diferencia está en
quién lo tiene en la mano cuando lo lee. Un changelog es el que está construido para buscarse y
enlazarse después, por lo que sus entradas necesitan fechas y URLs estables más que los otros.&lt;/p&gt;
&lt;h2&gt;¿Qué contiene realmente una entrada de changelog?&lt;/h2&gt;
&lt;p&gt;Cuatro cosas, en este orden: qué cambió, expresado en términos de lo que la usuaria o el cliente
que llama notaría; cuándo entró en vigor; a qué categoría pertenece (added, fixed, changed,
removed son las cuatro habituales); y, cuando importa, qué tiene que hacer la lectora al
respecto. Un enlace a más detalle es bienvenido. Un párrafo de justificación interna no lo es,
porque la lectora no preguntó por qué, preguntó qué.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 2026-09-07

### Added
- Las facturas ahora muestran el impuesto como una línea separada, en la
  moneda de la cuenta del cliente.

### Fixed
- Exportar un informe como CSV ya no descarta la última fila cuando el
  informe supera las 10.000 filas.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Esa forma escala desde una actualización de dos líneas hasta cien entradas en un lanzamiento sin
cambiar de estructura, y esa es la verdadera prueba de si un formato funciona: si se lee igual en
una semana cargada que en una tranquila.&lt;/p&gt;
&lt;h2&gt;¿Quién escribe un changelog, y cuándo?&lt;/h2&gt;
&lt;p&gt;Quien hizo el cambio, en el momento de lanzarlo, no una redactora técnica reconstruyéndolo a
partir de tickets una semana después. Quien tocó el código sabe qué cambió realmente para la
usuaria; un resumen escrito después tiende a describir el ticket en lugar de lo que realmente se
lanzó, y eso suele ser más amplio o más estrecho que el alcance real. Algunos equipos añaden un
paso de revisión antes de publicar una entrada, sobre todo para atrapar lenguaje interno que se
haya colado, y esa revisión debería ser lo bastante rápida como para que la entrada se publique
el mismo día.&lt;/p&gt;
&lt;h2&gt;¿Dónde debería vivir un changelog?&lt;/h2&gt;
&lt;p&gt;En su propia página, con una URL estable, distribuido como feed. Enterrado en un menú de
configuración o en una etiqueta de release en un alojador de código, solo llega a quienes ya
sabían dónde buscar. Una página pública se puede enlazar desde un ticket de soporte, citar en una
reseña o suscribir. El feed importa tanto como la página: una lectora que revisa el changelog de
un producto una vez al mes es rara, una que se suscribe no lo es, y solo el feed atiende a la
segunda.&lt;/p&gt;
&lt;h2&gt;¿En qué se diferencia de las notas de la versión?&lt;/h2&gt;
&lt;p&gt;Se confunden constantemente y son lo bastante distintos como para que mezclarlos produzca un
documento que no sirve bien a ninguna de las dos lectoras. &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-vs-release-notes/&quot;&gt;Changelog vs notas de la versión&lt;/a&gt;
recorre la distinción completa; en resumen, un changelog es el registro completo y cronológico, y
las notas de la versión son un subconjunto curado, escrito para que una actualización suene
digna de tener. Un producto suele necesitar ambos, dirigidos a momentos distintos del día de la
lectora.&lt;/p&gt;
&lt;h2&gt;¿Qué hace que un changelog merezca la pena leerse?&lt;/h2&gt;
&lt;p&gt;Especificidad y honestidad sobre su propio alcance. &amp;quot;Varios arreglos&amp;quot; es la frase que enseña a
una lectora a dejar de abrir la página, porque no promete nada que pueda comprobar. Una entrada
que nombra el comportamiento exacto que cambió, incluso en un fix pequeño, es la que mantiene una
suscripción viva. Esa disciplina también se aplica a lo que se omite: un changelog que solo
anuncia logros y nunca un arreglo para algo que estaba roto se lee como marketing disfrazado de
changelog, y las lectoras lo notan.&lt;/p&gt;
&lt;p&gt;La disciplina de versionado también cuenta. &lt;a href=&quot;https://changeloop.dev/blog/es/semantic-versioning-changelog/&quot;&gt;Semantic versioning y tu changelog&lt;/a&gt;
explica cómo deberían coincidir el número de versión y la entrada, para que una lectora que
recorre el historial de versiones reciba la misma señal dos veces en vez de dos distintas.&lt;/p&gt;
&lt;h2&gt;¿Cómo se generan los changelogs?&lt;/h2&gt;
&lt;p&gt;De dos formas, y la mayoría de las configuraciones reales son una mezcla. La generación
automatizada lee mensajes de commit, normalmente en formato &lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/&quot;&gt;Conventional Commits&lt;/a&gt;,
y los convierte en entradas sin que nadie toque la salida; &lt;a href=&quot;https://changeloop.dev/blog/es/conventional-commits-changelog/&quot;&gt;de conventional commits a changelog&lt;/a&gt;
cubre esa canalización. La generación curada significa que alguien escribe o edita cada entrada
a mano. La salida automatizada es más rápida y nunca se pierde un pull request fusionado, pero
hereda cada mensaje de commit vago tal cual, así que la mayoría de los equipos que automatizan
igual mantienen un repaso ligero antes de publicar en lugar de mostrar la salida en bruto.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Todo producto necesita un changelog?&lt;/strong&gt;
Cualquier producto con usuarias afectadas por el cambio lo necesita, ya sea una app SaaS, una
herramienta interna o una API pública. La forma se ajusta (un changelog de API se lee distinto al
de una app de consumo), pero la necesidad no.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué es un changelog en términos de software?&lt;/strong&gt;
La misma definición de arriba: una lista fechada y cronológica de lo que cambió en el software,
escrita para quienes lo usan, no para quienes lo construyeron.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Se puede generar un changelog automáticamente a partir de commits?&lt;/strong&gt;
Sí, y muchos equipos hacen exactamente eso, normalmente a partir de mensajes en formato
Conventional Commits. La contrapartida es que una entrada generada es tan clara como el mensaje
de commit del que proviene, así que un repaso antes de publicar atrapa las que necesitan
reformularse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Es un changelog lo mismo que un historial de versiones?&lt;/strong&gt;
Lo bastante parecido como para que los términos se usen indistintamente. Un historial de
versiones a veces solo es una lista de números y fechas sin descripción; un changelog siempre
incluye qué cambió.&lt;/p&gt;
</content:encoded></item><item><title>Changelog de API: qué publicar y quién lo lee</title><link>https://changeloop.dev/blog/es/api-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/api-changelog/</guid><description>Un changelog de API lo lee gente que decide si su código seguirá funcionando el próximo mes. Qué le debe cada entrada, dónde vive, cómo se suscriben.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un changelog de API es el registro fechado de cada cambio que un consumidor podría notar, escrito
para quienes integran contra la API, no para el equipo que la publica. Ese público lo convierte en
un documento distinto de un changelog de producto: el lector está decidiendo si su código seguirá
funcionando el próximo mes. La mayoría fallan del mismo modo, siendo una copia filtrada de un feed
interno de releases, así que un campo eliminado queda junto a un ajuste de texto con el mismo peso
y ninguno de los dos se lee.&lt;/p&gt;
&lt;h2&gt;¿Qué es un changelog de API?&lt;/h2&gt;
&lt;p&gt;Es el registro público y fechado de cambios en una interfaz contra la que otras personas han
escrito código. La prueba útil para decidir si algo pertenece ahí no tiene nada que ver con cuán
grande fue el cambio internamente. Pregunta si un consumidor correcto, escrito el año pasado y sin
tocar desde entonces, podría comportarse de forma distinta por ello. Esa prueba admite algunos
cambios muy pequeños y excluye algunos muy grandes.&lt;/p&gt;
&lt;p&gt;Todo lo que sigue asume que quien llama está fuera de la empresa y es efectivamente inalcanzable
salvo a través de este documento. Cuando quien llama es otro equipo dentro de la misma empresa, el
cálculo cambia lo suficiente como para necesitar un tratamiento propio;
&lt;a href=&quot;https://changeloop.dev/blog/es/internal-api-changelog/&quot;&gt;changelogs de API interna&lt;/a&gt; cubre lo que ese público necesita en
su lugar.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Documento&lt;/th&gt;
&lt;th&gt;Público&lt;/th&gt;
&lt;th&gt;Responde&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Changelog de API&lt;/td&gt;
&lt;td&gt;Desarrolladores que llaman a la API&lt;/td&gt;
&lt;td&gt;¿Sigue funcionando mi integración?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notas de versión&lt;/td&gt;
&lt;td&gt;Usuarios del producto&lt;/td&gt;
&lt;td&gt;¿Qué puedo hacer ahora que antes no podía?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aviso de depreciación&lt;/td&gt;
&lt;td&gt;Consumidores de una cosa concreta&lt;/td&gt;
&lt;td&gt;¿Cuándo deja de funcionar esto?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Página de estado&lt;/td&gt;
&lt;td&gt;Cualquiera afectado ahora mismo&lt;/td&gt;
&lt;td&gt;¿Está caído ahora mismo?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guía de migración&lt;/td&gt;
&lt;td&gt;Consumidores que actualizan&lt;/td&gt;
&lt;td&gt;¿Cómo paso de A a B?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/es/api-migration-guide/&quot;&gt;Cómo escribir una guía de migración de API&lt;/a&gt; cubre ese último
documento por completo; en resumen es lo que una entrada de cambio incompatible debería enlazar en
vez de intentar reemplazar.&lt;/p&gt;
&lt;p&gt;Los cinco son documentos separados con ciclos de vida separados. Un aviso de depreciación es una
promesa con fecha y también pertenece al changelog, pero una entrada de changelog se escribe una
vez mientras que una depreciación se sigue hasta su sunset. Colapsarlos es la razón por la que los
sunsets se pasan por alto.&lt;/p&gt;
&lt;h2&gt;¿Qué pertenece a una sola entrada?&lt;/h2&gt;
&lt;p&gt;Seis cosas, y las tres primeras son las que suelen faltar. El cambio, expresado en términos de la
petición o la respuesta en lugar del componente interno. Si rompe a un consumidor correcto. Qué
tiene que hacer el consumidor, incluido &amp;quot;nada&amp;quot;. La fecha en que tomó efecto. La versión o versiones
afectadas. Un enlace a la guía de migración cuando existe.&lt;/p&gt;
&lt;p&gt;Una entrada que dice &amp;quot;mejorado el endpoint de cuentas&amp;quot; falla en las seis. Una entrada que dice &amp;quot;el
campo &lt;code&gt;accounts.type&lt;/code&gt; ahora devuelve &lt;code&gt;individual&lt;/code&gt; donde antes devolvía &lt;code&gt;personal&lt;/code&gt;; los valores
existentes no cambian para cuentas creadas antes del 2 de septiembre; no se requiere acción salvo
que compares el string&amp;quot; responde las seis en una frase.&lt;/p&gt;
&lt;p&gt;Categoriza las entradas por consecuencia, no por departamento. Tres etiquetas cargan casi todo el
valor: breaking, additive y fixed. &lt;a href=&quot;https://semver.org/&quot;&gt;Semantic Versioning&lt;/a&gt; ya define las dos
primeras con precisión, y tomar prestadas sus definiciones en lugar de inventar otras propias
significa que un lector que conoce semver conoce tus etiquetas. &lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;
ofrece un conjunto más largo si lo quieres, y su regla central se aplica aquí con más fuerza que en
ningún otro sitio: el log es para humanos, y un volcado de títulos de commit no lo es.&lt;/p&gt;
&lt;h2&gt;¿En qué se diferencia un changelog de API de las notas de versión?&lt;/h2&gt;
&lt;p&gt;Las notas de versión describen qué puede hacer ahora el producto. Un changelog de API describe cuál
es ahora el contrato. El mismo trabajo publicado suele producir una entrada en ambos, redactada de
forma distinta, porque los públicos necesitan cosas distintas: un nuevo formato de exportación es
una función para un usuario y un nuevo valor de enum para un consumidor que depende de ese campo.&lt;/p&gt;
&lt;p&gt;La consecuencia práctica es que los dos no pueden ser el mismo feed con distinto estilo. Un
consumidor que se suscribe a todo lo que publicas acabará dándose de baja, y entonces se perderá el
breaking change. Si publicas un feed, fíltralo; si publicas dos, haz el de API más estrecho y nunca
dejes entrar una entrada de marketing. Comparamos ambas formas lado a lado en
&lt;a href=&quot;https://changeloop.dev/blog/es/changelog-vs-release-notes/&quot;&gt;changelog vs notas de versión&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Dónde debería vivir un changelog de API?&lt;/h2&gt;
&lt;p&gt;Junto a la documentación de referencia, en una URL estable, con cada entrada direccionable por
separado mediante un fragmento o su propia ruta. Los consumidores enlazan entradas en revisiones de
incidentes y tickets internos, y una entrada que no se puede enlazar acaba pegada como captura de
pantalla en su lugar.&lt;/p&gt;
&lt;p&gt;Publícalo también como salida legible por máquina, además de como página. Un feed JSON siguiendo la
&lt;a href=&quot;https://www.jsonfeed.org/version/1.1/&quot;&gt;especificación JSON Feed&lt;/a&gt; o un
&lt;a href=&quot;https://www.rssboard.org/rss-specification&quot;&gt;feed RSS&lt;/a&gt; no cuesta nada una vez que las entradas son
datos estructurados, y es lo que permite a un cliente incorporar tus cambios a su propio proceso de
release. Esto también decide si alguien construye sobre ello. GitHub documenta sus
&lt;a href=&quot;https://docs.github.com/en/rest/about-the-rest-api/api-versions&quot;&gt;versiones de la REST API&lt;/a&gt; junto a
la referencia por la misma razón: la política de versiones es parte de la interfaz.&lt;/p&gt;
&lt;h2&gt;¿Cómo es una buena entrada en la práctica?&lt;/h2&gt;
&lt;p&gt;Tres entradas de la misma semana, con la forma descrita arriba:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2026-09-02  Breaking  v2
  `POST /invoices` ahora rechaza una `currency` que no coincide con la
  moneda de cuenta del cliente, devolviendo 422 en lugar de convertir en
  silencio. Los consumidores que dependían de la conversión deben enviar
  la moneda de cuenta. Afecta solo a v2; v1 no cambia hasta su sunset el
  2027-01-15.

2026-09-02  Additive  v1, v2
  `Invoice` gana un timestamp `settled_at`, null hasta que la factura se
  liquida. No se requiere acción. Los clientes que rechazan campos
  desconocidos deberían actualizarse.

2026-08-31  Fixed  v2
  `GET /invoices?status=` devolvía una página vacía en lugar de un 400
  ante un estado desconocido. Ahora devuelve 400 con los valores
  aceptados. Los consumidores con una errata antes veían cero resultados
  y ahora ven un error.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La tercera es el tipo que más se suele omitir, porque internamente es una corrección de bug. Para
un consumidor que construyó un retry alrededor de esa página vacía, es un cambio de comportamiento,
y la entrada es lo que evita el ticket de soporte. La etiqueta dice fixed y el cuerpo dice qué
podría notar un consumidor, que es la distinción que mantiene el log honesto sin inflar cada
corrección a breaking change.&lt;/p&gt;
&lt;h2&gt;¿Cómo se suscriben los consumidores?&lt;/h2&gt;
&lt;p&gt;Dales más de un canal, porque tienen trabajos distintos. Un feed para el desarrollador que lo
quiere todo. Correo para quien solo quiere breaking changes. Cabeceras de respuesta para el propio
código, el único suscriptor que nunca olvida comprobar: la
&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;cabecera &lt;code&gt;Sunset&lt;/code&gt; definida en RFC 8594&lt;/a&gt; pone la
fecha de retiro en la respuesta, donde una librería cliente puede registrarla.&lt;/p&gt;
&lt;p&gt;El canal que más equipos se saltan es el directo. Si un consumidor usó el campo que estás cambiando
la semana pasada, sabes quién es, y un correo a esas cuentas vale más que cualquier cantidad de
difusión general. Es la misma disciplina que
&lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;cerrar el bucle de feedback del cliente&lt;/a&gt;, aplicada a un cambio
que nadie pidió: a los afectados se les avisa individualmente, y al resto le llega el feed. Un webhook es
un cuarto canal con su propio modo de fallo que conviene conocer antes de confiar en él:
&lt;a href=&quot;https://changeloop.dev/blog/es/webhook-changelog/&quot;&gt;changelogs de webhooks&lt;/a&gt; cubre por qué un cambio de payload ahí rompe
en silencio, sin consumidor que pueda rechazar la nueva forma.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe una entrada para un breaking change?&lt;/h2&gt;
&lt;p&gt;Empieza por la ruptura, no por la razón. Un consumidor que revisa diez entradas necesita saber en
la primera frase si esta le va a costar trabajo. Después la fecha, las versiones afectadas, la
migración, y el plazo si el comportamiento antiguo va a desaparecer en lugar de cambiar.&lt;/p&gt;
&lt;p&gt;Pon el mismo contenido en el aviso de depreciación, la cabecera de respuesta y el correo directo,
redactado de forma consistente, y dales a los cuatro la misma fecha. La discrepancia entre ellos es
el fallo que convierte un cambio planeado en un incidente, porque el consumidor que solo leyó uno
actúa según la fecha equivocada.
&lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;Qué es un breaking change&lt;/a&gt; cubre la decisión en sí, y
&lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;cómo deprecar una API&lt;/a&gt; cubre el calendario que sigue.&lt;/p&gt;
&lt;p&gt;En changeloop, un cambio de API se convierte en una entrada cuando se fusiona el pull request, una
persona edita y aprueba el borrador, y la entrada se publica en el &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;feed y el widget&lt;/a&gt; en el
mismo momento en que se avisa, en ese issue, al consumidor cuyo feedback en el widget se convirtió
en el issue de GitHub que cierra el pull request. El paso de revisión es lo que
importa aquí: un changelog de API es un documento contractual, y ningún borrador debería llegar a
un consumidor sin que una persona lo haya leído.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Toda cambio de API necesita una entrada de changelog?&lt;/strong&gt;
Todo cambio que un consumidor correcto pudiera notar, sí, incluidos los que consideres internos.
Los cambios sin efecto observable en la petición o la respuesta no, y añadirlos entrena a los
lectores a pasar por encima.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿El changelog de API debería vivir en los docs o en el sitio de marketing?&lt;/strong&gt;
En los docs, junto a la referencia. El lector suele estar ya ahí, y un changelog en el sitio de
marketing tiende a ganar un público para el que no fue escrito.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Hasta cuándo debería remontarse?&lt;/strong&gt;
Indefinidamente. Las entradas se citan años después en revisiones de incidentes, y un log truncado
rompe esos enlaces. Pagina en lugar de podar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Necesito un changelog separado por versión de API?&lt;/strong&gt;
No, un único log con un campo de versión por entrada es más fácil de leer y de buscar. Filtrar por
versión es una función de la página, no una razón para dividir el documento.&lt;/p&gt;
</content:encoded></item><item><title>Cómo construir una página de changelog que la gente sigue</title><link>https://changeloop.dev/blog/es/changelog-page/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/changelog-page/</guid><description>Una página de changelog vale la pena cuando alguien vuelve a ella. Dónde vive, qué necesita cada entrada, feeds y marcado, y cómo encaja el widget.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Una página de changelog vale la pena construirla cuando alguien volvería a ella. Esa es una vara
más alta que simplemente tenerla, y es la vara en la que la mayoría falla: una página que existe,
está enlazada en el footer, se actualiza a rachas y no la visita nadie salvo durante un incidente.
Las decisiones que separan las dos se toman antes de escribir nada, y son sobre todo acerca de dónde
vive la página y qué más se genera a partir del mismo contenido.&lt;/p&gt;
&lt;h2&gt;¿Qué es una página de changelog?&lt;/h2&gt;
&lt;p&gt;Es la lista pública y fechada de qué cambió en un producto, en una URL que os pertenece. Es una de
cinco superficies donde pueden aparecer las mismas entradas, y la pregunta útil no es cuál elegir
sino cuál es canónica y cuáles se generan a partir de ella.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Superficie&lt;/th&gt;
&lt;th&gt;Mejor para&lt;/th&gt;
&lt;th&gt;Coste&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Página alojada&lt;/td&gt;
&lt;td&gt;Búsqueda, enlazado, el registro largo&lt;/td&gt;
&lt;td&gt;Una URL y una plantilla&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Widget en la app&lt;/td&gt;
&lt;td&gt;Llegar a usuarios que nunca visitan la página&lt;/td&gt;
&lt;td&gt;Un embed, y contención&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sección de docs&lt;/td&gt;
&lt;td&gt;Público de API y desarrolladores&lt;/td&gt;
&lt;td&gt;Mantenerlo junto a la referencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feed JSON&lt;/td&gt;
&lt;td&gt;Clientes que construyen sobre vuestros cambios&lt;/td&gt;
&lt;td&gt;Estructura que ya tenéis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feed RSS&lt;/td&gt;
&lt;td&gt;Desarrolladores que se suscriben una vez&lt;/td&gt;
&lt;td&gt;Casi nada&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Elegid una fuente canónica, publicad una vez, y generad el resto. Los equipos que mantienen la
página y el widget por separado a mano acaban con dos textos que no coinciden, y la discrepancia la
descubre un cliente.&lt;/p&gt;
&lt;h2&gt;¿Dónde debería vivir una página de changelog?&lt;/h2&gt;
&lt;p&gt;En vuestro propio dominio, en una ruta estable, con cada entrada direccionable individualmente. Las
tres ubicaciones habituales son una ruta en el sitio principal, un subdominio, y una sección de la
documentación. Una ruta en el sitio principal es la opción por defecto contra la que hay que
argumentar, no a favor: hereda la autoridad del sitio, no necesita certificado ni DNS extra, y
mantiene la página en la misma navegación que todo lo demás.&lt;/p&gt;
&lt;p&gt;Un subdominio es la respuesta correcta cuando la página la sirve un sistema distinto del sitio de
marketing y de otro modo estaríais haciendo proxy. El coste es que acumula autoridad por separado.
Meter el changelog en los docs es correcto cuando el público son desarrolladores, por la razón que
se cubre en &lt;a href=&quot;https://changeloop.dev/blog/es/api-changelog/&quot;&gt;changelog de API&lt;/a&gt;: el lector suele estar ya ahí.&lt;/p&gt;
&lt;p&gt;Lo que importa más que la elección es que las entradas sean enlazables individualmente. La gente
enlaza entradas en revisiones de incidentes y tickets internos, y una entrada que solo se puede
enlazar como &amp;quot;el changelog, baja hasta ahí&amp;quot; acaba pegada como captura de pantalla en su lugar.&lt;/p&gt;
&lt;h2&gt;¿Qué necesita una página de changelog?&lt;/h2&gt;
&lt;p&gt;Cinco cosas, y en las dos primeras fallan la mayoría de páginas. Una entrada fechada por cambio, la
más reciente primero. Una categoría o etiqueta por entrada para poder escanear por el tipo que
interesa. Un permalink por entrada. Una vía de suscripción. Una búsqueda o filtro una vez que hay
más de unas cincuenta entradas.&lt;/p&gt;
&lt;p&gt;Todo lo demás es opcional. Las capturas de pantalla ayudan y cuestan mantenimiento. Los nombres de
autor generan confianza en algunos productos y ruido en otros. Los números de versión importan a
consumidores de una API y a casi nadie más. &lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;
es una opción razonable por defecto para las etiquetas si no tenéis razón para inventar las
vuestras, y su regla central es la que hay que conservar aunque descartéis el resto: el log es para
humanos.&lt;/p&gt;
&lt;p&gt;Agrupad por fecha en lugar de por versión cuando vuestro producto se publica de forma continua. Un
lector que busca &amp;quot;esto fue antes o después de nuestro incidente del día nueve&amp;quot; busca una fecha, y
una página organizada por número de versión le obliga a hacer cuentas.&lt;/p&gt;
&lt;h2&gt;¿Página o widget en la app?&lt;/h2&gt;
&lt;p&gt;Ambos, desde una sola fuente. La página es donde viven la búsqueda, los enlaces y el registro largo.
El widget es cómo llegáis a la mayoría de usuarios que nunca visitarán la página, y funciona porque
aparece en el producto que ya están usando.&lt;/p&gt;
&lt;p&gt;El fallo del widget es la interrupción. Un badge que exige atención por cada entrada se descarta
permanentemente en una semana, lo que os cuesta el canal para la entrada que sí importaba. Contad no
leídas desde la última vez que el lector miró, sembrad el contador en silencio en la primera visita
para que nadie sea recibido con un badge de un año de historial, y dejad que el lector lo abra en
lugar de abrirlo por él.&lt;/p&gt;
&lt;h2&gt;¿Cómo se hace legible por máquinas una página de changelog?&lt;/h2&gt;
&lt;p&gt;Publicad las mismas entradas como feed. Un &lt;a href=&quot;https://www.jsonfeed.org/version/1.1/&quot;&gt;feed JSON&lt;/a&gt; es la
opción de menor fricción para cualquiera que lo consuma en código, y un
&lt;a href=&quot;https://www.rssboard.org/rss-specification&quot;&gt;feed RSS&lt;/a&gt; es lo que espera un desarrollador que se
suscribe en un lector. Ambos cuestan poco una vez que las entradas son datos estructurados en lugar
de HTML escrito a mano, que es el argumento real para mantener estructurada la copia canónica.&lt;/p&gt;
&lt;p&gt;Marcad también la página. Las entradas son obras con fecha y titular, y
&lt;a href=&quot;https://schema.org/CreativeWork&quot;&gt;schema.org&lt;/a&gt; ofrece el vocabulario. Vale la pena por la misma razón
que los permalinks: hace la página utilizable por cosas que no son un navegador, incluido el propio
proceso de release de un cliente. Nada de
esto funciona si las entradas subyacentes nunca fueron datos estructurados desde el principio;
&lt;a href=&quot;https://changeloop.dev/blog/es/changelog-file-formats/&quot;&gt;formatos de archivo de changelog&lt;/a&gt; cubre qué cuesta cada uno de
Markdown, JSON y YAML como la fuente de verdad de la que realmente se generan este feed y este
marcado.&lt;/p&gt;
&lt;h2&gt;¿Ayuda una página de changelog al SEO?&lt;/h2&gt;
&lt;p&gt;Indirectamente y despacio. Las entradas individuales rara vez posicionan, porque no apuntan a
ninguna búsqueda que nadie teclea. La página se gana su lugar a través de enlaces: las entradas se
citan en respuestas de soporte, foros y análisis de incidentes, y esos enlaces se acumulan en una
URL que os pertenece. Una página actualizada semanalmente durante dos años es también una señal de
frescura creíble para el producto al que pertenece.&lt;/p&gt;
&lt;p&gt;Lo que no funciona es tratar las entradas como marketing de contenidos. Una entrada rellenada hasta
tres párrafos para alargarla es peor en su trabajo real, que es decirle a un lector en una frase si
algo que usa cambió. Si queréis que el changelog apoye la búsqueda, poned el esfuerzo en los
permalinks, el feed y los enlaces internos hacia él, y dejad las entradas cortas. Nuestra propia
página de &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;ejemplos de changelog&lt;/a&gt; recopila páginas que aciertan este
equilibrio.&lt;/p&gt;
&lt;h2&gt;¿Cómo se suscribe la gente?&lt;/h2&gt;
&lt;p&gt;Dadles las vías que ya usan: un feed RSS o JSON para desarrolladores, correo para quien solo quiere
oír lo importante, y el widget en la app para todos los que nunca harán ninguna de las dos cosas.
Preguntad qué quieren oír en lugar de asumirlo, porque un lector que quiere breaking changes y
recibe ajustes de texto se da de baja de ambos.&lt;/p&gt;
&lt;p&gt;La vía que conviene añadir al final es la que cierra el ciclo. Cuando una entrada resuelve algo que
alguien concreto pidió, decídselo directamente en lugar de esperar que lea la página. En changeloop
la entrada se publica en la &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;página, el feed y el widget&lt;/a&gt; a la vez, y a una persona cuyo
feedback en el widget se convirtió en el issue de GitHub que cerró el pull request se le avisa en
ese issue con enlace a la entrada, y ve la entrada en el widget. La mecánica es la misma que
cualquier suscripción; la diferencia es que quien la recibe ya preguntó. Es el argumento que se
desarrolla en &lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;cerrar el ciclo de feedback desde el changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿La página de changelog debería estar en un subdominio o en una ruta?&lt;/strong&gt;
Una ruta en el sitio principal por defecto, porque hereda la autoridad del sitio y no necesita
infraestructura extra. Un subdominio se justifica cuando un sistema distinto sirve la página.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuántas entradas debería mostrar la página a la vez?&lt;/strong&gt;
Suficientes para llenar una pantalla y no más, con paginación después. Cargar dos años de historial
en un documento es lento y hace más difícil encontrar la entrada más reciente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían borrarse alguna vez las entradas antiguas?&lt;/strong&gt;
No. Se citan desde fuera de vuestro sitio y los enlaces se rompen. Corregid una entrada en su sitio
con una nota, y mantened viva la URL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Tiene que aparecer en la página cada cambio?&lt;/strong&gt;
Solo los que un usuario podría notar. Una página que registra refactors internos entrena a los
lectores a pasar por encima, y una página pasada por encima falla el día que lleva algo urgente.&lt;/p&gt;
</content:encoded></item><item><title>La plantilla de email de novedades que sí se lee</title><link>https://changeloop.dev/blog/es/product-update-email/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/product-update-email/</guid><description>El email de novedades que se lee fue a alguien que lo pidió. Una plantilla, los cuatro tipos de email, líneas de asunto, segmentación y consentimiento.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;El email de novedades del producto que se lee es el que se envía a alguien que pidió exactamente lo
que anuncia. Todo lo demás compite con el resto de la bandeja de entrada en interés, una
competición que un anuncio de release pierde la mayoría de semanas. Ese único hecho debería decidir
la forma del email antes que cualquier redacción: quién lo recibe, y qué hizo esa persona para
acabar en la lista.&lt;/p&gt;
&lt;h2&gt;¿Qué es un email de novedades del producto?&lt;/h2&gt;
&lt;p&gt;Es un mensaje que le dice a usuarios existentes qué cambió en un producto que ya usan. Hay cuatro
tipos distintos, y tratarlos como una sola lista es por qué las tasas de apertura decaen. Cada uno
tiene un disparador distinto, un público distinto y una frecuencia aceptable distinta.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Disparador&lt;/th&gt;
&lt;th&gt;Público&lt;/th&gt;
&lt;th&gt;Frecuencia&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Notificación dirigida&lt;/td&gt;
&lt;td&gt;La petición concreta de alguien se lanzó&lt;/td&gt;
&lt;td&gt;Una persona&lt;/td&gt;
&lt;td&gt;Cuando pasa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aviso de breaking change&lt;/td&gt;
&lt;td&gt;Un cambio que le cuesta trabajo al lector&lt;/td&gt;
&lt;td&gt;Solo cuentas afectadas&lt;/td&gt;
&lt;td&gt;Cuando pasa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Digest&lt;/td&gt;
&lt;td&gt;El paso del tiempo&lt;/td&gt;
&lt;td&gt;Usuarios opt-in&lt;/td&gt;
&lt;td&gt;Mensual como mucho&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anuncio de lanzamiento&lt;/td&gt;
&lt;td&gt;Un lanzamiento que merece interrumpir&lt;/td&gt;
&lt;td&gt;Segmento o todos&lt;/td&gt;
&lt;td&gt;Raro, y debería sentirse raro&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La mayoría de equipos solo construyen el tercero, lo mandan a todos, y concluyen que los emails de
novedades no funcionan. Los dos primeros cargan casi todo el valor, porque el lector tiene un
motivo previo para interesarse, y el mensaje llega mientras ese motivo está vivo.&lt;/p&gt;
&lt;p&gt;Las cuatro filas de aquí están escritas para clientas. Ventas, soporte y customer success también
necesitan saber qué se lanzó, casi siempre en una forma distinta a cualquiera de estas cuatro;
&lt;a href=&quot;https://changeloop.dev/blog/es/internal-release-notes/&quot;&gt;notas de release internas&lt;/a&gt; cubre qué debería decir ese
documento y por qué tiene que salir antes que la nota de cara al cliente.&lt;/p&gt;
&lt;p&gt;El email es uno de varios canales que un anuncio de lanzamiento puede usar, no el único. &lt;a href=&quot;https://changeloop.dev/blog/es/new-feature-announcement/&quot;&gt;Cómo anunciar una función nueva&lt;/a&gt; cubre los demás, y cómo elegir entre ellos según lo grande que sea la función.&lt;/p&gt;
&lt;h2&gt;¿Qué va en la plantilla?&lt;/h2&gt;
&lt;p&gt;Seis bloques, en este orden. El primero es el que suele faltar y el que hace el trabajo.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Asunto:  &amp;lt;qué cambió, con las palabras del lector&amp;gt;

1. Por qué te llega esto
   &amp;quot;Pediste exportación a CSV en marzo.&amp;quot; o
   &amp;quot;Tu integración llama a /v1/invoices, que cambia el 15 de enero.&amp;quot;

2. Qué cambió
   Una frase. Qué es posible ahora, o qué se rompe ahora.

3. Qué tienes que hacer
   A menudo &amp;quot;nada&amp;quot;. Dilo explícitamente, no lo dejes implícito.

4. Dónde verlo
   Un enlace a la entrada del changelog, no a la portada.

5. Cuándo
   La fecha en que se lanzó, o desde cuándo aplica.

6. Cómo dejar de recibirlos
   Un clic, y respetado al instante.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El bloque 1 es la diferencia entre un mensaje y una difusión general. Un lector al que se le dice,
en la primera línea, que esto es la resolución de algo que él mismo pidió, lee el resto. Sin él, los
bloques 2 a 5 son un newsletter por bien escritos que estén.&lt;/p&gt;
&lt;p&gt;Mantened el conjunto bajo unas 150 palabras. El email es un puntero a la entrada del changelog, y
la entrada es donde va el detalle. Un email que reproduce la entrada entera no le da al lector
motivo para hacer clic, ni a vosotros señal de si le importó a alguien.&lt;/p&gt;
&lt;h2&gt;¿Qué líneas de asunto funcionan?&lt;/h2&gt;
&lt;p&gt;Nombrad el cambio, no la versión. &amp;quot;La exportación a CSV ya está&amp;quot; gana a &amp;quot;novedades de septiembre&amp;quot;
porque lo primero es un hecho que el lector puede evaluar y lo segundo es un contenedor. Los
números de versión en el asunto son útiles para consumidores de una API y ruido para todos los
demás, otra razón para separar los públicos.&lt;/p&gt;
&lt;p&gt;Evitad afirmar un beneficio al que el lector no ha dado su consentimiento. &amp;quot;Tus informes ahora son
más rápidos&amp;quot; afirma algo sobre su experiencia; &amp;quot;Los informes de más de 10.000 filas ahora cargan en
menos de un segundo&amp;quot; reporta un cambio y le deja decidir si le importa.&lt;/p&gt;
&lt;h2&gt;¿Cuándo enviar uno, y a quién?&lt;/h2&gt;
&lt;p&gt;Enviad una notificación dirigida en el momento en que la cosa se lanza, a las personas que la
pidieron, individualmente. Enviad un aviso de breaking change tan pronto como la fecha sea segura y
otra vez cerca de ella, a las cuentas realmente afectadas en lugar de a toda la lista. Enviad un
digest solo si tenéis suficientes cambios como para que un lector se pierda algo si no, y dejad que
la gente se apunte por separado.&lt;/p&gt;
&lt;p&gt;La lista que casi nunca deberíais usar es &amp;quot;todos los usuarios&amp;quot;. Convierte un mensaje concreto en
uno genérico, y entrena la baja. Segmentad por comportamiento que ya almacenáis: quién lo pidió,
quién usa este endpoint, quién está en este plan.&lt;/p&gt;
&lt;h2&gt;¿Necesitáis consentimiento para enviarlo?&lt;/h2&gt;
&lt;p&gt;Para clientes existentes, una novedad sobre un servicio que usan suele ser una cuestión legal
distinta del marketing a un prospecto, y la respuesta depende de dónde estén y de qué les dijisteis
al registrarse. En la UE la pregunta relevante es qué base legal del
&lt;a href=&quot;https://gdpr-info.eu/art-6-gdpr/&quot;&gt;artículo 6 del RGPD&lt;/a&gt; aplica, y en Estados Unidos los mensajes
comerciales llevan requisitos concretos recogidos en la
&lt;a href=&quot;https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business&quot;&gt;guía de cumplimiento CAN-SPAM de la FTC&lt;/a&gt;.
Ambas exigen lo mismo en la práctica: decid quiénes sois, dejad claro el propósito, y dejad que la
gente pueda parar.&lt;/p&gt;
&lt;p&gt;Sea cual sea la base, mantened separados los flujos transaccional y de marketing a nivel de envío.
Un aviso de breaking change que un cliente ha dado de baja porque compartía lista con un digest
promocional es un incidente de soporte esperando su fecha.&lt;/p&gt;
&lt;h2&gt;¿Cómo queda rellena?&lt;/h2&gt;
&lt;p&gt;La notificación dirigida, el email de novedades de más valor y el que la mayoría de equipos nunca
construye:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Asunto: La exportación a CSV ya está aquí

Hola Dana,

pediste exportación a CSV allá por marzo.

Se lanzó esta mañana. Los informes ahora tienen un botón de
exportar que genera un CSV de la vista actual, filtros
incluidos.

No tienes que hacer nada por tu parte. Ya está activo en tu
cuenta.

  Detalles: example.com/changelog#csv-export
  Lanzado: 2 de septiembre de 2026

Recibes esto porque lo pediste. Darte de baja de novedades de
peticiones: &amp;lt;enlace&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Noventa palabras, y el lector sabe en la primera línea por qué le llegó. Comparad esto con el mismo
cambio en un digest mensual, donde aparece como uno de nueve puntos y Dana no tiene motivo para
notar que su propia petición salió.&lt;/p&gt;
&lt;h2&gt;¿Qué deberíais medir?&lt;/h2&gt;
&lt;p&gt;No la tasa de apertura sola. Para una notificación dirigida la pregunta es si la persona que pidió
volvió y usó la cosa, así que el número que importa vigilar es el clic hacia la entrada y si esa
cuenta usa la función en la semana siguiente. Para un aviso de breaking change es cobertura: qué
porcentaje de cuentas afectadas abrió antes de la fecha, y con quién hicisteis seguimiento
individual.&lt;/p&gt;
&lt;p&gt;Un digest es el único de los cuatro donde una tasa de apertura significa algo, e incluso ahí es más
útil como tendencia contra su propio historial que contra un benchmark del sector. Distintos tipos
de email de novedades tienen trabajos distintos, así que una cifra mezclada entre todos no describe
nada sobre lo que se pueda actuar.&lt;/p&gt;
&lt;h2&gt;¿En qué se diferencia de las notas de versión?&lt;/h2&gt;
&lt;p&gt;Las notas de versión son un documento que permanece disponible. El email es un mecanismo de entrega
que pasa una vez. El mismo cambio produce ambos, y el email debería ser más corto que la entrada a
la que enlaza. &lt;a href=&quot;https://changeloop.dev/blog/es/release-notes-best-practices/&quot;&gt;Buenas prácticas de notas de versión&lt;/a&gt; cubre
el documento, y &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-vs-release-notes/&quot;&gt;changelog vs notas de versión&lt;/a&gt; cubre cuál
estáis escribiendo.&lt;/p&gt;
&lt;p&gt;La relación que conviene acertar: la entrada del changelog es el texto canónico y el email lo cita.
Cuando esos dos divergen, el lector que hace clic encuentra una descripción distinta del cambio y
deja de confiar en ambos. Publicar la entrada primero y generar el email a partir de ella elimina
la divergencia por construcción. changeloop funciona igual por su lado: una entrada se
revisa y publica una vez en la &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;página, el feed y el widget&lt;/a&gt;, y a quien la pidió a través del
widget se le avisa en el issue de GitHub en que se convirtió su feedback, y en el propio widget.
changeloop no envía el email; tu herramienta de email cita la entrada publicada.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Con qué frecuencia debería salir un email de novedades del producto?&lt;/strong&gt;
Tan a menudo como haya algo concreto que el destinatario quiera saber, que para una notificación
dirigida es cada vez que se lanza su petición y para un digest es mensual como mucho.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería el email contener la entrada de changelog entera?&lt;/strong&gt;
No. Una frase y un enlace. La entrada es la versión canónica, y una copia completa en el email
significa dos textos que mantener alineados.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué tasa de apertura debería esperar?&lt;/strong&gt;
Comparad cada tipo contra sí mismo en lugar de contra un benchmark. Una notificación dirigida y un
digest mensual son productos distintos, y promediarlos esconde la única cifra que merece la pena
observar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Necesito una lista separada para breaking changes?&lt;/strong&gt;
Sí, y debería ser la que la gente no pueda darse de baja casualmente sin entender la consecuencia,
porque es la que les cuesta una caída.&lt;/p&gt;
</content:encoded></item><item><title>Cómo deprecar una API sin perder a sus desarrolladores</title><link>https://changeloop.dev/blog/es/api-deprecation/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/api-deprecation/</guid><description>La deprecación es una promesa con fecha. Calendario, plantilla de aviso, headers de respuesta y el paso que evita que un sunset sea un incidente.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Deprecar una API es anunciar que algo todavía funciona hoy y dejará de funcionar en una fecha
declarada, y luego mantener las dos mitades de esa promesa. La mayoría de las deprecaciones fallan
en la segunda mitad: la fecha se desliza en silencio, o llega y los llamantes que nunca vieron el
aviso se enteran por un error. Una deprecación está terminada cuando cada llamante afectado ha
migrado o se le ha dicho, individualmente, que no lo ha hecho.&lt;/p&gt;
&lt;h2&gt;¿Qué es la deprecación de una API?&lt;/h2&gt;
&lt;p&gt;La deprecación es el período entre anunciar que un endpoint, campo o versión va a desaparecer y
realmente eliminarlo. Durante ese período el comportamiento antiguo sigue funcionando, la
documentación dice que se va, y cada respuesta lleva un aviso legible por máquina. La eliminación
es el evento separado, posterior, a menudo llamado sunset. Los dos se confunden, y la confusión es
donde ocurre el daño: &amp;quot;deprecated&amp;quot; empieza a significar &amp;quot;puede que ya no esté&amp;quot;, y los llamantes
dejan de confiar en ninguna de las dos palabras.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Término&lt;/th&gt;
&lt;th&gt;Significado&lt;/th&gt;
&lt;th&gt;En qué pueden confiar los llamantes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Deprecated&lt;/td&gt;
&lt;td&gt;Anunciado como que se va, sigue funcionando&lt;/td&gt;
&lt;td&gt;Comportamiento completo hasta la fecha de sunset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunset&lt;/td&gt;
&lt;td&gt;La fecha en que deja de funcionar&lt;/td&gt;
&lt;td&gt;Nada después de esta fecha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retired / eliminado&lt;/td&gt;
&lt;td&gt;Se fue; las peticiones fallan&lt;/td&gt;
&lt;td&gt;Un error, idealmente uno que nombre el reemplazo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legacy&lt;/td&gt;
&lt;td&gt;Indefinido. Evita la palabra&lt;/td&gt;
&lt;td&gt;Nada, que es el problema&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuánto debería durar un período de deprecación?&lt;/h2&gt;
&lt;p&gt;Lo suficiente para que un llamante se entere y haga el trabajo, medido desde cuándo le llegó el
aviso y no desde cuándo lo escribiste. Noventa días es el piso habitual para una API web pública.
Doce meses es normal para cualquier cosa embebida en software que instalan usuarios finales, porque
la corrección también tiene que pasar por su proceso de lanzamiento. La guía de
versionado de Google, &lt;a href=&quot;https://google.aip.dev/185&quot;&gt;AIP-185&lt;/a&gt;, pide un período de transición
razonable y recomienda 180 días incluso antes de retirar funcionalidad beta, y Kubernetes documenta su
&lt;a href=&quot;https://kubernetes.io/docs/reference/using-api/deprecation-policy/&quot;&gt;política de deprecación&lt;/a&gt; en
conteo de lanzamientos en vez de meses, que es la unidad correcta cuando tus llamantes actualizan
por versión.&lt;/p&gt;
&lt;p&gt;Elige un período, escríbelo como política, y deja de decidirlo por cambio. Una política publicada
convierte cada deprecación de una negociación en la aplicación de una regla.&lt;/p&gt;
&lt;p&gt;Escribir la política de deprecación cubre el inicio de la ventana; &lt;a href=&quot;https://changeloop.dev/blog/es/sunsetting-api-version/&quot;&gt;retirar una versión de
API&lt;/a&gt; cubre el aviso separado que se necesita al final, cuando el
período realmente se acaba y la versión deja de funcionar.&lt;/p&gt;
&lt;h2&gt;El calendario de deprecación&lt;/h2&gt;
&lt;p&gt;Cuatro fechas, anunciadas juntas el primer día. Cada una es una entrada de changelog separada
cuando llega, así que la historia se cuenta cuatro veces a quien solo lee el changelog.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Anunciar.&lt;/strong&gt; La entrada dice qué se deprecia, por qué, qué lo reemplaza, y la fecha de sunset.
La documentación de lo antiguo gana un banner que enlaza a la migración. Las respuestas ganan
los headers descritos más abajo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recordar, a mitad de camino.&lt;/strong&gt; Una segunda entrada, y un mensaje directo a todo llamante que
siga usando el comportamiento antiguo. Este es el paso que necesita datos de uso: si no puedes
listar quién sigue llamando al endpoint deprecado, no puedes hacerlo, y vale la pena arreglar
eso antes de la próxima deprecación.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apagón breve, poco antes de la fecha.&lt;/strong&gt; Devuelve errores para el comportamiento antiguo
durante una ventana corta, una hora o un día, luego restáuralo. Los llamantes que se perdieron
todos los avisos se enteran ahora, mientras todavía hay tiempo. GitHub usó apagones programados
antes de &lt;a href=&quot;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&quot;&gt;retirar la autenticación por contraseña de la API&lt;/a&gt;,
y es el paso individual más efectivo de esta lista.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sunset.&lt;/strong&gt; Elimínalo. El error que lo reemplaza nombra el reemplazo y enlaza la guía de
migración. Mantén el error en su sitio durante mucho tiempo; un 404 no le dice nada a un
llamante.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;¿Qué debería decir un aviso de deprecación?&lt;/h2&gt;
&lt;p&gt;Un aviso de deprecación dice qué se va, cuándo deja de funcionar, qué usar en su lugar, y a quién
afecta. Aquí la forma, rellenada:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;GET /v1/reports/daily&lt;/code&gt; está deprecado y deja de funcionar el 1 de marzo de 2027.&lt;/strong&gt;
Se reemplaza por &lt;code&gt;GET /v2/reports?granularity=day&lt;/code&gt;, que devuelve los mismos datos con un esquema
estable y paginación. Afecta a las 214 integraciones que llamaron al endpoint v1 en los últimos
30 días; si la tuya es una de ellas, también recibirás este aviso por correo. Guía de migración:
[enlace]. Nada cambia hasta el 1 de marzo de 2027. A partir de esa fecha el endpoint v1 devuelve
&lt;code&gt;410 Gone&lt;/code&gt; con un enlace a esta entrada.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cada frase lleva algo que la lectora necesita. El número de integraciones afectadas le dice a cada
lectora si debe seguir leyendo. &amp;quot;Nada cambia hasta&amp;quot; es la frase que deja que quienes no están
afectados cierren la pestaña. La página de &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;ejemplos de changelog&lt;/a&gt; recopila
entradas de equipos que escriben esta forma con consistencia, y vale la pena leer tres antes de
escribir la primera propia.&lt;/p&gt;
&lt;h2&gt;¿Qué headers debería enviar un endpoint deprecado?&lt;/h2&gt;
&lt;p&gt;Envía &lt;code&gt;Deprecation&lt;/code&gt;, &lt;code&gt;Sunset&lt;/code&gt; y un &lt;code&gt;Link&lt;/code&gt; al sucesor, en cada respuesta del endpoint deprecado,
desde el día del anuncio. El &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9745&quot;&gt;header &lt;code&gt;Deprecation&lt;/code&gt;&lt;/a&gt;
lleva la fecha en que entró en vigor la deprecación; el
&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;header &lt;code&gt;Sunset&lt;/code&gt;&lt;/a&gt; lleva la fecha en que el endpoint
deja de responder; &lt;code&gt;Link: &amp;lt;url&amp;gt;; rel=&amp;quot;successor-version&amp;quot;&lt;/code&gt; apunta a qué usar en su lugar.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Deprecation: @1756425600
Sunset: Mon, 01 Mar 2027 00:00:00 GMT
Link: &amp;lt;https://api.example.com/v2/reports&amp;gt;; rel=&amp;quot;successor-version&amp;quot;
Link: &amp;lt;https://example.com/changelog/daily-reports&amp;gt;; rel=&amp;quot;deprecation&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La mayoría de los llamantes nunca leerán los headers por sí mismos. Su valor está en que el cliente
HTTP, el gateway o el monitoreo de un llamante sí puede, lo que convierte tu deprecación en una
alerta de su lado en vez de una página del tuyo. Los SDKs que envíes deberían registrar una
advertencia cuando vean uno.&lt;/p&gt;
&lt;h2&gt;¿A quién se le avisó, y cómo lo sabes?&lt;/h2&gt;
&lt;p&gt;Este es el paso que decide si el sunset es tranquilo o un incidente de soporte, y es el más difícil
de hacer solo con un changelog. Una entrada de changelog le avisa a todo el que lee el changelog.
Una deprecación tiene que llegar a la gente concreta cuyo código va a fallar, y la forma habitual
de encontrarla son los mismos datos de uso que necesita el recordatorio a mitad de camino: las
claves de API, apps o cuentas que llamaron al comportamiento deprecado recientemente.&lt;/p&gt;
&lt;p&gt;El ciclo que ejecutamos: la entrada se redacta a partir del pull request que añade la deprecación,
una persona revisa la redacción y la fecha, y una vez publicada la entrada misma es la
notificación. Cualquier persona cuyo feedback en el widget sobre el problema, o petición del
reemplazo, se convirtió en un issue de GitHub que cierra el pull request recibe un comentario en ese
issue diciendo que se lanzó, con un enlace a la entrada.
&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Feed y widget&lt;/a&gt; sirven la misma entrada a todos los demás, junto con cada otra entrada del
&lt;a href=&quot;https://changeloop.dev/blog/es/api-changelog/&quot;&gt;changelog de API&lt;/a&gt;. Lo que no hacemos es dejar que la
deprecación se vuelva &amp;quot;lanzada&amp;quot; antes de que una persona la haya publicado; un aviso con la fecha
equivocada es peor que ningún aviso.&lt;/p&gt;
&lt;p&gt;Sea cual sea tu herramienta, la pregunta que debes poder responder el día del sunset es: ¿qué
llamantes seguían usando esto la semana pasada, y a cuáles de ellos les avisamos directamente? Si
la respuesta es &amp;quot;publicamos algo sobre eso&amp;quot;, el sunset no está listo.&lt;/p&gt;
&lt;h2&gt;¿Cuál es la diferencia entre deprecar y versionar?&lt;/h2&gt;
&lt;p&gt;Versionar es cómo mantienes disponible el comportamiento antiguo mientras existe el nuevo;
deprecar es cómo retiras el antiguo. Una versión nueva de API sin política de deprecación para la
anterior es un compromiso de mantener las dos para siempre. Una deprecación sin versionado es un
&lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;cambio que rompe algo&lt;/a&gt; con retraso. Necesitas ambos, y la versión es
la mitad más fácil. GraphQL es
la excepción que vale la pena nombrar: normalmente no hay ningún número de versión que subir, y
&lt;a href=&quot;https://changeloop.dev/blog/es/graphql-schema-deprecation/&quot;&gt;deprecación de esquema en GraphQL&lt;/a&gt; cubre cómo un único
esquema compartido retira un campo con una directiva en su lugar.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Debería un endpoint deprecado seguir funcionando exactamente igual que antes?&lt;/strong&gt;
Sí, hasta la fecha de sunset. Los únicos cambios permitidos son los headers añadidos y, cerca del
final, un apagón programado que anunciaste con antelación.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué código de estado debería devolver un endpoint retirado?&lt;/strong&gt;
&lt;code&gt;410 Gone&lt;/code&gt;, con un cuerpo y un header &lt;code&gt;Link&lt;/code&gt; apuntando al reemplazo y a la entrada de changelog.
&lt;code&gt;404&lt;/code&gt; dice que la URL nunca existió, lo cual es falso y no ayuda.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Se puede acortar un período de deprecación?&lt;/strong&gt;
Solo por seguridad. Si el comportamiento antiguo es explotable, dilo, acorta el período, y avisa a
cada llamante afectado directamente en vez de confiar en el changelog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Necesito deprecar un campo, o solo endpoints enteros?&lt;/strong&gt;
Campos, parámetros, valores de enum, valores por defecto y headers necesitan todos el mismo trato,
porque cada uno puede romper a un llamante correcto. Un campo eliminado es la deprecación más común
y la que más se salta.&lt;/p&gt;
</content:encoded></item><item><title>Buenas prácticas de versionado de API, para los llamantes</title><link>https://changeloop.dev/blog/es/api-versioning-best-practices/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/api-versioning-best-practices/</guid><description>Versiona solo lo que rompe algo, pon la versión donde los llamantes la vean, y mantén la vieja funcionando hasta una fecha. Cuatro esquemas comparados.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;El versionado de API es la práctica de mantener funcionando un contrato antiguo después de
cambiarlo, para que los llamantes puedan avanzar según su propio calendario y no el tuyo. Esa frase
contiene las dos decisiones que importan: qué cuenta como cambiar el contrato, y cuánto tiempo sigue
funcionando el antiguo. Dónde vive el número de versión, sobre lo que trata la mayoría de los
debates de versionado, es la menos importante de las tres y la más fácil de acertar.&lt;/p&gt;
&lt;h2&gt;¿Cuándo se debería versionar una API?&lt;/h2&gt;
&lt;p&gt;Versiona una API solo cuando un cambio rompería a un llamante correcto. Los cambios aditivos,
campos nuevos, endpoints nuevos, parámetros opcionales nuevos, no necesitan versión; los llamantes
escritos contra el contrato antiguo siguen funcionando y la capacidad nueva simplemente está ahí.
Un &lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;cambio que rompe algo&lt;/a&gt; sí necesita una, porque la alternativa es que
un llamante se entere por un error. Versionar cada lanzamiento, incluidos los aditivos, enseña a los
llamantes que las versiones son ruido, y dejan de leer los avisos que importan.&lt;/p&gt;
&lt;p&gt;La prueba práctica es la misma del artículo de cambios que rompen algo: si un llamante que
dependía solo del comportamiento documentado tiene que cambiar algo para seguir funcionando, el
cambio necesita una versión. Si no, lánzalo bajo la versión actual y escribe una entrada de
changelog.&lt;/p&gt;
&lt;h2&gt;¿Qué esquema de versionado de API debería usarse?&lt;/h2&gt;
&lt;p&gt;Usa el esquema que tus llamantes puedan ver y fijar con más facilidad, que para la mayoría de las
APIs públicas es una versión en la ruta de la URL o un header de versión datado. Los cuatro
esquemas comunes se diferencian menos en capacidad que en lo que le piden al llamante, y esa es la
base correcta para elegir.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Esquema&lt;/th&gt;
&lt;th&gt;Ejemplo&lt;/th&gt;
&lt;th&gt;Qué debe hacer el llamante&lt;/th&gt;
&lt;th&gt;Quién lo usa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Ruta de URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v2/invoices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cambiar la URL al migrar&lt;/td&gt;
&lt;td&gt;La mayoría de las APIs REST públicas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Header de versión&lt;/td&gt;
&lt;td&gt;&lt;code&gt;X-GitHub-Api-Version: 2022-11-28&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enviar un header, o aceptar el por defecto&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versión de cuenta datada&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Stripe-Version: 2026-08-26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fijar una fecha por petición o por cuenta&lt;/td&gt;
&lt;td&gt;Stripe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parámetro de consulta&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/invoices?version=2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Añadir un parámetro&lt;/td&gt;
&lt;td&gt;APIs antiguas; hoy raramente elegido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Media type&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Accept: application/vnd.example.v2+json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Negociar tipos de contenido&lt;/td&gt;
&lt;td&gt;Puristas; pocos llamantes lo dominan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Ruta de URL&lt;/strong&gt; es el más visible y el menos flexible. Cualquier llamante puede ver en qué versión
está leyendo una línea de log, y un salto de versión es un buscar-y-reemplazar. El costo: toda la
superficie se mueve a la vez, no puedes cambiar el contrato de un solo endpoint sin acuñar una
versión nueva para todos, así que las versiones de ruta tienden a ser raras y grandes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Header de versión&lt;/strong&gt; mantiene las URLs estables y deja que el servidor elija un valor por defecto
para llamantes que no envían nada, tal como funciona el
&lt;a href=&quot;https://docs.github.com/en/rest/about-the-rest-api/api-versions&quot;&gt;versionado de la API REST de GitHub&lt;/a&gt;:
una versión nombrada por fecha en &lt;code&gt;X-GitHub-Api-Version&lt;/code&gt;, con la versión soportada más antigua como
por defecto para que los llamantes sin versión no se rompan. El costo: la versión es invisible en
una URL y fácil de olvidar en un cliente nuevo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Versión de cuenta datada&lt;/strong&gt; es el esquema de header más una adición: la versión se guarda contra
la cuenta, así que cada petición la obtiene sin enviar nada. El
&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;versionado de API de Stripe&lt;/a&gt; fija cada cuenta a la
versión con la que se creó y deja que una petición lo sobrescriba con &lt;code&gt;Stripe-Version&lt;/code&gt;. Es el
esquema más amigable para el llamante y el que más trabajo da operar, porque el servidor tiene que
traducir entre cada versión soportada y la actual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parámetro de consulta&lt;/strong&gt; y &lt;strong&gt;media type&lt;/strong&gt; funcionan ambos y fallan ambos la prueba de visibilidad
de forma distinta: un parámetro de consulta se pierde fácilmente al construir una URL, y una
versión de media type es invisible para casi cualquier herramienta con la que un llamante depure. El
esquema datado de Stripe es el ejemplo más conocido del enfoque por fechas, y
&lt;a href=&quot;https://changeloop.dev/blog/es/stripe-api-versioning/&quot;&gt;cómo versiona Stripe su API&lt;/a&gt; lo recorre paso a paso.&lt;/p&gt;
&lt;h2&gt;¿Cómo se hace el versionado de API en la práctica?&lt;/h2&gt;
&lt;p&gt;En la práctica una versión es un conjunto nombrado de comportamientos, y el servidor mapea cada
petición a uno de ellos. Los pasos son los mismos sea cual sea el esquema que lleve el nombre.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Nombra las versiones por fecha o por entero, no por versión semántica.&lt;/strong&gt; Una API web no es un
paquete. Los llamantes no pueden fijar una versión menor de una URL, así que &lt;code&gt;v2&lt;/code&gt; o
&lt;code&gt;2026-08-26&lt;/code&gt; dice todo lo que un llamante necesita, y el
&lt;a href=&quot;https://semver.org/&quot;&gt;versionado semántico&lt;/a&gt; implica una promesa de compatibilidad que el
esquema no puede cumplir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mantén la versión fuera del código que no la necesita.&lt;/strong&gt; Una versión debería seleccionar una
capa de traducción en el borde, no bifurcar la lógica de negocio. Dos copias completas de la
base de código es cómo una versión termina sin mantenimiento.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dale a cada versión un valor por defecto y un documento.&lt;/strong&gt; Los llamantes que no envían versión
reciben la más antigua soportada, nunca la más nueva, para que un cliente sin fijar no se rompa
el día del lanzamiento. Cada versión tiene una página que dice qué cambió respecto a la
anterior.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fija una ventana de soporte y publícala.&lt;/strong&gt; La guía
de versionado de Google, &lt;a href=&quot;https://google.aip.dev/185&quot;&gt;AIP-185&lt;/a&gt;, pide un período de transición
razonable y bien comunicado, y recomienda 180 días incluso para funcionalidad beta. Elige
una ventana, escríbela, y aplícala sin renegociar por versión.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retira versiones como retiras endpoints.&lt;/strong&gt; Una versión pasada su ventana recibe el mismo trato
que cualquier &lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;API deprecada&lt;/a&gt;: un anuncio, un header &lt;code&gt;Sunset&lt;/code&gt;
(&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;RFC 8594&lt;/a&gt;) en cada respuesta, un recordatorio a
mitad de camino a los llamantes que quedan, y una fecha de eliminación que se cumple.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;¿Qué son v1 y v2 en una API REST?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;v1&lt;/code&gt; y &lt;code&gt;v2&lt;/code&gt; son nombres para dos contratos que el mismo servidor soporta al mismo tiempo. Un &lt;code&gt;v2&lt;/code&gt;
existe porque algo en &lt;code&gt;v1&lt;/code&gt; no se podía cambiar sin romper a sus llamantes, así que el cambio fue a
un contrato nuevo y el antiguo siguió funcionando. Los números no implican que &lt;code&gt;v2&lt;/code&gt; esté completo
o que &lt;code&gt;v1&lt;/code&gt; esté muerto; ambas cosas son ciertas solo si la documentación lo dice. Un &lt;code&gt;v3&lt;/code&gt; que
aparece cada trimestre es una señal de que se están versionando cambios aditivos, o de que el
contrato nunca se diseñó para absorber cambios. gRPC
resuelve el mismo problema de otra forma: &lt;a href=&quot;https://changeloop.dev/blog/es/grpc-protobuf-api-changes/&quot;&gt;cambios de API en gRPC y Protobuf&lt;/a&gt;
cubre el versionado a través del nombre del paquete en un archivo &lt;code&gt;.proto&lt;/code&gt; en vez de una ruta de
URL, y un formato de wire donde renombrar un campo es gratis pero renumerarlo es un breaking
change que ningún llamante REST reconocería como riesgoso.&lt;/p&gt;
&lt;h2&gt;¿Qué debería anunciar un cambio de versión?&lt;/h2&gt;
&lt;p&gt;Un cambio de versión debería anunciar qué rompe, a quién afecta, cómo migrar, y cuánto tiempo sigue
funcionando la versión anterior. La entrada tiene la misma forma que cualquier otra entrada de
cambio que rompe algo, más una línea con la ventana de soporte. Aquí una para una API versionada
por header:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;La versión de API 2026-11-01 está disponible. La versión 2025-06-15 se soporta hasta el 1 de
noviembre de 2027.&lt;/strong&gt;
Nuevo en 2026-11-01: &lt;code&gt;GET /invoices&lt;/code&gt; devuelve &lt;code&gt;amount&lt;/code&gt; en unidades mínimas como entero en vez de
string decimal, y el campo deprecado &lt;code&gt;customer_name&lt;/code&gt; se elimina a favor del objeto &lt;code&gt;customer&lt;/code&gt;.
Afecta a llamantes en 2025-06-15 que parsean &lt;code&gt;amount&lt;/code&gt; como string, que es el por defecto para
clientes sin fijar creados antes de junio de 2025. Migración: parsea &lt;code&gt;amount&lt;/code&gt; como entero y lee
el nombre de &lt;code&gt;customer.name&lt;/code&gt;. Fija &lt;code&gt;X-Api-Version: 2026-11-01&lt;/code&gt; cuando estés listo. Nada cambia
para llamantes que no fijan versión.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La última frase es la que deja que la mayoría de las lectoras dejen de leer, y pertenece a todo
anuncio de versión. La página de &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;ejemplos de changelog&lt;/a&gt; incluye entradas de
APIs que versionan así, y la diferencia entre las buenas y el resto está mayormente en esa última
frase.&lt;/p&gt;
&lt;h2&gt;¿A quién se le avisa cuando cambia una versión?&lt;/h2&gt;
&lt;p&gt;A todos en la versión antigua, individualmente, y al changelog para todos los demás. Un cambio de
versión es el único caso en que &amp;quot;publicamos algo sobre eso&amp;quot; garantizadamente se pierde a los
llamantes que importan: los que fijaron una versión hace dos años y no han leído una nota de
versión desde entonces. Los datos de uso responden quiénes son; el aviso tiene que llegarles donde
está su código, en los headers de respuesta y en un mensaje a la dueña de la cuenta.&lt;/p&gt;
&lt;p&gt;En el ciclo que ejecutamos, la entrada que anuncia una versión se redacta a partir del pull
request que la lanza, la revisa una persona, y se publica en &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;feed y widget&lt;/a&gt;, donde un
cliente versionado puede leerla como JSON. Cualquier persona cuyo feedback en el widget pidió el
cambio, o reportó el error que resuelve, y se convirtió en un issue de GitHub que cierra el pull
request, recibe aviso en ese issue en cuanto la entrada se publica. El mecanismo
es el mismo que para cualquier entrada; un salto de versión es solo la entrada con la apuesta más
alta.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Debería cada cambio de API recibir una versión nueva?&lt;/strong&gt;
No. Solo los cambios que rompen algo. Los cambios aditivos se lanzan bajo la versión actual con una
entrada de changelog. Versionar los cambios aditivos entrena a los llamantes a ignorar las
versiones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Es mejor el versionado por URL o por header?&lt;/strong&gt;
El versionado por URL es más fácil de ver para los llamantes y más difícil de evolucionar poco a
poco para ti; el versionado por header es al revés. Para una API pública con muchos clientes
pequeños, el versionado por URL falla menos. Para una API grande con capa de traducción, la
versión datada por header escala mejor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuántas versiones deberían soportarse a la vez?&lt;/strong&gt;
Las menos que permita tu ventana de soporte, y nunca un número ilimitado. Dos o tres versiones
concurrentes es normal; más que eso suele significar que las versiones no se están retirando.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué deberían recibir las peticiones sin versión?&lt;/strong&gt;
La versión soportada más antigua, para que los clientes existentes sin fijar sigan funcionando, con
un header de respuesta que les diga qué versión recibieron.&lt;/p&gt;
</content:encoded></item><item><title>Cambios que rompen algo: qué cuenta y cómo lanzarlos</title><link>https://changeloop.dev/blog/es/breaking-changes/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/breaking-changes/</guid><description>Un cambio que rompe algo es el que un llamante correcto no resistiría. Qué cuenta, qué no, cómo detectarlo en CI y cómo lanzarlo con seguridad.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un cambio que rompe algo es un cambio que un llamante correctamente escrito no habría sobrevivido.
La definición importa porque la mayoría de las discusiones sobre si algo &amp;quot;cuenta&amp;quot; son en realidad
discusiones sobre quién lo estaba sujetando mal. Si un llamante siguió tu documentación y tu cambio
hizo que su código dejara de funcionar, el cambio rompía algo. Lo que pretendías no tiene nada que
ver.&lt;/p&gt;
&lt;p&gt;Esa es toda la prueba. El resto de este artículo es lo que se deriva de ella: qué la falla, qué la
pasa, cómo detectar un fallo antes de que se mergee, y qué hacer una vez que sabes que estás
lanzando uno.&lt;/p&gt;
&lt;h2&gt;¿Qué cuenta como un cambio que rompe algo?&lt;/h2&gt;
&lt;p&gt;Aplica la prueba al llamante, no al diff. Un cambio rompe algo cuando un llamante que solo
dependía del comportamiento documentado tiene que cambiar su código, su configuración o sus datos
para seguir funcionando. Eliminar un campo, renombrar un endpoint, endurecer la validación, cambiar
un valor por defecto y cambiar el tipo de un valor califican todos. Añadir un campo opcional no.
Corregir un error normalmente no, con una excepción importante más abajo.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cambio&lt;/th&gt;
&lt;th&gt;¿Rompe algo?&lt;/th&gt;
&lt;th&gt;Por qué&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Eliminar o renombrar un campo, endpoint, flag u opción&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Los llamantes correctos lo referencian&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Añadir un campo opcional o un endpoint nuevo&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Las llamadas existentes no cambian&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hacer obligatoria una entrada opcional&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Las llamadas que la omitían ahora fallan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endurecer una validación que antes se aceptaba&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Entradas que funcionaban ahora se rechazan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cambiar un valor por defecto&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Los llamantes que no lo fijaron reciben comportamiento nuevo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cambiar un tipo (string a número, valor único a array)&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Los parsers escritos para el tipo documentado fallan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reordenar las claves de un objeto&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;A menos que hayas documentado el orden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corregir un error del que dependían los llamantes&lt;/td&gt;
&lt;td&gt;En la práctica, sí&lt;/td&gt;
&lt;td&gt;Ver la sección sobre contratos accidentales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subir un límite de tasa o un tope de tamaño&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Nada de lo que funcionaba deja de funcionar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bajar un límite de tasa o un tope de tamaño&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Tráfico que estaba bien ahora se limita&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cambiar la redacción de un mensaje de error&lt;/td&gt;
&lt;td&gt;Depende&lt;/td&gt;
&lt;td&gt;Rompe algo si lo documentaste o los llamantes hacen match con él&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué no es un cambio que rompe algo?&lt;/h2&gt;
&lt;p&gt;Un cambio no rompe nada cuando toda llamada que funcionaba antes sigue funcionando, sin cambios, y
sigue significando lo mismo. Añadir un endpoint nuevo, añadir un parámetro de petición opcional,
añadir un campo a una respuesta, hacer opcional una entrada obligatoria, subir un límite y mejorar
un mensaje de error con el que nadie hace match pasan todos la prueba. Estos cambios aditivos pueden
salir en una versión menor con una entrada de changelog corriente.&lt;/p&gt;
&lt;p&gt;Los cambios aditivos aun así rompen llamantes en tres situaciones. Un cliente cuyo deserializador
rechaza campos desconocidos falla con el primer campo nuevo de la respuesta, así que documenta
pronto que los llamantes deben ignorar los campos que no reconocen. Un valor nuevo de un enum rompe
a todo llamante con un switch exhaustivo (más sobre eso abajo). Y una respuesta que crece puede
empujar a un llamante más allá de un límite de tamaño, un timeout o un ancho de columna en los que
nunca tuvo que pensar.&lt;/p&gt;
&lt;p&gt;Cuatro filas de la tabla merecen una mirada más de cerca, porque ahí es donde ocurren los
desacuerdos.&lt;/p&gt;
&lt;h2&gt;Los cuatro cambios que rompen algo que los equipos pasan por alto&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Contratos accidentales.&lt;/strong&gt; Si tu API ha devuelto el mismo campo no documentado durante tres años,
un llamante ha construido sobre él. La &lt;a href=&quot;https://www.hyrumslaw.com/&quot;&gt;ley de Hyrum&lt;/a&gt; es la versión
corta: con suficientes usuarios, todo comportamiento observable de tu sistema dependerá de alguien.
Por eso &amp;quot;fue una corrección de errores&amp;quot; no es una defensa. La corrección puede ser correcta y aun
así romper algo. Lánzala como tal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cambios de comportamiento sin cambio de esquema.&lt;/strong&gt; El campo sigue ahí, el tipo es el mismo, y el
valor ahora significa algo distinto. Un &lt;code&gt;status&lt;/code&gt; que antes era &lt;code&gt;active&lt;/code&gt; o &lt;code&gt;inactive&lt;/code&gt; y ahora
también devuelve &lt;code&gt;suspended&lt;/code&gt; rompe a todo llamante con un switch exhaustivo. Un timestamp que pasa
de hora local a UTC rompe a todo el que no leyó la documentación dos veces. Nada en un diff del
archivo OpenAPI muestra esto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validación endurecida.&lt;/strong&gt; Empiezas a rechazar correos sin TLD, o espacios finales, o nombres de
más de 80 caracteres. Todo llamante que enviaba exactamente eso ahora recibe un 400 por una
petición que funcionaba la semana pasada. Los cambios de validación son los que más se lanzan como
una corrección de &amp;quot;endurecimiento&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Valores por defecto cambiados.&lt;/strong&gt; Nadie que fijó el valor explícitamente nota nada. Todos los que
no lo hicieron, que son la mayoría de los llamantes, reciben comportamiento nuevo sin cambiar una
línea. Un valor por defecto cambiado rompe a la mayoría de tus usuarios precisamente porque nunca
vieron el ajuste.&lt;/p&gt;
&lt;h2&gt;¿Cómo se detecta un cambio que rompe algo antes de que se lance?&lt;/h2&gt;
&lt;p&gt;Compara el contrato del pull request con el contrato de la rama principal, en CI, y haz fallar el
build ante una diferencia que rompa algo. Existen herramientas de diff de esquemas para la mayoría
de los formatos de interfaz, y cada una conoce las reglas de ruptura de su propio formato:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Interfaz&lt;/th&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Qué compara&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;REST (OpenAPI)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/oasdiff/oasdiff&quot;&gt;oasdiff&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Dos specs OpenAPI, con un informe de cambios que rompen algo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gRPC (Protobuf)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://buf.build/docs/breaking/&quot;&gt;buf breaking&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Archivos &lt;code&gt;.proto&lt;/code&gt;, a nivel de wire o de código fuente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GraphQL&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/kamilkisiela/graphql-inspector&quot;&gt;GraphQL Inspector&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Dos esquemas, señalando cambios que rompen algo y peligrosos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crates de Rust&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/obi1kenobi/cargo-semver-checks&quot;&gt;cargo-semver-checks&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;La API pública frente a la última versión publicada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paquetes de TypeScript&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://api-extractor.com/&quot;&gt;API Extractor&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Un informe versionado de la API pública del paquete&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Estas herramientas detectan de forma fiable campos eliminados, operaciones renombradas y tipos
cambiados. No pueden ver los dos primeros de los cuatro tipos de arriba, un contrato accidental o un
cambio de comportamiento, porque ninguno aparece en un esquema. Usa la herramienta para frenar los
obvios y la pregunta de revisión &amp;quot;¿podría notarlo un llamante correcto?&amp;quot; para el resto. El mismo
job de CI es un lugar natural para exigir una entrada de changelog, como se describe en
&lt;a href=&quot;https://changeloop.dev/blog/es/changelog-ci-enforcement/&quot;&gt;exigir entradas de changelog en CI&lt;/a&gt;, y
&lt;a href=&quot;https://changeloop.dev/blog/es/grpc-protobuf-api-changes/&quot;&gt;cambios de API en gRPC y Protobuf&lt;/a&gt; repasa los casos a nivel de
wire.&lt;/p&gt;
&lt;h2&gt;¿Cómo se marca un cambio que rompe algo en un commit?&lt;/h2&gt;
&lt;p&gt;Con &lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/&quot;&gt;Conventional Commits&lt;/a&gt;, un cambio que rompe
algo se marca con un &lt;code&gt;!&lt;/code&gt; antes de los dos puntos (&lt;code&gt;feat(api)!: remove the legacy export endpoint&lt;/code&gt;) o
con un pie que empieza por &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; seguido de una descripción. Cualquiera de los dos
corresponde a una versión mayor. Escribe el pie como el primer borrador de la entrada de changelog,
nombrando a quién afecta y qué debe hacer. &lt;a href=&quot;https://changeloop.dev/blog/es/conventional-commits-changelog/&quot;&gt;Conventional commits y el changelog&lt;/a&gt;
explica hasta dónde llega la convención.&lt;/p&gt;
&lt;p&gt;La misma regla vale para las bibliotecas. Una función pública eliminada, un tipo de parámetro
restringido o un valor de retorno cambiado es una versión mayor bajo el versionado semántico. Las
bibliotecas no siempre la cumplen: un &lt;a href=&quot;https://arxiv.org/abs/2110.07889&quot;&gt;estudio de 119.879 actualizaciones de Maven Central&lt;/a&gt;
encontró que el 16,6% rompió el versionado semántico, pero solo el 7,9% de los proyectos cliente se
vio afectado, porque la mayoría de esos cambios tocaban código que ningún cliente llamaba. La
ruptura se mide en el llamante.&lt;/p&gt;
&lt;h2&gt;¿Cómo se lanza un cambio que rompe algo?&lt;/h2&gt;
&lt;p&gt;Se lanza abiertamente, con una fecha, con un camino. Los pasos de abajo van en orden, y el último
es el que la mayoría de los equipos se saltan: decirle a la gente afectada que lo que estaba
esperando ya ha pasado.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Decide si lo es.&lt;/strong&gt; Usa la prueba de arriba, no el diff. Si dos ingenieros no están de
acuerdo, rompe algo; el desacuerdo es evidencia de que un llamante podría razonablemente haber
dependido del comportamiento anterior.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versiónalo.&lt;/strong&gt; Bajo &lt;a href=&quot;https://semver.org/&quot;&gt;versionado semántico&lt;/a&gt; un cambio que rompe algo es una
versión mayor. Si llevas una API datada o versionada, va en una versión nueva y la antigua sigue
funcionando hasta una fecha declarada. Si no puedes versionar, no estás lanzando un cambio que
rompe algo, estás lanzando una caída con una entrada de changelog. Qué esquema lleva la versión
es el tema de &lt;a href=&quot;https://changeloop.dev/blog/es/api-versioning-best-practices/&quot;&gt;buenas prácticas de versionado de API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Escribe la entrada antes de que se mergee el código.&lt;/strong&gt; La entrada tiene una forma fija: qué
cambia, a quién afecta, qué deben hacer, y para cuándo. Si no puedes llenar las cuatro, el
cambio no está listo. La &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;plantilla de notas de versión&lt;/a&gt; pone estas
entradas primero, con una fecha en vez de un número de versión, exactamente por esto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Da un plazo, no un número de lanzamiento.&lt;/strong&gt; &amp;quot;Eliminado en v5&amp;quot; no significa nada para quien no
sigue tus lanzamientos. &amp;quot;Deja de funcionar el 1 de noviembre de 2026&amp;quot; significa lo mismo para
todos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proporciona la migración.&lt;/strong&gt; Un ejemplo de código de la llamada antigua junto a la nueva. Si el
cambio es un renombrado, di ambos nombres en la misma frase. Si es un campo eliminado, di adónde
fueron los datos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anúncialo en todos los sitios donde estaba documentado el comportamiento anterior.&lt;/strong&gt; El
changelog, la página de docs que describe el endpoint, las notas de versión del SDK, y el header
de deprecación en la respuesta si tienes uno.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cierra el ciclo.&lt;/strong&gt; Si una clienta pidió el cambio, o reportó el error que lo motivó, avísale
cuando se lance.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;¿Cómo se ve una buena entrada de cambio que rompe algo?&lt;/h2&gt;
&lt;p&gt;Una buena entrada nombra al llamante afectado en la primera línea, indica la fecha, e incluye la
corrección. Aquí una para el caso de validación endurecida, en la forma que usamos:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Las direcciones de correo sin dominio se rechazan desde el 1 de noviembre de 2026.&lt;/strong&gt;
&lt;code&gt;POST /users&lt;/code&gt; y &lt;code&gt;PATCH /users/:id&lt;/code&gt; actualmente aceptan valores de &lt;code&gt;email&lt;/code&gt; como
&lt;code&gt;alice@localhost&lt;/code&gt;. Desde el 1 de noviembre estos devuelven &lt;code&gt;400 invalid_email&lt;/code&gt;. Afecta a
cualquier integración que cree usuarios desde directorios internos. Migración: envía una
dirección completamente cualificada, u omite el campo y fíjalo después. No se necesita ningún
cambio si tus direcciones ya tienen dominio, lo cual es cierto para el 99,4% de las cuentas
creadas este año.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dónde vive ese aviso, y qué más debería acompañarlo, es el tema de
&lt;a href=&quot;https://changeloop.dev/blog/es/api-changelog/&quot;&gt;changelog de API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El porcentaje al final no es decoración. Le dice a la lectora si debe preocuparse, que es la
pregunta con la que abrió la entrada.&lt;/p&gt;
&lt;h2&gt;¿Por qué no simplemente evitarlos?&lt;/h2&gt;
&lt;p&gt;Porque la alternativa es peor. Una API que nunca rompe nada acumula cada error que ha cometido:
el campo mal nombrado, el valor por defecto equivocado, el timestamp en hora local. Cada uno es un
impuesto sobre todo llamante nuevo para siempre, para proteger a llamantes que podrían haber
migrado en una tarde. Los equipos con mejor reputación de estabilidad rompen cosas rara vez, según
un calendario, con un camino de migración y un aviso que llegó a quienes era para ellos.&lt;/p&gt;
&lt;p&gt;La mecánica de ese aviso se cubre en &lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;deprecar una API&lt;/a&gt;. La entrada
misma se redacta de la misma forma que cualquier otra entrada en el &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;feed de changelog&lt;/a&gt;: a
partir del pull request mergeado, retenida para un humano, luego publicada en el sitio donde los
llamantes afectados ya leen.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la diferencia entre un cambio que rompe algo y uno que no?&lt;/strong&gt;
Un cambio que rompe algo obliga a un llamante correcto a cambiar su código, su configuración o sus
datos para seguir funcionando. Uno que no rompe nada deja todas las llamadas existentes
funcionando con el mismo significado, por eso las adiciones suelen ser seguras y las eliminaciones,
los renombrados y las reglas endurecidas normalmente no lo son.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuenta añadir un campo obligatorio?&lt;/strong&gt;
Sí. Toda llamada existente lo omite, así que toda llamada existente ahora falla. Añádelo como
opcional con un valor por defecto sensato, o versiona el endpoint.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuenta una corrección de errores?&lt;/strong&gt;
Puede ser. Si los llamantes dependían del comportamiento con el error, corregirlo los rompe,
diga lo que diga la documentación. Trata cualquier corrección que cambie la salida observable como
un cambio que rompe algo, a menos que puedas demostrar que nadie dependía de ella.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Aplica el versionado semántico a una API web?&lt;/strong&gt;
La regla sí: los cambios que rompen algo reciben una versión mayor nueva y la antigua sigue
funcionando durante un período declarado. El número suele vivir en la URL o en un header de fecha
en vez de en una versión de paquete.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuánto aviso es suficiente?&lt;/strong&gt;
El suficiente para que un llamante encuentre el aviso y haga el trabajo. Noventa días es un piso
habitual para APIs públicas; más tiempo para cualquier cosa usada en código que se envía a
usuarios finales y no se puede actualizar de forma remota.&lt;/p&gt;
</content:encoded></item><item><title>Cerrar el ciclo de feedback desde el changelog</title><link>https://changeloop.dev/blog/es/customer-feedback-loop/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/customer-feedback-loop/</guid><description>Un ciclo de feedback se cierra cuando quien preguntó sabe que se lanzó. El ciclo en cuatro pasos, dónde se rompe y por qué el changelog es el sitio.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un ciclo de feedback del cliente se cierra cuando a la persona que dio el feedback se le dice qué
pasó con él. No cuando se archiva. No cuando se prioriza. Ni siquiera cuando se lanza. Cuando se le
dice. La mayoría de los equipos hacen bien los primeros tres pasos y el último no lo hacen en
absoluto, y luego se preguntan por qué la gente que envía feedback deja de enviarlo.&lt;/p&gt;
&lt;p&gt;Este artículo trata de ese último paso, y de una afirmación concreta: el changelog es el lugar
correcto para cerrar el ciclo, porque es el único artefacto que ya existe exactamente en el momento
en que el ciclo se puede cerrar.&lt;/p&gt;
&lt;h2&gt;¿Qué es un ciclo de feedback del cliente?&lt;/h2&gt;
&lt;p&gt;Un ciclo de feedback del cliente es el camino desde que una usuaria te dice algo hasta que esa
usuaria se entera de qué hiciste al respecto. Tiene cuatro pasos: recolectar el feedback, decidir
qué hacer con él, lanzar el resultado, y avisarle a quien preguntó. El ciclo está abierto hasta que
pasa el cuarto paso. Un equipo que recolecta feedback y lanza correcciones pero nunca avisa a nadie
tiene una bandeja de entrada, no un ciclo.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paso&lt;/th&gt;
&lt;th&gt;Qué pasa&lt;/th&gt;
&lt;th&gt;Dónde suele romperse&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Recolectar&lt;/td&gt;
&lt;td&gt;Llega el feedback: widget, soporte, ventas, entrevistas&lt;/td&gt;
&lt;td&gt;Nada; todo equipo lo hace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decidir&lt;/td&gt;
&lt;td&gt;Se triaga, se fusiona con duplicados, se acepta o rechaza&lt;/td&gt;
&lt;td&gt;Los rechazos nunca se comunican&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lanzar&lt;/td&gt;
&lt;td&gt;Alguien lo construye y sale en vivo&lt;/td&gt;
&lt;td&gt;El enlace a la petición se pierde al mergear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avisar&lt;/td&gt;
&lt;td&gt;Quien preguntó se entera de que se lanzó&lt;/td&gt;
&lt;td&gt;Se salta, o se hace solo con quien más se quejó&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La cuarta fila es de la que trata este artículo. Se rompe por una razón estructural, no cultural:
para cuando una función se lanza, la petición que la causó vive en un sistema distinto de la cosa
que se lanzó, y no es trabajo de nadie conectarlas. El ciclo empieza antes, con cómo se pide la
petición desde el principio; &lt;a href=&quot;https://changeloop.dev/blog/es/how-to-ask-for-customer-feedback/&quot;&gt;cómo pedir feedback a los clientes&lt;/a&gt;
cubre la redacción y el momento.&lt;/p&gt;
&lt;h2&gt;¿Por qué se quedan abiertos los ciclos de feedback?&lt;/h2&gt;
&lt;p&gt;Los ciclos de feedback se quedan abiertos porque la petición y el cambio lanzado viven en lugares
distintos y el enlace entre ambos se hace a mano, si es que se hace. La petición está en una
herramienta de feedback, una bandeja de soporte o una hoja de cálculo. El cambio está en un pull
request. El anuncio está en un changelog o un correo. Tres sistemas, tres dueños, y el enlace del
tercero de vuelta al primero es una persona que recuerda, meses después, quién preguntó.&lt;/p&gt;
&lt;p&gt;Hay una segunda razón. El paso de avisar suele enmarcarse como una tarea de marketing (&amp;quot;anunciar la
función&amp;quot;) en vez de una tarea de soporte (&amp;quot;responderle a la persona&amp;quot;). Los anuncios van a todos y
no llegan a nadie en particular. La persona que pidió la función en marzo lee el anuncio en junio,
si es que lo lee, como noticia, no como respuesta. El ciclo se cierra solo si el mensaje va
dirigido a ella.&lt;/p&gt;
&lt;h2&gt;¿Por qué cerrar el ciclo desde el changelog?&lt;/h2&gt;
&lt;p&gt;Porque la entrada de changelog es el único artefacto que existe exactamente en el momento
correcto, contiene exactamente las palabras correctas, y lo escribe exactamente la persona
correcta. Existe cuando el cambio está en vivo y no antes. Dice qué cambió en los términos de la
lectora, que es el mensaje que necesita quien preguntó. Y lo escribe alguien que acaba de leer el
pull request, que es el único momento en que el enlace a la petición original sigue siendo visible.&lt;/p&gt;
&lt;p&gt;Compara las alternativas. Cerrar el ciclo desde la herramienta de feedback significa que la
herramienta de feedback tiene que saber cuándo se lanzó la función, lo que significa que alguien
actualiza un estado a mano. Cerrarlo desde el pull request significa avisarle a la clienta al
mergear, antes de que el cambio esté en vivo, una promesa rota con marca de tiempo en cuanto se
retrasa el despliegue. Cerrarlo desde el anuncio de marketing significa esperar a que haya uno, y
la mayoría de los cambios lanzados nunca tienen uno.&lt;/p&gt;
&lt;p&gt;El changelog está en el medio: después del merge, en el momento del lanzamiento, con la redacción
lista.&lt;/p&gt;
&lt;h2&gt;Cómo se cierra el ciclo, paso a paso&lt;/h2&gt;
&lt;p&gt;Este es el mecanismo que ejecutamos. Se describe aquí como especificación en vez de recorrido de
producto, porque cada paso se puede hacer a mano o con otras herramientas; lo que importa es el
orden.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;El feedback se convierte en un issue en el repositorio que lo va a corregir.&lt;/strong&gt; Un envío de
widget se archiva como issue etiquetado de GitHub (&lt;code&gt;feature-request&lt;/code&gt; o &lt;code&gt;bug&lt;/code&gt;, una prioridad, y
&lt;code&gt;from-widget&lt;/code&gt;), con la dirección de correo de quien lo envió fuera del cuerpo del issue. El issue
vive junto al código, para que el paso tres pueda encontrarlo. Un issue creado a mano, por
ejemplo desde una &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-template/&quot;&gt;plantilla de solicitud de función&lt;/a&gt;, queda
fuera de este camino: el paso cinco no lo comenta, así que cierra ese ciclo tú mismo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La corrección referencia el issue.&lt;/strong&gt; El pull request dice &lt;code&gt;Fixes #142&lt;/code&gt;, la propia palabra
clave de cierre de GitHub. Nada nuevo que aprender, y es la misma frase que las desarrolladoras
ya escriben.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La entrada de changelog se redacta a partir del pull request mergeado y lleva el enlace.&lt;/strong&gt; Al
mergear, se crea el borrador y &lt;code&gt;#142&lt;/code&gt; se lee del cuerpo del PR y se adjunta al borrador. El
enlace se crea mientras sigue siendo barato, por una máquina, con datos que ya están ahí.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una persona revisa la entrada.&lt;/strong&gt; Redacción, audiencia, si debería publicarse siquiera. Un
borrador descartado no cierra nada, lo cual es correcto: un refactor interno que casualmente
referenció un issue no es noticia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Al aprobarse, se avisa a quien preguntó.&lt;/strong&gt; Se publica un comentario en el issue en que se
convirtió su feedback, &amp;quot;Shipped —&amp;quot; seguido del título de la entrada y un enlace a la entrada
publicada, y el widget le muestra a quien lo envió la misma entrada lanzada. Una vez, nunca
dos, y solo después de que una persona haya publicado la entrada. La misma entrada sale por
&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;feed y widget&lt;/a&gt; a todos los que no preguntaron.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;El orden del paso cinco es todo el diseño. Avisarle a quien preguntó al mergear sería más temprano
y más fácil, y sería incorrecto aproximadamente tan a menudo como se retrasan los despliegues. Un
feature flag rompe incluso este orden, porque aprobado y publicado puede pasar mientras la función
sigue siendo invisible para la cuenta de quien la pidió;
&lt;a href=&quot;https://changeloop.dev/blog/es/feature-flags-feature-requests/&quot;&gt;feature flags y solicitudes de funciones&lt;/a&gt; cubre la
verificación extra que este paso necesita en cuanto hay un flag de por medio.&lt;/p&gt;
&lt;h2&gt;¿Cómo se ve un ciclo cerrado para la clienta?&lt;/h2&gt;
&lt;p&gt;Se ve como una respuesta. La clienta envió una petición a través de un widget, y un día el widget
la muestra como lanzada, con enlace a una entrada que la describe en sus términos; en GitHub, el
issue recibe la misma noticia como comentario. No se suscribió a un boletín, no revisó una roadmap, no
buscó en el changelog. Le avisaron.&lt;/p&gt;
&lt;p&gt;Esa es la experiencia que provoca el siguiente pedazo de feedback. La gente le envía feedback a
productos que responden. La página de &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;ejemplos de changelog&lt;/a&gt; incluye entradas
de equipos cuyos usuarios visiblemente siguen volviendo con peticiones, y el hilo común no es la
herramienta; es que las entradas se leen como respuestas.&lt;/p&gt;
&lt;h2&gt;¿Cómo se mide un ciclo de feedback?&lt;/h2&gt;
&lt;p&gt;Mide la fracción de cambios lanzados que avisaron al menos a quien preguntó, y el tiempo desde el
lanzamiento hasta el aviso. Dos números, ambos fáciles una vez que el enlace existe e imposibles
antes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tasa de cierre&lt;/strong&gt;: de las entradas de changelog publicadas este mes, cuántas enlazaron al menos
una petición, y de esas, cuántas avisaron a quien preguntó. Si el segundo número es mucho más
bajo que el primero, las notificaciones están fallando; si el primero es bajo, las peticiones no
se están referenciando desde los pull requests, y la corrección es una frase en la plantilla de
PR.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tiempo de lanzamiento a aviso&lt;/strong&gt;: cuánto pasa entre que la entrada sale en vivo y se avisa a
quien preguntó. Con el mecanismo de arriba son segundos. A mano son típicamente semanas, o nunca,
y &amp;quot;nunca&amp;quot; es el número que importa.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No midas el ciclo por el volumen de feedback recolectado. Recolectar es el paso fácil, y un equipo
que lo mide lo va a optimizar, lo cual produce más ciclos abiertos.&lt;/p&gt;
&lt;h2&gt;¿Dónde encaja la roadmap?&lt;/h2&gt;
&lt;p&gt;Una roadmap pública es una forma de cerrar el ciclo temprano: le dice a quien preguntó que su
petición fue escuchada, antes de que se lance. Es útil, y no sustituye el último paso. &amp;quot;Planeado&amp;quot;
es una promesa sobre el futuro; &amp;quot;Lanzado&amp;quot; es un hecho sobre el presente. Ejecuta la
&lt;a href=&quot;https://changeloop.dev/blog/es/public-roadmap/&quot;&gt;roadmap pública&lt;/a&gt; a partir de los mismos issues, con una etiqueta por
columna, para que la misma petición se mueva de planeada a lanzada sin volver a introducirse en
ningún sitio. El paso a lanzada es un cambio de etiqueta (&lt;code&gt;roadmap:shipped&lt;/code&gt;) que nadie hace por ti
cuando se aprueba la entrada, así que hazlo en la misma revisión.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuáles son los cuatro pasos de un ciclo de feedback del cliente?&lt;/strong&gt;
Recolectar, decidir, lanzar, avisar. El ciclo está abierto hasta que pasa el cuarto paso. La
mayoría de los marcos añaden pasos de análisis y priorización en el medio; son refinamientos de
&amp;quot;decidir&amp;quot;, y ninguno cierra nada.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería avisarse a los clientes cuando se rechaza una petición?&lt;/strong&gt;
Sí, y es el mensaje más descuidado del ciclo. Un claro &amp;quot;no vamos a hacer esto, y aquí está por qué&amp;quot;
termina la espera. El silencio deja el ciclo abierto para siempre y a la clienta comprobando.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿En qué se diferencia cerrar el ciclo de anunciar una función?&lt;/strong&gt;
Un anuncio va a todos. Cerrar el ciclo es una respuesta a la gente que preguntó, por el canal por
el que preguntó. Haz ambas cosas; son mensajes distintos para lectoras distintas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Y si quien preguntó no está en GitHub?&lt;/strong&gt;
La mayoría no lo está, y no pasa nada. El widget les sigue mostrando el estado de lo que enviaron,
incluida la entrada lanzada y su enlace, así que no necesitan nada más allá de la página desde la
que escribieron. El comentario en el issue es para las personas que pueden ver el repositorio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Este ciclo funciona en GitLab o Bitbucket en vez de GitHub?&lt;/strong&gt;
El widget y el changelog sí. El comentario automático del paso cinco todavía no. Un equipo en
GitLab o Bitbucket sigue recibiendo cada envío, sigue archivándolo como issue, y sigue mostrándole
a quien preguntó un estado en el widget, pero cerrar ese ciclo concreto de vuelta sobre el propio
issue es un paso que hay que hacer a mano hasta que exista esa integración.&lt;/p&gt;
</content:encoded></item><item><title>Plantilla de solicitud de función que se vuelve changelog</title><link>https://changeloop.dev/blog/es/feature-request-template/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/feature-request-template/</guid><description>Una solicitud de función solo sirve si se encuentra al lanzarse. La plantilla, las etiquetas que la enrutan, y los campos que luego lee el changelog.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Una plantilla de solicitud de función es un formulario con cuatro preguntas: qué intenta hacer la
persona, qué se lo impide, qué probó en su lugar, y cómo quiere que le avisen cuando esté listo.
Todo lo demás que suele aparecer en una, selectores de prioridad, estimaciones de esfuerzo,
puntuaciones de valor de negocio, es para el equipo que recibe la solicitud, y lo rellena mal quien
la envía.&lt;/p&gt;
&lt;p&gt;Las solicitudes ordenadas son la prueba equivocada para una plantilla. La correcta: seis meses
después, cuando se lanza la función, ¿puede alguien encontrar la solicitud, entenderla, y avisarle
a quien la escribió? La mayoría de las plantillas están diseñadas para la admisión. Esta está
diseñada para el día en que se cierra el ciclo.&lt;/p&gt;
&lt;h2&gt;¿Qué debería incluir una plantilla de solicitud de función?&lt;/h2&gt;
&lt;p&gt;Debería incluir el objetivo, el bloqueo, la solución alternativa, y un camino de vuelta a quien
preguntó. Cuatro campos, en ese orden, cada uno responde una pregunta que el equipo hará después.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campo&lt;/th&gt;
&lt;th&gt;La pregunta que responde después&lt;/th&gt;
&lt;th&gt;Por qué está en el formulario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;¿Qué intentas hacer?&lt;/td&gt;
&lt;td&gt;¿Es la función construida la que se necesitaba?&lt;/td&gt;
&lt;td&gt;El objetivo sobrevive a cualquier propuesta concreta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;¿Qué te lo impide hoy?&lt;/td&gt;
&lt;td&gt;¿Cómo se ve &amp;quot;listo&amp;quot;?&lt;/td&gt;
&lt;td&gt;Nombra el vacío sin prescribir la corrección&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;¿Qué haces en su lugar?&lt;/td&gt;
&lt;td&gt;¿Qué tan urgente es realmente?&lt;/td&gt;
&lt;td&gt;Una solución alternativa dolorosa es una señal más fuerte que un selector de prioridad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;¿Cómo deberíamos avisarte?&lt;/td&gt;
&lt;td&gt;¿Quién recibe el mensaje de &amp;quot;lanzado&amp;quot;?&lt;/td&gt;
&lt;td&gt;El campo que la mayoría de las plantillas omiten&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Lo que falta deliberadamente: una solución propuesta como campo obligatorio (bienvenida como
comentario, equivocada como marco), un selector de prioridad (toda persona que envía elige alta), y
cualquier estimación de esfuerzo o valor (trabajo del equipo, después de la triage). Una plantilla
que pide una solución recibe solicitudes de botones; una plantilla que pide un objetivo recibe
solicitudes de resultados, y sobre resultados se escribe una entrada de changelog.&lt;/p&gt;
&lt;h2&gt;La plantilla&lt;/h2&gt;
&lt;p&gt;Esta es la plantilla de issue de GitHub que usamos, como formulario. Pégala en
&lt;code&gt;.github/ISSUE_TEMPLATE/feature_request.yml&lt;/code&gt; y se renderiza como formulario estructurado en la
página de nuevo issue. Las solicitudes archivadas a través de ella terminan como issues con los
mismos campos que las archivadas desde un widget de feedback, lo cual importa para la siguiente
sección.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: Feature request
description: What you are trying to do, and what stops you.
labels: [&amp;quot;feature-request&amp;quot;]
body:
  - type: textarea
    id: goal
    attributes:
      label: What are you trying to do?
      description: &amp;gt;-
        The outcome, not the button. &amp;quot;Export a month of invoices as one
        PDF&amp;quot; beats &amp;quot;add a PDF export&amp;quot;.
    validations:
      required: true
  - type: textarea
    id: blocker
    attributes:
      label: What stops you today?
      description: &amp;gt;-
        Where the product runs out. An error, a missing option, a limit.
    validations:
      required: true
  - type: textarea
    id: workaround
    attributes:
      label: What do you do instead?
      description: &amp;gt;-
        The spreadsheet, the script, the manual step. &amp;quot;Nothing, I gave
        up&amp;quot; is a valid answer.
  - type: input
    id: contact
    attributes:
      label: How should we tell you when it ships?
      description: &amp;gt;-
        An email address, or leave blank to be notified only on this
        issue.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dos detalles hacen el trabajo. &lt;code&gt;labels: [&amp;quot;feature-request&amp;quot;]&lt;/code&gt; significa que la solicitud se
clasifica al crearse, en vez de esperar a que alguien la triage. Y el último campo existe porque
&amp;quot;te avisaremos&amp;quot; es una promesa, y una promesa necesita una dirección.&lt;/p&gt;
&lt;h2&gt;¿Qué etiquetas debería llevar una solicitud de función?&lt;/h2&gt;
&lt;p&gt;Una solicitud de función debería llevar una etiqueta para qué es, una para qué tan urgente es, y
una para de dónde vino. Tres etiquetas, tres ejes, y cada una la lee una lectora distinta.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Etiqueta&lt;/th&gt;
&lt;th&gt;Valores&lt;/th&gt;
&lt;th&gt;Quién la lee&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tipo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;feature-request&lt;/code&gt;, &lt;code&gt;bug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Quien decide en qué cola entra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prioridad&lt;/td&gt;
&lt;td&gt;&lt;code&gt;priority:low&lt;/code&gt;, &lt;code&gt;priority:medium&lt;/code&gt;, &lt;code&gt;priority:high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Quien planea el próximo ciclo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Origen&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from-widget&lt;/code&gt;, &lt;code&gt;from-form&lt;/code&gt;, &lt;code&gt;from-support&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Quien mide de dónde vienen las solicitudes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;El widget aplica los dos primeros ejes y &lt;code&gt;from-widget&lt;/code&gt; cuando archiva un envío como issue;
&lt;code&gt;from-form&lt;/code&gt; y &lt;code&gt;from-support&lt;/code&gt; son sugerencias para solicitudes que llegan por otras vías. Las
etiquetas del widget son un tipo (&lt;code&gt;bug&lt;/code&gt; o &lt;code&gt;feature-request&lt;/code&gt;, decidido por un clasificador solo a partir del
mensaje), una prioridad (un reporte de fallo tranquilo y concreto es alta; un duplicado de algo ya
preguntado es baja; cualquier cosa que insinúe siquiera un problema de seguridad es &lt;code&gt;bug&lt;/code&gt; y alta,
sea cual sea la redacción), y &lt;code&gt;from-widget&lt;/code&gt;. Los mismos tres ejes funcionan para solicitudes que
llegan a mano a través de la plantilla de arriba, y ese es el punto: una solicitud es una
solicitud, sin importar por dónde entró.&lt;/p&gt;
&lt;p&gt;Una convención más: el widget elimina la dirección de correo de quien envía del cuerpo del issue
antes de archivarlo, porque el issue vive en un repositorio que puede ser público, y la reemplaza
con una referencia de envío. La dirección se queda fuera del issue; quien envía
sigue el resultado en el propio widget. Haz lo mismo con
el campo de contacto si tu tracker es visible para gente ajena al equipo.&lt;/p&gt;
&lt;h2&gt;¿Cómo se convierte una solicitud de función en una entrada de changelog?&lt;/h2&gt;
&lt;p&gt;Una solicitud de función se convierte en una entrada de changelog cuando un pull request cierra el
issue y la entrada redactada a partir de ese pull request enlaza de vuelta. El mecanismo son las
propias palabras clave de cierre de GitHub: un PR cuya descripción dice &lt;code&gt;Fixes #142&lt;/code&gt; cierra el
issue 142 al mergear. Si tus entradas de changelog se redactan a partir de pull requests
mergeados, el borrador puede llevar el número de issue consigo, y la entrada sabe quién preguntó.&lt;/p&gt;
&lt;p&gt;Esa es la razón por la que la plantilla pide el objetivo en vez de la solución. Cuando se escribe
la entrada, el objetivo es la frase que necesita quien escribe: &amp;quot;Ya puedes exportar un mes de
facturas como un solo PDF&amp;quot; es una entrada de changelog. &amp;quot;Se añadió exportación a PDF&amp;quot; es un mensaje
de commit. Las &lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;herramientas de changelog&lt;/a&gt; que redactan a partir de pull requests
pueden hacer la recolección y el enlace; la redacción todavía necesita a una persona, y esa persona
necesita el objetivo.&lt;/p&gt;
&lt;h2&gt;¿Qué pasa cuando se lanza?&lt;/h2&gt;
&lt;p&gt;A quien preguntó se le avisa, con enlace a la entrada. En nuestro montaje eso es automático para
las solicitudes que llegaron por el widget: un comentario que dice &amp;quot;Shipped — &amp;lt;título de la
entrada&amp;gt;&amp;quot; con enlace a la entrada publicada, publicado en el issue en cuanto una persona aprueba la
entrada, mientras el widget le muestra a quien la envió la misma entrada. Un issue creado a mano
desde esta plantilla no recibe ningún comentario automático; cierra ese ciclo tú mismo, con la
misma regla. El comentario se publica deliberadamente
al aprobarse, no al mergear: un comentario que dice que algo está en vivo antes de que lo esté es
una promesa rota con marca de tiempo. Cada solicitud se notifica como máximo una vez; una segunda
aprobación de la misma entrada no produce un segundo comentario.&lt;/p&gt;
&lt;p&gt;Si haces esto a mano, aplica la misma regla. No cierres el ciclo desde el pull request. Ciérralo
desde la entrada publicada, y ciérralo una vez. &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Feed y widget&lt;/a&gt; llevan la misma entrada a
todos los que no preguntaron, que son la mayoría; el comentario es para quienes sí.&lt;/p&gt;
&lt;h2&gt;Por qué fallan la mayoría de las plantillas de solicitud de función&lt;/h2&gt;
&lt;p&gt;Están diseñadas para facilitar la triage y lo logran, a costa del único momento que le importa a
quien preguntó. Una plantilla con doce campos recibe menos solicitudes, y las que recibe vienen de
gente con la paciencia de rellenar doce campos, que no es la misma población que la que necesita la
función. Una plantilla con cuatro campos, uno de los cuales es &amp;quot;cómo te contactamos&amp;quot;, recibe más
solicitudes y puede honrar cada una de ellas.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Debería una plantilla de solicitud de función preguntar por prioridad?&lt;/strong&gt;
No. Pregunta por la solución alternativa en su lugar. &amp;quot;Exporto a una hoja de cálculo y la
retecleo cada viernes&amp;quot; dice más sobre prioridad que un desplegable que quien envía puso en alta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían quienes preguntan proponer una solución?&lt;/strong&gt;
Pueden, en el texto libre. No lo conviertas en el marco. Las solicitudes escritas como soluciones
son más difíciles de fusionar entre sí y más difíciles de convertir en una entrada de changelog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían las solicitudes de función aparecer en una roadmap pública?&lt;/strong&gt;
Una vez planeadas, sí: una etiqueta en el mismo issue la pone en la columna planeada, y quien
preguntó puede ver cómo se mueve. El artículo &lt;a href=&quot;https://changeloop.dev/blog/es/public-roadmap/&quot;&gt;roadmap pública&lt;/a&gt; es el
mecanismo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo manejo los duplicados?&lt;/strong&gt;
Enlaza la solicitud nueva al issue existente y etiquétala como prioridad baja; no la cierres. Cada
duplicado es una persona más a la que avisar cuando se lance. Con el comentario automático de
changeloop, esa persona solo recibe aviso si el pull request también nombra su issue
(&lt;code&gt;Fixes #142, fixes #187&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Dónde debería vivir la plantilla?&lt;/strong&gt;
En el repositorio que va a recibir el pull request, para que funcione la palabra clave de cierre.
Una solicitud en un tracker separado tiene que enlazarse a mano al mergear, y ese es el paso que se
salta.&lt;/p&gt;
</content:encoded></item><item><title>Roadmap pública desde tu issue tracker, tres columnas</title><link>https://changeloop.dev/blog/es/public-roadmap/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/public-roadmap/</guid><description>Una roadmap pública es una promesa sobre el futuro. Mantenla pequeña, aliméntala de tus issues, y mueve cada elemento con una etiqueta en su issue.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Una roadmap pública es una lista de lo que pretendes construir, publicada donde los clientes la
puedan ver. La palabra que hace el trabajo es &lt;em&gt;pretendes&lt;/em&gt;: una roadmap es un conjunto de promesas
sobre el futuro, y cada elemento en ella es uno que vas a cumplir o se verá que no cumples. Esa es
la razón para publicar una, y también es la razón por la que la mayoría de las roadmaps públicas se
vuelven obsoletas en un trimestre. La versión que sobrevive es pequeña, se deriva de datos que ya
mantienes, y está conectada en el otro extremo al changelog, para que una promesa se convierta en
un hecho sin que nadie la vuelva a introducir.&lt;/p&gt;
&lt;h2&gt;¿Para qué sirve una roadmap pública?&lt;/h2&gt;
&lt;p&gt;Una roadmap pública le dice a una clienta con una petición que la petición fue escuchada, antes de
que se lance. Es la mitad temprana de cerrar el ciclo: &amp;quot;planeado&amp;quot; responde la pregunta &amp;quot;¿alguien
leyó esto?&amp;quot;, y &amp;quot;en construcción&amp;quot; responde &amp;quot;¿realmente está pasando?&amp;quot;. Ninguna de las dos sustituye
el último paso, avisarle a quien preguntó cuando se lanza, pero ambas reducen la cantidad de gente
que pregunta mientras tanto.&lt;/p&gt;
&lt;p&gt;También hace algo por el equipo: fuerza un compromiso público, que es la cura más barata conocida
para un backlog que guarda en silencio cuatrocientos elementos que nadie va a construir.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Columna&lt;/th&gt;
&lt;th&gt;La promesa que hace&lt;/th&gt;
&lt;th&gt;Qué mueve un elemento a ella&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Planeado&lt;/td&gt;
&lt;td&gt;Pretendemos construir esto&lt;/td&gt;
&lt;td&gt;Una decisión, registrada como etiqueta en el issue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;En construcción&lt;/td&gt;
&lt;td&gt;Alguien está trabajando en ello ahora&lt;/td&gt;
&lt;td&gt;Una etiqueta &lt;code&gt;roadmap:building&lt;/code&gt; en el issue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lanzado&lt;/td&gt;
&lt;td&gt;Está en vivo&lt;/td&gt;
&lt;td&gt;Una etiqueta &lt;code&gt;roadmap:shipped&lt;/code&gt;, o cerrar el issue mientras la lleva&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Tres columnas, en orden fijo, son suficientes. Una cuarta columna (&amp;quot;en consideración&amp;quot;, &amp;quot;bajo
revisión&amp;quot;, &amp;quot;backlog&amp;quot;) es donde las buenas intenciones se convierten en un museo, y es la primera
que los clientes aprenden a ignorar.&lt;/p&gt;
&lt;h2&gt;¿Debería tu roadmap ser pública?&lt;/h2&gt;
&lt;p&gt;Hazla pública si puedes mantenerla pequeña y honesta; mantenla privada si la alternativa es una
larga lista de tal vez. El costo de una roadmap pública no tiene nada que ver con publicarla: cada
elemento en ella es ahora una pregunta que alguien va a hacer, en soporte, en llamadas de ventas y
en conversaciones de renovación. Diez elementos que vas a construir son un activo. Sesenta
elementos que quizás construyas son sesenta conversaciones futuras sobre por qué no.&lt;/p&gt;
&lt;p&gt;Dos razones honestas para no publicar: tus planes cambian más rápido que un trimestre, o tu
competencia lee tu roadmap con más atención que tus clientes. Ambas son reales, y ambas se
responden publicando menos en vez de nada: solo &amp;quot;en construcción&amp;quot;, con &amp;quot;planeado&amp;quot; mantenido interno,
igual le dice a quien preguntó que su issue se está moviendo.&lt;/p&gt;
&lt;h2&gt;¿Cómo se construye una roadmap pública a partir de issues de GitHub?&lt;/h2&gt;
&lt;p&gt;Pon una etiqueta por columna en los issues que ya rastreas, y renderiza los issues etiquetados como
la roadmap. Nada se vuelve a introducir, la roadmap no puede desviarse del trabajo, y el mismo
issue que empezó como petición de un cliente se mueve por las columnas sin cambiar de identidad.&lt;/p&gt;
&lt;p&gt;El mecanismo, tal como lo ejecutamos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Una etiqueta por columna, con prefijo fijo&lt;/strong&gt;: &lt;code&gt;roadmap:planned&lt;/code&gt;, &lt;code&gt;roadmap:building&lt;/code&gt;,
&lt;code&gt;roadmap:shipped&lt;/code&gt;. Cualquier issue en un repositorio conectado que lleve una aparece en esa
columna. Un issue sin ninguna de ellas no está en la roadmap, que es la mayoría de los issues,
lo cual es correcto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Las columnas son un arreglo ordenado, siempre en el mismo orden.&lt;/strong&gt; Planeado, en construcción,
lanzado. No un mapa indexado por nombre, para que una lectora (o un widget) nunca tenga que
adivinar la secuencia.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Si un issue lleva dos etiquetas, gana la más avanzada.&lt;/strong&gt; Alguien va a añadir
&lt;code&gt;roadmap:shipped&lt;/code&gt; antes de quitar &lt;code&gt;roadmap:planned&lt;/code&gt;; una máquina de estados guiada por &amp;quot;qué
webhook llegó último&amp;quot; pondría el elemento en columnas distintas según el orden de entrega.
Decidir solo a partir del conjunto de etiquetas hace que la respuesta sea la misma sin importar
cómo lleguen los eventos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lanzado es un estado de etiqueta como los demás.&lt;/strong&gt; La tarjeta se mueve cuando el issue recibe
&lt;code&gt;roadmap:shipped&lt;/code&gt;, o se cierra mientras la lleva. La tarjeta en sí no enlaza a la entrada de
changelog; la entrada, redactada a partir del pull request que cerró el issue, es donde viven los
detalles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sírvela como datos.&lt;/strong&gt; La roadmap es un documento JSON con esas tres columnas, publicado junto
al feed de changelog con los mismos headers de caché, para que un sitio de docs, un widget o una
página de estado la puedan renderizar sin una segunda integración. La
&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;documentación del feed&lt;/a&gt; tiene la forma exacta.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Una etiqueta es poco pedirle a una mantenedora, y es toda la integración. Ningún tablero que
mantener sincronizado, ninguna herramienta separada en la que iniciar sesión, y la petición que
archivó la clienta es el elemento en la roadmap; cuando se lanza, es el mismo elemento.&lt;/p&gt;
&lt;h2&gt;¿Qué no debería contener una roadmap pública?&lt;/h2&gt;
&lt;p&gt;No debería contener fechas, estimaciones, ni nada que te avergonzaría que te preguntaran en nueve
meses. Las fechas son el error clásico: un trimestre en una roadmap se convierte en un compromiso
en una presentación de ventas se convierte en un ticket llamado &amp;quot;dijeron Q3&amp;quot;. Las columnas dicen lo
suficiente. &amp;quot;En construcción&amp;quot; ya significa &amp;quot;pronto, lo bastante como para que alguien esté en
ello&amp;quot;.&lt;/p&gt;
&lt;p&gt;Tampoco debería contener el backlog interno. Una roadmap con trescientos elementos es un problema
de búsqueda, no una promesa, y la clienta que encuentra su petición en la posición 212 aprendió
algo que no querías decirle.&lt;/p&gt;
&lt;h2&gt;¿Cómo se conecta la roadmap con el changelog?&lt;/h2&gt;
&lt;p&gt;La roadmap y el changelog describen los mismos issues desde dos lados, uno para el futuro y otro
para el pasado. Nadie mueve una tarjeta en un tablero aparte. Una mantenedora cambia la etiqueta en
el issue en el que ya estaba trabajando, la entrada se redacta a partir del pull request, y cuando
una persona aprueba esa entrada, a quien preguntó y cuyo feedback del widget se convirtió en
ese issue se le avisa en él. Mover la tarjeta a
lanzado sigue siendo un paso propio, la etiqueta &lt;code&gt;roadmap:shipped&lt;/code&gt;, así que hazlo parte de la
misma revisión; aprobar la entrada no lo hace por ti.&lt;/p&gt;
&lt;p&gt;Este es el mismo ciclo que describe el &lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;artículo del ciclo de feedback&lt;/a&gt;
desde el lado del changelog; la roadmap es lo que la clienta ve en medio de él. La recopilación
&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;herramientas de changelog&lt;/a&gt; cubre qué productos ofrecen una vista de roadmap y
cuáles la tratan como un tablero separado, que es la diferencia que decide si se mantiene precisa.&lt;/p&gt;
&lt;h2&gt;¿Cómo se ve una buena roadmap pública?&lt;/h2&gt;
&lt;p&gt;Se ve corta, y cada elemento en ella es un issue que alguien puede abrir. La prueba es si una
clienta puede ir de un elemento a la discusión detrás de él, y de un elemento lanzado a la entrada
que describe qué cambió realmente. Una roadmap que es una lista de nombres de función sin entrada
es un folleto.&lt;/p&gt;
&lt;p&gt;Un ejemplo trabajado, como el JSON que buscaría un widget:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;columns&amp;quot;: [
    { &amp;quot;column&amp;quot;: &amp;quot;planned&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;6b0c1f...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;planned&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Saved views on the inbox&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;Keep a filter you use often and come back to it.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-16T10:04:11.000Z&amp;quot; }
    ]},
    { &amp;quot;column&amp;quot;: &amp;quot;building&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;71a4e2...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;building&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Roadmap column in the widget&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;See what is coming without leaving the page.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-12T08:20:02.000Z&amp;quot; }
    ]},
    { &amp;quot;column&amp;quot;: &amp;quot;shipped&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;5c9d70...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;shipped&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Feedback filed as labelled issues&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;Widget submissions arrive as issues your triage already handles.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-02T15:41:37.000Z&amp;quot; }
    ]}
  ],
  &amp;quot;enabled&amp;quot;: true,
  &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tres elementos en tres columnas son una roadmap pública perfectamente buena. Dice qué viene, qué
está pasando, y qué pasó, y cada línea de ella es comprobable. Otros cinco formatos, de Now/Next/Later
a por resultados, se muestran con elementos de ejemplo en
&lt;a href=&quot;https://changeloop.dev/blog/es/product-roadmap-examples/&quot;&gt;ejemplos de roadmap de producto&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuántos elementos debería tener una roadmap pública?&lt;/strong&gt;
Los menos que puedas defender. Menos de diez en total es normal para un producto pequeño; más de
treinta en &amp;quot;planeado&amp;quot; es un backlog disfrazado de roadmap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería una roadmap pública tener fechas?&lt;/strong&gt;
No. Las columnas comunican secuencia sin crear un plazo. Si una clienta necesita una fecha, eso es
una conversación, no un elemento de roadmap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían votar los clientes sobre elementos de la roadmap?&lt;/strong&gt;
Los votos miden quién se presentó, no qué importa. Un comentario en el issue explicando la
solución alternativa que usan hoy vale más que cincuenta votos, y le cuesta algo a quien vota, que
es el punto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué pasa con un elemento de roadmap que se cancela?&lt;/strong&gt;
Quita la etiqueta y di por qué en el issue. Un &amp;quot;no vamos a hacer esto&amp;quot; público es parte del ciclo,
y es el mensaje que la mayoría de los equipos nunca envían.&lt;/p&gt;
</content:encoded></item><item><title>Automatización de changelog, y sus límites</title><link>https://changeloop.dev/blog/es/changelog-automation/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/changelog-automation/</guid><description>Automatiza recolección, formato y publicación. No automatices selección ni redacción. Dónde está la línea y qué pasa cada vez que se mueve, en detalle.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;La automatización de changelog funciona cuando automatiza la recolección, la clasificación y la
publicación, y se detiene en la selección y la redacción. Automatiza todo y publicas un git log
formateado; no automatices nada y el changelog se escribe a ráfagas, de memoria, antes de los
lanzamientos. La pregunta útil es qué partes automatizar, no cuánto.&lt;/p&gt;
&lt;p&gt;Los proyectos de automatización de changelog fallan en una de dos direcciones, y ambas son
predecibles desde la primera reunión de diseño. Automatiza demasiado poco y el changelog es un
documento que se supone que alguien actualiza, lo que significa que se actualiza a ráfagas, por
quien saque la pajita más corta. Automatiza demasiado y se convierte en un git log formateado:
completo, preciso, y que no lee nadie.&lt;/p&gt;
&lt;h2&gt;¿Qué partes de un changelog deberían automatizarse?&lt;/h2&gt;
&lt;p&gt;Tres de los cuatro pasos. Recolección y publicación por completo; clasificación como primera pasada
con anulación humana; selección y redacción nunca.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paso&lt;/th&gt;
&lt;th&gt;¿Automatizar?&lt;/th&gt;
&lt;th&gt;Por qué&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Recolección: cambios de commits, PRs, tickets a una lista&lt;/td&gt;
&lt;td&gt;Por completo&lt;/td&gt;
&lt;td&gt;Tedioso, se salta bajo plazo, las máquinas lo hacen perfecto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clasificación: Added, Fixed, Changed, Deprecated, Removed, Security&lt;/td&gt;
&lt;td&gt;Primera pasada, anulación humana&lt;/td&gt;
&lt;td&gt;Unos 80% correcto solo con metadatos; el 20% erróneo son las entradas que importan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Selección y redacción: qué decirle al lector, y cómo&lt;/td&gt;
&lt;td&gt;Nunca&lt;/td&gt;
&lt;td&gt;Es todo el valor del artefacto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publicación: página, feed, correo, widget, Slack&lt;/td&gt;
&lt;td&gt;Por completo, desde una fuente&lt;/td&gt;
&lt;td&gt;Donde va la mayor parte del esfuerzo manual real&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Recolección.&lt;/strong&gt; Sacar los cambios del lugar donde ocurren (commits, PRs, tickets) y ponerlos en
una lista. Automatiza esto por completo. Los humanos son malos en ello, es tedioso, y es el paso
que se salta bajo plazo. &lt;a href=&quot;https://changeloop.dev/blog/es/conventional-commits-changelog/&quot;&gt;Conventional commits&lt;/a&gt; o las
etiquetas de PR son la materia prima habitual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clasificación.&lt;/strong&gt; Decidir si algo es Added, Fixed, Changed, Deprecated, Removed o Security.
Automatiza la primera pasada a partir del tipo de commit o la etiqueta de PR, y deja que un humano
anule. La precisión aquí ronda el ochenta por ciento solo con metadatos, y el veinte por ciento
erróneo se concentra justo en las entradas que importan, porque la ambigüedad correlaciona con la
importancia.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Selección y redacción.&lt;/strong&gt; Decidir qué debería saber un lector y cómo decirlo. &lt;strong&gt;No automatices
esto.&lt;/strong&gt; Es todo el valor del artefacto. Todo lo demás es logística.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Publicación.&lt;/strong&gt; Llevar las entradas terminadas a una página, un feed, un correo, un widget en la
app, un canal de Slack. Automatiza por completo, y desde una fuente. Aquí es donde va la mayor
parte del esfuerzo manual real, y casi nadie lo cuenta. También es el paso que puede decirle a
quien pidió el cambio que se lanzó, que es todo el tema de
&lt;a href=&quot;https://changeloop.dev/blog/es/customer-feedback-loop/&quot;&gt;cerrar el ciclo de feedback desde el changelog&lt;/a&gt;. La mitad de
correo de ese paso tiene su propia forma, en &lt;a href=&quot;https://changeloop.dev/blog/es/product-update-email/&quot;&gt;la plantilla de email de novedades&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ese último punto merece pensarse. Los equipos tienden a ver el changelog como un problema de
escritura, y luego pasan la mayor parte del tiempo en distribución: copiar entradas a una
herramienta de correo, reformatear para la app, pegar en Slack, actualizar una página de docs. La
escritura toma una hora. La copia toma una hora cada lanzamiento, para siempre, y es la parte que
debería tener una máquina.&lt;/p&gt;
&lt;h2&gt;¿Qué pasa cuando se mueve la línea?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Muévela hacia arriba y obtienes un volcado de git.&lt;/strong&gt; La automatización total desde commits
produce &lt;code&gt;bump deps&lt;/code&gt;, &lt;code&gt;fix flaky test&lt;/code&gt;, &lt;code&gt;wip&lt;/code&gt; y &lt;code&gt;address review comments&lt;/code&gt; delante de los clientes.
Todo equipo que ha hecho esto luego ha añadido un filtro, y el filtro es un paso de selección
reintroducido bajo otro nombre, con peor ergonomía.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Muévela hacia abajo y obtienes ráfagas.&lt;/strong&gt; La recolección totalmente manual significa que las
entradas se escriben de memoria en el momento del lanzamiento. Ese es el modo contra el que
&lt;a href=&quot;https://changeloop.dev/blog/es/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt; advierte desde el principio, y se
degrada en silencio: el changelog parece mantenido hasta la semana en que nadie tuvo tiempo.&lt;/p&gt;
&lt;h2&gt;¿Cómo es una canalización de automatización de changelog?&lt;/h2&gt;
&lt;p&gt;Cuatro pasos, con exactamente una puerta humana, colocada donde un borrador se vuelve público.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Al mergear, deriva una entrada borrador del PR: tipo a partir de etiqueta o prefijo de commit,
título como primer borrador, enlace de vuelta al PR, autora registrada. Colócala en un cajón
sin lanzar.&lt;/li&gt;
&lt;li&gt;Cualquiera puede editar cualquier borrador en cualquier momento, y editar es barato. La mayoría
recibe una línea reescrita.&lt;/li&gt;
&lt;li&gt;Cortar un lanzamiento exige que cada entrada del cajón esté editada o marcada explícitamente
como interna. Esta puerta es todo el diseño. Sin ella, los borradores se lanzan sin editar la
semana ajetreada.&lt;/li&gt;
&lt;li&gt;Publicar es un fan-out desde el conjunto lanzado: la página pública, el feed, el correo, el
widget, el post de Slack. Una fuente, varias representaciones, sin copiar.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;El paso 3 es el único lugar donde se requiere una persona, y toma unos diez minutos por lanzamiento
una vez que los borradores son decentes. Cuando hay una petición de cliente involucrada, el
borrador también lleva el issue que cierra, que es lo que permite que el paso 4 le avise a quien
pidió; la &lt;a href=&quot;https://changeloop.dev/blog/es/feature-request-template/&quot;&gt;plantilla de solicitud de función&lt;/a&gt; está diseñada
para que ese enlace sobreviva. Dónde encaja este paso en el flujo de release más amplio es el tema del
&lt;a href=&quot;https://changeloop.dev/blog/es/release-management-process/&quot;&gt;proceso de gestión de releases&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Qué exige la automatización de tus datos?&lt;/h2&gt;
&lt;p&gt;Nada de lo anterior funciona si el changelog es un archivo Markdown, porque un archivo no se puede
renderizar en cinco superficies sin volver a parsearlo, y parsear prosa es cómo terminas con un
widget que muestra medio encabezado.&lt;/p&gt;
&lt;p&gt;Las entradas necesitan ser estructuradas: un tipo, una fecha, una versión o identificador de
lanzamiento, una audiencia, un cuerpo y un enlace. Entonces el archivo, la página, el feed y el
correo son todos vistas. Ese punto estructural es lo único que vale la pena hacer bien antes de
elegir una herramienta, porque es lo que no puedes añadir después barato. Nada de eso
funciona si no se crea de verdad una entrada para cada cambio que la necesita;
&lt;a href=&quot;https://changeloop.dev/blog/es/changelog-ci-enforcement/&quot;&gt;exigir una entrada de changelog en CI&lt;/a&gt; cubre cómo hacer que
la pipeline rechace un merge sin entrada, en vez de dejar ese paso a la memoria.&lt;/p&gt;
&lt;p&gt;Construimos &lt;a href=&quot;https://changeloop.dev/&quot;&gt;changeloop&lt;/a&gt;, donde el changelog es primero un feed y luego una página, así que lee
esto como un interés más que como una recomendación imparcial; los &lt;a href=&quot;https://changeloop.dev/pricing&quot;&gt;precios&lt;/a&gt; son un
repositorio gratis sin tarjeta, suficiente para ver la forma. &lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;Herramientas de changelog&lt;/a&gt;
es nuestra recopilación de lo que más hay, incluidos los productos con los que competimos, y el
&lt;a href=&quot;https://changeloop.dev/changelog-generator&quot;&gt;generador de changelog&lt;/a&gt; hace los pasos de recolección y clasificación en el
navegador si quieres ver la derivación antes de comprometerte con una canalización.&lt;/p&gt;
&lt;h2&gt;La prueba&lt;/h2&gt;
&lt;p&gt;Cuenta los minutos entre que un cambio se mergea y ese cambio es visible para una clienta que no
lee tu repo. Si la mayoría de esos minutos son alguien copiando texto entre herramientas, la
automatización que necesitas está en la publicación, no en la escritura.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Puede la IA escribir el changelog?&lt;/strong&gt;
Puede redactar uno. Un modelo al que se le da el pull request mergeado produce la mayoría de las
veces un primer borrador utilizable del título y el cuerpo, lo cual es la recolección y la
clasificación hechas mejor. La selección, si a un lector se le debería decir algo, y la redacción
final, siguen necesitando a la persona que conoce a la audiencia, y una canalización que publica
borradores sin esa puerta ha automatizado el paso equivocado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la diferencia entre un generador de changelog y la automatización de changelog?&lt;/strong&gt;
Un generador convierte commits en una lista formateada una vez, bajo demanda. La automatización se
ejecuta en cada merge, mantiene un cajón sin lanzar, condiciona el lanzamiento a revisión humana, y
publica en cada superficie desde una fuente. El generador es el primer paso de la canalización,
ejecutado a mano.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería el changelog automatizarse desde commits o desde pull requests?&lt;/strong&gt;
Desde pull requests, donde la unidad de cambio es el PR: el título y la descripción se escriben una
vez, para todo el cambio, y el PR enlaza el issue que cierra. La derivación basada en commits
funciona cuando el commit es la unidad y sigue una convención.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo se evita que la automatización publique cambios internos?&lt;/strong&gt;
Clasifica &lt;code&gt;chore&lt;/code&gt;, &lt;code&gt;ci&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt; y actualizaciones de dependencias como internos por
defecto, y haz que promover a público sea un acto deliberado. El valor por defecto inverso, público
a menos que alguien lo oculte, es cómo &lt;code&gt;bump deps&lt;/code&gt; llega a los clientes.&lt;/p&gt;
</content:encoded></item><item><title>Changelog vs. notas de versión: ¿cuál es la diferencia?</title><link>https://changeloop.dev/blog/es/changelog-vs-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/changelog-vs-release-notes/</guid><description>Un changelog es un registro continuo para quien busca algo. Las notas de versión son un mensaje curado para quien decide si le importa. Así se dividen.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un changelog es un registro continuo y acumulativo de todo lo que cambió, escrito para alguien que
busca algo. Las notas de versión son un mensaje curado sobre un lanzamiento, escrito para alguien
que decide si le importa. La diferencia es de audiencia, no de formato, y la mayoría de los equipos
necesitan ambos: uno como referencia, otro como anuncio, derivados de las mismas entradas.&lt;/p&gt;
&lt;p&gt;La mayoría de los equipos terminan con uno de estos por accidente y el otro por petición. Empiezas
con un changelog porque una desarrolladora quiere un registro de lo que se lanzó. Meses después
alguien de soporte pregunta por qué los clientes no sabían de una función que lleva viva desde
abril, y ahora necesitas notas de versión.&lt;/p&gt;
&lt;h2&gt;Changelog vs. notas de versión, lado a lado&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Changelog&lt;/th&gt;
&lt;th&gt;Notas de versión&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Lector&lt;/td&gt;
&lt;td&gt;Alguien que busca algo&lt;/td&gt;
&lt;td&gt;Alguien que decide si le importa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alcance&lt;/td&gt;
&lt;td&gt;Todo lo que cambió&lt;/td&gt;
&lt;td&gt;Lo que vale la pena decir sobre este lanzamiento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cadencia&lt;/td&gt;
&lt;td&gt;Continua, por merge o por lanzamiento&lt;/td&gt;
&lt;td&gt;Por lanzamiento, y solo los que valen la pena anunciar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tono&lt;/td&gt;
&lt;td&gt;Escueto, factual, a menudo imperativo&lt;/td&gt;
&lt;td&gt;Explicativo, a veces persuasivo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vida útil&lt;/td&gt;
&lt;td&gt;Permanente, y leído años después&lt;/td&gt;
&lt;td&gt;Leído la primera semana, luego archivado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vive en&lt;/td&gt;
&lt;td&gt;El repo, un sitio de docs, una página &lt;code&gt;/changelog&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Correo, en la app, un post de blog, una página de lanzamiento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Falla por&lt;/td&gt;
&lt;td&gt;Ser incompleto&lt;/td&gt;
&lt;td&gt;Ser aburrido, o llegar tarde&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué es un changelog?&lt;/h2&gt;
&lt;p&gt;Un changelog es un registro cronológico, casi completo, de lo que cambió, más reciente primero, con
cada entrada tipada (added, changed, deprecated, removed, fixed, security) y fechada. Su lector ya
decidió que le importa. Está buscando algo: cuándo cambió un comportamiento, si un error está
corregido, qué versión introdujo un flag. La completitud es todo el valor, por lo que la convención
&lt;a href=&quot;https://changeloop.dev/blog/es/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt; dedica la mayor parte de su única página
a la estructura y casi nada a la prosa.&lt;/p&gt;
&lt;h2&gt;¿Qué son las notas de versión?&lt;/h2&gt;
&lt;p&gt;Las notas de versión son un mensaje selectivo, escrito en prosa, sobre un lanzamiento. Su lector
aún no ha decidido nada. Está decidiendo si este lanzamiento le importa, y si tiene que hacer algo
al respecto. La selección es todo el valor: una nota de versión que lista todo es un changelog con
párrafos, y falla al lector de la misma forma en que un changelog que omite cosas falla al suyo.
&lt;a href=&quot;https://changeloop.dev/blog/es/how-to-write-release-notes/&quot;&gt;Cómo escribir notas de versión&lt;/a&gt; trata sobre la selección y
la redacción.&lt;/p&gt;
&lt;h2&gt;¿Necesitas un changelog y notas de versión?&lt;/h2&gt;
&lt;p&gt;Necesitas ambos en cuanto tus dos audiencias quieren cosas distintas; hasta entonces, un solo
artefacto haciendo ambos trabajos es correcto. Los equipos pequeños publican una sola página
&lt;code&gt;/changelog&lt;/code&gt; con un párrafo corto encima de cada entrada, y durante un tiempo eso sirve por igual a
una desarrolladora buscando una corrección y a una clienta ojeando novedades. Dividir demasiado
pronto te da dos cosas que mantener y una de ellas se pudrirá.&lt;/p&gt;
&lt;p&gt;La división vale la pena cuando empieza a pasar esto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tus entradas de changelog han crecido párrafos explicativos que las desarrolladoras se saltan.&lt;/li&gt;
&lt;li&gt;O lo contrario: tus anuncios de lanzamiento han empezado a listar actualizaciones de
dependencias.&lt;/li&gt;
&lt;li&gt;Soporte está copiando entradas en correos y reescribiéndolas por el camino.&lt;/li&gt;
&lt;li&gt;Alguien pide &amp;quot;solo los cambios que rompen algo&amp;quot; y no puedes filtrarlos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ese último es la señal real. Si nadie puede responder &amp;quot;qué cambió que me afecte&amp;quot; sin leerlo todo,
tienes un artefacto haciendo dos trabajos mal.&lt;/p&gt;
&lt;h2&gt;Una fuente, dos vistas&lt;/h2&gt;
&lt;p&gt;El error es tratarlos como dos documentos. Son dos vistas sobre el mismo conjunto de cambios.&lt;/p&gt;
&lt;p&gt;Escribe el changelog sobre la marcha, una entrada por cambio significativo, cada una etiquetada con
lo que es: fixed, added, changed, removed, deprecated, security. Mantén las entradas lo bastante
cortas para que escribir una no sea una decisión. Luego, en el momento del lanzamiento, las notas de
versión son una selección y una reescritura: toma las entradas que le importan a una persona,
agrúpalas por lo que le permiten hacer, y pon el motivo arriba.&lt;/p&gt;
&lt;p&gt;Esto tiene una consecuencia práctica. Si el changelog es la fuente, necesita ser datos
estructurados, no una página mantenida a mano. Una entrada necesita un tipo, una fecha, una
versión, y una forma de decir para quién es. Una vez que tiene eso, la página pública,
el widget en la app y el feed RSS o JSON son tres representaciones de una sola cosa, y nadie
reescribe nada por el camino hasta llegar a una clienta. Un correo de notas de versión puede citar
la misma entrada, desde cualquier herramienta que envíe tu correo.
&lt;a href=&quot;https://changeloop.dev/blog/es/changelog-automation/&quot;&gt;Automatización de changelog&lt;/a&gt; trata sobre cuál de esos pasos debería
poseer una máquina. Ese es todo el argumento para tratar un changelog como un feed en vez de una
página. También es, con toda transparencia, lo que construimos, así que léelo como un interés y no
como una encuesta neutral.&lt;/p&gt;
&lt;h2&gt;Si solo tienes tiempo para uno&lt;/h2&gt;
&lt;p&gt;Escribe el changelog. Es más barato por entrada, es útil el día que lo escribes, y las notas de
versión pueden derivarse de él después. Lo contrario no es cierto: no puedes reconstruir un año de
cambios a partir de doce correos de anuncio, y la gente te lo va a pedir.&lt;/p&gt;
&lt;p&gt;Mantenlo en un formato fijo para que la derivación siga siendo posible. Nuestra página de
&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;ejemplos de changelog&lt;/a&gt; recopila entradas de equipos que hacen esto bien, y la
&lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;plantilla de notas de versión&lt;/a&gt; es la forma que usamos al convertir un
conjunto de entradas en algo que valga la pena enviar.&lt;/p&gt;
&lt;h2&gt;Una nota sobre los nombres&lt;/h2&gt;
&lt;p&gt;Nada de esto está estandarizado, y encontrarás &amp;quot;notas de versión&amp;quot; usado para una lista continua y
&amp;quot;changelog&amp;quot; usado para un anuncio trimestral. No vale la pena discutir sobre las palabras. Decide
cuál de los dos trabajos hace cada uno de tus artefactos, llámalo como ya lo llame tu equipo, y
asegúrate de que ninguno esté haciendo los dos en silencio.&lt;/p&gt;
&lt;p&gt;En qué superficie acaba el resultado es una decisión aparte, cubierta en
&lt;a href=&quot;https://changeloop.dev/blog/es/changelog-page/&quot;&gt;cómo construir una página de changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Es un changelog lo mismo que las notas de versión?&lt;/strong&gt;
No. Un changelog es el registro completo, leído por gente que busca algo; las notas de versión son
el anuncio seleccionado, leído por gente que decide si le importa. El mismo cambio aparece en
ambos, redactado de forma distinta para cada lector.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Se pueden generar notas de versión a partir de un changelog?&lt;/strong&gt;
Sí, y esa es la dirección correcta. Selecciona las entradas que le importarían a una persona,
agrúpalas por resultado, reescribe el titular. Lo contrario, reconstruir un changelog a partir de
anuncios, pierde todo lo que los anuncios dejaron fuera.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Dónde debería vivir un changelog?&lt;/strong&gt;
En algún lugar permanente y enlazable al que el lector pueda llegar sin un repositorio: una página
&lt;code&gt;/changelog&lt;/code&gt;, un sitio de docs, o un feed que se renderiza en varios sitios. Un &lt;code&gt;CHANGELOG.md&lt;/code&gt; solo
llega a colaboradores, no a clientes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería un changelog incluir cambios internos?&lt;/strong&gt;
Sí, al final, una línea cada uno. El changelog es el registro completo. Las notas de versión también
pueden incluirlos, en una breve sección final, siempre que los cambios que un lector notará vayan
primero.&lt;/p&gt;
</content:encoded></item><item><title>De conventional commits a un changelog</title><link>https://changeloop.dev/blog/es/conventional-commits-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/conventional-commits-changelog/</guid><description>Los conventional commits hacen un changelog derivable. No lo hacen legible. Lo que aporta la convención, dónde se detiene, y cómo cerrar la brecha.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Los conventional commits le dan a un changelog tres cosas gratis: el tipo de cada cambio, la parte
del sistema que tocó, y si rompe algo. No le dan nada más. La redacción, la agrupación y la
selección, que son el changelog, quedan completamente abiertas, y una canalización que finge lo
contrario publica un git log formateado.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;feat(exports): add CSV column selection
fix(auth): reject expired refresh tokens
chore(deps): bump node-pg to 8.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tres commits en el formato &lt;a href=&quot;https://www.conventionalcommits.org/&quot;&gt;Conventional Commits&lt;/a&gt;. A partir
de estos, una máquina puede decirte que uno es una función, otro una corrección, otro
mantenimiento, y qué parte del sistema tocó cada uno. Eso es genuinamente útil, y es toda la promesa
de la convención: un historial de commits que puede leer algo que no sea una persona. El error es
pensar que eso te da un changelog. Te da la materia prima.&lt;/p&gt;
&lt;h2&gt;¿Qué especifica la convención?&lt;/h2&gt;
&lt;p&gt;Un tipo, un ámbito opcional, y una descripción: &lt;code&gt;type(scope): description&lt;/code&gt;. Los tipos
convencionalmente son &lt;code&gt;feat&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;chore&lt;/code&gt;, &lt;code&gt;docs&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;perf&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;ci&lt;/code&gt;. Dos
cosas marcan un cambio que rompe algo: un &lt;code&gt;!&lt;/code&gt; antes de los dos puntos, o un footer
&lt;code&gt;BREAKING CHANGE:&lt;/code&gt;. Las herramientas se guían por &lt;code&gt;feat&lt;/code&gt; y &lt;code&gt;fix&lt;/code&gt; para saltos de versión menor y de
parche, y por el marcador de breaking para uno mayor.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;El commit te da&lt;/th&gt;
&lt;th&gt;El changelog necesita&lt;/th&gt;
&lt;th&gt;Quién llena la brecha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat&lt;/code&gt; / &lt;code&gt;fix&lt;/code&gt; / &lt;code&gt;chore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added / Fixed / interno&lt;/td&gt;
&lt;td&gt;Un mapeo, automático&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(scope)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Una agrupación que el lector reconoce&lt;/td&gt;
&lt;td&gt;Una persona, una vez por ámbito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!&lt;/code&gt; o &lt;code&gt;BREAKING CHANGE:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Quién rompe, para cuándo, y qué hacer&lt;/td&gt;
&lt;td&gt;Una persona, cada vez&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;La descripción, escrita para una revisora&lt;/td&gt;
&lt;td&gt;El resultado, escrito para una clienta&lt;/td&gt;
&lt;td&gt;Una persona, cada entrada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un commit&lt;/td&gt;
&lt;td&gt;Un cambio, que puede ser varios commits&lt;/td&gt;
&lt;td&gt;Reglas de squash, o una persona&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;El marcador se lo dice a la herramienta; no se lo dice al llamante, que es el tema de
&lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;cómo deprecar una API&lt;/a&gt; y
&lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;qué es un cambio que rompe algo&lt;/a&gt;. Es una especificación pequeña y vale
la pena seguirla aunque nunca generes nada a partir de ella, porque fuerza una decisión por commit:
¿es este un cambio que ven los usuarios, o no?&lt;/p&gt;
&lt;h2&gt;¿Dónde se detienen los conventional commits?&lt;/h2&gt;
&lt;p&gt;Se detienen en la frase. Todo lo que captura la convención son metadatos sobre un cambio; el cambio
en sí sigue descrito en el vocabulario de una revisora.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Los mensajes de commit están escritos para revisoras.&lt;/strong&gt; &lt;code&gt;fix(auth): reject expired refresh tokens&lt;/code&gt; es correcto y no le dice nada a una clienta. La lectora de un changelog quiere &amp;quot;se te
cerrará la sesión cuando de verdad haya expirado, en vez de ver 401 intermitentes&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Los ámbitos son internos.&lt;/strong&gt; &lt;code&gt;exports&lt;/code&gt;, &lt;code&gt;auth&lt;/code&gt;, &lt;code&gt;ingest&lt;/code&gt; son nombres de módulos. Son estables, lo
que los hace buenos para agrupar, y no significan nada para quien está fuera de la base de código.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un cambio suele ser varios commits.&lt;/strong&gt; Una función mergeada en once commits produce once entradas,
diez de las cuales son ruido, y aplastarlas para ocultarlo pierde el historial de revisión.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;chore&lt;/code&gt; es un cajón de sastre, no una categoría.&lt;/strong&gt; Actualizaciones de dependencias, cambios de
CI y renombrados terminan todos ahí, y algunos importan a los usuarios mientras la mayoría no.&lt;/p&gt;
&lt;p&gt;Así que: la convención te da tipo, ámbito y estado de breaking gratis, y deja la redacción, la
agrupación y la selección completamente abiertas. Esas tres son el changelog.
&lt;a href=&quot;https://changeloop.dev/blog/es/changelog-entry-ownership/&quot;&gt;Quién es realmente dueña de una entrada de changelog&lt;/a&gt; cubre
quién debería encargarse de esa redacción, agrupación y selección, ya que la convención en sí no
tiene opinión al respecto.&lt;/p&gt;
&lt;h2&gt;¿Cómo se genera un changelog a partir de conventional commits?&lt;/h2&gt;
&lt;p&gt;En dos capas, y la segunda tiene que ser obligatoria.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Capa uno, automática.&lt;/strong&gt; Al mergear, deriva una entrada borrador del commit: tipo mapeado a un
tipo de changelog (&lt;code&gt;feat&lt;/code&gt; a Added, &lt;code&gt;fix&lt;/code&gt; a Fixed, un marcador de breaking a Changed más un flag),
ámbito guardado como metadato en vez de texto, enlace al PR. Colócala en la sección Unreleased que
pide &lt;a href=&quot;https://changeloop.dev/blog/es/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Capa dos, humana, y requerida.&lt;/strong&gt; Antes de que salga un lanzamiento, cada entrada borrador o
recibe una reescritura de una línea en el vocabulario del usuario, o se marca interna y se descarta
de la vista pública. Este es el paso que la gente intenta saltarse, y saltárselo es lo que produce
changelogs que se leen como un diff.&lt;/p&gt;
&lt;p&gt;El detalle importante de diseño es que la capa dos no es opcional en la canalización. Si un
lanzamiento se puede cortar con borradores sin editar, lo será, la semana en que todos están
ocupados. Qué pasos pertenecen a la máquina y cuáles a la persona es todo el tema de
&lt;a href=&quot;https://changeloop.dev/blog/es/changelog-automation/&quot;&gt;automatización de changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cortar el lanzamiento es también el momento en que un tag de git, un lanzamiento y esta entrada de
changelog o encajan o empiezan a desincronizarse; &lt;a href=&quot;https://changeloop.dev/blog/es/git-tags-releases-changelog/&quot;&gt;tags de git, lanzamientos y tu changelog&lt;/a&gt;
cubre cómo mantener los tres sincronizados.&lt;/p&gt;
&lt;h2&gt;Tres trampas&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Los squash merges se comen los footers.&lt;/strong&gt; Si tu plataforma aplasta con el título del PR como
mensaje, el footer &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; de un commit dentro de esa rama desaparece, y tu herramienta
deja de ver el cambio que rompe algo en silencio. Comprueba qué guarda realmente tu plantilla de
squash.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Los commits de revert producen entradas fantasma.&lt;/strong&gt; Un &lt;code&gt;fix&lt;/code&gt; que se revierte al día siguiente
genera una entrada por algo que nunca se lanzó, a menos que la derivación reconcilie los reverts. La
mayoría de las herramientas no lo hacen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;El salto de versión y el changelog se desincronizan.&lt;/strong&gt; Si la versión se calcula a partir de
commits y el changelog se escribe a mano después, se desvían en unos dos lanzamientos. Calcula
ambos en la misma pasada o acepta que uno de los dos estará mal.&lt;/p&gt;
&lt;h2&gt;Si quieres la parte mecánica sin una canalización&lt;/h2&gt;
&lt;p&gt;Nuestro &lt;a href=&quot;https://changeloop.dev/changelog-generator&quot;&gt;generador de changelog&lt;/a&gt; hace el paso de derivación en el navegador:
pega commits, obtén entradas agrupadas y tipadas. Es deliberadamente determinista y enteramente del
lado del cliente, así que los commits que pegas nunca salen de tu máquina, lo cual importa cuando
los mensajes son de un repositorio privado. Hace la mitad de recolección con honestidad y no
intenta la capa dos, porque la capa dos es un juicio y una herramienta que la finge produce
exactamente el changelog contra el que argumenta este artículo.&lt;/p&gt;
&lt;p&gt;Para la versión de canalización, &lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;herramientas de changelog&lt;/a&gt; cubre lo que existe.&lt;/p&gt;
&lt;h2&gt;El resumen&lt;/h2&gt;
&lt;p&gt;Los conventional commits responden &amp;quot;qué tipo de cambio es este&amp;quot; de forma fiable y barata. No
responden &amp;quot;qué deberíamos decirle a la gente&amp;quot;, y ninguna cantidad de herramientas sobre el mensaje
de commit lo hará, porque la información nunca estuvo en el mensaje de commit. Presupuesta la
reescritura.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Los conventional commits generan un changelog automáticamente?&lt;/strong&gt;
Generan un borrador automáticamente: entradas tipadas, con ámbito, enlazadas. La redacción para una
clienta, la agrupación y la decisión de qué dejar fuera siguen necesitando a una persona, y una
canalización que se salta ese paso publica mensajes de commit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué tipos de conventional commit aparecen en un changelog?&lt;/strong&gt;
&lt;code&gt;feat&lt;/code&gt; y &lt;code&gt;fix&lt;/code&gt; siempre, como Added y Fixed. &lt;code&gt;perf&lt;/code&gt; normalmente, como Changed. &lt;code&gt;chore&lt;/code&gt;, &lt;code&gt;docs&lt;/code&gt;,
&lt;code&gt;refactor&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt; y &lt;code&gt;ci&lt;/code&gt; son internos por defecto y solo aparecen si una persona promueve
uno.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo marcan los conventional commits un cambio que rompe algo?&lt;/strong&gt;
Un &lt;code&gt;!&lt;/code&gt; después del tipo o ámbito (&lt;code&gt;feat(api)!: ...&lt;/code&gt;), o un footer &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; en el cuerpo
del commit. Ambos se pierden si un squash merge solo conserva el título del PR.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Necesitas conventional commits para automatizar un changelog?&lt;/strong&gt;
No. Las etiquetas de PR, las plantillas de PR y los enlaces a issues llevan los mismos metadatos
para equipos que mergean por pull request. Los conventional commits son la opción más barata cuando
la unidad de cambio es el commit.&lt;/p&gt;
</content:encoded></item><item><title>Cómo escribir notas de versión que la gente realmente lea</title><link>https://changeloop.dev/blog/es/how-to-write-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/how-to-write-release-notes/</guid><description>«Corrección de errores y mejoras de rendimiento» no es una nota de versión. La pregunta que cada entrada debe responder, y la reescritura de una real.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Para escribir notas de versión que la gente lea, responde una pregunta por entrada: qué puede hacer
ahora el lector que antes no podía, y qué tiene que hacer al respecto. Pon primero cualquier cosa
con fecha límite, nombra a quién afecta, di &amp;quot;no requiere ninguna acción&amp;quot; cuando sea cierto, y omite
los lanzamientos que no tienen nada que decir. Todo lo demás en esta página es esa regla aplicada.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Corrección de errores y mejoras de rendimiento.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Todo producto ha publicado esto alguna vez. La causa rara vez es pereza: esto es lo que resulta
cuando las notas de versión se escriben desde dentro, por alguien que ha pasado dos semanas metido
en el diff y ya no puede ver qué partes le importarían a un desconocido. Un mejor tono no lo
arreglará; responder la pregunta sí.&lt;/p&gt;
&lt;h2&gt;¿Qué deben incluir las notas de versión?&lt;/h2&gt;
&lt;p&gt;Las notas de versión deben incluir, por cada cambio que merezca mención: qué puede hacer ahora el
lector, a quién aplica, qué debe hacer al respecto (incluido &amp;quot;nada&amp;quot;), y cuándo entra en vigor
cualquier cosa con fecha límite. No deben incluir números de ticket internos, nombres de componentes
que solo usa el equipo, ni un número de versión como único titular.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Incluir&lt;/th&gt;
&lt;th&gt;Dejar fuera&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;El resultado, en los términos del lector&lt;/td&gt;
&lt;td&gt;La implementación, en los términos del equipo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A quién afecta, por plan, rol o versión de API&lt;/td&gt;
&lt;td&gt;&amp;quot;Algunos usuarios&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;La acción requerida, o &amp;quot;no requiere ninguna acción&amp;quot;&lt;/td&gt;
&lt;td&gt;Silencio, que el lector llena con el peor caso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Una fecha para cualquier cosa con fecha límite&lt;/td&gt;
&lt;td&gt;Un número de versión haciendo de fecha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un enlace a la doc que lo explica&lt;/td&gt;
&lt;td&gt;Un enlace al pull request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Errores que reportó la gente, y el límite que se subió&lt;/td&gt;
&lt;td&gt;Ids de tickets internos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;La sección aburrida, una línea cada una, al final&lt;/td&gt;
&lt;td&gt;La sección aburrida mezclada con las novedades&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La división entre una nota de versión y una &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-vs-release-notes/&quot;&gt;entrada de changelog&lt;/a&gt;
es lo que hace posible esta lista: el changelog lo guarda todo, así que las notas pueden dejar cosas
fuera. Los &lt;a href=&quot;https://changeloop.dev/blog/es/release-notes-examples/&quot;&gt;ejemplos de notas de versión&lt;/a&gt; reúnen muestras anotadas de
cada tipo de entrada.&lt;/p&gt;
&lt;h2&gt;La pregunta que responde cada entrada&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Qué puede hacer ahora el lector que antes no podía, y qué tiene que hacer al respecto?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si una entrada no puede responder eso, pertenece al changelog y no a las notas de versión. Las dos
mitades importan. La primera mitad es el valor. La segunda mitad es la que los equipos olvidan, y es
la que genera tickets de soporte cuando falta.&lt;/p&gt;
&lt;p&gt;Dos ejemplos de la segunda mitad haciendo trabajo real:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Los webhooks existentes seguirán funcionando hasta el 1 de noviembre. Después de esa fecha, se
rechazarán los payloads sin firmar.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;No requiere ninguna acción. Las exportaciones existentes se recodifican automáticamente la
próxima vez que las abras.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La segunda dice &amp;quot;no requiere ninguna acción&amp;quot; explícitamente. Esa frase vale la pena escribirla
siempre, porque un lector que no la encuentra asume lo peor.&lt;/p&gt;
&lt;h2&gt;¿Cómo se deben ordenar las notas de versión?&lt;/h2&gt;
&lt;p&gt;Ordénalas por consecuencia para el lector, nunca por la parte del sistema que cambió. Agrupar por
API, panel, móvil e infraestructura es tu organigrama, no el problema del lector.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cambios que rompen algo y cualquier cosa con fecha límite.&lt;/strong&gt; Primero, siempre, aunque sea
pequeño. Si un lector deja de leer tras una línea, esta es la línea que debía haber leído. Si la
fecha límite es un sunset, la entrada debería sonar como un
&lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;aviso de deprecación&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lo nuevo que van a querer.&lt;/strong&gt; Uno por párrafo, con el resultado en la primera cláusula.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lo que mejoró.&lt;/strong&gt; Errores que se reportaron, límites que se subieron, cosas que iban lentas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Todo lo demás, como lista.&lt;/strong&gt; Actualizaciones de dependencias, refactors internos, copy menor.
Una línea cada una. Nadie lee esta sección, y aun así debe estar, porque quien la busca
realmente la necesita.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;La reescritura&lt;/h2&gt;
&lt;p&gt;Antes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;v4.2.0&lt;/strong&gt; Se corrigió un problema donde el endpoint &lt;code&gt;POST /exports&lt;/code&gt; devolvía intermitentemente
500 bajo carga. Se refactorizó el worker de exportación. Se subió &lt;code&gt;node-pg&lt;/code&gt; a 8.11. Se mejoró el
manejo de errores en el serializador de CSV.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Después:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Las exportaciones ya no fallan en cuentas grandes.&lt;/strong&gt;
Las cuentas con más de unas 50.000 filas podían recibir un 500 al iniciar una exportación, más a
menudo a fin de mes. Eso está corregido, y las exportaciones de cualquier tamaño ahora se
reintentan solas en lugar de fallar. No requiere ninguna acción, y cualquier exportación que
falló la última semana puede simplemente volver a ejecutarse.&lt;/p&gt;
&lt;p&gt;También en 4.2.0: &lt;code&gt;node-pg&lt;/code&gt; 8.11, errores más claros en el serializador de CSV.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mismo lanzamiento. La segunda nombra la cuenta afectada, el momento en que fue peor, qué cambió, y
qué hacer. La actualización de dependencia no desapareció, solo dejó de ser el titular. El artículo
&lt;a href=&quot;https://changeloop.dev/blog/es/release-notes-best-practices/&quot;&gt;buenas prácticas de notas de versión&lt;/a&gt; tiene el resto de las
reglas que sigue esta reescritura, cada una con lo que cuesta saltársela.&lt;/p&gt;
&lt;h2&gt;Cosas que vale la pena eliminar&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;Estamos emocionados de anunciar.&amp;quot;&lt;/strong&gt; El lector aún no está emocionado. Gánatelo en la frase
siguiente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Números de ticket internos.&lt;/strong&gt; &lt;code&gt;PROJ-4471&lt;/code&gt; no significa nada fuera de tu tracker. Si la entrada
necesita una referencia, enlaza la página de docs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nombres de componentes que solo usa tu equipo.&lt;/strong&gt; Si renombraste el &amp;quot;pipeline de ingesta&amp;quot;, di
&amp;quot;importaciones&amp;quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un número de versión como único titular.&lt;/strong&gt; &lt;code&gt;v4.2.0&lt;/code&gt; es una etiqueta de archivo, no un resumen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Capturas de una página de ajustes que nadie ha visitado.&lt;/strong&gt; Muestra lo que cambió, en uso.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Con qué frecuencia se deben publicar notas de versión?&lt;/h2&gt;
&lt;p&gt;Publica cuando algo pasó, no según un calendario. Las notas que llegan en cada lanzamiento
entrenan a todos a ignorarlas. Las notas que llegan cuando algo pasó se abren. Está bien, y suele
ser correcto, publicar un lanzamiento sin ninguna nota y volcar sus entradas en el siguiente
conjunto que tenga un titular que valga la pena leer.&lt;/p&gt;
&lt;p&gt;El changelog sigue registrándolo todo. Esa es la división del trabajo: el changelog es completo,
las notas son selectivas. Si mantienes el changelog estructurado sobre la marcha, escribir las
notas es selección y reescritura, no arqueología.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;plantilla de notas de versión&lt;/a&gt; es la forma que usamos para el paso de
selección, y &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;ejemplos de changelog&lt;/a&gt; recopila entradas de equipos cuyo
changelog es lo bastante bueno como para derivar notas de él.&lt;/p&gt;
&lt;p&gt;Todo esto asume una página que se controla por completo, sin límite de longitud y con enlaces que
funcionan. &lt;a href=&quot;https://changeloop.dev/blog/es/mobile-app-release-notes/&quot;&gt;Notas de versión para apps móviles&lt;/a&gt; cubre qué
cambia cuando la superficie es un listado de App Store o Play Store.
&lt;a href=&quot;https://changeloop.dev/blog/es/emergency-release-notes/&quot;&gt;Notas de versión de emergencia&lt;/a&gt; cubre la otra excepción: qué
cambia cuando no queda tiempo para seguir el proceso normal de redacción en absoluto.&lt;/p&gt;
&lt;h2&gt;Una prueba antes de publicar&lt;/h2&gt;
&lt;p&gt;Lee las notas como alguien que ha estado de vacaciones dos semanas y tiene 40 segundos. Si en ese
tiempo no puede saber si se requiere algo de él, las notas no están terminadas, por muy precisas
que sean.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuánto deben durar las notas de versión?&lt;/strong&gt;
Lo que necesiten los cambios con consecuencias, y ni una línea más. Un lanzamiento con un cambio
que rompe algo y dos mejoras son tres párrafos. Rellenar un lanzamiento tranquilo para que parezca
sustancial es cómo los lectores aprenden a saltarse las notas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Quién debería escribir las notas de versión?&lt;/strong&gt;
La persona que entiende el cambio, editada por alguien que no. La ingeniera sabe qué cambió; la
editora sabe qué malinterpretará un desconocido. Escribir la entrada en el momento del merge,
mientras la ingeniera aún lo recuerda, es la práctica que hace esto barato.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deben incluir las notas de versión correcciones de errores?&lt;/strong&gt;
Sí, las que alguien reportó o sufrió. Indica el síntoma que vio el lector, no la causa.
&amp;quot;Las exportaciones de más de 50.000 filas fallaban&amp;quot; es una corrección que un lector reconoce;
&amp;quot;se corrigió una condición de carrera en el worker de exportación&amp;quot; es un mensaje de commit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es la diferencia entre notas de versión y un changelog?&lt;/strong&gt;
El changelog es el registro completo y continuo; las notas de versión son el mensaje curado sobre
un lanzamiento, escrito para gente que aún no ha decidido si le importa. La respuesta más larga está
en &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-vs-release-notes/&quot;&gt;changelog vs. notas de versión&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Keep a Changelog, implementado de verdad</title><link>https://changeloop.dev/blog/es/keep-a-changelog-implemented/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/keep-a-changelog-implemented/</guid><description>La especificación es una página y se lee en diez minutos. Implementarla es donde los equipos se desvían. Qué dice, qué deja abierto, y dónde falla.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Keep a Changelog es una convención de una página para un &lt;code&gt;CHANGELOG.md&lt;/code&gt;: la versión más reciente
primero, una sección por versión con un número y una fecha ISO, entradas agrupadas bajo seis tipos
(Added, Changed, Deprecated, Removed, Fixed, Security), y una sección Unreleased arriba para
entradas entre lanzamientos. La mayoría de los equipos que la citan implementan unos dos tercios de
ella, y el tercio que dejan caer es el que protege a sus usuarios.&lt;/p&gt;
&lt;p&gt;Olivier Lacan publicó &lt;a href=&quot;https://keepachangelog.com/&quot;&gt;Keep a Changelog&lt;/a&gt; en 2014 con una frase que ha
envejecido mejor que la mayoría de la prosa de software: &lt;em&gt;don&amp;#39;t let your friends dump git logs into
changelogs&lt;/em&gt;. Diez años después es lo más parecido a un estándar que tiene este rincón del software.
Vale la pena leer la fuente en vez de un resumen; esto trata sobre las partes que se dejan caer.&lt;/p&gt;
&lt;h2&gt;¿Qué pide Keep a Changelog?&lt;/h2&gt;
&lt;p&gt;Un &lt;code&gt;CHANGELOG.md&lt;/code&gt; en la raíz del repo, más reciente primero, con una sección por versión. Cada
versión lleva un número y una fecha ISO, y agrupa sus entradas bajo seis tipos:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Para&lt;/th&gt;
&lt;th&gt;Lo que cuesta dejarlo caer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;Funciones nuevas&lt;/td&gt;
&lt;td&gt;Nada; nadie deja caer este&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changed&lt;/td&gt;
&lt;td&gt;Cambios en comportamiento existente&lt;/td&gt;
&lt;td&gt;Los lectores descubren un cambio de comportamiento por un error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deprecated&lt;/td&gt;
&lt;td&gt;Funciones a punto de eliminarse&lt;/td&gt;
&lt;td&gt;Una eliminación se vuelve un incidente en vez de un evento planeado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Funciones eliminadas en este lanzamiento&lt;/td&gt;
&lt;td&gt;Nadie distingue una eliminación de un error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;Correcciones de errores&lt;/td&gt;
&lt;td&gt;Nada; nadie deja caer este tampoco&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Vulnerabilidades&lt;/td&gt;
&lt;td&gt;La única lectora que lo buscaba no lo encuentra&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Más una sección &lt;code&gt;Unreleased&lt;/code&gt; arriba, para que haya dónde poner una entrada en el momento en que se
mergea, y para que cualquiera pueda ver qué viene.&lt;/p&gt;
&lt;p&gt;Eso es casi todo. El resto es el razonamiento: las entradas son para humanos, una entrada por
cambio, y el archivo es un documento, no un log.&lt;/p&gt;
&lt;h2&gt;¿Qué partes de Keep a Changelog se dejan caer?&lt;/h2&gt;
&lt;p&gt;La sección Unreleased, luego cuatro de los seis tipos, Security entre ellos,
en ese orden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Unreleased&lt;/code&gt; desaparece primero.&lt;/strong&gt; Es la sección sin plazo, así que es la que deja de mantenerse,
y una vez que se va, las entradas se escriben en el momento del lanzamiento a partir del historial
de commits. Eso es exactamente el volcado de git log contra el que advierte la especificación desde
el principio, alcanzado gradualmente. &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-automation/&quot;&gt;Automatización de changelog&lt;/a&gt;
trata sobre todo de mantener viva esta sección sin que nadie tenga que recordarlo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Los seis tipos colapsan en dos.&lt;/strong&gt; La mayoría de los changelogs reales terminan con Added y Fixed,
porque Changed y Deprecated requieren un juicio sobre en qué confiaba alguien. Ese juicio es la
parte valiosa. Deprecated en particular es el único tipo que es una promesa sobre el futuro, y
dejarlo caer es cómo una eliminación se convierte en un incidente; la mecánica para mantener esa
promesa está en &lt;a href=&quot;https://changeloop.dev/blog/es/api-deprecation/&quot;&gt;cómo deprecar una API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security deja de ser separado.&lt;/strong&gt; Una corrección de seguridad archivada bajo Fixed es invisible
para la única lectora que la estaba buscando. Mantenla distinta incluso cuando la corrección sea
trivial, y especialmente cuando prefieras no llamar la atención sobre ella.&lt;/p&gt;
&lt;h2&gt;¿Qué no responde la especificación?&lt;/h2&gt;
&lt;p&gt;Es un formato de archivo. No dice nada sobre las preguntas que surgen justo después de adoptarla:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;¿Cómo se entera alguien?&lt;/strong&gt; Un archivo en un repo llega a colaboradores. No llega a una clienta
que nunca ha abierto GitHub.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Y los productos sin versiones?&lt;/strong&gt; Un servicio desplegado continuamente no tiene un v4.2.0 para
agrupar. La mayoría de los equipos sustituyen con fechas, lo cual funciona, y la especificación
ni lo bendice ni lo prohíbe.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Quién escribe la entrada?&lt;/strong&gt; La especificación asume que un humano lo hace. No dice cuándo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;¿Y las audiencias múltiples?&lt;/strong&gt; Un archivo sirve a desarrolladores. No sirve el mismo contenido
a una administradora no técnica, y reformatearlo a mano para ella es donde empieza la
duplicación. &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-vs-release-notes/&quot;&gt;Changelog vs. notas de versión&lt;/a&gt; es la
división que la especificación te deja hacer a ti.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://common-changelog.org/&quot;&gt;Common Changelog&lt;/a&gt;, un fork más estricto de la idea, endurece parte
de esto: prohíbe ciertas redacciones de entrada, exige un enlace al cambio, y tiene una opinión
clara sobre quién es el lector. Vale la pena leerlo si las partes sueltas de Keep a Changelog son
sobre lo que tu equipo sigue discutiendo.&lt;/p&gt;
&lt;h2&gt;¿Se puede automatizar Keep a Changelog sin volcar git logs?&lt;/h2&gt;
&lt;p&gt;Sí: deriva el borrador de commits estructurados, ponlo en Unreleased con su tipo prerrellenado, y
exige que un humano edite la redacción antes de cortar un lanzamiento. La advertencia de la
especificación es sobre el resultado, no sobre la herramienta. Derivar un borrador de commits está
bien. Publicar ese borrador sin editar es a lo que se opone.&lt;/p&gt;
&lt;p&gt;La máquina se encarga de la recolección y el formato, en lo que es buena. El humano se encarga de la
selección y la redacción, en lo que no lo es. &lt;a href=&quot;https://changeloop.dev/blog/es/conventional-commits-changelog/&quot;&gt;Conventional commits&lt;/a&gt;
cubre la división en dos capas de la que depende esto, y qué tipos de commit se mapean a cuál de las
seis categorías de arriba. Nuestra recopilación de
&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;herramientas de changelog&lt;/a&gt; cubre lo que existe para la mitad de recolección.&lt;/p&gt;
&lt;h2&gt;¿Dónde deja de ser suficiente Keep a Changelog?&lt;/h2&gt;
&lt;p&gt;Se detiene en la distribución. Keep a Changelog es una buena respuesta a &amp;quot;cómo debería verse este
archivo&amp;quot;. No es una respuesta a &amp;quot;cómo se enteran nuestros usuarios de qué cambió&amp;quot;, porque un archivo
Markdown en un repo es una estrategia de distribución que solo funciona si tus usuarios son
colaboradores.&lt;/p&gt;
&lt;p&gt;Ese es el segundo obstáculo que golpea a la mayoría de los equipos: el archivo está bien, y nadie
fuera del equipo lo lee. Resolverlo significa que las entradas tienen que convertirse en datos que
se puedan renderizar en otro sitio, lo cual es un problema distinto de formatear un archivo, y la
razón por la que &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;ejemplos de changelog&lt;/a&gt; recopila páginas públicas de
changelog en vez de archivos de repositorio. Cómo convertir esas entradas en algo a lo que la
gente vuelve se cubre en &lt;a href=&quot;https://changeloop.dev/blog/es/changelog-page/&quot;&gt;cómo construir una página de changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Adopta la especificación de todos modos. Cuesta una tarde, hace tratable el segundo problema, y
sigue siendo la mejor página que se ha escrito sobre esto.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Es Keep a Changelog un estándar?&lt;/strong&gt;
Es una convención de adopción amplia, no la especificación de un organismo de estandarización. Las
herramientas (scripts de lanzamiento, linters, parsers) asumen su forma con la frecuencia
suficiente como para que seguirla compre compatibilidad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué va en la sección Unreleased?&lt;/strong&gt;
Cada entrada de un cambio que se ha mergeado pero no se ha lanzado en una versión numerada. Cuando
se corta un lanzamiento, la sección se renombra a la versión y fecha, y una sección Unreleased vacía
y nueva va encima.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería un changelog usar versionado semántico?&lt;/strong&gt;
Keep a Changelog lo recomienda y no lo exige. Las bibliotecas y APIs se benefician; un servicio
desplegado continuamente suele sustituir con fechas, algo que el formato acomoda.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían las correcciones de seguridad estar en el changelog antes de ser públicas?&lt;/strong&gt;
Añade la entrada cuando se lanza la corrección, con suficiente detalle para que una operadora
actúe y no más. Retrasar la entrada hasta una fecha de divulgación coordinada es normal; omitirla
no lo es.&lt;/p&gt;
</content:encoded></item><item><title>Buenas prácticas de notas de versión que valen la pena</title><link>https://changeloop.dev/blog/es/release-notes-best-practices/</link><guid isPermaLink="true">https://changeloop.dev/blog/es/release-notes-best-practices/</guid><description>La mayoría de listas de buenas prácticas son consejos de estilo. Estas cambian lo que hace el lector, y tres populares que son puro culto a la forma.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Las buenas prácticas de notas de versión que importan son las que llevan una consecuencia
adjunta: escribe la entrada en el momento del merge, nombra a quién afecta, indica la acción
requerida aunque sea ninguna, pon fecha a los cambios que rompen algo, mantén una entrada
permanente por cambio, agrupa por resultado, y conserva la sección aburrida. Cada una cambia lo que
hace el lector. La mayoría del resto de consejos sobre este tema cambian cómo se ven las notas.&lt;/p&gt;
&lt;p&gt;Busca buenas prácticas de notas de versión y obtienes consejos de estilo: sé claro, sé conciso, usa
lenguaje llano, añade capturas. Nada de eso está mal y nada de eso cambia algo, porque ningún equipo
se ha sentado nunca con la intención de ser poco claro. Las prácticas de abajo van acompañadas de lo
que cuesta saltárselas, porque una práctica sin un modo de fallo adjunto es solo una preferencia.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Práctica&lt;/th&gt;
&lt;th&gt;Lo que cuesta saltársela&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Escribir la entrada al hacer merge, no al lanzar&lt;/td&gt;
&lt;td&gt;Las entradas reconstruidas después dicen &amp;quot;varias mejoras&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nombrar a quién afecta&lt;/td&gt;
&lt;td&gt;Cada lector decide que no le aplica&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indicar la acción requerida, incluido &amp;quot;ninguna&amp;quot;&lt;/td&gt;
&lt;td&gt;Cuarenta tickets de soporte idénticos, y lectores que asumen lo peor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Poner fecha a los cambios que rompen algo, no versionarlos&lt;/td&gt;
&lt;td&gt;El plazo se descubre después de pasar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Una entrada permanente y enlazable por cambio&lt;/td&gt;
&lt;td&gt;Nadie puede responder &amp;quot;cuándo cambió esto&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agrupar por resultado, no por sistema&lt;/td&gt;
&lt;td&gt;Los lectores necesitan tu arquitectura para encontrar su sección&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conservar la sección aburrida&lt;/td&gt;
&lt;td&gt;Seguridad, cumplimiento y quien depura una versión pierden su fuente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuáles son las buenas prácticas para notas de versión?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Escribe la entrada cuando haces merge, no cuando lanzas.&lt;/strong&gt;
Costo de saltárselo: quien reconstruye el lanzamiento a partir del historial de commits no es
quien hizo el cambio, y adivinará la intención. Las entradas escritas dos semanas después son las
que dicen &amp;quot;varias mejoras&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Di a quién afecta, por nombre.&lt;/strong&gt;
&amp;quot;Equipos en el plan Business&amp;quot;, &amp;quot;cualquiera que use la API de exportación v1&amp;quot;, &amp;quot;instalaciones
autoalojadas sobre Postgres 14&amp;quot;. Costo de saltárselo: cada lector tiene que averiguar si le aplica,
y la mayoría decidirá que no.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Indica la acción requerida, incluido cuando es ninguna.&lt;/strong&gt;
Costo de saltárselo: soporte responde la misma pregunta cuarenta veces, y los lectores que no
preguntaron asumen que se requiere algo y lo posponen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pon fecha a los cambios que rompen algo, no un número de versión.&lt;/strong&gt;
&amp;quot;Eliminado en v5&amp;quot; no significa nada para quien no sabe cuándo llega v5. &amp;quot;Deja de funcionar el 1 de
noviembre&amp;quot; es una fecha que puede anotar en un calendario. Costo de saltárselo: el plazo se
descubre después de pasar. Qué cuenta como uno, y la lista de verificación para publicarlo, está en
&lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;qué es un cambio que rompe algo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mantén una entrada permanente y enlazable por cambio.&lt;/strong&gt;
Un correo no es un archivo y un mensaje de Slack no es una referencia. Costo de saltárselo: nadie
puede responder &amp;quot;cuándo cambió esto&amp;quot; seis meses después, ni siquiera tú. El correo igual tiene
un trabajo, cubierto en &lt;a href=&quot;https://changeloop.dev/blog/es/product-update-email/&quot;&gt;la plantilla de email de novedades&lt;/a&gt;; apunta
a la entrada en vez de reemplazarla.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agrupa por resultado, no por sistema.&lt;/strong&gt;
Costo de saltárselo: el lector tiene que tener tu arquitectura en la cabeza para saber qué sección
le importa. El orden que se sigue de esto está en
&lt;a href=&quot;https://changeloop.dev/blog/es/how-to-write-release-notes/&quot;&gt;cómo escribir notas de versión&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conserva la sección aburrida.&lt;/strong&gt;
Las actualizaciones de dependencias y los cambios internos se quedan, al final, una línea cada una.
Costo de saltárselo: el equipo de seguridad, quien revisa cumplimiento y quien depura un desajuste
de versión pierden su única fuente. Las entradas que más a menudo se hacen mal son las correcciones;
&lt;a href=&quot;https://changeloop.dev/blog/es/bug-fix-release-notes/&quot;&gt;notas de versión de corrección de errores&lt;/a&gt; muestra cómo escribirlas
para que el lector sepa si debe actuar.&lt;/p&gt;
&lt;h2&gt;¿Cuáles son las buenas prácticas de changelog, y en qué se diferencian?&lt;/h2&gt;
&lt;p&gt;Un changelog es una referencia, así que sus prácticas tratan de completitud y estructura, no de
persuasión. Las cuatro que importan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Un tipo de entrada fijo por línea.&lt;/strong&gt; Added, Changed, Deprecated, Removed, Fixed, Security. No
es un estilo de casa, es un filtro: es lo que permite pedir &amp;quot;solo los cambios que rompen algo&amp;quot;.
La convención &lt;a href=&quot;https://changeloop.dev/blog/es/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt; es la fuente habitual.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una sección sin publicar.&lt;/strong&gt; Donde viven las entradas entre el merge y el lanzamiento. Su
ausencia es la razón por la que los equipos escriben entradas tarde.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fechas ISO.&lt;/strong&gt; &lt;code&gt;2026-08-28&lt;/code&gt;, no &lt;code&gt;28/08/26&lt;/code&gt;, que significa dos días distintos según el lector.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Una entrada por cambio, no por commit.&lt;/strong&gt; Tres commits que corrigen un error son una entrada.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Los dos artefactos se comparan a fondo en
&lt;a href=&quot;https://changeloop.dev/blog/es/changelog-vs-release-notes/&quot;&gt;changelog vs. notas de versión&lt;/a&gt;; la versión corta es que las
prácticas del changelog protegen la completitud y las de las notas de versión protegen la atención.
&lt;a href=&quot;https://changeloop.dev/blog/es/private-release-notes-enterprise/&quot;&gt;Notas de versión privadas para clientas enterprise&lt;/a&gt;
cubre una versión de esto que solo aparece cuando tus clientas dejan de estar todas en el mismo
build: los mismos objetivos de completitud y atención, pero ajustados por cuenta en vez de enviados
a todas a la vez.&lt;/p&gt;
&lt;h2&gt;Tres que son puro culto a la forma&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Emojis como tipos de entrada.&lt;/strong&gt; Un cohete y una llave inglesa no son una taxonomía. Se ven
ordenados y no se pueden filtrar, ordenar, ni leer con un lector de pantalla de forma útil. Usa
palabras, y si quieres el emoji, ponlo después de la palabra.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Números de versión semántica como titulares para un producto alojado.&lt;/strong&gt; Semver es una promesa
sobre compatibilidad de API. Para un producto SaaS donde nadie elige su versión, un número de
versión en el titular es archivo interno disfrazado de noticia. Mantén semver en el changelog y
fuera del anuncio.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Publicar en un calendario sin importar el contenido.&lt;/strong&gt; Notas mensuales sin nada dentro enseñan a
la gente que tus notas son ruido. Publica cuando hay algo que decir. El changelog cubre el resto.&lt;/p&gt;
&lt;h2&gt;La que en verdad es difícil&lt;/h2&gt;
&lt;p&gt;Mantener el changelog y el anuncio en sincronía, sin escribirlo todo dos veces.&lt;/p&gt;
&lt;p&gt;La mayoría de los equipos empiezan con una sola página, la dividen cuando las audiencias divergen,
y luego dejan que una de las dos se pudra en silencio, normalmente el changelog, porque es el que
no tiene un plazo adjunto. La salida es estructural, no disciplinaria: mantén las entradas como
datos con un tipo, una fecha y una audiencia, y trata ambas superficies como representaciones de
eso. Nuestra recopilación de &lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;herramientas de changelog&lt;/a&gt; cubre lo disponible para
eso, incluidas las herramientas con las que competimos, y la página
&lt;a href=&quot;https://changeloop.dev/beamer-alternative&quot;&gt;alternativa a Beamer&lt;/a&gt; es la comparación honesta contra el widget del que
parten la mayoría de los equipos.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;plantilla de notas de versión&lt;/a&gt; es donde vive el paso de selección una
vez que las entradas existen.&lt;/p&gt;
&lt;h2&gt;Si adoptas una sola cosa&lt;/h2&gt;
&lt;p&gt;Escribe la entrada en el momento del merge, en un formato fijo, con un tipo. Todas las demás
prácticas de esta página se vuelven más fáciles una vez que esa está en su sitio, y ninguna
sobrevive sin ella.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Deben las notas de versión tener capturas de pantalla?&lt;/strong&gt;
Solo de lo que cambió, en uso. Una captura de una página de ajustes que nadie ha visitado añade
scroll, no información. Un texto que nombre el resultado y el lector afectado supera a una imagen
que no muestra ninguno de los dos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo se escriben notas de versión para un cambio que rompe algo?&lt;/strong&gt;
Primero la fecha, segundo los llamantes afectados, tercero la acción requerida, cuarto la
migración. Nunca empieces por el número de versión. La forma completa, con una entrada de ejemplo,
está en &lt;a href=&quot;https://changeloop.dev/blog/es/breaking-changes/&quot;&gt;qué es un cambio que rompe algo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Deberían escribir las notas de versión ingeniería o marketing?&lt;/strong&gt;
Redactadas por quien hizo el cambio, en el momento del merge, y editadas por alguien que las lee
como una desconocida. Ninguno de los dos por separado produce notas sobre las que un cliente pueda
actuar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es el formato ideal de notas de versión?&lt;/strong&gt;
Primero los elementos con plazo, luego las capacidades nuevas, luego las mejoras, luego una lista de
una línea cada una con el resto. La &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;plantilla de notas de versión&lt;/a&gt; es ese
formato como página para rellenar.&lt;/p&gt;
</content:encoded></item></channel></rss>