Skip to content

0.6.0 — Oracle contesta por MCP, y la respuesta lleva sus premisas

Latest

Choose a tag to compare

@Brianholl Brianholl released this 06 Sep 02:15
· 7 commits to main since this release

0.6.0 — Oracle contesta por MCP, y la respuesta lleva sus premisas

Nueve commits desde 0.5.0. Sube únicamente la distribución:

VERSION_DISTRIBUCION   0.5.0 → 0.6.0     el paquete y sus ejecutables
VERSION_ALGEBRA        0.6   → 0.6       lo que una medida SIGNIFICA
VERSION_SINTAXIS       0.2   → 0.2       cómo se ESCRIBE

Las tres versiones: qué sube y por qué

  • Distribución (0.5.0 → 0.6.0): sube porque el paquete incorpora el servidor
    oracle-mcp, sus tres herramientas, su contrato y sus pruebas de punta a punta.
  • Álgebra (0.6): no sube. MCP consulta, evalúa y desafía medidas mediante el álgebra que ya
    existía; no agrega un nodo, operador, agregado, escalar ni relación de traza a la forma canónica.
  • Sintaxis (0.2): no sube. El lector no aprende ninguna palabra, cláusula ni separación
    nueva, y ninguna forma aceptada cambia de significado o deja de aceptarse.

Resumen de los commits del corte

  • Se documentó que actualizar Oracle puede vencer un fixture diferencial y exigir regenerarlo
    antes de mutar (5de7f21).
  • oracle contexto dejó de convertir un catálogo ilegible en «cero medidas», pasó a usar el
    catálogo efectivo y quedó enteramente bajo mutación (20a2ded, 4743b3e).
  • Dos estudios independientes fijaron el alcance, los fallos y el contrato MCP; se descartó con
    evidencia la compuerta de escritura propuesta originalmente (3f14ec3, 824fc1b).
  • Se implementaron en orden el transporte y las tres herramientas de sólo lectura, cerrando la
    ronda de tools/mcp.py en 297/297 (ada8e01, 61f89b0, 50e02d8).
  • El sitio ganó una explicación de dónde entra Oracle y de los límites que ningún servidor puede
    prometer (f3954ce).

Oracle gana un servidor MCP de sólo lectura para que un agente pueda preguntarle qué mide un
proyecto sin parsear salidas pensadas para personas:

  • oracle_catalogo_efectivo enumera qué medidas obligan en la raíz fijada y de dónde salen;
    al pedir ids devuelve además sus premisas, umbral, ámbito y fijación, y distingue una medida
    desconocida de una conocida que no tiene jurisdicción en ese proyecto.
  • oracle_evaluar evalúa contra evidencia JSON una medida del catálogo o un texto .oracle o
    JSON recibido en memoria. Devuelve por separado verde, rojo y sin_evidencia, con valor,
    umbral, alcance derivado, testigos y advertencias; no acepta rutas.
  • oracle_desafiar reproduce los casos verdes y rojos de una medida y recién entonces ejecuta
    sus mutantes. Informa discordancias, rechazos del álgebra y sobrevivientes sin convertir «todos
    detectados por esta evidencia» en una aprobación semántica.

Las tres operan sobre la raíz fijada al arrancar el servidor. El servidor no escribe nada: no
guarda medidas ni evidencias, no modifica el proyecto y no persiste los candidatos recibidos en
memoria. Las 16 conversaciones JSON-RPC de las tres herramientas están en
estudios/MCP-CONVERSACIONES.md, capturadas contra el servidor
real.

Por qué NO hay una herramienta que guarde medidas

La primera propuesta tenía una: guardaría una medida sólo si venía con evidencia que la pone en rojo
y evidencia que la pone en verde. Se descartó por dos razones medidas, no de gusto.

El corpus tiene 180 casos. 152 los cazó el arnés automático y 28 se le escaparon, y de esos 28 la
compuerta de escritura ataja cero: ninguno es «alguien guardó una medida sin probarla». El
85,7 % son falsos verdes, y ocurren al LEER.

Y las dos evidencias que la compuerta exigiría pueden haber sido fabricadas para repetir exactamente
el error de la medida. Entonces no autoriza a llamarla buena — y guardar después de ella convierte
evidencia insuficiente en apariencia de aprobación.

La regla que ordena todo el servidor

Un agente no tiene con qué dudar de la herramienta. Si el servidor contesta
{"veredicto": "verde"}, lo toma como verdad y sigue.

Fallo cerrado y respuestas falsables. Nunca una lista vacía, nunca un verde suelto, nunca un
resumen opaco.
Un catálogo ilegible produce un error, no un cero.

O, como quedó escrito en los fixtures de aceptación: «no pude mirar» y «miré y no hay nada» son
afirmaciones distintas y jamás deben viajar por el mismo canal.

Esa regla se validó antes de escribir una línea del servidor. Buscando cómo tenía que ser el MCP se
encontró que oracle contexto le decía a los dos consumidores conocidos «LAS 0 MEDIDAS QUE YA
EXISTEN» teniendo 41 y 9 medidas propias: un except Exception: return [] se tragaba el fallo de
cargar sus escalares, y el defecto vivió meses. Está arreglado, y tools/contexto.py entró al perfil
de mutación —donde su primera medición dio 20 sobrevivientes de 30—.

Lo que ningún servidor puede prometer

De esos 28 casos que el arnés no cazó, 14 quedan fuera del alcance de cualquier protocolo de
herramientas
: fallas de runtime y señales, saltos causales del propio modelo, falsificación
deliberada en disco, y deudas de diseño del lenguaje. Prometer más es vender humo. Lo que el
servidor sí puede es erradicar la otra mitad.

Los dos rechazos que le enseñan algo a un agente

MEDIDA_NO_EFECTIVA   existe en una fuente seleccionada, pero su ámbito no obliga acá
MEDIDA_DESCONOCIDA   no aparece en ninguna fuente seleccionada

«No existe» invita a crear un duplicado; «no tiene jurisdicción acá» enseña que el archivo ya tiene
dueño. La distinción sólo es posible gracias al ámbito de 0.5.0.

El transporte no es el del LSP

MCP sobre stdio usa un objeto JSON-RPC UTF-8 por línea, sin cabeceras. tools/lsp.py es buen
precedente en cuatro decisiones —biblioteca estándar, despachador explícito, respuestas compactas,
stdout reservado al protocolo— pero su enmarcado Content-Length no se copia. Y stdout queda
sólo para el protocolo: una línea humana suelta corrompe el canal.

Verificación del servidor

tools/mcp.py entró al perfil de mutación el mismo día que se escribió, antes de construir la
segunda herramienta. Su primera medición fue la peor del proyecto: 154 mutantes, 60 sobrevivientes,
53 minutos
. Dos cosas que aparecieron ahí no eran deuda cosmética:

  • los códigos de error JSON-RPC no los fijaba nada — el servidor podía devolver -32601 donde
    correspondía -32602 y pasar la suite entera, y un cliente despacha por ese número;
  • las anotaciones que el servidor publica sobre sí mismoreadOnlyHint, destructiveHint
    tampoco. Todo el diseño se apoya en que es de sólo lectura, y esa promesa vivía en constantes que
    nadie comprobaba.

La ronda final cerró en 297/297 mutantes rechazados, cero sobrevivientes. El corte pasó 1243
tests, el corpus de 180 casos y la aceptación con exactamente los dos rojos declarados en
meta.la_medida_no_se_fija_solo_con_evidencia_fabricada. Jam y LyraGASP siguieron en aceptación.
El wheel 0.6.0 se instaló además en un entorno limpio: oracle --version publicó las tres versiones
esperadas y el paquete expuso oracle-mcp como ejecutable.