La tesis de plataforma — qué construimos, qué tomamos prestado, y por qué
⛔ 2026-08-07 · EL PRIMITIVO «POD» QUEDA DEPRECADO Y SUPRIMIDO
Decisión del owner. No es un cambio de nombre: el concepto sale. Donde este
documento dice Pod, léase lo que sigue:La unidad de valor es el GRAFO. El lakehouse es su soporte.
No hay un objeto intermedio que fabricar. Los data assets del catálogo
promocionan a contexto mediante una proyección ontológica:catálogo ──proyección ontológica──▶ grafo semánticoSin Pods. El mecanismo está en
ontology-projection.md — CQRS a nivel de datos: el
catálogo es Source of Truth (write) y el grafo un Context Read-Model que se
proyecta, no se importa ni se ensambla a mano.Por qué el Pod era el error: nombraba un artefacto que había que construir,
materializar y mantener sincronizado, y con él una fábrica entera («fabricar Pods
rápido»). La proyección no fabrica nada: deriva. Un objeto intermedio que se
materializa es un objeto que se queda rancio, y el propio repo tiene escrito que los
documentos rancios son la #1 fuente de confusión — con datos vale igual.El resto del documento —el reparto construir/prestar, el criterio de roadmap, el
caso de Karma, la posición «integral pero abierto»— sigue vigente palabra por
palabra sustituyendo la unidad. Se conserva el texto original como registro de
cómo se pensó, que es la disciplina de este repo; no se reescribe la historia.
⭐⭐ LA TESIS AFILADA — 2026-08-07 · LEER ESTO ANTES QUE NADA DE ABAJO
Escrito tras una crítica explícita del owner a la versión anterior. Anula el
encuadre de varios documentos del repo que se redactaron cuando la visión todavía
no estaba afilada — al final de esta sección está la lista.
A · Qué compra el cliente, y qué NO compra
El cliente compra convertir sus datos disgregados en CONTEXTO para sus agentes,
LLMs y humanos.No compra velocidad. No compra infraestructura de datos. Si quisiera eso, se
iría a Databricks o a Snowflake — y haría bien.
⇒ No pasa nada por no ser tan rápidos ni tan potentes que ellos en consulta analítica. No es una concesión ni una deuda: es que ése no es el producto, y perseguirlo sería competir en el eje donde el rival lleva una década.
Consecuencia inmediata y con euros detrás: el estándar de exigencia del catálogo no es «rápido como Snowflake». Es «completo, gobernado y PROYECTABLE». Son dos inversiones con un orden de magnitud de diferencia, y sólo la segunda está justificada.
B · No son dos productos: es uno que no vive sin su otra mitad
La crítica que este documento recibió —«describes dos productos: un lakehouse que compite con Databricks, y una capa de grafo donde no compite nadie»— está mal planteada, y el error es tratarlos como separables.
┌──────────────────────────────┐ ┌──────────────────────────────┐
│ CATÁLOGO ENTERPRISE NATIVO │ ────▶ │ GRAFO ONTOLÓGICO SEMÁNTICO │
│ estructurado + no estruct. │ proy. │ (motor propio: Memgraph, │
│ Trino · Iceberg · OPA/FGA │ ont. │ Neo4j o similar) │
│ lineaje · permisos · polít. │ │ │
└──────────────────────────────┘ └──────────────────────────────┘
el dato y su gobernanza aquí viven los AGENTES,
(nadie consulta aquí) los HUMANOS y los LLMs
Los agentes NUNCA piden nada al warehouse. Consumen del grafo, y el grafo tiene su propio motor. ⇒ ningún requisito de latencia agéntica recae sobre Trino, y ninguna comparación de velocidad analítica con Databricks decide nada.
C · ⭐ LA CUÑA, y es ESTRUCTURAL: Stardog proyecta sobre el catálogo de OTRO
Aquí está la razón de fondo por la que la capa 1 no es opcional ni es un lujo:
| Stardog (y toda capa semántica sobre catálogo ajeno) | Carbon | |
|---|---|---|
| De dónde sale el grafo | del catálogo de Databricks / Snowflake / el que sea | del catálogo PROPIO |
| Cómo llega la metadata | se IMPORTA — ETL de metadatos, con job programado | se PROYECTA — deriva, y 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 |
⇒ **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 eso simplifica la ecuación enormemente para una plataforma cloud: donde el
competidor necesita un integrador por cada almacén ajeno, un mapeo de permisos por
cada modelo de seguridad y un job de sincronización que siempre va tarde, nosotros
tenemos una sola cadena de custodia desde la ingesta hasta el nodo del grafo.Ésa es la razón de poseer el catálogo. No la escala, ni la velocidad: la
PROYECTABILIDAD.
D · Qué le pide esto a Trino — y le sobra
Con el estándar corregido, el papel de Trino queda acotado y deja de estar en discusión:
| ❌ No es «el motor rápido» | esa carrera no se corre |
| ❌ No sirve a los agentes | los agentes viven en el grafo |
| ✅ Sí es la superficie de ejecución gobernada del catálogo | entra por /api/iceberg, hereda grants y OPA |
| ✅ Sí es el sustrato de tenencia | N catálogos en un proceso; DuckDB no puede |
| ✅ Sí es quien produce y mantiene el dato proyectable | SQL, transformaciones, pipelines, limpieza, curación — perfil batch/ELT |
Trino está SOBRADO para eso, no justo. El perfil que necesita la proyección es batch, no BI interactivo — y es en BI interactivo donde Photon, el liquid clustering y la caché de Snowflake marcan la diferencia que no vamos a igualar y no nos hace falta igualar.
D·bis · 🔴 DECISIÓN 2026-08-07 — Carbon SQL ES Trino SQL. DuckDB sale del mapa.
Del owner, y es coherente con todo lo anterior: al adoptar Trino como motor principal del warehouse, DuckDB queda colapsado. Sale de lectura y de escritura.
Consecuencia inmediata y limpia — las 8 divergencias se INVIERTEN. Dejan de ser
«a Trino le faltan 8 cosas frente a DuckDB» 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, y las 5 marcadas traducir en
dialect-divergence.ts pasan de «el shim
traduce hacia Trino» a «la superficie deja de emitir dialecto DuckDB».
⚠️ Y UN CHOQUE QUE HAY QUE RESOLVER ANTES DE EJECUTARLA, NO DESPUÉS
Retirar DuckDB de LECTURA es directo. De ESCRITURA choca con una invariante que
este repo declaró condición de parada.Hoy, medido:
trinoEngine.capabilities().writefalse— Trino entra en sólo lecturaGate ⑨ de F2, en vivo INSERT→Access Denied (Service: S3, 403): la credencial acuñada para Trino no puede escribirLa invariante de F2 «Si CREATE TABLEcrea una tabla, hay una segunda ruta de escritura sobre el Warehouse y la atomicidad del CAS del catálogo deja de estar garantizada. Se para todo hasta arreglarlo»Es decir: la razón de que Trino no escriba no es un olvido, es un diseño — «el
escritor del Warehouse es uno y sólo uno» (warehouse-writer), y hay tres capas
sosteniéndolo (el ACL del motor, la denegación de la cara y la credencial de sólo
lectura acuñada por tabla).⇒ «DuckDB fuera para escritura» exige antes decidir quién escribe. Dos salidas,
y son distintas:
- Trino pasa a ser escritor ⇒ hay que abrirle la credencial y retirar
conscientemente la invariante del escritor único, sustituyéndola por otra cosa
que garantice la atomicidad (el CAS del catálogo la da, pero la invariante se
escribió porque dos escritores concurrentes por caminos distintos no estaban
coordinados).warehouse-writersigue siendo el único escritor y lo que sale de DuckDB es
sólo el DML interactivo del SQL Editor ⇒ la retirada es mucho más pequeña y
no toca ninguna invariante.Hasta que eso esté decidido, la retirada se ejecuta sólo en el lado de LECTURA.
No es una objeción a la decisión: es el orden que impide que una decisión correcta
se lleve por delante una garantía que costó tres capas construir.
E · 🔴 Lo que esta sección ANULA en el repo
Documentos escritos antes de afilar la visión, que hoy confunden porque persiguen un objetivo que ya no es el objetivo:
| Doc | Qué asume que ya no vale |
|---|---|
sql-parity-frontier.md · carbon-sql-milestones.md · carbon-sql-m3-approach.md · warehouse-sql-dialect-spec.md · docs/warehouse-sql/* | «paridad SQL con Databricks» como norte. La paridad sólo se justifica hasta donde produzca dato proyectable; más allá es paridad por la paridad |
| compute-integration.md · p1-pagination-of-the-result.md | rendimiento de consulta interactiva como criterio de diseño |
| pod-critique.md · context-layer-primitive.md · value-wedge.md | están escritos sobre el primitivo Pod, ya suprimido. Su análisis competitivo sigue siendo bueno; su unidad, no |
| El disparador de Karma | era «una consulta que DuckDB no aguante». Con este encuadre, un motor propio acelerado no tiene caso: la velocidad no es el producto |
⚠️ No se borran — son el registro de cómo se pensó, que es disciplina de este repo. Se marcan. Lo que hay que dejar de hacer es derivar roadmap de ellos.
Sesión del owner, 2026-08-03. «Construir una plataforma como Snowflake desde el principio es overkill. Mi visión es orientarme a la rápida fabricación de data products listos para consumo en sistemas agénticos y de IA. Snowflake y watsonx.data tienen agentes, pero también un stack absolutamente integral de tratado del dato. Nosotros somos un equipo pequeño: el producto como plataforma tiene que reflejar nuestra propuesta de valor de forma clara y abierta.»
Este documento fija la tesis que decide el reparto construir / tomar prestado / no hacer, y con ella cierra la cuestión de OpenMetadata. No añade alcance: quita.
Cruza con: agentic-data-cloud.md (el norte) · openmetadata-positioning.md (la frontera N2-ter) · index-catalog-sota.md (dónde estamos).
0 · Mi pregunta estaba mal puesta
Pregunté si el dato del cliente aterriza en nuestro lakehouse o si gobernamos donde vive, como si fuera una decisión pendiente. Ya aterriza, de facto — y la arquitectura entera lo asume: la hidratación de un Pod pasa obligatoriamente por Junction, y Junction lee Iceberg.
Con eso, el argumento que sostenía a OpenMetadata —«su flota de 130+ conectores es el único foso real»— se cae solo: esos conectores catalogan sistemas que no servimos. Nosotros ya tenemos conectores de ingesta en el Data Gateway, que es otra cosa y es la que necesitamos.
La pregunta buena es la que puso el owner encima de la mesa: ¿es este modelo el óptimo para ganarse un nombre en la era agéntica?
1 · La trampa: «stack integral» es una descripción, no un objetivo
Snowflake y watsonx.data tienen un stack integral porque llevan una década y miles de ingenieros. Un equipo pequeño que persigue esa superficie no consigue un Snowflake pequeño: consigue un Snowflake peor, y compite en los ejes donde el otro lleva diez años de ventaja.
La regla que se deduce: un equipo pequeño no gana teniendo menos alcance. Gana teniendo una UNIDAD DE VALOR distinta.
Y esa unidad ya está elegida en el norte, sólo que a veces la tapamos hablando de lakehouse:
| Quién | Qué vende | Su unidad |
|---|---|---|
| Snowflake · Databricks · watsonx.data | plataforma de datos + un agente encima | la tabla (y la query) |
| OpenMetadata · Collate | contexto sobre los datos de otros | la entidad de metadata |
| Palantir Foundry | la ontología operativa | el objeto — cerrado, pesado, caro |
| Carbon | ⛔ |
Nadie vende la unidad que nosotros vendemos. Los grandes venden la tabla y ponen un agente delante; nosotros vendemos lo que el agente necesita realmente consumir. Ése es el nombre que se puede ganar.
2 · El lakehouse no es el producto — es lo que lo hace posible
Y por eso el modelo actual es el correcto, aunque a veces lo justifiquemos mal.
No se sostiene con «hace falta un lakehouse para ser una plataforma de datos» — eso invita a la comparación con Snowflake en los ejes de Snowflake, que perdemos. Se sostiene con esto, que ya está escrito en el norte §8: cuatro cosas que una capa semántica prestada sobre el almacén de otro no puede hacer:
- hidratar a la granularidad que haga falta, sin pedir permiso;
- materializar un Pod caliente cuando el uso lo justifique — decisión de plano de datos;
- garantizar frescura y linaje, porque controlamos también la escritura;
- aplicar la política en el plano de datos, no sólo en la API.
Un agente que actúa sobre un dato equivocado es peor que no tener agente. Las garantías son el producto, y las garantías exigen estar en el camino. Por eso poseemos el plano de datos: no por completismo, sino porque es la condición mínima para poder prometer algo.
⛔
El lakehouse es infraestructura de soporte del Pod. Todo lo que no sirva a un Pod no está justificado por defecto.⭐ El lakehouse es infraestructura de soporte del GRAFO. Todo lo que no sirva a la proyección catálogo → grafo no está justificado por defecto.
3 · ⭐ El criterio que decide el roadmap
De lo anterior sale un test de una línea, aplicable a cualquier pieza de infraestructura:
⛔
¿Esto hace un Pod más RÁPIDO de fabricar, más FIABLE, o más CONSUMIBLE?⭐ ¿Esto hace la proyección catálogo → grafo más FIEL, más FIABLE, o más CONSUMIBLE?
Si no es ninguna de las tres, no se construye — se toma prestado, o no se hace.
⚠️ El primer eje cambió, y no es cosmético. Era «más rápido de FABRICAR», porque
un Pod se fabricaba. Un grafo proyectado no se fabrica: se deriva del catálogo, así
que la pregunta deja de ser la velocidad de una fábrica y pasa a ser la fidelidad de
una proyección — que el grafo diga exactamente lo que el catálogo sabe, ni más ni
menos, y que herede su gobernanza en vez de copiarla.
Aplicado a lo que tenemos ahora mismo:
| Pieza | ¿Pasa el test? | Por qué |
|---|---|---|
| C1 · Policy ✅ hecha | Sí (fiable) | Una política heredable es lo que hace que un Pod pueda prometer algo sobre sí mismo |
| C2 · uso y eventos | Sí (fiable + rápido) | Sin uso no hay «qué Pod es el bueno», ni materialización del caliente, ni cierre del bucle de feedback |
| Linaje emitido desde la escritura | Sí (fiable) | Es la garantía de procedencia que un agente necesita para que su respuesta sea defendible |
Calidad como veredicto sobre (objeto, snapshot, política) | Sí (fiable) | Hoy el tier se afirma y nadie lo comprueba. Un Pod con tier no verificado es una promesa sin respaldo |
| N·3a · la cara Iceberg REST | Sí (consumible) | Que Spark/Trino/Flink entren por la puerta gobernada es apertura y control a la vez |
| Junction + Iceberg + R2 + catálogo | Sí (las cuatro garantías) | Es la condición mínima de §2 |
| Compactación | No, todavía | Ya se aparcó con disparador medido: 0 tablas con delete files |
| Paridad SQL con Databricks | ⚠️ sólo hasta donde fabrique Pods | El SQL Editor es la superficie de autoría del data product. Más allá de eso, es paridad por la paridad |
| Karma — motor de lectura propio en Rust | ⚠️ es el caso de prueba del criterio | Ver abajo |
El caso incómodo, dicho claro
Karma es la pieza que más se parece a «construir Snowflake desde el principio». Los hechos, sin juicio: repo Rust aparte, karma-server desplegado y vivo, inerte (falta una env-var), con dos bloqueantes pendientes (el índice fuera del path servido y ningún harness diferencial que garantice que no diverge de PG). Mientras tanto, DuckDB ya cubre lectura y DML al 100 % y es el motor real del SQL Editor.
Contra el criterio: un motor propio no hace un Pod más rápido de fabricar, ni más fiable, ni más consumible — hasta que haya una consulta medida que DuckDB no aguante, y hoy no hay ninguna anotada. Eso no dice «mátalo»: dice congélalo con un disparador explícito, igual que se hizo con la compactación. Si la respuesta es «Karma es diferenciación técnica», entonces la pregunta honesta es si un equipo pequeño puede permitirse diferenciarse en el eje donde el rival tiene diez años y no en el eje donde no tiene nada.
4 · La posición de mercado: integral, pero abierto
Esto es lo que responde al «de forma clara y abierta» del owner, y no es una virtud declarativa: es a la vez el posicionamiento y la razón por la que un equipo pequeño puede permitirse ser integral.
| Capa | Nuestra spec abierta | Qué NO construimos gracias a ella |
|---|---|---|
| Bytes | Parquet | un formato columnar |
| Tabla | Apache Iceberg | transacciones, evolución de esquema, time-travel |
| Catálogo | Iceberg REST (Lakekeeper hoy) | el protocolo que ya hablan Spark, Trino, Flink, DuckDB |
| Política | Cedar | un motor de autorización — y encima es librería, no servicio |
| Linaje | OpenLineage | el protocolo de linaje de facto (LF AI graduado) |
| Vocabulario de metadata | JSON Schemas de OpenMetadata | el modelo de entidades — ya vendorizado, 812 ficheros, 0 errores |
| Superficie de agente | MCP | el protocolo de consumo |
| Cómputo | DuckDB (+ Trino si hace falta escala) | un motor SQL |
Los grandes son integrales y CERRADOS. OpenMetadata y Collate son abiertos pero PARCIALES —sólo el plano de metadata—. Integral y abierto no lo ocupa nadie.
Y el punto práctico, que es el que importa para un equipo pequeño: cada spec de esa columna es un componente que no escribimos. Ser integral cuesta una fracción cuando cada capa es un estándar que otros mantienen. La apertura no es marketing — es la palanca presupuestaria.
Corolario que ya es invariante nuestro (el nº5 de Index Catalog), ahora extendido a toda la plataforma: conformarse a la spec, no depender del servicio. Emitimos OpenLineage aunque nadie lo consuma todavía; nuestros hechos llevan la forma de los JSON Schemas de OM aunque OM no esté desplegado. Eso mantiene reversible cada decisión de este documento, que es la única protección real cuando se decide rápido y con un equipo pequeño.
5 · La métrica: time-to-Pod
Si la propuesta de valor es fabricación rápida de data products, entonces la velocidad hay que medirla, o el roadmap se decide por opinión.
time-to-Pod= tiempo desde «conecto una fuente» hasta «un agente responde correctamente una pregunta de negocio sobre ella».
Es la métrica que ordena discusiones sin necesidad de autoridad: una pieza que la baja entra; una que no la toca, espera. Y tiene dos derivadas que ya sabemos medir con lo que estamos construyendo: cobertura (qué fracción de las preguntas cae en un Pod existente — el bucle de feedback del norte §7) y confianza (qué fracción de los Pods servidos tiene tier verificado, linaje completo y política aplicada — que es C1 + C2 + linaje + calidad).
6 · Qué decide esto sobre OpenMetadata
Con el dato aterrizando y el criterio de §3, el reparto queda así:
| Papel de OM | Veredicto |
|---|---|
| ① Catálogo de nuestro Warehouse | ❌ fuera — fricción medida; estamos en el camino y ellos no |
| ② Linaje / calidad / uso de lo nuestro | ❌ fuera — se emite nativo, en formato OpenLineage |
| ③ Superficie humana (glosario, discovery, discusiones) | 🟡 producto, no arquitectura. Lo que ya se absorbió (om-ui, el enclave) se queda; no se profundiza |
| ④ Conectores a sistemas ajenos | ❌ se cae con la premisa (§0): el dato aterriza; la ingesta ya es nuestra |
| ⑤ Las ~700 JSON Schemas | ✅ se quedan para siempre — como especificación, no como servicio. Ya vendorizadas |
Y la secuencia, que importa tanto como la decisión: OM entrega algo real hoy (Trino + 120 tablas perfiladas) y el lado nativo aún no existe. Así que se deja de invertir en OM como autoridad de gobernanza ahora, se construye C2 + linaje + calidad nativos, y se retira su despliegue cuando el lado nativo conteste las mismas preguntas — no antes, o queda hueco. No es dejar un fallback: es no arrancar el suelo antes de poner el nuevo.
Y hay un acoplamiento que flipa con esto: N4. Hoy los Pods anclan por FQN a entidades de OM. Con Index Catalog nativo, anclan a coordenadas de Index Catalog. Cada Pod que nazca antes de decidirlo encarece el cambio — es la misma ventana que se cerró sola con el carrier de procedencia, y aquí todavía está abierta.
(Nota: la migración 20261265_semantic_context_graph.sql se marcó «no aplicar» cuando el espejo 1:1 de OM se dio por superado. Con esto vuelve a ser relevante — no como espejo de OM, sino como el modelo de metadata propio del Index Catalog. El trabajo no se tiró; cambia su justificación.)
7 · Lo que esta tesis no cambia
- El lakehouse se queda. No es overkill: es la condición de las cuatro garantías de §2. Lo que cambia es su justificación — soporte del Pod, no fin en sí mismo.
- El invariante del Index Catalog sale reforzado: guardar lo que el catálogo no puede saber es exactamente el trabajo que un Pod necesita.
- Junction sigue siendo la puerta única. Es lo que hace posible medir, gobernar y garantizar en un solo sitio — y con un equipo pequeño, un solo sitio no es elegancia: es viabilidad.
- Las decisiones ratificadas hoy (REST en Index Catalog · política en Index, aplicación en dos puntos) quedan intactas y encajan.
8 · ✅ Ratificado por el owner (2026-08-03)
- Karma: CONGELADO, con disparador explícito — vuelve a la mesa cuando exista una consulta medida que DuckDB no aguante. No se mata: se para de invertir. Mismo mecanismo que la compactación.
time-to-Podadoptado como métrica de PRIMERA CLASE. Con sus dos derivadas: cobertura y confianza.- La frontera de la paridad SQL: trazada → sql-parity-frontier.md. Regla: entra el SQL que produce o describe un data product; sale el SQL que administra un almacén. Reordena el backlog: suben los bloques 5, 7 y 8; sale el 10; se reencuadra el 6 (frescura del Pod, no verbos de scheduling).
- N4: los Pods anclan a coordenadas del Index Catalog, no a FQNs de OpenMetadata. El
om_fqnsobrevive como anotación opcional, nunca como identidad. Razón en §9.
9 · Por qué el anclaje del Pod es al Index Catalog (N4)
El anclaje decide una sola cosa, y lo decide para siempre: si la capa de Pods HEREDA la madurez del Index Catalog gratis, o si tiene que integrarse con todo dos veces.
Anclando a coordenadas del Index Catalog, el identificador de un atributo de Pod es un securable. Consecuencia directa: cada capacidad que el Index gana aterriza sobre los Pods sin fontanería nueva.
| Lo que madura en el Index | Lo que le pasa al Pod, automáticamente |
|---|---|
| C1 · políticas | se adjuntan al mismo securable ⇒ un Pod hereda política por identidad, no por integración |
| C2 · uso | los eventos llevan ese mismo securable_id ⇒ «qué Pod se usa» sale del mismo GROUP BY |
| Linaje emitido | las aristas conectan los mismos ids ⇒ la procedencia de un Pod es la del dato, no una copia |
| Calidad / tier | el veredicto es sobre el objeto anclado ⇒ el sobre de confianza (pod-critique.md §3·1) se construye solo |
| N·3a · la cara REST | lo que un motor externo resuelve y lo que un Pod hidrata son el mismo objeto |
Anclando a FQNs de OpenMetadata pasan tres cosas, y las tres son malas:
- Punteros colgantes por decisión propia. Acabamos de decidir que OM deja de ser autoridad de gobernanza; anclar la identidad del producto a un servicio que estamos retirando es construir la deuda a sabiendas.
- Reintroduce el espejo de nombres. Un FQN es
servicio.base.schema.tabla.columna: taxonomía editable. Es exactamente el defecto que costó la fase N·1 arreglar en el namespace físico, cuyo principio quedó escrito: el identificador debe espejar lo INMUTABLE, no lo EDITABLE. Repetirlo un nivel más arriba sería tropezar con la misma piedra, con mejor vista. - Dos autoridades en el camino caliente. La hidratación pasa por Junction, que resuelve por id de dataset. Anclar por FQN mete una traducción FQN→id en cada hidratación, y con ella una segunda fuente de verdad sobre qué objeto es cuál.
La regla que queda: el Pod ancla por lo inmutable (la coordenada del Index Catalog) y anota lo prestado (el FQN de OM, el término del glosario, la referencia ODPS). Anotar es barato y reversible; anclar es para siempre.