basquetWi + New ticket
movilba MOVILBA-485

La ficha de vehiculo tira 'Error al buscar el vehiculo' en PROD: es un statement timeout disfrazado de dominio no resuelto, no el replate

Done urgent cmcoder03assistant-mba-l-ca

SINTOMA: https://app.movilba.com/vehiculos/AH152NT tira 'No se pudo resolver el dominio del vehiculo' y 'Error al buscar el vehiculo'. CAUSA MEDIDA, y NO es lo que parecia: no tiene nada que ver con el replate ni con las dos filas de vehiculos que comparten el dominio. El mensaje sale del catch de resolverVehiculoPorDominio (src/actions/vehiculos.ts:515), o sea que hubo una EXCEPCION, no un 'no encontrado' ni un 'ambiguo' - esos dos tienen su propia rama y no dicen esto. La excepcion es un STATEMENT TIMEOUT. En findDominioCandidates el es_vivo se calculaba con un EXISTS CORRELACIONADO contra public.v_vehiculos_list_alta, o sea que la vista se re-evaluaba UNA VEZ POR FILA CANDIDATA. La vista sola tarda ~58ms y el WHERE lleva un OR sobre una columna de un LEFT JOIN, asi que el planner recorre las ~2400 filas vivas de vehiculos: el producto se va a minutos. Medido en PROD: la consulta original muere por statement_timeout; la misma con la vista en un CTE MATERIALIZED devuelve la fila correcta (id 6030, es_vivo true) en 75ms. ARREGLADO en v5.5.241 (7c42afd5): la vista pasa a un CTE MATERIALIZED que se evalua una vez, y el EXISTS va contra ese CTE. El comentario en el codigo explica por que el MATERIALIZED es obligatorio y no decorativo, porque sacarlo devuelve el defecto sin que nada falle en DEV. LA TRAMPA QUE DEJA: un timeout disfrazado de 'no encontrado'. La pantalla dice que no se pudo resolver el dominio, que manda a investigar el dominio - y el dominio estaba perfecto. Cualquier consulta lo bastante lenta se presenta como dato faltante. NO MEDIDO: si otras pantallas comparten la forma. El unico otro uso de v_vehiculos_list_alta en src/ es un FROM directo, no un EXISTS correlacionado. No se midio si el defecto tambien pegaba en DEV, donde la poblacion es parecida pero el timeout puede estar configurado distinto. Tampoco se midio desde cuando: no se busco con git log -S cuando entro el EXISTS.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Activity

  • wi-cli-venus created · 4w ago
  • wi-cli-venus statusChanged · 4w ago
    Arreglo shipeado a dev en v5.5.241 (7c42afd5). Queda abierto hasta que el arreglo llegue a PROD, que es donde Elazar lo choco: main no se toca sin GO fresco.
  • coder03assistant-mba-l-ca progress · 3w ago
    coder03assistant-mba-l-ca | 2026-09-24 04:00:26 ART dev 7d299b6a; main 721b9eb8: both branches use vivos AS MATERIALIZED in findDominioCandidates; PROD SQL fix already measured at 75ms in item history. Current deployed /vehiculos/AH152NT response was not exercised; leave open for runtime resolution.
  • coder03-mba-l-cc progress · 3w ago
    coder03-mba-l-cc 2026-09-24 04:35 -03 - El arreglo ESTA en PROD, medido, no inferido del historial del item. Dos patas. (1) El codigo: origin/main:src/repositories/vehiculos.ts:558 tiene vivos AS MATERIALIZED, o sea que el EXISTS correlacionado contra v_vehiculos_list_alta que se re-evaluaba por fila candidata ya no esta en la rama de prod. (2) Lo que PROD sirve de verdad, que es la pata que faltaba: curl -fsS https://app.movilba.com/api/health devuelve serviceId 4062, y el decode de la afin de src/app/api/health/route.ts:26-31 con K=137 C=911 da (4062-911)/137 = 23 exacto, o sea patch 23; origin/main:package.json dice 5.6.23. El serviceId desplegado coincide con la punta de main, asi que PROD corre el arbol que tiene el arreglo. La nota de statusChanged del 09-18 que decia que main no se toca sin GO fresco quedo VENCIDA por dos lados: main ya avanzo hasta 5.6.23 y la regla vigente es que un deploy a prod que arregla codigo roto no pide GO. LO QUE NO QUEDA EJERCITADO Y ES POR QUE NO LO CIERRO: la respuesta HTTP real de https://app.movilba.com/vehiculos/AH152NT. Esa ruta esta detras de auth y este carril no tiene sesion de PROD, asi que lo demostrado es que el arbol desplegado contiene el arreglo y que el SQL corregido se midio en 75ms, NO que la ficha abra. Un timeout de statement es sensible a la carga y al plan del momento, asi que el codigo correcto desplegado no es la misma afirmacion que la pagina responde. El instrumento que falta es una sesion autenticada de PROD, y el unico que la tiene es Elazar, que es ademas quien choco el error. Queda abierto esperando ese chequeo de diez segundos, no esperando trabajo.
  • coder03-mba-l-cc assigned · 2w ago
    coder03assistant-mba-l-ca
  • coder03assistant-mba-l-ca blocked · 2w ago
    coder03assistant-mba-l-ca | 2026-09-28 12:36 ART — PROD measurement: https://app.movilba.com/api/health returned serviceId 11597, decoding to patch 78 (v5.6.78); main contains the MATERIALIZED CTE fix in src/repositories/vehiculos.ts:553. GET /vehiculos/AH152NT redirects 307 to /user/login, so the authenticated ficha response and resolution behavior remain unexercised. Blocked pending an authenticated PROD session to exercise that exact route.
  • coder03assistant-mba-l-ca progress · 2w ago
    coder03assistant-mba-l-ca | 2026-09-28 13:41 ART — Proxy checked https://app.movilba.com/vehiculos/AH152NT: redirected to /user/login?callbackUrl=%2Fvehiculos%2FAH152NT; login-page footer showed v5.6.91. No authentication or ficha response was obtained. The deployed timeout-resolution behavior remains unexercised; keep blocked pending an authenticated PROD session.
  • coder03-mba-l-cc note · 2w ago
    coder03-mba-l-cc 2026-09-28 14:32 ART - UNBLOCKED and verified on PROD. The blocker was an instrument error, not an access problem. An authenticated browser session is not the only way to exercise a statement timeout: the timeout happens in the database, so the query is what gets measured. No PROD app login was needed or requested. Measured against PROD (db movilba), connected and then SET ROLE svc_nextjs - which is the role the app actually uses, carrying search_path=public and statement_timeout=5s from its rolconfig. Running as the superuser would NOT have been the measurement: statement_timeout is 0 at the cluster level and only svc_nextjs carries the 5s. SHIPPED BODY (vivos AS MATERIALIZED, src/repositories/vehiculos.ts:551): 355 ms, returns exactly one row - id 6030, dominio AH152NT, es_dominio_actual t, es_vivo t, fecha_alta 2026-06-29. No ambiguity, no exception. 14x margin under the 5s timeout. DISCRIMINATING CONTROL, same role, same session settings, only MATERIALIZED changed to NOT MATERIALIZED - i.e. the pre-fix shape: ERROR: canceling statement due to statement timeout, at 5179 ms. That is the reported symptom reproduced on demand, so the 355 ms is a real measurement of the fix and not of a query that was never slow. Plan detail on the fixed body: vivos is built once (1602 rows), the EXISTS reads the CTE, and the candidate scan removes 2416 rows by filter. Planning 8.5 ms, execution 356 ms. NOT EXERCISED: the ficha PAGE was not rendered - no HTTP request was made and no session was obtained, so nothing here covers the React/action layer above resolverVehiculoPorDominio, only the query that was timing out. If the page still errors, it is a different defect and this measurement does not cover it. Closing. Audit verifies after.
  • coder03-mba-l-cc unblocked · 2w ago
    cleared: coder03assistant-mba-l-ca | 2026-09-28 12:36 ART — PROD measurement: https://app.movilba.com/api/health returned serviceId 11597, decoding to patch 78 (v5.6.78); main contains the MATERIALIZED CTE fix in src/repositories/vehiculos.ts:553. GET /vehiculos/AH152NT redirects 307 to /user/login, so the authenticated ficha response and resolution behavior remain unexercised. Blocked pending an authenticated PROD session to exercise that exact route.
  • coder03-mba-l-cc completed · 2w ago
  • audit-mba-l-cc audited · 2w ago
    audit pass: confirmed MATERIALIZED fix (line 551, vehiculos.ts) is on main, matches coder03's PROD measurement (355ms shipped vs 5179ms NOT MATERIALIZED control, positive control on same role/session)
    payload
    {"scope":"confirmed MATERIALIZED fix (line 551, vehiculos.ts) is on main, matches coder03's PROD measurement (355ms shipped vs 5179ms NOT MATERIALIZED control, positive control on same role/session)","outcome":"pass","evidence":"code present on main; PROD measurement was taken with SET ROLE svc_nextjs matching app's runtime statement_timeout=5s, not superuser - correct instrument","reportRef":null}
bug
4w ago by wi-cli-venus
2w ago
2026-09-28 17:27