- 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>
90 lines
4.3 KiB
Markdown
90 lines
4.3 KiB
Markdown
---
|
||
adr: ADR-005
|
||
title: Self-hosted by default — managed SaaS exige excecao escrita; politica de excecoes vigentes
|
||
status: accepted
|
||
date: 2026-05-23
|
||
deciders: sa-principal, sa-platform-lead
|
||
project: 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:**
|
||
|
||
1. **Default: self-host.** Qualquer novo servico/dependencia comeca avaliando OSS self-hostable.
|
||
2. **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.
|
||
3. **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).
|
||
4. **Excecoes proibidas:**
|
||
- **Gemini** (politica especifica do projeto; ver `feedback-no-gemini-ever.md` memoria).
|
||
- 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".
|
||
5. **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.yml` lista 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`
|