Conversation
…sada
Las skills que hay trabajan un caso. Esta mira todos a la vez, porque el plazo
que se pierde en una Defensoria casi nunca es el que estabas mirando.
## El modo de falla que persigue
No es el plazo que computaste y se te paso: ese lo tenes en la cabeza. Es la
fila que quedo asi:
| contestar demanda | habiles judiciales | | | 🔲 a computar |
Alguien abrio el caso, cargo el acto, y no volvio. Con tres expedientes se nota.
Con veinte no se nota nunca, y desde afuera se ve identico a un caso al dia:
una tabla prolija, sin fechas rojas, porque no hay fechas.
Por eso el reporte separa tres cosas y no las mezcla:
- vence pronto: tiene fecha y esta cerca. Lo que ya sabes.
- sin computar: no tiene fecha porque nadie la calculo. Lo que no sabes que
no sabes.
- bloqueado: no se puede calcular porque a la FICHA le falta la jurisdiccion
o el fuero. Parece un problema de formulario y es un plazo escondido.
## El script no computa ningun plazo, a proposito
`componentes/vigia/escanear.mjs` lee fechas ya escritas y cuenta dias corridos
hasta ellas para ordenar la urgencia. Nada mas.
Restar dias habiles sin saber la jurisdiccion, la feria y las acordadas del
tribunal seria adivinar justo lo que la regla de la casa prohibe adivinar. El
computo sigue siendo de `argentina-plazos`, que pregunta lo que le falte.
Esa division tambien es lo que hace util el reporte: el escaner puede decir con
certeza "esta fila no tiene fecha" sin arriesgar una fecha equivocada, y una
fecha equivocada que figura como cerrada es peor que ninguna, porque deja de
aparecer en el reporte siguiente.
## Detalles que salieron de leer la plantilla
Una ficha con los parentesis de ayuda sin completar cuenta como incompleta:
- **Jurisdiccion:** (CABA-Nacional / Jujuy / Salta)
Eso no es una jurisdiccion declarada, es la plantilla intacta, y tratarlo como
dato habilitaria un computo sobre un fuero inventado. Hay un test para eso.
La fila de ejemplo de la plantilla, entre guiones bajos, se ignora. Si no, todo
caso recien abierto apareceria con un plazo pendiente que no existe y el
reporte se volveria ruido a la semana.
## Verificacion
node test/vigia-test.mjs 12 ok, 0 mal
Los expedientes de prueba se arman en /tmp y se borran. Nunca se escribe nada
dentro de casos/, ni siquiera inventado: la regla de la casa es que ahi no entra
nada que se parezca a un caso.
Se agrego el workflow que los corre. A diferencia de los smoke de SAIJ, estos no
tocan ninguna API, asi que no hay motivo para que sean tolerantes a fallos.
| if (proximos.some((p) => p.dias < 0) || sinComputar.length || bloqueados.length) { | ||
| process.exitCode = 1; | ||
| } | ||
| } | ||
|
|
||
| const resultado = await escanear(); | ||
| if (JSON_OUT) console.log(JSON.stringify(resultado, null, 2)); | ||
| else informar(resultado); |
There was a problem hiding this comment.
⚠️ Bug: --json mode never sets a non-zero exit code
In JSON mode the entry point does if (JSON_OUT) console.log(...); else informar(resultado);, so informar() — the only place that sets process.exitCode = 1 — is never called. The scanner therefore always exits 0 with --json, contradicting the documented behavior ("Devuelve exit 1 cuando hay algo que atender... así se puede encadenar. Con --json sale estructurado"). Any CI/pipeline that chains on the JSON output's exit status will treat every run as clean. Compute the exit code from the result regardless of output format (e.g. factor the proximos/sinComputar/bloqueados check into a helper called in both branches).
Set the exit code from the result in both output modes.:
function estadoSalida({ casos, error }) {
if (error) return 2;
const hayVencido = casos.some((c) => c.plazos.some((p) => p.dias !== null && p.dias < 0));
const haySinComputar = casos.some((c) => c.plazos.some((p) => p.sinComputar));
const hayBloqueado = casos.some((c) => !c.puedeComputarse);
return hayVencido || haySinComputar || hayBloqueado ? 1 : 0;
}
const resultado = await escanear();
if (JSON_OUT) console.log(JSON.stringify(resultado, null, 2));
else informar(resultado);
process.exitCode = estadoSalida(resultado);
- Apply fix
Check the box to apply the fix or reply for a change | Was this helpful? React with 👍 / 👎
| if (proximos.some((p) => p.dias < 0) || sinComputar.length || bloqueados.length) { | ||
| process.exitCode = 1; | ||
| } |
There was a problem hiding this comment.
⚠️ Bug: Imminent (non-overdue) deadlines don't trigger exit 1
The exit-code condition is proximos.some((p) => p.dias < 0) || sinComputar.length || bloqueados.length. A workspace whose only issue is a deadline that is close but not yet past (e.g. a 🔴 fatal en 3d, exactly the case shown in the PR's example output) yields exit 0 — reported as "limpio". This defeats the stated purpose ("exit 1 cuando hay algo que atender") for the most time-sensitive scenario and would let a chained check pass while a fatal deadline looms. Treat any entry in proximos as attention-worthy.
Any deadline within the window, not only overdue ones, marks the run as needing attention.:
if (proximos.length || sinComputar.length || bloqueados.length) {
process.exitCode = 1;
}
- Apply fix
Check the box to apply the fix or reply for a change | Was this helpful? React with 👍 / 👎
CI failed: Smoke test workflow failed because the project is missing a dependencies lock file required by the setup-node caching configuration.Overview1 log analyzed from the smoke-test job revealed a configuration failure due to a missing lock file required for npm caching. FailuresMissing Dependencies Lock File (confidence: high)
Summary
Code Review
|
| Auto-apply | Compact |
|
|
Important
Your trial ends in 4 days — upgrade now to keep code review, CI analysis, auto-apply, custom automations, and more.
Was this helpful? React with 👍 / 👎 | Gitar
| const hoy = new Date(); | ||
| hoy.setUTCHours(0, 0, 0, 0); | ||
| const diasHasta = (f) => Math.round((f - hoy) / 86400000); |
There was a problem hiding this comment.
💡 Edge Case: UTC-based 'hoy' can shift day count for evening runs
hoy is derived from new Date() then floored with setUTCHours(0,0,0,0), and deadlines are parsed to UTC midnight. For a user in Argentina (UTC-3) running the scanner in the evening, the UTC date is already the next calendar day, so a deadline due 'tomorrow' local time is reported as en 0d (and an overdue-by-today boundary can flip). Since the tool's audience is Argentine courts, anchor 'today' to the local (or an explicit America/Argentina) calendar date rather than UTC to avoid off-by-one urgency counts.
Was this helpful? React with 👍 / 👎
Las skills que hay trabajan un caso. Esta mira todos a la vez, porque el plazo
que se pierde en una Defensoria casi nunca es el que estabas mirando.
El modo de falla que persigue
No es el plazo que computaste y se te paso: ese lo tenes en la cabeza. Es la
fila que quedo asi:
Alguien abrio el caso, cargo el acto, y no volvio. Con tres expedientes se nota.
Con veinte no se nota nunca, y desde afuera se ve identico a un caso al dia:
una tabla prolija, sin fechas rojas, porque no hay fechas.
Por eso el reporte separa tres cosas y no las mezcla:
no sabes.
o el fuero. Parece un problema de formulario y es un plazo escondido.
El script no computa ningun plazo, a proposito
componentes/vigia/escanear.mjslee fechas ya escritas y cuenta dias corridoshasta ellas para ordenar la urgencia. Nada mas.
Restar dias habiles sin saber la jurisdiccion, la feria y las acordadas del
tribunal seria adivinar justo lo que la regla de la casa prohibe adivinar. El
computo sigue siendo de
argentina-plazos, que pregunta lo que le falte.Esa division tambien es lo que hace util el reporte: el escaner puede decir con
certeza "esta fila no tiene fecha" sin arriesgar una fecha equivocada, y una
fecha equivocada que figura como cerrada es peor que ninguna, porque deja de
aparecer en el reporte siguiente.
Detalles que salieron de leer la plantilla
Una ficha con los parentesis de ayuda sin completar cuenta como incompleta:
Eso no es una jurisdiccion declarada, es la plantilla intacta, y tratarlo como
dato habilitaria un computo sobre un fuero inventado. Hay un test para eso.
La fila de ejemplo de la plantilla, entre guiones bajos, se ignora. Si no, todo
caso recien abierto apareceria con un plazo pendiente que no existe y el
reporte se volveria ruido a la semana.
Verificacion
Los expedientes de prueba se arman en /tmp y se borran. Nunca se escribe nada
dentro de casos/, ni siquiera inventado: la regla de la casa es que ahi no entra
nada que se parezca a un caso.
Se agrego el workflow que los corre. A diferencia de los smoke de SAIJ, estos no
tocan ninguna API, asi que no hay motivo para que sean tolerantes a fallos.
Qué se ve al correrlo
Devuelve exit 1 cuando hay algo que atender y 0 cuando está limpio, así se puede
encadenar. Con
--jsonsale estructurado.Lo que deliberadamente no hace
No manda avisos. Reporta cuando la corrés. Un sistema que avisa solo hace
falta, pero necesita dónde correr programado; es el paso siguiente, no este.
No abre el expediente electrónico. Si el juzgado notificó algo que nadie
cargó en
casos/, el vigía no lo sabe. Sincronizar con el sistema del PoderJudicial es otro trabajo, y bastante más grande.
No decide qué es urgente. Ordena por fecha y respeta el 🔴 que puso el
defensor. Entre dos plazos del mismo día decide una persona.