diff options
Diffstat (limited to 'pt-br/news/phase4-institutional-onboarding/index.html')
| -rw-r--r-- | pt-br/news/phase4-institutional-onboarding/index.html | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/pt-br/news/phase4-institutional-onboarding/index.html b/pt-br/news/phase4-institutional-onboarding/index.html new file mode 100644 index 0000000..023892c --- /dev/null +++ b/pt-br/news/phase4-institutional-onboarding/index.html @@ -0,0 +1,252 @@ +<!DOCTYPE html> +<html lang="pt-br"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Fase 4: Onboarding de Nos Institucionais — Tesseras</title> + <meta name="description" content="Bibliotecas, arquivos e museus agora podem ingressar na rede Tesseras como nos institucionais verificados com identidade baseada em DNS, indices de busca full-text e compromissos configuraveis de armazenamento."> + <!-- Open Graph --> + <meta property="og:type" content="article"> + <meta property="og:title" content="Fase 4: Onboarding de Nos Institucionais"> + <meta property="og:description" content="Bibliotecas, arquivos e museus agora podem ingressar na rede Tesseras como nos institucionais verificados com identidade baseada em DNS, indices de busca full-text e compromissos configuraveis de armazenamento."> + <meta property="og:image" content="https://tesseras.net/images/social.jpg"> + <meta property="og:image:width" content="1200"> + <meta property="og:image:height" content="630"> + <meta property="og:site_name" content="Tesseras"> + <!-- Twitter Card --> + <meta name="twitter:card" content="summary_large_image"> + <meta name="twitter:title" content="Fase 4: Onboarding de Nos Institucionais"> + <meta name="twitter:description" content="Bibliotecas, arquivos e museus agora podem ingressar na rede Tesseras como nos institucionais verificados com identidade baseada em DNS, indices de busca full-text e compromissos configuraveis de armazenamento."> + <meta name="twitter:image" content="https://tesseras.net/images/social.jpg"> + <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690"> + + + <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml"> + + + <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d"> + +</head> +<body> + <header> + <h1> + <a href="https://tesseras.net/pt-br/"> + <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo"> + Tesseras + </a> + </h1> + <nav> + + <a href="https://tesseras.net/pt-br/about/">Sobre</a> + <a href="https://tesseras.net/pt-br/news/">Notícias</a> + <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a> + <a href="https://tesseras.net/pt-br/faq/">FAQ</a> + <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a> + <a href="https://tesseras.net/pt-br/contact/">Contato</a> + + </nav> + <nav class="lang-switch"> + + <a href="https://tesseras.net/news/phase4-institutional-onboarding/">English</a> | <strong>Português</strong> + + </nav> + </header> + + <main> + +<article> + <h2>Fase 4: Onboarding de Nos Institucionais</h2> + <p class="news-date">2026-02-15</p> + <p>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.</p> +<p>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.</p> +<h2 id="o-que-foi-construido">O que foi construido</h2> +<p><strong>Bits de capacidade</strong> (<code>tesseras-core/src/network.rs</code>) — Dois novos flags +adicionados ao bitfield <code>Capabilities</code>: <code>INSTITUTIONAL</code> (bit 7) e <code>SEARCH_INDEX</code> +(bit 8). Um novo construtor <code>institutional_default()</code> retorna o conjunto +completo de capacidades da Fase 2 mais esses dois bits e <code>RELAY</code>. Nos normais +anunciam <code>phase2_default()</code> que nao inclui flags institucionais. Testes de +roundtrip de serializacao verificam que os novos bits sobrevivem a codificacao +MessagePack.</p> +<p><strong>Tipos de busca</strong> (<code>tesseras-core/src/search.rs</code>) — Tres novos tipos de dominio +para o subsistema de busca:</p> +<ul> +<li><code>SearchFilters</code> — parametros de consulta: <code>memory_type</code>, <code>visibility</code>, +<code>language</code>, <code>date_range</code>, <code>geo</code> (bounding box), <code>page</code>, <code>page_size</code></li> +<li><code>SearchHit</code> — um resultado individual: hash do conteudo mais um +<code>MetadataExcerpt</code> (titulo, descricao, tipo de memoria, data de criacao, +visibilidade, idioma, tags)</li> +<li><code>GeoFilter</code> — bounding box com <code>min_lat</code>, <code>max_lat</code>, <code>min_lon</code>, <code>max_lon</code> para +consultas espaciais</li> +</ul> +<p>Todos os tipos derivam <code>Serialize</code>/<code>Deserialize</code> para transporte e +<code>Clone</code>/<code>Debug</code> para diagnostico.</p> +<p><strong>Configuracao institucional do daemon</strong> (<code>tesd/src/config.rs</code>) — Uma nova secao +<code>[institutional]</code> no TOML com <code>domain</code> (o dominio DNS a verificar), +<code>pledge_bytes</code> (compromisso de armazenamento em bytes) e <code>search_enabled</code> +(toggle para o indice FTS5). O metodo <code>to_dht_config()</code> agora define +<code>Capabilities::institutional_default()</code> quando a configuracao institucional esta +presente, para que nos institucionais anunciem os bits de capacidade corretos em +respostas Pong.</p> +<p><strong>Verificacao DNS TXT</strong> (<code>tesd/src/institutional.rs</code>) — Resolucao DNS assincrona +usando <code>hickory-resolver</code> para verificar identidade institucional. O daemon +consulta registros TXT em <code>_tesseras.<dominio></code> e analisa campos chave-valor: +<code>v</code> (versao), <code>node</code> (node ID em hexadecimal) e <code>pledge</code> (compromisso de +armazenamento em bytes). A verificacao checa:</p> +<ol> +<li>Um registro TXT existe em <code>_tesseras.<dominio></code></li> +<li>O campo <code>node</code> corresponde ao node ID do proprio daemon</li> +<li>O campo <code>pledge</code> esta presente e e valido</li> +</ol> +<p>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.</p> +<p><strong>Comando CLI de setup</strong> (<code>tesseras-cli/src/institutional.rs</code>) — Um novo +subcomando <code>institutional setup</code> que guia operadores pelo onboarding:</p> +<ol> +<li>Le a identidade do no a partir do diretorio de dados</li> +<li>Solicita nome de dominio e tamanho do pledge</li> +<li>Gera o registro DNS TXT exato a adicionar: +<code>v=tesseras1 node=<hex> pledge=<bytes></code></li> +<li>Escreve a secao institucional no arquivo de configuracao do daemon</li> +<li>Imprime os proximos passos: adicionar o registro TXT, reiniciar o daemon</li> +</ol> +<p><strong>Indice de busca SQLite</strong> (<code>tesseras-storage</code>) — Uma migracao +(<code>003_institutional.sql</code>) que cria tres estruturas:</p> +<ul> +<li><code>search_content</code> — uma tabela virtual FTS5 para busca full-text sobre +metadados de tesseras (titulo, descricao, criador, tags, idioma)</li> +<li><code>geo_index</code> — uma tabela virtual R-tree para consultas espaciais de bounding +box sobre latitude/longitude</li> +<li><code>geo_map</code> — uma tabela de mapeamento ligando IDs de linhas do R-tree a hashes +de conteudo</li> +</ul> +<p>O adaptador <code>SqliteSearchIndex</code> implementa o port trait <code>SearchIndex</code> com +<code>index_tessera()</code> (inserir/atualizar) e <code>search()</code> (consultar com filtros). +Consultas FTS5 suportam busca em linguagem natural; consultas geo usam +<code>INTERSECT</code> do R-tree para lookups de bounding box. Resultados sao ranqueados +por score de relevancia do FTS5.</p> +<p>A migracao tambem adiciona uma coluna <code>is_institutional</code> a tabela <code>reciprocity</code>, +tratada de forma idempotente via checagens <code>pragma_table_info</code> (o +<code>ALTER TABLE ADD COLUMN</code> do SQLite nao tem <code>IF NOT EXISTS</code>).</p> +<p><strong>Bypass de reciprocidade</strong> (<code>tesseras-replication/src/service.rs</code>) — Nos +institucionais sao isentos de checagens de reciprocidade. Quando +<code>receive_fragment()</code> 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.</p> +<p><strong>Restricao de diversidade por tipo de no</strong> +(<code>tesseras-replication/src/distributor.rs</code>) — Uma nova funcao +<code>apply_institutional_diversity()</code> limita quantas replicas de uma unica tessera +podem ir para nos institucionais. O limite e <code>ceil(fator_replicacao / 3.5)</code> — +com o padrao <code>r=7</code>, 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.</p> +<p><strong>Extensoes de mensagens DHT</strong> (<code>tesseras-dht/src/message.rs</code>) — Duas novas +variantes de mensagem:</p> +<table><thead><tr><th>Mensagem</th><th>Proposito</th></tr></thead><tbody> +<tr><td><code>Search</code></td><td>Cliente envia string de consulta, filtros e numero da pagina</td></tr> +<tr><td><code>SearchResult</code></td><td>No institucional responde com resultados e contagem total</td></tr> +</tbody></table> +<p>A funcao <code>encode()</code> foi trocada de serializacao MessagePack posicional para +nomeada (<code>rmp_serde::to_vec_named</code>) para lidar corretamente com campos opcionais +de <code>SearchFilters</code> — a codificacao posicional quebra quando +<code>skip_serializing_if</code> omite campos.</p> +<p><strong>Metricas Prometheus</strong> (<code>tesd/src/metrics.rs</code>) — Oito metricas especificas +institucionais:</p> +<ul> +<li><code>tesseras_institutional_pledge_bytes</code> — compromisso de armazenamento +configurado</li> +<li><code>tesseras_institutional_stored_bytes</code> — bytes realmente armazenados</li> +<li><code>tesseras_institutional_pledge_utilization_ratio</code> — razao armazenado/prometido</li> +<li><code>tesseras_institutional_peers_served</code> — peers unicos que receberam fragmentos</li> +<li><code>tesseras_institutional_search_index_total</code> — tesseras no indice de busca</li> +<li><code>tesseras_institutional_search_queries_total</code> — consultas de busca recebidas</li> +<li><code>tesseras_institutional_dns_verification_status</code> — 1 se verificado por DNS, 0 +caso contrario</li> +<li><code>tesseras_institutional_dns_verification_last</code> — timestamp Unix da ultima +verificacao</li> +</ul> +<p><strong>Testes de integracao</strong> — Dois testes em +<code>tesseras-replication/tests/integration.rs</code>:</p> +<ul> +<li><code>institutional_peer_bypasses_reciprocity</code> — 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 rejeitado</li> +<li><code>institutional_node_accepts_fragment_despite_deficit</code> — teste async completo +usando <code>ReplicationService</code> com DHT, fragment store, reciprocity ledger e blob +store mockados: envia um fragmento de um remetente institucional e verifica +que e aceito</li> +</ul> +<p>322 testes passam em todo o workspace. Clippy limpo com <code>-D warnings</code>.</p> +<h2 id="decisoes-de-arquitetura">Decisoes de arquitetura</h2> +<ul> +<li><strong>DNS TXT ao inves de PKI ou blockchain</strong>: 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.</li> +<li><strong>Degradacao graciosa em falha DNS</strong>: 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.</li> +<li><strong>Limite de diversidade em <code>ceil(r / 3.5)</code></strong>: com <code>r=7</code>, 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.</li> +<li><strong>Codificacao MessagePack nomeada</strong>: 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.</li> +<li><strong>Isencao de reciprocidade ao inves de concessao de creditos</strong>: 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.</li> +<li><strong>FTS5 + R-tree no SQLite</strong>: 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.</li> +</ul> +<h2 id="o-que-vem-a-seguir">O que vem a seguir</h2> +<ul> +<li><strong>Fase 4 continuacao</strong> — deduplicacao de armazenamento (armazenamento +enderecavel por conteudo com BLAKE3), auditorias de seguranca, empacotamento +para OS (Alpine, Arch, Debian, OpenBSD, FreeBSD)</li> +<li><strong>Fase 5: Exploracao e Cultura</strong> — 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</li> +</ul> +<p>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.</p> + +</article> + + </main> + + <footer> + <p>© 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p> + </footer> +</body> +</html> |