stack-RFC-020 — Operator Plane, Apex Root e o Kode Agent Service
Estabelece a fundação arquitetural para o objetivo "Kode como cockpit operador": o owner conversa com o Kode (a IA da Koder) por surfaces ricas (Kode app primário; Koder Chat/Talk secundárias) e executa trabalho de ponta a ponta na Koder Stack (conectores, CI/deploy/DNS, releases, relatórios), substituindo a dependência do notebook. Define (1) o modelo de DOIS PLANOS — operador (toca dev+infra) × tenant (usa produtos) — com parede entre eles; (2) o Kode Agent service único e surface-agnóstico (cérebro), com os planos como tiers e os apps como clientes finos; (3) o Apex Root (único principal-ápice do owner, peça nova); (4) dois invariantes de segurança (instrução×dados + enclave por plano). Não redesenha a multi-tenancy — adota id-RFC-017 (ratificada).
Status: Accepted — ratificado pelo owner (Rodrigo) em 2026-06-25. Origem: deliberação
/k-archde 2026-06-25 (transcrito nesta sessão). Veredicto-keystone e sub-decisões fundamentados emarchitecture-quality.kmd(D1D2D3D5D7D8D9D10D12) +stack-principles.kmd §2(Quality > Speed absoluto) +reuse-first.kmd(plumbing compartilhado × substância de produto).
1. Contexto e objetivo (north-star)
O owner quer deixar de depender do notebook para trabalhar com a IA, usando Kode como surface primária, com uma experiência que supere o notebook: mídia rica (arquivosáudiovídeoimagensemojis/stickers), voz live com escolha de timbre, conectores a todos os serviços da Koder Stack + GoogleMicrosoft GitHub/Apple, todos os repositórios do KVS, Kortex, CI, deploys, gestão de DNS (conta pessoal rodrigo@koder.dev + orgs onde é owner), correção de bugs, geração de releases, inventário de outros chats, acesso ao celular via Kiris, publicação de sites/landings, análises, relatórios e gráficos.
Esta RFC fixa a fundação que torna isso possível sem "bagunçar" a arquitetura da Stack e considerando expansão internacional / escala global desde o dia um.
1.1 Vocabulário fechado: "Kode"
Kode é a marca de IA da Koder, abrangendo três camadas — análogo de "Claude + Claude app" na Anthropic:
| Camada | Anthropic | Koder |
|---|---|---|
| A IA / o modelo | Claude | Kode (Koder AI) |
| O agente que executa | Claude (agente) | Kode (agente) |
| O app de conversa | Claude app | Kode (app) — services/ai/kode |
Isto resolve o item antes em aberto de "nomear o agente": o agente é o Kode.
2. Modelo de dois planos
A árvore de poderes da Stack tem dois planos ortogonais, com uma parede entre eles. Esta é a decisão estrutural central.
2.1 Plano Operador — quem constrói e opera a Stack (toca dev + infra)
- Apex Root — o owner, principal único e não-delegável (ver §4).
- Agentes de IA — o Kode-agente como service identity do plano operador.
- Devs contratados (futuro) — escopo por repo/componente no KVS.
- Infra ops contratados (futuro) — escopo de infraestrutura.
2.2 Plano Tenant — quem usa os produtos da Stack (isolado do plano operador)
É a multi-tenancy já ratificada em id-RFC-017 (Org → Workspace →
Project + RBAC + RLS). Esta RFC não a redesenha — adota. A empresa Koder é a org tenant #1 (dogfooding); seu pessoal de RHjurídicocontábil são membros tenant sem nenhum acesso a dev ou infra. Usuários e orgs públicas entram aqui.
2.3 Invariante da parede
Ter conta no plano tenant NUNCA concede acesso ao plano operador. O owner habita ambos os planos como principais distintos e transita por autenticação explícita, jamais por herança. Não há caminho de escalada do tenant para o operador.
O Momento 5 do rollout (§7) é a prova viva desta parede: um funcionário do RH, promovido dentro da org-empresa, estruturalmente não alcança a infra.
3. O Kode Agent service (cérebro único, surface-agnóstico)
Veredicto-keystone (/k-arch 2026-06-25 — opção b): o cérebro agêntico é extraído num serviço único surface-agnóstico — o Kode Agent service, generalização do koder-root-bot (krb) — e todas as surfaces são clientes finos sobre um contrato explícito.
Emenda 2026-06-27 — placement resolvido (kode#055): o "Kode Agent service" não é greenfield — é o
services/ai/agentsjá existente, o *runtime de agente canônico* da Stack, formalizado emservices/ai/agents/docs/RFC-001-engine-of-kode.kmd(Engine+Product; multi-tenant; REST/WS :7804; "no third agent runtime") e já em produção (LXCaiagents10.0.1.130). RFC-020 não cria serviço novo: adiciona o tier operador (root) sobre esse engine. A "generalização do krb" realiza-se como o krb virar cliente fino doservices/ai/agents(hoje roda claude/codex local), não como extração de um serviço novo. Liga-se à RFC-001 (§12).
┌─────────────────────────────┐
Kode app (PRIMÁRIA) │ │
Koder Chat ─────────┤ Kode Agent service │
Koder Talk ─────────┤ (cérebro, contrato único) ├── Kode Relay (roteamento
Telegram (bootstrap)│ ├ tier operador (root) │ multimodelo) ATRÁS
│ └ tier tenant (sandboxed) │
└──────────────┬──────────────┘
│ chokepoint de autorização (§5)
┌────────────┴────────────┐
conectores Koder Stack conectores externos
(KVS, CI, deploy, DNS, (Google/MS/GitHub/Apple)
Kortex, Kiris, …)3.1 Por que serviço, não motor embutido no app
Rejeitadas no /k-arch:
- (a) backend do Kode absorve o krb — funde substância de produto
(assistente de consumo) com plumbing crítico de root no mesmo codebase; viola a parede dos planos e piora D2D7D9. Rejeitada.
- (c) dois agentes distintos (Kode produto × krb cockpit) — dois runtimes,
conectores duplicados, drift, marca fragmentada; fere #1 (Meta First) e D10. Rejeitada.
A opção b vence porque o cérebro agêntico (Claude Code/multimodelo + toolset + conectores + tiers) é plumbing cross-surface com ≥3 consumidores → por reuse-first pertence a um serviço compartilhado, escrito uma vez. Ganha em D1/D2 (contrato + desacoplamento), D7 (root isolado num só enclave), D9 (surfaces descartáveistrocáveis), D10#1 (reuso). Trade-off aceito: mais integração agora (definir contrato + refatorar krb em serviço + ligar o Kode-app como cliente) em troca de um único cérebro hardenizado, multi-surface e reversível.
3.2 Tiers do serviço (mapeiam os dois planos)
- Tier operador (root) — linhagem do
koder-root-bot. Acesso root à Stack;único owner; exige elevação (§4, §5).
- Tier tenant (sandboxed) — linhagem do
koder_kode_bot. Sandbox por-tenant;jamais com credenciais operador. É o vetor de escala global (multi-tenant).
3.3 Topologia de surfaces
| Surface | Papel | Categoria | Por quê |
|---|---|---|---|
Kode app (services/ai/kode) |
PRIMÁRIA | AI-first (análogo Claude app) | Já em prod; multimodal, voz, code-exec, canvas/artifacts, repo-attach Flow, Computer Use. É a casa nativa da meta. |
Koder Chat (products/horizontal/chat) |
Secundária (alcance) | Slack/Teams | Server-sideauditável + framework de webhookbot; bom para ChatOps operador. |
Koder Talk (products/horizontal/talk) |
Secundária (alcance) | WhatsApp/Signal | E2E, vozvídeo; pessoalno corre. |
| Telegram (krb hoje) | Bootstrap | — | Mantido na transição; aposentável depois. |
Conectores e Apex Root vivem no serviço — adicionar um conector novo aparece em todas as surfaces sem release de app.
4. Apex Root
O único bloco genuinamente novo. Hoje a Stack tem system_admin (admin do control-plane dos tenants) e koder_admin (bypass de RLS no storage), mas nenhum é o ápice único provisionador. O root legado do Flow (id=1) está desativado. O Apex Root é definido como extensão de id-RFC-017/007, não como subsistema paralelo.
| Sub-decisão | Veredicto | Razão |
|---|---|---|
| A1 — agir-como × provisionar | Provisiona/gere por padrão. impersonate só como capability separada, explicitamente auditada, time-boxed e consentida — nunca silenciosa. |
D7 + auditoria limpa (ação de root jamais se disfarça de outro usuário). |
| A2 — auditoria + confirmação | Sim, absoluto. Log append-only à prova de adulteração de toda ação root + gate de confirmação humana em ações irreversíveis/alto-impacto. | D8 (observabilidade) + D9 (reversibilidade). Não-negociável. |
| A3 — conta separada × modo elevável | Principal de plano-operador distinto, acessado por elevação forte explícita. Sessão tenant tem zero capability operador; root exige re-auth com fator forte (passkey/hardware). | Parede dos planos (§2.3) — nenhuma sessão tenant pode escalar. |
| A4 — como o agente prova root | Token de capability curto, escopado e revogável, mintado quando o owner eleva. Cada conector/serviço autoriza contra o token, não contra "o agente". Agente nunca tem root ambiente. | Reusa OAuth scopesPATRLS-GUC existentes (D10). |
Provisionamento por root: como ápice, o owner-root pode criar e gerir contas em qualquer nó abaixo da árvore tenant (orgs, owners, membros, usuários) — incluindo criar a org-empresa Koder do Momento 5. O caminho inverso (tenant → operador) não existe.
5. Invariante de segurança 1 — o agente como portador de poder + injeção
No instante em que um agente carrega root e lê conteúdo não-confiável (emails, outros chats, arquivos, web, repos de terceiros), cria-se a maior superfície de ataque da Stack. Mitigação obrigatória: um chokepoint de autorização único entre o agente e todo conector, dentro do Kode Agent service, que enforça de forma uniforme:
- Proveniência (instrução × dados). Só o *anal de comando autenticado do
owner vira instrução. Todo conteúdo lido do mundo é dado inerte*— nunca pode escalar a comando. (Generaliza o padrão instrução(DM)×dados(histórico) do krb.)
- Gates de confirmação em ações irreversíveis/alto-impacto, mesmo em root.
- Elevação escopada/temporária (de A3/A4) — root nunca é ambiente.
- Auditoria + reversibilidade — log append-only; preferir operações
reversíveis + checkpoint/snapshot.
Mecanismo recomendado: expressar essas regras de gate de forma declarativa em Kanon (
stack-RFC-015, motor já entregue), num chokepoint único, em vez de checks ad-hoc por conector (Meta First + D7). Liga-se ao Governance Plane (stack-RFC-016).
6. Invariante de segurança 2 — onde o cérebro roda (E2E × IA)
Enclave dedicado e hardenizado por plano.
- Cérebro operador (root) roda num enclave isolado (modelo do LXC do krb
hoje em
s.khost1), egress restrito, sem co-tenancy com infra que serve tenants. É a joia da coroa (detém o caminho de elevação + credenciais de conector). Aplicastack-RFC-009(mTLS interno) esecurity.kmd.- *opologia do tier root (emenda 2026-06-27, kode#055 — decisão
/k-go, opção(ii)): como o
services/ai/agentsé multi-tenant, o cérebro operador não co-habita a instância tenant — roda como deployment separado e hardenizado do mesmo binárioservices/ai/agents*num enclave dedicado (modelo do LXC do krb), egress restrito, sem co-tenancy; o multi-tenant tenant roda noutra instância. Fiel a este §6 (vs (i) tier meramente lógico na mesma instância, rejeitado por co-tenancy).
- *opologia do tier root (emenda 2026-06-27, kode#055 — decisão
- Cérebro tenant (sandboxed) roda em sandboxes por-tenant, jamais com
credenciais operador.
- E2E: no Talk a IA é necessariamente endpoint de texto-claro (precisa
decifrar para agir). Portanto trabalho privilegiado/auditável é roteado para Kode app / Koder Chat (server-side, auditável), não para o Talk; no Talk só interação pessoal não-privilegiada, e o host-como-ponto-de-decifração herda o mesmo hardening de enclave.
7. Rollout — os 9 Momentos
| Momento | Descrição | Plano |
|---|---|---|
| 0 | Ideia, domínio comprado | — |
| 1 | Desenvolvimento da Stack | Operador |
| 2 | Desenvolvimento colaborativo (owner + Kode + outras IAs) | Operador |
| 3 | Contratar devs (ajudam partes da Stack) | Operador (escopo repo/componente) |
| 4 | Contratar infra ops (contratarexpandirmonitorar infra) | Operador (escopo infra) |
| 5 | Empresa Koder vira org tenant (RHjurídicocontábilburocracia usam os produtos; *ero acesso a devinfra* | Tenant (dogfooding) |
| 6 | Contas individuais por convite | Tenant |
| 7 | Contas individuais abertas (sem convite) | Tenant |
| 8 | Contas org por convite | Tenant |
| 9 | Contas org abertas (sem convite) | Tenant |
Momentos 0–4 constroem o plano operador; 5 dogfooda o tenant; 6–9 abrem o tenant progressivamente (a expansão internacional roda nos trilhos de id-RFC-017, que já é multi-tenant/hyperscale por design).
8. Marcos de implementação
| Marco | Entrega | Gate |
|---|---|---|
| M0 | Esta RFC ratificada (operador + apex root + Kode Agent service + 2 invariantes) | — |
| M1 | Beachhead: subir o Kode Agent service (krb generalizado, contrato único) + ligar o Kode app como primeiro cliente fino, no tier root (texto) | M0 |
| M2 | Mídia rica + TTS (respostas em voz) | M1 |
| M3 | Live + escolha de voz (forte no Koder Talk: WebRTC/voz) | M2 |
| M4 | Conectores da Stack (KVS, CI, deploy, DNS p/ rodrigo@koder.dev + orgs, Kortex, Kiris) — plugam no chokepoint (§5) | M1 |
| M5 | Conectores externos (GoogleMSGitHub/Apple via OAuth) — já multi-tenant-ready | M4 |
| M6 | GenUIrelatóriosgráficos (Kode já tem canvas/artifacts) + inventário de chats | M1 |
| M7 | Produto/escala global: generaliza tier root → tier produto (multi-tenant, multi-org, en-US) | M5 |
9. Non-goals
- Não redesenha a multi-tenancy (adota id-RFC-017).
- Não cria um app Koder novo (Kode app já existe; Chat/Talk já existem).
- Não define o modelo de negócio/billing do tier produto (Momento 6+).
- Não decide a UX de multi-IA (várias IAs como participantes) — o backend já
é multimodelo; a UX fica para depois.
10. Reversibilidade e migração (D9)
- Surfaces são clientes finos sobre um contrato → trocáveis sem reescrever o
cérebro. Porta de mão dupla.
- O
koder-root-botem Telegram permanece operante durante a transição; ocontrato do serviço é versionado.
- Apex Root é extensão aditiva de id-RFC-017/007 (não quebra o modelo tenant).
11. Itens estacionados (não bloqueiam)
- KPC ("Kode Personal Computer") — em andamento; relacionar ao cockpit.
- Agent Console (Kli) — avaliar como manifestação-produto do tier tenant no
Momento 6+, para a versão pública não nascer paralela.
- Multi-IA — UX deferida.
12. Relação com RFCs existentes
- id-RFC-017 (tenancy hierarchy, Accepted) — base do plano tenant.
- id-RFC-007 (admin service/CLI) + id-RFC-016 (RLS) — Apex Root estende.
- stack-RFC-007 (credential ownership / BYO keys) — conectores externos.
- stack-RFC-009 (mTLS interno) — hardening do enclave.
- stack-RFC-015 (Kanon) — chokepoint declarativo de autorização.
- stack-RFC-016 (Governance Plane) — onde os gates se inserem.
services/ai/agentsRFC-001-engine-of-kode (proposed) — *efine o serviço desteRFC* ai/agents é o runtime canônico ("engine of Kode"); RFC-020 é a mesma decisão pelo ângulo dos planos (adiciona tier root + invariantes de segurança). A RFC-001 deve subir a
acceptedalinhada ao modelo de tiers (kode#055).
13. Ratificação
Ratificado pelo owner em 2026-06-25. Sub-decisões a confirmar na ratificação: o veredicto-keystone (b, §3) e as quatro de Apex Root (A1–A4, §4). Ao ratificar, mudar status: draft → accepted com data e assinatura do owner, e abrir os tickets de M1 no backlog do Kode Agent service.