Copiado ✓
Protocolo Operacional · Resiliência Documental
PROTOCOLO DE
RESILIÊNCIA
Guia técnico completo para tornar o lawfare-timeline imune ao 404, ao bloqueio de domínio e à desativação de plataformas no período eleitoral.
4
Camadas de redundância
∞
IPFS — sem ponto único de falha
Out/26
Deadline crítico
0
Dependências centralizadas após protocolo
O problema que estamos resolvendo
⚠
O 404 é a arma mais eficiente do regime. Não é preciso proibir a publicação. Basta remover após a circulação inicial. Quem busca no futuro encontra nada — e conclui que não havia nada. O projeto lawfare-timeline tem um único ponto de falha: o domínio no Vercel. Se o domínio for bloqueado, o servidor atacado ou a conta suspensa, o trabalho de anos some em segundos.
Arquitetura de 4 camadas
Camada 1 · Primária
Vercel + Domínio próprio
Situação atual. Rápido, fácil de atualizar, boa performance. Ponto único de falha: domínio brasileiro sujeito a bloqueio judicial, conta Vercel sujeita a pressão.
lawfare-timeline.vercel.app
Camada 2 · Espelho automático
GitHub Pages
Repositório público no GitHub com GitHub Pages ativado. Push automático a cada commit via GitHub Actions. URL alternativa fora da jurisdição brasileira, disponível em segundos se Vercel cair.
usuario.github.io/lawfare-timeline
Camada 3 · Imutável
IPFS
Endereçamento por conteúdo (hash CID). O 404 deixa de existir como conceito — o conteúdo é acessível por qualquer nó da rede que tenha a cópia. Imutável: não pode ser apagado por ordem judicial.
ipfs.io/ipfs/[CID]
Camada 4 · Arquivo permanente
Archive.org + archive.ph
Wayback Machine e archive.ph para fontes externas. Cada fonte citada no projeto deve ter URL arquivada antes de publicar. Garante que o 404 de fontes terceiras não invalide as entradas JSON.
web.archive.org / archive.ph
Status atual de resiliência
Vercel (primário)Ativo ✓
GitHub MirrorPendente ✗
IPFSPendente ✗
Fontes arquivadas (archive.org)Parcial ~30%
Plano B período eleitoralPendente ✗
Configuração do espelho GitHub Pages
Objetivo: qualquer commit no repositório principal dispara automaticamente um push para o GitHub Pages. Se o Vercel cair, a URL do GitHub Pages está disponível imediatamente — sem intervenção manual.
Passo 1 — Criar repositório e configurar estrutura
# No terminal, dentro do diretório do projeto Jekyll $ git init $ git remote add origin https://github.com/SEU_USUARIO/lawfare-timeline.git # Criar branch gh-pages para o Pages $ git checkout -b gh-pages $ git push -u origin gh-pages # No GitHub: Settings → Pages → Source: gh-pages branch → /root # URL resultante: https://SEU_USUARIO.github.io/lawfare-timeline
Passo 2 — GitHub Action para deploy automático (.github/workflows/deploy.yml)
name: Deploy to GitHub Pages on: push: branches: ["main"] workflow_dispatch: # permite trigger manual permissions: contents: read pages: write id-token: write jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Ruby uses: ruby/setup-ruby@v1 with: ruby-version: '3.2' bundler-cache: true - name: Build Jekyll run: bundle exec jekyll build --destination ./_site env: JEKYLL_ENV: production - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: './_site' - name: Deploy to GitHub Pages uses: actions/deploy-pages@v4 # Push para main → build automático → deploy no GitHub Pages # Latência: ~2-3 minutos após o commit
Passo 3 — Backup semanal automatizado do JSON
# Adicionar ao .github/workflows/backup.yml name: Weekly JSON Backup on: schedule: - cron: '0 3 * * 0' # domingo às 03:00 UTC workflow_dispatch: jobs: backup: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Generate SHA-256 hashes run: | find ./_data -name "*.json" -exec sha256sum {} \; > checksums.txt echo "Backup: $(date -u)" >> checksums.txt - name: Commit checksums run: | git config user.email "backup@lawfare-timeline" git config user.name "Backup Bot" git add checksums.txt git commit -m "chore: weekly checksum $(date +%Y-%m-%d)" || exit 0 git push # Resultado: checksums.txt no repositório com hash de cada JSON # Qualquer adulteração futura é detectável comparando hashes
IPFS — endereçamento por conteúdo
Por que IPFS é diferente: em sistemas normais, um arquivo existe em um endereço (URL). Se o servidor cair, o arquivo some. No IPFS, o arquivo é o endereço — identificado pelo hash do seu conteúdo (CID). O arquivo pode estar em qualquer nó da rede global e é sempre acessível enquanto pelo menos um nó o tiver. Uma ordem judicial pode bloquear um domínio; não pode bloquear um CID.
Opção A — Pinata (mais simples, sem instalar nada)
01
Criar conta em pinata.cloud
Serviço gratuito até 1GB. Faz o "pinning" — mantém seu conteúdo disponível na rede IPFS indefinidamente. Interface web simples. Não requer instalação local.
02
Upload do _site compilado ou do _data/JSON
Após cada build do Jekyll, fazer upload da pasta _site (ou apenas _data com os JSONs). O Pinata retorna um CID — o endereço imutável do conteúdo.
03
Registrar o CID no repositório
Criar arquivo ipfs-manifesto.txt no repositório com os CIDs de cada snapshot. Isso cria um registro auditável de todas as versões.
04
Compartilhar a URL IPFS
Qualquer pessoa pode acessar via: https://ipfs.io/ipfs/[SEU_CID] ou https://[SEU_CID].ipfs.dweb.link — sem depender de nenhum servidor centralizado.
Opção B — IPFS CLI local (controle total)
# Instalar IPFS Kubo (recomendado) # Download: https://dist.ipfs.tech/#kubo $ ipfs init $ ipfs daemon & # inicia nó local em background # Adicionar o site compilado $ ipfs add -r ./_site/ added QmX... _site/index.html added QmY... _site/_data/ added QmZ... _site/ ← este é o CID raiz # Salvar o CID raiz $ echo "$(date +%Y-%m-%d): QmZ..." >> ipfs-manifesto.txt # Pin no Pinata para garantir disponibilidade permanente $ curl -X POST "https://api.pinata.cloud/pinning/pinByHash" \ -H "Authorization: Bearer SEU_TOKEN" \ -H "Content-Type: application/json" \ -d '{"hashToPin": "QmZ..."}' # Acesso: https://ipfs.io/ipfs/QmZ.../
ipfs-manifesto.txt — formato recomendado
# Lawfare-Timeline — IPFS Manifesto # Cada linha: data | CID | descrição # Verificação: ipfs cat [CID]/checksums.txt 2026-04-11 | QmABC...xyz | snapshot completo v1.0 (IDs 1-152) 2026-04-18 | QmDEF...uvw | snapshot v1.1 (IDs 1-158, Sem Desconto) 2026-05-01 | QmGHI...rst | snapshot v1.2 + artefatos jan2026 # Qualquer pessoa pode verificar integridade: # ipfs get QmABC...xyz -o ./verificacao/ # sha256sum -c ./verificacao/checksums.txt
Hash de integridade para fontes críticas
Documento SHA-256 (exemplo de estrutura) Arquivado em
Vaza Toga 4 — A Investigação a3f8c2d1... [calcular após download] archive.org · archive.ph
Arquivos do 8 de Janeiro (PDF) b7e4a9f0... [calcular após download] archive.org · cópia local
Parecer PGR Lindôra (Folha) c2d5b8e3... [calcular após download] archive.org
lawfare-timeline _data/ completo gerar via: sha256sum -r _data/** GitHub + IPFS + HD local
Calcular e registrar hashes de documentos críticos
# Linux/Mac — calcular SHA-256 de um arquivo $ sha256sum documento.pdf a3f8c2d1e9b7... documento.pdf # Calcular hash de todos os JSONs de uma vez $ find ./_data -name "*.json" | sort | xargs sha256sum > hashes_$(date +%Y%m%d).txt # Windows PowerShell PS> Get-FileHash documento.pdf -Algorithm SHA256 # Verificar integridade depois $ sha256sum -c hashes_20260411.txt entrada_001.json: OK entrada_002.json: OK ...
Protocolo de arquivamento de fontes
📋
Regra absoluta: cada fonte citada no lawfare-timeline deve ter URL arquivada no Wayback Machine ANTES de entrar no JSON. Se a fonte vira 404 depois, o arquivo permanece. Se você arquiva depois que a fonte foi removida, já é tarde.
Método 1 — Arquivar manualmente (mais rápido)
# Wayback Machine — acesse no browser https://web.archive.org/save/[URL_DA_FONTE] # Exemplo https://web.archive.org/save/https://www.ainvestigacao.com/p/vaza-toga-the-witch-the-infiltrator # archive.ph — melhor para JavaScript e redes sociais https://archive.ph/[URL_DA_FONTE] # Após arquivar, copie a URL arquivada resultante # Exemplo: https://web.archive.org/web/20260411153000/https://... # Adicione essa URL ao campo "fontes_arquivadas" no JSON
Método 2 — Script Python para arquivar em lote
#!/usr/bin/env python3 # archive_sources.py — arquiva todas as fontes dos JSONs import json, glob, requests, time, os def archive_url(url): """Submete URL ao Wayback Machine e retorna URL arquivada.""" api = f"https://web.archive.org/save/{url}" headers = {"User-Agent": "lawfare-timeline-archiver/1.0"} r = requests.get(api, headers=headers, timeout=30) if r.status_code == 200: archived = r.headers.get("Content-Location", "") return f"https://web.archive.org{archived}" return None # Percorre todos os JSONs e arquiva fontes não arquivadas for path in glob.glob("_data/**/*.json", recursive=True): with open(path) as f: entry = json.load(f) fontes = entry.get("fontes", []) arquivadas = entry.get("fontes_arquivadas", []) for url in fontes: if url not in arquivadas: print(f"Arquivando: {url}") archived = archive_url(url) if archived: arquivadas.append(archived) print(f" → {archived}") time.sleep(5) # respeita rate limit do Wayback entry["fontes_arquivadas"] = arquivadas with open(path, "w") as f: json.dump(entry, f, ensure_ascii=False, indent=2) print("Arquivamento concluído.")
Schema JSON atualizado com campo fontes_arquivadas
Novo campo a adicionar em todas as entradas
{ "id": 146, "operacao": "Operação Sem Desconto", // ... outros campos ... "fontes": [ "https://agenciabrasil.ebc.com.br/..." ], "fontes_arquivadas": [ ← NOVO CAMPO "https://web.archive.org/web/20260423.../agenciabrasil..." ], "hash_snapshot": "sha256:a3f8..." ← NOVO: hash do conteúdo arquivado }
Segurança operacional mínima
🔐
OpSec não é paranoia — é arquitetura. Os documentos da Vaza Toga mostram que jornalistas tinham medo de publicar. O protocolo abaixo não protege contra investigação formal — protege contra vigilância casual, vazamento acidental e rastreamento de fontes.
Comunicação segura
Signal para fontes e colaboradores
Para qualquer comunicação sobre conteúdo sensível. Ativar: mensagens temporárias (7 dias), nota de segurança, verificação de número de segurança. Nunca usar WhatsApp para coordenar publicações.
signal.org — gratuito, open source
Email seguro
ProtonMail para correspondência formal
Para contato com diplomatas, jornalistas internacionais e pesquisadores. E2E encryption nativo. Servidores na Suíça. Não usar Gmail para documentos do projeto.
proton.me — plano gratuito suficiente
Navegação
VPN + Firefox com uBlock
Para pesquisa de fontes sensíveis. VPN recomendada: Mullvad (sem logs, pagamento em cash/cripto). Firefox com uBlock Origin e Privacy Badger. Não pesquisar fontes críticas sem VPN ativa.
mullvad.net — ~5€/mês
Armazenamento local
VeraCrypt para arquivos offline
Cópias locais de documentos primários em container criptografado. Backup mensal em HD externo separado, armazenado fora do local de trabalho. Nunca armazenar documentos classificados em cloud não criptografada.
veracrypt.fr — gratuito, open source
Identidade de fontes
Nunca no JSON público
Identidades de fontes confidenciais: apenas em documento local criptografado, nunca em repositório GitHub (mesmo privado), nunca em mensagem de email comum, nunca em nota de rodapé de artefatos públicos.
Gestão de acesso
2FA em GitHub, Vercel e Pinata
Ativar autenticação em dois fatores em todas as plataformas do projeto. Usar chave física (YubiKey) se possível. Nunca compartilhar credenciais. Tokens de acesso com escopo mínimo necessário.
O que NÃO fazer
Erros comuns que comprometem a segurança do projeto
✗ git commit -m "add fonte confidencial" # nunca commitar dados de fonte ✗ curl https://fonte-critica.com # sem VPN = IP registrado ✗ WhatsApp para coordenar publicações # metadados acessíveis ✗ Gmail para documentos do projeto # Google coopera com ordens judiciais BR ✗ GitHub privado para documentos restritos # privado ≠ seguro ✗ Dropbox/Drive para backup de fontes # sujeito a ordens MLAT ✗ Publicar antes de arquivar a fonte # arquivo não pode ser feito retroativamente ✓ Signal para fontes ✓ ProtonMail para correspondência formal ✓ VPN sempre ativa durante pesquisa ✓ VeraCrypt para arquivos locais sensíveis ✓ Archive.org ANTES de publicar ✓ 2FA em todas as contas do projeto
Cenário de risco — período eleitoral out/2026
🗳️
Risco documentado: desativação de IAs no período eleitoral está em discussão. X foi bloqueado por 40 dias em 2024. O histórico mostra que restrições digitais se intensificam nos meses próximos a eleições. Este protocolo garante que o lawfare-timeline opere de forma totalmente autônoma — sem IA, sem Vercel, sem qualquer plataforma centralizada — se necessário.
Protocolo de operação autônoma
01
Até julho/2026 — Preparação
Completar GitHub Mirror e IPFS. Arquivar 100% das fontes. Completar o relatório em inglês e distribuir para lista de contatos internacionais. Estabelecer canal Signal com 3+ colaboradores fora do Brasil.
02
Agosto/2026 — Congelamento de conteúdo sensível
Publicar snapshot completo em IPFS antes do período mais crítico. Distribuir o CID para contatos internacionais. A partir desse ponto, qualquer bloqueio do domínio principal não afeta o conteúdo já distribuído.
03
Set–Out/2026 — Operação sem IA
Se IAs forem restritas: o JSON é autocontido e não depende de IA para ser lido ou analisado. Scripts Python de análise devem ser documentados e testados antecipadamente. Novos eventos registrados manualmente usando o schema existente.
04
Canais alternativos de publicação
Se Vercel + GitHub bloqueados: IPFS via Brave Browser (gateway embutido), Tor Browser (acesso à rede IPFS via .onion), contatos internacionais com cópia do repositório hospedando espelhos.
Lista de contatos internacionais — estrutura recomendada
contacts.encrypted — estrutura (manter localmente, nunca publicar)
# Arquivo local criptografado com VeraCrypt # Nunca commitar, nunca enviar por email, nunca no GitHub JORNALISTAS_INTERNACIONAIS: - The Economist Brazil correspondent: [contact via Signal] - Financial Times LatAm: [contact via ProtonMail] - Reuters Brasília bureau: [contact via Signal] ORGANIZACOES_DIREITOS: - Committee to Protect Journalists (CPJ): cpj.org/emergency - Reporters Without Borders (RSF): rsf.org/en/emergency-assistance - Freedom of the Press Foundation: freedom.press DIPLOMATICOS: - US Embassy press officer: [contact público + canal seguro] - EU delegation Brazil: [contact público] ESPELHOS_EXTERNOS: - Colaborador A (Europa): tem cópia do repo, pode hospedar - Colaborador B (EUA): tem cópia do repo, pode hospedar
Checklist de emergência — se o domínio for bloqueado
Resposta imediata em caso de bloqueio
## T+0 (bloqueio identificado) □ Verificar se GitHub Pages ainda está acessível □ Verificar se IPFS CID está acessível via ipfs.io □ Notificar contatos internacionais via Signal com CID atual ## T+1h □ Publicar nota em conta de colaborador fora do Brasil □ Enviar ProtonMail para lista de jornalistas internacionais □ Acionar CPJ/RSF se parecer bloqueio por perseguição política ## T+24h □ Solicitar espelho a colaboradores externos □ Notificar OAB (Comissão de Liberdade de Imprensa) □ Documentar o bloqueio como entrada JSON no projeto ## Domínios alternativos pré-registrados (recomendado) # Registrar antes do período eleitoral: lawfare-timeline.netlify.app # espelho Netlify lawfare-timeline.pages.dev # Cloudflare Pages lawfare-timeline.onrender.com # Render.com
Checklist interativo — clique para marcar
Esta semana
Criar repositório GitHub público lawfare-timeline
git init + git remote add origin + primeiro push. Habilitar GitHub Pages nas configurações do repositório.
Agora
Configurar GitHub Action de deploy automático
Criar .github/workflows/deploy.yml conforme template da aba GitHub Mirror. Testar com push de teste.
Agora
Criar conta no Pinata.cloud
Plano gratuito até 1GB. Fazer primeiro upload do _data/ JSON completo. Registrar o CID em ipfs-manifesto.txt.
Agora
Ativar 2FA no GitHub, Vercel e Pinata
Autenticação em dois fatores em todas as plataformas do projeto. Usar app autenticador (não SMS).
Agora
Arquivar fontes dos novos artefatos (IDs 146–152)
Para cada URL nas entradas 146–152 da Sem Desconto: archive.org/save/[URL]. Adicionar URLs arquivadas no campo fontes_arquivadas.
Agora
Esta semana
Executar script archive_sources.py para backlog
Rodar o script Python da aba Archive.org para arquivar todas as fontes de entradas existentes que ainda não têm URL arquivada.
Semana
Gerar checksums.txt do _data/ completo
find ./_data -name "*.json" | sort | xargs sha256sum > checksums_$(date +%Y%m%d).txt — Commitar no repositório.
Semana
Instalar Signal e criar grupo com colaboradores confiáveis
Para coordenação em caso de bloqueio. Mínimo 2 pessoas fora do Brasil com cópia do repositório.
Semana
Distribuir Brazil Democratic Erosion Report 2026 para imprensa internacional
Enviar para pelo menos 5 jornalistas/bureaux internacionais via ProtonMail com o relatório em inglês e links para fontes primárias.
Semana
Próximo mês
Configurar backup automático semanal via GitHub Action
Criar .github/workflows/backup.yml para gerar checksums automaticamente toda domingo.
Mês
Registrar domínios alternativos (Netlify, Cloudflare Pages)
Configurar espelhos secundários em plataformas diferentes do Vercel. Custos mínimos ou gratuitos.
Mês
Testar cenário de bloqueio completo
Simular: Vercel bloqueado. Verificar se GitHub Pages, IPFS e espelhos funcionam. Documentar tempo de resposta e gaps.
Mês
Criar VeraCrypt container para documentos primários offline
Container criptografado com cópias dos PDFs críticos (Vaza Toga, Arquivos 8/Jan, parecer PGR). Backup em HD externo fora do local de trabalho.
Mês
Antes de outubro/2026 — crítico
Snapshot IPFS completo e distribuído
Upload completo do site em IPFS com pin em Pinata. CID distribuído para pelo menos 3 contatos internacionais. Mesmo com bloqueio total no Brasil, o conteúdo permanece acessível globalmente.
Crítico
Scripts de análise JSON documentados e testados sem IA
Python scripts para: análise de padrões, geração de relatórios, busca por ator/operação — funcionando sem dependência de Claude ou qualquer IA externa.
Crítico
Lista de contatos internacionais completa e testada
Pelo menos 10 contatos verificados: jornalistas internacionais, ONGs de direitos, colaboradores com espelhos. Comunicação testada via Signal/ProtonMail.
Crítico
Brazil Democratic Erosion Report atualizado para véspera da eleição
Versão final do relatório em inglês com dados até setembro/2026. Distribuído proativamente antes do período de maior risco.
Crítico
desenvolvido por @artesdosul