ontoref/assets/presentation/intro_slides.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

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