src/switcher/state/WindowAdmissionResolverSpecs.md
AltTab offers switch destinations, not every rectangle WindowServer paints. PhysicalSurface owns existence,
geometry, level and parentage. SemanticSurface owns AX meaning. SwitchDestinationDecision joins them without
giving either source universal authority.
kAXMain. Above that level an app puts its HUDs, panels
and overlays, and no subrole distinguishes them: Chromium describes ChatGPT's dictation strip as a titled
AXDialog and its sidebar as AXStandardWindow, the same subroles every ordinary AppKit window carries.
The gate binds exact attention too, because an app key-focuses its own HUD through kAXFocusedWindow
exactly as a real window does, so gating only discovery would delay the surface by one focus event.kAXMain; that does not
turn the panel into a switch destination.kAXMain is a destination.AXStandardWindow is a destination. A titled AXDialog is a destination; an untitled one remains latent.100×50 is substantial. Native AppKit tabs are logical destinations handled by TabGroupResolver; WindowServer
parentage intentionally says nothing about them because both active and background native tabs report parent zero.
Window admission and application admission use the same evidence without conflating their permissions. Ordinary discovery still excludes XPC processes unless they are an established user-facing exception. Exact attention may admit the process which owns that destination; zombie status always rejects it. Owning an exact destination does not grant speculative placeholders: only regular apps get one. An accessory or prohibited process that briefly took focus (Raycast's palette, CoreServicesUIAgent's Gatekeeper alert) is not an app the user can switch back to.