dec-0101

Vista generada de dec-0101: Locks M1 de la CLI axon

ImplementadoSin versión del tren todavía· generada desde docs/decisions/dec-0101-locks-m1-axon-cli.md
track/docsdec-0124track/docs:DC10

Vista generada desde docs/decisions/dec-0101-locks-m1-axon-cli.md. No se edita a mano: bun run docs:gen la regenera y bun run docs:check falla si difiere. El estado aquí es el del model: si discrepa con otra página, manda el model.

CampoValor
EstadoLOCKED
Fecha2026-07-17
Ficherodocs/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)

Texto del ADR

Leído de docs/decisions/dec-0101-locks-m1-axon-cli.md, el fichero canónico.

dec-0101 — Locks M1 de la CLI axon

  • Fecha: 2026-07-17 (franja 2 de la noche, misma sesión que dec-0100)
  • Estado: LOCKED
  • Decisor: waxin (AskUserQuestion ×3 con previews)
  • Contexto: GATE M1 verificado verde por el orquestador (smoke independiente contra 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.

L15 — Autodetect del modelo: campo 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).

L16 — Pausa machine-readable: effects EN la decisión

La 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.

Consecuencias

  1. Schema effects + derivación pura activeFreezes(model) → @mks2508/axon-core 0.3.0 (lane core, milestone B5).
  2. Edit de dec-0099 en styx.model.yml añadiendo el bloque effects (orquestador, tras verificar B5; los guards de styx deben seguir verdes).
  3. Render ⏸ PAUSE ACTIVE — dec-0099 (scope=all) en axon status/now (lane cli, tras B5).
  4. Operacional (no lock): @mks2508/axon-core@0.2.0 (tw/ binding) publicado con OK de waxin en esta misma ronda — smoke desde tarball + fresh install npm verificados.