User problem
한 앱의 여러 창을 쓰는 사용자는 Zap으로 앱을 연 뒤 별도 shortcut으로 원하는 창을 다시 찾아야 한다. 현재 app launcher는 실행 중인 앱을 activate할 뿐이고 AX service는 frontmost window 하나만 노출하므로, repeated app shortcut을 같은 앱의 일반 창 사이를 순환하는 안전한 동작으로 연결할 기반이 없다.
Product value
브라우저, 터미널, Finder 등 같은 앱의 여러 창을 별도 단축키 없이 순환한다. 다만 첫 버전의 product contract는 R-31의 Finder 예외를 그대로 보존하므로 실제 Cycle Windows 적용 대상은 eligible non-Finder app이며, AX를 신뢰할 수 없는 모든 경우에는 기존 activation/reopen 동작으로 안전하게 돌아간다.
Scope
- R-31의
When the target app is already frontmost option에 Cycle Windows를 추가한다.
- eligible non-Finder app의 일반 top-level window만 current Space에서 열거하고 예측 가능한 MRU 순서를 유지해 repeated shortcut마다 다음 window에 focus를 이동한다.
- R-06의 window-scoped session identity를 사용해 서로 다른 window를 구분하고 닫히거나 재생성된 window를 다른 window로 오인하지 않는다.
- Accessibility 권한 부재, window enumeration/read/focus 실패, eligible window 부재, 안정적으로 고를 수 없는 상태에서는 cycle 시도를 중단하고 R-31 이전의 기존 app activation 동작으로 fallback한다.
- Finder는 R-31이 정한 repeated-action exclusion을 상속해
Cycle Windows 선택과 무관하게 기존 reopen behavior를 사용한다.
Acceptance criteria
- repeated action option에
Cycle Windows를 추가한다.
- 일반 top-level window만 예측 가능한 MRU 순서로 순환한다.
- sheet와 system dialog를 제외한다.
- 첫 버전은 current Space의 window부터 지원한다.
- Accessibility가 없거나 조회가 실패하면 기존 activate 동작으로 fallback한다.
- Screen Recording 권한을 요구하지 않는다.
- 같은 eligible app window가 둘 이상이면 repeated shortcut마다 current MRU position의 다음 window를 focus하고, 마지막 window 다음에는 첫 window로 순환한다.
- window가 닫히거나 새로 생기면 다음 입력 시 현재 eligible set과 MRU를 다시 평가하며 stale session identity를 다른 window에 적용하지 않는다.
- Accessibility가 미승인, AX enumeration 실패, AX focus 실패, eligible window 0개, 또는 안전한 next window를 결정할 수 없는 경우 사용자 window/history를 변경하지 않고 기존 app activation을 정확히 한 번 수행한다.
- Finder shortcut은
Cycle Windows가 선택되어 있어도 AX cycle 경로에 들어가지 않고 R-31의 기존 Finder reopen behavior를 유지한다.
Activate only와 Hide app 선택의 R-31 behavior는 이 option 추가로 바뀌지 않는다.
Dependencies
External prerequisites
- Zap에 대한 macOS Accessibility authorization. 미승인 또는 실행 중 revoke는 기능 실패가 아니라 기존 activate 동작으로 fallback하는 조건이다.
Non-goals
- Finder는 R-31 repeated-action policy에서 제외되므로 첫 버전의 Finder window cycling을 구현하지 않는다.
- 다른 Space의 window, minimized window 복구 정책, sheet, system dialog, 비표준 window까지 cycle 범위를 확장하지 않는다.
- Screen Recording permission, window thumbnail, switcher overlay 또는 AltTab 수준의 window switcher UI를 추가하지 않는다.
- R-06의 transactional per-window undo/redo semantics를 변경하거나 cycle focus 자체를 window-move history에 기록하지 않는다.
Evidence
- 현재 app launcher는 실행 중인 앱을 찾으면 activate만 수행하고 same-app window를 열거하거나 focus하지 않는다:
AppLauncher.swift lines 36–49.
- 현재 Accessibility contract는 frontmost window의 조회·frame read·frame write만 제공해 same-app window enumeration이 없다:
AccessibilityWindowService.swift lines 68–72.
- AltTab의 공식 product page는 macOS window enumeration/switching의 인접 product evidence이며, 이 Issue는 overlay·thumbnail 없이 repeated shortcut의 bounded current-Space cycle만 다룬다: AltTab.
Milestone exit-gate impact
- 앱 shortcut 반복으로 현재 앱을 숨기거나 같은 앱의 원하는 창까지 이동할 수 있다. 이 Issue는 R-31이 제공한 opt-in repeated-action setting에 safe same-app window cycling을 완성한다.
- 기존 사용자 동작은 opt-in 전까지 바뀌지 않는다.
User problem
한 앱의 여러 창을 쓰는 사용자는 Zap으로 앱을 연 뒤 별도 shortcut으로 원하는 창을 다시 찾아야 한다. 현재 app launcher는 실행 중인 앱을 activate할 뿐이고 AX service는 frontmost window 하나만 노출하므로, repeated app shortcut을 같은 앱의 일반 창 사이를 순환하는 안전한 동작으로 연결할 기반이 없다.
Product value
브라우저, 터미널, Finder 등 같은 앱의 여러 창을 별도 단축키 없이 순환한다. 다만 첫 버전의 product contract는 R-31의 Finder 예외를 그대로 보존하므로 실제
Cycle Windows적용 대상은 eligible non-Finder app이며, AX를 신뢰할 수 없는 모든 경우에는 기존 activation/reopen 동작으로 안전하게 돌아간다.Scope
When the target app is already frontmostoption에Cycle Windows를 추가한다.Cycle Windows선택과 무관하게 기존 reopen behavior를 사용한다.Acceptance criteria
Cycle Windows를 추가한다.Cycle Windows가 선택되어 있어도 AX cycle 경로에 들어가지 않고 R-31의 기존 Finder reopen behavior를 유지한다.Activate only와Hide app선택의 R-31 behavior는 이 option 추가로 바뀌지 않는다.Dependencies
External prerequisites
Non-goals
Evidence
AppLauncher.swiftlines 36–49.AccessibilityWindowService.swiftlines 68–72.Milestone exit-gate impact