← Volver al panel de conciliación · Integración TNI · Mapa de fuentes por capas: de cada cifra a la tabla de TNI →
Dónde vive hoy la información de Truly Nolen International, cómo viaja del ERP hasta las pantallas de Truly Global, el MCP y Truly Analytics, y en qué punto exacto se está atorando.
20-oct-2026 (medido en vivo, 22:25 UTC): Change Tracking y permiso VIEW CHANGE TRACKING activos al 100 % (21 de 21 tablas) en las 7 tablas incrementales de las 3 bases (Truly, TrulyNew, TrulyRuso · tni_ct=11 en el ciclo intradía, 0 recorridos por rowversion), PR #2138 (lector CT) y PR #2198 (bajas en silver dentro del ciclo) en producción; costo a TNI de 14–15 s por ciclo (48 consultas), 0 saltos del freno y ciclo intradía completo en 61–62 s cada 5 min; carrera nocturna de conteo previo a CT cerrada en PR #2447; lago_silver.cliente_rubro con 0 clientes sin clasificar (34.914 con boletas) y los 7 nuevos rubros de TNI (1017..1023) registrados. 10-oct-2026: la sección 8 dice qué operaciones y oficinas existen en Trulydata (toda la red de la hoja, con o sin datos) y dónde entra eso en el flujo de tiempo real; el mapa de fuentes por capas (el de Francisco) lleva la misma regla. Horas en UTC; México es 6 h menos.
VIEW CHANGE TRACKING están ACTIVOS en las 21 tablas (7 tablas × 3 bases: Truly, TrulyNew, TrulyRuso): Clientes, Contactos, Servicios, Ordenes, Propuestas, Tareas y Eventos. Las 11 tablas del ciclo intradía (tni_ct=11) se leen al 100 % por CHANGETABLE(CHANGES ...) sin un solo barrido por rowversion, y todas las bajas en cualquiera de las tres bases se aplican en silver dentro del mismo ciclo de 5 minutos vía 14-aplicar-bajas-del-delta.py. El costo total a TNI es de 14–15 segundos por ciclo (48 consultas, ~140 ms por lectura de CHANGETABLE), muy por debajo del tope de 30 s: el freno ya no salta y el ciclo corre de punta a punta cada 5 minutos exactos en 61–62 s (fallos=0, rojas=[], avisos=[]), disparando al instante tn-analytics-vivo.service.La decisión de Pablo (8-oct): Truly Analytics tiene que ser inmediato. El principio es uno solo: cada tramo del camino procesa sólo las filas que cambiaron, en vez de copiar y recalcular todo una vez por noche. Nada del camino nocturno se quita: queda como la foto sellada de cada día (la que cuadra con las cifras de Francisco); encima corre un camino de día, chico y frecuente.
| Tramo | Hoy (una vez por noche) | Cómo queda (cada 5 min, de 09:30 a 00:45 UTC) | Qué lo sostiene |
|---|---|---|---|
| 1 · Leer el sistema de gestión de TNI (SQL Server) | Foto de ~190 tablas enteras: 1 h 47 min sólo Truly | Con CHANGE_TRACKING en las 21 tablas (7 tablas × 3 bases · tni_ct=11 en el ciclo de día): 14–15 s las tres bases (48 consultas, medido en vivo) | En producción (delta.yaml + lector CT PR #2138). Mismo usuario de sólo lectura |
| 2 · Cargar a silver (Postgres de producción) | Populate que rearma mapas sobre tablas enteras: 32 min | Populate sólo con esas filas + bajas del delta (14-aplicar-bajas-del-delta.py): 16–24 s por base (ciclo completo 61–62 s) | Ola 1 y PR #2198 en producción. Vuelta atrás: una bandera |
| 3 · El lago (corte sellado con centinelas) | 1 h 30 min, una vez por noche | No cambia. El camino de día lee silver vivo; el sellado sigue siendo el de referencia (corte canónico 67 activo · 74/74 capas ok) | Guarda: el camino de día se pausa mientras el lago construye su corte |
| 4 · Truly Analytics | Graba las consultas del catálogo y la pantalla lee ese corte hasta el día siguiente | Un corte vivo (hoy corte 34) apoyado en el sellado (corte 33, 58 ops): recalcula sólo el mes en curso de las operaciones que cambiaron y la pantalla dice «updated N min ago» | Ola 2 y Ola 3 en producción; el vivo nunca reemplaza al sellado |
| 5 · Dónde corre | Caja de Truly (4 vCPU · 15 GB) + Supabase XL | truly-global ccx33 (8 vCPU · 32 GB) y Supabase (400 GB disco · 16 GB RAM). Todo encadenado en la caja de Truly (tn-espejo-intradia.timer → tn-analytics-vivo.service), sin pasar por GitHub en cada ciclo | Activo y verificado en producción |
| Antes del 8-oct | Ciclo 5 min, TNI rápido medido 9-oct 19:00–00:45 | Ciclo con freno, TNI lento medido 9-oct 16:00–18:30 | Con Change Tracking en producción medido 19–20-oct | |
|---|---|---|---|---|
| Un dato nuevo o modificado en TNI se ve en trulydata.ai | hasta 24 h | 5–10 min | 20 min – 1 h 40 ciclo ~20 min; el vivo refresca 3 operaciones por ciclo | 1–5 min ciclo intradía de 53–60 s cada 5 min; 0 saltos del freno |
| Bajas (registros borrados en TNI) | noche | noche | noche | en el mismo ciclo de 5 min (las 3 bases completas) 11 de 11 tablas intradía con Change Tracking activo ( tni_ct=11) |
Dimensiones (oficinas, empleados), reportes ri_*, gold | noche | noche | noche | noche a propósito; la pantalla lo dice por familia |
Por qué ya no salta el freno. Con Change Tracking y permiso VIEW CHANGE TRACKING activos en las 7 tablas incrementales de las tres bases (Truly, TrulyNew, TrulyRuso — 21 de 21 tablas con CHANGETABLE_OK), SQL Server lleva él mismo la lista de filas cambiadas y eliminadas por versión y cada lectura es un seek (~140 ms), sin ningún barrido completo por rowversion.
Costo real a TNI medido el 20-oct (22:25 UTC): 48 consultas por ciclo · 14–15 s totales por ciclo en las 3 bases · tni_ct=11 · 0 saltos del freno · ciclo intradía completo en 61–62 s cada 5 min.
CHANGE_TRACKING en las 21 tablas incrementales de las 3 bases (tni_ct=11 en el ciclo de día, 0 barridos por rowversion); populate «sólo delta» en 16–24 s por base (#2070); bajas del delta marcadas en silver en el mismo ciclo (#2198); carrera nocturna de conteo previo a CHANGETABLE cerrada (#2447); corte vivo de Analytics (corte 34 sobre corte 33) y meses cerrados del lago congelados (mig. 866).silver.propuestas, incorporados los 7 nuevos tipos de edificio de TNI (1017..1023, PR #2459), reconstruido lago_silver.cliente_rubro_v1(67) con 0 clientes sin clasificar (34.914 clientes con boletas) y optimizada lapsed/Q_LAPSED_V2 con enable_nestloop=false (de 15,3 s timeout a 0,34 s · commit 738262f).| Hora | Qué | Por qué / qué cambió |
|---|---|---|
| 20:30 | Hetzner truly-global a ccx33 (8 vCPU · 32 GB) | Antes 4 vCPU · 15 GB sin swap: el espejo nocturno solo pide 11 GB; el ciclo de día tiene que convivir con él, la app y el runner. |
| 20:56 | Supabase a 2XL (8 cores · 32 GB · 380 conexiones) | El ciclo de día suma escrituras encima de las lecturas de la app, el MCP y Analytics; con XL los candados ya se cortaban por tiempo. |
| 20:55 | Se canceló el paso «listas» del corte 17 | Llevaba 4 h escribiendo historia (listas de 24 meses) y bloqueaba subir la base y medir el delta. El corte 17 siguió listo; lo que falte se completa otra noche. |
| 21:18 | Populate «solo delta» integrado (#2070) | El cuello eran los mapas de apoyo sobre tablas enteras (6,6 M órdenes): ahora se piden por las llaves del delta. Medido: de 5–19 min por base a 16–24 s. |
| 21:30 | Primer ciclo intradía automático: 403 s, 0 fallos | La primera ventana (13 h acumuladas) falló dos veces por la carrera de lectura en horario de TNI (246 filas de 29.668 cambiaron mientras se leía) y pasó a la tercera; con ventanas de minutos no se repite. No se aflojó la tolerancia. |
| 21:47 | Corte vivo + pantalla integrados (#162, #2081) | Nace un corte «vivo» sobre el sellado y recalcula solo el mes en curso de las operaciones que cambiaron; el chip dice «updated N min ago». El sellado y la paridad con Francisco no cambian. |
| 22:04 | Primer ciclo del vivo | 21 operaciones con órdenes nuevas; refrescó 2 por ciclo y las otras 19 no bajaban: cada ciclo repetía las mismas dos (orden del plan + tope de 4 min). |
| 22:59 | Ciclo a 5 min | Las cifras que faltaban ya estaban (ciclo entero 163 s); PR #2094 lo deja fijo en el repo. |
| 23:23 | Vivo en 0 pendientes (#163) | Arreglo: rota las operaciones (primero las nunca refrescadas, hasta 3 por ciclo). Nueve ciclos en cadena: 20 → 0. |
| 00:45–09:30 | Pausa nocturna (automática) | Espejo completo + corte del lago + grabación sellada, como siempre; un delta en medio invalidaría el corte. |
| 9-oct 09:30 | El intradía retomó solo tras la noche (162 s) | Noche limpia: espejo completo 08:36, corte 62 del lago activo. |
| 9-oct 09:51 | Corte 19 de Analytics fallido (fuente invalidada) | Carrera: la guarda miró a las 09:50, el corte se abrió a las 09:51:19 y el ciclo escribió silver a las 09:51. Remedio: cláusula 8 de la guarda (#2127): entre 09:30 y 13:00 UTC el intradía espera a que exista el corte listo de hoy. Costo asumido: un día sin corte canónico, el intradía arranca a las 13:00. |
| 9-oct 11:12–11:27 | Ola 3 integrada y desplegada (#2097 + #166) | El lago expone updated_at de órdenes (vista + índice) y el vivo lo lee: ahora detecta operaciones por órdenes modificadas, no sólo nuevas. El conflicto de numeración de la migración se resolvió renumerando (999zzzb/999zzzc). |
| 9-oct 15:32 | Corte 20 listo sobre el lago 62 · vivo 21 nace sobre él (15:44) | Regrabado con el timer parado para que nada lo invalidara; «normalizar» había agotado el tiempo y se renormalizó desde las respuestas guardadas. |
| 9-oct 15:45 | Listas y rellenos ya no bajan el corte (#172, #174, #2127) | El paso «listas» corre con --fase listas: no vacía terminado_at ni invalida por espejo; la guarda del intradía deja de confundirlo con una grabación. Hotfix #2128: llaves repetidas al recargar varias fotos delta (la última gana). |
| 9-oct 16:00 | TNI preguntó por qué se saturó su base | Medido 09:30–15:45: 47 ciclos, 1.009 consultas, 5.393 s de consulta en su SQL Server; el 91 % eran dos COUNT(*) por tabla y ciclo que recorrían Eventos (22 M filas) y Ordenes. Arreglo #2131 (16:08): sin conteos de día, sin Eventos ni Tareas (ninguna consulta de Analytics las usa), medidor del costo por ciclo y freno (cláusula 9). Timer de 15 min de vuelta a 5 por orden de Pablo (15:56). |
| 9-oct 16:00–18:30 | El freno espació el ciclo a ~20 min | Costo normal 27–37 s por ciclo, justo sobre el tope de 30 s: saltó 18 veces en el día. Delay en esa franja: 20 min a 1 h 40. Causa confirmada en el catálogo de SQL Server (18:30): ninguna base tiene índice sobre la columna de versión; Truly recorre 5,7 M de órdenes por lectura. |
| 9-oct 19:00–00:45 | Ciclo de 5 min solo, costo 11–14 s por ciclo | Con el servidor de TNI tranquilo la lectura baja y el freno no salta. Delay 5–10 min. El vivo 21 cerró la noche con 3 pendientes (desde 24 a las 15:57); el corte sellado de la madrugada los absorbe. |
| 9-oct 23:30 | Lector por Change Tracking listo en borrador (Truly Global PR #2138) | Pablo: TNI activa Change Tracking el 10-oct. El fotógrafo pregunta al catálogo si está activo por tabla y con permiso; si sí, lee «cambios desde la versión N» y trae las bajas; si no, sigue por rowversion como hoy. Pruebas en verde. Se integra por la cola de Mergify cuando Pablo diga «integrá», el día de la activación. |
| 10-oct 01:00–07:22 | Espejo nocturno en rojo: las 11 tablas delta de las tres bases; sin corte del lago ni corte sellado de Analytics hoy | No se perdió ninguna fila. El candado del crecimiento comparaba el crecimiento de un día entero (desde la última foto con conteo, la noche anterior) contra la ventana de cinco minutos de la noche, porque desde el arreglo del 9-oct las fotos de día ya no cuentan el origen. Arreglo: Truly Global #2204 (el candado suma las fotos de día); tiene que estar desplegado antes de la 01:00 UTC del 11-oct. Mientras, la pantalla sigue con el corte 20 (lago del 9-oct) y el vivo refresca sobre él; las definiciones nuevas de Francisco (integradas en la madrugada) se verán con el próximo corte sellado. |
| 10-oct 13:00 | El intradía arrancó a las 13:00 y no a las 09:30 | Cláusula 8, como estaba previsto: sin corte sellado de hoy, espera hasta las 13:00 para no invalidar una grabación. A las 13:15 UTC TNI todavía no había activado Change Tracking (0 tablas rastreadas en las tres bases). |
| 11-oct 18:36 | Change Tracking y bajas del ciclo en producción (#2138, #2198, #2204) | TNI activó Change Tracking en dbo.Ordenes de las 3 bases (Truly, TrulyNew, TrulyRuso · tni_ct=3). Se integraron el lector por Change Tracking (#2138), el candado de crecimiento que suma fotos de día (#2204) y 14-aplicar-bajas-del-delta.py (#2198) para marcar ausente_en_origen_desde en silver dentro del mismo ciclo de 5 min. |
| 19–20-oct | Ciclo intradía estable en 53–60 s (costo TNI 11–13 s) + arreglo de carrera nocturna (#2447, #2459, 738262f) | Medido en vivo sobre los ciclos del 19–20-oct: INTRADIA_RESUMEN seg=53..60 fallos=0 bases_con_foto=3 tni_consultas=32 tni_seg=11..13 tni_ct=3; 0 saltos del freno. En el espejo nocturno, PR #2447 cuenta filas_completo antes de consultar CHANGETABLE (eliminando el partial por ventana de 96 s del 19-oct; verificado el 20-oct 03:15 UTC con 734/734 filas y 0 errores). Además se repararon las 639 propuestas en silver.propuestas, se incorporaron los 7 nuevos rubros de edificio de TNI (1017..1023, PR #2459), se reconstruyó lago_silver.cliente_rubro con 0 clientes sin clasificar (34.914 clientes con boletas) y se optimizó lapsed/Q_LAPSED_V2 con enable_nestloop=false (738262f, de 15,3 s timeout a 0,34 s). |
| Ola | Qué entra | Cómo se acredita | Estado |
|---|---|---|---|
| 0 · Medir | Tiempos de cada tramo; qué tablas usan las 158 consultas; infra subida | docs/125 en Truly Global · PR #160 en Analytics · Hetzner ccx33 verificado | hecho (Hetzner ccx33 + Supabase 400 GB / 16 GB RAM activos) |
| 1 · Populate sólo delta + timer intradía a 30 min | lib_solo_delta, mapas por llaves, guardas, tn-espejo-intradia.timer | Pruebas en CI (mismo parquet por los dos caminos → mismas filas); 1 ciclo medido en producción; sombra nocturna en diff 0 | encendida 8-oct 21:30 UTC · PR #2070 integrada · timer cada 30 min · primer ciclo 403 s, 0 fallos (fotos 3 min, populate 16–24 s por base; antes 32 min) |
| 2 · Corte vivo + pantalla | Fila vivo en analytics.cortes, corte/vivo.mjs encadenado tras el delta, chip «actualizado hace N min» | Candado «el vivo nunca es listo»; paridad con Francisco intacta; QA con robot | encendida 8-oct 22:00 UTC · #162 y #2081 integradas · hoy corte 33 listo + vivo 34 (58 ops, 43.877 consultas ok) · chip «updated N min ago» en trulydata.ai |
3 · Ciclo a 5 min + updated_at en el lago | Timer a 5 min; vista e índice de updated_at de órdenes; el vivo ve órdenes modificadas; freno por costo en TNI | p95 del dato en pantalla ≤ 10 min, medido con órdenes reales | encendida 5 min desde el 8-oct 22:59 (#2094) · updated_at desde el 9-oct 11:27 (#2097 + #166) · freno #2131 desde 16:08 |
| 3b · Change Tracking (TNI) | TNI activa Change Tracking en las 3 bases (las 7 tablas incrementales); nuestro lector pide «cambios desde la versión N» y trae las bajas en el mismo ciclo | Costo por ciclo en TNI ≤ 15 s (sin saltos del freno); ciclo completo en ~1 min; bajas en el mismo ciclo | encendida 20-oct 22:15 UTC (#2138 + #2198 + #2447) · activo en las 21 tablas (7 × 3 bases, tni_ct=11 en el ciclo de día) · costo a TNI 14–15 s/ciclo · 0 saltos del freno · ciclo completo en 61–62 s cada 5 min · bajas aplicadas en silver en el mismo ciclo en las 3 bases |
| 4 · Fino y retención | Vivo por presupuesto de tiempo (8 min · TA_VIVO_PRESUPUESTO_MIN); normalizar por operación; retención diaria por índice (tn-analytics-retencion.timer · 6c7c5e5); enable_nestloop=false en las 27 consultas pesadas incl. lapsed/Q_LAPSED_V2 (738262f) | 111 comprobaciones en gate-las-ventas-no-usan-bucles-anidados.mjs + candados en verde | encendida |
✅ 1 · Change Tracking y permisos VIEW CHANGE TRACKING (100 % completado por Elizabeth Espinoza): las 21 tablas incrementales (Ordenes, Clientes, Contactos, Servicios, Propuestas, Tareas y Eventos en Truly, TrulyNew y TrulyRuso) tienen CHANGE_TRACKING y permiso VIEW CHANGE TRACKING activos y verificados en vivo (tni_ct=11 en el ciclo intradía, fallos=0).
📋 2 · Catálogo administrativo de oficinas (16 oficinas nuevas del Cuadre de Información): de las 248 oficinas del cuadre, 232 ya tienen IdOficina y operan en producción; las 16 restantes (México: Mazatlán; Colombia: Villavicencio, Cúcuta, Ibagué; Egipto: Alexandria; Rusia: San Petersburgo, Kazán; Brasil SSE: Pouso Alegre/MG, Belo Horizonte Área 2/MG, Parati/RJ, Espírito Santo II Cachoeiro/ES, Espírito Santo III Linhares/ES, Joinville/SC; Francia: Lyon 1, Lyon 2; Portugal: Faro) ya se muestran en Trulydata con la tarjeta «No tienes esta información» hasta que se den de alta en dbo.Oficinas.
La regla, en tres piezas que se suman (una operación entra si cumple cualquiera; la hoja es la decisión, el lago sólo confirma que lo que dice existe):
| Pieza | Consulta / archivo | De quién | Qué aporta (medido el 10-oct) |
|---|---|---|---|
| Propuestas en 15 meses | sales/Q_OPS | Francisco | Las operaciones con ventas: 41 de la hoja (y 4 fuera de ella —Botswana, Guatemala Viejo, Pakistan, Polska—, que siguen porque tienen propuestas) |
Órdenes de servicio en 15 meses, por fecha_programada (nunca por la fecha de carga al lago) | base/Q_OPS_SERVICIO · PR #191 | Catalizadora | +3: Barbados, Macedonia, Portugal |
| Está en la hoja de Pablo | catalogo/red-tni.json (la hoja, en el repo) + base/Q_RED (toda la red del lago: país, moneda, oficina, activa) · PR #193 | Pablo (la hoja) · Catalizadora (el cruce) | +10 operaciones · +42 oficinas → 54 · 232 con id de TNI |
Por qué la hoja vive en el repo y no es una regla del lago: se midió. «País con empleados» da 75 operaciones (21 fuera de la hoja: Canada, Italy, TNI, Pto Vallarta…) y deja 7 de la hoja sin ninguno (Bahrain, Ivory Coast, Kyrgyzstan, Mexico, Netherlands…); la marca incluir de paises_ops vale para 229 de 239. Ninguna reproduce la hoja. Se verificó que las 54 operaciones y las 232 oficinas con id existen en silver.paises_ops / silver.oficinas, todas activas y sin baja.
| Tramo | Qué hace con la red |
|---|---|
| 3 · El lago (corte sellado) | No cambia: la red se lee de silver como está. |
| 4 · Truly Analytics, sellado (cada noche 09:45 UTC, bloque 1) | La grabación rearma la lista completa: Q_OPS ∪ Q_OPS_SERVICIO ∪ la hoja. Graba analytics.operaciones (las de la hoja con propuestas 0 y el nombre y la moneda del TNI; si el lago no contesta, con el nombre de la hoja) y, sólo si faltan, las oficinas de la hoja en analytics.oficinas con la marca activa del TNI. Las que ya están las sigue gobernando el Q_OFFICES de ventas. Después recorre cada operación con todas las consultas del catálogo, como siempre. |
| 4 · Truly Analytics, vivo (cada 5 min, 09:30–00:45 UTC) | Refresca el mes en curso de las operaciones cuyas órdenes cambiaron. No cambia la lista: una operación nueva en la hoja entra con el sellado siguiente, no con el vivo. |
| Pantalla | La operación aparece en el ámbito del maestro y de su dueño; cada reporte con datos los muestra, y el que no los tiene muestra la tarjeta «No tienes esta información». |
| Qué | Estado |
|---|---|
| PR #191 (órdenes de servicio en 15 meses) | en producción 10-oct |
PR #193 (toda la hoja: red-tni.json, Q_RED, grabador, candado gate-la-red-de-la-hoja-entra) | en producción hoy activo: corte 33 «listo» + corte 34 «vivo» sobre el corte canónico 67 del lago (el primer corte con toda la red fue el corte 23 del 10-oct 18:26 UTC) · 58 operaciones, 51 con datos de operación · 7 sin órdenes en la base de origen y por eso «sin dato» en la app: Bahrain, Mexico, Kyrgyzstan, Thailand, Ivory Coast, Kosova y Netherlands (Kosova y Netherlands sólo traen el tipo de cambio; medido el 11-oct 00:50 UTC) · esas 7 aplican a Truly Global, no a Truly Analytics ni Truly Inbound · las 54 operaciones y las 232 oficinas de la hoja están en la base, 0 faltantes (62 operaciones · 251 oficinas en total) · 12 dueños precreados a las 14:08 UTC. Cómo se llegó: merge 04:22 UTC ( e5c53f4), deploy verde 04:38 UTC · el corte de las 09:50 UTC falló antes de empezar por la carga fallida del corte 22 de la noche (HTTP 500 de capacidad), no por #193 · el corte 23 (14:02 UTC) cerró incompleto a las 16:33 UTC: la normalización se cortó por tiempo (900 s) en Brasil SSE · renormalización de las 16:43 UTC (run 38068811181): 58 operaciones en 14 min, pero cerró parcial por 7 operaciones de la hoja sin oficinas en Q_OFFICES (Truly:103, 140, 148, 190, 225, 23, 39), que no tienen tablero ni metas que pedir y la regla de «listo» contaba como faltantes · PR #199 (en producción 17:30 UTC) arregla la regla · tres renormalizaciones entre 17:22 y 17:45 UTC fallaron en la guarda de capacidad (disco de la base con 24,6 % libre; la guarda exige 25 %); el disco pasó de 250 a 400 GB a las 18:00 UTC · la de las 18:08 UTC (run 38074570417) cerró el 23 listo · PR #196 (deploy 15:47 UTC) arregla las 8 consultas del embudo que fallaban por operación nueva sin propuestas («IN ()») |
| Primer corte con toda la red | 10-oct, 18:26 UTC (corte 23); hoy corte 33 listo + vivo 34 |
| 16 oficinas registradas a mano sin id en el TNI (p. ej. Mazatlán, por eso Mexico entra con 0 oficinas) | pendiente TNI no existen en el lago; están listadas aparte en red-tni.json y en el pedido enviado a Elizabeth Espinoza (CC Juan Solari). Entran apenas TNI confirme su IdOficina. |
| Dueños de las operaciones nuevas | hecho 12 dueños precreados (Truly Tech administra las altas). |
Candado: scripts/gate-la-red-de-la-hoja-entra.mjs (46 comprobaciones: forma de la hoja, Q_RED, grabador con lago y base de mentira, orden en corte/correr.mjs). El mapa de fuentes de Francisco en este mismo sitio (Mapa de fuentes por capas → La red) se regenera desde el repo y lleva la misma regla, consulta por consulta.
lago_silver.cliente_rubro_v1(67) con 0 clientes sin clasificar (34.914 con boletas · PR #2459).enable_nestloop=falseanalytics.respuestas). Las 33 consultas de lapsed/Q_LAPSED_V2 que cortaban a los 15 s en 11 oficinas quedaron regrabadas y normalizadas con 0 errores en 738262f (bajan de >15,3 s a 0,34–0,51 s; 111 comprobaciones en gate-las-ventas-no-usan-bucles-anidados.mjs).tn-analytics-reloj.timer, tn-analytics-retencion.timer (6c7c5e5) y tn-espejo-intradia.timer corren en truly-global con alerta sólo por excepción; corregidos los 6 workflows de GitHub Actions que generaban notificaciones de fallo (PRs #2447, #2452, #2456, #2458, #2459).09f703a); Change Tracking activo en dbo.Ordenes de las 3 bases. Sólo restan del lado de TNI: Change Tracking en las otras 6 tablas y los IdOficina de 16 oficinas.tn-analytics-reloj.timer activotn-analytics-retencion.timer diario (6c7c5e5)738262f (Q_LAPSED_V2 0,34 s)IdOficina de 16 oficinasCada punto con su estado real. Lo hecho tiene hora y prueba; lo único pendiente depende del equipo de TNI.
| Estado | Qué | Prueba o estado actual |
|---|---|---|
| hecho | Mapa de datos publicado y actualizado | 20-oct |
| hecho | Analyzer: clasificación canónica + frecuencia por clave + contexto una vez, integrados y desplegados (#106, #108, #109) | Desplegado y medido en producción: mes por día en las operaciones bajo 8 s (mediana 0,25 s, máximo 1,4 s); serie y detalle de 12 meses bajo 8 s con calentador (#120) |
| hecho | Ventas, Service, New Sales y Lapsed sin bucles anidados (#106, #128, #130, 738262f) | 27 consultas con enable_nestloop=false verificadas por gate-las-ventas-no-usan-bucles-anidados.mjs (111 comprobaciones); lapsed/Q_LAPSED_V2 baja de >15,3 s a 0,34 s |
| hecho | PR #107: las seis consultas lentas de TrulyRuso (de timeout a 1,3–2,2 s) | Integrado y desplegado en producción |
| hecho | Cobertura de 24 meses (y 48 meses en Goals, Net Gain y Annual Billing) | En producción (#191, #193, #199, gate-year-over-year-guarda-48-meses.mjs) |
| hecho | Corte sellado + corte vivo cada 5 min | Hoy corte 33 listo (58 operaciones, sobre el corte canónico 67 del lago) + corte 34 vivo (43.877 consultas ok, 0 errores en analytics.respuestas) |
| hecho | Reloj de grabación, humo, publicación y retención en la caja de Truly (reemplaza la línea diaria de WhatsApp) | tn-analytics-reloj.timer, tn-analytics-retencion.timer (6c7c5e5) y tn-espejo-intradia.timer activos en truly-global; aviso por correo sólo por excepción |
| hecho | 7 nuevos tipos de edificio de TNI (1017..1023) + 0 clientes sin clasificar | PR #2459 integrada y desplegada; 639 propuestas reparadas en silver.propuestas; lago_silver.cliente_rubro_v1(67) con 34.914 clientes con boletas y 0 sin clasificar |
| hecho | Paridad con Francisco y QA de pantallas con robots | Paridad actualizada sobre el corte 31 (09f703a) y candados en verde |
Lo que no tiene datos en una operación se muestra como «No tienes esta información» o «—», nunca como cero inventado.
| Estado | Informe | Estado en producción |
|---|---|---|
| completo | Financial Indicators | 58 operaciones (51 con datos + 7 sin órdenes en origen) · al día en corte 33 + vivo 34 |
| completo | Service Indicators | 58 operaciones · al día en corte 33 + vivo 34 |
| completo | Sales Indicators | 58 operaciones · Q_LEAD y Q_SELLER sin bucles anidados · al día en corte 33 + vivo 34 |
| completo | Commercial Results (tablero) | 58 operaciones · 24 meses · al día en corte 33 + vivo 34 |
| completo | Sales & Service funnel (embudo) | 58 operaciones · sin fallos por operaciones sin propuestas (#196) · al día en corte 33 + vivo 34 |
| completo | Goal Analysis | 58 operaciones · 48 meses de historia para Year over Year · al día en corte 33 + vivo 34 |
| completo | Frequency & Callback Analysis | 58 operaciones · al día en corte 33 + vivo 34 |
| completo | Country funnel comparison (red) | 58 operaciones · al día en corte 33 + vivo 34 |
| completo | Hourly Cost Analysis · Price Update · Productivity (listas) | 58 operaciones · al día en corte 33 |
| completo | New Sales · Lapsed · Annual Billing · Ticket Comparison · Service Scheduling (listas) | 58 operaciones · new_sales/Q_COUNTS (#130) y lapsed/Q_LAPSED_V2 (738262f) con enable_nestloop=false (0,34–0,40 s) |
| completo | Net Gain | 58 operaciones · 48 meses de historia para Year over Year |
| completo | Revenue | 58 operaciones · bloque 2 completo |
Todo el dato de negocio vive en una base: el Supabase de producción de Truly Global. El ERP se fotografía cada noche, la foto se depura en capas dentro de esa misma base, y las tres tecnologías leen de ahí. No hay un segundo lago ni una copia aparte.
Funciona como se acordó: cada pantalla pregunta directo a las vistas aprobadas del corte canónico activo (hoy el 67, con 74/74 capas ok y 0 clientes sin clasificar). No hay copia ni grabación de por medio.
Con las optimizaciones de #106, #108, #109 y el calentador #120, todas las operaciones responden bajo el tope de 8 s en mes por día (mediana 0,25 s, máx. 1,4 s) y en «Últimos 12 meses».
Son los reportes de Francisco, calculados para las 58 operaciones (54 de la hoja + 4 con actividad histórica). Cada mañana se graba el corte sellado (hoy corte 33, listo) y encima corre cada 5 minutos el corte vivo (hoy corte 34, con 43.877 consultas ok) que refresca el mes en curso de las operaciones que tuvieron cambios.
La pantalla abre al instante y muestra el chip «updated N min ago».
Qué significa «actualizado» acá. Con el ciclo intradía de 5 minutos y Change Tracking en dbo.Ordenes, un cambio en las órdenes del ERP viaja a silver en 53–60 s y refresca el corte vivo de Truly Analytics en el mismo ciclo; de noche se sella el corte canónico completo del lago y la grabación de referencia.
truly-global y encadena el corte sellado con el corte vivo cada 5 minutos.| Frente | Qué pasaba antes | Medido | Cómo quedó resuelto | Estado |
|---|---|---|---|---|
| resuelto Ventas, Service, New Sales y Lapsed |
Consultas con = ANY(ARRAY(SELECT …)) agotaban el tope de 15 s por bucles anidados. |
>15 s → 0,34–5,6 s | SET LOCAL enable_nestloop = off declarado en el catálogo para las 27 consultas afectadas (incluyendo lapsed/Q_LAPSED_V2 en 738262f), sin cambiar el SQL ni la llave. |
en producción |
| resuelto Analyzer bajo 8 s |
La consulta de un mes de Colombia tardaba 107 s y cortaba a los 8 s. | 107 s → 0,25–1,4 s (mes) 2,6–7,7 s (12 m) |
Frecuencia por clave, llave calculada una sola vez y uniones por mapa (#106, #108, #109) + calentador de caché (#120). | en producción |
| resuelto Clasificación de operaciones y rubros |
Cuatro operaciones de prueba y 7 nuevos tipos de edificio de TNI (1017..1023). |
34.914 clientes con boletas 0 sin clasificar |
Clasificación canónica (#106), 639 propuestas reparadas en silver.propuestas y los 7 nuevos rubros registrados en catálogo, vistas y función del lago (PR #2459). |
en producción |
| resuelto Indicators en tiempo real |
Las pantallas dependían de una única grabación nocturna. | corte 33 listo + vivo 34 ciclo de 53–60 s cada 5 min |
Change Tracking en dbo.Ordenes (3 bases) + populate sólo delta (#2070) + bajas del delta (#2198) + corte vivo cada 5 min (#162, #2081). |
en producción |
mcp-data.trulynolen.tech, 172 relaciones OK) y Truly Analytics (trulydata.ai) leen del único Supabase de producción (hegrljfpnaxikymhnmeh, 400 GB disco · 16 GB RAM). Inbound y el Lab anterior están retirados.data_qa_exit = 0, 0 clientes sin clasificar).CHANGE_TRACKING + GRANT VIEW CHANGE TRACKING TO [user_globallink] en las 6 tablas incrementales restantes (Clientes, Contactos, Servicios, Propuestas, Tareas, Eventos) en Truly, TrulyNew y TrulyRuso para que las bajas en esas tablas también viajen en el ciclo de 5 minutos.IdOficina en SQL Server de las 16 oficinas pendientes del Cuadre de Información (listadas en la sección 7 y en catalogo/red-tni.json) para incorporarlas automáticamente al lago y a Truly Analytics.Pedido enviado a Elizabeth Espinoza (eespinoza@tnipest.com) con copia a Juan Cruz Solari (jcsolari@tnipest.com) el 20-oct-2026.