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).
235 lines
6.2 KiB
Markdown
235 lines
6.2 KiB
Markdown
# 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:
|
|
|
|
```bash
|
|
rm -rf /tmp/demo-wg && mkdir /tmp/demo-wg && cd /tmp/demo-wg
|
|
clear
|
|
```
|
|
|
|
---
|
|
|
|
## Paso 1 — directorio vacío (~30s)
|
|
|
|
**Teclear:**
|
|
|
|
```bash
|
|
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:**
|
|
|
|
```bash
|
|
$EDITOR core.ncl
|
|
```
|
|
|
|
**Escribir** (despacio, comentando mientras se escribe):
|
|
|
|
```nickel
|
|
{
|
|
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:**
|
|
|
|
```bash
|
|
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í:**
|
|
|
|
```nickel
|
|
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:**
|
|
|
|
```bash
|
|
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:**
|
|
|
|
```nickel
|
|
services | Array Service = [
|
|
{ name = "api", owner = "backend" },
|
|
{ name = "frontend", owner = "frontend" },
|
|
{ name = "metrics" },
|
|
],
|
|
```
|
|
|
|
**Validar:**
|
|
|
|
```bash
|
|
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:**
|
|
|
|
```nickel
|
|
{ name = "metrics", owner = "platform" },
|
|
```
|
|
|
|
**Validar:**
|
|
|
|
```bash
|
|
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:**
|
|
|
|
```bash
|
|
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.
|