990 lines
24 KiB
Markdown
990 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.
|
||
|
|
-->
|