DEV: 131 vehiculos vivos sin ninguna fila viva de historial - mismo defecto que MOVILBA-111 pero del import de faltantes
Medido por db-mba-l-cc en movilba_dev 2026-08-21 08:23 ART. 131 vehiculos vivos con CERO filas vivas de vehiculo_historial (prod tiene 1, que es MOVILBA-111). El otro lado del invariante esta limpio: 0 vehiculos con mas de una fila viva, o sea que uq_vehiculo_historial_activo hace su parte. Los 131 tienen filas de historial, ninguna viva. ATRIBUCION MEDIDA, no inferida: creado_por de la ultima fila de historial de los 131 es 'import-rutap-faltantes-2026-08-21-dev', 131 de 131. O sea el paquete de faltantes de las 06:58, no la reconciliacion de estado de las 07:08 - los 7 dominios clase A de esa reconciliacion (AE060XC, AE631MI, PQP070, AI357EF/EG/EH) y PON576 no estan entre los 131, cero coincidencias. MISMA FORMA QUE 111 Y DE OTRO PAQUETE: los dos aplicaron la regla 'fila cerrada lleva borrado_en' a filas donde ningun indice unico la forzaba. Y el mismo carril verifico los dos paquetes - el de faltantes celda por celda, el 104 linea por linea - y se le paso las dos veces por la misma razon: chequear el criterio sin chequear si la restriccion que lo justifica aplicaba a esa fila. POR QUE ARREGLARLO IGUAL AUNQUE SEA DEV: rige la regla de Elazar de que dev es entorno de prueba y su drift no es drift, PERO el modelo de intervalos de MOVILBA-99 se construye contra dev, y 131 vehiculos sin fila viva se van a leer como 131 vehiculos sin periodo vigente. No es urgente, no es prod, y necesita su propio GO. GATE QUE VA EN LA PLANTILLA DEL HARNESS, no solo en el fix: afirmar pre y post que todo vehiculo vivo tiene exactamente una fila viva de historial. Prod habria fallado a las 07:29 y dev a las 06:58.
Activity
-
OWNEADO por db02-mba-l-cc, que acepto la atribucion por creado_por sin discutir una celda: el import de faltantes es su linaje, asi que ownea los dos loops, prod y dev. CARACTERIZADO, todavia sin draft. De los 131: 103 tienen una sola fila de historial y 28 tienen varias (maximo 3). Medidas las dos cosas que podrian haber hecho ambigua la correccion, las dos limpias: CERO de los 131 tiene una fila abierta que este apenas soft-deleteada (o sea que ningun vehiculo se esta cerrando mal) y CERO tiene empate en max(fecha_baja) (o sea que 'la ultima fila cerrada' resuelve a exactamente una fila por vehiculo, 131 candidatas para 131 vehiculos). El arreglo es el mismo UPDATE de una columna que en prod, aplicado a la fila de max(fecha_baja) de cada uno, con los mismos gates de invariante pre/post mas un gate candidatas=escritas por vehiculo para que un fan-out aborte en vez de escribir.
-
PAQUETE LISTO Y ENSAYADO. docs/migrations/2026-08-21-movilba-112-faltantes-borrado-en-DEV.sql, md5 56ba0c75eb92cc6dde9930ef03715aaa, ensayado apply=false con ROLLBACK forzado 08:26, 0.103s, gates verdes: 1741 vehiculos vivos, 131 sin fila viva resolviendo 1:1 a 131 candidatas, las 131 del import de faltantes, sin empates y sin filas abiertas entre ellas; WRITE de 131 filas una columna con candidatas=escritas; GATE POST 1741 de 1741 con exactamente una fila viva y cero con mas de una. OJO CON EL CONTEO: dev tiene 1741 vehiculos vivos y prod 1738. Son 3 mas y NO es drift - dev es entorno de prueba segun la regla vigente de Elazar. Se aclara solo para que nadie compare los dos paquetes y crea que una de las cifras esta mal. LO QUE ESTE PAQUETE GATEA Y EL IMPORT NO, mas alla del invariante: (1) las candidatas no pueden ser filas ABIERTAS apenas soft-deleteadas (0 de 131), porque si no 'revivir la ultima cerrada' podria cerrar en silencio un vehiculo que estaba abierto; (2) ningun vehiculo puede empatar en max(fecha_baja) (0 de 131), porque si no 'la ultima fila cerrada' no es una sola fila; (3) toda candidata tiene que llevar creado_por = 'import-rutap-faltantes-2026-08-21-dev' (131 de 131), o sea que el alcance queda anclado al paquete que causo el defecto y no a la condicion generica - si en el futuro una fila cae en la misma condicion por otro camino, esto ABORTA y vuelve a describirse en vez de ensancharse solo; (4) manifiesto inmutable bkp.movilba112_preimage con (id, borrado_en) de las 131 y GATE MANIFIESTO que aborta si ya existe. Rollback de un solo UPDATE desde el manifiesto.
-
APLICADO EN DEV por db02-mba-l-cc, 11:26, GO verbatim de Elazar ('111 112 109d go'). md5 0964d9b0 (c0042187 estaba muerto). Ensayo y apply identicos: GATE 0 (movilba_dev), GATES PRE (1741 vivos, 131 candidatas 1:1, todas del import de faltantes, sin empates, sin filas abiertas), WRITE (131 filas, solo borrado_en, 2443 cierres sin cambio), GATE POST (1741 de 1741). Verificado en dev: 0 vehiculos vivos violan una-fila-viva; el manifiesto bkp.movilba112_preimage tiene 131 filas, INMUTABLE, no tocar. EL COSTO ACEPTADO CAYO COMO ESTABA ESCRITO: filas vivas con estado_id NULL = 139, y 0 de las 131 revividas lleva estado no-NULL. El movimiento 8 -> 139 es POR DISENO y lo cierra MOVILBA-117 - y es un control positivo medido, no una prediccion cumplida. Solo DEV; la variante de prod no existe y no esta pedida.
-
db02-mba-l-ca / db
-
Re-measured DEV on 2026-08-26: the original 131-row repair was applied, but the live population is now 648 vehicles with zero live history rows (580 have no history at all; 68 have only soft-deleted system_import history). Scope expanded to source-faithful history coverage; no repeat write will be attempted.
-
Source measurement complete in DEV: all 648 affected vehicles are present in Snapshot 5 and all source records are closed. 580 no-history vehicles map to 880 rows; 68 system_import-only vehicles map to 157 rows; total 1,037 source records and zero open rows. This is a raw-provenance history backfill, not an active-state repair.
-
Added docs/design/movilba-112-closed-history-backfill-plan.md: measured scope, raw-provenance rules, quarantine requirements, and pre-write gates. The 648/1037 closed-source coverage gap is explicitly deferred to MOVILBA-42/125 append-only history implementation.
-
Blocked by MOVILBA-42/125: the source-faithful 648-vehicle/1,037-row backfill requires the append-only wide-history schema and current-projection quarantine gates. A legacy mass-undelete would violate the agreed audit-field and SSOT-history policy.
-
Unblocked by Elazar decision B: remove both legacy vehiculo_historial uniqueness indexes in the coordinated MOVILBA-42 migration. MOVILBA-112 will prepare a source-faithful closed-history backfill using the agreed quarantine protocol; wide provenance uniqueness remains deferred to MOVILBA-125/42 phase C.
-
Prepared and DEV-rehearsed docs/migrations/2026-08-26-movilba-112-89-history-import-gates.sql inside a transaction: 648 vehicles, 1,037 closed Snapshot 5 rows, zero open rows, and 12 quarantined domains. The section creates temporary provenance/scope/quarantine worklists only and is ready for DB03 integration before consumer-view rewrites and index drops.
-
Snapshot 6 is now promoted to both DEV and PROD. Rehearsed the integrated MOVILBA-112/89 gate against each latest source: 648 vehicles, 1,037 closed source rows, zero open rows, and 12 quarantined chains. No persistent history rows were changed; coordinated MOVILBA-42 assembly remains the next write step.
-
Awaiting the coordinated MOVILBA-42 append-only schema migration before source-faithful closed-history rows can be written. Snapshot 6 is already available in both environments and the gate is measured/ready: 648 affected vehicles, 1,037 closed rows, 12 quarantined chains.
-
DEV prerequisite applied and audit-PASS: coordinated MOVILBA-42 selector/index migration is live in DEV. Independent post-apply read: v_vehiculos_linea_actual 1,743 rows/distinct vehicle IDs; v_vehiculos_api_public 2,389 rows/distinct vehicle IDs; legacy history uniqueness indexes absent. Source-faithful 1,037-row closed-history writer remains pending MOVILBA-125, not applied by this migration.
-
DEV prerequisite applied and audit-PASS: coordinated MOVILBA-42 selector/index migration is live in DEV. Independent post-apply read: v_vehiculos_linea_actual 1,743 rows/distinct vehicle IDs; v_vehiculos_api_public 2,389 rows/distinct vehicle IDs; legacy history uniqueness indexes absent. Source-faithful 1,037-row closed-history writer remains pending MOVILBA-125, not applied by this migration.
-
Correction to dependency state: DEV MOVILBA-42 schema migration is applied. App release was briefly blocked by NULL fecha_alta inserts; audit now PASSed the five-path fix. Source-faithful backfill remains separate and has not written history rows.
-
MOVILBA-42 append-only selector/index foundation is now applied and audit-PASS in DEV and PROD. The separate source-faithful 1,037-row closed-history backfill remains pending MOVILBA-125 wide provenance/quarantine implementation; no such rows were written by the release.
-
db02-mba-l-cc / db
-
parent=MOVILBA-125
-
Absorbido por MOVILBA-125. No estaba activo: quedo inProgress de una sesion anterior en un carril que se retiro. db02-mba-l-ca confirmo CERO escrituras suyas en DEV y PROD sobre este item, y NO reclama el script DEV del 08-21 (ese fue db02-mba-l-cc). Alcance registrado: docs/design/movilba-112-closed-history-backfill-plan.md - snapshot 5 midio 648 vehiculos vigentes / 1037 filas cerradas de origen, ninguna abierta. La accion que queda NO es un fix propio: es el camino de historial normalizado/holding de MOVILBA-125. Restricciones que sobreviven al relevo: nunca hacer un mass-undelete, y cuarentenar solo la proyeccion vigente, jamas el historial.
-
db02 2026-09-05, re-derivado en DEV y NO se cierra: el numero depende del test de vivo que se use, y los dos NO coinciden. Con borrado_en IS NULL sobre vehiculos: 0 vehiculos sin fila viva de historial (era 131). Con el estado real (vehiculos_datos_colectivos.estado_id via v_opciones), que es el test correcto por [[reference_borrado_en_is_not_the_liveness_test]]: 30 vehiculos sin NINGUNA fila viva de historial - 17 en ALTA, 4 en BAJA, 7 sin estado, 2 en MANTENIMIENTO - y 28 sin ninguna fila de historial en absoluto. Los 30 tienen borrado_en NO NULL (hay 32 vehiculos soft-borrados en total), por eso el primer test los esconde. Los 17 en ALTA soft-borrados son la parte que hay que clasificar antes de tocar nada. Denominador 2443 vehiculos.
-
db04-mba-l-ca
-
db04-mba-l-ca 2026-09-24 04:05 ART — SELECT-only installed-object check in DEV movilba_dev and PROD movilba: to_regclass('public.vehiculo_historial') is NULL in both; the ticket's historical population/column premise cannot be reverified in that retired table. Current replacement rutap.vehiculo_historial_normalizado has 5528 nondeleted imported rows in each base, but this sweep did not exercise the ticket-specific invariant against it. Status unchanged; do not apply an old-table repair.
-
cleared: Absorbido por MOVILBA-125. No estaba activo: quedo inProgress de una sesion anterior en un carril que se retiro. db02-mba-l-ca confirmo CERO escrituras suyas en DEV y PROD sobre este item, y NO reclama el script DEV del 08-21 (ese fue db02-mba-l-cc). Alcance registrado: docs/design/movilba-112-closed-history-backfill-plan.md - snapshot 5 midio 648 vehiculos vigentes / 1037 filas cerradas de origen, ninguna abierta. La accion que queda NO es un fix propio: es el camino de historial normalizado/holding de MOVILBA-125. Restricciones que sobreviven al relevo: nunca hacer un mass-undelete, y cuarentenar solo la proyeccion vigente, jamas el historial.
-
db04-mba-l-ca 2026-10-01 21:54 ART — Absorbido por el modelo de historial normalizado de MOVILBA-125; no queda un fix autónomo sobre public.vehiculo_historial. Medición instalada del 24/09: to_regclass('public.vehiculo_historial') es NULL en movilba_dev y movilba; el denominador original de 131 filas de la tabla retirada no es re-verificable allí. La nota posterior del 05/09 ya redujo la población del criterio antiguo a 0 usando borrado_en IS NULL y advirtió que otra definición daba 30, así que tampoco hay una cifra vigente que justifique ejecutar el plan histórico. Cualquier invariante actual se mide y corrige en rutap.vehiculo_historial_normalizado bajo 125, sin mass-undelete ni borrado de historia fuente. Cancelado como ítem duplicado/obsoleto, no como certificación de que 125 esté terminado. Sin escritura de DB.