WQuestions

Parte VI · IA, futuro y cierre

28

La prueba reflexiva

La carga más exigente no es modelar otro dominio: es pedirle al modelo que se describa a sí mismo. Si las preguntas son universales, también la maquinaria que las procesa debería poder expresarse en preguntas.

Imagina una pantalla partida en dos. A la izquierda, una aplicación de gestión cualquiera: un menú lateral, un formulario de venta con sus campos, una grilla con los últimos registros. Nada que un programador no haya construido cien veces. A la derecha, en un panel angosto, una lista que crece a cada clic: ventaO tiene_campo campo_venta_montoO, y debajo otra, y otra. Ese panel no describe la aplicación: es la aplicación. Cada opción del menú, cada campo del formulario, cada columna de la grilla que ves a la izquierda existe porque a la derecha hay una tripleta que lo afirma. Lo que estás mirando es un programa hecho enteramente de hechos WQuestions, y a su lado, los hechos que lo sostienen.

A lo largo de este libro hemos apretado WQuestions desde muchos ángulos. Lo apretó el lenguaje, con sus nominalizaciones y sus modismos, en el capítulo 15. Lo apretaron ocho dominios que no se parecen en nada, del spa a la operación minera. Lo apretó un sistema de verdad, en producción, cuando hicimos arqueología del yaku. Y lo apretaron, a propósito, cuatro dominios incómodos elegidos para que crujiera. Todas esas presiones tienen algo en común: vienen de fuera. El modelo describe un mundo (ventas, pacientes, partidos, contratos) y la pregunta es si el mundo cabe en sus siete ejes.

Queda una presión más, y es la más exigente de todas: pedirle al modelo que se describa a sí mismo. No modelar un dominio externo, sino construir una herramienta (un programa con menús, formularios, tipos de dato y reglas de comportamiento) cuya estructura, cuyos tipos y cuya conducta sean, ellos mismos, hechos WQuestions. Si la tesis del libro es cierta, si las preguntas son la base universal de la información, entonces la propia maquinaria que manipula información tendría que poder expresarse en esas preguntas. Este capítulo cuenta qué pasó cuando lo intentamos. No venimos a presumir de una varita mágica; venimos, como en el capítulo 15, con honradez: a mostrar qué aguantó, qué se dobló para aguantarlo y qué quedó al descubierto.

La prueba reflexiva

Un modelo de la información merece confianza cuando es capaz de describirse con sus propios medios. Si los ejes, los predicados, las signaturas y el esquema de la herramienta viven como tripletas dentro del mismo grafo que todo lo demás, el modelo deja de ser una teoría aplicada a los datos y pasa a ser datos él mismo.

Una aplicación hecha de preguntas

Construimos, sobre el prototipo, una pequeña aplicación de gestión: un menú navegable, formularios para dar de alta y editar, grillas para consultar, y entidades de negocio (personas, productos, ventas, compras) con sus campos. Lo decisivo no es la aplicación; es de qué está hecha. Cada opción del menú, cada campo de cada formulario, cada tipo de dato, cada relación entre entidades y cada acción que el programa ejecuta es una tripleta (sujeto, rol, valor) en un único grafo.

El menú es un objeto reificado que tiene_opcion a otros objetos; cada opción tiene_accion una acción; cada acción es instancia_de un verbo (mostrar_texto, abrir_formulario, abrir_grilla, guardar) que un evaluador genérico interpreta. El esquema de una entidad también es dato: la entidad tiene_campo a descriptores que declaran su etiqueta, su tipo_dato y su orden. Un registro es un individuo instancia_de su tipo, con un hecho por campo. No hay, en ninguna parte, una tabla venta con columnas fijas ni una clase Formulario con atributos cableados. Hay hechos, y un motor que los lee.

tripletas · el menú es dato
(menu_principal, instancia_de, menu)             ∈ M(O, K)
(menu_principal, tiene_opcion, opcion_ventas)    ∈ M(O, O)
(opcion_ventas,  etiqueta,     "Ventas")         ∈ M(O, K)
(opcion_ventas,  tiene_accion, abrir_grilla_venta) ∈ M(O, O)
(abrir_grilla_venta, instancia_de, abrir_grilla) ∈ M(O, K)
(abrir_grilla_venta, sobre,        venta)         ∈ M(O, K)

La consecuencia se ve en la pantalla del propio programa, en ese panel de la derecha que abrió el capítulo: al lado de cada vista, un inspector muestra las tripletas que la sostienen. Lo que ves es, literalmente, lo que hay en el grafo. La interfaz no es una capa que traduce una base de datos a botones; es una proyección directa de los hechos.

Lo que ves en la pantalla es, sin intermediarios, lo que hay en el grafo.El principio del inspector

EL MODELO SE DESCRIBE CON SUS PROPIOS EJES Q O N K T L instancia_de concepto: «eje» el grafo contiene su propia descripción lexicon · predicados también son tripletas
Figura 28.1. El modelo reflejándose a sí mismo. Cada uno de los siete ejes es, a su vez, una instancia_de el concepto «eje» (una clase del eje K), y el lexicon y los predicados viven como tripletas en el mismo grafo. La flecha de trazos que regresa sobre el anillo es la reflexión: el grafo contiene su propia descripción.

La prueba reina

Toda la apuesta se puede resumir en una sola operación. Si la estructura y el comportamiento son de verdad datos, entonces agregar estructura debería costar insertar hechos, no escribir código. Esa es la prueba reina: ¿cuánto cuesta agregar un campo nuevo a una entidad que ya existe?

Lo medimos en vivo, con el sistema corriendo, agregando el campo «Documento» a la entidad venta. Estas son las tripletas que insertamos, y nada más:

tripletas · campo nuevo = 5 hechos
(campo_venta_documento, instancia_de, campo)   ∈ M(O, K)
(venta, tiene_campo, campo_venta_documento)    ∈ M(K, O)
(campo_venta_documento, tipo_dato, texto)      ∈ M(O, K)
(campo_venta_documento, orden, 5)              ∈ M(O, N)
(campo_venta_documento, rol, documento)        ∈ M(O, K)

Cinco tripletas. Ninguna línea de código en el motor, en el servidor ni en la interfaz. Al recargar, el formulario dibujó el campo, la grilla le sumó la columna y el guardado lo persistió, porque las tres operaciones leen el esquema del grafo en lugar de conocerlo de antemano. Ese número (cinco hechos, cero código) es el resultado central del experimento, y la confirmación más limpia de la primera mitad de la tesis: la estructura es dato.

Sistema convencional

Agregar el campo «Documento» toca cinco lugares, y cada uno necesita código:

  • ALTER TABLE venta (migración)
  • ↳ atributo en el modelo del servidor
  • ↳ campo en la plantilla del formulario
  • ↳ columna en la grilla
  • ↳ validación y serialización en la API

5 archivos · despliegue nuevo

WQuestions reflexivo

El mismo campo, como hechos en el grafo. Sin tocar el motor:

O campo_venta_documento · instancia_de campo K venta · tiene_campo K tipo_dato · texto N orden · 5 K rol · documento

5 tripletas · 0 líneas de código

Figura 28.2. La prueba reina, antes y después. A la izquierda, el campo nuevo se reparte en cinco archivos y exige un despliegue. A la derecha, es un puñado de hechos que el motor ya sabe leer. El color de cada hecho marca el eje de su valor.

Lo que la carga confirmó

Más allá del número, el experimento puso a prueba tres ideas que el libro había defendido en abstracto. Las tres aguantaron en concreto.

El comportamiento también es dato

Una y otra vez, a lo largo del libro, apareció la figura del evaluador externo: el motor que recorre el grafo y ejecuta lo que los hechos prescriben, separado del grafo, que solo almacena. Aquí ese evaluador dejó de ser una promesa y pasó a ser código que corre: un despachador genérico que, dado un verbo (un tipo del eje K), ejecuta la conducta asociada.

python · el despachador no conoce dominios
def ejecutar(self, accion):
    """El motor no sabe qué es 'venta' ni 'compra'.
    Lee el verbo de la acción y delega en el manejador del verbo."""
    verbo = self.grafo.objeto(accion, "instancia_de")     # p.ej. abrir_grilla
    manejador = self.verbos[verbo]                          # tabla genérica
    objetivo = self.grafo.objeto(accion, "sobre")          # p.ej. venta
    return manejador(objetivo)                              # nada cableado

# Agregar la transacción "compras" no toca este código:
# basta declarar el verbo, la entidad y sus campos como hechos.

Agregar una transacción entera nueva («compras», hermana de «ventas») costó esencialmente datos, no motor. El comportamiento vive en el grafo y se interpreta desde afuera, tal como el modelo prometía.

El grafo compartido cae solo

El capítulo 1 abrió con la torre de Babel: cada sistema con su esquema, incapaz de hablar con el de al lado. El antídoto del libro es un único piso de hechos donde las entidades se reúsan. Lo comprobamos modelando «cliente» y «proveedor» no como tipos distintos, sino como roles contextuales: el nombre del campo en la venta o en la compra. Es la agencia contextual de la decisión D5 en acción.

anaQ clienteM(O→Q) venta_204O
anaQ proveedorM(O→Q) compra_57O

La misma persona, ana, es cliente de una venta y proveedora de una compra sin duplicarse: un solo individuo, dos papeles según el contexto. El anti-Babel no fue una aspiración que hubo que forzar; cayó solo en cuanto dejamos de modelar el rol como un tipo.

La vigencia es la forma natural del «editar»

La edición de un dato se implementó sin borrar nada: editar un valor es asentar un hecho nuevo y leer el más reciente. Es bitemporalidad en miniatura (la vigencia de la decisión D6): historial gratis, ninguna sobreescritura destructiva. Y resultó ser la forma natural de implementar el «update» de un CRUD, no un agregado teórico que hubo que justificar.

Tres promesas, cobradas

El evaluador externo, el grafo compartido y la bitemporalidad eran, hasta aquí, decisiones de diseño defendidas sobre la pizarra. El experimento reflexivo las cobró las tres a la vez, en un solo programa pequeño: comportamiento que se interpreta, entidades que se reúsan por contexto y un historial que aparece sin esfuerzo.

La auto-corrección: instancia_de pasa a V→K

El experimento no solo validó: forzó una corrección del prototipo, y vale la pena contarla, porque es el método del libro operando sobre sí mismo. Para clasificar a una persona (decir «Ana es un cliente») hace falta el hecho (ana, instancia_de, cliente). Pero ana vive en el eje Q, es un agente, y el prototipo había restringido instancia_de a sujetos del eje O. La carga reveló la contradicción de inmediato.

Lo irónico es que este mismo libro, en el capítulo 3, ya escribía sin parpadear hechos como estos:

tripletas · clasificar es universal
(vendedor_17,    instancia_de, profesion_vendedor) ∈ M(Q, K)
(municipalidad_centro, instancia_de, organizacion) ∈ M(Q, K)
(tienda_central, instancia_de, punto_de_venta)     ∈ M(L, K)
(camiseta_88,    instancia_de, camiseta)           ∈ M(O, K)

Sujetos en Q, en L, en O: la teoría siempre supuso que clasificar es una operación universal. El prototipo estaba, sencillamente, detrás de su propia teoría. La corrección fue generalizar instancia_de de O→K a V→K, donde V es un comodín que significa «cualquier eje de valor».

El comodín V

V denota cualquiera de los seis ejes de valor (Q O L T N K), por oposición al eje estructural M de los predicados. Una signatura V→K dice: «el sujeto puede ser un individuo de cualquier eje de valor, y el objeto es una clase». Es la forma de declarar que una operación (como clasificar) no pertenece a un eje particular.

Ese comodín no resuelve solo este caso. Es exactamente el mecanismo que el capítulo 30 reclama para relajar otras signaturas demasiado estrechas (pensemos en paciente o partes, hoy fijadas a O→Q cuando deberían admitir O→V). La fricción, sometida a carga, no abrió un agujero en el modelo: lo empujó a alinearse con lo que ya afirmaba.

La presión no abrió un agujero en el modelo: lo empujó a alinearse con lo que ya afirmaba.Sobre la auto-corrección

Las fricciones nuevas: dos cerradas, una abierta

La presión reflexiva destapó tres fronteras que los ocho dominios industriales no habían tocado. Dos las cerramos dentro del mismo experimento; la tercera quedó señalada como trabajo pendiente.

El texto libre. Los siete ejes son semánticos, no tipos primitivos: no existe un eje «string». Un nombre como «Ana», el contenido de un mensaje, el número de un documento (texto arbitrario) no tienen casa propia. La decisión, fiel a la teoría, fue alojar el texto libre como un literal en K, minteado y único, con su valor en la etiqueta y una marca que lo distingue de una categoría controlada. Así, dos personas llamadas «Ana» no terminan compartiendo un mismo individuo.

El catálogo como dato. El catálogo canónico tipa con fuerza el núcleo del modelo, pero los campos que el usuario define como datos pasaban sin validar, bajo política liberal. La carga lo expuso: el tipado del esquema vivía a medias en el código. Lo cerramos haciendo que cada campo derive su signatura de sus propios datos (dominio del eje de la entidad, rango de su tipo_dato) y la registre en el catálogo. Escribir en un campo dinámico ahora se valida como un rol canónico.

Literal en K · categoría controlada en K

Dos cosas conviven en el eje K y conviene no confundirlas:

Literal

Texto arbitrario. Minteado y único: cada «Ana» es su propio nodo. No se comparte ni se reúsa entre sistemas.

Categoría controlada

Vocabulario cerrado (unidades monetarias, estados de un trámite). Es una clase nombrada y compartida; el mismo nodo vale para todos.

El catálogo canónico es invisible para el usuario final (es el lexicon su interfaz, como fija la decisión D8), pero la carga reflexiva lo obligó a abarcar también lo que el usuario crea sobre la marcha. El tipado dejó de vivir en Python y pasó a vivir en el grafo:

tripletas · el campo declara su propia signatura
(rol_documento, dominio, O)        ∈ M(K, K)
(rol_documento, rango,   K)        ∈ M(K, K)
(rol_documento, etiqueta_en, "Documento") ∈ M(K, K)
# el motor valida el guardado leyendo estas tres tripletas:
# venta (O) escribe documento (K) → coincide con dominio O, rango K → válido

El humano. Queda en pie la tercera frontera, y no es del modelo, sino del lector. Cuando todo es (sujeto, rol, valor), se pierde el andamiaje de tablas y formularios con nombre que normalmente carga el significado. El poder de la abstracción reflexiva tiene un peaje cognitivo. El inspector («lo que ves es lo que hay») re-concreta lo suficiente para no ahogarse, pero la pieza que falta es hacer de las vistas y proyecciones con nombre ciudadanas del grafo: datos, no accidente de la interfaz. Es trabajo pendiente, y reaparece como tal en el capítulo que sigue.

La frontera que no cerramos

Un sistema donde todo es una tripleta gana en uniformidad lo que pierde en asideros. El programador acostumbrado a una tabla venta con columnas a la vista tiene, de pronto, solo hechos. La re-concreción (darle nombre y forma a las vistas, dentro del propio grafo) no es un lujo cosmético: es lo que vuelve usable un modelo que, por construcción, disuelve las categorías familiares.

Honradez intelectual

Conviene nombrar el vértigo, porque es un hallazgo y no un defecto del lector. Un modelo capaz de describirse a sí mismo es, por construcción, mareante: en el límite no hay «tablas» ni «pantallas», solo preguntas sobre preguntas. ¿Qué es un campo? Una clase. ¿Qué es esa clase? Una instancia del concepto «campo». ¿Y ese concepto? Otro nodo del grafo, descrito por más tripletas. La torre no tiene fondo, y al principio eso desconcierta.

Pero ese mareo no invalida la propuesta; la confirma. Y, al mismo tiempo, explica por qué un modelo así necesita prosa, ejemplos y una capa de re-concreción para que las personas puedan usarlo. Es, en el fondo, la razón de ser de este libro: el grafo es operable; el texto es lo que lo vuelve comprensible.

Que el modelo pueda describir su propia herramienta es la evidencia más fuerte que el prototipo produjo. Más que ocho dominios distintos, es el modelo hablando de sí mismo sin salirse de sus siete ejes: corrigiéndose cuando una signatura quedó corta, absorbiendo como datos lo que un sistema convencional cablearía en código, y midiendo su propia ambición en un número limpio (cinco hechos, cero líneas).

El saldo de la prueba reflexiva

La primera mitad de la tesis (estructura y comportamiento son datos) queda saldada, y medida. Lo que sigue es la otra mitad: el inventario de lo que todavía falta para que esto deje de ser un prototipo y se vuelva infraestructura de uso diario. Antes de ese inventario, sin embargo, hay una pregunta que un grafo compartido vuelve urgente: si todos los hechos viven en un mismo piso, ¿quién puede ver —y preguntar— qué?

A esa pregunta (la seguridad y la privacidad del grafo compartido) dedicamos el próximo capítulo. Y al inventario de lo pendiente, el siguiente.