⭐⭐ LA CUÑA — el catálogo gobernado sobre fuentes disgregadas
Sesión del owner, 2026-08-07. Ésta es la cuña pulida del producto: qué duele
en el cliente, qué le vendemos, y por qué la arquitectura que tenemos es la que
responde a eso y no otra.Manda sobre value-wedge.md, que dice cosas correctas pero está
escrito sobre el primitivo Pod, ya suprimido. Y se apoya en la tesis afilada:
platform-thesis.md §«LA TESIS AFILADA».
0 · El dolor, dicho como lo vive el cliente
No es «mis queries van lentas». Es:
«Mi información está disgregada y mis agentes no tienen contexto.»
Un cliente empresarial típico tiene, a la vez:
| Dónde | Qué |
|---|---|
| PostgreSQL / MySQL / SQL Server | las tablas operacionales |
| S3 / Azure Blob / GCS | un lakehouse con Parquet / Delta / Iceberg |
| Kafka | los flujos en tiempo real |
| Snowflake / BigQuery / Redshift | el almacén analítico que ya compró |
| Google Workspace / Microsoft 365 | documentos, correos, PDFs — no estructurado |
Nadie tiene UN almacén. Los tiene todos. Y el contexto que un agente necesita para responder bien vive repartido entre ellos, con permisos distintos en cada uno.
1 · La arquitectura, de punta a punta
[ Fuentes Disgregadas ] ──▶ ( Conectores Trino ) ──▶ [ Catálogo Gobernado Nativo ] ──▶ ( Proyección Ontológica ) ──▶ [ Grafo · Neo4j ] ──▶ [ Agentes · LLMs · Humanos ]
S3 · Postgres · Kafka abstracción RBAC · linaje mapeo de entidades latencia de ms
Snowflake · Mongo · … ZERO-COPY política · metadata contexto
🏁 PROBADO EN VIVO — 2026-08-07
No es un diagrama: es una query que corrió. Tres fuentes en UNA sola sentencia:
Fuente Dónde vive Filas Iceberg / R2 el Warehouse gobernado, por nuestra cara ( /api/iceberg)3 PostgreSQL / Neon us-east-1— una fuente real del Data Gateway5 tpch conector interno de Trino 25 Y un
JOINcorrelacionado Iceberg × Postgres devolviónorte=6, sur=3— correcto.
Sin mover un byte. El puente que lo hace posible —de una fuente del Data Gateway
a un catálogo de Trino— es
scripts/dataspaces/trino-connector-from-source.ts.⚠️ Y midiendo se cayó una premisa operativa: de las 14 fuentes conectadas,
8 tienen conector de Trino y 6 no (excel,dynamodb,restapi,azure
CosmosDB,hubspot,hbase). Peor: la Postgres que la UI daba por sana
—discovery_complete, 210 tablas— tiene la credencial ilegible (no descifra
con la clave actual). La metadata dice sano y el secreto dice que no, y ningún
chequeo de salud que sólo mire metadata lo ve.
Cuatro propiedades, y ninguna es retórica:
- No hay migración. Trino se enchufa donde el dato ya vive. El cliente no mueve un byte para empezar.
- Una sola sintaxis. Todas las fuentes bajo un punto de acceso único, en SQL.
- Onboarding en minutos. El cliente da credenciales y el catálogo mapea la metadata de la organización.
- Y la que importa: la gobernanza es NUESTRA, no de cada fuente. El catálogo nativo aplica RBAC, linaje y política sobre fuentes heterogéneas — que es exactamente lo que ninguna de esas fuentes puede hacer por las demás.
2 · ⭐ Por qué Trino y no otra cosa: la arquitectura desacoplada por conectores
Adoptar Trino no fue comprar un motor rápido. Fue comprar una frontera de integración que ya existe y está mantenida por el ecosistema:
Un único clúster de Trino puede consultar, EN LA MISMA SENTENCIA SQL, un Delta
Lake sobre S3, una base PostgreSQL y un clúster de Kafka.
Eso es lo que convierte «el cliente tiene sus datos en siete sitios» de problema en característica. Y viene con su insignia de madurez en gobernanza y seguridad: no hay que construir el control de acceso por fuente, se hereda del punto único.
El equivalente sin Trino sería escribir un integrador por sistema, un mapeo de permisos por modelo de seguridad y un job de sincronización por fuente. Eso es lo que un equipo pequeño no puede permitirse — y es la razón presupuestaria, no estética, por la que la pila abierta es la palanca.
3 · ⭐⭐ La cuña frente a Stardog — y es ESTRUCTURAL, no de producto
Stardog apunta a un mercado parecido. La diferencia no es de calidad: es de dónde se apoyan.
| Stardog (y toda capa semántica sobre catálogo ajeno) | Carbon | |
|---|---|---|
| Sobre qué construye el grafo | el catálogo de Databricks / Snowflake / el que sea | el catálogo PROPIO |
| Cómo llega la metadata | se IMPORTA — ETL de metadatos con job programado | se PROYECTA — deriva; si se pierde, se reproyecta |
| Permisos y políticas | hay que reimplementarlos o aproximarlos: viven en el sistema de otro | se HEREDAN por relación — mismo securable, misma política |
| Linaje | se reconstruye parseando SQL ajeno | se emite desde la escritura |
| Frescura | no se puede garantizar: no están en el camino del dato | se garantiza: sí estamos |
| Fuentes que no son un almacén (Kafka, Mongo, ficheros) | dependen de que el almacén ajeno las haya catalogado | conector directo |
El resultado, en una frase
Tener el catálogo enterprise de forma NATIVA es lo que nos permite proyectar
ontología, permisos, políticas, gobernanza, linaje y dato — nativamente, y en una
sola cadena de custodia desde la fuente hasta el nodo del grafo.Ésa es la razón de poseer el catálogo. No la escala. No la velocidad. La
PROYECTABILIDAD.
Y simplifica la ecuación de forma desproporcionada para una plataforma cloud: donde el competidor necesita un integrador por almacén ajeno + un mapeo de permisos por modelo de seguridad + un job que siempre va tarde, nosotros no necesitamos ninguno de los tres.
4 · Lo que el cliente compra, dicho sin la palabra «plataforma»
«Tengo los datos en siete sitios y mis agentes responden mal. Conecto mis fuentes,
y en semanas mis agentes responden bien y puedo demostrar por qué.»
No compra velocidad. Si quisiera velocidad o infraestructura de datos completa, se iría a Databricks o Snowflake, y haría bien. ⇒ no pasa nada por no igualarles en consulta analítica: ése no es el producto.
5 · 🔴 LO QUE ESTA CUÑA NO CUBRE TODAVÍA, y hay que decirlo
Un documento de posicionamiento que sólo lista fortalezas no sirve para decidir. Tres huecos medidos, no supuestos:
⚠️ ① Trino NO tiene conectores para el no estructurado
La lista de fuentes de §0 incluye «documentos, correos y PDFs en Google Workspace o Microsoft 365», y el diagrama los hace pasar por «Conectores de Trino». Eso hoy no existe.
El catálogo de conectores de Trino cubre fuentes tabulares o semi-estructuradas consultables: JDBC (Postgres, MySQL, SQL Server, Oracle, Snowflake, Redshift…), almacenes de objetos con formato tabular (Iceberg, Delta, Hive, Hudi), Kafka, MongoDB, Elasticsearch/OpenSearch, Cassandra, Pinot, Druid… y Google Sheets. No hay conector de Gmail, Drive, SharePoint, OneDrive ni PDF.
⇒ La mitad no estructurada de la cuña necesita OTRA vía de entrada — una ingesta que aterrice documentos como tablas y/o embeddings antes de que el catálogo pueda gobernarlos. Es trabajo real y no está hecho. Venderlo como «un conector más» sería prometer una pieza que no existe.
(Lo que sí es cierto y no cambia: una vez aterrizado, el gobierno y la proyección son los mismos. El hueco está en la puerta, no en la casa.)
⚠️ ② «Zero-copy» tiene un precio que aparece en producción
Federar sin mover datos es cierto y significa que cada query cruza la red hasta la
fuente y compite con la carga operacional del cliente. Un JOIN entre su Postgres de
producción y su lake lo paga su Postgres de producción. La respuesta de la industria
es materializar lo caliente — o sea, acabar moviendo algunos datos, con criterio y
medido. La promesa correcta es «no hay migración PARA EMPEZAR», no «no hay copia,
nunca».
⚠️ ③ El pushdown decide si la federación es usable, y es por conector
Trino empuja filtros y agregaciones a la fuente cuando el conector lo soporta, y el
soporte varía mucho entre conectores. Sin pushdown, un JOIN federado se trae la
tabla entera por la red. ⇒ la calidad de la federación no es una propiedad de Trino:
es una propiedad de CADA conector, y hay que medirla fuente a fuente antes de
prometerla en una demo.
⚠️ ④ La cara gobernada cuesta ~3,4 s por query — y es TOPOLOGÍA, no diseño
Medido el 2026-08-07 desde el coordinador, aislando cada tramo:
| ms | |
|---|---|
SELECT 1 — nada externo | 459 |
tpch — conector interno de Trino | 842 |
carbon — el Warehouse por nuestra cara | 3.956 |
carbon otra vez | 3.459 ⇒ apenas cachea |
⭐ SHOW TABLES FROM carbon… — sólo catálogo, CERO datos | 3.804 |
La última fila es la que diagnostica. Listar tablas cuesta prácticamente lo mismo que leerlas ⇒ el coste no está en traer el dato de R2: está en la ida y vuelta al CATÁLOGO. Y la cadena cruza tres nubes:
Trino (GKE · europe-west1) → /api/iceberg (Vercel) → Lakekeeper (Railway) → R2 (WEUR)
⇒ ~3,4 s fijos por query, puramente por dónde está desplegada cada pieza. No es culpa de Trino (459 ms de suelo) ni de que la gobernanza viva en la cara —que es la decisión correcta y el diferencial del producto— sino de que la cara está lejos.
Por qué importa aquí y no en otro sitio: para el perfil batch/ELT que la proyección necesita, 3,4 s por query es irrelevante. Para la promesa de §1 —«onboarding en minutos» y la demo que la vende— una demo donde cada consulta tarda 4 segundos es una mala demo. Y para la federación de §5·③ se suma a cada fuente.
Es reducible sin tocar la arquitectura: co-locar la cara y el catálogo con el motor, y cachear metadata en el conector. No entra en ninguna fase todavía; se anota con número para que la decisión se tome con el dato y no con la sensación.
5·bis · 🔴 DECISIONES DEL OWNER — 2026-08-07
A · Las fuentes sin conector nativo de Trino quedan DEPRECADAS y sin soporte
excel · dynamodb · restapi · azure (CosmosDB) · hubspot · hbase. Por
ahora. No es que falte configurarlas: no existe el conector. Con esto el alcance
del catálogo queda acotado a lo que Trino sabe hablar, y el hueco §5·① deja de ser una
promesa a medias y pasa a ser un límite declarado.
⚠️ Y con ello la mitad no estructurada de §0 sale del alcance inmediato: sin conector para Drive/Gmail/SharePoint/PDF, esa entrada necesita otro mecanismo que todavía no existe. Decir el límite es lo que permite venderlo sin mentir.
B · «Un catálogo por fuente conectada» es un error — pero el mecanismo no es el que parece
La intuición es correcta y el mecanismo hay que corregirlo, porque cambia qué se hace:
| En Trino, un catálogo ES una instancia de conector configurada | un catálogo postgresql apunta a UN servidor. No existe un catálogo de Trino que abarque varias fuentes heterogéneas — es su modelo, no una decisión nuestra |
| Unity Catalog hace LO MISMO | Lakehouse Federation crea un CONNECTION y luego un FOREIGN CATALOG por cada base externa. Uno por fuente. Horizon, igual |
⇒ Lo que ellos tienen no es «muchas fuentes, un catálogo»: es que el catálogo de
conector es un DETALLE DE IMPLEMENTACIÓN que el usuario nunca ve. El usuario ve una
jerarquía catálogo.esquema.tabla con un solo modelo de gobernanza.
⭐ La consecuencia de diseño, y es la que importa
Los catálogos de Trino dejan de ser la superficie. La superficie es NUESTRO
catálogo (Index), que presenta todas las fuentes en una jerarquía y aplica una sola
gobernanza. Los catálogos de Trino pasan a ser fontanería que se crea y se destruye
con el alta y la baja de una fuente — y que nadie nombra en una query.Es, además, coherente con la cuña: si el usuario tuviera que saber en qué catálogo de
Trino vive cada tabla, le habríamos trasladado la disgregación en vez de
resolverla.
C · El techo real no era el número de catálogos: era el REINICIO
Y sí tiene solución. Verificado en la doc de Trino 470:
catalog.management=dynamic | |
|---|---|
CREATE CATALOG / DROP CATALOG en caliente, sin reiniciar | ✅ quita el techo |
| Marcado experimental | «the syntax might change and be backward incompatible» |
| ⚠️ La sentencia completa se registra y se ve en la Web UI — credenciales incluidas | riesgo real con credenciales de cliente |
Fuga de recursos al hacer DROP | ⭐ documentada sólo para Hive/Iceberg/Delta/Hudi (object storage). NO para los conectores JDBC — que son justo los de la cuña |
⇒ Corrige lo que el runbook daba por bloqueante: para federar bases de cliente (postgres/mysql/sqlserver) la fuga no aplica. Lo que queda en pie es la exposición de credenciales en el texto de la sentencia, que no se resuelve apagando la Web UI (la sentencia sigue yendo al log de queries) y es una decisión de riesgo, no técnica.
6 · Qué exige esto del roadmap, en orden
Con la cuña así, el orden deja de ser el del runbook de absorción y pasa a ser éste:
| Por qué | ||
|---|---|---|
| 1 | Warehouse listo con Trino corriendo | es el punto de acceso único; sin él no hay cuña |
| 2 | Unos cuantos conectores vivos y sanos | la federación se demuestra, no se declara. Y el pushdown se mide por conector (§5·③) |
| 3 | La vía de entrada del no estructurado | el hueco de §5·① — sin ella la cuña sólo cubre la mitad |
| 4 | La proyección catálogo → grafo | hoy somos inmaduros para abrirla, y sin 1-3 no tendría qué proyectar |
| 5 | Absorber Neo4j al cluster K8s como motor del grafo | decidido; llega con 4 |
⚠️ Y una consecuencia de la decisión «Carbon SQL = Trino SQL» (ver
platform-thesis.md): las 8 divergencias de dialecto
se invierten. Dejan de ser «a Trino le faltan 8 cosas» y pasan a ser «nuestras
superficies emiten dialecto DuckDB y tienen que emitir Trino». La lista blanca que hay
que hacer cumplir es la de Trino. Ver
lib/compute/dialect-divergence.ts.