ontoref/assets/work-group-ore/demo/script.md
Jesús Pérez 82a358f18d
Some checks failed
Nickel Type Check / Nickel Type Checking (push) Has been cancelled
Rust CI / Security Audit (push) Has been cancelled
Rust CI / Check + Test + Lint (push) Has been cancelled
feat: #[onto_mcp_tool] catalog, OCI credential vault layer, validate ADR-018 mode hierarchy
ontoref-derive: #[onto_mcp_tool] attribute macro registers MCP tool unit-structs in
  the catalog at link time via inventory::submit!; annotated item is emitted unchanged,
  ToolBase/AsyncTool impls stay on the struct. All 34 tools migrated from manual wiring
  (net +5: ontoref_list_projects, ontoref_search, ontoref_describe,
  ontoref_list_ontology_extensions, ontoref_get_ontology_extension).

  validate modes (ADR-018): reads level_hierarchy from workflow.ncl and checks every
  .ncl mode for level declared, strategy declared, delegate chain coherent, compose
  extends valid. mode resolve <id> shows which hierarchy level handles a mode and why.
  --self-test generates synthetic fixtures in a temp dir for CI smoke-testing.

  validate run-cargo: two-step Cargo.toml resolution — workspace layout first
  (crates/<check.crate>/Cargo.toml), single-crate fallback by package name or repo
  basename. Lets the same ADR constraint shape apply to workspace and single-crate repos.

  ontology/schemas/manifest.ncl: registry_topology_type contract — multi-registry
  coordination, push targets, participant scopes, per-namespace capability.

  reflection/requirements/base.ncl: oras ≥1.2.0, cosign ≥2.0.0, sops ≥3.9.0, age
  ≥1.1.0, restic declared as Hard/Soft requirements with version_min, check_cmd, and
  install_hint (ADR-017 toolchain surface).

  ADR-019: per-file recipient routing for tenant isolation without multi-vault. Schema
  additions: sops.recipient_groups + sops.recipient_rules in ontoref-project.ncl.
  secrets-bootstrap generates .sops.yaml from project.ncl in declarative mode. Three
  new secrets-audit checks: recipient-routing-coherent, recipient-routing-coverage,
  no-multi-vault. Adoption templates: single-team/, multi-tenant/, agent-first/.
  Integration templates: domain-producer/, mode-producer/, mode-consumer/.

  UI: project_picker surfaces registry badge (⟳ participant) and vault badge
  (⛁ vault_id · N, green=declarative / amber=legacy) per project card. Expanded panel
  adds collapsible Registry section with namespace, endpoint, and push/pull capability.
  manage.html gains Runtime Services card — MCP and GraphQL toggleable without restart
  via HTMX POST /ui/manage/services/{service}/toggle.

  describe.nu: capabilities JSON includes registry_topology and vault_state per project.
  sync.nu: drift check extended to detect //! absence on newly registered crates.
  qa.ncl: six entries — credential-vault-best-practice (layered data-flow diagram),
  credential-vault-templates (paths A/B/C), credential-vault-troubleshooting (15 named
  errors), integration-what-and-why (ADR-042 OCI federation), integration-how-to-implement,
  integration-troubleshooting.

  on+re: core.ncl + manifest.ncl updated to reflect OCI, MCP, and mode-hierarchy nodes.
  Deleted stale presentation assets (2026-02 slides + voice notes).
2026-05-12 04:46:15 +01:00

6.2 KiB

Guion mini-demo — Owner por servicio (Opción A)

Tiempo total: 8-10 minutos. Lo que hay que teclear y lo que hay que decir, paso a paso. Para la opción B, el ritmo es similar pero con más densidad técnica — ver option-b-layers/README.md.

Pre-requisitos en la máquina del presentador

  • Terminal con tipografía visible desde la última fila del coworking
  • Editor con resaltado de sintaxis para Nickel (idealmente) o cualquier editor
  • Pre-cargado en una pestaña: el core.ncl final (with-contract.ncl) por si hay bloqueo
  • /tmp/demo-wg/ vacío antes de empezar

Pre-paso (cero, no contar como demo)

Limpiar y posicionarse:

rm -rf /tmp/demo-wg && mkdir /tmp/demo-wg && cd /tmp/demo-wg
clear

Paso 1 — directorio vacío (~30s)

Teclear:

pwd
ls

Decir:

Esto es lo que cualquiera de vosotros tiene antes de empezar. Sin framework, sin scaffold, sin instalar nada. Vamos a montar el esqueleto del approach con Nickel solo.


Paso 2 — escribir core.ncl mínimo (~2 min)

Abrir editor:

$EDITOR core.ncl

Escribir (despacio, comentando mientras se escribe):

{
  axiom = "Cada servicio en producción tiene un owner identificable",

  services = [
    { name = "api", owner = "backend" },
    { name = "frontend", owner = "frontend" },
  ],
}

Decir mientras tecleas:

Voy a escribir lo que quiero que sea cierto en mi proyecto: que cada servicio tenga un dueño identificable. Lo que pongo aquí es texto, todavía no es contrato. Solo dice que la palabra axiom y la palabra services existen.

Validar:

nickel export core.ncl

Esperar a ver: el JSON evaluado, sin errores.

Decir:

Vale, esto pasa. Pero ojo: aquí no he validado nada todavía. Es como tener un YAML con sintaxis correcta. La estructura es lo único que se garantiza. Si mañana añado un servicio sin owner, esto sigue exportando sin quejarse. Vamos a arreglar eso.


Paso 3 — añadir contrato (~3 min)

Editar para que quede así:

let Service = {
  name | String,
  owner | String,
} in

{
  axiom = "Cada servicio en producción tiene un owner identificable",

  services | Array Service = [
    { name = "api", owner = "backend" },
    { name = "frontend", owner = "frontend" },
  ],
}

Decir mientras tecleas:

Esto es el contrato. Defino qué es un Servicio: tiene un nombre y un owner, ambos strings. Y le aplico el contrato a la lista — todos los elementos tienen que cumplir la forma. Esto, en un proyecto real, es lo que en markdown llamaríais una ADR. La diferencia es que aquí la ADR es código.

Validar:

nickel export core.ncl

Esperar a ver: el JSON evaluado, sin errores.

Decir:

Sigue pasando. Los servicios cumplen el contrato.


Paso 4 — el rompimiento (~2 min)

Decir antes de tocar el código:

Vale. Ahora viernes por la tarde, hay prisa, hay que meter un servicio nuevo de métricas. Owner todavía no asignado, ya lo arreglo el lunes.

Editar para añadir el servicio sin owner:

  services | Array Service = [
    { name = "api", owner = "backend" },
    { name = "frontend", owner = "frontend" },
    { name = "metrics" },
  ],

Validar:

nickel export core.ncl

Esperar a ver: error que menciona missing definition for 'owner' y señala la línea del contrato y el record que viola.

LEER EL ERROR EN VOZ ALTA, despacio.

Decir:

El contrato no me dejó. No es un linter post-hoc, no es un test que tarda cinco minutos en CI. Es la validación del archivo, ahora mismo, en mi editor. Si esto fuera un PR, el CI falla antes de pasar a review. Tres meses después, cuando metrics se rompa, no va a ser que nadie sepa quién lo mantiene.

Pausa larga. Dejar que la sala procese.


Paso 5 — arreglar y cierre (~1.5 min)

Editar para añadir owner:

    { name = "metrics", owner = "platform" },

Validar:

nickel export core.ncl

Esperar a ver: el JSON con el servicio nuevo incluido.

Decir:

Y arreglarlo es trivial. Pongo el owner, pasa. La fricción está en la decisión, no en escribir el código.

Mostrar tamaño:

wc -l core.ncl

Esperar a ver: ~12 líneas.

Decir:

Doce líneas. Esto es Nickel solo. Sin daemon, sin CLI mía, sin proyecto enorme. Lo de antes lo construyes en cinco minutos en cualquier proyecto vuestro.


Volver a slides

Cierra el editor (no la terminal — quédate en /tmp/demo-wg). Cambia a slidev. La siguiente slide hace el contraste con un .ontology/ ya crecido.

Plan B si algo se cuelga

Síntoma Acción
Editor crashea al escribir cp el archivo del paso correspondiente: cp /Users/Akasha/Development/ontoref/assets/work-group-ore/demo/option-a-owner/core.with-contract.ncl ./core.ncl
nickel no responde Plan B audiovisual: asciinema play /Users/Akasha/Development/ontoref/assets/work-group-ore/demo/recording/demo.cast
Te quedas en blanco mid-demo Pausa, di "voy a copiar la versión completa para no perder tiempo", cp core.with-contract.ncl ./core.ncl, sigue desde paso 4
Pregunta inesperada que para la demo Apunta la pregunta en pizarra, di "lo retomamos después de la demo", sigue

Nota técnica: usamos nickel export (no nickel typecheck) porque los contratos | Array Service y std.contract.custom se evalúan en runtime, no durante el chequeo de tipos estáticos. nickel export evalúa la expresión a JSON y dispara los contratos en el camino — si alguno falla, el error sale por stderr. Es el comando que mejor refleja "qué pasa cuando tu CI valida el archivo".

Errores comunes durante la demo

  • No esperar a que la sala lea el error: la pausa larga después del fallo del typecheck es donde aterriza el insight. Cuenta hasta cinco mentalmente.
  • Hablar más rápido cuando uno está nervioso: el tempo de la demo es lento a propósito. Si te oyes acelerando, respira.
  • Disculparse por la simpleza: NO lo hagas. La simpleza ES el argumento. Si dices "esto es muy simple, en producción es más complicado", pierdes la fuerza del ejemplo.