Fase 4: Onboarding de Nos Institucionais
2026-02-15
Uma rede P2P composta apenas por individuos e fragil. Discos rigidos morrem, celulares sao perdidos, pessoas perdem interesse. A sobrevivencia a longo prazo das memorias da humanidade depende de instituicoes — bibliotecas, arquivos, museus, universidades — que medem seus tempos de vida em seculos. A Fase 4 continua com o onboarding de nos institucionais: organizacoes verificadas agora podem prometer armazenamento, manter indices de busca e participar da rede com uma identidade distinta.
O design segue um principio de confiar mas verificar: instituicoes se identificam via registros DNS TXT (o mesmo mecanismo usado por SPF, DKIM e DMARC para email), prometem um orcamento de armazenamento e recebem isencoes de reciprocidade para que possam armazenar fragmentos para outros sem esperar nada em troca. Em contrapartida, a rede trata seus fragmentos como replicas de maior qualidade e limita a dependencia excessiva de qualquer instituicao individual atraves de restricoes de diversidade.
O que foi construido
Bits de capacidade (tesseras-core/src/network.rs) — Dois novos flags
adicionados ao bitfield Capabilities: INSTITUTIONAL (bit 7) e SEARCH_INDEX
(bit 8). Um novo construtor institutional_default() retorna o conjunto
completo de capacidades da Fase 2 mais esses dois bits e RELAY. Nos normais
anunciam phase2_default() que nao inclui flags institucionais. Testes de
roundtrip de serializacao verificam que os novos bits sobrevivem a codificacao
MessagePack.
Tipos de busca (tesseras-core/src/search.rs) — Tres novos tipos de dominio
para o subsistema de busca:
SearchFilters— parametros de consulta:memory_type,visibility,language,date_range,geo(bounding box),page,page_sizeSearchHit— um resultado individual: hash do conteudo mais umMetadataExcerpt(titulo, descricao, tipo de memoria, data de criacao, visibilidade, idioma, tags)GeoFilter— bounding box commin_lat,max_lat,min_lon,max_lonpara consultas espaciais
Todos os tipos derivam Serialize/Deserialize para transporte e
Clone/Debug para diagnostico.
Configuracao institucional do daemon (tesd/src/config.rs) — Uma nova secao
[institutional] no TOML com domain (o dominio DNS a verificar),
pledge_bytes (compromisso de armazenamento em bytes) e search_enabled
(toggle para o indice FTS5). O metodo to_dht_config() agora define
Capabilities::institutional_default() quando a configuracao institucional esta
presente, para que nos institucionais anunciem os bits de capacidade corretos em
respostas Pong.
Verificacao DNS TXT (tesd/src/institutional.rs) — Resolucao DNS assincrona
usando hickory-resolver para verificar identidade institucional. O daemon
consulta registros TXT em _tesseras.<dominio> e analisa campos chave-valor:
v (versao), node (node ID em hexadecimal) e pledge (compromisso de
armazenamento em bytes). A verificacao checa:
- Um registro TXT existe em
_tesseras.<dominio> - O campo
nodecorresponde ao node ID do proprio daemon - O campo
pledgeesta presente e e valido
Na inicializacao, o daemon tenta a verificacao DNS. Se bem-sucedida, o no roda com capacidades institucionais. Se falhar, o no registra um aviso e faz downgrade para um no completo normal — sem crash, sem intervencao manual.
Comando CLI de setup (tesseras-cli/src/institutional.rs) — Um novo
subcomando institutional setup que guia operadores pelo onboarding:
- Le a identidade do no a partir do diretorio de dados
- Solicita nome de dominio e tamanho do pledge
- Gera o registro DNS TXT exato a adicionar:
v=tesseras1 node=<hex> pledge=<bytes> - Escreve a secao institucional no arquivo de configuracao do daemon
- Imprime os proximos passos: adicionar o registro TXT, reiniciar o daemon
Indice de busca SQLite (tesseras-storage) — Uma migracao
(003_institutional.sql) que cria tres estruturas:
search_content— uma tabela virtual FTS5 para busca full-text sobre metadados de tesseras (titulo, descricao, criador, tags, idioma)geo_index— uma tabela virtual R-tree para consultas espaciais de bounding box sobre latitude/longitudegeo_map— uma tabela de mapeamento ligando IDs de linhas do R-tree a hashes de conteudo
O adaptador SqliteSearchIndex implementa o port trait SearchIndex com
index_tessera() (inserir/atualizar) e search() (consultar com filtros).
Consultas FTS5 suportam busca em linguagem natural; consultas geo usam
INTERSECT do R-tree para lookups de bounding box. Resultados sao ranqueados
por score de relevancia do FTS5.
A migracao tambem adiciona uma coluna is_institutional a tabela reciprocity,
tratada de forma idempotente via checagens pragma_table_info (o
ALTER TABLE ADD COLUMN do SQLite nao tem IF NOT EXISTS).
Bypass de reciprocidade (tesseras-replication/src/service.rs) — Nos
institucionais sao isentos de checagens de reciprocidade. Quando
receive_fragment() e chamado, se o node ID do remetente esta marcado como
institucional no ledger de reciprocidade, a checagem de saldo e ignorada
completamente. Isso significa que instituicoes podem armazenar fragmentos para
toda a rede sem precisar "ganhar" creditos primeiro — sua identidade verificada
por DNS e compromisso de armazenamento servem como credencial.
Restricao de diversidade por tipo de no
(tesseras-replication/src/distributor.rs) — Uma nova funcao
apply_institutional_diversity() limita quantas replicas de uma unica tessera
podem ir para nos institucionais. O limite e ceil(fator_replicacao / 3.5) —
com o padrao r=7, no maximo 2 de 7 replicas vao para instituicoes. Isso impede
que a rede se torne dependente de um pequeno numero de grandes instituicoes: se
os servidores de uma universidade cairem, pelo menos 5 replicas permanecem em
nos independentes.
Extensoes de mensagens DHT (tesseras-dht/src/message.rs) — Duas novas
variantes de mensagem:
| Mensagem | Proposito |
|---|---|
Search | Cliente envia string de consulta, filtros e numero da pagina |
SearchResult | No institucional responde com resultados e contagem total |
A funcao encode() foi trocada de serializacao MessagePack posicional para
nomeada (rmp_serde::to_vec_named) para lidar corretamente com campos opcionais
de SearchFilters — a codificacao posicional quebra quando
skip_serializing_if omite campos.
Metricas Prometheus (tesd/src/metrics.rs) — Oito metricas especificas
institucionais:
tesseras_institutional_pledge_bytes— compromisso de armazenamento configuradotesseras_institutional_stored_bytes— bytes realmente armazenadostesseras_institutional_pledge_utilization_ratio— razao armazenado/prometidotesseras_institutional_peers_served— peers unicos que receberam fragmentostesseras_institutional_search_index_total— tesseras no indice de buscatesseras_institutional_search_queries_total— consultas de busca recebidastesseras_institutional_dns_verification_status— 1 se verificado por DNS, 0 caso contrariotesseras_institutional_dns_verification_last— timestamp Unix da ultima verificacao
Testes de integracao — Dois testes em
tesseras-replication/tests/integration.rs:
institutional_peer_bypasses_reciprocity— verifica que um peer institucional com deficit massivo (-999.999 de saldo) ainda pode armazenar fragmentos, enquanto um peer nao institucional com o mesmo deficit e rejeitadoinstitutional_node_accepts_fragment_despite_deficit— teste async completo usandoReplicationServicecom DHT, fragment store, reciprocity ledger e blob store mockados: envia um fragmento de um remetente institucional e verifica que e aceito
322 testes passam em todo o workspace. Clippy limpo com -D warnings.
Decisoes de arquitetura
- DNS TXT ao inves de PKI ou blockchain: DNS e universalmente implantado, universalmente compreendido e ja usado para verificacao de dominio (SPF, DKIM, Let's Encrypt). Instituicoes ja gerenciam DNS. Nenhuma autoridade certificadora, nenhum token, nenhuma transacao on-chain — apenas um registro TXT. Se uma instituicao perder controle de seu dominio, a verificacao naturalmente falha na proxima checagem.
- Degradacao graciosa em falha DNS: se a verificacao DNS falha na inicializacao, o daemon faz downgrade para um no completo normal ao inves de recusar iniciar. Isso previne incidentes operacionais — uma misconfiguracao DNS nao deveria tirar um no do ar.
- Limite de diversidade em
ceil(r / 3.5): comr=7, no maximo 2 replicas vao para instituicoes. Isso e conservador — garante que a rede nunca dependa de instituicoes para quorum majoritario, enquanto ainda se beneficia de sua capacidade de armazenamento e uptime. - Codificacao MessagePack nomeada: trocar de codificacao posicional para nomeada adiciona ~15% de overhead por mensagem mas elimina uma classe de bugs de serializacao quando campos opcionais estao presentes. O DHT nao e limitado por largura de banda no nivel de mensagem, entao o tradeoff vale a pena.
- Isencao de reciprocidade ao inves de concessao de creditos: ao inves de dar as instituicoes um saldo inicial grande de creditos (que e arbitrario e precisa de ajuste), isentamos completamente. Sua identidade verificada por DNS e compromisso publico de armazenamento substituem o mecanismo de reciprocidade bilateral.
- FTS5 + R-tree no SQLite: busca full-text e indexacao espacial sao embutidas no SQLite como extensoes carregaveis. Nenhum motor de busca externo (Elasticsearch, Meilisearch) necessario. Isso mantem o deploy como um unico binario com um unico arquivo de banco de dados — critico para operadores institucionais que podem nao ter uma equipe de DevOps.
O que vem a seguir
- Fase 4 continuacao — deduplicacao de armazenamento (armazenamento enderecavel por conteudo com BLAKE3), auditorias de seguranca, empacotamento para OS (Alpine, Arch, Debian, OpenBSD, FreeBSD)
- Fase 5: Exploracao e Cultura — navegador publico de tesseras por era/localizacao/tema/idioma, curadoria institucional, integracao genealogica (FamilySearch, Ancestry), exportacao para midia fisica (M-DISC, microfilme, papel livre de acido com QR), contexto assistido por IA
O onboarding institucional fecha uma lacuna critica no modelo de preservacao do Tesseras. Nos individuais fornecem resiliencia de base — milhares de dispositivos ao redor do globo, cada um armazenando alguns fragmentos. Nos institucionais fornecem ancoragem — organizacoes com infraestrutura profissional, armazenamento redundante e horizontes operacionais de multiplas decadas. Juntos, formam uma rede onde memorias podem sobreviver tanto a dispositivos individuais quanto a instituicoes individuais.