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).
576 lines
15 KiB
Markdown
576 lines
15 KiB
Markdown
---
|
||
theme: default
|
||
title: Working Group — Ontología y Reflection
|
||
titleTemplate: '%s - OntoRef'
|
||
layout: cover
|
||
keywords: Ontología,Reflection,Rust,Nickel,WorkingGroup,RustLasPalmas
|
||
download: true
|
||
exportFilename: ontoref-working-group
|
||
monaco: true
|
||
remoteAssets: true
|
||
selectable: true
|
||
record: true
|
||
colorSchema: dark
|
||
lineNumbers: false
|
||
themeConfig:
|
||
primary: '#f74c00'
|
||
logoHeader: '/ferris.svg'
|
||
fonts:
|
||
mono: 'Victor Mono'
|
||
drawings:
|
||
enabled: true
|
||
persist: false
|
||
presenterOnly: false
|
||
syncAll: true
|
||
scripts:
|
||
- setup/image-overlay.ts
|
||
class: 'justify-center flex flex-cols'
|
||
---
|
||
|
||
<h1 class="font-medium text-3xl leading-tight">Working Group<br><span class="text-orange-400">Ontología y Reflection en tus proyectos</span></h1>
|
||
|
||
<div class="flex justify-center mt-6 text-gray-400 text-lg italic">
|
||
Sesión de presentación · Rust-LasPalmas
|
||
</div>
|
||
|
||
<div class="flex justify-center mt-8">
|
||
<img class="w-40" src="/jesusperez_w.svg">
|
||
</div>
|
||
|
||
<style scoped>
|
||
h1, h2, p { z-index: 10; }
|
||
</style>
|
||
|
||
<Footer />
|
||
|
||
<!--
|
||
Esto no es una charla. Es la sesión donde decidís si entráis a un grupo de trabajo cerrado.
|
||
Saludo breve, agradecer la asistencia, y avisar: en 60 minutos saldrán con la decisión tomada.
|
||
No hay seguimiento por correo, no hay "ya os mandaré info". Hoy entráis o no entráis.
|
||
-->
|
||
|
||
---
|
||
layout: section
|
||
---
|
||
|
||
# Tres preguntas, antes de nada
|
||
|
||
<!--
|
||
Pasar al modo participativo desde el primer momento.
|
||
No es retórica — pedir respuesta de verdad. Si nadie levanta la mano, esperar.
|
||
El silencio funciona aquí.
|
||
-->
|
||
|
||
---
|
||
layout: default
|
||
---
|
||
|
||
# Levantad la mano si esto os ha pasado
|
||
|
||
<div class="mt-8 space-y-6">
|
||
|
||
<v-click>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-2xl mt-1">1.</span>
|
||
<div class="text-gray-200 text-lg">
|
||
Postmortem donde la decisión que se violó <em>estaba escrita</em> en una ADR — pero nadie la recordaba.
|
||
</div>
|
||
</div>
|
||
|
||
</v-click>
|
||
|
||
<v-click>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-2xl mt-1">2.</span>
|
||
<div class="text-gray-200 text-lg">
|
||
Onboarding de alguien nuevo (o tú mismo, después de tres meses) re-descubriendo <em>por qué</em> el código está así.
|
||
</div>
|
||
</div>
|
||
|
||
</v-click>
|
||
|
||
<v-click>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-2xl mt-1">3.</span>
|
||
<div class="text-gray-200 text-lg">
|
||
Diagrama de arquitectura que <em>mintió</em> tres meses después de pintarlo.
|
||
</div>
|
||
</div>
|
||
|
||
</v-click>
|
||
|
||
</div>
|
||
|
||
<!--
|
||
Click por click. Pausa entre cada uno.
|
||
Si la sala levanta la mano en los tres, ya tienes audiencia. Si solo en uno, ese es el dolor a destacar.
|
||
Reconocer en voz alta: "ya, lo conocemos todos."
|
||
-->
|
||
|
||
---
|
||
layout: default
|
||
---
|
||
|
||
# El patrón
|
||
|
||
<div class="mt-6 grid grid-cols-2 gap-8">
|
||
|
||
<div>
|
||
|
||
**Para el código exigimos**
|
||
|
||
<div class="mt-4 space-y-3">
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-green-400 font-bold text-sm mt-1">✓</span>
|
||
<div class="text-gray-300">Tipos estrictos</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-green-400 font-bold text-sm mt-1">✓</span>
|
||
<div class="text-gray-300">Tests que validan invariantes</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-green-400 font-bold text-sm mt-1">✓</span>
|
||
<div class="text-gray-300">Compilador que rechaza incoherencias</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-green-400 font-bold text-sm mt-1">✓</span>
|
||
<div class="text-gray-300">Errores antes de llegar a producción</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div>
|
||
|
||
<v-click>
|
||
|
||
**Para las decisiones aceptamos**
|
||
|
||
<div class="mt-4 space-y-3">
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-red-400 font-bold text-sm mt-1">✗</span>
|
||
<div class="text-gray-300">Markdown libre</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-red-400 font-bold text-sm mt-1">✗</span>
|
||
<div class="text-gray-300">Diagramas que envejecen</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-red-400 font-bold text-sm mt-1">✗</span>
|
||
<div class="text-gray-300">Convención y disciplina humana</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-red-400 font-bold text-sm mt-1">✗</span>
|
||
<div class="text-gray-300">Errores que aparecen en el postmortem</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</v-click>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!--
|
||
Esta es LA slide. La incoherencia entre las dos columnas es el insight completo.
|
||
"Rust nos da tipos hasta el borde del binario. Después, texto libre."
|
||
Aquí no se vende solución todavía.
|
||
-->
|
||
|
||
---
|
||
layout: section
|
||
---
|
||
|
||
# ¿Y si las tratáramos igual?
|
||
|
||
<div class="mt-8 text-gray-400 text-xl italic">
|
||
Tipos. Contratos. Validación al guardar, no en el postmortem.
|
||
</div>
|
||
|
||
<!--
|
||
Pausa larga aquí.
|
||
La pregunta queda en el aire. La siguiente slide es la respuesta práctica.
|
||
-->
|
||
|
||
---
|
||
layout: default
|
||
---
|
||
|
||
# Lo que vamos a ver ahora
|
||
|
||
<div class="mt-8 space-y-5 text-gray-300 text-lg">
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-xl mt-1">→</span>
|
||
<div>Un proyecto vacío</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-xl mt-1">→</span>
|
||
<div>Un axioma · una tensión · una decisión</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-xl mt-1">→</span>
|
||
<div>Un cambio que viola la decisión</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-xl mt-1">→</span>
|
||
<div>El typecheck rechazándolo</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="mt-12 text-center text-gray-500 text-sm italic">
|
||
8 líneas de código. Sin frameworks. Sin instalar nada raro.
|
||
</div>
|
||
|
||
<!--
|
||
Slide-anchor para la mini-demo. Aquí salgo de las slides y voy a la terminal.
|
||
~10 minutos de demo en vivo.
|
||
La frase final ("8 líneas de código") es un compromiso público que la demo tiene que sostener.
|
||
-->
|
||
|
||
---
|
||
layout: cover
|
||
class: 'justify-center flex flex-cols'
|
||
---
|
||
|
||
<h1 class="font-medium text-3xl text-orange-400">Demo en vivo</h1>
|
||
|
||
<div class="flex justify-center mt-6 text-gray-400 text-lg italic">
|
||
El terminal y un editor. Nada más.
|
||
</div>
|
||
|
||
<!--
|
||
Salir de slidev. Terminal en pantalla compartida.
|
||
Pre-cargado:
|
||
- directorio /tmp/demo-wg/ vacío
|
||
- dos buffers preparados pero no escritos
|
||
- ontoref CLI instalada y verificada
|
||
- nickel typecheck verificado
|
||
Plan B si algo falla: tener un asciinema grabado que reproducir.
|
||
Volver a las slides cuando suene la frase: "Esto que acabáis de ver es lo más pequeño que se puede tener."
|
||
-->
|
||
|
||
---
|
||
layout: default
|
||
---
|
||
|
||
# Lo que acabáis de ver
|
||
|
||
<div class="mt-6 grid grid-cols-2 gap-8">
|
||
|
||
<div>
|
||
|
||
**Lo construido en 8 minutos**
|
||
|
||
<div class="mt-4 space-y-3 text-gray-300">
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-orange-400 font-bold text-sm mt-1">·</span>
|
||
<div>Un <code>core.ncl</code> con un axioma y una tensión</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-orange-400 font-bold text-sm mt-1">·</span>
|
||
<div>Una ADR como contrato vivo</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-2">
|
||
<span class="text-orange-400 font-bold text-sm mt-1">·</span>
|
||
<div>Un cambio rechazado al guardar</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div>
|
||
|
||
<v-click>
|
||
|
||
**Lo que esto se vuelve con tiempo**
|
||
|
||
<div class="mt-4 text-gray-300 text-sm">
|
||
Un proyecto real, después de meses:
|
||
</div>
|
||
|
||
<div class="mt-3 font-mono text-xs text-gray-400 bg-gray-900 p-3 rounded">
|
||
.ontology/<br>
|
||
├── core.ncl <span class="text-gray-600">(20 nodos, 22 aristas)</span><br>
|
||
├── state.ncl <span class="text-gray-600">(5 dimensiones FSM)</span><br>
|
||
├── gate.ncl <span class="text-gray-600">(membranas)</span><br>
|
||
└── manifest.ncl<br>
|
||
adrs/ <span class="text-gray-600">(20 decisiones vivas)</span><br>
|
||
reflection/modes/ <span class="text-gray-600">(rutinas tipadas)</span>
|
||
</div>
|
||
|
||
<div class="mt-3 text-gray-500 text-sm italic">
|
||
La estructura es la misma. Solo crece el contenido.
|
||
</div>
|
||
|
||
</v-click>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!--
|
||
Click reveal: lo que tienen ahora vs destino realista.
|
||
NO es "tienes que llegar aquí". Es "esto crece a esto cuando le dedicas tiempo".
|
||
Frase clave: "lo de antes y esto es el mismo schema. Lo importante es empezar."
|
||
-->
|
||
|
||
---
|
||
layout: section
|
||
---
|
||
|
||
# La propuesta
|
||
|
||
<div class="mt-6 text-gray-400 text-xl">
|
||
Working group cerrado. Cuatro o cinco personas.
|
||
</div>
|
||
|
||
<!--
|
||
Cambio de tono. Ahora es la oferta concreta.
|
||
-->
|
||
|
||
---
|
||
layout: default
|
||
---
|
||
|
||
# Cómo funciona
|
||
|
||
<div class="mt-4 space-y-4 text-gray-300">
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-sm mt-1 w-32 flex-none">Formato</span>
|
||
<div>Presencial · coworking en Las Palmas</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-sm mt-1 w-32 flex-none">Tamaño</span>
|
||
<div>4–5 personas · cohorte cerrada</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-sm mt-1 w-32 flex-none">Sesiones</span>
|
||
<div>4 sesiones de ~2 horas · una cada 2 semanas</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-sm mt-1 w-32 flex-none">Entre sesiones</span>
|
||
<div>~1 hora de iteración sobre vuestro proyecto</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-sm mt-1 w-32 flex-none">Coste</span>
|
||
<div>Vuestro tiempo. Coworking compartido.</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-sm mt-1 w-32 flex-none">Después</span>
|
||
<div>Si funciona, abrimos un siguiente ciclo. No hay programa eterno.</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!--
|
||
Honestidad sobre el compromiso real.
|
||
"Cohorte cerrada" — no se incorpora gente a mitad. Razón: continuidad y lenguaje común.
|
||
"4 sesiones" — no más. Si necesitan más, abren otro ciclo después.
|
||
-->
|
||
|
||
---
|
||
layout: default
|
||
---
|
||
|
||
# Qué os lleváis
|
||
|
||
<div class="mt-8 space-y-5 text-gray-300 text-lg">
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-green-400 font-bold text-xl mt-1">✓</span>
|
||
<div>Un <code>.ontology/</code> mínimo funcionando para un proyecto vuestro</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-green-400 font-bold text-xl mt-1">✓</span>
|
||
<div>Una ADR formalizada como constraint que protege ese proyecto</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-green-400 font-bold text-xl mt-1">✓</span>
|
||
<div>Una <code>reflection mode</code> propia para una rutina vuestra</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-green-400 font-bold text-xl mt-1">✓</span>
|
||
<div>Capacidad de seguir solos, sin depender del grupo</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="mt-12 text-gray-500 italic text-center">
|
||
No salís con un curso. Salís con código vuestro vivo.
|
||
</div>
|
||
|
||
<!--
|
||
Outcome material. Cuatro cosas concretas, ninguna abstracta.
|
||
La frase del cierre es la promesa.
|
||
-->
|
||
|
||
---
|
||
layout: default
|
||
---
|
||
|
||
# Qué esto NO es
|
||
|
||
<div class="mt-8 space-y-4 text-gray-300">
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-red-400 font-bold text-xl mt-1">✗</span>
|
||
<div>Un curso de Nickel desde cero</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-red-400 font-bold text-xl mt-1">✗</span>
|
||
<div>Una venta de OntoRef como producto</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-red-400 font-bold text-xl mt-1">✗</span>
|
||
<div>Soporte 24/7 entre sesiones</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-red-400 font-bold text-xl mt-1">✗</span>
|
||
<div>Asistencia opcional · si fallas dos sesiones, sales del ciclo</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-red-400 font-bold text-xl mt-1">✗</span>
|
||
<div>Una comunidad amplia · esto es trabajo concentrado, no networking</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!--
|
||
Gestionar expectativas con honestidad.
|
||
La línea de "fallas dos sesiones, sales del ciclo" parece dura — es deliberada.
|
||
La continuidad es lo que define el grupo. Sin ella, no hay valor.
|
||
Mejor decirlo aquí que en sesión 3 cuando alguien falló dos veces.
|
||
-->
|
||
|
||
---
|
||
layout: default
|
||
---
|
||
|
||
# Lo que necesito de cada uno antes de la primera sesión
|
||
|
||
<div class="mt-6 space-y-4 text-gray-300">
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-sm mt-1 w-8 flex-none">1.</span>
|
||
<div>Un proyecto vuestro · Rust o no, lo que tengáis vivo</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-sm mt-1 w-8 flex-none">2.</span>
|
||
<div>Nickel y la CLI de OntoRef instaladas (os paso la guía)</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-sm mt-1 w-8 flex-none">3.</span>
|
||
<div>Una decisión arquitectónica de ese proyecto que recordéis · cualquiera</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-orange-400 font-bold text-sm mt-1 w-8 flex-none">4.</span>
|
||
<div>Disposición a romper esa decisión en vivo y ver qué pasa</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="mt-10 text-gray-500 italic">
|
||
Si traéis esto, en sesión 1 ya estáis modelando.
|
||
</div>
|
||
|
||
<!--
|
||
La preparación entre la decisión-de-entrar y la sesión 1 es lo que filtra a quien va en serio.
|
||
Lista corta y concreta. Sin requisitos masivos.
|
||
-->
|
||
|
||
---
|
||
layout: cover
|
||
class: 'justify-center flex flex-cols'
|
||
---
|
||
|
||
<h1 class="font-medium text-3xl text-orange-400">¿Quién entra?</h1>
|
||
|
||
<div class="flex justify-center mt-6 text-gray-300 text-lg">
|
||
Levantad la mano. No por correo después.
|
||
</div>
|
||
|
||
<div class="flex justify-center mt-12 text-gray-500 italic text-base">
|
||
Mejor tres comprometidos que cinco difusos.
|
||
</div>
|
||
|
||
<!--
|
||
Esta es la slide del momento de decisión.
|
||
NO seguir presentando después de esto. NO añadir "ya os pensáis si queréis".
|
||
Pausa. Mirar a la sala. Esperar manos.
|
||
Tomar nombres y mails ahí mismo. Crear el grupo de Telegram/Signal antes de salir.
|
||
-->
|
||
|
||
---
|
||
layout: default
|
||
---
|
||
|
||
# Si no entras hoy
|
||
|
||
<div class="mt-8 space-y-4 text-gray-300 text-lg">
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-gray-500 font-bold text-sm mt-1">·</span>
|
||
<div>El siguiente ciclo se abre cuando éste termine — sin fecha fijada todavía.</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-gray-500 font-bold text-sm mt-1">·</span>
|
||
<div>Si quieres aviso del próximo, déjalo dicho hoy.</div>
|
||
</div>
|
||
|
||
<div class="flex items-start gap-3">
|
||
<span class="text-gray-500 font-bold text-sm mt-1">·</span>
|
||
<div>El material del approach está abierto en Github · podéis explorar solos.</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="mt-12 text-center text-gray-400 italic">
|
||
Gracias por venir.
|
||
</div>
|
||
|
||
<Footer />
|
||
|
||
<!--
|
||
Slide para no dejar a nadie con la sensación de "rechazado".
|
||
Quien no entró hoy tiene puerta abierta para el siguiente ciclo.
|
||
Y el approach está públicamente disponible — la sesión les sirvió aunque no entren al WG.
|
||
-->
|