Vista generada de dec-0133: Entidad release en el modelo del roadmap: `releases:` ordenado por dependencias, publicado por su definition of done
docs/decisions/dec-0133-entidad-release-en-el-modelo.mdVista generada desde
docs/decisions/dec-0133-entidad-release-en-el-modelo.md. No se edita a mano:bun run docs:genla regenera ybun run docs:checkfalla si difiere. El estado aquí es el del model: si discrepa con otra página, manda el model.
| Campo | Valor |
|---|---|
| Estado | LOCKED |
| Fecha | 2026-10-02 |
| Fichero | docs/decisions/dec-0133-entidad-release-en-el-modelo.md |
Enmienda a: dec-0123
Por qué importa (del frontmatter del ADR):
Fija qué es un release de Styx dentro del roadmap: una entrada de
releases:enstyx.model.yml, ordenada sólo por dependencias, sin fechas, que agrupa nodos y se publica por el pass de su definition of done (gate items verificados por alguien distinto del autor). Sin este ADR, "qué entra en el MVP" y "cuándo se publica" vivirían en prosa de handoffs y notas de orquestación, el alpha.0 desplegado en Coolify no tendría DoD comprobable, y la versión del tren se cortaría sin estar atada a ningún gate.
Nodos del roadmap que lo citan en refs: track/release-engineering
Páginas de la documentación que lo citan: Ciclo de vida (especificado), Releases (especificado), Actualizar y versiones (especificado), Desplegar la documentación (especificado), Desplegar la nightly (especificado), Desplegar styx en Coolify (especificado)
Leído de docs/decisions/dec-0133-entidad-release-en-el-modelo.md, el fichero canónico.
releases: ordenado por dependencias, publicado por su definition of doneAskUserQuestion, lockea el ADR y fija la
identidad de versión de los alfas: 0.0.0-alpha.N (alpha.1 = 0.0.0-alpha.1 es el MVP); el
primer v0.y.z se corta más adelante. P3 queda resuelta (el sitio de docs es privado por la red
de Tailscale), P7 se decide al llegar, según coste, y P5 y P6 quedan diferidas de forma
explícita. Todo está en Lock (2026-10-03, waxin). Donde §1–§7 y el
lock difieren, gana el lock.dec-0123 D1 y D5 (§4). dec-0123 se lockea el mismo día con la enmienda a D1;
la de D5 sigue pendiente de P5.track/release-engineering, milestone track/release-engineering/release-entity
(ticket #28, gate item RE17)..claude/workflows/archive/orquestacion-2026-10/decisiones-pendientes.md (rama
ops/orquestacion), puntos 2, 4, 6, 10, 11, 12, 13 y 19; y la orden de waxin del 2026-10-02:
"pon como primera crear ya la app coolify y ir desplegando de momento la docu".waxin pidió (punto 6) una entidad nueva en el model, release o versión, muy atada al roadmap:
Además:
0.0.0 en estado alfa,
indefinida; las nightly son builds de desarrollo marcadas clean o dirty; las releases son
normalmente sólo stable; beta opcional como checkpoint; dos canales, nightly y stable
(punto 13, que ya recoge la enmienda del 2026-10-02 de dec-0123);axon 0.3.0 no conoce la entidad. Su esquema arktype conserva las claves top-level no declaradas,
así que un bloque releases: no rompe axon gen ni axon en general, pero tampoco lo valida
ni lo pinta.
Una lista top-level releases: en styx.model.yml, detrás de experiments:. Cada entrada:
| Campo | Qué es |
|---|---|
id | Estable: alpha.N, beta.N o stable.N. No es la versión. |
title | Etiqueta de índice. |
status | planned | in_progress | candidate | published | superseded. |
version | SemVer. Los alfas, 0.0.0-alpha.N (lock del 2026-10-03); null si no está fijada. |
channel | nightly | stable. Sólo esos dos. |
prerelease | alpha | beta | null. |
visibility | private | public. |
publicWhen | Gate items <nodo>:<item> cuyo pass permite hacerlo público. |
dependsOn | Ids de release. Es el único orden que existe. |
includes | Nodos o milestones, en orden de trabajo. Incluir un nodo incluye a sus descendientes. |
stretch | Entra si llega; no forma parte del DoD. |
excludes | Nodos que quedan fuera de forma explícita. |
definitionOfDone | Sólo gate items <nodo>:<item>. Su pass es lo que dispara publicar. |
dodComplete | false mientras falten items que todavía redactan tickets. |
requiresLocks | ADRs que tienen que estar locked para publicar. |
publishedAs | null, o {tag, manifestDigest} una vez publicado. |
Prohibido cualquier campo o valor con forma de fecha, plazo, ETA, duración, semana o sprint.
updatedAt sigue siendo la única fecha del model y vive fuera de releases:.
published exige: todos los items del DoD en pass (el verdict es proyección del manifest,
así que la separación autor ≠ verificador llega por GUARD 6), dodComplete: true, version
no nula, cada requiresLocks locked en decisions: y cada release de dependsOn ya
published.visibility: public exige todos los items de publicWhen en pass.publicWhen) arrastra
las aristas del nodo que lo declara aunque sólo entren sus milestones.publicWhen es de un nodo que entra en ese release o antes (él, un
ancestro o un descendiente), o de un nodo ya done.candidate y posteriores exigen dodComplete: true.Lo valida scripts/check-releases.ts (bun run check:releases, dentro de check:roadmap; las
dos reglas anteriores son R7 y R10, ampliadas el 2026-10-02 tras el panel de escépticos), con
un mutante rojo por regla en test/check-releases.test.ts. Avisa, sin poner el guard en rojo, de
las dependencias abiertas de un nodo incluido que ningún release incluye.
alpha.0, el esqueleto desplegado.
alpha.1 es el MVP (punto 11), y también es una alfa.releases:: es el canal por el que viajan los alpha mientras no hay versión cortada.channel: stable pasa por
el pipeline de stable pero no mueve styx-release:stable.alpha.1 se decide con waxin qué entra en v0.2, beta o lo que siga (punto 6). Este ADR no
lo adelanta: alpha.2 recoge sólo lo que waxin ya puso detrás del MVP (puntos 12 y 19).0.0.0-alpha.N, con la N de su id: alpha.0 =
0.0.0-alpha.0, alpha.1 = 0.0.0-alpha.1 (el MVP), alpha.2 = 0.0.0-alpha.2. El primer
v0.y.z lo corta waxin más adelante.track/docs/available-from)El punto 10 enlaza releases y docs "cuando se decida". Esto es la forma que tendría, sin
gate item: el track/docs:DC11 que se le dio el 2026-10-02 se retiró ese mismo día.
availableFrom: vX.Y.Z en el frontmatter de contrato de dec-0124 (el nombre del punto
10), derivado del model, nunca escrito a mano: la versión del primer release cuyo
includes contiene un nodo que la página cita, o un ancestro suyo.version: null, qué se muestra es la pregunta P6 de §7.implementado, falla.scripts/check-releases.ts) y la vista (scripts/docs/gen-roadmap-adrs.ts escribe
apps/docs/content/docs/roadmap/releases.mdx) viven en styx.'releases?': 'Release[]' y su pintado en axon gen) es el diferido
d24. No hace falta tocar axon para aterrizar esto: la clave pasa sin error.El bloque vive en styx.model.yml y su vista en roadmap/releases. Resumen:
in_progress. Primero, por orden de waxin del
2026-10-02, la aplicación Coolify del sitio de docs (track/release-engineering/coolify-docs,
ticket #26, item RE13). Después la entidad release (RE17), la identidad de versión (RE1),
el CLI y los runtimes, Coolify como tier 1 operable (RE15) y la nightly privada de master
en Coolify (RE14). Pasa a público con RE16, la AppSec seca.planned, depende de alpha.0. La primera vertical VOD web
sobre la biblioteca real, local y del Storage Box: DM4 primero (lo exige dec-0132), el
origen TCP del daemon, las olas A, B y D, ME7 (audio transcodificado), el fichero como fuente
de verdad y los metadatos incrustados, invitaciones, CLI con device grant, API keys y quick
connect, styx doctor, métricas por sesión, páginas de contrato y la AppSec seca. Desde la
corrección del 2026-10-02 también incluye los dos nodos de AppSec (track/byte-runtime/sec y
track/identity/sec) y track/plugin-seams/w1, y su DoD cubre el login passwordless (I1..I5),
los prerequisitos de FV1 (ME3, ME4, ME5, S6), DM2, la medida del Storage Box (RM1) y la
promoción a stable (RE8). Exige los locks de dec-0133, dec-0123, dec-0113 y dec-0124.planned, depende de alpha.1. Runtimes medidos (lane E),
cuentas, hogares y perfiles, dispositivos A0 (punto 19: justo después del MVP) y el resto de
la ola C. dodComplete: false: los
items de track/devices los redacta su ticket #01.Fuera del alfa, de forma explícita: cast, handoff, federación, modo público, player propio y
transcodificación de vídeo (no tiene nodo propio; es una parte de
track/media-engine/download-output, que se excluye). La campaña de la ola E no está asignada.
dec-0123v0.y.z lo corta waxin". Hasta entonces el tren es 0.0.0 en estado alfa y
los checkpoints previos son los alfas 0.0.0-alpha.N (lock, P1). Las versiones de componente
(deploy/VERSION y el package.json de cada componente Bun, en 0.0.0 desde el lock) son
marcadores congelados hasta ese corte. Las de los componentes Zig (build.zig.zon y
native/zig/cli/VERSION, todavía en 0.1.0) se alinean en un cambio aparte.channel: stable recorre el pipeline
de stable (gates de release, aprobación) pero no mueve el puntero styx-release:stable. No hay
tercer canal (esto sí es del punto 13).in_progress en los tickets para lo implementado sin verificar: statusProvenance
ya cubre ese caso.phase está prohibido, r31).check:roadmap corre check:releases en cada cambio del model.cov-node) y cada item del
DoD, una cita (cov-gate); la vista generada roadmap/releases cita los del DoD y
publicWhen.Estado tras el lock del 2026-10-03: P1, P2, P3 y P4 resueltas; P7 se decide al llegar; P5 y P6 diferidas. El detalle está en el lock.
| # | Pregunta |
|---|---|
| P1 | Resuelta por el lock (2026-10-03): el ADR se lockea y los alfas se versionan 0.0.0-alpha.N (alpha.1 = 0.0.0-alpha.1, el MVP). El primer v0.y.z se corta más adelante. |
| P2 | Resuelta por el punto 19 de waxin: la base de dispositivos entra justo después del MVP, así que track/devices/a0 va en alpha.2. |
| P3 | Resuelta (2026-10-03): el acceso privado lo da el dominio. Con .vpn. en el nombre (docs.vpn.<dominio>), un hook de Coolify que ya tiene waxin restringe el acceso a Tailscale. La basic auth del compose pasa a ser opcional. |
| P4 | Resuelta por el punto 5 de waxin (todos los ADRs y decisiones en el model, con dependencias): desde el 2026-10-02 los PROPOSED están en decisions: con status: proposed y blocks. |
| P5 | Diferida. Semántica de canal de los alfas: ¿un alpha o beta con channel: stable recorre el pipeline de stable sin mover styx-release:stable (D3 y la enmienda a D5)? Se decide antes del primer alfa que vaya por stable (alpha.1). |
| P6 | Diferida con D4. Docs enlazadas: ¿qué muestra una página mientras su release no tiene versión cortada? Desde el lock todos los alfas tienen versión (0.0.0-alpha.N); la pregunta queda para un release sin versión fijada, cuando se decida D4. |
| P7 | Se decide al llegar, según coste (waxin, 2026-10-03). track/domain-media entra entero en alpha.1; si DM1 y DM3 pueden quedar partial sin bloquear la vertical se decide en ese momento, viendo lo que costaría cerrarlos. No cambia includes ni el DoD. |
Decisión de waxin vía AskUserQuestion (2026-10-03), apuntada en el §33 de
.claude/workflows/archive/orquestacion-2026-10/decisiones-pendientes.md (rama
ops/orquestacion):
Se lockea este ADR: la entidad releases: (D1), su semántica (D2), la política de
versiones del tren (D3, salvo la parte de canal de P5) y dónde vive (D5). D4 sigue siendo
propuesta «para cuando se decida» (punto 10).
Identidad de versión de los alfas (P1): 0.0.0-alpha.N, con la N del id del release.
alpha.0 = 0.0.0-alpha.0 (esqueleto desplegado);alpha.1 = 0.0.0-alpha.1 (el MVP);alpha.2 = 0.0.0-alpha.2 (post-MVP inmediato).El primer v0.y.z lo corta waxin más adelante. releases: del model lleva ya esas versiones
con status: planned o in_progress: tener versión no publica nada (R5 sigue exigiendo el DoD
en pass, los locks y los predecesores).
Componentes en 0.0.0. deploy/VERSION y el package.json de cada componente Bun pasan a
0.0.0, la versión del tren en estado alfa. Los componentes Zig se alinean en un cambio aparte.
Privacidad del sitio de docs (P3): la da el dominio. docs.vpn.<dominio> activa el hook
de Coolify de waxin que limita el acceso a Tailscale. La basic auth de
deploy/coolify/docs.compose.yml deja de ser obligatoria y queda como opción.
DM1 y DM3 frente al MVP (P7): «a decidir en el momento viendo lo que nos costaría». No se
decide ahora; alpha.1 no cambia.
Diferidas de forma explícita: P5 (semántica de canal de los alfas por stable) y P6 (con D4).
Enmienda a dec-0123 (§4): entra en vigor la de D1. dec-0123 se lockea el mismo día con
sus enmiendas del 2026-10-02; la de D5 queda pendiente de P5.