Em 2018, criei um modelo de rede para descobrir onde investir meu tempo na comunidade tecnológica de Iowa. O modelo cresceu até atingir cerca de 10.000 elementos – empresas, organizações, pessoas, cidades, conectividade. Utilizei a centralidade por vetor próprio para identificar nós aos quais eu não estava conectado, mas que apresentavam alta conectividade em outras partes da rede. Isso influenciou decisões concretas: passei a integrar o conselho da TAI, descobri comunidades cuja existência eu desconhecia e mapeei as diferenças de densidade entre Des Moines e os ecossistemas costeiros.
Esse modelo ficou gravado na minha memória. Ao longo dos anos na Brale, gráficos de relações direcionados por forças continuam surgindo – mapeando emissores a ativos a trilhos, conectando operadores de programas às blockchains nas quais eles operam. Sempre, alguém reinventa a linguagem visual. O que uma cor significa? O que uma linha grossa representa? Que forma distingue uma empresa de uma pessoa de um evento? Essas decisões são tomadas do zero a cada projeto. A próxima pessoa que abrir o gráfico precisa fazer a engenharia reversa de tudo isso antes de poder ler o conteúdo.
No ano passado, o CSF (Commons Stablecoin Format) padronizou a forma como representamos fluxos de fundos. Basta colar a especificação em um LLM, solicitar um fluxo de fundos “stablecoin”, e ele seguirá o formato todas as vezes. Eu queria o mesmo para gráficos de relacionamento. Por isso, criei o Graphing Standard Format – GSF –, uma pequena gramática que define como o tipo determina a forma, como o peso determina o tamanho e como os níveis de densidade controlam o que é divulgado.
Esta é a minha rede, representada no GSF:
Os círculos representam pessoas. Os retângulos arredondados representam organizações. Os triângulos representam eventos – distintos das empresas que os produzem. Os losangos representam locais. Os hexágonos representam conceitos. As pílulas representam sistemas. Clique em qualquer nó para ver seu cartão de perfil. Alterne para a visualização “Média” para ver as cores. Você não precisou decidir nada disso. O GSF já fez isso.
Aqui está um vídeo demonstrando o uso do GSF pela primeira vez. Ele se saiu muito bem!
GSF e CSF
| CSF | GSF | |
|---|---|---|
| Saída | Diagramas de sequência Mermaid | Gráficos de relacionamento D3 |
| Respostas | Como o valor passa de A para B, em ordem | O que existe e como está conectado |
| Natureza | Temporal, ordenado por etapas | Estrutural, não temporal |
| Níveis | Leve / Médio / Pesado | Leve / Médio / Pesado |
Ambos implementam as mesmas primitivas da camada de valor: ValueType, TransferType, Exchange. A única perda ao passar do CSF para o GSF é a ordem da sequência, já que os grafos são não temporais.
O padrão
GSF destila as regras para a visualização – não a visualização em si. Quando é usado, significa que você define o que mostrar e o formato cuida de como mostrá-lo. A linha de base permanece consistente entre os projetos.
Três pontos:
- O GSF é o conjunto de regras. Nunca é visualizado.
- Um conjunto de dados é uma
{view, nodes, links}instância que está em conformidade com o GSF. É isso que é renderizado. - Um renderizador utiliza as regras e um conjunto de dados para criar a imagem.
Quatro primitivas. Tudo o que um renderizador precisa:
- Relação – um vínculo entre exatamente duas entidades. Os vínculos criam o grafo.
- Tipo – o classificador qualitativo. Determina a forma e a cor.
- Variáveis – o conjunto de detalhes. Contém tudo o que o tipo não contém.
- Peso – a magnitude quantitativa. Determina o tamanho e a largura.
A regra de codificação: valor versus valores. O único valor quantitativo (um número, contido em weight) determina o tamanho e a largura. Os valores qualitativos (categoria, status, rótulo) determinam a forma, a cor, o agrupamento e o que é exibido ao passar o mouse.
Uma escolha de design que vale a pena destacar: os tipos de relação são strings abertas. Não há uma lista fechada. Um conjunto de dados define os tipos de que precisa – meu gráfico acima usa founder, cofounder, spinout, e operates, nenhum dos quais consta na especificação. A renderização ocorreu normalmente. O GSF define a codificação (como os tipos se transformam em formas e cores), não o vocabulário (quais tipos você tem permissão para usar).
Densidade
O mesmo controle que no CSF. Quanto detalhe e cor um renderizador revela:
- Leve – preto e branco. A forma codifica o tipo, o estilo da linha codifica a classe da relação (contínua = valor, tracejada = dados, pontilhada = derivada), a espessura codifica a magnitude e a ponta da seta codifica a direção. Sem cor. Pronto para impressão.
- Médio – adiciona cor como uma sobreposição, uma legenda e variáveis ao passar o mouse.
- Intenso – o registro completo. Todas as variáveis, pontos finais de transferência, possibilidades de expansão.
Uma regra: a opção “Leve” deve ser legível em preto e branco. A cor nunca é o único sinal.
O formato
Um link precisa source, destinatione type. Todo o resto é 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" }
]
}
Para gráficos de camada de valor, os objetos de ponto final carregam value_type e transfer_type em cada lado. Quando eles diferem, isso indica uma troca – e via identifica o responsável pela troca:
{
"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 }
}
]
}
Como usar
Cole o arquivo gsf-0.5.2.json em um LLM e peça para converter o material de origem em um conjunto de dados GSF. Ele segue o formato todas as vezes – da mesma forma que o CSF. O llm_instructions bloco na especificação foi projetado para ser consumido diretamente por máquinas. Verifique o repositório do GSF para obter a versão mais recente.
O padrão é de código aberto: github.com/benmilne-com/standards/gsf. Faça um fork, use-o, contribua.
A estrutura é livre.