WQuestions

Parte VI · IA, futuro y cierre

28

El grafo como lienzo del futuro

La misma estructura que guarda lo que pasó sirve para ensayar lo que podría pasar. Y la explicación de por qué podría pasar no hay que añadirla después: viene puesta.

La planificadora de mina tiene sobre la mesa una decisión de las que no admiten empate. El camión 007 necesita mantenimiento mayor.

Puede pararlo en junio y perder una semana de producción con el precio alto. O estirarlo hasta agosto y aceptar que llegue más gastado a los meses buenos.

Ninguna opción es obviamente correcta. Lo único claro es que se decide esta semana.

Es la clase de pregunta que en cualquier operación seria termina en una hoja de cálculo hecha a mano. Alguien la guarda en su carpeta, nadie más la entiende y dentro de seis meses no se podrá auditar.

Cuando el trimestre cierre mal, la pregunta será por qué se decidió lo que se decidió. Y la respuesta vivirá en la memoria de dos personas.

Este capítulo sostiene que el grafo puede alojar esa decisión entera, con su cálculo, sus supuestos y su rastro, sin construir un simulador aparte.

Un simulador necesita tres cosas: un estado de partida, una regla que lo transforme y un estado proyectado. Las tres caben en lo que ya has leído.

No hace falta ningún mecanismo nuevo, y eso se puede comprobar. Al final del capítulo aparece la cuenta exacta de cuánto vocabulario nuevo hizo falta.

La cadena que ya sabes recorrer

Vuelve un momento al peor instante de aquel capítulo. Son las 23:40, una roca se desprende de la pared del Banco 04 y golpea al operador Quispe.

La auditoría pregunta qué causó el accidente y el grafo responde recorriendo causado_por hacia atrás. El accidente vino del desprendimiento, y el desprendimiento de un debilitamiento que la inspección geomecánica debió detectar.

Tres nodos, dos cables, ningún culpable.

Ahora fíjate en lo que hace la planificadora. Parte de una intervención que todavía no ha ocurrido, el mantenimiento de junio, y quiere saber qué se seguiría de ella. Es el mismo recorrido. Los mismos cables. La única diferencia es el sentido de la marcha.

El auditor recorre las causas hacia atrás. El planificador recorre las mismas hacia adelante.La tesis del capítulo

Conviene detenerse aquí, porque es lo que hace innecesario el simulador aparte.

Un motor de simulación convencional construye su propio universo de objetos, corre el escenario en memoria y devuelve números. Lo que ocurrió por dentro se pierde, o sobrevive en un registro que nadie diseñó para consultarse.

Si preguntas seis meses después por qué el modelo proyectó esa caída de producción, tienes el número y no tienes el porqué.

Aquí el porqué se escribe en el mismo acto de proyectar. Proyectar consiste en escribir hechos, y un hecho proyectado cuelga de su causa por el mismo cable que cualquier otro.

La trazabilidad no es una función del simulador. Es un efecto secundario de no haber construido uno.

Lo que ocurrió · capítulo 23 debilitamiento pared del Banco 04 causado_por desprendimiento 23:40 · sin agente causado_por accidente paciente: Quispe el auditor pregunta «¿por qué pasó?» y lee en esta dirección hoy · 20 de mayo Lo que podría ocurrir · este capítulo sim_mant_junio 1 de junio · proyectado causado_por sim_prod_jul_junio 41.360 t · vigente en julio el planificador pregunta «¿qué pasaría?» y lee en esta dirección, sobre el mismo tipo de cable
Figura 28.1. El mismo cable, dos sentidos de lectura. Arriba, la cadena real del accidente: la auditoría entra por el daño y remonta hasta la causa raíz. Abajo, la cadena proyectada: la planificación entra por la intervención y desciende hasta su consecuencia. Los recuadros de trazo discontinuo marcan lo que aún no ha ocurrido. Nada distingue a un cable del otro, y por eso la función que recorre uno recorre el otro sin cambiar una línea.

El escenario es una entidad

La primera pregunta práctica es dónde se guardan dos futuros incompatibles sin que se mezclen ni ensucien lo que de verdad pasó.

Una respuesta tentadora es apoyarse en el tiempo. Si el modelo lleva dos relojes, uno para lo que era cierto y otro para lo que el sistema sabía, quizá el segundo baste para separar los mundos.

No basta, y conviene decir por qué. Dos relojes dan dos lecturas de una historia. No la ramifican.

Puedes preguntarle a ese sistema qué creía en marzo y qué era cierto en marzo. No puedes pedirle que sostenga cuatro marzos alternativos a la vez. Los relojes no se bifurcan.

Lo que sí se bifurca es el grafo. El escenario se convierte en una entidad con identidad propia en O, y cada hecho proyectado cuelga de ella por parte_de.

Es la decisión D4 aplicada a la simulación misma. Algo recibe identidad cuando la necesita, y un escenario la necesita porque hay que poder nombrarlo, compararlo y descartarlo.

tripletas
(escenario_junio,  instancia_de,     escenario)              ∈ M(O, K)
(escenario_junio,  agente,           minera_andes)          ∈ M(O, Q)   # quién lo mandó calcular
(escenario_junio,  objeto_de,        camion_007)            ∈ M(O, O)   # sobre qué decide
(escenario_junio,  justificado_por,  regla_desgaste_camion) ∈ M(O, O)   # con qué lógica

(sim_mant_junio,     parte_de, escenario_junio)             ∈ M(O, O)
(sim_prod_jul_junio, parte_de, escenario_junio)             ∈ M(O, O)

Fíjate en lo que esto compra. Separar las ramas deja de ser cuestión de fechas y pasa a ser cuestión de forma.

Los hechos de junio cuelgan de un nodo y los de agosto de otro, así que no pueden contaminarse aunque hablen del mismo camión, del mismo mes y de la misma tonelada. Caben dos escenarios y caben cuarenta, sin que el modelo note la diferencia.

Lo que gana el escenario al ser una entidad

  • Se puede nombrar. «El escenario de junio» es un identificador, no una convención en la cabeza de quien lo calculó.
  • Admite hechos sobre sí mismo. Quién lo encargó, con qué regla, sobre qué activo. Todo eso son tripletas corrientes que cuelgan del nodo del escenario.
  • Se descarta sin borrar nada. Un escenario rechazado se deja de consultar. Sigue ahí, con su fecha y su lógica, para cuando alguien pregunte qué se consideró y se desechó.

Proyectar es fechar hacia adelante

Resuelto dónde vive un futuro, queda cómo se escribe. Y la respuesta decepciona de tan simple: un hecho proyectado es un hecho normal con la vigencia puesta más adelante.

La decisión D6 nunca dijo que el rango [inicio, fin) tuviera que caer en el pasado. Si lo pones en julio, el hecho existe en el grafo desde que lo escribes y solo entra en vigencia en julio.

La consecuencia es que la consulta «en el momento T», la que el capítulo 27 usaba para reconstruir lo que sabía un directorio en noviembre, sirve igual para leer un futuro. Es la misma llamada. Cambia la fecha.

python
# El hecho proyectado se escribe hoy y rige en julio
u.assert_fact(prod, "monto",
              n(41360.0, "toneladas", "n_prod_escenario_junio"),
              valid_from=d(2026, 7, 1), valid_to=d(2026, 8, 1))

# Leído hoy, el hecho no está vigente:
u.facts_about(prod, at=AHORA)
#   ['causado_por', 'instancia_de', 'instrumento', 'lugar_de', 'momento', 'parte_de']

# Leído en julio, aparece — junto con la disponibilidad que lo explica:
u.facts_about(prod, at=JULIO)
#   ['causado_por', 'disponibilidad', 'instancia_de', 'instrumento',
#    'lugar_de', 'momento', 'monto', 'parte_de']

Lo que no aparece en esa salida importa tanto como lo que aparece.

Los roles estructurales del hecho proyectado (de qué escenario es parte, con qué instrumento, en qué lugar, por qué causa) están vigentes desde el primer día, porque describen el escenario y no el futuro. Solo las magnitudes esperan su turno.

Puedes inspeccionar el armazón de una proyección sin que sus números ensucien ninguna consulta del presente.

La regla también es un hecho

Falta la pieza del medio. Un estado de partida y otro proyectado no hacen una simulación: falta la lógica que lleva de uno a otro.

Y esa lógica suele ser lo primero que se pierde. Vive en una fórmula de hoja de cálculo, en una constante dentro de un script, en el criterio de un ingeniero que se jubiló.

En este dominio la lógica cabe en una frase: cada mes que se difiere el mantenimiento cuesta un punto y medio de disponibilidad. Escríbela como entidad y deja de ser un supuesto tácito.

tripletas
(regla_desgaste_camion, instancia_de, regla_de_negocio)  ∈ M(O, K)
(regla_desgaste_camion, tasa,         1.5 pp_por_mes)    ∈ M(O, N)   # vigente desde 2026-01-01
(regla_desgaste_camion, objeto_de,    camion_007)        ∈ M(O, O)

(camion_007, capacidad_mensual, 44000 toneladas)         ∈ M(O, N)

Con la regla en el grafo, la aritmética del escenario se puede auditar sin salir de él.

El camión mueve 44.000 toneladas al mes a plena disponibilidad. Parándolo en junio llega a julio al 94,0 %, y 44.000 por 0,94 da 41.360 toneladas. Difiriéndolo hasta agosto acumula dos meses de castigo, tres puntos, y julio cae a 91,0 %: 40.040 toneladas.

La diferencia entre los dos futuros es de 1.320 toneladas. Con la ley de 8,6 gramos por tonelada del capítulo 23, unas 365 onzas de oro fino.

Ahora la planificadora y su gerencia discuten sobre un número que cualquiera puede rehacer y sobre una tasa de desgaste que cualquiera puede cuestionar. Que es exactamente donde debería estar la discusión.

Quién multiplica

Esta multiplicación la hace el grafo. El motor de derivación lee la regla, opera respetando las unidades y escribe el resultado con su calculado_de puesto. Es como se calcula el oro fino del capítulo 23.

Le falta la mitad condicional. Derivar una magnitud de otras, sí. Disparar una regla cuando se cumplen ciertas condiciones, todavía no. Esa mitad es el Frente 1 del capítulo 31.

Un hecho proyectado no tiene autor

Al escribir el ejemplo de este capítulo apareció una fricción que vale más que cualquier párrafo teórico.

El primer intento registraba la producción proyectada poniendo al camión como agente. El catálogo lo rechazó: la firma de agente exige un individuo en Q, y el camión vive en O.

El rechazo tenía razón, y por un motivo más interesante que el error de eje. En el capítulo 23 el camión nunca fue agente: era el instrumento con el que un operador extraía mineral.

Pero al proyectar julio, ¿quién es el operador? Ninguno. Nadie ha conducido todavía ese camión en julio. La extracción proyectada no tiene autor porque no ha ocurrido.

Y esa figura ya existía en el libro. Es la del desprendimiento de roca: un evento que ocurre sin que nadie lo ejecute, y que la decisión D5 admite porque la agencia la fija el verbo y no una casilla obligatoria.

Lo que se diseñó para registrar que una roca cae sin culpable sirve, sin tocar nada, para registrar que una tonelada se extraerá sin que nadie la haya extraído aún.

tripletas
(sim_prod_jul_junio, instancia_de, accion_extraer_mineral) ∈ M(O, K)
(sim_prod_jul_junio, instrumento,  camion_007)             ∈ M(O, O)
(sim_prod_jul_junio, lugar_de,     tajo_norte)             ∈ M(O, L)
(sim_prod_jul_junio, causado_por,  sim_mant_junio)         ∈ M(O, O)
# no hay tripleta `agente`: nadie ha extraído todavía estas toneladas

(escenario_junio, agente, minera_andes)                    ∈ M(O, Q)
# la agencia está aquí: alguien mandó calcular este futuro

La agencia no desaparece. Se muda. El hecho proyectado no tiene autor, pero el escenario sí: alguien encargó ese cálculo, y esa responsabilidad queda escrita un nivel más arriba.

Es la distinción que un comité de inversiones necesita y que una hoja de cálculo nunca hace. Nadie produjo esas toneladas. Alguien, con nombre, afirmó que se producirían.

Comparar dos futuros es una consulta

Con los dos escenarios escritos, compararlos no exige maquinaria. Recorres los hechos que cuelgan de cada nodo, lees el rol que te interesa en la fecha que te interesa y restas.

Comparar escenarios, que en un simulador convencional es una función del motor, aquí es una consulta más.

text
✓  D4: cada escenario contiene solo lo suyo (aislamiento estructural)
     junio=['sim_mant_junio', 'sim_prod_jul_junio'] · agosto=['sim_mant_agosto', 'sim_prod_jul_agosto']
✓  Comparar dos futuros es una consulta, no una función del motor
     junio=41,360 t · agosto=40,040 t · diferencia=1,320 t
✓  La regla está en el grafo y da cuenta de la diferencia proyectada
     tasa=1.5 pp/mes · 2 meses diferidos → 94.0 % − 91.0 % = 3.0 pp
✓  Ningún hecho real se modificó (almacén append-only)
     172 hechos reales intactos + 40 proyectados

La última línea es la que da tranquilidad para usar esto en producción. Simular añadió cuarenta hechos y no tocó ninguno de los ciento setenta y dos que ya estaban.

El presente del camión, consultado el 20 de mayo, devuelve los mismos cinco roles antes y después de haber proyectado dos futuros sobre él.

camion_007 estado: operativo capacidad: 44.000 t/mes 5 hechos vigentes · intactos objeto_de objeto_de escenario_junio agente: minera_andes sim_mant_junio 1–8 de junio sim_prod_jul_junio 94,0 % · 41.360 t escenario_agosto agente: minera_andes sim_mant_agosto 1–8 de agosto sim_prod_jul_agosto 91,0 % · 40.040 t 1.320 t ≈ 365 oz Las dos ramas hablan del mismo camión y del mismo julio, y no se tocan.
Figura 28.2. Dos futuros colgando del mismo presente. El camión conserva sus hechos reales en el centro, sin alteración: los escenarios apuntan hacia él por objeto_de, no al revés, así que ninguna proyección lo modifica. Cada rama agrupa sus hechos bajo su propio nodo, y de ahí viene el aislamiento. Añadir un tercer escenario, o un décimo, es añadir otro recuadro sin tocar los anteriores.

Un escenario también puede ser un disparate

Nada de lo anterior impide proyectar una tontería. Si el modelo de desgaste se teclea mal y la disponibilidad de julio sale al 140 %, el escenario se guarda con la misma docilidad que uno sensato.

El almacén es de mundo abierto, y eso no va a cambiar. Es lo que permite modelar un yacimiento sin pedirle permiso a nadie.

Lo que sí se puede es declarar qué no debería pasar. La forma que acota la disponibilidad es la del capítulo 5, y aquí gana un matiz propio: un escenario se valida en la fecha en la que regiría, no hoy.

Preguntar hoy por un hecho de julio no tiene sentido, porque hoy ese hecho todavía no rige.

python
u.validate(momento=D(5, 20))   # hoy
#   []  — el hecho proyectado aún no rige; no hay nada que juzgar

u.validate(momento=D(7, 15))   # en julio, cuando el escenario manda
#   [sim_prod_jul: 140 K:Porcentaje por encima del máximo 100 K:Porcentaje]

La vigencia deja de ser solo un mecanismo de archivo y se vuelve el eje de la comprobación. Es la misma D6 que hacía invisible el hecho proyectado, trabajando ahora del otro lado. Si un hecho no rige, tampoco se le exige nada.

Y el escenario disparatado sigue ahí. No se rechazó, no se borró: quedó marcado. Un planificador puede listar los escenarios con violaciones abiertas antes de llevarlos al comité, que es exactamente el momento en que uno quiere enterarse.

Cuánto vocabulario nuevo hizo falta

Queda por saldar la afirmación del principio. Simular, se dijo, no exige un mecanismo nuevo. Es una afirmación medible: basta contar los roles que la simulación usó y ver cuántos ya existían.

text
✓  Simular no exigió ningún mecanismo nuevo
     14 roles: 9 canónicos ['agente', 'causado_por', 'instancia_de', 'instrumento',
                            'justificado_por', 'lugar_de', 'momento', 'monto', 'parte_de']
              · 5 de dominio ['capacidad_mensual', 'disponibilidad', 'estado',
                              'objeto_de', 'tasa']

Nueve de los catorce son roles del catálogo, los mismos que sostienen una venta, un viaje en taxi o una consulta clínica.

Los otros cinco son roles de dominio que el modelo admite sin declararlos, y ninguno es un mecanismo. estado y objeto_de ya se usaban en el capítulo 23, y los tres restantes nombran magnitudes de camión minero, no piezas de simulación.

No hubo que enseñarle al modelo a simular. Hubo que fecharle los hechos más adelante.El resultado del experimento

Lo que queda escrito

Vuelve a la planificadora del principio. Decida junio o agosto, dentro de seis meses el grafo responderá tres preguntas que hoy suelen quedar en el aire: qué se proyectó, con qué regla y quién lo encargó.

Los dos escenarios seguirán ahí, el elegido y el descartado, con sus números y su lógica intactos.

Eso es más de lo que suena. Un sistema que solo guarda decisiones tomadas pierde la mitad de la historia, porque la mitad interesante son las opciones que se consideraron y se dejaron pasar.

Un grafo que aloja escenarios guarda las dos mitades con la misma estructura y sin esfuerzo extra.

El capítulo 27 mostró lo que se vuelve posible cuando el pasado está bien escrito. Este añade que el futuro se escribe con los mismos cables, y que su explicación viene incluida porque nunca se separó del dato.

El siguiente aprieta más la tuerca. En lugar de proyectar un yacimiento, el modelo se describirá a sí mismo.