ontoref/assets/presentation/work_group_info.md

577 lines
15 KiB
Markdown
Raw Normal View History

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