name: hospital-devolucion-batch-parse description: Lee el Excel/CSV de glosas que la EPS envió a la IPS y crea una task hija por cada fila — una task = una glosa = un ítem objetado. Cada hija arranca el skill hospital-devolucion-audit. Sin agregaciones, sin agrupación por num_documento. La task envelope transita a archived al terminar. version: 1.0.0 author: claudio@arkangel.ai platforms: [macos, linux] metadata: hermes: tags: [medical, glosa, devolucion, hospital, intake, excel, colombia] category: medical-insurance-audit requires_toolsets: [terminal]
hospital-devolucion-batch-parse
Recibe un Excel/CSV de glosas (uno o varios ítems objetados de una o varias facturas) y crea una task hija independiente por cada glosa (una glosa = un ítem). El envelope task original transita a archived cuando todas las hijas fueron creadas.
La pregunta que responde: ¿cómo separar el archivo que envió la EPS en unidades atómicas que el agente de auditoría pueda procesar una a una?
When to Use
- El orquestador despacha una task con
task_type = hospital_devolucion_batchy un archivo Excel/CSV cargado como input. - La task fue creada por
hospital-devolucion-gmail-intakeo por la intake form ensalmona-api.
No usar:
- Si la task ya está
archivedodone. - Si no hay archivo Excel/CSV en los inputs de la task.
- Si la task carga ya un
GlosaContexten sucontext(esa es una task hija — usarhospital-devolucion-audit).
Input Contract
Required environment variables
LOCAL_DEVOLUCION_REF_PATH— Ruta absoluta al directorio de referencias de devolución en el host. Default si no está definida:/root/.hermes/ref-data/hospital-devolucion/. Debe contenerprestador.json(datos de la IPS) yaseguradoras.json(catálogo de pagadores). Si la ruta no existe o estos archivos faltan, abortar conerror_missing_ref_data.
Tenant configuration (external)
El skill es IPS-agnóstico — no asume ningún prestador ni pagador específico. Los datos del tenant se cargan en tiempo de ejecución:
$LOCAL_DEVOLUCION_REF_PATH/prestador.json— datos de la IPS que opera el skill. Estructura:{ "nombre": "<razón social IPS>", "nit": "<NIT IPS>" }Schema canónico bundled en
../hospital-devolucion-audit/references/prestador.schema.json.$LOCAL_DEVOLUCION_REF_PATH/aseguradoras.json— catálogo de pagadores con sus parámetros operativos (looked up bypagador_id). Estructura definida por../hospital-devolucion-audit/references/aseguradoras.schema.json.
Task input
Task del tipo hospital_devolucion_batch. Su context contiene metadata del lote (no datos de la glosa):
{
"batch_id": "BATCH-YYYYMMDD-XXXXX",
"documentos": ["<nombre_archivo>.xlsx"],
"pagador_nombre": "<EPS según email/intake>",
"email_origen": "<remitente>",
"message_id": "..."
}
context.pagador_nombre es una etiqueta humana del email/intake; el pagador_id definitivo se resuelve por fila al construir el GlosaContext (matching contra las claves de aseguradoras.json.pagadores).
Los inputs de la task incluyen al menos un Excel o CSV con las glosas. No usar librerías de parsing. Leer el archivo con las capacidades nativas del modelo.
Output Contract
Por cada fila (= glosa) en el archivo:
- Construir un
GlosaContextcompleto (verreferences/glosa-context-template.jsonenhospital-devolucion-audit). POST /api/taskspara crear la task hija de tipohospital_devolucion.POST /api/tasks/{id}/inputs/uploadpara adjuntar el archivo Excel original (referencia para el agente de auditoría).PATCH /api/tasks/{id}/status→queued.
Al final, transitar el envelope a archived.
Procedure
Cargar el Excel.
- Listar los inputs de la task envelope:
GET /api/tasks/{ENVELOPE_ID}/inputs. - Descargar el primer Excel/CSV. Si hay varios, procesarlos todos en secuencia con un único
batch_id.
- Listar los inputs de la task envelope:
Identificar las filas-glosa. Cada fila del archivo representa una glosa (un ítem objetado). Si el archivo agrupa varias filas bajo un
num_documentocompartido por la EPS, igual crear una task hija por fila — el num_documento no es un identificador de unidad atómica en nuestro modelo.Para cada fila, construir el
GlosaContext:Campo Cómo se obtiene caso_idGenerar nuevo: HOSP-GL-YYYYMMDD-XXXXX(fecha actual + 5 chars en mayúsculas)num_factura_originalColumna de "factura" / "FC-" en el archivo item_positionNúmero de línea (1-indexado) del ítem objetado en la factura original glosa_idConstruir: {num_factura_original}_{item_position}_g{seq}, p.ej.FC-982144_3_g1.seq= 1 para la primera glosa de ese ítembatch_idHeredar del context del envelope codigoCódigo CUPS/SOAT del ítem descripcionDescripción literal del ítem cantidadUnidades facturadas valor_facturadoLo que la IPS cobró por el ítem (entero COP) valor_glosadoLo que la EPS objeta (entero COP, puede ser ≤ valor_facturado) codigo_completoCódigo causal de 6 dígitos del Manual Único (Res. 2284/2023 Anexo 3), p.ej. FA0101,TA0601,CL0101. Extraer de la columna de causal / código de glosa del archivo. Si el archivo no lo declara, inferir delmotivo_glosamotivo_glosaTexto literal con que la EPS justifica la objeción prestador_nombreLeer de $LOCAL_DEVOLUCION_REF_PATH/prestador.jsoncamponombreprestador_nitLeer de $LOCAL_DEVOLUCION_REF_PATH/prestador.jsoncamponitpagador_idSlug lowercase derivado del nombre de la EPS. Debe existir como clave en aseguradoras.json.pagadores. Si el matching es ambiguo o no hay coincidencia, omitir la fila y documentar en un comentario del envelope.pagador_nombreaseguradoras.json.pagadores[pagador_id].nombre(autoritativo, sobre lo que diga el Excel)pagador_nitaseguradoras.json.pagadores[pagador_id].nitpaciente_alias"Paciente X-NNNN" donde NNNN = últimos 4 dígitos del documento del paciente paciente_documento_alias"CC ***NNNN" (TI/CE/PA según tipo) plan_afiliadoPlan o régimen del afiliado si el archivo lo trae; si no, null(lo completa el hospital desde sus registros)fecha_ingreso/fecha_egreso/fecha_glosa/fecha_vencimientoFechas YYYY-MM-DD Crear la task hija como
draft(sin status — el agente no la recoge hasta que tenga el input cargado). Capturar elidretornado por el API:CREATE_RESP=$(ark tasks create \ --type hospital_devolucion \ --title "Glosa ${CODIGO} — ${PAGADOR_NOMBRE}" \ --description "Run skill hospital-devolucion-audit on the attached context." \ --priority medium \ --context "$GLOSA_CONTEXT_JSON") CHILD_ID=$(echo "$CREATE_RESP" | jq -r '.data.id')El campo
--descriptiones deliberadamente un puntero corto al skill, no el prompt completo. El skill canónico vive enskills/hospital-devolucion-audit/SKILL.md.Adjuntar el Excel original como input de la task hija (referencia para el agente de auditoría):
ark tasks inputs upload "$CHILD_ID" "$WORK_DIR/$FILENAME"Encolar la task hija ahora que tiene su input cargado:
ark tasks status "$CHILD_ID" --status queuedCerrar el envelope una vez creadas todas las hijas:
ark tasks status "$ENVELOPE_ID" --status archived
Pitfalls
num_documentono es atómico: un Excel puede traer varias filas bajo el mismonum_documento(la EPS agrupó). Cada fila igual es una glosa independiente. No fusionar filas.- Código causal ausente: si el archivo no trae el código de 6 dígitos explícito, inferir del texto del
motivo_glosausando los prefijos del Manual Único (Res. 2284):FAFacturación,TATarifas,SOSoportes,AUAutorización,COCobertura,CLCalidad,SASeguimiento a Acuerdos. Elegir el código de 6 dígitos más específico que respalde la evidencia. Si no hay forma de determinarlo con confianza, tratar la fila como dato faltante (ver "Sin datos"). - Valor parcial: si
valor_glosado < valor_facturado, registrar ambos. No reemplazar uno por el otro. - PII: generar siempre el alias de paciente (
Paciente X-NNNN) y nunca incluir el nombre real ni el número completo del documento. - Sin datos: si una fila no tiene los campos requeridos del schema (codigo, valor_glosado, codigo_completo), NO crear la task. Anotar en un comentario del envelope qué filas se omitieron y por qué.
Verification
- El envelope task transitó a
archived. - Se creó al menos una task hija de tipo
hospital_devolucionpor cada fila procesada. - Cada task hija tiene un
contextválido contraglosa-context.schema.json(ver../hospital-devolucion-audit/references/glosa-context-template.json). - Cada task hija tiene el Excel original cargado como input.
- Cada task hija está en
queued. - La
descriptionde cada task hija es un puntero corto al skillhospital-devolucion-audit, no el prompt completo. - El
batch_iddel envelope aparece en el context de cada hija (para trazabilidad). - Filas omitidas (por datos faltantes) están documentadas en un comentario del envelope.
References
Schemas bundled in hospital-devolucion-audit/references/
prestador.schema.json— forma esperada de$LOCAL_DEVOLUCION_REF_PATH/prestador.json.aseguradoras.schema.json— forma esperada de$LOCAL_DEVOLUCION_REF_PATH/aseguradoras.json.glosa-context-template.json— ejemplo del output construido por este skill.
Skills relacionados
../hospital-devolucion-gmail-intake/SKILL.md— upstream: crea el envelope task desde un email de la EPS.../hospital-devolucion-audit/SKILL.md— downstream: procesa cada task hija.
Marco normativo
- Resolución 2284 de 2023, Anexo Técnico 3 — Manual Único de Devoluciones, Glosas y Respuestas (códigos causales de 6 dígitos).
- Issue
arkangelai/salmona-api#210— modelo de datos único-glosa. - Issue
arkangelai/salmona-api#251— códigos Res. 2284 y forma unificada del GlosaContext.