- TD#8 hybrid.ts: rerank_strategy {always|when_top_k_gt|never} + threshold
(default skips rerank for top_k ≤ 15; chat tool uses threshold 10)
- O11 vision.ts + tools.ts: analyze_image_region tool — sharp-crops the
bbox, claude CLI reads the temp PNG via Read tool, Sonnet vision answers
- TD#12 /graph: SigmaGraph replaces ForceGraphCanvas; react-force-graph-2d
uninstalled (-37 transitive deps); force-graph-canvas.tsx deleted
- TD#27 messages/route.ts gatherContext slice sizes via CTX_* env vars
- TD#22 tests/rag/: golden.yaml (15 queries) + run.py (Recall@k + MRR +
negative-pass rate) + baseline.json + CI job in .forgejo/workflows/ci.yml
- docs/adrs/: ADR-001..005 published from systems-atelier deliverables
Verified live on disclosure.top: top_k=5 path skips rerank (6.7s embed-only,
was 12-15s with rerank); rerank=always still available on demand.
First RAG baseline: Recall@5 = 0.2083, MRR = 0.25, Negative pass = 1.0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.3 KiB
4.3 KiB
| adr | title | status | date | deciders | project |
|---|---|---|---|---|---|
| ADR-005 | Self-hosted by default — managed SaaS exige excecao escrita; politica de excecoes vigentes | accepted | 2026-05-23 | sa-principal, sa-platform-lead | disclosure-bureau |
Context
O systems-atelier declara no manifest:
"Open-source e self-hosted em VPS por padrao. SaaS/managed exige excecao escrita e justificada."
O Disclosure Bureau implementa essa politica em maioria mas mantem dependencias externas que precisam ser explicitas para nao virarem dette tecnica oculta:
| Dependencia externa | Categoria | Justificativa |
|---|---|---|
| OpenRouter (chat sincrono) | LLM proxy | Tier free 0 USD; tool calling funciona; sem alternativa OSS local com mesma qualidade + multi-modelo |
| Anthropic Claude (vision + investigator) | LLM | Sonnet 4.6 vision para PDF + agente investigador. Sem OSS equivalente em qualidade vision. |
| Claude Code OAuth Max 20x | LLM (quota) | Quota gratis ja paga. Mesmo provider, canal alternativo. |
| Spacemail (SMTP) | Email transactional | Magic-link envio. SES self-host overkill para volume baixo. |
| Let's Encrypt (TLS) | PKI | Padrao da industria. CertResolver via Traefik. |
| war.gov source PDFs | Data source | E o corpus em si — nao auto-substituivel. |
| GitHub (deploy artifacts) | Code host | Pode migrar para Forgejo/Gitea self-host (Q3 2026 review). |
| Hetzner / similar VPS | IaaS | Infra fisica; nao se evita. |
E o que NAO entra (self-host adotado):
- Postgres (Supabase) — self-host.
- GoTrue, PostgREST, Realtime, Storage, Imgproxy, Studio, Kong — self-host.
- BGE-M3 + Reranker — self-host (embed-service).
- Meilisearch — self-host.
- Traefik — self-host.
- Sentry — decisao W1: avaliar Glitchtip self-host vs Sentry cloud free tier.
Decision
Politica formal:
- Default: self-host. Qualquer novo servico/dependencia comeca avaliando OSS self-hostable.
- Excecao escrita em ADR quando:
- Sem alternativa OSS com qualidade aceitavel (criterio claro), OU
- Custo de operar self-host > custo direto SaaS × 12 meses, OU
- Restricao legal/compliance especifica.
- Excecoes vigentes listadas na tabela acima. Cada uma precisa ser:
- Sem state critico do projeto (exemplo: dados podem ser exportados a qualquer momento; nao ha lock-in).
- Substituivel em <4 semanas de trabalho (plano de saida documentado).
- Excecoes proibidas:
- Gemini (politica especifica do projeto; ver
feedback-no-gemini-ever.mdmemoria). - Banco de dados managed (RDS, Supabase Cloud paid) — corpus precisa estar 100% sob controle.
- LLM gateway pagas alem de OpenRouter free tier sem ADR especifico.
- CDN com state (Vercel KV, Cloudflare D1) — viola "data soberania".
- Gemini (politica especifica do projeto; ver
- Periodicamente: revisar lista de excecoes (semestre). Revisar se equilibrio mudou (ex: Glitchtip amadureceu? Forgejo viavel?).
Consequences
Positivas:
- Soberania de dados sobre corpus desclassificado (motivo central do projeto).
- Custo recorrente baixo (~10 EUR/mes VPS + $0 OpenRouter free + $30-110/mes LLM agentic).
- Sem dependencia de business decisions de fornecedor (Vercel mudar tier, Supabase Cloud aumentar preco).
Negativas:
- Mais operacao (10 containers no VPS, monitorados manualmente).
- Atualizacoes de seguranca por nossa conta (Trivy em CI mitiga).
- Backup/DR e nosso problema (W5+ adicionar backup strategy).
Verification
docker-compose.ymllista todos os servicos do data plane self-host. Confirmado.- Lista de excecoes nesta ADR. Confirmar trimestralmente.
- Plano de saida documentado para cada excecao:
- OpenRouter -> Mistral.ai self-host (>= 70B local com GPU) em 2-4 semanas.
- Anthropic -> Llama local (BAIXA qualidade hoje; 2027+).
- Spacemail SMTP -> Postfix self-host em 1 dia.
- GitHub -> Forgejo self-host em 1 semana.
Future review triggers
- Volume de chat > 10k/dia: avaliar movido para Mistral/Groq self-host.
- Quota Anthropic Max 20x saturada constantemente: avaliar adicionar API key paid OU mover para local model.
- Sentry cloud free tier estoura: instalar Glitchtip imediatamente.
- Auditoria seguranca pediu zero-trust extra: provisionar VPS dedicado para investigator-runtime em rede separada.
References
systems-atelier/business.yaml(manifest do business)- Memoria do projeto:
feedback-no-gemini-ever.md,user-plan-max-20x.md infra/disclosure-stack/docker-compose.yml