Trayectorias: cómo Nammu construye la hoja de ruta procesal correcta para cada caso
Una vez que un caso se clasifica y sus documentos se segmentan, Trayectorias superpone la hoja de ruta estatutaria correcta para esa jurisdicción y tipo de proceso específicos, con evidencia real del caso. Así se combinan las plantillas, la inferencia de estado, la vista dividida en dos y los siete estados vacíos.
Inventum P5
Ingeniería · Galictis-Legal
10 de julio de 2026
10 min de lectura
Cada tipo de proceso legal tiene su propia secuencia estatutaria de etapas, sus propias citas de artículos, sus propios plazos, su propio “qué pasa si X no ocurre.” La audiencia preliminar de un ordinario civil no tiene nada en común procesalmente con la ventana de plazo de vigencia de un caso de violencia doméstica. Trayectorias existe para renderizar la hoja de ruta estatutaria correcta para la jurisdicción y tipo de proceso específicos de este caso — y luego superponerla con evidencia real de los propios documentos de este caso para mostrar dónde realmente se encuentra hoy. Esto no es una barra de progreso genérica de cinco etapas.
Dos vistas sobre un solo modelo
La misma estructura de datos CaseTimeline alimenta dos renderizados deliberadamente distintos. Mantenerlos separados evita que se confundan dos preguntas genuinamente diferentes.
Lo que realmente ha sucedido
- Filtrado a través de _reached() — solo hitos COMPLETED e IN_PROGRESS
- Restringido por evidencia: una etapa aún no probada en los documentos simplemente no aparece
- Se adjuntan fechas cuando la extracción tuvo éxito
- Nunca muestra lo que no ha sucedido — eso tergiversaría el caso
Cómo se ve el proceso en general
- Plantilla estatutaria completa — todos los hitos incluyendo PENDING y UNKNOWN
- Disponible en el momento en que se clasifica process_type, sin importar los documentos
- Fechas y plazos omitidos intencionalmente — solo significan algo una vez alcanzados
- Responde: cómo se ve este tipo de caso, no dónde está este caso en particular
El modelo de datos
Tres dataclasses en timeline_model.py llevan todo lo que produce un constructor:
Milestone
Una etapa procesal. Lleva una etiqueta bilingüe, un símbolo (ver abajo), una fase, un estado (completed / in_progress / pending / unknown), el artículo y ley que la rige, un plazo estatutario opcional en días hábiles, y notas de texto libre — que a menudo llevan orientación legal crítica de seguridad, no solo descripciones.
JurisdictionalHinge
Se completa solo para un caso bisagra (transferencia jurisdiccional). Lleva la jurisdicción de origen y de destino, nombres de tribunales, y la fecha y título del documento de transferencia.
CaseTimeline
El envoltorio a nivel de caso: process_type, bandera has_bisagra, etiquetas de fase, la bisagra si existe, y la lista completa de hitos. Cada constructor devuelve exactamente uno de estos — la capa de interfaz nunca toca directamente la lógica específica de jurisdicción.
Símbolos de los hitos
Cada hito lleva un símbolo que comunica de un vistazo su rol estructural en la secuencia procesal:
Hito estándar
Una etapa procesal regular
Pivote
Una etapa que cambia la dirección o vía del caso
Terminal
Un estado final — el caso puede detenerse aquí
Condicional
Solo aplica bajo circunstancias específicas
Un constructor por tipo de proceso — no por jurisdicción
load_case_timeline() lee process_type de case_index.json y lo enruta a exactamente una función build_*_timeline(). Este es un despacho a nivel de tipo de proceso, no a nivel de jurisdicción: que una jurisdicción esté completamente clasificada no garantiza que todos sus tipos de proceso tengan plantilla. El monitorio civil, el procedimiento_abreviado y la flagrancia de penal, y el proceso_de_lesividad de contencioso están todos correctamente clasificados pero aún no tienen constructor — muestran un estado de “plantilla faltante” diseñado a propósito, no un error genérico.
Cada constructor es autocontenido. Tiene su propia lista de hitos, citas de artículos y reglas de inferencia de estado — fundamentadas en una revisión específica del dominio legal, citada en el código. No existe una estructura de hitos genérica compartida que las jurisdicciones personalicen. Los 13 hitos de un ordinario civil y los 8 hitos de un caso de violencia doméstica familiar no comparten un solo nombre o estructura de etapa, porque están regidos por códigos distintos con relojes procesales distintos.
Fases — comunicando el cambio jurisdiccional a mitad de proceso
MilestonePhase tiene cuatro valores. Cuáles usa un constructor dice algo legalmente significativo sobre si la jurisdicción del caso puede cambiar a mitad de proceso.
| Fase | Significado | Usada por |
|---|---|---|
| SINGLE | El proceso nunca cambia de jurisdicción | Penal, laboral, familia (las 6), notarial, tránsito |
| PHASE1 | Etapas previas a la transferencia (estilo atenuado) — origen contencioso-administrativo | Solo constructor de ordinario civil, vía bisagra |
| BISAGRA | El acto mismo de transferencia jurisdiccional (resaltado en dorado, nodo distinto) | Solo constructor de ordinario civil, vía bisagra |
| PHASE2 | Etapas posteriores a la transferencia (estilo activo) — vía ordinaria civil que sigue | Solo constructor de ordinario civil, vía bisagra |
build_ordinario_timeline() es el único constructor que debe manejar las tres formas posibles de un caso ordinario civil. Elige explícitamente entre ellas: bisagra detectada → emite ambas fases más el nodo de bisagra resaltado en dorado; jurisdicción no civil sin bisagra todavía → aun así muestra ambas plantillas de fase para que la hoja de ruta de la mini-vista sea visible antes de una transferencia; puramente civil desde el inicio → descarta las etiquetas de fase y marca cada hito como SINGLE.
Cómo se infiere el estado de un hito
Cada constructor inspecciona el conjunto consolidado de doc_kind de document_index.json — la salida de la Segmentación Inteligente de Documentos — y deriva el estado de cada hito a partir de qué tipos de documento están presentes. Los patrones van de simples a legalmente sofisticados:
Verificación simple de presencia
Notificación al demandado del ordinario civil:
COMPLETED if "notificacion" in doc_kinds else UNKNOWN
Cascada de tres estados con un estado intermedio significativo
Admisibilidad de la querella penal:
COMPLETED si existe una resolución de admisión del tribunal
IN_PROGRESS si se señalaron defectos y/o se presentó subsanación,
pero el tribunal aún no ha resuelto
PENDING si no hay ninguna señalEl estado IN_PROGRESS es deliberado y legalmente significativo: distingue “el ciclo de defecto/subsanación ocurrió y estamos esperando al tribunal” de “no ha pasado nada todavía” — una distinción procesal real, no un artefacto de barra de progreso.
Inferido lógicamente de la evidencia circundante
Admisibilidad y audiencia única del sumario civil:
El sumario no tiene un tipo de escrito de admisibilidad dedicado en la taxonomía actual. En lugar de dejar estas etapas permanentemente en UNKNOWN, el constructor las infiere a partir de lo que debe ser legalmente cierto dado evidencia posterior: “admisibilidad” es COMPLETED una vez que existe una contestación o sentencia (un caso no puede legalmente llegar a ninguna de las dos sin haberla superado), IN_PROGRESS una vez que existe una demanda sin nada más, PENDING en cualquier otro caso. Esto está explícitamente comentado en el código como una inferencia deliberada y legalmente sólida — no una suposición.
Doble terminal, ventana calculada
Violencia doméstica familiar:
Esta plantilla tiene dos hitos TERMINAL — sentencia_recursos y archivo_proceso — porque un caso de VD puede terminar legítimamente de cualquiera de las dos formas: una resolución final con medidas aún vigentes, o un archivo administrativo después de que las medidas de protección simplemente expiran sin renovarse. El hito plazo_vigencia (si las medidas de protección siguen legalmente vigentes) no tiene un doc_kind propio — su estado se deriva completamente de si existe una resolución de otorgamiento y si algún evento terminal se ha disparado desde entonces.
El texto de los hitos lleva orientación de seguridad legal
El campo notes de un hito no es decorativo. En varios constructores, lleva instrucciones directas y críticas de seguridad legal, incrustadas exactamente en el punto de la interfaz donde son operacionalmente relevantes.
Del constructor de violencia doméstica familiar:
Resolución de otorgamiento
"NUNCA exigir estándar probatorio elevado en esta etapa — acceso rápido por diseño." Nunca exigir un estándar probatorio elevado aquí. El acceso rápido es la intención del diseño legal de la ley.
Señalamiento de audiencia
"PROHIBICIÓN DE CONCILIACIÓN (art. 9 CPF): relación desigual de poder se presume en violencia doméstica; NUNCA sugerir, preparar ni facilitar conciliación en esta audiencia." Una prohibición legal estricta, no una sugerencia.
Control del plazo de vigencia
Marcado como "ALERTA DE SEVERIDAD ALTA, NO COSMÉTICA" — una expiración perdida de medidas de protección es un riesgo de seguridad física, no un plazo procesal ordinario.
Levantamiento anticipado
"NUNCA inducir, sugerir conveniencia, ni evaluar el mérito." La decisión de solicitar el levantamiento anticipado de las medidas de protección está marcada explícitamente como decisión exclusiva de la persona protegida.
Enriquecimiento de fechas — mejor esfuerzo, nunca un determinante de estado
timeline_dates.py corre una pasada posterior separada que intenta adjuntar una fecha de calendario real a hitos ya marcados como alcanzados por la lógica de estado. Nunca determina si un hito ocurrió — solo cuándo.
Para cada ID de hito, una tabla de búsqueda indica qué doc_kind(s) buscar; la página de ancla del primer segmento coincidente se escanea con expresiones regulares de fecha en español que cubren tanto fechas numéricas (28/01/2026) como la fórmula canónica costarricense de autofechado judicial deletreada (“del veintiocho de enero de dos mil veintiséis”), incluyendo una tabla de palabra a número para días y años deletreados.
Un fallo de extracción de fecha simplemente significa que un hito aparece como alcanzado sin fecha — nunca es una razón para degradar u ocultar un estado que la evidencia de doc_kind ya estableció.
Siete estados vacíos distintos
Trayectorias deliberadamente no colapsa toda situación de “nada visible” en un único estado vacío genérico. La razón por la que un caso no tiene nada que mostrar es en sí misma información útil, y confundir las razones engañaría al abogado sobre lo que realmente está sucediendo.
| Estado | Significado | Por qué no es solo “vacío” |
|---|---|---|
| Vacío | Nada procesado todavía | El verdadero estado base por defecto. |
| Procesando | Transitorio — la brecha de ~7s entre la lectura de ruta rápida y la finalización de la reescritura en segundo plano | Puramente momentáneo. Un estado vacío con apariencia permanente aquí parecería un estancamiento. |
| Filtro de calidad | El manifiesto reporta completado, pero muy pocas páginas produjeron texto usable (por debajo del piso de extracción del 80%) | Sin esto, un caso con OCR bajo parecería engañosamente "aún procesando" para siempre. |
| Fuera de alcance | Jurisdicción detectada, pero sin esquema legal cargado (agrario, constitucional) | Le dice al abogado por qué — una jurisdicción real conocida sin plantilla todavía, no una falla de procesamiento. |
| Sin construir (pendiente) | Clasificado correctamente como sumario — una categoría real del NCPC — pero aún no existe un constructor de línea de tiempo | Distinto de FUERA_DE_ALCANCE: la clasificación tuvo éxito, solo falta la plantilla. |
| No reconocido | Clasificado como abreviado — una etiqueta que el mapeo actual del esquema civil no reconoce | Recomienda explícitamente verificación manual del abogado, en lugar de fingir confianza. |
| Clasificación manual | Nivel 3 de la cascada — tanto el sondeo de carátula como el consolidado de doc_kind fueron ambiguos | Interactivo: presenta menús desplegables de jurisdicción / tipo de proceso y guarda la elección del abogado. |
| Sin hitos alcanzados | Tipo de proceso conocido, existe plantilla completa (visible en la mini-vista) — el caso es genuinamente de etapa temprana | Sin esto, un caso correctamente clasificado en etapa temprana mostraba el mismo mensaje que una falla genuina. |
Principios rectores
Una plantilla estatutaria por tipo de proceso, fundamentada a mano en su propio código rector
Nunca una estructura de progreso genérica compartida y reutilizada entre ramas.
Dos vistas distintas, deliberadamente no combinadas
Cómo se ve un proceso en general (mini-vista, siempre disponible una vez clasificado) vs. lo que este caso realmente ha demostrado hasta ahora (pestaña Trayectorias, restringida por evidencia).
Todo estado se deriva de evidencia o se infiere lógicamente de otra evidencia — nunca se adivina
Donde aún no existe evidencia dedicada (sumario civil), el respaldo es una inferencia honesta y legalmente sólida a partir de hitos circundantes, razonada explícitamente en el código, no un valor por defecto silencioso.
Una plantilla faltante se reporta como una plantilla faltante
Distinto de un caso no clasificable, distinto de un caso genuinamente en etapa temprana, distinto de una brecha transitoria de procesamiento. Colapsar cualquiera de estos en un vacío genérico desinformaría al abogado sobre lo que realmente es cierto.
La orientación de seguridad legal vive exactamente en el hito al que aplica
Incluyendo advertencias honestas de confianza en cualquier cita que aún no esté completamente verificada — la misma disciplina de BORRADOR trasladada desde el nivel de esquema hasta el texto individual de la interfaz.
Las fechas son un enriquecimiento de mejor esfuerzo, nunca un determinante de estado
Un fallo de extracción de fecha nunca degrada un estado que la evidencia subyacente de doc_kind ya obtuvo.
¿Quieres ver Trayectorias corriendo en expedientes reales?
Podemos recorrer la línea de tiempo para tu jurisdicción y tipos de proceso — incluyendo qué hitos existen, qué estados están activos y cómo se ve la hoja de ruta para un caso que conozcas.
Solicita una demo →