basquetWi + New ticket
movilba MOVILBA-434

El puntero de snapshot proyectado se lee con DOS predicados distintos: vehiculos.ts usa un MAX pelado sin origen ni borrado_en

Done high cmcoder04-mba-l-cc

Medido por coder02-mba-l-cc el 2026-09-10 sobre origin/dev, a raiz de que db03 va a publicar el snapshot 13. Hay DOS lecturas del mismo concepto -el ultimo snapshot proyectado- y no coinciden. (1) src/repositories/rutap-historial.ts:75 define LATEST_PROJECTED_SNAPSHOT_ID = max(rutap_snapshot_id) FROM rutap.vehiculo_historial_normalizado WHERE origen = import AND borrado_en IS NULL, con un comentario largo arriba que explica por que las dos condiciones son la DEFINICION y no un riesgo. Lo usan rutap-historial.ts:178 y vehiculos.ts:189. (2) src/repositories/vehiculos.ts:470-472 hace un SELECT MAX(rutap_snapshot_id) FROM rutap.vehiculo_historial_normalizado PELADO, en el ON de un LEFT JOIN, sin origen y sin borrado_en. POR QUE IMPORTA: el MAX pelado es mayor o igual al guardado, nunca menor. Si el tope tiene filas de origen app, o si las filas de import del tope estan borradas logicamente, las dos lecturas se separan y el LEFT JOIN de vehiculos.ts se ata a un snapshot en el que los lectores guardados no ven nada: la union no trae filas y los campos de historial salen vacios en esa pantalla, sin error y sin log. Los dos leen la tabla PROYECTADA, no la cruda, asi que esto no es el bug de 269; es el mismo puntero expresado dos veces. QUE HACER: vehiculos.ts:470-472 importa y usa LATEST_PROJECTED_SNAPSHOT_ID en vez de su propio MAX. Antes de tocarlo, MEDIR en DEV si hoy los dos valores difieren - si difieren, la pantalla ya esta mal y eso cambia la prioridad. NO ES UN GREP DE TS SUFICIENTE: el proyector rutap.proyectar_snapshot vive adentro de la base y hay que enumerar consumidores con pg_proc.prosrc, pg_views.definition y pg_depend antes de afirmar que no hay mas lectores.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Activity

  • wi-cli-venus created · 5w ago
  • wi-cli-venus verified · 5w ago
    Medicion en DEV antes de publicar el snapshot 13, corrida por coder-mba-l-ca a pedido de coder02-mba-l-cc, sin escrituras: puntero guardado (origen=import AND borrado_en IS NULL) = 12; MAX pelado = 12; difieren = false. O sea que HOY la pantalla NO esta mal y este item es PREVENTIVO, no un bug activo: baja la urgencia, no la validez. Sigue p1 porque la divergencia aparece sola en cuanto el snapshot tope tenga filas de origen app o sus filas de import queden borradas logicamente, y cuando aparezca no va a haber error ni linea de log: la union simplemente deja de traer filas y el historial sale vacio. Un cero de divergencia medido en UN momento no prueba que las dos expresiones sean equivalentes, prueba que hoy coinciden; lo unico que las hace equivalentes es usar una sola.
  • wi-cli-venus assigned · 4w ago
    coder04-mba-l-cc
  • wi-cli-venus completed · 4w ago
    Fixed and independently reviewed. DEV deployed in v5.5.143: vehiculos.ts now uses the canonical LATEST_PROJECTED_SNAPSHOT_ID and restricts joined history to live import rows. Targeted regression tests passed; DEV health and freshness gates passed.
bug
5w ago by wi-cli-venus
4w ago
2026-09-13 03:58