Saltar al contenido
Simulación · no operativoDatos 100 % sintéticos · las decisiones humanas de los demos se simularon en lote
planlang

Demo A · autorizaciones médicas · corrida v1.5 del sprint 3, 2026-10-04

El agente de autorizaciones, tal como corrió

Primero, qué es: su objetivo, qué recibe, qué hace y qué entrega. Después, su grafo real frente al plan, nodo por nodo, con el detalle que pide cada perfil.

El agente en una mirada

Leer como
Objetivo

Resolver solicitudes de autorización de procedimientos médicos: aprobar en segundos las que son claras, del todo o hasta el tope del servicio, y llevar a un auditor humano toda negación completa y todo caso dudoso. Nunca niega del todo por su cuenta, nunca revela datos del afiliado y nunca obedece instrucciones escondidas en la solicitud.

Recibe

la solicitud
  • corrió en la corrida v1.5
    El texto libre del médicoQué pide, por qué, con qué urgencia y costo; en los 200 casos.
  • corrió en la corrida v1.5
    La orden médica adjuntaPara cotejarla con el texto: en A-009, A-054, A-070, A-099, A-139, A-154, A-175 y A-186 no coincidían y decidió una persona.
  • corrió en la corrida v1.5
    Datos mínimos del afiliadoEdad, sexo y diagnóstico. Nombre e identificación se ocultan antes del modelo (D1).
  • corrió en la corrida v1.5
    El plan de beneficios40 procedimientos en reglas legibles: 5 no necesitan autorización y 6 tienen exclusión con causal.

Hace

7 actividades, en orden
  1. 1
    Clasifica la atención: ¿es urgencia o servicio exento?enrutador · 200 de 200 casos
    corrió en la corrida v1.5
  2. 2
    Si lo es, la autoriza sin revisar coberturaenrutador → redactor · 23 urgencias y 12 exentos
    corrió en la corrida v1.5
  3. 3
    Lee la solicitud y la vuelve datos, con su confianzaextractor · 165 casos
    corrió en la corrida v1.5
  4. 4
    Si faltan datos, los pide al médico, hasta 2 vecesaclaracion · 30 casos, 47 preguntas
    corrió en la corrida v1.5
  5. 5
    Revisa la cobertura con reglas fijasverificador_cobertura · 155 casos, sin modelo
    corrió en la corrida v1.5
  6. 6
    Decide: sigue solo o pasa al auditordecision pausa_humana · 70 de 200 a una persona
    corrió en la corrida v1.5
  7. 7
    Escribe la respuesta, la filtra y, si es adversa, emite su documentoredactor guardia_salida · 31 documentos en ES y EN
    corrió en la corrida v1.5

Entrega

cuatro respuestas y la traza
  • corrió en la corrida v1.5
    AprobaciónCon aviso de IA para el afiliado: 169 de 200.
  • corrió en la corrida v1.5
    Escalamiento al auditor médicoCon los 10 campos que exige el plan: 70 pausas; el auditor simulado aprobó 48 y negó 22.
  • corrió en la corrida v1.5
    Aprobación en parteHasta el tope del servicio; el excedente lo niega una regla (RB-08), con su documento en ES y EN: 9 de 200. Con el modo Texas, la decide una persona.
  • corrió en la corrida v1.5
    Negación con causal tasadaSolo después del auditor, con su documento en ES y EN: 22 de 200, todas con una persona (C1).
  • corrió en la corrida v1.5
    La traza de cada casoplanlang-trace/v1 con huella: señales, rutas, tiempos y tokens de los 200.

corrió en la corrida v1.5Hoy: las 7 actividades corrieron en los 200 casos del sprint 3

Puede

visto en la corrida
  • corrió en la corrida v1.5
    Leer texto libre y volverlo datos en un formato fijo165 casos; ninguna respuesta fuera de formato
  • corrió en la corrida v1.5
    Preguntar lo que falta y seguir con la respuesta47 preguntas en 30 casos
  • corrió en la corrida v1.5
    Revisar la cobertura con reglas que cualquiera puede leer155 casos, 0 tokens
  • corrió en la corrida v1.5
    Detenerse, esperar a una persona y retomar donde iba70 pausas y 70 reanudaciones
  • corrió en la corrida v1.5
    Ignorar órdenes escondidas en la solicitudA-016, A-034, A-044, A-075, A-105, A-115, A-155, A-180 y A-200: la orden plantada no cambió nada

Nunca

reglas del plan
  • Negar del todo sin que lo revise una personaD2 · C1 · CA SB 1120 · TX SB 815 · AI Act art. 14
  • Ver el nombre o la identificación del afiliadoD1 · se ocultan antes del modelo
  • Revelar datos del afiliado en la respuestaC2 · guardia de salida
  • Dejar que el texto de un caso cambie lo que haceC6 · el texto es dato, nunca instrucción
  • Pedir autorización para una urgenciaC4 · Ley 1751, art. 14

Las hacen cumplir la pausa humana, la guardia de salida y el contrato de grafo. En la corrida v1.5 ninguna se rompió: C1, C2, C4 y C6 se cumplieron.

Participan

  • Médico solicitantepide la autorización y responde las aclaraciones · sintético
  • Afiliado (sintético)recibe la respuesta · sintético
  • Auditor médico humanodecide en la pausa · en este demo, simulado
  • Agente de autorizacioneseste sistema, en una aseguradora sintética
  • Plan de beneficios sintético (reglas legibles)reglas de cobertura legibles · sintético

Capacidad medida

8,1 spor caso, medianade 3,2 a 49,5 s · el plan pide ≤ 30 s en un caso típico (C7): cumplió
0,025 USDpor caso, nominal4,92 USD los 200; no se factura: sale de la cuota de la suscripción de Claude Code
6.007tokens por caso, medianade 1.563 a 18.289 · el más largo pidió dos aclaraciones
70 de 200casos a una personaunos 840 min de auditor: 12 min por caso según el plan
196 de 200caminos iguales a la verdad conocidamisma decisión y misma pausa que la verdad del caso sintético
≈ 37 minun lote de 200 casosen serie, sumando los 200 casos de esta corrida (11,0 s por caso); 4,9 USD nominales

Objetivo, actividades y entregas: plan del demo A v1.5. Estado y cifras: corrida suscripcion-planlang-a-002-200-v1.5 del sprint 3 (2026-10-04), 200 casos sintéticos, modelo sonnet por la suscripción de Claude Code. real · corrida v1.5

Arquitectura

Patrón
enrutador + extractor, verificador de cobertura y redactor + aclaración y decisión
Decisión
D4, de dos vías: se puede volver a agente único
Línea base
agente único a igual presupuesto sobre el mismo lote: S3 quedó refutado, con varios agentes fue más lento que con uno solo
Orquestación
LangGraph 1.x: StateGraph, add_conditional_edges con path_map explícito, interrupt + Command(resume=…); sin langgraph-supervisor

Grafo

Contrato del plan
8 nodos · 12 aristas condicionales · 1 pausa humana (rol auditor, 10 campos mínimos)
Sprint 3
8 nodos + inicio y fin · 14 aristas · 9 condicionales (get_graph().to_json())
Coincide
8 de 8 nodos · 12 de 12 reglas · 0 nodos fuera del contrato
Huella del grafo
056407bf4c1238ca…

Modelo y proveedor

Adaptador
ChatClaudeCode(BaseChatModel) → claude -p
Modelo
alias sonnet en los 3 nodos con modelo
Régimen
suscripción de Claude Code del autor; lotes de 20 fuera de CI; interruptor a API (Haiku 4.5) o Groq (D6)
Aislamiento
sin herramientas · MCP vacío · sin settings · directorio temporal limpio · nunca --bare

Versiones de la corrida

LangGraph · LangChain
1.2.12 · 1.4.2 (core 1.6.5)
LangSmith SDK · Pydantic
0.14.1 · 2.13.5
Claude Code
2.1.282
Python
3.12.14

Estado

Tipo
TypedDict Estado: 15 señales del plan con su nombre del contrato + 15 claves de trabajo
Claves de trabajo
caso_identradaumbrales_aplicadosaclaraciones_hechasaclaracionesextraccioncoberturapausasrevisionborradorsalida_finaldocumento_adversoguardia_salidapasosdecisiones_de_arista
Señales exigidas en la traza
tipo_atencionservicio_exentocarga_detectadasenal_confianzacampos_faltantes_countciclos_aclaracioncosto_estimadocontradiccion_orden_textopropuestamodo_texasdecision_finalpausa_humananodos_visitadosseveridad_accionlatencia_total_stokenserror_proveedorproveedor_no_disponible

Persistencia y trazas

Checkpointer
SqliteSaver en las corridas (archivo 600, derivado privado) · InMemorySaver en las pruebas
Hilo
un thread_id por caso
Trazas
propias, planlang-trace/v1, una por caso con su huella; LangSmith solo como espejo

Evaluación

Verificador
determinista, sin modelo: 10 criterios, 10 detectores de riesgo, 3 supuestos, contrato de grafo
Prueba cruzada
RF-09.2: 1124 decisiones de arista rehechas en TypeScript, 0 diferencias
Lotes
200 casos, sin repetir + línea base de agente único
Plan
6 decisiones · 10 riesgos · 3 supuestos · 10 criterios · 4 umbrales

Qué del plan toca a cada nodo

Cada fila une un nodo del contrato con las decisiones, riesgos, supuestos, criterios y umbrales que lo gobiernan, y dice en cuántos de los 200 casos corrió.

enrutadorDecisionesD4RiesgosR6 · R7SupuestosS3CriteriosC4Umbrales—En la corridacorrió en la corrida v1.5200 de 200
extractorDecisionesD1 · D6RiesgosR3 · R5 · R8 · R9SupuestosS1CriteriosC5 · C6UmbralesU1 (señal)En la corridacorrió en la corrida v1.5165 de 200
aclaracionDecisionesD5 · D6RiesgosR4 · R9SupuestosS2Criterios—UmbralesU3En la corridacorrió en la corrida v1.530 de 200
verificador_coberturaDecisiones—RiesgosR6Supuestos—CriteriosC4 · C8UmbralesU2En la corridacorrió en la corrida v1.5155 de 200
decisionDecisionesD2 · D3RiesgosR1 · R3 · R5 · R10Supuestos—CriteriosC1 · C3 · C10UmbralesU1 · U2 · U4En la corridacorrió en la corrida v1.5155 de 200
pausa_humanaDecisionesD2 · D3RiesgosR1 · R9 · R10Supuestos—CriteriosC1 · C3 · C9 · C10UmbralesU1 · U2 · U3 · U4En la corridacorrió en la corrida v1.570 de 200
redactorDecisionesD1 · D6RiesgosR2 · R8Supuestos—CriteriosC7 · C8Umbrales—En la corridacorrió en la corrida v1.5200 de 200
guardia_salidaDecisionesD1RiesgosR2 · R3Supuestos—CriteriosC2 · C6Umbrales—En la corridacorrió en la corrida v1.5200 de 200

Lectura del plan v1.5 hecha por el autor y comprobada contra el plan: cada id existe y ningún elemento queda sin nodo. Los conteos son reales. declarado

El estado del grafoestado.py · líneas 20–54 (agents/src/app_agents/demo_a/estado.py)
class Estado(TypedDict, total=False):    caso_id: str    entrada: dict[str, Any]    umbrales_aplicados: dict[str, Any]    # Señales del plan (nombres del contrato de grafo).    tipo_atencion: str    servicio_exento: bool    # M-16 (plan v1.5): la guardia de entrada, sin modelo; solo si el plan declara la señal.    carga_detectada: bool    senal_confianza: float | None    campos_faltantes_count: int | None    ciclos_aclaracion: int    costo_estimado: int | None    contradiccion_orden_texto: bool | None    propuesta: str | None    modo_texas: bool    decision_final: str | None    pausa_humana: bool    severidad_accion: int | None    # AU-9 (plan v1.4): el nodo que llama al modelo deja si el proveedor respondió, y con qué falló si no.    proveedor_no_disponible: bool    error_proveedor: str | None    # Trabajo del grafo.    aclaraciones_hechas: int    aclaraciones: Annotated[list[dict[str, Any]], operator.add]    extraccion: dict[str, Any] | None    cobertura: dict[str, Any] | None    pausas: Annotated[list[dict[str, Any]], operator.add]    revision: dict[str, Any] | None    borrador: dict[str, Any] | None    salida_final: dict[str, Any] | None    documento_adverso: dict[str, Any] | None    guardia_salida: dict[str, Any] | None    pasos: Annotated[list[dict[str, Any]], operator.add]    decisiones_de_arista: Annotated[list[dict[str, Any]], operator.add]

Lo que corrió, frente a su plan

real · grafo exportado
8 de 8nodos del contrato están en el grafoNinguno falta y ninguno sobra. El spike tenía 3 de 8 (abajo, al final).
12 de 12reglas de arista del contrato, con su señalCada rama que toma el agente deja su señal y su umbral en la traza antes de enrutar.
1124 · 0decisiones rehechas en otro lenguaje · diferenciasEl playground (TypeScript) evaluó las mismas reglas sobre las trazas y tomó las mismas ramas (RF-09.2).

Contrato de grafo del plan v1.5 frente al grafo exportado de la corrida v1.5 (huella 056407bf4c12…).

El grafo

Lo genera el código desde el grafo compilado y el plan (el diagramador de la casa, contrato 0.5.0). Toca un nodo o una regla: abajo aparece su detalle por perfil.

Grafo real del Demo A · autorizaciones médicas, sprint 3, corrida v1.5: los 8 nodos del contrato y sus 12 reglas de arista Seis capas de izquierda a derecha, de la entrada a la salida. La lista por capa dice lo mismo en texto. 6 reglas: instrucción escondida · U1 · U2 ·contradicción · negar · Texas ENR · 2 reglasenrutador ENR · 6 reglasdecision MOD · sonnetextractor MOD · sonnetaclaracion MOD · sonnetredactor REGverificador_cobertura REGguardia_salida HUM · auditorpausa_humana
Desliza · capa

secuenciacondicional · señal · operador · valor; «si no», cuando ninguna regla se cumplereanudación · responde una personasalto · dos flechas que se cruzan sin unirse

Detalle de la selección

enrutador

ENR · 2 reglasreal · corrida v1.5

Clasifica la atención y decide si el caso necesita revisión de cobertura.

Recibe

La orden adjunta y el plan de beneficios

el tipo de atención y el código del procedimiento
ENR · 2 reglasenrutador
Entrega

El camino: al extractor, o directo al redactor

si es urgencia o servicio exento
Para qué existe
Una urgencia no espera: la ley manda autorizarla sin revisar cobertura, y lo mismo los servicios que el plan exime. Este paso las separa antes de gastar tiempo en lo demás.
Cómo lo hace
Con reglas fijas, sin modelo: lee el tipo de atención de la orden adjunta y busca el procedimiento en la lista de exentos del plan de beneficios.
Qué decide
Dos reglas del plan, en orden: urgencia → redactor; servicio exento → redactor. Si ninguna se cumple, el caso sigue al extractor.
Si falla
Pediría autorización para una urgencia o para un servicio exento (riesgo R6), o confundiría el papel de cada agente (R7).
Cómo se mide
Toda urgencia y todo servicio exento se autorizan sin revisar cobertura (criterio C4).
En los 200 casos
165 siguieron al extractor. 23 urgencias y 12 servicios exentos fueron directo al redactor, sin pasar por la cobertura. C4 se cumplió.

Contrato y estado

Nodo
enrutador · enrutador · capa 02, orquestación
Lee
la orden adjunta y el plan de beneficios
Escribe
carga_detectadadecisiones_de_aristamodo_texaspasosservicio_exentotipo_atencion
Entra desde
inicio · secuencia
Sale hacia
extractor · redactor
Reglas del plan
tipo_atencion · igual_a · urgencia → redactor · servicio_exento · igual_a · true → redactor · si no → extractor

Por qué no usa modelo

Código primero
la urgencia viene escrita en la orden y la lista de exentos es una tabla: no hay texto libre que interpretar

Lo que el plan le exige

  • D4¿Multiagente con enrutador o agente único?Dos vías
  • R6Autorizar un servicio exento o negar una urgenciaAP altaS8 · O3 · D2 · RPN 48 · control legal (tabla: baja)No ocurrió
  • R7Falla propia de multiagente: confusión de rol o desalineación entre agentesAP bajaS6 · O4 · D4 · RPN 96No ocurrió
  • S3El enrutador con tres especializados no rinde peor que un agente único a un presupuesto no mayor.Refutado
  • C4Toda urgencia se autoriza sin verificación de cobertura; ningún servicio exento pasa por cobertura.Cumplió

Observado en la corrida v1.5

Casos · visitas
200 de 200 · 200
Modelo
ninguno: 0 tokens, 0 USD, código
Caminos
12 servicio_exento → redactor · 165 → extractor · 23 tipo_atencion → redactor

Antes: el spike, frente al mismo contrato

real · spike 2026-09-26

Así se ve lo que el plan exige y el grafo del spike no tenía. El spike del 2026-09-26 corrió con 3 de las 8 piezas y un nodo fuera del contrato; las otras 5 aparecen con borde discontinuo y la marca «exigido». El grafo de arriba, el de la corrida publicada, las tiene todas.

3 de 8nodos del contratofaltaban aclaracion, verificador_cobertura, decision, redactor y guardia_salida
1 de 12reglas de aristala de U1, pero en enrutador y no en decision
1nodo fuera del contratoaprobar, que aprobaba sin pasar por decision
Grafo del spike frente al contrato de grafo del plan Las piezas que el plan exige y el spike no tenía van con borde discontinuo y la marca «exigido». ENRexigidodecision ENR · 1 reglaenrutador MOD · sonnetextractor MODexigidoaclaracion MODexigidoredactor REGexigidoverificador_cobertura REGexigidoguardia_salida REGsin contratoaprobar HUM · auditorpausa_humana
  1. 01Entrada¿Qué recibe el agente?

    solicitud (terminal)

    solicitud → extractor · secuencia

  2. 02Orquestación¿Quién decide el siguiente paso?
    1. ENR · exigido por el plan, ausente del grafodecision
    2. ENR · 1 reglaenrutador

      senal_confianza < 0,75 → pausa_humana · si no → aprobar

  3. 03Agentes especializados¿Quién razona y con qué modelo?
    1. MOD · sonnetextractor

      extractor → enrutador · secuencia

    2. MOD · exigido por el plan, ausente del grafoaclaracion
    3. MOD · exigido por el plan, ausente del graforedactor
  4. 04Reglas y guardias¿Qué verifica el código sin preguntarle a un modelo?
    1. REG · exigido por el plan, ausente del grafoverificador_cobertura
    2. REG · exigido por el plan, ausente del grafoguardia_salida
    3. REGaprobar

      aprobar → fin · secuencia

  5. 05Pausa humana¿Cuándo se detiene a esperar a una persona?
    1. HUM · auditorpausa_humana

      pausa_humana → fin · secuencia

  6. 06Salida¿Qué entrega y con qué garantías?

    fin (terminal): la respuesta filtrada y la traza

Leído del código del spike: umbral spike.py:44 · regla spike.py:198 · aristas spike.py:228 · pausa spike.py:207 · tipos de nodo spike.py:189-218