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).
989 lines
24 KiB
Markdown
989 lines
24 KiB
Markdown
---
|
|
theme: default
|
|
title: Ontología y Reflection — lo que la IA no puede entender por ti
|
|
titleTemplate: '%s - OntoRef'
|
|
layout: cover
|
|
keywords: Ontología,Reflection,IA,Infraestructura,OntoRef,Nushell,Nickel
|
|
download: true
|
|
exportFilename: ontoref-openspace
|
|
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">La IA gestiona tu infra...<br><span class="text-orange-400">¿Sabes lo que está pasando?</span></h1>
|
|
|
|
<div class="flex justify-center mt-6 text-gray-400 text-lg italic">
|
|
Ontología y Reflection como base de un proyecto que se entiende a sí mismo.
|
|
</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 />
|
|
|
|
<!--
|
|
Abrir con pausa. El título es una pregunta directa.
|
|
No es retórica — la mayoría no sabe. Y el punto es exactamente ese.
|
|
Esta charla no es sobre herramientas. Es sobre qué pasa cuando externalizas comprensión.
|
|
-->
|
|
|
|
---
|
|
layout: default
|
|
---
|
|
|
|
# El problema no es la herramienta
|
|
|
|
<div class="grid grid-cols-2 gap-8 mt-4">
|
|
|
|
<div>
|
|
|
|
**Lo que la IA hace bien**
|
|
|
|
<div class="mt-3 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 text-sm">Genera YAML correcto sintácticamente</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 text-sm">Completa Terraform que nunca rompe el plan</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 text-sm">Rellena gaps de configuración con defaults razonables</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 text-sm">Traduce intención en forma declarativa</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<v-click>
|
|
|
|
**Lo que la IA no puede hacer**
|
|
|
|
<div class="mt-3 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 text-sm">Saber <em>por qué</em> ese servicio no puede escalar a N réplicas</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 text-sm">Conocer la tensión que existe entre latencia y consistencia en <em>tu</em> sistema</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 text-sm">Recordar la decisión que tomaste en diciembre y por qué descartaste la alternativa</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 text-sm">Entender qué no puede romperse sin coordinación entre equipos</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-6 border-l-4 border-orange-500 pl-4 text-sm text-gray-300">
|
|
Declarativo ≠ comprensión.<br>
|
|
Describes el estado deseado, no el <em>por qué</em>.
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
La IA genera forma correcta para el problema equivocado.
|
|
El YAML válido es el problema mínimo. El problema real es que nadie sabe qué asumió.
|
|
-->
|
|
|
|
---
|
|
layout: default
|
|
---
|
|
|
|
# Las 2am — cuando el Terraform no habla
|
|
|
|
<div class="grid grid-cols-2 gap-8 mt-4">
|
|
|
|
<div>
|
|
|
|
**Lo que ves cuando falla**
|
|
|
|
<div class="mt-3 font-mono text-xs text-gray-300">
|
|
|
|
```text
|
|
Error: Error creating Instance:
|
|
googleapi: Error 400: Invalid value
|
|
for field 'resource.machineType'
|
|
|
|
# El plan pasó. El apply falló.
|
|
# ¿Qué asumió el agente?
|
|
# ¿Qué región eligió? ¿Por qué ese tipo?
|
|
# ¿Hay una restricción de org que no sabía?
|
|
```
|
|
|
|
</div>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-4 font-mono text-xs text-gray-400">
|
|
|
|
```yaml
|
|
# Lo que generó la IA (hace 6 semanas)
|
|
resource "google_compute_instance" "api" {
|
|
machine_type = "e2-medium" # "razonable"
|
|
zone = "us-central1-a" # "por defecto"
|
|
}
|
|
|
|
# Lo que tu política de org requiere
|
|
# → solo europe-west1, solo n2-standard-*
|
|
# → la IA no lo sabía porque tú tampoco lo escribiste
|
|
```
|
|
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<v-click>
|
|
|
|
**El patrón que se repite**
|
|
|
|
<div class="mt-3 space-y-3 text-sm">
|
|
|
|
<div class="border-l-2 border-red-500 pl-3">
|
|
<div class="text-red-300 font-semibold">Sin modelo explícito</div>
|
|
<div class="text-gray-400">La IA inventa contexto plausible. Tú asumes que sabe. Falla en prod.</div>
|
|
</div>
|
|
|
|
<div class="border-l-2 border-orange-500 pl-3">
|
|
<div class="text-orange-300 font-semibold">Con Stack Overflow</div>
|
|
<div class="text-gray-400">Copias código sin entender el supuesto. Al menos tú lo buscaste.</div>
|
|
</div>
|
|
|
|
<div class="border-l-2 border-yellow-500 pl-3">
|
|
<div class="text-yellow-300 font-semibold">Con la IA</div>
|
|
<div class="text-gray-400">El agente genera con confianza. La confianza es contagiosa. El error también.</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-6 text-base font-semibold text-gray-200 border-l-4 border-orange-500 pl-4">
|
|
La diferencia con Stack Overflow:<br>
|
|
<span class="text-gray-400 font-normal text-sm">Al menos ahí buscabas activamente.<br>Con la IA, delegas también la búsqueda.</span>
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
Este slide es el que el público siente. Todos tienen una historia de "la IA lo generó y pareció bien".
|
|
La pregunta es: ¿cuándo lo descubriste? ¿Staging? ¿Prod? ¿6 meses después?
|
|
-->
|
|
|
|
---
|
|
layout: default
|
|
---
|
|
|
|
# Tu proyecto vive en tu cabeza
|
|
|
|
<div class="grid grid-cols-2 gap-8 mt-4">
|
|
|
|
<div>
|
|
|
|
**Lo que vive solo en tu cabeza**
|
|
|
|
<div class="mt-3 space-y-2 text-sm text-gray-300">
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-orange-400 text-sm mt-1">→</span>
|
|
<div>Por qué este servicio no puede tener más de 3 réplicas</div>
|
|
</div>
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-orange-400 text-sm mt-1">→</span>
|
|
<div>Qué pasó cuando intentamos escalar en enero y por qué fallamos</div>
|
|
</div>
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-orange-400 text-sm mt-1">→</span>
|
|
<div>La tensión entre el equipo de plataforma y el de producto sobre quién controla el networking</div>
|
|
</div>
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-orange-400 text-sm mt-1">→</span>
|
|
<div>Qué alternativa se rechazó y por qué</div>
|
|
</div>
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-orange-400 text-sm mt-1">→</span>
|
|
<div>Qué invariante no puede violarse sin romper el acuerdo con el equipo de seguridad</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-5 border-l-4 border-red-500 pl-4 text-sm text-gray-400">
|
|
Lo que vive solo en tu cabeza <strong class="text-red-300">no se puede validar</strong>.<br>
|
|
No puede consultarlo un agente.<br>No puede consultarlo un compañero nuevo.<br>
|
|
No puedes consultarlo tú mismo en 6 meses.
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<v-click>
|
|
|
|
**La trampa del README**
|
|
|
|
<div class="mt-3 font-mono text-xs text-gray-400">
|
|
|
|
```markdown
|
|
# Mi Proyecto
|
|
|
|
Este servicio hace X. Está desplegado en GCP.
|
|
Usa Terraform. Tiene 3 entornos: dev, staging, prod.
|
|
|
|
## Arquitectura
|
|
Ver diagrama (desactualizado desde marzo).
|
|
|
|
## Decisiones
|
|
- Elegimos PostgreSQL porque MySQL no nos gustaba.
|
|
- Usamos gRPC internamente.
|
|
```
|
|
|
|
</div>
|
|
|
|
<div class="mt-4 space-y-2 text-sm text-gray-400">
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-red-400 text-sm">✗</span>
|
|
<div>No dice qué no puede cambiar</div>
|
|
</div>
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-red-400 text-sm">✗</span>
|
|
<div>No captura las alternativas rechazadas ni el por qué</div>
|
|
</div>
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-red-400 text-sm">✗</span>
|
|
<div>No es consultable ni verificable — es prosa</div>
|
|
</div>
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-red-400 text-sm">✗</span>
|
|
<div>No refleja el estado actual — <br> refleja el estado de cuando se escribió</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
La pregunta clave que lanzar al público: ¿cuándo fue la última vez que actualizaste tu README?
|
|
Un README es documentación. Una ontología es un modelo vivo del sistema.
|
|
-->
|
|
|
|
---
|
|
layout: center
|
|
---
|
|
|
|
# La tesis
|
|
|
|
<div class="mt-8 text-center space-y-6">
|
|
|
|
<div class="text-3xl font-semibold text-gray-100">
|
|
La ontología no es para la IA.
|
|
</div>
|
|
|
|
<div class="text-3xl font-semibold text-orange-400">
|
|
Es para ti.
|
|
</div>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-8 text-lg text-gray-400 max-w-2xl mx-auto leading-8">
|
|
Formalizar invariantes, tensiones y estado actual<br>
|
|
te fuerza a saber qué es verdad <em>ahora mismo</em>.
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-6 text-lg text-gray-400 max-w-2xl mx-auto leading-8">
|
|
La IA se beneficia como efecto secundario.<br>
|
|
Opera sobre lo que <em>tú ya clarificaste</em>.
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-8 text-base text-gray-500 max-w-2xl mx-auto border-t border-gray-700 pt-6">
|
|
El valor real: el proceso de <strong class="text-gray-300">escribir la ontología</strong><br>
|
|
es donde te aclaras tú, no la IA.
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
Pausa larga después del primer par de líneas. Dejar que aterrice.
|
|
La gente espera que digas "la IA necesita contexto". La inversión es el punto.
|
|
-->
|
|
|
|
---
|
|
layout: default
|
|
---
|
|
|
|
# Ontología ≠ lista de decisiones
|
|
|
|
<div class="grid grid-cols-2 gap-8 mt-4">
|
|
|
|
<div>
|
|
|
|
**Una lista de decisiones**
|
|
|
|
<div class="mt-3 font-mono text-xs text-gray-400">
|
|
|
|
```text
|
|
- Elegimos Kubernetes
|
|
- Usamos Helm para despliegues
|
|
- PostgreSQL como base de datos primaria
|
|
- gRPC entre servicios internos
|
|
- OAuth2 para autenticación externa
|
|
```
|
|
|
|
</div>
|
|
|
|
<div class="mt-4 text-sm text-gray-500">
|
|
Captura el <em>qué</em>. No captura el <em>por qué</em>,<br>
|
|
las alternativas rechazadas, ni las consecuencias.
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<v-click>
|
|
|
|
**Una ontología**
|
|
|
|
<div class="mt-3 space-y-2 text-sm">
|
|
|
|
<div class="border-l-4 border-blue-400 pl-3 py-1 bg-gray-900 rounded-r">
|
|
<div class="text-blue-300 font-mono text-xs font-semibold">INVARIANTES</div>
|
|
<div class="text-gray-400 text-xs">Lo que no puede cambiar sin decisión explícita y coordinación</div>
|
|
</div>
|
|
|
|
<div class="border-l-4 border-orange-400 pl-3 py-1 bg-gray-900 rounded-r">
|
|
<div class="text-orange-300 font-mono text-xs font-semibold">TENSIONES ACTIVAS</div>
|
|
<div class="text-gray-400 text-xs">Trade-offs que aún no se han resuelto — viven en el sistema ahora mismo</div>
|
|
</div>
|
|
|
|
<div class="border-l-4 border-purple-400 pl-3 py-1 bg-gray-900 rounded-r">
|
|
<div class="text-purple-300 font-mono text-xs font-semibold">ESTADO ACTUAL → DESEADO</div>
|
|
<div class="text-gray-400 text-xs">Dimensiones de madurez. Dónde estás, dónde quieres estar, qué te bloquea</div>
|
|
</div>
|
|
|
|
<div class="border-l-4 border-green-400 pl-3 py-1 bg-gray-900 rounded-r">
|
|
<div class="text-green-300 font-mono text-xs font-semibold">GATES ACTIVAS</div>
|
|
<div class="text-gray-400 text-xs">Condiciones que deben cumplirse antes de cruzar una frontera arquitectural</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-4 text-sm text-gray-300">
|
|
Es un grafo consultable. No prosa.<br>
|
|
<span class="text-gray-500 text-xs">La IA puede leerlo. Tu CI puede verificarlo. Tú puedes razonarlo.</span>
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
La diferencia no es el nivel de detalle — es la estructura.
|
|
Un grafo tiene propiedades que la prosa no tiene: es consultable, verificable, traversable.
|
|
-->
|
|
|
|
---
|
|
layout: default
|
|
---
|
|
|
|
# Ontoref — tres archivos, tres preguntas
|
|
|
|
<div class="grid grid-cols-3 gap-5 mt-6">
|
|
|
|
<div class="border border-gray-700 rounded p-4 bg-gray-900">
|
|
|
|
<div class="text-blue-300 font-mono font-semibold text-sm mb-3">core.ncl</div>
|
|
<div class="text-orange-400 text-xs mb-3 italic">"¿Qué ES este proyecto?"</div>
|
|
|
|
<div class="font-mono text-xs text-gray-400">
|
|
|
|
```text
|
|
invariantes:
|
|
- backend-agnostic-core
|
|
- zero-external-runtime
|
|
|
|
tensiones:
|
|
- formalization vs
|
|
adoption-friction
|
|
- ontology vs reflection
|
|
|
|
prácticas:
|
|
- nickel-as-schema-layer
|
|
- nushell-as-operator
|
|
```
|
|
|
|
</div>
|
|
|
|
<div class="mt-3 text-xs text-gray-600">
|
|
Inmutable sin ADR nuevo.
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="border border-gray-700 rounded p-4 bg-gray-900">
|
|
|
|
<div class="text-orange-300 font-mono font-semibold text-sm mb-3">state.ncl</div>
|
|
<div class="text-orange-400 text-xs mb-3 italic">"¿Dónde ESTAMOS?"</div>
|
|
|
|
<div class="font-mono text-xs text-gray-400">
|
|
|
|
```text
|
|
dimensiones:
|
|
backend-maturity:
|
|
actual: multi-stable
|
|
deseado: all-production
|
|
bloqueador:
|
|
missing-nats-tests
|
|
|
|
nickel-depth:
|
|
actual: schema-input
|
|
deseado: bidirectional
|
|
catalizador:
|
|
export pipeline
|
|
```
|
|
|
|
</div>
|
|
|
|
<div class="mt-3 text-xs text-gray-600">
|
|
Evoluciona con el proyecto.
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="border border-gray-700 rounded p-4 bg-gray-900">
|
|
|
|
<div class="text-green-300 font-mono font-semibold text-sm mb-3">gate.ncl</div>
|
|
<div class="text-orange-400 text-xs mb-3 italic">"¿Cuándo estamos LISTOS?"</div>
|
|
|
|
<div class="font-mono text-xs text-gray-400">
|
|
|
|
```text
|
|
gates:
|
|
core-dependency-gate:
|
|
activa: true
|
|
permeabilidad: Low
|
|
protege:
|
|
- backend-agnostic-core
|
|
|
|
nickel-primacy-gate:
|
|
activa: true
|
|
permeabilidad: Low
|
|
protege:
|
|
- nickel-as-schema-layer
|
|
```
|
|
|
|
</div>
|
|
|
|
<div class="mt-3 text-xs text-gray-600">
|
|
Condiciones de cruce.
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-5 font-mono text-xs text-center text-gray-500">
|
|
Nickel tipado · exportable como JSON · consultable desde Nu · verificable en CI
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
Tres preguntas, tres responsabilidades. La separación es deliberada.
|
|
core.ncl responde al SER. state.ncl al DEVENIR. gate.ncl al CRUZAR.
|
|
Cada uno puede cambiar a ritmos diferentes sin contaminar los otros.
|
|
-->
|
|
|
|
---
|
|
layout: default
|
|
---
|
|
|
|
# Reflection — lo que se CONVIERTE
|
|
|
|
<div class="grid grid-cols-2 gap-8 mt-2">
|
|
|
|
<div>
|
|
|
|
**Ontología = lo que ES**
|
|
|
|
<div class="mt-3 text-sm text-gray-400 space-y-2">
|
|
<div>→ Invariantes — verdad estructural</div>
|
|
<div>→ Tensiones — trade-offs vivos</div>
|
|
<div>→ Estado — dónde estamos ahora</div>
|
|
</div>
|
|
|
|
<div class="mt-5 text-sm font-semibold text-gray-200">Reflection = lo que DEVIENE</div>
|
|
|
|
<div class="mt-3 text-sm text-gray-400 space-y-2">
|
|
<div>→ Modos operacionales — secuencias con DAG de dependencias</div>
|
|
<div>→ ADRs con constraints tipadas — decisiones vivas, no prosa</div>
|
|
<div>→ Backlog estructurado — tensiones → tareas</div>
|
|
<div>→ Historial de sesiones — quién hizo qué y cuándo</div>
|
|
</div>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-5 border-l-4 border-orange-500 pl-4 text-sm text-gray-300">
|
|
La ontología captura el <em>ser</em>.<br>
|
|
La reflection captura el <em>operar sobre ese ser</em>.
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<v-click>
|
|
|
|
|
|
<div class="-mt-3 font-mono text-xs">
|
|
<b>Un modo como especificación ejecutable</b>
|
|
```bash
|
|
# reflection/modes/new_service.ncl
|
|
{
|
|
id = "new_service",
|
|
trigger = "When adding a new service boundary",
|
|
steps = [
|
|
{
|
|
id = "draft-adr",
|
|
actor = "developer",
|
|
action = "Draft ADR for service boundary decision",
|
|
},
|
|
{
|
|
id = "verify-invariants",
|
|
actor = "agent",
|
|
action = "Check no invariant is violated",
|
|
depends_on = [{ step = "draft-adr" }],
|
|
},
|
|
{
|
|
id = "seal-config",
|
|
actor = "developer",
|
|
action = "Apply initial config seal",
|
|
depends_on = [{ step = "verify-invariants" }],
|
|
},
|
|
],
|
|
}
|
|
```
|
|
|
|
</div>
|
|
|
|
<div class="mt-2 text-xs text-gray-500">
|
|
No es un runbook. Es un grafo acíclico tipado.<br>
|
|
La IA lo ejecuta. El sistema lo valida.
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
La dualidad ontología/reflection es la tensión central de ontoref.
|
|
No pueden fusionarse — tienen ritmos de cambio diferentes y audiencias diferentes.
|
|
La reflection sin ontología es procedimiento sin semántica. La ontología sin reflection es diagrama muerto.
|
|
-->
|
|
|
|
---
|
|
layout: default
|
|
---
|
|
|
|
# La IA como actor, no como oráculo
|
|
|
|
<div class="grid grid-cols-2 gap-8 mt-4">
|
|
|
|
<div>
|
|
|
|
**Sin ontología formalizada**
|
|
|
|
<div class="mt-3 font-mono text-xs">
|
|
|
|
```bash
|
|
# Lo que el agente recibe
|
|
"Ayúdame a escalar este servicio"
|
|
|
|
# Lo que el agente asume
|
|
- que puede añadir réplicas libremente
|
|
- que el estado actual es el deseado
|
|
- que no hay restricciones de org
|
|
- que la decisión de diciembre es irrelevante
|
|
|
|
# Lo que genera
|
|
resource "google_compute_instance" {
|
|
count = 5 # razonable, ¿no?
|
|
}
|
|
```
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<v-click>
|
|
|
|
**Con ontología formalizada**
|
|
|
|
<div class="mt-3 font-mono text-xs">
|
|
|
|
```bash
|
|
# Lo que el agente recibe (SessionStart hook)
|
|
INVARIANT: max-replicas-per-zone = 2
|
|
TENSION: scaling vs consistency [unresolved]
|
|
CONSTRAINT (adr-003): no horizontal scaling
|
|
without explicit capacity review
|
|
STATE: backend-maturity = single-stable
|
|
→ desired: multi-stable
|
|
→ blocker: capacity-review-pending
|
|
|
|
# Lo que el agente puede hacer
|
|
- Preguntar si procede dado el bloqueador
|
|
- Generar la config dentro de los límites
|
|
- Indicar que el ADR debe revisarse antes
|
|
```
|
|
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-4 border-l-4 border-green-500 pl-4 text-sm text-gray-300">
|
|
El agente opera sobre lo que tú ya clarificaste.<br>
|
|
<span class="text-gray-500 text-xs">Deja de inventarse contexto porque tú dejaste de tenerlo implícito.</span>
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
El SessionStart hook en ontoref inyecta el contexto ontológico al inicio de cada sesión.
|
|
El agente no es más inteligente — tiene más información real y menos que inventar.
|
|
La mejora no es de la IA. Es tuya: formalizaste algo que antes vivía solo en tu cabeza.
|
|
-->
|
|
|
|
---
|
|
layout: default
|
|
---
|
|
|
|
# ¿Quién mantiene esto actualizado?
|
|
|
|
<div class="mt-4 text-lg text-gray-400 text-center">La pregunta que siempre sale.</div>
|
|
|
|
<div class="grid grid-cols-2 gap-8 mt-6">
|
|
|
|
<div>
|
|
|
|
**El problema real con el README**
|
|
|
|
<div class="mt-3 space-y-2 text-sm text-gray-400">
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-red-400">✗</span>
|
|
<div>Nadie tiene incentivo para actualizarlo —<br> no está en el path crítico</div>
|
|
</div>
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-red-400">✗</span>
|
|
<div>No hay señal de cuando está desactualizado</div>
|
|
</div>
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-red-400">✗</span>
|
|
<div>Actualizar requiere fricción de escritura libre</div>
|
|
</div>
|
|
|
|
<div class="flex items-start gap-2">
|
|
<span class="text-red-400">✗</span>
|
|
<div>No hay verificación — puede divergir silenciosamente</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
<v-click>
|
|
|
|
**El diseño de ontoref**
|
|
|
|
<div class="mt-3 space-y-2 text-sm">
|
|
|
|
<div class="border-l-4 border-blue-400 pl-3 py-1 bg-gray-900 rounded-r">
|
|
<div class="text-blue-300 font-semibold text-xs">Pre-commit como sincronización forzada</div>
|
|
<div class="text-gray-400 text-xs"><code>nickel typecheck</code> en cada commit — la capa declarativa nunca queda rota</div>
|
|
</div>
|
|
|
|
<div class="border-l-4 border-orange-400 pl-3 py-1 bg-gray-900 rounded-r">
|
|
<div class="text-orange-300 font-semibold text-xs">Modos como procedimientos obligatorios</div>
|
|
<div class="text-gray-400 text-xs">Añadir un servicio ejecuta el modo — el ADR se escribe como parte del proceso</div>
|
|
</div>
|
|
|
|
<div class="border-l-4 border-purple-400 pl-3 py-1 bg-gray-900 rounded-r">
|
|
<div class="text-purple-300 font-semibold text-xs">Drift detection</div>
|
|
<div class="text-gray-400 text-xs"><code>sha256(nickel export)</code> — sabes cuándo el estado sellado difiere del actual</div>
|
|
</div>
|
|
|
|
<div class="border-l-4 border-green-400 pl-3 py-1 bg-gray-900 rounded-r">
|
|
<div class="text-green-300 font-semibold text-xs">ADRs como constraints, no prosa</div>
|
|
<div class="text-gray-400 text-xs">El constraint es machine-readable — el CI puede verificarlo, no solo leerlo</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-4 text-xs text-gray-500 border-l-2 border-gray-700 pl-3">
|
|
La ontología se mantiene porque es el path.<br>
|
|
No porque alguien sea disciplinado.
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
Esta es la objeción más honesta del público. Abrazarla, no esquivarla.
|
|
La respuesta no es "la gente debería ser más disciplinada".
|
|
La respuesta es: el sistema lo hace obligatorio, no opcional.
|
|
-->
|
|
|
|
---
|
|
layout: default
|
|
---
|
|
|
|
# Para el debate
|
|
|
|
<div class="grid grid-cols-2 gap-8 mt-6">
|
|
|
|
<div>
|
|
|
|
**Propuesta 1 — Ontología**
|
|
|
|
<div class="mt-4 space-y-4">
|
|
|
|
<div class="border border-gray-700 rounded p-3 bg-gray-900">
|
|
<div class="text-orange-300 text-sm font-semibold">¿No es suficiente con un buen README?</div>
|
|
<div class="text-gray-500 text-xs mt-1">¿Cuándo fue la última vez que el tuyo estaba al día?</div>
|
|
</div>
|
|
|
|
<div class="border border-gray-700 rounded p-3 bg-gray-900">
|
|
<div class="text-orange-300 text-sm font-semibold">¿Qué diferencia una ontología de una lista de decisiones?</div>
|
|
<div class="text-gray-500 text-xs mt-1">Estructura, consultabilidad, verificabilidad.</div>
|
|
</div>
|
|
|
|
<div class="border border-gray-700 rounded p-3 bg-gray-900">
|
|
<div class="text-orange-300 text-sm font-semibold">¿Quién mantiene esto cuando el proyecto cambia rápido?</div>
|
|
<div class="text-gray-500 text-xs mt-1">El diseño lo hace obligatorio, no opcional.</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div>
|
|
|
|
**Propuesta 2 — Infra + IA**
|
|
|
|
<div class="mt-4 space-y-4">
|
|
|
|
<div class="border border-gray-700 rounded p-3 bg-gray-900">
|
|
<div class="text-orange-300 text-sm font-semibold">¿Es diferente a copiar Stack Overflow?</div>
|
|
<div class="text-gray-500 text-xs mt-1">En SO buscabas. Con la IA, delegas también la búsqueda.</div>
|
|
</div>
|
|
|
|
<div class="border border-gray-700 rounded p-3 bg-gray-900">
|
|
<div class="text-orange-300 text-sm font-semibold">¿Dónde está el mínimo de comprensión necesario?</div>
|
|
<div class="text-gray-500 text-xs mt-1">Saber qué no puede romperse. Sin eso, no tienes control.</div>
|
|
</div>
|
|
|
|
<div class="border border-gray-700 rounded p-3 bg-gray-900">
|
|
<div class="text-orange-300 text-sm font-semibold">¿Las plataformas internas resuelven esto o lo esconden?</div>
|
|
<div class="text-gray-500 text-xs mt-1">Una plataforma sin ontología solo mueve la ignorancia un nivel arriba.</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
Open space: las mejores respuestas vendrán del público.
|
|
Tu rol aquí es provocar, no resolver. Lanza las preguntas y deja el silencio.
|
|
-->
|
|
|
|
---
|
|
layout: cover
|
|
name: end
|
|
class: 'justify-center flex flex-cols'
|
|
---
|
|
|
|
<div class="standalone-slide text-shadow-lg text-xl">
|
|
|
|
<div class="text-3xl font-semibold text-gray-100 mb-2">
|
|
La IA puede declarar tu infra.
|
|
</div>
|
|
|
|
<div class="text-3xl font-semibold text-orange-400 mb-8">
|
|
No puede entenderla por ti.
|
|
</div>
|
|
|
|
<v-click>
|
|
|
|
<div class="text-xl text-gray-300 leading-10 max-w-2xl mx-auto">
|
|
La ontología es el modelo que te fuerza a saber qué es verdad ahora.<br>
|
|
La reflection es la operación sobre ese modelo.<br>
|
|
La IA es el actor que opera <em>sobre lo que ya clarificaste</em>.
|
|
</div>
|
|
|
|
</v-click>
|
|
|
|
<v-click>
|
|
|
|
<div class="mt-10 text-2xl text-gray-200">
|
|
Gracias. ¿Preguntas?
|
|
</div>
|
|
|
|
<small class="mt-4 block text-gray-500">jesusperez.pro · ontoref.dev</small>
|
|
|
|
</v-click>
|
|
|
|
</div>
|
|
|
|
<style>
|
|
.standalone-slide {
|
|
text-align: center;
|
|
}
|
|
</style>
|
|
|
|
<Footer />
|
|
|
|
<!--
|
|
Cierre lento. Las tres líneas son la síntesis completa.
|
|
No terminar con "ontoref es la solución" — terminar con la inversión cognitiva.
|
|
El punto no es adoptar ontoref. El punto es tomar posesión de tu propio modelo.
|
|
-->
|