Project Switcher
Decisão pronta
ADR-001 / Alt-Tab para macOS, reconstruído do zero

Velocidade percebida é arquitetura, não linguagem.

Um switcher de janelas que abre com estado pronto, mostra cache no primeiro frame e nunca espera o WindowServer para parecer instantâneo.

Explorar arquitetura Sem cronogramas. Gates mensuráveis.
⌥ TAB 4 janelas · MRU
Cache-first · nenhum IPC no summonfirst frame ready

Decisão executiva

Menos camadas. Mais controle.

O custo dominante mora no macOS: WindowServer, Accessibility, captura, layout e foco. Uma segunda linguagem não remove nenhum deles.

Stack

Swift 6 + AppKit

Core Animation no overlay. SwiftUI restrito a Settings e onboarding.

Princípio

Cache first

O painel aparece com um snapshot pronto. Atualização e reconciliação vêm depois.

Canal

Developer ID

Notarizado, sem App Sandbox, agente residente e menu bar opcional.

StackCaminho nativoCamadas extrasVeredito
Swift + AppKitSELECTED
DiretoNenhumaConstruir
Swift + RustSwift ainda obrigatórioFFI + ownershipSó se profiling provar
Rust + objc2Bindings Objective-CUnsafe + lifecycleNão no v1
Tauri 2Rust → bridge → WKWebViewWebView + IPCDescartar
zero-native / ElectrobunZig/ObjC → bridgeWebView/BunDescartar

System design

O primeiro frame não negocia.

Alterne o backend para enxergar onde fidelidade extra adiciona risco.

HOT PATH / MAIN ACTORNO BLOCKING IPC
SUMMON TIMELINE

Abertura em duas verdades

verdade visual primeiro · verdade reconciliada depois
0 msHotkey
< 16 msPanel ordered
< 32 msCached frame
post-frameFresh previews

Performance contract

Não é “parece rápido”. É um gate.

Cada limite existe para impedir que features empurrem trabalho de volta para o primeiro frame.

NON-NEGOTIABLE

Nenhuma chamada AX, CGS/SLS ou ScreenCaptureKit pode acontecer sincronamente no summon.

Hotkey → painel ordenado
p95 < 16 ms
Hotkey → frame cacheado
p95 < 32 ms
Tecla → nova seleção
p95 < 8 ms
Preview fresco selecionado
p95 < 100 ms
CPU em idle
< 0,2%
Foco correto
≥ 99,9%
Instância ou painel duplicado
zero

Execution model

Avançar por evidência, não por calendário.

Cada etapa só libera a próxima quando seu comportamento é medido e aceito.

GATE 01

Contrato de medição

Fixar a linha de base antes de qualquer feature.

Construir

Harness com OSSignposter, hotkey e painel vazio.

Liberar quando

p50, p95 e p99 reproduzíveis em todos os cenários-base.

Failure design

Os bugs conhecidos viram limites arquiteturais.

RISK / CAPTURE STORM

Screenshot service wedged

Limite global real, coalescing, prioridade e watchdog. Nunca uma fila independente por janela.

RISK / DUPLICATE PROCESS

Dois overlays competindo

Lock adquirido no primeiro byte, IPC de handoff e uma única state machine de apresentação.

RISK / BLOCKING IPC

WindowServer no hot path

Snapshot pronto, chamadas off-main e reconciliação após o frame. Nunca esperar consistência total para abrir.

RISK / GHOST WINDOWS

Heurística silenciosa

Registry guarda fatos; discriminator aplica política com reason codes auditáveis e rescan por geração.

Final recommendation

Public baseline.
Private lab.

Swift 6 + AppKit, processo único, painel pré-criado, estado incremental, cache-first e APIs públicas. SkyLight fica isolado até benchmarks provarem que a fidelidade extra compensa a fragilidade.

macOS 26+Apple Silicon firstMenu bar opcionalNo App Sandbox
Architecture decision · 18 Jul 2026Sem estimativas de tempo · execução não iniciada