Vista generada de dec-0101: Locks M1 de la CLI axon
docs/decisions/dec-0101-locks-m1-axon-cli.mdVista generada desde
docs/decisions/dec-0101-locks-m1-axon-cli.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-07-17 |
| Fichero | docs/decisions/dec-0101-locks-m1-axon-cli.md |
Por qué importa (del frontmatter del ADR):
Fija el contrato de resolución del modelo para la CLI axon (qué campo del config es autoridad) y la representación machine-readable de una pausa (effects en la decisión). Ambos afectan a todo consumer del modelo v2: CLI, cockpit M2, guards portables.
Nodos del roadmap que lo citan en refs: ninguno.
Páginas de la documentación que lo citan: Roadmap, tickets y axon (implementado)
Leído de docs/decisions/dec-0101-locks-m1-axon-cli.md, el fichero canónico.
styx.model.yml real). El primer consumer real de @mks2508/axon-core (la CLI) cerró el
gate M0 per r28 §3 consumiendo solo API pública, y trajo dos findings que exigían lock.roadmapModel (la autoridad)El handoff de slice 1 decía autodetectar por roadmapSpec, pero en styx ese campo apunta a
roadmap.spec.yml = snapshot FROZEN v60 (rollback-only) — no contiene los nodos en curso.
La autoridad declarada por el propio config (roadmapAuthorityNote) es roadmapModel →
styx.model.yml. El executor lo cazó, resolvió por la autoridad, y el orquestador lo verificó
contra el config real antes del interview.
Lock: la resolución del modelo en la CLI es --model <path> explícito → campo
roadmapModel de .claude/axon.config.json en cwd → error claro con hint. roadmapSpec
NO participa en el autodetect (es un snapshot congelado; leerlo en silencio sería reportar
estado muerto como actual). Las alternativas «fallback a roadmapSpec con warning» y «campo
nuevo unificado» fueron consideradas y rechazadas (la primera puede leer un frozen
en-silencio-con-warning; la segunda es superficie nueva para el mismo resultado).
effects EN la decisiónLa semántica «pausa activa» de dec-0099 vive en un comentario YAML (~l.589 del modelo) —
machine-invisible. El CLI correctamente NO hace prose-parsing (la muestra como decisión locked
y nada más). Para que axon status/now puedan derivar ⏸ PAUSE ACTIVE sin heurísticas:
Lock: la pausa se representa como effect en la decisión que la gobierna — la decisión ES el lock, la pausa es su efecto. SSOT único: unlock de la decisión ⇒ la pausa muere sola.
- id: dec-0099
status: locked
title: 'Pausa de Styx…'
effects:
- type: freeze
scope: all # 'all' | lista de node ids
exitCriterion: 'axon status + roadmap visual sin abrir Markdown'La alternativa «bloque pause top-level en el modelo» (propuesta del executor) fue
RECHAZADA: es estado duplicado — si la decisión se unlockea y nadie toca pause.active,
el modelo miente; exigiría un guard de coherencia para un problema que el diseño elegido no
tiene. Diferir también rechazado (axon now lista nodos «EN CURSO» de un proyecto congelado —
técnicamente no miente, pero confunde).
Disciplina del parser (sin cambio): «parser describes, guards judge» — type es string
lenient (literal conocido: freeze; un type desconocido no rompe el parse), scope ids sin
validar contra el DAG en parse-time.
effects + derivación pura activeFreezes(model) → @mks2508/axon-core 0.3.0
(lane core, milestone B5).styx.model.yml añadiendo el bloque effects (orquestador, tras
verificar B5; los guards de styx deben seguir verdes).⏸ PAUSE ACTIVE — dec-0099 (scope=all) en axon status/now (lane cli, tras B5).@mks2508/axon-core@0.2.0 (tw/ binding) publicado con OK de waxin
en esta misma ronda — smoke desde tarball + fresh install npm verificados.