Oficina grega antiga com ferramentas, blueprints e forja

Infraestrutura

A oficina por trás
do Labirinto.

Temporal, Postgres, LLMs locais, coding agents e observabilidade — em um único host ou em escala.

Open source · Self-hosted · Multi-tenant

Visão da stack

Dezesseis serviços. Uma topologia.

Tudo orquestrado via Docker Compose num único host (MVP) ou escalando horizontalmente. Zero dependência cloud no caminho crítico — invariante do projeto.

Vista isométrica de um templo grego com múltiplas alas conectadas
flowchart TB
  IG["Ingress
FastAPI :8000"] --> TEMP DASH["Dashboard
Next.js :3002"] --> APIGW["API Gateway
tRPC :4000"] --> TEMP MCP["MCP Server
FastMCP :8765"] --> TEMP TEMP["Temporal :7233
UI :8088"] --> PG[("Postgres :5432
+ pgvector")] TEMP --> LWT[local_worktree] & DOC[docker] & SSH[ssh] & E2B["remote_sandbox
e2b"] LWT & DOC & SSH & E2B --> LMS["LMStudio :1234
gemma4-27b + nomic"] LWT & DOC & SSH & E2B --> CLD["Claude Code CLI
Sonnet · Haiku"] TEMP --> LF["Langfuse :3000"] TEMP --> OTEL["OTel · Tempo · Loki"] --> GRAF["Grafana :3001"] PG --> GRAF
PortaServiçoFunção
8000Ingress (FastAPI)POST /v1/ingress · idempotência por content_hash · transactional outbox
3002Dashboard (Next.js)Inbox kanban, gates, timeline, cost explorer, releases
4000API Gateway (tRPC)Auth, rate-limit, audit, espelha tools MCP
8765MCP Server (FastMCP)16 tools + 3 resources para Claude Code CLI humano
7233Temporal ServerWorkflow engine durável (gRPC)
8088Temporal UIInspeção de workflows, signals, history
5432Postgres + pgvectorEstado canônico · FSM · phase_events · embeddings
1234LMStudiogemma4-27b chat + nomic-embed-text-v1.5 (768-dim)
3000Langfuse WebTraces de LLM, scoring, datasets, eval
3001Grafana5 dashboards + alertas Alertmanager
4317/4318OTel CollectorgRPC/HTTP — agrega spans
3100LokiLogs estruturados por phase_event_id
3200TempoArmazenamento distribuído de traces
9090PrometheusTSDB métricas (15d retention)

Coração durável

Temporal.

Workflow engine self-hosted, persistido em Postgres. Cada uma das 11 fases é um child workflow durável.

Falha de processo, restart de worker, cluster reboot — o estado sobrevive. Replay determinístico para debug.

Signals para gates humanos (sem polling). Schedules para batches (MemorySync, DocGen, KnowledgeTree). Search attributes por ProjectID e ItemID para auditoria sob demanda.

Mecanismo de Antikythera com engrenagens de bronze interligadas

Estado canônico

Postgres é a fonte da verdade.

Nada em Redis. Nada em MongoDB. Nada perdido em cache volátil. Toda transição de estado, todo artefato, todo custo, toda memória semântica vive em uma única instância.

backlog_items

FSM canônica do item — status, content_hash, branch, commit_sha

phase_events

Audit trail invariante — toda transição de status persiste uma linha

artifacts

Plans, diffs, test_results, postmortems, deploy_logs versionados

agent_runs

Cada chamada LLM com prompt_hash, modelo efetivo, tokens, binding_role

cost_ledger

tokens_in, tokens_out, USD por run · pivot em dashboards

memory vector(768)

Embeddings pgvector · scope project · busca semântica + híbrida

gates

discovery_review, execution_gate, publication_gate, production_approval · SLA, decisão, reviewer

execution_environments

Por projeto — kind, config, commands, env_vars, env_secrets

agent_model_bindings

Mapa agente → modelo default + fallback chain · global e por projeto

Cérebros

Díptico alegórico com dois oráculos conectados — local e nuvem

Modelos LLM — local + premium.

Local em :1234/v1: gemma4-27b para chat estruturado · nomic-embed-text-v1.5 para embeddings 768-dim. Custo: zero.

Premium via Claude Code CLI: Haiku (fallback universal, $1/$5 por MTok) · Sonnet (execução em tasks L/XL, $3/$15 por MTok).

O LLMRouter resolve por agente em três camadas: override de projeto → binding default → fallback chain. Cada fallback grava agent_runs.binding_role='fallback'. Sem fallback silencioso. Custo entra como tie-breaker.

Mãos especializadas

Coding agents — quatro ferramentas.

Cada problema, sua ferramenta. O LLMRouter escolhe; o Temporal orquestra; o coding agent executa.

Quatro artesãos gregos cada um com sua ferramenta característica
AgenteStackQuando
Claude Code CLI claude --max-turns 200 --output-format stream-json --cwd <wt> · subprocess · MCPs por projeto via ~/.claude/projects/<slug>/settings.json code_executor em tasks L/XL
OpenHands SDK Python in-process · bash + filesystem · LLM aponta para LMStudio code_executor em S/M · qa_triage · deploy_agent
OpenCode CLI opencode run --format json --agent plan · modo plan = read-only planner · plan_critic · discovery_history · discovery_tech
Hermes Agent hermes chat --max-turns 30 · toolsets browser/web/file/search · skill browser-harness discovery_market · discovery_docs · discovery_state · doc_auditor

Ambientes por projeto

Quatro backends, quatro papéis.

Cada projeto declara execution_environments e mapeia quatro roles a backends. Multi-tenant desde o dia zero — zero acoplamento entre projetos.

Backends: local_worktree docker ssh remote_sandbox (e2b)

Roles: agent (onde o agente roda) · task_runner (executor de tarefas) · validator (suite de testes) · publisher (deploy)

Projetoagenttask_runnervalidatorpublisher
nexo (NestJS) local docker docker docker compose
reconvert (microserviços) local docker docker ssh / EC2
docgen (Python) local local local none

Sentinelas

Observabilidade em quatro camadas.

Um trace cruza todas. Trace LLM no Langfuse referencia o trace_id OTel, que aponta para o Activity Temporal, que persiste o phase_event_id em Postgres.

Quatro olhos-sentinela observando fluxos de dados distintos

Langfuse

localhost:3000

Prompts, respostas, tool calls, scoring assíncrono (5% sample), datasets para eval, prompt versioning. Cada agente abre uma trace por execução.

OTel + Tempo

collector :4317 · tempo :3200

Spans de Activities Temporal, queries Postgres, chamadas Executor. Correlação trace_id ↔ Temporal history ↔ Langfuse trace.

Loki

localhost:3100

Logs estruturados JSON. Busca por phase_event_id. Retenção hot 30d / cold 1y.

Prometheus + Grafana

prometheus :9090 · grafana :3001

Métricas (latência, queue depth, health). 5 dashboards: Item Timeline, Project Health, Cost Explorer, Agent Performance, Gates Inbox. Alertas Alertmanager: budget, gate expirado, validation loop, LMStudio down, queue backlog, Postgres p99.

Portas

Quatro interfaces.

Quatro formas de submeter, observar e operar o pipeline. Mesma fonte de verdade no Postgres por trás de todas.

Ícone Ingress: bandeja de bronze recebendo um pergaminho

Ingress

FastAPI · :8000

POST /v1/ingress com idempotência por content_hash em janela de 24h. Transactional outbox dispara o workflow Temporal.

Ícone Dashboard: tábua de pedra com gráfico em baixo-relevo

Dashboard

Next.js App Router · :3002

Inbox kanban, gate review, item timeline, cost explorer, releases. tRPC + TanStack Query + shadcn/ui.

Ícone API Gateway: portão de bronze com colunas e arco

API Gateway

Express + tRPC v11 · :4000

Auth (JWT/magic-link), rate-limit, audit log. Espelha as tools do MCP Server para integrações externas.

Ícone MCP Server: busto de autômato de bronze em perfil

MCP Server

FastMCP · :8765

16 tools + 3 resources para Claude Code CLI humano: aprovações de gate, submit, search semântica, refresh memory, cost summary.

Stack open.
Self-hosted.
Multi-tenant.

Mesma topologia roda no Mac do dev e em escala horizontal. Zero dependência cloud no caminho crítico.

← Voltar à visão executiva

dedalo.dev · dedalo.com.br