Kruze Companion — paridade de capabilities
Fonte de verdade da paridade da camada Koder entre as variantes do sector
kruze. A surfaceextensioné variante canônica desdekruze-RFC-001(ratificada 2026-05-30) — entra automaticamente na matriz do/k-parity kruze. Implementação por ondas emproducts/horizontal/kruze/extension/backlog/. Release engineering bloqueia release de uma variante se a linha dela tiver ⚪/🟡 sem ticket associado.Escopo: só a camada Koder (ID, Kode, Observability, Pass, Capture). As features de motor de browser (abas, histórico, downloads, privacidade, hibernação…) são delegadas ao browser host nas variantes
ext-*— não entram nesta matriz (seriam 🔴-by-platform triviais).
Legenda
| Estado | Significado |
|---|---|
| 🟢 | implementado |
| ⚪ | falta implementar (viável) |
| 🟡 | parcial / com ressalva |
| 🔴 | impossível na plataforma (decisão registrada, não gap) |
kz-desktop/kz-mobile= Kruze Flutter (desktop / mobile).ext-*= surfaceextension, por engine:chromium(ChromeEdgeBrave),gecko(Firefox),safari.- As colunas
ext-*refletem o estado-alvo: como a extensão ainda nãoexiste, o viável é ⚪ (a implementar) e o inviável é 🔴. Pós-implementação, ⚪ → 🟢/🟡. O teto de viabilidade (até onde 🟢 é alcançável) está nas notas quando difere entre engines.
Matriz
| Capability | kz-desktop | kz-mobile | ext-chromium | ext-gecko | ext-safari | Nota (teto de viabilidade) |
|---|---|---|---|---|---|---|
| Koder ID — sign-in | 🟢 | 🟢 | 🟢⁵ | ⚪ | ⚪ | OAuth via identity/popup — 🟢 todos |
| Koder ID — profile/bookmark sync | 🟢 | 🟡¹ | ⚪ | ⚪ | ⚪ | bookmarks API; safari teto 🟡 |
| Kode — chat panel | 🟢 | 🟢 | 🟢⁵ | ⚪ | ⚪ | sidePanel/sidebar_action; safari teto 🟡 |
| Kode — streaming response | 🟢 | 🟢 | 🟢⁵ | ⚪ | ⚪ | SSE/fetch stream — 🟢 todos |
| Kode — chat history persist | 🟢 | 🟡¹ | 🟡⁶ | ⚪ | ⚪ | storage API — 🟢 todos |
| Kode — attachments | 🟢 | 🟡¹ | ⚪ | ⚪ | ⚪ | file input — 🟢 todos |
| Kode — MCP opera a página | 🟢 | 🟡¹ | ⚪² | ⚪² | 🔴 | tabs+scripting: teto 🟡 (sem controle do chrome do host); safari sem |
| Observability — structured logging | 🟢 | 🟢 | ⚪ | ⚪ | ⚪ | 🟢 todos |
| Observability — RUM (page-load/error) | 🟢 | 🟢 | 🟢⁵⁷ | ⚪ | ⚪ | window.onerror+PerformanceObserver — 🟢 todos |
| Observability — breadcrumbs | 🟢 | 🟡¹ | ⚪ | ⚪ | ⚪ | 🟢 todos |
| Observability — Debug Mode v2 (netWSstorage/sourcemap) | 🟢 | ⚪¹ | 🟡⁸ | ⚪² | 🔴 | chrome.debugger (CDP): teto 🟢 chromium, 🟡 gecko, safari sem CDP |
| Pass — autofill | 🟢 | 🟡¹ | 🟢⁸ | ⚪³ | ⚪ | base em pass/app/chromium-extension/; safari teto 🟡 |
| Pass — passkeys / WebAuthn | 🟢 | 🟡¹ | 🔴 | 🔴 | 🔴 | extensão não atua como provider WebAuthn — browser host controla |
| Pass — vault (OS keychain) | 🟢 | 🟢 | 🟡⁴ | 🟡⁴ | 🟡⁴ | OS keychain só via native-messaging host; senão storage cifrado |
| Capture — screenshot | 🟢 | 🟡¹ | ⚪² | ⚪² | 🔴 | captureVisibleTab ok; full-page teto 🟡 |
| Capture — record / screenshare | 🟢 | 🔴 | ⚪² | ⚪² | 🔴 | getDisplayMedia limitado em extensão; teto 🟡 |
| Hub — auto-update / install check | 🟢 | 🟡¹ | 🔴 | 🔴 | 🔴 | update da extensão é da loja (Web Store/AMO), não nosso |
Notas
- kz-mobile: baseline a partir dos tickets
148.x/151(done). Estadosmarcados 🟡⚪ aqui são snapshot inicial — o primeiro `k-parity kruze
após o scaffolding da surfaceextension` reconcilia a coluna mobile com o código real. - Teto < 🟢 por restrição de extensão: a WebExtension não tem o controle
do chrome do browser host que o CEF dá ao Kruze. Implementação atinge no máximo o estado da coluna "Nota".
- Pass autofill reaproveita
services/foundation/pass/app/chromium-extension/(já é WebExtension JS/TS) — ver RFC §5 (fronteira de reuso) e §9 D-open-1 (consolidação Companion ⊇ Pass).
- OS keychain: uma extensão pura não acessa o keychain do SO; exige um
native messaging host companheiro. Sem ele, o vault usa
storagelocal cifrado (teto 🟡). - ext-chromium Onda 1 (2026-05-30): implementado e verificado em
s.khost1.dev-linux-kvs— sign-in (#003), chat+streaming (#004), RUM (#005). 33 unit tests + panel-harness e2e (bundle real). O e2e que carrega a extensão (extension.spec.js) roda headed e está verde (5/5) —#012done: o bloqueio real era ícones faltando nodist/(Chrome recusa carregar extensão com ícone declarado ausente), não runner gráfico; corrigido viakicon. geckosafari herdam o mesmo código mas ainda não buildadostestados (⚪). - Chat history: a Onda 1 mantém o transcript só na sessão do painel
(objeto em memória); persistência cross-sessão em
chrome.storageestá pendente (teto 🟢, follow-up a abrir quando priorizado). - RUM main-world: captura isolated-world (erros de recurso, rejections,
web-vitals). Exceções de scripts main-world da página exigem o relay
world:"MAIN"—#013. Auth do ingest apm pendente do contrato (#001). - ext-chromium Onda 2 (2026-05-30): Pass autofill (
#006— reuse-as-code,detecção mútua, 17 tests) e Debug Mode v2 (
#007— fatia network+websocket viachrome.debugger, 8 tests) implementados e verificados em dev-linux-kvs (61 unit + panel-harness e2e). Debug fica 🟡 parcial: net/WS prontos; storage snapshot + sourcemap + viewer =#016. Pass picker multi-credencial + consolidação single-codebase =#015. Attach real dochrome.debugger/autofill ao vivo cobertos por#012.
Como esta matriz se mantém sozinha (RFC §7)
extensioné variante canônica do sectorkruze→ entra sozinha namatriz do
/k-parity kruze(mesmo motor do auditkruze#148)./k-parity+/k-manifestrodam no/k-housekeep(diário) e pré-release;cada ⚪/🟡 sem ticket vira ticket (decisão de design por feature).
- Paridade de contrato = erro de build: contratos OpenAPI no dono do
serviço → client TS em
@koder/sdk(engines/sdk/js; já tem agent-stream + kode-conversation + instrumentation) e client Dart emkoder_kit; campo/endpoint novo não consumido quebra o build dos dois lados (RFC §5 corolário + §8.1).