Kruze Companion — paridade de capabilities

Fonte de verdade da paridade da camada Koder entre as variantes do sector kruze. A surface extension é variante canônica desde kruze-RFC-001 (ratificada 2026-05-30) — entra automaticamente na matriz do /k-parity kruze. Implementação por ondas em products/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-* = surface extension, por engine: chromium (ChromeEdgeBrave),

    gecko (Firefox), safari.

  • As colunas ext-* refletem o estado-alvo: como a extensão ainda não

    existe, 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

  1. kz-mobile: baseline a partir dos tickets 148.x/151 (done). Estados

    marcados 🟡⚪ aqui são snapshot inicial — o primeiro `k-parity kruze após o scaffolding da surface extension` reconcilia a coluna mobile com o código real.

  2. 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".

  3. 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).

  4. OS keychain: uma extensão pura não acessa o keychain do SO; exige um

    native messaging host companheiro. Sem ele, o vault usa storage local cifrado (teto 🟡).

  5. 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)#012 done: o bloqueio real era ícones faltando no dist/ (Chrome recusa carregar extensão com ícone declarado ausente), não runner gráfico; corrigido via kicon. geckosafari herdam o mesmo código mas ainda não buildadostestados (⚪).

  6. 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.storage está pendente (teto 🟢, follow-up a abrir quando priorizado).

  7. 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).

  8. 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 via chrome.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 do chrome.debugger/autofill ao vivo cobertos por #012.

Como esta matriz se mantém sozinha (RFC §7)

  1. extension é variante canônica do sector kruze → entra sozinha na

    matriz do /k-parity kruze (mesmo motor do audit kruze#148).

  2. /k-parity + /k-manifest rodam no /k-housekeep (diário) e pré-release;

    cada ⚪/🟡 sem ticket vira ticket (decisão de design por feature).

  3. 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 em koder_kit; campo/endpoint novo não consumido quebra o build dos dois lados (RFC §5 corolário + §8.1).