Parent: #315
Follow-up novo de #4, fechada enquanto docs/ARCHITECTURE.md ainda descreve o gateway como próxima fatia.
Problema
O cliente beta expõe dependência direta de OpenRouter/model slug. Isso impede identidade única do produto, rotação de segredo sem release, entitlement central, budgets, observabilidade coerente e isolamento de provider.
Objetivo
Fazer o Code falar apenas com endpoints Simplicio, preservando streaming, tool calls, cancelamento, backpressure e receipts, sem revelar provider/credencial upstream.
Ownership
- Gateway: roteamento, segredo, rate limit, circuit breaker e auditoria.
- Code: UX/stream/cancel e contrato público Simplicio.
- Runtime: execução de tools/effects.
- Agent: raciocínio/coordinator; não recebe segredo upstream.
Caminho mais rápido
- Implementar endpoint Responses mínimo compatível com fluxo atual.
- Usar mock upstream e golden streams.
- Trocar uma única camada de provider no Code.
- Colocar atrás de feature flag com rollback temporário controlado.
- Remover cliente direto após E2E staging.
Passo a passo
- Congelar
GET /v1/code/models, POST /v1/code/responses e usage/limits.
- Definir envelopes de erro estáveis, request id, idempotency e causal ids.
- Implementar SSE/streaming com cancelamento e backpressure.
- Suportar tool-call deltas sem executar tools no gateway.
- Resolver upstream secret somente no servidor.
- Mapear nome público Simplicio-1 para rota interna.
- Aplicar auth/entitlement, budgets, rate limit e tenant isolation.
- Implementar timeout e retry apenas antes de efeito/stream observável.
- Adicionar circuit breaker e fallback controlado por policy.
- Redigir prompts/código/respostas dos logs por padrão.
- Publicar OpenAPI e golden fixtures.
- Integrar cliente Code nas três superfícies.
- Fazer network capture provar zero hostname upstream.
- Rodar staging E2E incluindo cancel e tool.
- Remover config/SDK OpenRouter do modo produtivo e atualizar docs.
Testes obrigatórios
- stream normal/parcial/malformado;
- cancel antes/depois do primeiro token;
- tool calls fragmentadas;
- 401/403/429/5xx/timeout;
- retry e duplicate request;
- circuit open/half-open;
- tenant A/B;
- orçamento esgotado;
- provider fallback;
- header injection/SSRF;
- redaction;
- TUI/headless/ACP parity.
Evidência para fechar
OpenAPI, fixtures, network capture, load/security tests, staging receipts, métricas de stream/cancel e scan do binário/config.
Execução
- Implementar o objetivo descrito.
- Fazer a implantação aplicável.
- Executar e registrar os testes.
Parent: #315
Follow-up novo de #4, fechada enquanto
docs/ARCHITECTURE.mdainda descreve o gateway como próxima fatia.Problema
O cliente beta expõe dependência direta de OpenRouter/model slug. Isso impede identidade única do produto, rotação de segredo sem release, entitlement central, budgets, observabilidade coerente e isolamento de provider.
Objetivo
Fazer o Code falar apenas com endpoints Simplicio, preservando streaming, tool calls, cancelamento, backpressure e receipts, sem revelar provider/credencial upstream.
Ownership
Caminho mais rápido
Passo a passo
GET /v1/code/models,POST /v1/code/responsese usage/limits.Testes obrigatórios
Evidência para fechar
OpenAPI, fixtures, network capture, load/security tests, staging receipts, métricas de stream/cancel e scan do binário/config.
Execução