En 2018 creé un modelo de red para averiguar dónde invertir mi tiempo en la comunidad tecnológica de Iowa. El modelo llegó a contar con unos 10 000 elementos: empresas, organizaciones, personas, ciudades y conectividad. Utilicé la centralidad de vectores propios para identificar nodos con los que no estaba conectado pero que tenían una alta conectividad con otros puntos. Esto influyó en decisiones reales: me incorporé a la junta directiva de TAI, descubrí comunidades cuya existencia desconocía y tracé un mapa de las diferencias de densidad entre Des Moines y los ecosistemas costeros.
Ese modelo se me quedó grabado. A lo largo de los años en Brale, siguen apareciendo grafos de relaciones dirigidos por fuerzas: asignando emisores a activos y a redes, conectando a los operadores de programas con las cadenas de bloques en las que operan. Cada vez, alguien reinventa el lenguaje visual. ¿Qué significa un color? ¿Qué representa una línea gruesa? ¿Qué forma distingue a una empresa de una persona o de un evento? Estas decisiones se toman desde cero en cada proyecto. La siguiente persona que abra el gráfico tiene que realizar ingeniería inversa de todo ello antes de poder leer el contenido.
El año pasado, el CSF (Commons Stablecoin Format) estandarizó la forma de representar los flujos de fondos. Basta con pegar la especificación en un modelo de lenguaje grande (LLM), solicitar un flujo de fondos «stablecoin», y este sigue el formato en todo momento. Quería lo mismo para los gráficos de relaciones. Así que escribí el Graphing Standard Format (GSF), una pequeña gramática que define cómo el tipo determina la forma, cómo el peso determina el tamaño y cómo los niveles de densidad controlan lo que se revela.
Esta es mi red, representada en GSF:
Los círculos representan personas. Los rectángulos redondeados, organizaciones. Los triángulos, eventos —distintos de las empresas que los organizan—. Los rombos, lugares. Los hexágonos, conceptos. Las pastillas, sistemas. Haz clic en cualquier nodo para ver su ficha de perfil. Cambia a «Medio» para ver el color. No has tenido que decidir nada de eso. Lo ha hecho GSF.
Aquí tienes un vídeo que muestra cómo utilizar GSF por primera vez. ¡Ha funcionado bastante bien!
GSF y CSF
| CSF | GSF | |
|---|---|---|
| Resultado | Diagramas de secuencia de Mermaid | Gráficos de relaciones D3 |
| Respuestas | Cómo pasa el valor de A a B, en orden | Qué existe y cómo está conectado |
| Naturaleza | Temporal, ordenada por pasos | Estructural, no temporal |
| Niveles | Ligero / Medio / Pesado | Ligero / Medio / Pesado |
Ambos implementan las mismas primitivas de la capa de valores: ValueType, TransferType, Exchange. La única pérdida al pasar de CSF a GSF es el orden de la secuencia, ya que los grafos son no temporales.
El estándar
GSF sintetiza las reglas para la visualización, no la visualización en sí misma. Cuando se utiliza, significa que tú defines qué mostrar y el formato se encarga de cómo mostrarlo. La base de referencia se mantiene coherente en todos los proyectos.
Tres cosas:
- GSF es el conjunto de reglas. Nunca se visualiza.
- Un conjunto de datos es una
{view, nodes, links}instancia que cumple con el GSF. Esto es lo que se representa. - Un renderizador toma las reglas y el conjunto de datos, y dibuja la imagen.
Cuatro primitivas. Todo lo que necesita un renderizador:
- Relación: un vínculo entre exactamente dos entidades. Los vínculos crean el grafo.
- Tipo: el clasificador cualitativo. Determina la forma y el color.
- Variables: el conjunto de detalles. Contiene todo lo que no incluye el tipo.
- Peso: la magnitud cuantitativa. Determina el tamaño y el ancho.
La regla de codificación: valor frente a valores. El único valor cuantitativo (un número, contenido en weight) determina el tamaño y el ancho. Los valores cualitativos (categoría, estado, etiqueta) determinan la forma, el color, la agrupación y lo que se muestra al pasar el cursor por encima.
Una decisión de diseño que merece la pena destacar: los tipos de relación son cadenas abiertas. No hay una lista cerrada. Un conjunto de datos define los tipos que necesite; mi gráfico anterior utiliza founder, cofounder, spinout, y operates, ninguno de los cuales figura en la especificación. Se ha renderizado correctamente. GSF corrige la codificación (cómo los tipos se convierten en formas y colores), no el vocabulario (qué tipos se pueden utilizar).
Densidad
El mismo control que en CSF. Cuánto detalle y color muestra el renderizador:
- Ligero: blanco y negro. La forma codifica el tipo, el estilo de línea codifica la clase de relación (sólida = valor, discontinua = datos, punteada = derivada), el grosor codifica la magnitud y la punta de flecha codifica la dirección. Sin color. Listo para imprimir.
- Medio: añade color como superposición, una leyenda y variables al pasar el cursor por encima.
- Intenso: el registro completo. Todas las variables, puntos finales de transferencia, posibilidades de expansión.
Una regla: la opción «Ligera» debe leerse en blanco y negro. El color nunca es la única señal.
El formato
Un enlace necesita source, destination, y type. Todo lo demás es opcional:
{
"format": "gsf",
"version": "0.5.2",
"renderer": "d3-force",
"view": { "level": "light", "hops": 1, "focus": ["Person A"] },
"links": [
{ "source": "Person A", "destination": "Person B", "type": "message" }
]
}
En los gráficos de capas de valor, los objetos de los extremos contienen value_type y transfer_type en cada lado. Cuando difieren, esto indica un intercambio, y via identifica al intercambiador:
{
"format": "gsf",
"version": "0.5.2",
"renderer": "d3-force",
"view": { "level": "heavy", "hops": 1, "focus": ["Brale"] },
"nodes": [
{ "id": "Sender", "type": "org" },
{ "id": "Brale", "type": "org", "variables": { "sub_type": "exchange" } },
{ "id": "Recipient Wallet", "type": "system", "variables": { "sub_type": "wallet" } }
],
"links": [
{
"source": { "id": "Sender", "value_type": "USD", "transfer_type": "wire" },
"destination": { "id": "Recipient Wallet", "value_type": "USDC", "transfer_type": "solana" },
"type": "transfers_via",
"via": "Brale",
"weight": 1000,
"variables": { "exchange": "USD -> USDC", "rate": 1.0 }
}
]
}
Cómo utilizarlo
Pega gsf-0.5.2.json en un modelo de lenguaje grande (LLM) y pídele que convierta el material de origen en un conjunto de datos GSF. Siempre sigue el formato, igual que CSF. El llm_instructions bloque de la especificación está diseñado para que las máquinas lo procesen directamente. Consulta el repositorio de GSF para obtener la última versión.
El estándar es de código abierto: github.com/benmilne-com/standards/gsf. Haz un fork, utilízalo, contribuye.
La estructura es libre.