v_vehiculos_hist_ultimo publica el estado de un periodo cerrado como estado corriente (fix de vista, sin escritura)
v_vehiculos_hist_ultimo publica el estado_id de una fila de historial cuyo periodo esta CERRADO (fecha_baja cargada) como si fuera el estado CORRIENTE del vehiculo. Ese es el defecto real detras de MOVILBA-147: los datos no estan mal - las 7 filas vivas ya tienen la fecha_baja correcta del libro - lo que esta mal es la derivacion de la vista. FIX DEL LADO DE LA VISTA, SIN ESCRIBIR DATOS: por eso no necesita GO de PROD ni carril db. Una fila con fecha_baja cargada no describe el estado actual; su estado_id es una foto de esa fecha (60 por ciento de la columna ya es NULL, o sea 'el historial no opina' es el caso normal). La vista tiene que devolver NULL como estado derivado cuando la fila elegida esta cerrada, no propagar el sello. GATE DE ACEPTACION - se gatea el INVARIANTE, no el sintoma: 'ninguna fila viva de vehiculo_historial con fecha_baja cargada puede aportar estado_id al estado corriente'. Medido 2026-09-03 (db02-mba-l-cc, SELECT): PROD 1740 filas vivas, 140 vivas-cerradas, 7 con estado_id, las 7 con 116 ALTA, y las 7 son exactamente las que elige la vista. DEV: 157 vivas-cerradas y 26 con estado_id. Los 19 de diferencia NO se ven como contradiccion porque estan selladas 117 BAJA y coinciden con la ficha por casualidad - por eso contar contradicciones subcuenta el defecto en DEV por 19. Despues del fix el cross-tab ficha-vs-historial no debe tener ninguna celda 117/116 en ninguno de los dos entornos, y las vivas-cerradas con estado_id que aporten estado deben ser 0 en ambos. Control positivo obligatorio: si la consulta de vivas-cerradas devuelve 0 filas de entrada, el gate aborta - un cero sin entrada no prueba nada.
Sub-tickets — 1/1 done
Activity
-
parent=#3072
-
Aplicada en DEV por db02-mba-l-cc el 2026-09-03. Target confirmado antes de tocar nada: inet_server_addr 10.9.10.54, movilba_dev, PG 15.17. PROD sin tocar. Sin conflicto con lo que DEV tenia: db02 diffeo pg_get_viewdef contra el archivo antes de aplicar y el cuerpo existente era identico caracter por caracter salvo la expresion de estado_id. Se conservan verbatim la lista de columnas, el DISTINCT ON, el filtro de borrado_en, el EXISTS de exclusion de sucesor y el ORDER BY completo (flag de sucesor, fecha_alta DESC NULLS LAST, id DESC). El orden que exige commons s12 quedo intacto. Las dos compuertas pasaron y la transaccion commiteo. Gate 1 en silencio, o sea cero periodos cerrados publicando estado. Gate 2: '1604 periodos abiertos, 1426 conservan su estado'. DEV antes -> despues sobre v_vehiculos_hist_ultimo: filas 1754 -> 1754, abiertos 1604 -> 1604, abiertos con estado 1426 -> 1426, cerrados 150 -> 150, cerrados CON estado 20 -> 0. Se movio solo la columna objetivo; ningun periodo abierto perdio su estado y no cambio ningun conteo de filas. LO QUE ESTA MIGRACION NO ARREGLA, y es el numero a vigilar: la vista deja de publicarlo pero la columna sigue estampada. SELECT count(*) FROM vehiculo_historial WHERE borrado_en IS NULL AND fecha_baja IS NOT NULL AND estado_id IS NOT NULL da 26 antes y 26 despues. Ese 26 es lo que tiene que llegar a 0 cuando se arregle el importador, no la vista. Correccion al encabezado del archivo: yo escribi 157 cerrados-pero-vivos con 26 estampados. DEV hoy mide 150 cerrados al grano de la vista con 20 estampados, y 26 al grano de la tabla. El 20 contra 26 NO es drift, es grano - la vista deja una fila por vehiculo y el invariante cuenta todas las filas vivas. El 157 contra 150 si es movimiento real de DEV desde que escribi el encabezado. NO EJERCITADO: PROD (pide GO fresco de Elazar) y ningun consumidor de la vista - db02 midio la vista, no la app.
-
DEV aplicado y verificado. Queda PROD, que pide GO fresco de Elazar.
-
HIPOTESIS DE MECANISMO, db02-mba-l-cc 2026-09-05 09:44 - DOS ESPECIMENES, NO LA CLASE, y asi hay que tratarla. AE352LD y AF023VE tienen CERO filas borradas logicamente entre los dos (4 y 5 filas, todas con borrado_en NULL), asi que el predicado successor.borrado_en IS NULL de MOVILBA-291 no los puede mover BAJO NINGUN DATO: 291 y 212 son separados por construccion, no por casualidad de la medicion de las 09:42. Y NO SON UN DEFECTO DE ORDEN TAMPOCO. AE352LD: la 3772 esta abierta desde el 2026-04-23 y sin expte_baja; la cadena de expedientes corre 9287 -> 16528 -> 16529 y la 16529 es genuinamente TERMINAL, nada abre con su expte_baja. O sea la vista elige bien el terminal de la cadena. El problema es que la 3772 es un SEGUNDO periodo abierto POR FUERA de la cadena - viejo, dejado atras. AF023VE es la misma forma: 4003 abierta desde el 2026-07-29 mientras la cadena corre 9264 -> 9265 -> 16756 -> 18122. Asi que los dos son la duplicacion de MOVILBA-285 vista desde el otro lado: la vista nombra un periodo cerrado como vigente porque la cadena termina ahi legitimamente mientras una fila abierta rancia queda fuera de la cadena. LO QUE FALTA ANTES DE TRABAJAR ESTE ITEM: medir cuantos de los casos de 212 tienen una fila abierta fuera de cadena. Dos especimenes no son la clase. Si la mayoria la tiene, 212 es un sintoma de 285 y se cierra con el; si no, hay mas de un mecanismo. NO trabajar 212 como problema de ordenamiento hasta que eso este medido.
-
db02-mba-l-cc, DEV, 2026-09-05 09:49 ART. Correccion de la cifra que puse hace diez minutos. DIJE que la clase de este item es de 2 vehiculos. Con el cruce de predicados corrido, la forma de este item - APERTURA DUPLICADA con un solo periodo abierto - tiene 45 miembros. Los 2 (AE352LD, AF023VE) son el subconjunto donde ademas la vista termina eligiendo un periodo cerrado. Los otros 43 llevan la misma apertura duplicada y su consecuencia todavia no salio a la superficie. MECANISMO, y no es un problema de ORDEN: es una BIFURCACION. Dos filas vivas abren con el MISMO expte_alta; una se cierra y continua la cadena, la otra queda abierta para siempre. La vista sigue correctamente la rama que termina. En AE352LD son 3772 y 16528 con EX-2026-19335080 (16528 continua en 16529); en AF023VE son 4003 y 16756 con EX-2026-34267383 (16756 continua en 18122). MI HIPOTESIS ANTERIOR ERA FALSA: dije que la fila abierta estaba FUERA de la cadena. Esta DENTRO en los 2 de 2 - alguien reclama su expte_alta como su propio expte_baja. DENOMINADOR: de 2414 vehiculos la vista elige una fila cerrada en 805, pero 803 no tienen ninguna fila abierta y no son defecto. La clase de este item son los 2 con fila abierta viva. CONSECUENCIA: este item no se trabaja como defecto de ordenamiento. Es la misma duplicacion de apertura de MOVILBA-285 en otro estado corriente abajo, y se repara alli. NO EJERCITADO: no medi la consecuencia de los 43 sin sintoma. Sin escrituras. PROD sin medir.
-
LA CLASE ES 45, NO 2 - db02-mba-l-cc 09:49. AE352LD y AF023VE son el subconjunto MANIFESTADO: aquellos donde la fila abierta sobrante ademas hace que la vista elija un periodo cerrado. Los otros 43 llevan la misma apertura duplicada sin consecuencia visible todavia. El mecanismo es una BIFURCACION en una apertura duplicada: dos filas abren con el mismo expte_alta, una se cierra y continua la cadena, la otra no se cierra nunca. La vista sigue correctamente la rama que termina y la otra queda abierta para siempre. Retirado el 'exactamente dos vehiculos' de hace veinte minutos.
-
coder03-mba-l-cc / coder
-
coder03assistant-mba-l-ca | 2026-09-24 04:00:26 ART DEV movilba_dev and PROD movilba, read-only 2026-09-24: v_vehiculos_hist_ultimo has 815/814 closed periods respectively, and 0/0 closed periods with published estado_id. Both installed view definitions mask closed-period state; positive-control populations nonzero. Requested view invariant passes in both bases.
-
audit pass: 2026-09-24 close, view-level closed-period state invariant in DEV and PROD
payload
{"scope":"2026-09-24 close, view-level closed-period state invariant in DEV and PROD","outcome":"pass","evidence":"Completed event reports 815 DEV and 814 PROD closed rows selected by v_vehiculos_hist_ultimo, with 0/0 publishing estado_id; nonzero populations satisfy the positive control. Migration da1b2b89 explicitly projects CASE WHEN fecha_baja IS NULL THEN estado_id ELSE NULL END and gates closed rows with nonnull state. This matches the ticket's view invariant, not a data-cleanup claim. Cross-tab ficha-vs-historial was not separately evidenced by the close and remains outside this scoped PASS.","reportRef":null}