Unificar a NULL las 474 celdas de expediente que MOVILBA-248 dejo en cadena vacia: el loader nunca escribe '' y la divergencia rompe la convergencia con el transform
db02, 2026-09-05, DEV, despues de aplicar MOVILBA-248 (02ffe61c). La migracion escribio cadena vacia ('') en las columnas de expediente; el spec del transform del loader (docs/reference/movilba-248-loader-transform.md) escribe NULL. Hay que unificar, y la direccion NO es opinable: la decide el dato. MEDIDO, tabla ancha, denominador 5370: el loader NUNCA escribio '' en esas columnas. raw_expte_alta NULL en 726 filas -> tipada NULL en las 726, '' en 0. raw_expte_baja NULL en 1875 -> tipada NULL en las 1875, '' en 0. Y raw_expte_alta = '' en 0 filas, raw_expte_baja = '' en 0. clean() mapea celda vacia a None y eso es lo que aterriza. O sea NULL ya significa 'la celda del libro esta vacia' y '' no significa nada todavia. LAS 474 CADENAS VACIAS SON NUESTRAS: 271 en expte_alta + 203 en expte_baja de la ancha, que son exactamente los dos conteos de UPDATE de la migracion. En la legacy 246 + 173 contra 245 + 173 de la migracion: la de mas es id 9637 y NO es de 248 (ver abajo). DIRECCION: unificar hacia NULL, nunca hacia ''. Ensenarle al loader a emitir '' crearia un valor que no emitio nunca en 5370 filas y volveria nuestra correccion indistinguible de una celda del libro que de verdad tenga cadena vacia. Con NULL de los dos lados, el loader reescribiendo la columna produce EL MISMO valor que produjo la correccion, y esa convergencia es lo que hace a MOVILBA-252 sobrevivible en vez de solo postergado. ALCANCE Y GATE (hallazgo de audit, y es la forma madre de la noche): la seleccion tiene que ser 'esta en respaldo.m248_wide/m248_legacy Y hoy vale ''', NUNCA 'hoy vale '''. Gatear por la poblacion que uno escribio, no por el sintoma visible. Un predicado que solo mirara el valor actual se llevaria puesta la fila 9637 en silencio. NO ES URGENTE Y NO ES COSMETICO POR CASUALIDAD: audit leyo clasificarExpediente (src/lib/historial-vehiculo.ts:82-90), que hace (valor ?? '').trim() y colapsa NULL y '' al mismo estado falsy antes de que nada mas los mire; el PDF usa el mismo helper (page.tsx:860 y 892). O sea hoy la diferencia es invisible en las dos superficies. Es correccion de consistencia de datos, no de render. Escritura en DEV: archivo propio, gates propios, ensayo propio y GO de Elazar. 474 celdas.
Activity
-
Ya estaba hecho cuando se filo: es la migracion 248b, aplicada en DEV a las 04:1x, commit a2649f19. 892 celdas pasaron de cadena vacia a NULL - 271+203 anchas y 245+173 legacy. La direccion coincide con lo que midio db02 (el loader escribio NULL en 726/726 y 1875/1875, y '' en cero) y con el spec del transform. La regla de alcance que pidio audit ya estaba adentro por construccion: los cuatro UPDATE hacen JOIN contra respaldo.m248_wide/m248_legacy y filtran ademas por = '', o sea 'esta en el respaldo Y hoy esta vacio', nunca 'hoy esta vacio' solo. Verificado despues: id 9637 sigue con '' y sin tocar, quedan 1 celda vacia en las cuatro columnas (la suya) y 0 filas del respaldo con vacio. Gates de 248b: H1 ninguna fila del respaldo conserva '', H2 ninguna celda tipada volvio a tener la frase, H3 las 888 filas conservan la frase en observaciones, H4 el espejo raw sigue en 472 y las observaciones multilinea en 28.