Qué se genera, desde qué fuente, con qué generador, qué valida cada uno, cómo se lee un rojo de bun run docs:check y cómo se añade uno nuevo.
Especificado. Los generadores existen y
bun run docs:checkcorre, perotrack/docssiguequeuedhasta el lock dedec-0124: por la tabla de estados de su §5.1 esta página no sube aimplementadoantes. Lo que dice obliga a la implementación.
Toda la sección Referencia se genera. Nadie la edita a mano: el esfuerzo va a la fuente (TSDoc,
///, descripciones de contratos y del esquema de configuración), que además mejora el código.
Todo lo que se puede generar, se genera. Un generador por fuente, y ninguno inventa contenido: proyecta una fuente canónica. La referencia que sale de ahí se versiona (se lee en GitHub sin construir nada) y una comprobación detecta si se ha desviado de su fuente.
bun run docs:gen # escribe la referencia generada
bun run docs:check # regenera en memoria y falla si algo difiere o sobra| Fuente canónica | Generador | Salida en el sitio |
|---|---|---|
Rutas Elysia de cada servicio y esquemas de @styx/api-contracts | gen-openapi.ts | referencia/http/<servicio>/ |
| TSDoc de los paquetes públicos | gen-sdk.ts (TypeDoc) | referencia/sdk/<paquete>/ |
/// y //! de los módulos Zig públicos y de los SDK consumidos | gen-zig-docs.ts y el extractor Zig | referencia/zig/<módulo>/ |
BUS_ROUTES y los contratos del bus | gen-bus-docs.ts | referencia/bus/ |
protocols/* (especificación humana y vectores) | sync-protocols.ts | referencia/protocolos/ |
| El esquema único de configuración de cada servicio y del daemon | gen-config.ts | referencia/configuracion/ |
| Tipos de problema y códigos de error | gen-errors.ts | referencia/errores/ |
Roles, permisos y políticas de @styx/authz | gen-permissions.ts | referencia/permisos/ |
| El registro de comandos del CLI | el propio CLI | referencia/cli/ |
styx.model.yml y docs/decisions/ | gen-roadmap-adrs.ts | roadmap/ y decisiones/ |
Los scripts viven en scripts/docs/; el extractor de Zig está en native/zig/tools/.
docs:check no usa una heurística, regenera y compara. Un fichero
que falta, difiere o sobra en un directorio que el generador posee es drift.inputHash: cada página generada declara en su frontmatter el hash de su entrada. Ese hash
no sirve para detectar drift sin ejecutar el generador cuando la entrada es derivada: en
gen-roadmap-adrs.ts se calcula sobre la proyección que el propio generador hace del model y de
las páginas que citan cada nodo o ADR, no sobre los bytes de un fichero fuente, así que
recalcularlo exige ejecutar casi todo el generador. Sirve para ver en un diff qué páginas
cambiaron de entrada; la detección de drift es la regeneración completa
(scripts/docs/gen-roadmap-adrs.ts --check), que corre en CI dentro de bun run check:roadmap. Un generador nuevo sólo puede ofrecer detección
por hash sin regenerar si su hash se recalcula desde los bytes de la fuente, y lo declara.pub de Zig sin ///, un protocolo sin schemaVersion o sin política de
compatibilidad es una violación del propio generador, no un hueco silencioso.gen-roadmap-adrs.ts proyecta styx.model.yml y docs/decisions/ en el sitio:
No hay contadores agregados ni se copia prosa de docs/decisions/README.md. Las propias páginas
generadas citan track/docs y no el nodo o la decisión que describen, para que su existencia no
cuente como cobertura de nadie: la cobertura la dan las páginas escritas a mano, que es justo lo
que esas vistas hacen visible.
bun run docs:gen regenera todo y escribe.bun run docs:check regenera en memoria y falla (exit 1) si un fichero difiere, falta o sobra, o
si algún generador encuentra una violación. Es el mismo patrón que gen:bus / check:bus.bun scripts/docs/gen-all.ts --only openapi,bus [--check] limita a unos generadores.| Generador | Fuente canónica | Salida | Rojo si… |
|---|---|---|---|
scripts/docs/gen-openapi.ts | La app de captura de cada servicio (apps/<svc>/src/app.aot.ts) con serviceOpenApi de @styx/service-http (toOpenAPISchema + problems en application/problem+json). Sin infra ni puertos. | apps/docs/generated/openapi/<svc>.json + referencia/http | Una ruta registrada que no está en el OpenAPI sin detail.hide + x-styx-hide-reason (siempre), o una operación nueva sin operationId, sin summary, sin errores, o con algún 4xx/5xx que no declara application/problem+json (se juzga cada status; única exención explícita, GET /ready 503; trinquete scripts/docs/openapi.baseline.json; la página de una operación con esa deuda la avisa arriba con los status). |
scripts/docs/gen-sdk.ts | El TSDoc de los entrypoints de exports de los paquetes públicos y de @spire/bus (TypeDoc 0.28 + typedoc-plugin-markdown). | referencia/sdk | Una exportación pública nueva sin TSDoc o un enlace roto (trinquete scripts/docs/tsdoc.baseline.json). @spire/bus no bloquea: su cobertura se exige en su repo. |
scripts/docs/gen-zig-docs.ts | /// y //! por AST (native/zig/tools/docs_extract.zig, zig run) de los módulos públicos y de zkit, spire y conduit en el hash de build.zig.zon. | apps/docs/generated/zig/*.json + referencia/zig | Un pub nuevo sin /// o un fichero sin //! en un módulo de styx (trinquete scripts/docs/zig-doc.baseline.json). |
scripts/docs/gen-bus-docs.ts | Los contratos de @styx/api-contracts/bus y BUS_ROUTES / BUS_EMITS / BUS_STREAMS. | referencia/bus | Un contrato sin TSDoc, o sin ruta ni emisor. |
scripts/docs/sync-protocols.ts | protocols/* (la spec se copia sin reescribir). | referencia/protocolos | Un directorio de protocols/ sin registrar, o una spec nueva sin versión, compatibilidad o fixtures (trinquete scripts/docs/protocols.baseline.json). |
scripts/docs/gen-config.ts | El esquema único scripts/docs/env.schema.ts cruzado con el inventario de lecturas reales (scripts/docs/env-scan.ts). | referencia/configuracion | El código lee una variable que no está en el esquema, el esquema tiene una que nadie lee, o el código lee el entorno de una forma que el inventario no convierte en nombres (nombre no literal, ...resto, el entorno entero pasado a algo que no está en ENV_CONSUMERS, un helper exportado usado como valor en otro fichero, también export const f = helper o export default helper; sólo un import o un re-export lo nombra sin usarlo). Los helpers con el nombre como parámetro se resuelven en todo el repo: la llamada cuenta aunque el helper esté definido en otro fichero. Es por expresiones regulares, no por AST: una forma que ninguna regla reconoce no se ve (deuda DC6 hasta check:env-schema). |
Un trinquete es un fichero scripts/docs/*.baseline.json con la deuda conocida. Una violación que
no está en el baseline es rojo, y una entrada que ya no se da también lo es (hay que borrarla, para
que no vuelva a entrar en silencio). Se documenta la fuente y se borra la línea en el mismo cambio.
No es un bloqueo contra la deuda nueva. docs:check compara lo encontrado con el baseline tal
como está en el árbol, no con el de la rama base: si el mismo cambio añade la violación y su entrada
en el baseline, sale verde. Añadir deuda es un acto visible en el diff del baseline (como el de
check-gates o check-consumer), y quien revisa el cambio es quien lo frena.
Cada página lleva el frontmatter de contrato de dec-0124 §5 con generated: { source, generator, inputHash }. Su status sale del model: implementado si algún nodo citado está
in_progress o done, si no especificado. Una página generada nunca es verificado por sí
misma.
generated: { source, generator, inputHash }. Su estado se
hereda del nodo dueño de la fuente y nunca pasa de implementado por sí mismo.docs:gen y docs:check.