← Volver al panel de conciliación · Integración TNI · Mapa de fuentes por capas: de cada cifra a la tabla de TNI →

Mapa de datos 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.

7 · Tiempo real (8–20-oct-2026) · cómo quedó la infraestructura, Change Tracking en producción y estado actual

Veredicto (20-oct, 22:25 UTC · 100 % en producción): Change Tracking y 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.

TramoHoy (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 TrulyCon 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 minPopulate 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 nocheNo 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 AnalyticsGraba las consultas del catálogo y la pantalla lee ese corte hasta el día siguienteUn 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 correCaja de Truly (4 vCPU · 15 GB) + Supabase XLtruly-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 cicloActivo y verificado en producción

Delay

Antes del 8-octCiclo 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.aihasta 24 h5–10 min20 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)nochenochenocheen 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_*, goldnochenochenochenoche
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.

Lo probado y verificado en producción

Qué quedó, con hora y por qué (8–10-oct, UTC)

HoraQuéPor qué / qué cambió
20:30Hetzner 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:56Supabase 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:55Se canceló el paso «listas» del corte 17Llevaba 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:18Populate «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:30Primer ciclo intradía automático: 403 s, 0 fallosLa 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:47Corte 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:04Primer ciclo del vivo21 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:59Ciclo a 5 minLas cifras que faltaban ya estaban (ciclo entero 163 s); PR #2094 lo deja fijo en el repo.
23:23Vivo 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:30Pausa nocturna (automática)Espejo completo + corte del lago + grabación sellada, como siempre; un delta en medio invalidaría el corte.
9-oct 09:30El intradía retomó solo tras la noche (162 s)Noche limpia: espejo completo 08:36, corte 62 del lago activo.
9-oct 09:51Corte 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:27Ola 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:32Corte 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:45Listas 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:00TNI preguntó por qué se saturó su baseMedido 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:30El freno espació el ciclo a ~20 minCosto 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:45Ciclo de 5 min solo, costo 11–14 s por cicloCon 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:30Lector 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:22Espejo nocturno en rojo: las 11 tablas delta de las tres bases; sin corte del lago ni corte sellado de Analytics hoyNo 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:00El intradía arrancó a las 13:00 y no a las 09:30Clá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:36Change 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-octCiclo 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).

Olas

OlaQué entraCómo se acreditaEstado
0 · MedirTiempos de cada tramo; qué tablas usan las 158 consultas; infra subidadocs/125 en Truly Global · PR #160 en Analytics · Hetzner ccx33 verificadohecho (Hetzner ccx33 + Supabase 400 GB / 16 GB RAM activos)
1 · Populate sólo delta + timer intradía a 30 minlib_solo_delta, mapas por llaves, guardas, tn-espejo-intradia.timerPruebas en CI (mismo parquet por los dos caminos → mismas filas); 1 ciclo medido en producción; sombra nocturna en diff 0encendida 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 + pantallaFila 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 robotencendida 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 lagoTimer a 5 min; vista e índice de updated_at de órdenes; el vivo ve órdenes modificadas; freno por costo en TNIp95 del dato en pantalla ≤ 10 min, medido con órdenes realesencendida 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 cicloCosto por ciclo en TNI ≤ 15 s (sin saltos del freno); ciclo completo en ~1 min; bajas en el mismo cicloencendida 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ónVivo 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 verdeencendida

Estado del lado de TNI (20-oct 22:25 UTC · Change Tracking 100 % completado)

✅ 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.

8 · La red completa (10-oct-2026) · qué operaciones y oficinas existen en Trulydata, con o sin datos

La decisión de Pablo (10-oct): entran todos los países y oficinas de la hoja «Cuadre de Información» —54 operaciones · 248 oficinas—, tengan datos o no. Un reporte sin datos muestra la tarjeta «No tienes esta información»; nada se inventa ni se promedia. Hasta hoy la lista era sólo lo que tenía actividad: 44 de los 54 países y 190 de las 248 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):

PiezaConsulta / archivoDe quiénQué aporta (medido el 10-oct)
Propuestas en 15 mesessales/Q_OPSFranciscoLas 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 #191Catalizadora+3: Barbados, Macedonia, Portugal
Está en la hoja de Pablocatalogo/red-tni.json (la hoja, en el repo) + base/Q_RED (toda la red del lago: país, moneda, oficina, activa) · PR #193Pablo (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.

Dónde entra en el flujo de tiempo real (sección 7)

TramoQué 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.
PantallaLa 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».

Estado

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 red10-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 nuevashecho 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.

0 · Hoy, paso a paso (actualizado 20-oct-2026)

Progreso general · 99 % (los siete criterios en producción; sólo restan los 2 puntos del lado de TNI)

Mes por día en el Analyzer bajo 8 s
100 %
Medido con la RPC real tras #109 (mediana 0,25 s, máximo 1,4 s; tope 8 s) y lago_silver.cliente_rubro_v1(67) con 0 clientes sin clasificar (34.914 con boletas · PR #2459).
Año («Últimos 12 meses») bajo 8 s
98 %
Calentada la caché como lo hace #120 y medido con la función real: detalle de 12 meses en 4,8 s (Colombia), 5,1 s (241) y 7,7 s (242); series en 2,6, 4,0 y 5,6 s. Todo bajo 8 s.
Indicators sin «—» y 27 consultas pesadas con enable_nestloop=false
100 %
Corte 33 listo (58 operaciones, 21.439 ok · 0 fallidas) + corte vivo 34 (44.993 consultas ok · 0 con error en analytics.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).
Grabación nocturna + corte vivo cada 5 min
100 %
Corte 33 completado en 95 min (09:36 → 11:12 UTC) para las 58 operaciones, y encima corre el corte vivo 34 cada 5 min encadenado tras el ciclo intradía (53–60 s de punta a punta).
Aviso sólo cuando algo falla, desde la caja de Truly + cero ruido en GitHub
100 %
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).
Sin slop: idioma del dueño, fichas limpias, mes pasado por defecto, Inicio y kit sin rasgos de IA, moneda local + USD
98 %
Las tres olas (#115 → #116 → #117), sin paneles «Qué significan» (#118), selector Local · USD · Ambas (#119), USD en tarjetas del Analyzer (#121) y video en 3 idiomas ES · EN · PT (#206, #207, #209) en producción.
Paridad con Francisco e integración TNI
98 %
Paridad medida y actualizada sobre el corte 31 contra Francisco (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.

Dónde estamos en la cadena

Arreglos del Analyzer#106 · #107 · #108 · #109 desplegados
Corte 10 grabado45/45 · 18:29
Bloque de listasseis listas 20:50 · paridad · Revenue 21:35 (45/45, 2.755 filas)
Recuperar 375 cuadroscuatro pases: 375 → 92 → 45 → 18 → 0
Net Gaingrabado 23:30 · 45/45 · 255 filas
Agosto en las listascerrado completo en las 45 operaciones
Incidente 01:00 UTC resueltoPR #113 desplegada 01:18 corrige el control
Sin slop en producción#115 · #116 · #117 · #118 · #119 · #121 desplegados
Reloj en la caja de Truly#122 desplegada · tn-analytics-reloj.timer activo
PRs de Francisco en producción#125 · #128 · #129 · #130 desplegados
Retención automáticatn-analytics-retencion.timer diario (6c7c5e5)
Red completa (58 ops)PR #191 y #193 · 54 de la hoja + 4 con ventas
Change Tracking + Vivo 5 min#2138 · #2198 · #2447 · ciclo 53–60 s (costo TNI 11–13 s)
Rubros + Lapsed sin bucles#2459 (0 sin clasificar) + 738262f (Q_LAPSED_V2 0,34 s)
Pendiente TNI (2 puntos)CT en las 6 tablas restantes + IdOficina de 16 oficinas

Cada punto con su estado real. Lo hecho tiene hora y prueba; lo único pendiente depende del equipo de TNI.

EstadoQuéPrueba o estado actual
hechoMapa de datos publicado y actualizado20-oct
hechoAnalyzer: 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)
hechoVentas, 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
hechoPR #107: las seis consultas lentas de TrulyRuso (de timeout a 1,3–2,2 s)Integrado y desplegado en producción
hechoCobertura 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)
hechoCorte sellado + corte vivo cada 5 minHoy 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)
hechoReloj 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
hecho7 nuevos tipos de edificio de TNI (1017..1023) + 0 clientes sin clasificarPR #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
hechoParidad con Francisco y QA de pantallas con robotsParidad actualizada sobre el corte 31 (09f703a) y candados en verde

Informes, uno por uno · estado en producción (corte 33 listo + vivo 34)

Lo que no tiene datos en una operación se muestra como «No tienes esta información» o «—», nunca como cero inventado.

EstadoInformeEstado en producción
completoFinancial Indicators58 operaciones (51 con datos + 7 sin órdenes en origen) · al día en corte 33 + vivo 34
completoService Indicators58 operaciones · al día en corte 33 + vivo 34
completoSales Indicators58 operaciones · Q_LEAD y Q_SELLER sin bucles anidados · al día en corte 33 + vivo 34
completoCommercial Results (tablero)58 operaciones · 24 meses · al día en corte 33 + vivo 34
completoSales & Service funnel (embudo)58 operaciones · sin fallos por operaciones sin propuestas (#196) · al día en corte 33 + vivo 34
completoGoal Analysis58 operaciones · 48 meses de historia para Year over Year · al día en corte 33 + vivo 34
completoFrequency & Callback Analysis58 operaciones · al día en corte 33 + vivo 34
completoCountry funnel comparison (red)58 operaciones · al día en corte 33 + vivo 34
completoHourly Cost Analysis · Price Update · Productivity (listas)58 operaciones · al día en corte 33
completoNew 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)
completoNet Gain58 operaciones · 48 meses de historia para Year over Year
completoRevenue58 operaciones · bloque 2 completo

1 · Una sola base, un solo camino

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.

ERP de TNI SQL Server · 3 bases Truly TrulyNew TrulyRuso trulynoleninternational.com foto nocturna 01:00–09:30 Fotógrafo del espejo Hetzner servidor de la flota 1 · foto de cada base → bronce 2 · depuración → silver 3 · refresco → gold escribe Supabase Truly Global hegrljfpnaxikymhnmeh · 400 GB · 16 GB RAM bronce copia fiel del ERP, por base + delta 5 min depuración nocturna + sólo delta silver clientes, contratos, órdenes (CT + bajas)… refresco diario gold capas de negocio: facturación, ventas, tickets corte con control de calidad lago · corte canónico 67 74/74 capas ok · 46,06 M filas · QA 0 publicación por operación vistas aprobadas lo único que el MCP y el Analyzer pueden leer grabación sellada + corte vivo (5 min) analytics · Indicators (sellado + vivo) listo: corte 33 (58 ops) · vivo: corte 34 (al día) GitHub Actions runners propios en Hetzner grabación diaria 09:45 vigía cada 15 min: ¿hay corte canónico nuevo? respaldo desde la flota recuperación por familia graba Truly Inbound otro Supabase, otro producto no es fuente ni destino de reportes Lab anterior retirado el 25-sep · nadie lee de ahí Truly Global · trulyglobal.ai la plataforma de TNI · lee gold y lago directo lee MCP TNI Data Lake lector de sólo lectura · 172 relaciones OK 15:52 lee Truly Analytics · trulydata.ai Francisco entró 15:09 · roles por cargo (RLS) Analyzer · vivo, del corte 67 Indicators · corte 33 + vivo 34 RPC · tope 8 s lee respuestas Cómo leer por dónde viaja el dato lo vivo: el corte canónico activo lo grabado: donde hoy se atora ya no participa
El ERP se fotografía una vez por noche. Todo lo demás ocurre dentro del Supabase de Truly Global. Las tres tecnologías leen de esa base; la única pieza que se graba aparte son los Indicators de Truly Analytics.

2 · Dos formas de leer el mismo dato

vivo

TNI Analyzer

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».

sellado + vivo cada 5 min

TNI Indicators

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.

3 · Cómo fue el cierre inicial (registro histórico del 4-oct)

foto nocturna del ERP · la base no admite consultas 00:00 02:00 04:00 06:00 08:00 10:00 12:00 14:00 16:00 18:00 20:00 07:43 dato del ERP que trae el corte 57 12:21 gold refrescado 14:26 corte 57 activo 15:09 Francisco entra 15:52 arranca la grabación 10 16:55 3.831 respuestas bien · 142 con error 19:04 tope del bloque 1
Registro histórico del 4-oct durante la primera grabación completa. Hoy el reloj corre en truly-global y encadena el corte sellado con el corte vivo cada 5 minutos.

4 · Dónde se atoraba y cómo quedó resuelto en producción

FrenteQué pasaba antesMedidoCómo quedó resueltoEstado
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

5 · Lo que ya quedó, con prueba

6 · Los dos únicos puntos pendientes del lado de TNI

Pedido enviado a Elizabeth Espinoza (eespinoza@tnipest.com) con copia a Juan Cruz Solari (jcsolari@tnipest.com) el 20-oct-2026.