User problem
Coding, Writing, Meeting 등 반복하는 앱·창 배치를 이름 붙여 저장할 수 없다. 현재 Zap은 frontmost window에 즉시 action을 적용할 뿐 여러 application window의 identity, display와 normalized frame을 하나의 재사용 가능한 local preset으로 보존하지 않으며, title 같은 민감하고 불안정한 값을 저장하지 않는 privacy contract도 없다.
Product value
Coding, Writing, Meeting 등 반복하는 앱·창 배치를 명시적으로 저장한다. 사용자는 저장 전에 포함·제외·ambiguity 위험을 확인하고, window content나 title을 수집하지 않는 versioned local-only preset을 만든다.
Scope
- 사용자 지정 preset name과 R-34의 eligible window enumeration 결과를 받아 versioned local preset으로 저장한다.
- 각 stored window entry는 app bundle identifier, AX role/subrole, optional application-provided AXIdentifier, session window identity로 구성된 matching descriptor와 display information, normalized frame을 포함한다.
- Save preview에서 포함될 window, policy로 제외된 unsupported window, missing app 상태와 stable AXIdentifier가 없는 multi-window app의 future ambiguity 위험을 설명한다.
- duplicate preset name을 silently overwrite하지 않고 사용자가 이름 변경 또는 명시적 교체를 선택하기 전에는 저장하지 않는다.
- preset data는 Zap의 local storage에만 기록하고 network, account 또는 remote service로 전송하지 않는다.
Acceptance criteria
- preset name, window matching descriptor, display information, normalized frame을 저장한다.
- window title은 저장하지 않는다.
- stable AXIdentifier가 없는 multi-window app은 restore 시 ambiguous가 될 수 있음을 Save preview에서 알린다.
- preset schema version을 둔다.
- duplicate name, missing app, unsupported window를 설명한다.
- 모든 data는 local-only다.
- stored descriptor에는 app bundle identifier, AX role/subrole, optional application-provided AXIdentifier와 session window identity만 포함하며 R-34가 제외한 sheet/system dialog/비표준 window는 preset entry로 저장하지 않는다.
- window title, document title, file path, URL, window content, screenshot 또는 thumbnail이 serialized preset과 diagnostics에 포함되지 않는다.
- Save preview 승인 전에는 preset store를 변경하지 않고, validation 또는 persistence 실패 시 기존 preset과 새 candidate의 partial data가 남지 않는다.
- duplicate name은 actionable validation으로 표시되고 explicit replace 승인 없이 기존 preset을 덮어쓰지 않는다.
- 저장된 file/store를 다시 load하면 schema version, name, descriptor, display information과 normalized frame이 loss 없이 복원되며 unsupported future schema는 기존 preset store를 변경하지 않고 거부된다.
Dependencies
External prerequisites
- Save 시점의 macOS Accessibility authorization. 권한이 없으면 window를 추측하거나 빈 preset을 성공으로 저장하지 않고 authorization requirement를 설명한다.
Non-goals
- preset의 window를 실제로 이동하거나 global undo를 만드는 restore execution은 R-36의 범위다.
- display configuration association과 display change/wake automatic trigger는 R-37과 R-38의 범위다.
- cloud sync, account, sharing, collaboration, network storage 또는 cross-device merge를 제공하지 않는다.
- window title·document metadata·file path·URL·window content·screenshot을 수집하거나 저장하지 않는다.
- R-34의 ambiguous matching을 Save 시점의 title 또는 geometry heuristic으로 해결했다고 가장하지 않는다.
Evidence
- 현재 Accessibility contract는 frontmost window 한 개만 제공해 named multi-window preset을 capture할 수 없다:
AccessibilityWindowService.swift lines 68–72.
- Rectangle Pro의 공식 layouts page는 named/reusable window layout이라는 인접 product evidence다. Zap의 contract는 R-34 descriptor와 local-only privacy 경계로 제한된다: Rectangle Pro.
Milestone exit-gate impact
- workspace는 사용자가 명시적으로 Save/Restore한다. 이 Issue는 explicit Save, preview와 local persistence를 제공하며 explicit Restore는 R-36이 담당한다.
User problem
Coding, Writing, Meeting 등 반복하는 앱·창 배치를 이름 붙여 저장할 수 없다. 현재 Zap은 frontmost window에 즉시 action을 적용할 뿐 여러 application window의 identity, display와 normalized frame을 하나의 재사용 가능한 local preset으로 보존하지 않으며, title 같은 민감하고 불안정한 값을 저장하지 않는 privacy contract도 없다.
Product value
Coding, Writing, Meeting 등 반복하는 앱·창 배치를 명시적으로 저장한다. 사용자는 저장 전에 포함·제외·ambiguity 위험을 확인하고, window content나 title을 수집하지 않는 versioned local-only preset을 만든다.
Scope
Acceptance criteria
Dependencies
External prerequisites
Non-goals
Evidence
AccessibilityWindowService.swiftlines 68–72.Milestone exit-gate impact