dec-0100

Vista generada de dec-0100: Locks pre-M0 de la fundación de Axon

ImplementadoSin versión del tren todavía· generada desde docs/decisions/dec-0100-locks-pre-m0-axon-foundation.md
track/docsdec-0124track/docs:DC10

Vista generada desde docs/decisions/dec-0100-locks-pre-m0-axon-foundation.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-0100-locks-pre-m0-axon-foundation.md

Enmienda a: dec-0099

Por qué importa (del frontmatter del ADR):

Cierra los 6 abiertos que PLAN.md §Abierto mandaba decidir ANTES de arrancar M0. Sin estos locks, M0 no puede empezar; con ellos, el carril de dec-0099 queda ejecutable. Enmienda el alcance de dec-0099: la cadena de publishes de MC entra como prerequisito nominado.

Nodos del roadmap que lo citan en refs: ninguno.

Páginas de la documentación que lo citan: Roadmap, tickets y axon (implementado), Empezar a contribuir (implementado), Evidencia y verificación adversarial (implementado)

Texto del ADR

Leído de docs/decisions/dec-0100-locks-pre-m0-axon-foundation.md, el fichero canónico.

dec-0100 — Locks pre-M0 de la fundación de Axon

  • Fecha: 2026-07-17
  • Estado: LOCKED
  • Decisor: waxin (AskUserQuestion ×3 rondas, primera sesión axon-v2)
  • Contexto: dec-0099 (pausa de Styx) dejó 6 abiertos en docs/governance/axon-cli/PLAN.md §Abierto con la instrucción "decidir antes de arrancar M0". Esta decisión los cierra todos.
  • Autoridad de locks: docs/governance/axon-cli/ARCHITECTURE.md §Locks (filas L9–L14 apuntan aquí).

Los 6 locks

L9 — Vendor MC: se publica @mks-mc/core PRIMERO (salida 1)

El vendor de task-sync (src/vendor/mks-mc/, 2382 LOC, byte-idéntico a MC desde 97c1d73 2026-04-12) se resuelve por la salida limpia de VENDORED.md:9-14: publicar @mks-mc/core (lo que arrastra @mks-mc/utils y @mks2508/hyperdiff-*), borrar el vendor y depender del paquete real.

waxin, literal: "publicar core primero, habrá que hacer setup de sibling dispatch en más sitios en ese repo" — el repo de mks-mission-control necesita su .siblings.toml para dispatchar el trabajo de publicación.

Amend (misma noche): el scope @mks-mc no existía como org npm y «mc» no es nombre final de producto → org lockeada mks-agenticslab (AskUserQuestion, nota de waxin). Los paquetes pasan a @mks-agenticslab/mc-utils / mc-core / (luego) task-sync. El recon verificó además que hyperdiff-* ya estaba publicado — la cadena real es de 2 paquetes.

⚠️ Esto ENMIENDA dec-0099 §Alcance (ver sección Enmienda abajo).

Rechazadas: (2) publicar con vendor inlined — era la recomendación de axon por no meter trabajo de MC en el parón; waxin prefiere la salida limpia y asume el coste. (3) reescribir el motor — 2382 LOC funcionales tiradas, viola simplicidad.

L10 — Naming: repo axon, paquetes @mks2508/axon-core + @mks2508/axon

axon/                       ← repo nuevo propio (L1 revertido)
├─ packages/core/           @mks2508/axon-core   (model/ session/ git/ tw/)
├─ packages/cli/            @mks2508/axon        (bin: axon)
└─ (futuro) packages/…      si hace falta, sin repo nuevo

Monorepo Bun workspaces mínimo. El scope @mks2508 ya publica (no-throw, better-logger, mks-ui) — cero fricción npm. CLI = consumidor separado del core (L5 intacto).

L11 — Dependencia unidireccional axon-core → task-sync

axon-core importa @mks-agentics/task-sync publicado (como ya decía PLAN M0). Los hooks se quedan en task-sync y NO conocen el model: su contrato con el roadmap es el UDA string (claude_roadmap_item_id, que ya existe y se propaga). Si un hook necesitara validar contra el DAG: llama a la CLI o lee un índice generado (JSON) — nunca importa la librería.

0 ciclo por construcción. Rechazadas: invertida (serializa M0 contra sí mismo) y paquete puente (abstracción single-use).

L12 — L7 vs L8: L7 está SATISFECHO de facto por 35d44d8

Timeline verificado por git log (no por prosa):

35d44d8  feat(governance): gates de track/plugin-seams y track/ui   ← ANTES
a55d5f3  docs(governance): dec-0099 pausa Styx                      ← DESPUÉS

Los gates que L7 exigía ("o la CLI indexaría el vacío") ya estaban declarados antes de lockear la pausa, como meta-trabajo de governance. La «contradicción viva L7 vs L8» que README/ARCHITECTURE/PLAN documentaban tenía la premisa fáctica rota. L8 procede: axon-core es el paso 1.

track/domain-media sigue sin gate (tercer track in_progress, bloquea 4 nodos — briefing hallazgo 3). Anotado, no se toca: es producto (pausado), y axon status lo gritará por diseño (garantía anti-mentira: «⚠ SIN GATE»).

L13 — axon init = bootstrap de REPO

Crea la instancia de gobernanza en un repo: .claude/axon.config.json (template) + dirs espejo

  • esqueleto del model (authoritative: true) + wiring de guards (axon check). El bootstrap de sesión no lo necesita: el agente axon-v2 (personalidad) + axon status (la foto) ya son eso. Hace portable el modelo v2 a repos nuevos (mks-mc y agentics lo van a querer).

L14 — Commit-wizard: smoke → publicar 2.1.0 → reactivar; integración axon post-M1

Verificación de esta sesión (el claim de waxin era verificable y se verificó ANTES de lockear):

ClaimEvidencia
"saqué otra versión el 16"✅ 42f306e (2026-07-16) "ship v2.0 with staging controls + push safety + setup wizard" + 81db32b v2.1.0 "agent-first polish" — repo local nodejs/gemini-commit-wizard
"ya funcionando"⚠️ v2.1.0 solo local: npm latest = 1.3.0 (2026-04-06) — el registry sigue sirviendo la versión que auto-stageaba + pusheaba
"ya no hace auto-stage/push"⚠️ claim de commit message, sin smoke (r31: el mensaje no es evidencia del comportamiento)

Lock: (1) smoke adversarial en repo dummy (¿stagea solo lo pedido? ¿pushea sin prompt? → debe ser NO; verificador ≠ implementador) → (2) npm publish 2.1.0 (dejar latest=1.3.0 publicada es deuda con blast radius) → (3) reactivar en styx para commits asistidos manuales. axon-core NO lleva commit/ en M0 — la integración (envolver como axon commit o no) se decide post-M1, con la CLI real delante.

Enmienda a dec-0099 §Alcance (nominada, no silenciosa)

dec-0099 excluía nominalmente "el split de Mission Control" y "cualquier «ya que estamos» sobre los 3 repos". L9 mete en el carril un subconjunto acotado de trabajo de MC: publicar @mks-mc/core + @mks-mc/utils + @mks2508/hyperdiff-* y borrar el vendor de task-sync.

  • Qué entra: SOLO la cadena de publishes + el .siblings.toml de MC para dispatcharla.
  • Qué sigue fuera: el split de MC (mks-git-client), su gate 4, y todo lo demás de la lista de dec-0099 §Alcance.
  • Por qué es enmienda y no violación: la decide waxin en interview con la contradicción a la vista (se le presentó como «❌ choca con dec-0099 §Alcance» en el preview y eligió igual). Mismo patrón que dec-0098 con r28 §3: excepción nominada, no agujero genérico.

Consecuencia en el carril: M0 gana una lane previa/paralela. model/ + session/ + git/ no dependen de tw y pueden arrancar YA; la lane tw/ espera a cadena MC publicada → task-sync publicado. El detalle vive en PLAN.md §M0.

Qué queda abierto (no bloqueaba M0)

  • Q3/Q4 de ADR-0022 (update-trigger + persistencia; hooks TW nativos + scope de UDAs).
  • Bug TaskUpdate(completed) no propaga.
  • PASO 10 vs redirect-table (la CLI la vuelve load-bearing; reconciliar).
  • Migrar ADRs 0019-0022 de agentics a v2.
  • Skill task-management (miente en 4 puntos — FINDINGS §3e).
  • Contenido del gate de track/domain-media (producto; al volver de la pausa).