Si falla la lectura del colectivo la pantalla de edicion se vuelve un borrado masivo silencioso
Hallazgo de audit-mba-l-cc el 2026-09-07 23:03 leyendo `origin/dev`; verificado por coder02-mba-l-cc contra el archivo antes de abrir el item. **NO se disparo esta noche** - la medicion de db02 sobre AA033TK dio la ficha intacta y `changes` con UNA sola clave. Es un camino LATENTE, y predatea todo lo shipeado hoy. EL MECANISMO, en dos mitades que solas no hacen daño y juntas si: MITAD 1 - `src/app/vehiculos/[dominio]/editar/colectivo/page.tsx:284-291`: ``` let colectivoData: Record<string, unknown> = {}; try { const result = await obtenerColectivo(Number(vehiculoId)); colectivoData = (result.success && result.colectivo ? result.colectivo : {}) as ...; } catch { // No colectivo data found, using defaults } ``` Si la action TIRA, o si devuelve `success:false`, `colectivoData` queda `{}` **en silencio**. Sin mensaje, sin fila de log, sin diferencia visible. Despues los campos se pueblan con `String(undefined || "")` = `""` y el formulario renderiza en blanco, con aspecto perfectamente normal. MITAD 2 - el formulario postea `formData` ENTERO en cada guardado. Lo dice el comentario del propio archivo en `:582-590`. Solo `entidadId` y `lineaId` se omiten cuando no cambiaron (`:604-605`); **todas las demas columnas del colectivo viajan siempre**, y en `repositories/vehiculos.ts:955-966` cada `""` se convierte en null explicito via `X ? parseInt(X) : null`. JUNTAS: una lectura fallida deja el formulario vacio, el usuario guarda cualquier cosa -o nada- y se escriben NULLs sobre todas las columnas del colectivo. **El usuario no ve nada raro en ningun momento**, ni al cargar ni al guardar. ASIMETRIA QUE LO HACE PEOR DE DIAGNOSTICAR: `estadoId` esta protegido POR ACCIDENTE. `:964` es el unico que saltea `''`; sus hermanos de `:955-963` y `:965` no. O sea que un vehiculo puede quedar con TODAS las columnas en null y el `estado_id` intacto - y como la ficha muestra el estado, **la pantalla sigue pareciendo sana**. Una ficha que muestra "Alta" NO es evidencia de que la fila este entera. POR QUE NO SE VIO ESTA NOCHE: la lectura anduvo, el formulario cargo con los valores reales, y entonces el post trajo los valores CORRECTOS de vuelta. Se comparo contra `beforeColectivo`, no difirieron, y `changes` quedo en `["observaciones"]`. El camino no se ejercito. ARREGLO, y hay que decidir la forma antes de escribir: 1. Que el `catch` NO se trague el error: si la lectura del colectivo falla, la pantalla no debe ofrecer un formulario editable. Mostrar el error y no dejar guardar es lo minimo. 2. Distinguir "no hay datos de colectivo" de "no se pudieron leer los datos de colectivo". Son dos estados distintos y hoy producen el mismo formulario en blanco. 3. Que el guardado mande solo lo que cambio, o que el repositorio distinga ausente de vacio para TODAS las columnas y no solo para estadoId, entidadId y lineaId. Ojo: la regla de omitir tiene su propia limitacion documentada en `:592-597` y no se toca sin medir desde el llamador real. CONTROL POSITIVO PARA CUANDO SE ARREGLE: forzar el fallo de `obtenerColectivo` y comprobar que la pantalla NO ofrece guardar. No alcanza con verificar que un guardado normal siga andando - eso es el camino que ya funciona. RELACIONADO: MOVILBA-336 (guardar sin cambios no dice nada) es el mismo silencio en el otro extremo del mismo formulario.
Activity
-
coder-mba-l-ca
-
Confirmed on9dfd4fb0: failed obtenerColectivo silently becomes {}; _initialLoading is never consumed so blank form is also exposed before reads complete. Preparing fail-closed loaded-ID render/submit guard, distinct missing/error outcomes, stale-response cancellation; preserving317/315 payload behavior.
-
Containment prepared in coder-mba-l-ca/movilba-337-edit-load base9dfd4fb0: same loaded vehicle-ID gates rendering+submit; missing vs failed reads distinct; server requestId retained; stale load callbacks cancelled; dropdowns must finish. No partial-PATCH refactor. Chromium real-React component tests with substituted IO: BEFORE fix5 failures/1 successful-load pass; AFTER6/6 PASS, node --test tools/tests/colectivo-edit-load.test.cjs. No DB writes/login/dev server. Diff+SHA256 sent audit; coordinating343 deploy queue with coder04.
-
Audit PASS initial bytes; deploy retry fast-forwarded to231ac8be without touching audited paths. Deployment then stopped precommit at TS2352 (ColectivoDto cast to Record). Lock released, no commit or deploy. Removed unnecessary cast; use typed DTO directly, controls6/6 PASS again. Corrected page SHA ec3fffe6c049c401d1e4aa2871750b56090a7e8b6c4311fe8a7fa8889f922749 sent audit for delta review. Awaiting PASS before retry.
-
Fixed and shipped DEV v5.5.66 commitc95f91962ddb2a5ce1ebb6e289cc31798e47af30. Audit PASS final source ec3fffe6 and test04214790. Actual React/Chromium component regression controls: original code failed5/6, fixed6/6 PASS (independent audit rerun); covers pending read, success:false, throw, absent colectivo, valid saved values, stale vehicle response. No DB integration/live save claimed. Failed/missing/incomplete reads now cannot expose editable form or submit; server requestId retained. Deploy lint/typecheck PASS health first attempt/freshness66 PASS, origin sync, gcaba unconfigured skipped, lock released. No PROD.