diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/README.md b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/README.md new file mode 100644 index 00000000..16b6f0b6 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/README.md @@ -0,0 +1,50 @@ +# P1-R1 Native 재검증 + +**결과: 기존 native matrix·lifecycle·OS 복귀 시나리오 PASS. 터치 영역은 코드 소유권·geometry 수준 복원 확인이며 실제 좌표 탭은 미검증이다.** + +## 최소 수정과 출처 + +- 제품 수정은 `MyPageView.swift`의 `UpdateBannerView`에 한정했다. 변경 전후의 배너 밖 prefix/suffix가 동일함을 검사했다. +- `.onChange(of: scenePhase)`가 전달한 새 phase를 `restartRollTimer(scenePhase:reduceMotion:)`에 직접 전달한다. 이전 closure의 캡처된 환경 값을 읽던 경로를 제거했다. +- Reduce Motion 콜백의 새 값도 같은 함수의 명시적 인자로 전달한다. Timer의 animation 선택은 이 인자를 사용한다. onAppear·items 변경을 포함한 재시작 호출 4곳을 모두 갱신했다. +- 좌우 24pt·상하 6pt padding을 Button label 내부의 `contentShape(Rectangle())` 앞으로 옮겼다. 값·색상·제목·화살표는 변경하지 않았다. 새 타입·DI·타이머 아키텍처는 추가하지 않았다. +- 제품 `MyPageView.swift` SHA-256: `7f8ac15573ab4c9fe01508431297e40d2e95a22ad37585859f03224475749d02`. 추출 배너 SHA-256: `69de63603118bafa25a2c8d711489d9e4389d3cd308937f86ad23c652702dc46`. + +[provenance.json](provenance.json)에 실제 제품 입력 해시, 배너 밖 동일성, RED 하네스 동일성, 대체한 의존성을 기록했다. 기존 `../native/` 전체 파일의 해시를 비교해 RED 증거가 변경되지 않았음을 확인했다. 부모 plan/review 문서는 수정하지 않았다. + +## 실행과 증거 + +기존 [RED 하네스](../native/source/Harness.swift)를 byte-for-byte 그대로 사용했다. 새 시나리오·타이머 복제·주기 단축·웹 대체물을 만들지 않았다. 실제 현재 배너와 helper/DTO/폰트/spacing/color를 재추출·컴파일했다. 전체 앱이 아닌 **native UIKit UIHostingController 하네스**다. + +환경은 iPhone SE3, iOS18.3 런타임, 375pt 폭, Xcode26/SDK26, Intel x86_64다. 모든 36 PNG는 새 배너 추출 이후에 실제 native surface에서 생성된 750×1334 이미지다. `matrix/` 27장, `lifecycle/` 6장은 native window `drawHierarchy`; OS 3장은 `simctl io screenshot`이다. + +| 검사 | 관측 결과·근거 | +|---|---| +| 0/1 | `matrix/zero.png` 미표시, `one-initial.png`와 6초 이후 `one-after-6s.png` 동일 | +| 2/3 순서·wrap | `two-first/second/wrap-first.png` 첫째→둘째→첫째, `three-first/second/third/wrap-first.png` 첫째→둘째→셋째→첫째. 실제 5초 Timer 유지 | +| 긴 한글·arrow-only | `long-korean-dark.png`, `long-korean-light.png`: 제목 ellipsis·화살표 비겹침. 두 PNG 모두 RED와 byte-for-byte 동일하여 정적 geometry/style 변화 없음 | +| inactive/active | `inactive-start.png`→`inactive-after-6s.png` 둘째 유지, `reactivated-before-5s.png` 둘째 유지, `reactivated-next.png` 셋째 진행. 기존 버그에 의존하던 기대값 C/C를 올바른 B/C로 변경했으며 하네스 자체는 변경하지 않음 | +| 별도 lifecycle | probe의 실제 inactive 확인 후 둘째가 6.007초간 동일. active 전달 4.394초 후에도 둘째, 7.203초 후 셋째. 기존 RED의 중지·재개 실패 해소 | +| OS background/복귀 | task-owned Settings 앱을 열어 willResignActive를 발생시키고 같은 앱 PID로 복귀해 didBecomeActive 확인. `os-resume-initial.png` 첫째→`os-resume-after-6s.png` 둘째 진행. 후자는 전환 중 프레임이며 매끄러움 측정은 아님 | +| unmount/remount·축소 | 6초 이상 배너 없음, remount 첫째→5초 전 첫째→이후 둘째. 3→1에서 첫째 초기화 및 고정, 0에서 숨김 | +| payload | 기존 `ActionCheck.swift`를 현재 실제 DTO/helper로 다시 컴파일해 실행. title·전체 HTML content·date 동일성 10건과 빈 상태 검사 PASS. 상태/추출 콜백 검사이며 GUI 탭 아님 | + +[verification.json](verification.json)은 19개 native PNG 동일/변경 비교, 36개 PNG 해시·signature·크기·신선도, 올바른 생명주기 기대값을 기록한다. PNG가 다르다는 사실만으로 제목을 판정하지 않았으며 위 제목·순서는 실제 화면을 읽어 확인했다. 정밀 5.000초 주기·애니메이션 성능·장시간 중복 타이머 부재를 보증하지 않는다. + +## 터치 영역과 한계 + +소스상 label은 전체 375pt 폭, 높이 36pt(내용 24 + 위아래 6)이며 좌우·상하 padding을 포함한 뒤 contentShape가 적용된다. 기존 RED의 내부 내용만 Button이던 327×24pt 영역에서 기존 배너 전체에 해당하는 label 소유권을 복원했다. 제목 폭 295pt와 화살표 위치·배너 크기는 정적 native PNG 동일성으로 확인했다. 44pt 높이로 확장하는 새 디자인 변경은 하지 않았다. + +**물리/좌표 탭·padding 가장자리 hit-testing은 미검증**이다. 기존 하네스의 UIKit 접근성 traversal은 여전히 actionable node를 반환하지 않으며 `accessibilityActivateResult=false`, `captureDelta=0`이다. 사용 가능한 좌표 탭 도구가 없어 추가 도구 탐색·설치 없이 중단했다. 실제 detail 화면 이동을 검증했다고 주장하지 않는다. + +Reduce Motion 런타임 설정 변경 경로는 미검증이며 새 값 전달·Timer animation 선택의 코드 경로만 확인했다. 전체 앱·로그인·서버·실기기·iOS16.6 런타임·Dynamic Type·다른 화면 폭·VoiceOver 포커스도 이 하네스 범위 밖이다. + +## 명령·진단·정리 + +- `bash work/tests/check-my-page-notices.sh`: exit 0, 실제 API/Repository/VM/DTO/roller 관련 PASS 4줄. [focused-check.log](focused-check.log). +- `xcrun swiftc -frontend -parse SodaLive/Sources/MyPage/MyPageView.swift`: exit 0. LSP 진단 도구는 제공되지 않아 실행하지 못했다. +- `xcrun --sdk iphonesimulator swiftc ... -target x86_64-apple-ios16.6-simulator ...`: 현재 배너 native 컴파일 exit 0. 전체 인자·launch·OS screenshot 명령은 [commands.json](commands.json). +- 새 simulator 최초 data migration이 3분 이상 걸려 준비 명령 제한시간에 도달했다. 컴파일은 성공한 상태였고 부팅 완료 후 같은 산출물을 `xcrun simctl install CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E "$QA_ROOT/NoticeNativeQA.app"`로 설치해 exit 0 확인했다. matrix·lifecycle은 각각 한 번만 실행했다. +- `$QA_ROOT=/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6` 아래로 `TMPDIR`, `NODE_COMPILE_CACHE`, `BUN_RUNTIME_TRANSPILER_CACHE_PATH`를 export했다. [cleanup.json](cleanup.json)은 소유 앱/Settings 종료, 전용 device 삭제, TMP root 삭제 및 제품/RED 해시 최종 확인 영수증이다. + +전체 앱 빌드·전체 회귀·최종 리뷰는 부모 작업에 남겼다. 서버 호출·커밋·공유 캐시 정리는 하지 않았다. diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/cleanup.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/cleanup.json new file mode 100644 index 00000000..a6a50891 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/cleanup.json @@ -0,0 +1,15 @@ +{ + "note": "First fix worker lost its service connection after retaining evidence. Fallback worker terminated the shared owned QA app and deleted its simulator; parent removed the first worker's remaining temporary root.", + "ownedSimulator": "CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E", + "simulatorDeletionReceipt": "rerun-154222/cleanup.json", + "parentReadback": { + "pgrepNoticeNativeQA": "no matching process", + "simctlBootedDevices": "none", + "originalFixTempRoot": "my-notice-native-fix.SxPOl6", + "originalFixTempRootAbsent": true, + "rerunTempRootAbsent": true, + "originalREDTempRootAbsent": true, + "parentTempRootAbsent": true, + "sharedXcodeCachesPreserved": true + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/commands.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/commands.json new file mode 100644 index 00000000..f2e4d72e --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/commands.json @@ -0,0 +1,100 @@ +[ + { + "command": "xcrun --sdk iphonesimulator --show-sdk-path", + "exit": 0, + "stdout": "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator26.0.sdk\n", + "stderr": "", + "unix": 1793168690.3460019 + }, + { + "command": "xcrun --sdk iphonesimulator swiftc -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator26.0.sdk -target x86_64-apple-ios16.6-simulator -module-cache-path /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/module-cache /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/source/ColorExtension.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/source/FontModifier.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/source/GetNoticeResponse.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/source/Harness.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/source/MyPageNoticeRoller.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/source/Spacing.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/source/UpdateBannerView.swift -o /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/NoticeNativeQA.app/NoticeNativeQA", + "exit": 0, + "stdout": "", + "stderr": "", + "unix": 1793168746.933467 + }, + { + "command": "xcrun simctl bootstatus CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E -b", + "exit": 0, + "stdout": "Monitoring boot status for NoticeQA-Fix-Owned-20261028 (CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E).\n[2026-10-28 06:25:48 +0000] Status=2, isTerminal=NO, Elapsed=01:53.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:38 seconds\n\n[2026-10-28 06:25:49 +0000] Status=2, isTerminal=NO, Elapsed=01:54.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:39 seconds\n\n[2026-10-28 06:25:50 +0000] Status=2, isTerminal=NO, Elapsed=01:55.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:40 seconds\n\n[2026-10-28 06:25:51 +0000] Status=2, isTerminal=NO, Elapsed=01:56.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:41 seconds\n\n[2026-10-28 06:25:52 +0000] Status=2, isTerminal=NO, Elapsed=01:57.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:42 seconds\n\n[2026-10-28 06:25:53 +0000] Status=2, isTerminal=NO, Elapsed=01:58.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:43 seconds\n\n[2026-10-28 06:25:54 +0000] Status=2, isTerminal=NO, Elapsed=01:59.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:44 seconds\n\n[2026-10-28 06:25:55 +0000] Status=2, isTerminal=NO, Elapsed=02:00.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:45 seconds\n\n[2026-10-28 06:25:56 +0000] Status=2, isTerminal=NO, Elapsed=02:01.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:46 seconds\n\n[2026-10-28 06:25:57 +0000] Status=2, isTerminal=NO, Elapsed=02:02.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:47 seconds\n\n[2026-10-28 06:25:58 +0000] Status=2, isTerminal=NO, Elapsed=02:03.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:48 seconds\n\n[2026-10-28 06:25:59 +0000] Status=2, isTerminal=NO, Elapsed=02:04.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:49 seconds\n\n[2026-10-28 06:26:00 +0000] Status=2, isTerminal=NO, Elapsed=02:05.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:50 seconds\n\n[2026-10-28 06:26:01 +0000] Status=2, isTerminal=NO, Elapsed=02:06.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:51 seconds\n\n[2026-10-28 06:26:02 +0000] Status=2, isTerminal=NO, Elapsed=02:07.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:52 seconds\n\n[2026-10-28 06:26:03 +0000] Status=2, isTerminal=NO, Elapsed=02:08.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:53 seconds\n\n[2026-10-28 06:26:04 +0000] Status=2, isTerminal=NO, Elapsed=02:09.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:54 seconds\n\n[2026-10-28 06:26:05 +0000] Status=2, isTerminal=NO, Elapsed=02:10.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:55 seconds\n\n[2026-10-28 06:26:06 +0000] Status=2, isTerminal=NO, Elapsed=02:11.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:56 seconds\n\n[2026-10-28 06:26:07 +0000] Status=2, isTerminal=NO, Elapsed=02:13.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:57 seconds\n\n[2026-10-28 06:26:08 +0000] Status=2, isTerminal=NO, Elapsed=02:13.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:58 seconds\n\n[2026-10-28 06:26:09 +0000] Status=2, isTerminal=NO, Elapsed=02:14.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:59 seconds\n\n[2026-10-28 06:26:10 +0000] Status=2, isTerminal=NO, Elapsed=02:15.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:00 seconds\n\n[2026-10-28 06:26:11 +0000] Status=2, isTerminal=NO, Elapsed=02:16.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:01 seconds\n\n[2026-10-28 06:26:12 +0000] Status=2, isTerminal=NO, Elapsed=02:17.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:02 seconds\n\n[2026-10-28 06:26:13 +0000] Status=2, isTerminal=NO, Elapsed=02:18.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:03 seconds\n\n[2026-10-28 06:26:14 +0000] Status=2, isTerminal=NO, Elapsed=02:19.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:04 seconds\n\n[2026-10-28 06:26:15 +0000] Status=2, isTerminal=NO, Elapsed=02:20.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:05 seconds\n\n[2026-10-28 06:26:16 +0000] Status=2, isTerminal=NO, Elapsed=02:21.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:06 seconds\n\n[2026-10-28 06:26:17 +0000] Status=2, isTerminal=NO, Elapsed=02:22.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:07 seconds\n\n[2026-10-28 06:26:18 +0000] Status=2, isTerminal=NO, Elapsed=02:23.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:08 seconds\n\n[2026-10-28 06:26:19 +0000] Status=2, isTerminal=NO, Elapsed=02:24.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:09 seconds\n\n[2026-10-28 06:26:20 +0000] Status=2, isTerminal=NO, Elapsed=02:25.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:10 seconds\n\n[2026-10-28 06:26:21 +0000] Status=2, isTerminal=NO, Elapsed=02:26.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:11 seconds\n\n[2026-10-28 06:26:22 +0000] Status=2, isTerminal=NO, Elapsed=02:27.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:12 seconds\n\n[2026-10-28 06:26:23 +0000] Status=2, isTerminal=NO, Elapsed=02:28.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:13 seconds\n\n[2026-10-28 06:26:24 +0000] Status=2, isTerminal=NO, Elapsed=02:29.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:14 seconds\n\n[2026-10-28 06:26:25 +0000] Status=2, isTerminal=NO, Elapsed=02:30.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:15 seconds\n\n[2026-10-28 06:26:26 +0000] Status=2, isTerminal=NO, Elapsed=02:31.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:16 seconds\n\n[2026-10-28 06:26:27 +0000] Status=2, isTerminal=NO, Elapsed=02:32.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:17 seconds\n\n[2026-10-28 06:26:28 +0000] Status=2, isTerminal=NO, Elapsed=02:33.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:18 seconds\n\n[2026-10-28 06:26:29 +0000] Status=2, isTerminal=NO, Elapsed=02:34.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:19 seconds\n\n[2026-10-28 06:26:30 +0000] Status=2, isTerminal=NO, Elapsed=02:35.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:20 seconds\n\n[2026-10-28 06:26:31 +0000] Status=2, isTerminal=NO, Elapsed=02:37.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:21 seconds\n\n[2026-10-28 06:26:32 +0000] Status=2, isTerminal=NO, Elapsed=02:38.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:22 seconds\n\n[2026-10-28 06:26:33 +0000] Status=2, isTerminal=NO, Elapsed=02:38.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:23 seconds\n\n[2026-10-28 06:26:34 +0000] Status=2, isTerminal=NO, Elapsed=02:39.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:24 seconds\n\n[2026-10-28 06:26:35 +0000] Status=2, isTerminal=NO, Elapsed=02:41.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:25 seconds\n\n[2026-10-28 06:26:36 +0000] Status=2, isTerminal=NO, Elapsed=02:41.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:26 seconds\n\n[2026-10-28 06:26:37 +0000] Status=2, isTerminal=NO, Elapsed=02:42.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:27 seconds\n\n[2026-10-28 06:26:38 +0000] Status=2, isTerminal=NO, Elapsed=02:43.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:28 seconds\n\n[2026-10-28 06:26:39 +0000] Status=2, isTerminal=NO, Elapsed=02:44.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:29 seconds\n\n[2026-10-28 06:26:40 +0000] Status=2, isTerminal=NO, Elapsed=02:45.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:30 seconds\n\n[2026-10-28 06:26:41 +0000] Status=2, isTerminal=NO, Elapsed=02:47.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:31 seconds\n\n[2026-10-28 06:26:42 +0000] Status=2, isTerminal=NO, Elapsed=02:47.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:32 seconds\n\n[2026-10-28 06:26:43 +0000] Status=2, isTerminal=NO, Elapsed=02:49.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:33 seconds\n\n[2026-10-28 06:26:44 +0000] Status=2, isTerminal=NO, Elapsed=02:49.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:34 seconds\n\n[2026-10-28 06:26:45 +0000] Status=2, isTerminal=NO, Elapsed=02:50.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:35 seconds\n\n[2026-10-28 06:26:46 +0000] Status=2, isTerminal=NO, Elapsed=02:51.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:36 seconds\n\n[2026-10-28 06:26:47 +0000] Status=2, isTerminal=NO, Elapsed=02:52.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:37 seconds\n\n[2026-10-28 06:26:48 +0000] Status=2, isTerminal=NO, Elapsed=02:53.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:38 seconds\n\n[2026-10-28 06:26:49 +0000] Status=2, isTerminal=NO, Elapsed=02:54.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:39 seconds\n\n[2026-10-28 06:26:50 +0000] Status=2, isTerminal=NO, Elapsed=02:55.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:40 seconds\n\n[2026-10-28 06:26:51 +0000] Status=2, isTerminal=NO, Elapsed=02:56.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:41 seconds\n\n[2026-10-28 06:26:52 +0000] Status=2, isTerminal=NO, Elapsed=02:57.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:42 seconds\n\n[2026-10-28 06:26:53 +0000] Status=2, isTerminal=NO, Elapsed=02:58.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:43 seconds\n\n[2026-10-28 06:26:54 +0000] Status=2, isTerminal=NO, Elapsed=02:59.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:44 seconds\n\n[2026-10-28 06:26:58 +0000] Status=2, isTerminal=NO, Elapsed=03:03.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.securityd.KeychainMigrator (KeychainMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:45 seconds\n\n[2026-10-28 06:26:59 +0000] Status=2, isTerminal=NO, Elapsed=03:05.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.securityd.KeychainMigrator (KeychainMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:02:49 seconds\n\n[2026-10-28 06:27:01 +0000] Status=2, isTerminal=NO, Elapsed=03:06.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.managedconfiguration.migrator (MCProfile.migrator, user-agnostic)\n\t\tMigration Elapsed:02:50 seconds\n\n[2026-10-28 06:27:02 +0000] Status=2, isTerminal=NO, Elapsed=03:07.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.managedconfiguration.migrator (MCProfile.migrator, user-agnostic)\n\t\tMigration Elapsed:02:52 seconds\n\n[2026-10-28 06:27:03 +0000] Status=2, isTerminal=NO, Elapsed=03:09.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.managedconfiguration.migrator (MCProfile.migrator, user-agnostic)\n\t\tMigration Elapsed:02:53 seconds\n\n[2026-10-28 06:27:05 +0000] Status=2, isTerminal=NO, Elapsed=03:10.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.managedconfiguration.migrator (MCProfile.migrator, user-agnostic)\n\t\tMigration Elapsed:02:54 seconds\n\n[2026-10-28 06:27:06 +0000] Status=2, isTerminal=NO, Elapsed=03:11.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.managedconfiguration.migrator (MCProfile.migrator, user-agnostic)\n\t\tMigration Elapsed:02:55 seconds\n\n[2026-10-28 06:27:06 +0000] Status=2, isTerminal=NO, Elapsed=03:12.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.managedconfiguration.migrator (MCProfile.migrator, user-agnostic)\n\t\tMigration Elapsed:02:57 seconds\n\n[2026-10-28 06:27:07 +0000] Status=2, isTerminal=NO, Elapsed=03:12.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.managedconfiguration.migrator (MCProfile.migrator, user-agnostic)\n\t\tMigration Elapsed:02:57 seconds\n\n[2026-10-28 06:27:08 +0000] Status=2, isTerminal=NO, Elapsed=03:13.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.managedconfiguration.migrator (MCProfile.migrator, user-agnostic)\n\t\tMigration Elapsed:02:58 seconds\n\n[2026-10-28 06:27:09 +0000] Status=2, isTerminal=NO, Elapsed=03:14.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.addressbook.migrator (AddressBookLegacy.migrator)\n\t\tMigration Elapsed:02:59 seconds\n\n[2026-10-28 06:27:10 +0000] Status=2, isTerminal=NO, Elapsed=03:15.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.addressbook.migrator (AddressBookLegacy.migrator)\n\t\tMigration Elapsed:03:00 seconds\n\n[2026-10-28 06:27:13 +0000] Status=2, isTerminal=NO, Elapsed=03:18.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.addressbook.migrator (AddressBookLegacy.migrator)\n\t\tMigration Elapsed:03:01 seconds\n\n[2026-10-28 06:27:16 +0000] Status=2, isTerminal=NO, Elapsed=03:21.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.WebBookmarks.migrator (WebBookmarks.migrator)\n\t\tMigration Elapsed:03:04 seconds\n\n[2026-10-28 06:27:18 +0000] Status=2, isTerminal=NO, Elapsed=03:23.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.MobileSafari.migrator (MobileSafari.migrator)\n\t\tMigration Elapsed:03:07 seconds\n\n[2026-10-28 06:27:20 +0000] Status=2, isTerminal=NO, Elapsed=03:25.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.MobileSafari.migrator (MobileSafari.migrator)\n\t\tMigration Elapsed:03:09 seconds\n\n[2026-10-28 06:27:22 +0000] Status=2, isTerminal=NO, Elapsed=03:27.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.locationd.migrator (CoreLocationMigrator.migrator) (Concurrent: Running plugin com.apple.MobileSlideShow (MobileSlideShow.migrator, concurrent after com.apple.accounts.migrator))\n\t\tMigration Elapsed:03:10 seconds\n\n[2026-10-28 06:27:23 +0000] Status=2, isTerminal=NO, Elapsed=03:28.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.keyboards.migrator (KeyboardMigrator.migrator)\n\t\tMigration Elapsed:03:12 seconds\n\n[2026-10-28 06:27:24 +0000] Status=2, isTerminal=NO, Elapsed=03:29.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.PassbookDataMigrator (PassbookDataMigrator.migrator)\n\t\tMigration Elapsed:03:13 seconds\n\n[2026-10-28 06:27:25 +0000] Status=2, isTerminal=NO, Elapsed=03:30.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.PassbookDataMigrator (PassbookDataMigrator.migrator)\n\t\tMigration Elapsed:03:14 seconds\n\n[2026-10-28 06:27:26 +0000] Status=4294967295, isTerminal=YES, Elapsed=03:32.\n\tFinished\n\n", + "stderr": "", + "unix": 1793168846.878825 + }, + { + "command": "xcrun simctl status_bar CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E override --time 9:41 --dataNetwork wifi --wifiMode active --wifiBars 3 --batteryState charged --batteryLevel 100", + "exit": 0, + "stdout": "", + "stderr": "", + "unix": 1793168848.976695 + }, + { + "command": "xcrun simctl launch CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E local.sodalive.NoticeNativeQA", + "exit": 0, + "stdout": "local.sodalive.NoticeNativeQA: 59659\n", + "stderr": "", + "unix": 1793168996.265437 + }, + { + "command": "xcrun simctl get_app_container CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E local.sodalive.NoticeNativeQA data", + "exit": 0, + "stdout": "/Users/klaus/Library/Developer/CoreSimulator/Devices/CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E/data/Containers/Data/Application/5D5168E2-02BD-44B3-9043-0EDB9A8F3842\n", + "stderr": "", + "unix": 1793168997.82867 + }, + { + "command": "xcrun simctl terminate CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E local.sodalive.NoticeNativeQA", + "exit": 0, + "stdout": "", + "stderr": "", + "unix": 1793169116.025192 + }, + { + "command": "xcrun simctl launch CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E local.sodalive.NoticeNativeQA --lifecycle", + "exit": 0, + "stdout": "local.sodalive.NoticeNativeQA: 60233\n", + "stderr": "", + "unix": 1793169119.180129 + }, + { + "command": "xcrun simctl get_app_container CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E local.sodalive.NoticeNativeQA data", + "exit": 0, + "stdout": "/Users/klaus/Library/Developer/CoreSimulator/Devices/CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E/data/Containers/Data/Application/5D5168E2-02BD-44B3-9043-0EDB9A8F3842\n", + "stderr": "", + "unix": 1793169122.260637 + }, + { + "command": "xcrun simctl io CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E screenshot /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/os-before-background.png", + "exit": 0, + "stdout": "", + "stderr": "Detected file type 'PNG' from extension\nWrote screenshot to: /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/os-before-background.png\n", + "unix": 1793169150.774837 + }, + { + "command": "xcrun simctl launch CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E com.apple.Preferences", + "exit": 0, + "stdout": "com.apple.Preferences: 60378\n", + "stderr": "", + "unix": 1793169152.6649652 + }, + { + "command": "xcrun simctl launch CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E local.sodalive.NoticeNativeQA", + "exit": 0, + "stdout": "local.sodalive.NoticeNativeQA: 60233\n", + "stderr": "", + "unix": 1793169165.2693172 + }, + { + "command": "xcrun simctl io CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E screenshot /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/os-resume-initial.png", + "exit": 0, + "stdout": "", + "stderr": "Detected file type 'PNG' from extension\nWrote screenshot to: /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/os-resume-initial.png\n", + "unix": 1793169168.175515 + }, + { + "command": "xcrun simctl io CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E screenshot /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/os-resume-after-6s.png", + "exit": 0, + "stdout": "", + "stderr": "Detected file type 'PNG' from extension\nWrote screenshot to: /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-fix.SxPOl6/os-resume-after-6s.png\n", + "unix": 1793169176.229098 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/focused-check.log b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/focused-check.log new file mode 100644 index 00000000..37ed2b1a --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/focused-check.log @@ -0,0 +1,4 @@ +PASS: actual NoticeApi/Repository public v2 GET requestPlain without Authorization; legacy list auth/timezone unchanged +PASS: actual DTO/roller 0/1/2/3, omitted/null envelope, repeated order/wrap/selection, exact HTML/date, legacy no-id, shrink/reset and lifecycle predicate +PASS: actual MyPageViewModel background delivery on main, 0/1/2/3 success, empty hides, HTTP/envelope/decode/transport failure preserves data, log-only/loading semantics +PASS: My Page notices regression checks (actual production API/Repository/VM/DTO/roller, native Combine; no server calls) diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/actions.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/actions.json new file mode 100644 index 00000000..518c412d --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/actions.json @@ -0,0 +1,157 @@ +[ + { + "event" : "application-didBecomeActive", + "scenario" : "preparing", + "uptime" : 0.60669207305181772 + }, + { + "event" : "scenario-start", + "scenario" : "phase-probe", + "uptime" : 1.2248648850945756 + }, + { + "elements" : [ + + ], + "event" : "phase-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-first.png", + "uptime" : 2.1716998170595616 + }, + { + "elements" : [ + + ], + "event" : "phase-before-inactive", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-before-inactive.png", + "uptime" : 8.1327494221040979 + }, + { + "event" : "inject-inactive", + "scenario" : "phase-probe", + "uptime" : 9.2267005461035296 + }, + { + "elements" : [ + + ], + "event" : "phase-inactive-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "phase-probe", + "screenshot" : "phase-inactive-start.png", + "uptime" : 10.112902885070071 + }, + { + "elements" : [ + + ], + "event" : "phase-inactive-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "phase-probe", + "screenshot" : "phase-inactive-after-6s.png", + "uptime" : 16.120313385035843 + }, + { + "event" : "inject-active", + "scenario" : "phase-probe", + "uptime" : 17.226711352006532 + }, + { + "elements" : [ + + ], + "event" : "phase-active-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-active-before-5s.png", + "uptime" : 21.620707996073179 + }, + { + "elements" : [ + + ], + "event" : "phase-active-next", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-active-next.png", + "uptime" : 24.429727441049181 + }, + { + "event" : "lifecycle-probe-finished", + "scenario" : "phase-probe", + "uptime" : 26.226647240109742 + }, + { + "event" : "application-willResignActive", + "scenario" : "phase-probe", + "uptime" : 31.554826714098454 + }, + { + "event" : "application-didBecomeActive", + "scenario" : "phase-probe", + "uptime" : 45.511490711010993 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-active-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-active-before-5s.png new file mode 100644 index 00000000..0e264d7e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-active-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-active-next.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-active-next.png new file mode 100644 index 00000000..7264a234 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-active-next.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-before-inactive.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-before-inactive.png new file mode 100644 index 00000000..0e264d7e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-before-inactive.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-first.png new file mode 100644 index 00000000..3652c0c7 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-inactive-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-inactive-after-6s.png new file mode 100644 index 00000000..0e264d7e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-inactive-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-inactive-start.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-inactive-start.png new file mode 100644 index 00000000..0e264d7e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/lifecycle/phase-inactive-start.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/actions.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/actions.json new file mode 100644 index 00000000..f4c441c6 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/actions.json @@ -0,0 +1,733 @@ +[ + { + "event" : "application-didBecomeActive", + "scenario" : "preparing", + "uptime" : 0.60328463092446327 + }, + { + "event" : "scenario-start", + "scenario" : "zero", + "uptime" : 1.3246910979505628 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "zero", + "phaseProbe" : [ + + ], + "requestedPhase" : "active", + "scenario" : "zero", + "screenshot" : "zero.png", + "sink" : [ + + ], + "uptime" : 2.1730586850317195 + }, + { + "event" : "scenario-start", + "scenario" : "one", + "uptime" : 3.4239596609259024 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "one-initial", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "one", + "screenshot" : "one-initial.png", + "sink" : [ + + ], + "uptime" : 4.2549780779518187 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "one-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "one", + "screenshot" : "one-after-6s.png", + "sink" : [ + + ], + "uptime" : 10.327469081967138 + }, + { + "event" : "scenario-start", + "scenario" : "two", + "uptime" : 11.426183080999181 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-first.png", + "sink" : [ + + ], + "uptime" : 12.255462241009809 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-before-5s.png", + "sink" : [ + + ], + "uptime" : 15.823301022988744 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-transition-mid", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-transition-mid.png", + "sink" : [ + + ], + "uptime" : 16.925860384013504 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-second", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-second.png", + "sink" : [ + + ], + "uptime" : 18.32893029297702 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-wrap-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-wrap-first.png", + "sink" : [ + + ], + "uptime" : 23.41166904498823 + }, + { + "event" : "scenario-start", + "scenario" : "three", + "uptime" : 24.428456210996956 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-first.png", + "sink" : [ + + ], + "uptime" : 25.25385982892476 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-second", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-second.png", + "sink" : [ + + ], + "uptime" : 31.635330791003071 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-third", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-third.png", + "sink" : [ + + ], + "uptime" : 36.729849717929028 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-wrap-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-wrap-first.png", + "sink" : [ + + ], + "uptime" : 41.740868164924905 + }, + { + "event" : "scenario-start", + "scenario" : "long-korean", + "uptime" : 42.431434603990056 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "long-korean-dark", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "long-korean", + "screenshot" : "long-korean-dark.png", + "sink" : [ + + ], + "uptime" : 43.25451985700056 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "long-korean-light", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "long-korean", + "screenshot" : "long-korean-light.png", + "sink" : [ + + ], + "uptime" : 45.226666609989479 + }, + { + "event" : "scenario-start", + "scenario" : "inactive-environment", + "uptime" : 46.436435326002538 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "inactive-before", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "inactive-environment", + "screenshot" : "inactive-before.png", + "sink" : [ + + ], + "uptime" : 53.322798584005795 + }, + { + "event" : "inject-scenePhase-inactive", + "scenario" : "inactive-environment", + "uptime" : 53.939998690970242 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "inactive-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "inactive-environment", + "screenshot" : "inactive-start.png", + "sink" : [ + + ], + "uptime" : 54.73241697892081 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "inactive-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "inactive-environment", + "screenshot" : "inactive-after-6s.png", + "sink" : [ + + ], + "uptime" : 60.830518260947429 + }, + { + "event" : "inject-scenePhase-active", + "scenario" : "inactive-environment", + "uptime" : 61.547038672957569 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "reactivated-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "inactive-environment", + "screenshot" : "reactivated-before-5s.png", + "sink" : [ + + ], + "uptime" : 65.835363388992846 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "reactivated-next", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "inactive-environment", + "screenshot" : "reactivated-next.png", + "sink" : [ + + ], + "uptime" : 68.331484452006407 + }, + { + "event" : "unmount-banner", + "scenario" : "remount", + "uptime" : 69.4399787170114 + }, + { + "elements" : [ + + ], + "event" : "unmounted-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "unmounted-start.png", + "uptime" : 70.25882336392533 + }, + { + "elements" : [ + + ], + "event" : "unmounted-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "unmounted-after-6s.png", + "uptime" : 76.334743769024499 + }, + { + "event" : "remount-banner", + "scenario" : "remount", + "uptime" : 76.944733644020744 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "remounted-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "remounted-first.png", + "sink" : [ + + ], + "uptime" : 77.729062643949874 + }, + { + "elements" : [ + + ], + "event" : "remounted-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "remounted-before-5s.png", + "uptime" : 81.328909087926149 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "remounted-second", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "remounted-second.png", + "sink" : [ + + ], + "uptime" : 83.829371197964065 + }, + { + "event" : "scenario-start", + "scenario" : "shrink-to-one", + "uptime" : 85.444805009989068 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "shrink-reset-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "shrink-to-one", + "screenshot" : "shrink-reset-first.png", + "sink" : [ + + ], + "uptime" : 86.246675234986469 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "shrink-one-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "shrink-to-one", + "screenshot" : "shrink-one-after-6s.png", + "sink" : [ + + ], + "uptime" : 92.334473175927997 + }, + { + "event" : "scenario-start", + "scenario" : "shrink-to-empty", + "uptime" : 93.449973574024625 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "shrink-empty", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "shrink-to-empty", + "screenshot" : "shrink-empty.png", + "sink" : [ + + ], + "uptime" : 94.286417805938981 + }, + { + "event" : "matrix-finished", + "scenario" : "shrink-to-empty", + "uptime" : 95.453772575943731 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/inactive-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/inactive-after-6s.png new file mode 100644 index 00000000..89125a14 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/inactive-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/inactive-before.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/inactive-before.png new file mode 100644 index 00000000..89125a14 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/inactive-before.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/inactive-start.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/inactive-start.png new file mode 100644 index 00000000..89125a14 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/inactive-start.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/long-korean-dark.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/long-korean-dark.png new file mode 100644 index 00000000..41933d7b Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/long-korean-dark.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/long-korean-light.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/long-korean-light.png new file mode 100644 index 00000000..41933d7b Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/long-korean-light.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/one-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/one-after-6s.png new file mode 100644 index 00000000..4cbf09ad Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/one-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/one-initial.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/one-initial.png new file mode 100644 index 00000000..4cbf09ad Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/one-initial.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/reactivated-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/reactivated-before-5s.png new file mode 100644 index 00000000..89125a14 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/reactivated-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/reactivated-next.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/reactivated-next.png new file mode 100644 index 00000000..296f7ed9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/reactivated-next.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/remounted-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/remounted-before-5s.png new file mode 100644 index 00000000..ee410d15 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/remounted-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/remounted-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/remounted-first.png new file mode 100644 index 00000000..ee410d15 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/remounted-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/remounted-second.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/remounted-second.png new file mode 100644 index 00000000..1a242d5a Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/remounted-second.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/shrink-empty.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/shrink-empty.png new file mode 100644 index 00000000..6602156d Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/shrink-empty.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/shrink-one-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/shrink-one-after-6s.png new file mode 100644 index 00000000..30db67e9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/shrink-one-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/shrink-reset-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/shrink-reset-first.png new file mode 100644 index 00000000..30db67e9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/shrink-reset-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-first.png new file mode 100644 index 00000000..002cb87e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-second.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-second.png new file mode 100644 index 00000000..5e0e146e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-second.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-third.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-third.png new file mode 100644 index 00000000..11ac8017 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-third.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-wrap-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-wrap-first.png new file mode 100644 index 00000000..002cb87e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/three-wrap-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-before-5s.png new file mode 100644 index 00000000..7cf66866 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-first.png new file mode 100644 index 00000000..7cf66866 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-second.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-second.png new file mode 100644 index 00000000..a71fa05d Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-second.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-transition-mid.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-transition-mid.png new file mode 100644 index 00000000..a71fa05d Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-transition-mid.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-wrap-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-wrap-first.png new file mode 100644 index 00000000..7cf66866 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/two-wrap-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/unmounted-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/unmounted-after-6s.png new file mode 100644 index 00000000..10f5eadf Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/unmounted-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/unmounted-start.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/unmounted-start.png new file mode 100644 index 00000000..10f5eadf Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/unmounted-start.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/zero.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/zero.png new file mode 100644 index 00000000..0ee2c5ea Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/matrix/zero.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/os-before-background.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/os-before-background.png new file mode 100644 index 00000000..a8399415 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/os-before-background.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/os-resume-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/os-resume-after-6s.png new file mode 100644 index 00000000..a421dc92 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/os-resume-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/os-resume-initial.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/os-resume-initial.png new file mode 100644 index 00000000..19422344 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/os-resume-initial.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/provenance.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/provenance.json new file mode 100644 index 00000000..386de140 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/provenance.json @@ -0,0 +1,29 @@ +{ + "product_files": { + "SodaLive/Sources/MyPage/MyPageView.swift": "7f8ac15573ab4c9fe01508431297e40d2e95a22ad37585859f03224475749d02", + "SodaLive/Sources/V2/MyPage/Models/MyPageNoticeRoller.swift": "1bd3f0dfc2ee59ce692291bf3079b06874e7c1012e4365105d3636928e29fe8a", + "SodaLive/Sources/Settings/Notice/GetNoticeResponse.swift": "bbf55eb38659af3df7c6db29af0fa7904d0f87457ec098068fe96e282cee1977", + "SodaLive/Sources/Extensions/FontModifier.swift": "086fb0a19d884124a4cca638f7c8483de724ee31a61603b2cbd489aabf26a6c6", + "SodaLive/Sources/Extensions/ColorExtension.swift": "747347d86ade888fe9c1d30629285b4a71991bc0f21189a0d4b76ad314c32364", + "SodaLive/Sources/UI/Theme/Spacing.swift": "372a73b821236c15449fa022cd628f61556f1381a16f234a4b77e833c2e588c1", + "SodaLive/Resources/Font/Pretendard-Regular.otf": "3ffbacde6ab8411f1d2db54bb9b1f0b3ee2a738932033722cf0388c06aed1c93" + }, + "banner_sha256": "69de63603118bafa25a2c8d711489d9e4389d3cd308937f86ad23c652702dc46", + "outside_banner_unchanged": true, + "harness_unchanged_from_RED": true, + "stability_seconds": 3, + "harness_sha256": "e444d9651cb11186a8fcc0792a147e11fe1502f1d044159ece29520d1f456fd8", + "kind": "actual UpdateBannerView native harness, not full app", + "substitutions": [ + "AppState and AppStep replaced with local title/content/date capture sink, no routing/server", + "LanguageOption reduced to enum cases needed by actual FontModifier; ko locale and app.language=ko forced", + "MyPage surrounding page replaced by labeled QA context, fixtures and mount/scenePhase environment driver", + "Exact production MyPageNoticeRoller, NoticeItem file, FontModifier, ColorExtension, SodaSpacing compiled", + "Real Pretendard-Regular.otf registered in native app Info.plist", + "Invisible sibling PhaseProbe records the same injected scenePhase; actual view source unchanged", + "UIApplication notification bridge supplies real OS active/inactive to UIKit-hosted SwiftUI environment, not full app Scene" + ], + "RED_evidence_unchanged": true, + "product_hashes_match_after_all_runs": true, + "verified_unix": 1793169300.0702348 +} \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/README.md b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/README.md new file mode 100644 index 00000000..d030203d --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/README.md @@ -0,0 +1,38 @@ +# P1-R1 native QA rerun + +This fresh run used the existing UIKit `UIHostingController` harness with the current extracted `UpdateBannerView`; it is native rendered evidence, not the full SodaLive app. Simulator: task-owned `NoticeQA-Fix-Owned-20261028`, iOS 18.3, iPhone SE3 size (375pt / 750x1334px), Xcode 26. No login, server request, or production harness code was added. + +## Results + +- `matrix/zero.png`: no banner. `matrix/one-initial.png` and `matrix/one-after-6s.png` are identical. +- Two-item sequence: `matrix/two-first.png` -> `two-second.png` -> `two-wrap-first.png`; the five-second Timer remained unchanged. +- Three-item sequence: `matrix/three-first.png` -> `three-second.png` -> `three-third.png` -> `three-wrap-first.png`. +- Long Korean title and arrow-only layout: `matrix/long-korean-dark.png` and `long-korean-light.png`; ellipsis preserves one-line title and visible non-overlapping chevron. +- Data shrink and remount: `matrix/shrink-*`, `unmounted-*`, and `remounted-*` capture reset, hidden, fixed-single, and resumed rotation states. +- Inactive/active probe: `lifecycle/phase-inactive-start.png` equals `phase-inactive-after-6s.png`; active resumes to the next item at `phase-active-next.png`. `lifecycle/actions.json` records the injected phase changes observed by the sibling probe. +- OS background/resume was available: `os-before-background.png`, `os-resume-after-7s.png`; `os-lifecycle-actions.json` logs willResignActive/didBecomeActive. + +## Scope and limits + +The tested interaction is native rendering plus the production roller and its five-second `Timer` under fixture-driven item changes, remount, and injected scene phase. Actual Button activation/detail routing is not verified: UIKit accessibility traversal exposes no actionable node (`accessibilityActivateResult=false`, `captureDelta=0`); no coordinate-touch tool was used. The Button label now owns the padded `contentShape` in source (horizontal 24pt, vertical 6pt), restoring the padded hit region by source geometry only. Reduce Motion runtime setting changes, physical touch/padding-edge hit tests, full-app routing, iOS 16.6 runtime, real server, and device behavior remain untested. + +## Provenance and commands + +Product `MyPageView.swift` SHA-256 at extraction and after all runs: `7f8ac15573ab4c9fe01508431297e40d2e95a22ad37585859f03224475749d02`. The extracted production view and exact previously used harness/helpers are retained under `source/`; the app was compiled from those copies plus real roller, DTO, font, spacing, and color helpers. `provenance.json` identifies substitutions and the stable product hash. `actions.json` files are copied directly from the app container; PNGs are native `drawHierarchy` output except OS lifecycle screenshots captured using `simctl io screenshot`. + +Commands run: + +```sh +xcrun --sdk iphonesimulator swiftc -sdk "$(xcrun --sdk iphonesimulator --show-sdk-path)" -target x86_64-apple-ios16.6-simulator -module-cache-path "$QA_ROOT/module-cache" "$QA_ROOT"/source/*.swift -o "$QA_ROOT/NoticeNativeQA.app/NoticeNativeQA" +xcrun simctl install CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E "$QA_ROOT/NoticeNativeQA.app" +xcrun simctl launch CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E local.sodalive.NoticeNativeQA +xcrun simctl terminate CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E local.sodalive.NoticeNativeQA +xcrun simctl launch CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E local.sodalive.NoticeNativeQA --lifecycle +xcrun simctl launch CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E com.apple.Preferences +xcrun simctl launch CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E local.sodalive.NoticeNativeQA +xcrun swiftc -frontend -parse SodaLive/Sources/MyPage/MyPageView.swift +bash work/tests/check-my-page-notices.sh +git diff --check +``` + +The original RED evidence under `../native/` was not edited. No product code changes were needed in this rerun session: the shared worktree already contained the recorded P1-R1 implementation. Cleanup receipt: `cleanup.json`. diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/cleanup-todo.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/cleanup-todo.json new file mode 100644 index 00000000..405912fb --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/cleanup-todo.json @@ -0,0 +1 @@ +{"root":"/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-rerun.T0wN2e","device":"CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E","deviceName":"NoticeQA-Fix-Owned-20261028","output":"docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222","process":"local.sodalive.NoticeNativeQA (owned harness only)","cleanup_status":"completed; see cleanup.json"} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/cleanup.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/cleanup.json new file mode 100644 index 00000000..353db1b7 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/cleanup.json @@ -0,0 +1,14 @@ +{ + "harness_process": "local.sodalive.NoticeNativeQA terminated", + "settings_process": "com.apple.Preferences termination requested", + "simulator": { + "udid": "CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E", + "name": "NoticeQA-Fix-Owned-20261028", + "delete_command_succeeded": true, + "absent_after_cleanup": true + }, + "tmp_root": "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native-rerun.T0wN2e", + "tmp_root_removed": true, + "product_sha256_after_cleanup": "7f8ac15573ab4c9fe01508431297e40d2e95a22ad37585859f03224475749d02", + "old_RED_evidence_modified": false +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/actions.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/actions.json new file mode 100644 index 00000000..6547e6fe --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/actions.json @@ -0,0 +1,147 @@ +[ + { + "event" : "application-didBecomeActive", + "scenario" : "preparing", + "uptime" : 0.47711604600772262 + }, + { + "event" : "scenario-start", + "scenario" : "phase-probe", + "uptime" : 1.1950988729950041 + }, + { + "elements" : [ + + ], + "event" : "phase-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-first.png", + "uptime" : 2.1339620260987431 + }, + { + "elements" : [ + + ], + "event" : "phase-before-inactive", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-before-inactive.png", + "uptime" : 8.4191903470782563 + }, + { + "event" : "inject-inactive", + "scenario" : "phase-probe", + "uptime" : 9.5942875890759751 + }, + { + "elements" : [ + + ], + "event" : "phase-inactive-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "phase-probe", + "screenshot" : "phase-inactive-start.png", + "uptime" : 10.522270086104982 + }, + { + "elements" : [ + + ], + "event" : "phase-inactive-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "phase-probe", + "screenshot" : "phase-inactive-after-6s.png", + "uptime" : 16.086649746051989 + }, + { + "event" : "inject-active", + "scenario" : "phase-probe", + "uptime" : 17.196919414098375 + }, + { + "elements" : [ + + ], + "event" : "phase-active-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-active-before-5s.png", + "uptime" : 22.302312774001621 + }, + { + "elements" : [ + + ], + "event" : "phase-active-next", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-active-next.png", + "uptime" : 24.60830140102189 + }, + { + "event" : "lifecycle-probe-finished", + "scenario" : "phase-probe", + "uptime" : 26.427068338030949 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-active-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-active-before-5s.png new file mode 100644 index 00000000..0e264d7e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-active-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-active-next.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-active-next.png new file mode 100644 index 00000000..7264a234 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-active-next.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-before-inactive.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-before-inactive.png new file mode 100644 index 00000000..0e264d7e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-before-inactive.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-first.png new file mode 100644 index 00000000..3652c0c7 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-inactive-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-inactive-after-6s.png new file mode 100644 index 00000000..0e264d7e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-inactive-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-inactive-start.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-inactive-start.png new file mode 100644 index 00000000..0e264d7e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/lifecycle/phase-inactive-start.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/actions.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/actions.json new file mode 100644 index 00000000..4bb1de40 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/actions.json @@ -0,0 +1,733 @@ +[ + { + "event" : "application-didBecomeActive", + "scenario" : "preparing", + "uptime" : 0.46672013192437589 + }, + { + "event" : "scenario-start", + "scenario" : "zero", + "uptime" : 1.16241601400543 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "zero", + "phaseProbe" : [ + + ], + "requestedPhase" : "active", + "scenario" : "zero", + "screenshot" : "zero.png", + "sink" : [ + + ], + "uptime" : 2.0311167240142822 + }, + { + "event" : "scenario-start", + "scenario" : "one", + "uptime" : 3.2615174379898235 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "one-initial", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "one", + "screenshot" : "one-initial.png", + "sink" : [ + + ], + "uptime" : 4.0839877990074456 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "one-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "one", + "screenshot" : "one-after-6s.png", + "sink" : [ + + ], + "uptime" : 10.15054528194014 + }, + { + "event" : "scenario-start", + "scenario" : "two", + "uptime" : 11.660896176006645 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-first.png", + "sink" : [ + + ], + "uptime" : 12.490523119922727 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-before-5s.png", + "sink" : [ + + ], + "uptime" : 16.054529586923309 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-transition-mid", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-transition-mid.png", + "sink" : [ + + ], + "uptime" : 17.155694011948071 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-second", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-second.png", + "sink" : [ + + ], + "uptime" : 18.896502300980501 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-wrap-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-wrap-first.png", + "sink" : [ + + ], + "uptime" : 23.874136696918868 + }, + { + "event" : "scenario-start", + "scenario" : "three", + "uptime" : 25.311094706994481 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-first.png", + "sink" : [ + + ], + "uptime" : 26.136696683010086 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-second", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-second.png", + "sink" : [ + + ], + "uptime" : 32.205110257025808 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-third", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-third.png", + "sink" : [ + + ], + "uptime" : 37.206522241933271 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-wrap-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-wrap-first.png", + "sink" : [ + + ], + "uptime" : 42.396429225918837 + }, + { + "event" : "scenario-start", + "scenario" : "long-korean", + "uptime" : 44.015552312019281 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "long-korean-dark", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "long-korean", + "screenshot" : "long-korean-dark.png", + "sink" : [ + + ], + "uptime" : 44.842075923923403 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "long-korean-light", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "long-korean", + "screenshot" : "long-korean-light.png", + "sink" : [ + + ], + "uptime" : 46.939548051916063 + }, + { + "event" : "scenario-start", + "scenario" : "inactive-environment", + "uptime" : 48.216489996993914 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "inactive-before", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "inactive-environment", + "screenshot" : "inactive-before.png", + "sink" : [ + + ], + "uptime" : 55.439381098956801 + }, + { + "event" : "inject-scenePhase-inactive", + "scenario" : "inactive-environment", + "uptime" : 56.093917121994309 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "inactive-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "inactive-environment", + "screenshot" : "inactive-start.png", + "sink" : [ + + ], + "uptime" : 56.911063794977963 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "inactive-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "inactive-environment", + "screenshot" : "inactive-after-6s.png", + "sink" : [ + + ], + "uptime" : 62.614738418022171 + }, + { + "event" : "inject-scenePhase-active", + "scenario" : "inactive-environment", + "uptime" : 63.964497794979252 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "reactivated-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "inactive-environment", + "screenshot" : "reactivated-before-5s.png", + "sink" : [ + + ], + "uptime" : 67.609345081960782 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "reactivated-next", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "inactive-environment", + "screenshot" : "reactivated-next.png", + "sink" : [ + + ], + "uptime" : 70.163863864960149 + }, + { + "event" : "unmount-banner", + "scenario" : "remount", + "uptime" : 72.366065041976981 + }, + { + "elements" : [ + + ], + "event" : "unmounted-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "unmounted-start.png", + "uptime" : 73.191316431970336 + }, + { + "elements" : [ + + ], + "event" : "unmounted-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "unmounted-after-6s.png", + "uptime" : 79.260148923960514 + }, + { + "event" : "remount-banner", + "scenario" : "remount", + "uptime" : 79.869967860984616 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "remounted-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "remounted-first.png", + "sink" : [ + + ], + "uptime" : 80.660581854986958 + }, + { + "elements" : [ + + ], + "event" : "remounted-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "remounted-before-5s.png", + "uptime" : 84.243203962920234 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "remounted-second", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "remounted-second.png", + "sink" : [ + + ], + "uptime" : 86.759581275982782 + }, + { + "event" : "scenario-start", + "scenario" : "shrink-to-one", + "uptime" : 88.370025613927282 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "shrink-reset-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "shrink-to-one", + "screenshot" : "shrink-reset-first.png", + "sink" : [ + + ], + "uptime" : 89.216271706973203 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "shrink-one-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "shrink-to-one", + "screenshot" : "shrink-one-after-6s.png", + "sink" : [ + + ], + "uptime" : 95.254741379991174 + }, + { + "event" : "scenario-start", + "scenario" : "shrink-to-empty", + "uptime" : 96.765485781943426 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "shrink-empty", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "shrink-to-empty", + "screenshot" : "shrink-empty.png", + "sink" : [ + + ], + "uptime" : 97.588358851964585 + }, + { + "event" : "matrix-finished", + "scenario" : "shrink-to-empty", + "uptime" : 98.770786843961105 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/inactive-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/inactive-after-6s.png new file mode 100644 index 00000000..89125a14 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/inactive-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/inactive-before.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/inactive-before.png new file mode 100644 index 00000000..89125a14 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/inactive-before.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/inactive-start.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/inactive-start.png new file mode 100644 index 00000000..89125a14 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/inactive-start.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/long-korean-dark.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/long-korean-dark.png new file mode 100644 index 00000000..41933d7b Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/long-korean-dark.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/long-korean-light.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/long-korean-light.png new file mode 100644 index 00000000..41933d7b Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/long-korean-light.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/one-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/one-after-6s.png new file mode 100644 index 00000000..4cbf09ad Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/one-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/one-initial.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/one-initial.png new file mode 100644 index 00000000..4cbf09ad Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/one-initial.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/reactivated-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/reactivated-before-5s.png new file mode 100644 index 00000000..89125a14 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/reactivated-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/reactivated-next.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/reactivated-next.png new file mode 100644 index 00000000..296f7ed9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/reactivated-next.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/remounted-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/remounted-before-5s.png new file mode 100644 index 00000000..ee410d15 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/remounted-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/remounted-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/remounted-first.png new file mode 100644 index 00000000..ee410d15 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/remounted-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/remounted-second.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/remounted-second.png new file mode 100644 index 00000000..1a242d5a Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/remounted-second.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/shrink-empty.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/shrink-empty.png new file mode 100644 index 00000000..6602156d Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/shrink-empty.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/shrink-one-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/shrink-one-after-6s.png new file mode 100644 index 00000000..30db67e9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/shrink-one-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/shrink-reset-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/shrink-reset-first.png new file mode 100644 index 00000000..30db67e9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/shrink-reset-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-first.png new file mode 100644 index 00000000..002cb87e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-second.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-second.png new file mode 100644 index 00000000..5e0e146e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-second.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-third.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-third.png new file mode 100644 index 00000000..11ac8017 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-third.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-wrap-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-wrap-first.png new file mode 100644 index 00000000..002cb87e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/three-wrap-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-before-5s.png new file mode 100644 index 00000000..7cf66866 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-first.png new file mode 100644 index 00000000..7cf66866 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-second.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-second.png new file mode 100644 index 00000000..a71fa05d Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-second.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-transition-mid.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-transition-mid.png new file mode 100644 index 00000000..a71fa05d Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-transition-mid.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-wrap-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-wrap-first.png new file mode 100644 index 00000000..7cf66866 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/two-wrap-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/unmounted-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/unmounted-after-6s.png new file mode 100644 index 00000000..10f5eadf Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/unmounted-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/unmounted-start.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/unmounted-start.png new file mode 100644 index 00000000..10f5eadf Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/unmounted-start.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/zero.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/zero.png new file mode 100644 index 00000000..0ee2c5ea Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/matrix/zero.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/os-before-background.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/os-before-background.png new file mode 100644 index 00000000..5afe8632 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/os-before-background.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/os-lifecycle-actions.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/os-lifecycle-actions.json new file mode 100644 index 00000000..4ab627aa --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/os-lifecycle-actions.json @@ -0,0 +1,157 @@ +[ + { + "event" : "application-didBecomeActive", + "scenario" : "preparing", + "uptime" : 0.47711604600772262 + }, + { + "event" : "scenario-start", + "scenario" : "phase-probe", + "uptime" : 1.1950988729950041 + }, + { + "elements" : [ + + ], + "event" : "phase-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-first.png", + "uptime" : 2.1339620260987431 + }, + { + "elements" : [ + + ], + "event" : "phase-before-inactive", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-before-inactive.png", + "uptime" : 8.4191903470782563 + }, + { + "event" : "inject-inactive", + "scenario" : "phase-probe", + "uptime" : 9.5942875890759751 + }, + { + "elements" : [ + + ], + "event" : "phase-inactive-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "phase-probe", + "screenshot" : "phase-inactive-start.png", + "uptime" : 10.522270086104982 + }, + { + "elements" : [ + + ], + "event" : "phase-inactive-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "phase-probe", + "screenshot" : "phase-inactive-after-6s.png", + "uptime" : 16.086649746051989 + }, + { + "event" : "inject-active", + "scenario" : "phase-probe", + "uptime" : 17.196919414098375 + }, + { + "elements" : [ + + ], + "event" : "phase-active-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-active-before-5s.png", + "uptime" : 22.302312774001621 + }, + { + "elements" : [ + + ], + "event" : "phase-active-next", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-active-next.png", + "uptime" : 24.60830140102189 + }, + { + "event" : "lifecycle-probe-finished", + "scenario" : "phase-probe", + "uptime" : 26.427068338030949 + }, + { + "event" : "application-willResignActive", + "scenario" : "phase-probe", + "uptime" : 48.644281883025542 + }, + { + "event" : "application-didBecomeActive", + "scenario" : "phase-probe", + "uptime" : 53.97301990899723 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/os-resume-after-7s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/os-resume-after-7s.png new file mode 100644 index 00000000..8a096bd9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/os-resume-after-7s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/provenance.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/provenance.json new file mode 100644 index 00000000..cae707a0 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/provenance.json @@ -0,0 +1,15 @@ +{ + "kind": "fresh native UIHostingController harness; not full app", + "product_sha256_at_extraction_and_after_run": "7f8ac15573ab4c9fe01508431297e40d2e95a22ad37585859f03224475749d02", + "extracted_banner_sha256": "5b6be75ff69a61bd667dc3a209759478586e844eb4f881c7e6b822d7146d479b", + "harness_sha256": "e444d9651cb11186a8fcc0792a147e11fe1502f1d044159ece29520d1f456fd8", + "simulator": "CC9EA0CF-1CCF-4EDD-8FDB-80DFC0F54E4E / iOS 18.3 / iPhone SE3 size", + "sources": "current UpdateBannerView, production roller, NoticeItem DTO, FontModifier, ColorExtension, SodaSpacing", + "substitutions": [ + "AppState/AppStep replaced by local capture sink", + "MyPage surrounding screen replaced by labelled fixture harness", + "no server/login/routing" + ], + "production_hash_stable": true, + "old_RED_evidence_modified": false +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/ColorExtension.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/ColorExtension.swift new file mode 100644 index 00000000..742e4ad8 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/ColorExtension.swift @@ -0,0 +1,40 @@ +// +// ColorExtension.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// +// https://seons-dev.tistory.com/174 +// + +import SwiftUI + +extension Color { + init(hex: String) { + let scanner = Scanner(string: hex) + _ = scanner.scanString("#") + + var rgb: UInt64 = 0 + scanner.scanHexInt64(&rgb) + + let r = Double((rgb >> 16) & 0xFF) / 255.0 + let g = Double((rgb >> 8) & 0xFF) / 255.0 + let b = Double((rgb >> 0) & 0xFF) / 255.0 + self.init(red: r, green: g, blue: b) + } +} + +extension UIColor { + convenience init(hex: String, alpha: CGFloat = 1.0) { + let scanner = Scanner(string: hex) + _ = scanner.scanString("#") + + var rgb: UInt64 = 0 + scanner.scanHexInt64(&rgb) + + let r = Double((rgb >> 16) & 0xFF) / 255.0 + let g = Double((rgb >> 8) & 0xFF) / 255.0 + let b = Double((rgb >> 0) & 0xFF) / 255.0 + self.init(red: r, green: g, blue: b, alpha: alpha) + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/FontModifier.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/FontModifier.swift new file mode 100644 index 00000000..33ba84e5 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/FontModifier.swift @@ -0,0 +1,164 @@ +// +// FontModifier.swift +// SodaLive +// +// Created by klaus on 1/23/26. +// + +import SwiftUI + +enum SodaTypography { + case heading1 + case heading2 + case heading3 + case heading4 + case body1 + case body2 + case body3 + case body4 + case body5 + case body6 + case caption1 + case caption2 + case caption3 + + var size: CGFloat { + switch self { + case .heading1: + return 24 + case .heading2: + return 22 + case .heading3: + return 20 + case .heading4: + return 18 + case .body1, .body2, .body3: + return 16 + case .body4, .body5, .body6: + return 14 + case .caption1, .caption2, .caption3: + return 12 + } + } + + func localizedFontName(locale: Locale = .autoupdatingCurrent) -> String? { + fontName(for: .localized, weight: weight, locale: locale) + } + + var weight: SwiftUI.Font.Weight { + switch self { + case .heading1, .heading2, .heading3, .heading4, .body1, .body4, .caption1: + return .bold + case .body2, .body5, .caption2: + return .medium + case .body3, .body6, .caption3: + return .regular + } + } +} + +enum SodaFontFamily { + case localized + case pattaya + case phosphate +} + +private func resolvedLanguageCode(currentLocale: Locale) -> String? { + if let raw = UserDefaults.standard.string(forKey: "app.language"), + let option = LanguageOption(rawValue: raw), + option != .system { + return option.rawValue + } + return currentLocale.language.languageCode?.identifier +} + +private func koreanFontName(for weight: SwiftUI.Font.Weight) -> String { + switch weight { + case .bold: + return "Pretendard-Bold" + case .medium: + return "Pretendard-Medium" + case .light: + return "Pretendard-Light" + default: + return "Pretendard-Regular" + } +} + +private func japaneseFontName(for weight: SwiftUI.Font.Weight) -> String { + switch weight { + case .bold: + return "NotoSansJP-Bold" + case .medium: + return "NotoSansJP-Medium" + case .light: + return "NotoSansJP-Light" + default: + return "NotoSansJP-Regular" + } +} + +private func fontName(for family: SodaFontFamily, weight: SwiftUI.Font.Weight, locale: Locale) -> String? { + switch family { + case .localized: + switch resolvedLanguageCode(currentLocale: locale) { + case "ko": + return koreanFontName(for: weight) + case "ja": + return japaneseFontName(for: weight) + default: + return nil + } + case .pattaya: + return "Pattaya-Regular" + case .phosphate: + return "PhosphateSolid" + } +} + +struct FontModifier: ViewModifier { + @Environment(\.locale) private var locale + let size: CGFloat + let weight: SwiftUI.Font.Weight + let family: SodaFontFamily + + func body(content: Content) -> some View { + if let fontName = fontName(for: family, weight: weight, locale: locale) { + content.font(.custom(fontName, size: size)) + } else { + content.font(.system(size: size, weight: weight)) + } + } +} + +extension View { + func appFont( + size: CGFloat, + weight: SwiftUI.Font.Weight = .regular, + family: SodaFontFamily = .localized + ) -> some View { + self.modifier(FontModifier(size: size, weight: weight, family: family)) + } + + func appFont(_ typography: SodaTypography, family: SodaFontFamily = .localized) -> some View { + appFont(size: typography.size, weight: typography.weight, family: family) + } +} + +extension Text { + func appFont( + size: CGFloat, + weight: SwiftUI.Font.Weight = .regular, + family: SodaFontFamily = .localized + ) -> Text { + if let fontName = fontName(for: family, weight: weight, locale: .autoupdatingCurrent) { + return self.font(.custom(fontName, size: size)) + } + + return self.font(.system(size: size, weight: weight)) + } + + func appFont(_ typography: SodaTypography, family: SodaFontFamily = .localized) -> Text { + appFont(size: typography.size, weight: typography.weight, family: family) + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/GetNoticeResponse.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/GetNoticeResponse.swift new file mode 100644 index 00000000..6cbe3604 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/GetNoticeResponse.swift @@ -0,0 +1,19 @@ +// +// GetNoticeResponse.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import Foundation + +struct GetNoticeResponse: Decodable { + let totalCount: Int + let noticeList: [NoticeItem] +} + +struct NoticeItem: Decodable, Hashable { + let title: String + let content: String + let date: String +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/Harness.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/Harness.swift new file mode 100644 index 00000000..e7793dfd --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/Harness.swift @@ -0,0 +1,221 @@ +import SwiftUI +import UIKit + +enum LanguageOption: String { case system, ko, en, ja } + +enum AppStep { case noticeDetail(notice: NoticeItem) } + +final class AppState { + static let shared = AppState() + var captures: [[String: String]] = [] + var phases: [[String: String]] = [] + func setAppStep(step: AppStep) { + switch step { + case .noticeDetail(let notice): + captures.append(["title": notice.title, "content": notice.content, "date": notice.date]) + } + } +} + +struct PhaseProbe: View { + @Environment(\.scenePhase) private var phase + var body: some View { + Color.clear + .onAppear { AppState.shared.phases.append(["event": "appear", "phase": String(describing: phase)]) } + .onChange(of: phase) { value in AppState.shared.phases.append(["event": "change", "phase": String(describing: value)]) } + } +} + +final class HarnessState: ObservableObject { + @Published var items: [NoticeItem] = [] + @Published var mounted = true + @Published var phase = ScenePhase.active + @Published var scenario = "preparing" +} + +struct HarnessRoot: View { + @ObservedObject var state: HarnessState + var body: some View { + VStack(alignment: .leading, spacing: 0) { + VStack(alignment: .leading, spacing: 8) { + Text("NATIVE QA HARNESS").font(.headline) + Text(state.scenario).font(.caption.monospaced()) + Text("Actual UpdateBannerView below").font(.caption) + } + .foregroundStyle(.white) + .padding(24) + if state.mounted && !state.items.isEmpty { + UpdateBannerView(items: state.items) + .background(PhaseProbe()) + .environment(\.scenePhase, state.phase) + } + Text("Harness context / no network / no login") + .font(.caption) + .foregroundStyle(.gray) + .padding(24) + Spacer() + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + .background(Color(hex: "131313")) + .environment(\.locale, Locale(identifier: "ko_KR")) + } +} + +final class HarnessDelegate: NSObject, UIApplicationDelegate { + var window: UIWindow? + let state = HarnessState() + let started = ProcessInfo.processInfo.systemUptime + var events: [[String: Any]] = [] + let output = URL.documentsDirectory.appendingPathComponent(CommandLine.arguments.contains("--lifecycle") ? "lifecycle" : "matrix", isDirectory: true) + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { + UserDefaults.standard.set("ko", forKey: "app.language") + try! FileManager.default.createDirectory(at: output, withIntermediateDirectories: true) + let window = UIWindow(frame: UIScreen.main.bounds) + window.rootViewController = UIHostingController(rootView: HarnessRoot(state: state)) + window.overrideUserInterfaceStyle = .dark + self.window = window + window.makeKeyAndVisible() + NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main) { [weak self] _ in + self?.state.phase = .inactive + self?.record("application-willResignActive") + } + NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { [weak self] _ in + self?.state.phase = .active + self?.record("application-didBecomeActive") + } + after(1) { self.run() } + return true + } + + func after(_ seconds: Double, _ action: @escaping () -> Void) { + DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: action) + } + + func record(_ event: String, details: [String: Any] = [:]) { + var entry = details + entry["event"] = event + entry["uptime"] = ProcessInfo.processInfo.systemUptime - started + entry["scenario"] = state.scenario + events.append(entry) + let data = try! JSONSerialization.data(withJSONObject: events, options: [.prettyPrinted, .sortedKeys]) + try! data.write(to: output.appendingPathComponent("actions.json")) + } + + func elements() -> [NSObject] { + var found: [NSObject] = [] + var visited = Set() + func visit(_ object: NSObject, depth: Int) { + guard depth < 30, visited.insert(ObjectIdentifier(object)).inserted else { return } + if object.isAccessibilityElement { found.append(object) } + if let children = object.accessibilityElements { + for child in children { if let child = child as? NSObject { visit(child, depth: depth + 1) } } + } + let count = object.accessibilityElementCount() + if count > 0 && count < 1000 { + for index in 0.. [String: Any] in + let frame = node.accessibilityFrame + return ["class": String(describing: type(of: node)), "label": node.accessibilityLabel ?? "", "button": node.accessibilityTraits.contains(.button), "x": frame.minX, "y": frame.minY, "width": frame.width, "height": frame.height] + }] + details["phaseProbe"] = AppState.shared.phases + details["requestedPhase"] = String(describing: state.phase) + if activate { + let before = AppState.shared.captures.count + let button = nodes.first { node in + node.accessibilityTraits.contains(.button) && state.items.contains(where: { node.accessibilityLabel?.contains($0.title) == true }) + } + details["accessibilityActivateResult"] = button?.accessibilityActivate() ?? false + details["captureDelta"] = AppState.shared.captures.count - before + details["sink"] = AppState.shared.captures + } + if screenshot, let window { + let renderer = UIGraphicsImageRenderer(bounds: window.bounds) + let image = renderer.image { _ in window.drawHierarchy(in: window.bounds, afterScreenUpdates: true) } + try! image.pngData()!.write(to: output.appendingPathComponent(name + ".png")) + details["screenshot"] = name + ".png" + } + record(name, details: details) + } + + func set(_ scenario: String, items: [NoticeItem]) { + state.scenario = scenario + state.items = items + state.phase = .active + state.mounted = true + record("scenario-start") + } + + func run() { + let first = NoticeItem(title: "첫 번째 공지 안내", content: "

첫 번째 전체 본문

누락 없이 전달

", date: "2026-10-28") + let second = NoticeItem(title: "두 번째 서비스 소식", content: "

두 번째 전체 본문 & 보존

", date: "2026-10-27") + let third = NoticeItem(title: "세 번째 업데이트 안내", content: "

세 번째 전체 본문

\n마지막 줄", date: "2026-10-26") + let long = NoticeItem(title: "서비스 업데이트와 새로운 기능을 안내합니다 공지사항의 긴 한국어 제목을 끝까지 확인해 주세요", content: "

긴 제목의 전체 본문

", date: "2026-10-25") + if CommandLine.arguments.contains("--lifecycle") { + set("phase-probe", items: [first, second, third]) + after(0.8) { self.sample("phase-first") } + after(6.8) { self.sample("phase-before-inactive") } + after(8) { self.state.phase = .inactive; self.record("inject-inactive") } + after(8.8) { self.sample("phase-inactive-start") } + after(14.8) { self.sample("phase-inactive-after-6s") } + after(16) { self.state.phase = .active; self.record("inject-active") } + after(20.3) { self.sample("phase-active-before-5s") } + after(22.8) { self.sample("phase-active-next") } + after(25) { self.record("lifecycle-probe-finished") } + return + } + func stage(_ name: String, _ items: [NoticeItem], samples: [(Double, String)], duration: Double, next: @escaping () -> Void) { + self.set(name, items: items) + for (delay, identifier) in samples { + self.after(delay) { self.sample(identifier, activate: true) } + } + self.after(duration, next) + } + stage("zero", [], samples: [(0.7, "zero")], duration: 2) { + stage("one", [first], samples: [(0.7, "one-initial"), (6.8, "one-after-6s")], duration: 8) { + stage("two", [first, second], samples: [(0.7, "two-first"), (4.3, "two-before-5s"), (5.15, "two-transition-mid"), (6.8, "two-second"), (11.8, "two-wrap-first")], duration: 13) { + stage("three", [first, second, third], samples: [(0.7, "three-first"), (6.8, "three-second"), (11.8, "three-third"), (16.8, "three-wrap-first")], duration: 18) { + stage("long-korean", [long], samples: [(0.7, "long-korean-dark"), (2.7, "long-korean-light")], duration: 4) { + self.window?.overrideUserInterfaceStyle = .dark + stage("inactive-environment", [first, second, third], samples: [(6.8, "inactive-before"), (8.2, "inactive-start"), (14.3, "inactive-after-6s"), (19.3, "reactivated-before-5s"), (21.8, "reactivated-next")], duration: 23) { + self.state.scenario = "remount" + self.state.mounted = false + self.record("unmount-banner") + self.after(0.7) { self.sample("unmounted-start") } + self.after(6.8) { self.sample("unmounted-after-6s") } + self.after(7.5) { self.state.mounted = true; self.record("remount-banner") } + self.after(8.2) { self.sample("remounted-first", activate: true) } + self.after(11.8) { self.sample("remounted-before-5s") } + self.after(14.3) { self.sample("remounted-second", activate: true) } + self.after(16) { + stage("shrink-to-one", [first], samples: [(0.7, "shrink-reset-first"), (6.8, "shrink-one-after-6s")], duration: 8) { + stage("shrink-to-empty", [], samples: [(0.7, "shrink-empty")], duration: 2) { self.record("matrix-finished") } + } + } + } + self.after(7.5) { self.state.phase = .inactive; self.record("inject-scenePhase-inactive") } + self.after(15) { self.state.phase = .active; self.record("inject-scenePhase-active") } + } + self.after(1.7) { self.window?.overrideUserInterfaceStyle = .light } + } + } + } + } + } +} + +@main +struct NoticeQAEntry { + static func main() { UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(HarnessDelegate.self)) } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/MyPageNoticeRoller.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/MyPageNoticeRoller.swift new file mode 100644 index 00000000..bba4fe1f --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/MyPageNoticeRoller.swift @@ -0,0 +1,25 @@ +import Foundation + +struct MyPageNoticeRoller { + private var items: [NoticeItem] = [] + private(set) var index = 0 + + var current: NoticeItem? { + items.isEmpty ? nil : items[index] + } + + mutating func update(_ items: [NoticeItem]) { + guard self.items != items else { return } + self.items = items + index = 0 + } + + mutating func advance() { + guard items.count > 1 else { return } + index = (index + 1) % items.count + } + + func shouldRoll(isVisible: Bool, isActive: Bool) -> Bool { + items.count > 1 && isVisible && isActive + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/Spacing.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/Spacing.swift new file mode 100644 index 00000000..d3d65ea3 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/Spacing.swift @@ -0,0 +1,20 @@ +// +// Spacing.swift +// SodaLive +// + +import SwiftUI + +enum SodaSpacing { + static let s4: CGFloat = 4 + static let s6: CGFloat = 6 + static let s8: CGFloat = 8 + static let s12: CGFloat = 12 + static let s14: CGFloat = 14 + static let s16: CGFloat = 16 + static let s20: CGFloat = 20 + static let s24: CGFloat = 24 + static let s28: CGFloat = 28 + static let s32: CGFloat = 32 + static let s48: CGFloat = 48 +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/UpdateBannerView.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/UpdateBannerView.swift new file mode 100644 index 00000000..ec53ff0a --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/source/UpdateBannerView.swift @@ -0,0 +1,85 @@ +import SwiftUI + +struct UpdateBannerView: View { + private static let foregroundColor = Color(hex: "B0BEC5") + private static let rollInterval: TimeInterval = 5 + private static let transitionDuration: TimeInterval = 0.35 + + let items: [NoticeItem] + + @Environment(\.scenePhase) private var scenePhase + @Environment(\.accessibilityReduceMotion) private var reduceMotion + @State private var roller = MyPageNoticeRoller() + @State private var rollTimer: Timer? + @State private var isVisible = false + + var body: some View { + ZStack { + if let item = roller.current { + Button { + AppState.shared.setAppStep(step: .noticeDetail(notice: item)) + } label: { + HStack(spacing: SodaSpacing.s8) { + Text(item.title) + .appFont(.body3) + .lineLimit(1) + .truncationMode(.tail) + .frame(maxWidth: .infinity, alignment: .leading) + + Image(systemName: "chevron.right") + .frame(width: SodaSpacing.s24, height: SodaSpacing.s24) + .accessibilityHidden(true) + } + .foregroundColor(Self.foregroundColor) + .padding(.horizontal, SodaSpacing.s24) + .padding(.vertical, SodaSpacing.s6) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .id(roller.index) + .transition(reduceMotion ? .identity : .asymmetric( + insertion: .move(edge: .bottom), + removal: .move(edge: .top) + )) + } + } + .clipped() + .background(Color.black) + .onAppear { + isVisible = true + roller.update(items) + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + .onDisappear { + isVisible = false + stopRollTimer() + } + .onChange(of: items) { items in + roller.update(items) + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + .onChange(of: scenePhase) { scenePhase in + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + .onChange(of: reduceMotion) { reduceMotion in + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + } + + private func restartRollTimer(scenePhase: ScenePhase, reduceMotion: Bool) { + stopRollTimer() + guard roller.shouldRoll(isVisible: isVisible, isActive: scenePhase == .active) else { return } + + rollTimer = Timer.scheduledTimer(withTimeInterval: Self.rollInterval, repeats: true) { _ in + withAnimation(reduceMotion ? nil : .easeOut(duration: Self.transitionDuration)) { + roller.advance() + } + } + } + + private func stopRollTimer() { + rollTimer?.invalidate() + rollTimer = nil + } +} + diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/verification.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/verification.json new file mode 100644 index 00000000..02928b61 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/rerun-154222/verification.json @@ -0,0 +1,264 @@ +{ + "fresh_capture_count": 35, + "images": [ + { + "file": "lifecycle/phase-active-before-5s.png", + "sha256": "103a498d121e35cd7c0890cfdd0e9093b8dc99d822642dbd3ea8decf6830e9c7", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "lifecycle/phase-active-next.png", + "sha256": "a69fa393ba3c4cb35d59755608d8ba76bf9c0e8a6c47cb583a7ab4ffe2836bfe", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "lifecycle/phase-before-inactive.png", + "sha256": "103a498d121e35cd7c0890cfdd0e9093b8dc99d822642dbd3ea8decf6830e9c7", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "lifecycle/phase-first.png", + "sha256": "21584cbfbf9e646b76a04e8ea1a48bbffef57f018a8bf6b923056da1a3075d3d", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "lifecycle/phase-inactive-after-6s.png", + "sha256": "103a498d121e35cd7c0890cfdd0e9093b8dc99d822642dbd3ea8decf6830e9c7", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "lifecycle/phase-inactive-start.png", + "sha256": "103a498d121e35cd7c0890cfdd0e9093b8dc99d822642dbd3ea8decf6830e9c7", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/inactive-after-6s.png", + "sha256": "e079945c4c6991682cb9cd0d10341cb616242466e0508c6f00a0e61338bc481c", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/inactive-before.png", + "sha256": "e079945c4c6991682cb9cd0d10341cb616242466e0508c6f00a0e61338bc481c", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/inactive-start.png", + "sha256": "e079945c4c6991682cb9cd0d10341cb616242466e0508c6f00a0e61338bc481c", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/long-korean-dark.png", + "sha256": "811c747563f3c3eef3811054b17f96e3821bfa03a08413ab16b4fc92fd861f10", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/long-korean-light.png", + "sha256": "811c747563f3c3eef3811054b17f96e3821bfa03a08413ab16b4fc92fd861f10", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/one-after-6s.png", + "sha256": "d5bd330038376241762a2cd6cb723f072f32b0f125de774bab72f3d3fc426433", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/one-initial.png", + "sha256": "d5bd330038376241762a2cd6cb723f072f32b0f125de774bab72f3d3fc426433", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/reactivated-before-5s.png", + "sha256": "e079945c4c6991682cb9cd0d10341cb616242466e0508c6f00a0e61338bc481c", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/reactivated-next.png", + "sha256": "cd73444cafc0cce267b60e0c3d3cd5d72a1520c62e5297e6e5b56b560925d6b0", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/remounted-before-5s.png", + "sha256": "0d820088fe35e747f35e59fdd8854d4b1a85dea83d8d055770f9b97ace627cd9", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/remounted-first.png", + "sha256": "0d820088fe35e747f35e59fdd8854d4b1a85dea83d8d055770f9b97ace627cd9", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/remounted-second.png", + "sha256": "b782aa7eba591e190e60b8bc2b58c353fa358415f410384049eb2052e964c375", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/shrink-empty.png", + "sha256": "89f18c85fe95fa5a9a126cfee45e1185b7d21018943dae12e65939008ffa8fae", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/shrink-one-after-6s.png", + "sha256": "14a8d4fe2b9cb8df4d843c6337830efa1b8c304ea7a83313a48dd5945e434dbe", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/shrink-reset-first.png", + "sha256": "14a8d4fe2b9cb8df4d843c6337830efa1b8c304ea7a83313a48dd5945e434dbe", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/three-first.png", + "sha256": "6290705ceaea19c4bc7702ddcda83e30ab68ef1da46072121ab627e73f89ebb9", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/three-second.png", + "sha256": "5ad43d2dc2e39a53e31a08792b0d0280eb36a3ce46b0f29152a49db107f6b23f", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/three-third.png", + "sha256": "96494648b7e1653e83b620f3bf69c664921bd0bc3cf35da451430be2fd5469e4", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/three-wrap-first.png", + "sha256": "6290705ceaea19c4bc7702ddcda83e30ab68ef1da46072121ab627e73f89ebb9", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/two-before-5s.png", + "sha256": "a92e3ab9e7d8892eb19187f656f881861ee4ca0443a44c6282f0716a403a6186", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/two-first.png", + "sha256": "a92e3ab9e7d8892eb19187f656f881861ee4ca0443a44c6282f0716a403a6186", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/two-second.png", + "sha256": "028ac53f80d69ee0e693e33043133f4339b4cba38465e7d192ac1877689f2796", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/two-transition-mid.png", + "sha256": "028ac53f80d69ee0e693e33043133f4339b4cba38465e7d192ac1877689f2796", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/two-wrap-first.png", + "sha256": "a92e3ab9e7d8892eb19187f656f881861ee4ca0443a44c6282f0716a403a6186", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/unmounted-after-6s.png", + "sha256": "55600884241b926a4ff02b712cf7ea5162b5e937af192bbc7a177c7c4c4f5a43", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/unmounted-start.png", + "sha256": "55600884241b926a4ff02b712cf7ea5162b5e937af192bbc7a177c7c4c4f5a43", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "matrix/zero.png", + "sha256": "c8fabbad2e028ee0c2a89bc4841bf5b2233e2eb3ee33f1d25ae2d4e09f6069ad", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "os-before-background.png", + "sha256": "0a94d6d7f0f62d3f3bbda624e11181afdedb10c1b5a6f907635739432ef5ca29", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + }, + { + "file": "os-resume-after-7s.png", + "sha256": "3d30384a6e29c916d249edae751d0509723651e43aa9074ed3e1cfd21e012d38", + "width": 750, + "height": 1334, + "png_signature": "89504e470d0a1a0a" + } + ], + "checks": { + "zero_scenario_recorded": true, + "one_unchanged_after_6s": true, + "two_wraps_to_first": true, + "three_wraps_to_first": true, + "inactive_held": true, + "active_advances": true, + "os_resume_phase_events": [ + "application-willResignActive", + "application-didBecomeActive" + ] + }, + "physical_tap": "UNTESTED: no coordinate tool; accessibilityActivateResult=false and captureDelta=0", + "cleanup_pending": true +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/ActionCheck.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/ActionCheck.swift new file mode 100644 index 00000000..3c7abb40 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/ActionCheck.swift @@ -0,0 +1,46 @@ +import Foundation +enum AppStep { case noticeDetail(notice: NoticeItem) } +final class AppState { + static let shared = AppState() + var captured: NoticeItem? + func setAppStep(step: AppStep) { + switch step { case .noticeDetail(let notice): captured = notice } + } +} +@main struct NativeActionCheck { + static func main() throws { +let first = NoticeItem(title: "첫 번째 공지 안내", content: "

첫 번째 전체 본문

누락 없이 전달

", date: "2026-10-28") + let second = NoticeItem(title: "두 번째 서비스 소식", content: "

두 번째 전체 본문 & 보존

", date: "2026-10-27") + let third = NoticeItem(title: "세 번째 업데이트 안내", content: "

세 번째 전체 본문

\n마지막 줄", date: "2026-10-26") + let long = NoticeItem(title: "서비스 업데이트와 새로운 기능을 안내합니다 공지사항의 긴 한국어 제목을 끝까지 확인해 주세요", content: "

긴 제목의 전체 본문

", date: "2026-10-25") + + var records: [[String: Any]] = [] + for count in 0...3 { + let items = Array([first, second, third].prefix(count)) + var roller = MyPageNoticeRoller() + roller.update(items) + for offset in 0...max(count, 1) { + guard let item = roller.current else { + precondition(count == 0) + records.append(["count": count, "current": "none"]) + break + } + let callback = { AppState.shared.setAppStep(step: .noticeDetail(notice: item)) } + callback() + let expected = items[count > 1 ? offset % count : 0] + precondition(item == expected && AppState.shared.captured == expected) + records.append(["count": count, "offset": offset, "title": item.title, "content": item.content, "date": item.date, "payloadEqual": true]) + roller.advance() + } + } + var roller = MyPageNoticeRoller() + roller.update([long]) + let item = roller.current! + let callback = { AppState.shared.setAppStep(step: .noticeDetail(notice: item)) } + callback() + precondition(AppState.shared.captured == long) + records.append(["count": 1, "title": item.title, "content": item.content, "date": item.date, "payloadEqual": true]) + let data = try JSONSerialization.data(withJSONObject: ["surface": "actual state helper and extracted Button callback, NOT UI activation", "records": records], options: [.prettyPrinted, .sortedKeys]) + FileHandle.standardOutput.write(data) + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/ColorExtension.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/ColorExtension.swift new file mode 100644 index 00000000..742e4ad8 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/ColorExtension.swift @@ -0,0 +1,40 @@ +// +// ColorExtension.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// +// https://seons-dev.tistory.com/174 +// + +import SwiftUI + +extension Color { + init(hex: String) { + let scanner = Scanner(string: hex) + _ = scanner.scanString("#") + + var rgb: UInt64 = 0 + scanner.scanHexInt64(&rgb) + + let r = Double((rgb >> 16) & 0xFF) / 255.0 + let g = Double((rgb >> 8) & 0xFF) / 255.0 + let b = Double((rgb >> 0) & 0xFF) / 255.0 + self.init(red: r, green: g, blue: b) + } +} + +extension UIColor { + convenience init(hex: String, alpha: CGFloat = 1.0) { + let scanner = Scanner(string: hex) + _ = scanner.scanString("#") + + var rgb: UInt64 = 0 + scanner.scanHexInt64(&rgb) + + let r = Double((rgb >> 16) & 0xFF) / 255.0 + let g = Double((rgb >> 8) & 0xFF) / 255.0 + let b = Double((rgb >> 0) & 0xFF) / 255.0 + self.init(red: r, green: g, blue: b, alpha: alpha) + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/FontModifier.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/FontModifier.swift new file mode 100644 index 00000000..33ba84e5 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/FontModifier.swift @@ -0,0 +1,164 @@ +// +// FontModifier.swift +// SodaLive +// +// Created by klaus on 1/23/26. +// + +import SwiftUI + +enum SodaTypography { + case heading1 + case heading2 + case heading3 + case heading4 + case body1 + case body2 + case body3 + case body4 + case body5 + case body6 + case caption1 + case caption2 + case caption3 + + var size: CGFloat { + switch self { + case .heading1: + return 24 + case .heading2: + return 22 + case .heading3: + return 20 + case .heading4: + return 18 + case .body1, .body2, .body3: + return 16 + case .body4, .body5, .body6: + return 14 + case .caption1, .caption2, .caption3: + return 12 + } + } + + func localizedFontName(locale: Locale = .autoupdatingCurrent) -> String? { + fontName(for: .localized, weight: weight, locale: locale) + } + + var weight: SwiftUI.Font.Weight { + switch self { + case .heading1, .heading2, .heading3, .heading4, .body1, .body4, .caption1: + return .bold + case .body2, .body5, .caption2: + return .medium + case .body3, .body6, .caption3: + return .regular + } + } +} + +enum SodaFontFamily { + case localized + case pattaya + case phosphate +} + +private func resolvedLanguageCode(currentLocale: Locale) -> String? { + if let raw = UserDefaults.standard.string(forKey: "app.language"), + let option = LanguageOption(rawValue: raw), + option != .system { + return option.rawValue + } + return currentLocale.language.languageCode?.identifier +} + +private func koreanFontName(for weight: SwiftUI.Font.Weight) -> String { + switch weight { + case .bold: + return "Pretendard-Bold" + case .medium: + return "Pretendard-Medium" + case .light: + return "Pretendard-Light" + default: + return "Pretendard-Regular" + } +} + +private func japaneseFontName(for weight: SwiftUI.Font.Weight) -> String { + switch weight { + case .bold: + return "NotoSansJP-Bold" + case .medium: + return "NotoSansJP-Medium" + case .light: + return "NotoSansJP-Light" + default: + return "NotoSansJP-Regular" + } +} + +private func fontName(for family: SodaFontFamily, weight: SwiftUI.Font.Weight, locale: Locale) -> String? { + switch family { + case .localized: + switch resolvedLanguageCode(currentLocale: locale) { + case "ko": + return koreanFontName(for: weight) + case "ja": + return japaneseFontName(for: weight) + default: + return nil + } + case .pattaya: + return "Pattaya-Regular" + case .phosphate: + return "PhosphateSolid" + } +} + +struct FontModifier: ViewModifier { + @Environment(\.locale) private var locale + let size: CGFloat + let weight: SwiftUI.Font.Weight + let family: SodaFontFamily + + func body(content: Content) -> some View { + if let fontName = fontName(for: family, weight: weight, locale: locale) { + content.font(.custom(fontName, size: size)) + } else { + content.font(.system(size: size, weight: weight)) + } + } +} + +extension View { + func appFont( + size: CGFloat, + weight: SwiftUI.Font.Weight = .regular, + family: SodaFontFamily = .localized + ) -> some View { + self.modifier(FontModifier(size: size, weight: weight, family: family)) + } + + func appFont(_ typography: SodaTypography, family: SodaFontFamily = .localized) -> some View { + appFont(size: typography.size, weight: typography.weight, family: family) + } +} + +extension Text { + func appFont( + size: CGFloat, + weight: SwiftUI.Font.Weight = .regular, + family: SodaFontFamily = .localized + ) -> Text { + if let fontName = fontName(for: family, weight: weight, locale: .autoupdatingCurrent) { + return self.font(.custom(fontName, size: size)) + } + + return self.font(.system(size: size, weight: weight)) + } + + func appFont(_ typography: SodaTypography, family: SodaFontFamily = .localized) -> Text { + appFont(size: typography.size, weight: typography.weight, family: family) + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/GetNoticeResponse.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/GetNoticeResponse.swift new file mode 100644 index 00000000..6cbe3604 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/GetNoticeResponse.swift @@ -0,0 +1,19 @@ +// +// GetNoticeResponse.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import Foundation + +struct GetNoticeResponse: Decodable { + let totalCount: Int + let noticeList: [NoticeItem] +} + +struct NoticeItem: Decodable, Hashable { + let title: String + let content: String + let date: String +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/Harness.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/Harness.swift new file mode 100644 index 00000000..e7793dfd --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/Harness.swift @@ -0,0 +1,221 @@ +import SwiftUI +import UIKit + +enum LanguageOption: String { case system, ko, en, ja } + +enum AppStep { case noticeDetail(notice: NoticeItem) } + +final class AppState { + static let shared = AppState() + var captures: [[String: String]] = [] + var phases: [[String: String]] = [] + func setAppStep(step: AppStep) { + switch step { + case .noticeDetail(let notice): + captures.append(["title": notice.title, "content": notice.content, "date": notice.date]) + } + } +} + +struct PhaseProbe: View { + @Environment(\.scenePhase) private var phase + var body: some View { + Color.clear + .onAppear { AppState.shared.phases.append(["event": "appear", "phase": String(describing: phase)]) } + .onChange(of: phase) { value in AppState.shared.phases.append(["event": "change", "phase": String(describing: value)]) } + } +} + +final class HarnessState: ObservableObject { + @Published var items: [NoticeItem] = [] + @Published var mounted = true + @Published var phase = ScenePhase.active + @Published var scenario = "preparing" +} + +struct HarnessRoot: View { + @ObservedObject var state: HarnessState + var body: some View { + VStack(alignment: .leading, spacing: 0) { + VStack(alignment: .leading, spacing: 8) { + Text("NATIVE QA HARNESS").font(.headline) + Text(state.scenario).font(.caption.monospaced()) + Text("Actual UpdateBannerView below").font(.caption) + } + .foregroundStyle(.white) + .padding(24) + if state.mounted && !state.items.isEmpty { + UpdateBannerView(items: state.items) + .background(PhaseProbe()) + .environment(\.scenePhase, state.phase) + } + Text("Harness context / no network / no login") + .font(.caption) + .foregroundStyle(.gray) + .padding(24) + Spacer() + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + .background(Color(hex: "131313")) + .environment(\.locale, Locale(identifier: "ko_KR")) + } +} + +final class HarnessDelegate: NSObject, UIApplicationDelegate { + var window: UIWindow? + let state = HarnessState() + let started = ProcessInfo.processInfo.systemUptime + var events: [[String: Any]] = [] + let output = URL.documentsDirectory.appendingPathComponent(CommandLine.arguments.contains("--lifecycle") ? "lifecycle" : "matrix", isDirectory: true) + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { + UserDefaults.standard.set("ko", forKey: "app.language") + try! FileManager.default.createDirectory(at: output, withIntermediateDirectories: true) + let window = UIWindow(frame: UIScreen.main.bounds) + window.rootViewController = UIHostingController(rootView: HarnessRoot(state: state)) + window.overrideUserInterfaceStyle = .dark + self.window = window + window.makeKeyAndVisible() + NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main) { [weak self] _ in + self?.state.phase = .inactive + self?.record("application-willResignActive") + } + NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { [weak self] _ in + self?.state.phase = .active + self?.record("application-didBecomeActive") + } + after(1) { self.run() } + return true + } + + func after(_ seconds: Double, _ action: @escaping () -> Void) { + DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: action) + } + + func record(_ event: String, details: [String: Any] = [:]) { + var entry = details + entry["event"] = event + entry["uptime"] = ProcessInfo.processInfo.systemUptime - started + entry["scenario"] = state.scenario + events.append(entry) + let data = try! JSONSerialization.data(withJSONObject: events, options: [.prettyPrinted, .sortedKeys]) + try! data.write(to: output.appendingPathComponent("actions.json")) + } + + func elements() -> [NSObject] { + var found: [NSObject] = [] + var visited = Set() + func visit(_ object: NSObject, depth: Int) { + guard depth < 30, visited.insert(ObjectIdentifier(object)).inserted else { return } + if object.isAccessibilityElement { found.append(object) } + if let children = object.accessibilityElements { + for child in children { if let child = child as? NSObject { visit(child, depth: depth + 1) } } + } + let count = object.accessibilityElementCount() + if count > 0 && count < 1000 { + for index in 0.. [String: Any] in + let frame = node.accessibilityFrame + return ["class": String(describing: type(of: node)), "label": node.accessibilityLabel ?? "", "button": node.accessibilityTraits.contains(.button), "x": frame.minX, "y": frame.minY, "width": frame.width, "height": frame.height] + }] + details["phaseProbe"] = AppState.shared.phases + details["requestedPhase"] = String(describing: state.phase) + if activate { + let before = AppState.shared.captures.count + let button = nodes.first { node in + node.accessibilityTraits.contains(.button) && state.items.contains(where: { node.accessibilityLabel?.contains($0.title) == true }) + } + details["accessibilityActivateResult"] = button?.accessibilityActivate() ?? false + details["captureDelta"] = AppState.shared.captures.count - before + details["sink"] = AppState.shared.captures + } + if screenshot, let window { + let renderer = UIGraphicsImageRenderer(bounds: window.bounds) + let image = renderer.image { _ in window.drawHierarchy(in: window.bounds, afterScreenUpdates: true) } + try! image.pngData()!.write(to: output.appendingPathComponent(name + ".png")) + details["screenshot"] = name + ".png" + } + record(name, details: details) + } + + func set(_ scenario: String, items: [NoticeItem]) { + state.scenario = scenario + state.items = items + state.phase = .active + state.mounted = true + record("scenario-start") + } + + func run() { + let first = NoticeItem(title: "첫 번째 공지 안내", content: "

첫 번째 전체 본문

누락 없이 전달

", date: "2026-10-28") + let second = NoticeItem(title: "두 번째 서비스 소식", content: "

두 번째 전체 본문 & 보존

", date: "2026-10-27") + let third = NoticeItem(title: "세 번째 업데이트 안내", content: "

세 번째 전체 본문

\n마지막 줄", date: "2026-10-26") + let long = NoticeItem(title: "서비스 업데이트와 새로운 기능을 안내합니다 공지사항의 긴 한국어 제목을 끝까지 확인해 주세요", content: "

긴 제목의 전체 본문

", date: "2026-10-25") + if CommandLine.arguments.contains("--lifecycle") { + set("phase-probe", items: [first, second, third]) + after(0.8) { self.sample("phase-first") } + after(6.8) { self.sample("phase-before-inactive") } + after(8) { self.state.phase = .inactive; self.record("inject-inactive") } + after(8.8) { self.sample("phase-inactive-start") } + after(14.8) { self.sample("phase-inactive-after-6s") } + after(16) { self.state.phase = .active; self.record("inject-active") } + after(20.3) { self.sample("phase-active-before-5s") } + after(22.8) { self.sample("phase-active-next") } + after(25) { self.record("lifecycle-probe-finished") } + return + } + func stage(_ name: String, _ items: [NoticeItem], samples: [(Double, String)], duration: Double, next: @escaping () -> Void) { + self.set(name, items: items) + for (delay, identifier) in samples { + self.after(delay) { self.sample(identifier, activate: true) } + } + self.after(duration, next) + } + stage("zero", [], samples: [(0.7, "zero")], duration: 2) { + stage("one", [first], samples: [(0.7, "one-initial"), (6.8, "one-after-6s")], duration: 8) { + stage("two", [first, second], samples: [(0.7, "two-first"), (4.3, "two-before-5s"), (5.15, "two-transition-mid"), (6.8, "two-second"), (11.8, "two-wrap-first")], duration: 13) { + stage("three", [first, second, third], samples: [(0.7, "three-first"), (6.8, "three-second"), (11.8, "three-third"), (16.8, "three-wrap-first")], duration: 18) { + stage("long-korean", [long], samples: [(0.7, "long-korean-dark"), (2.7, "long-korean-light")], duration: 4) { + self.window?.overrideUserInterfaceStyle = .dark + stage("inactive-environment", [first, second, third], samples: [(6.8, "inactive-before"), (8.2, "inactive-start"), (14.3, "inactive-after-6s"), (19.3, "reactivated-before-5s"), (21.8, "reactivated-next")], duration: 23) { + self.state.scenario = "remount" + self.state.mounted = false + self.record("unmount-banner") + self.after(0.7) { self.sample("unmounted-start") } + self.after(6.8) { self.sample("unmounted-after-6s") } + self.after(7.5) { self.state.mounted = true; self.record("remount-banner") } + self.after(8.2) { self.sample("remounted-first", activate: true) } + self.after(11.8) { self.sample("remounted-before-5s") } + self.after(14.3) { self.sample("remounted-second", activate: true) } + self.after(16) { + stage("shrink-to-one", [first], samples: [(0.7, "shrink-reset-first"), (6.8, "shrink-one-after-6s")], duration: 8) { + stage("shrink-to-empty", [], samples: [(0.7, "shrink-empty")], duration: 2) { self.record("matrix-finished") } + } + } + } + self.after(7.5) { self.state.phase = .inactive; self.record("inject-scenePhase-inactive") } + self.after(15) { self.state.phase = .active; self.record("inject-scenePhase-active") } + } + self.after(1.7) { self.window?.overrideUserInterfaceStyle = .light } + } + } + } + } + } +} + +@main +struct NoticeQAEntry { + static func main() { UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(HarnessDelegate.self)) } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/Info.plist b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/Info.plist new file mode 100644 index 00000000..244d24c0 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/Info.plist @@ -0,0 +1,16 @@ + + + +CFBundleIdentifierlocal.sodalive.NoticeNativeQA +CFBundleExecutableNoticeNativeQA +CFBundleNameNoticeNativeQA +CFBundlePackageTypeAPPL +CFBundleVersion1 +CFBundleShortVersionString1.0 +LSRequiresIPhoneOS +MinimumOSVersion16.6 +UIDeviceFamily12 +UILaunchScreen +UIAppFontsPretendard-Regular.otf +UISupportedInterfaceOrientationsUIInterfaceOrientationPortrait + diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/MyPageNoticeRoller.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/MyPageNoticeRoller.swift new file mode 100644 index 00000000..bba4fe1f --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/MyPageNoticeRoller.swift @@ -0,0 +1,25 @@ +import Foundation + +struct MyPageNoticeRoller { + private var items: [NoticeItem] = [] + private(set) var index = 0 + + var current: NoticeItem? { + items.isEmpty ? nil : items[index] + } + + mutating func update(_ items: [NoticeItem]) { + guard self.items != items else { return } + self.items = items + index = 0 + } + + mutating func advance() { + guard items.count > 1 else { return } + index = (index + 1) % items.count + } + + func shouldRoll(isVisible: Bool, isActive: Bool) -> Bool { + items.count > 1 && isVisible && isActive + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/Spacing.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/Spacing.swift new file mode 100644 index 00000000..d3d65ea3 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/Spacing.swift @@ -0,0 +1,20 @@ +// +// Spacing.swift +// SodaLive +// + +import SwiftUI + +enum SodaSpacing { + static let s4: CGFloat = 4 + static let s6: CGFloat = 6 + static let s8: CGFloat = 8 + static let s12: CGFloat = 12 + static let s14: CGFloat = 14 + static let s16: CGFloat = 16 + static let s20: CGFloat = 20 + static let s24: CGFloat = 24 + static let s28: CGFloat = 28 + static let s32: CGFloat = 32 + static let s48: CGFloat = 48 +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/UpdateBannerView.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/UpdateBannerView.swift new file mode 100644 index 00000000..2e0c2d3b --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/source/UpdateBannerView.swift @@ -0,0 +1,84 @@ +import SwiftUI + +struct UpdateBannerView: View { + private static let foregroundColor = Color(hex: "B0BEC5") + private static let rollInterval: TimeInterval = 5 + private static let transitionDuration: TimeInterval = 0.35 + + let items: [NoticeItem] + + @Environment(\.scenePhase) private var scenePhase + @Environment(\.accessibilityReduceMotion) private var reduceMotion + @State private var roller = MyPageNoticeRoller() + @State private var rollTimer: Timer? + @State private var isVisible = false + + var body: some View { + ZStack { + if let item = roller.current { + Button { + AppState.shared.setAppStep(step: .noticeDetail(notice: item)) + } label: { + HStack(spacing: SodaSpacing.s8) { + Text(item.title) + .appFont(.body3) + .lineLimit(1) + .truncationMode(.tail) + .frame(maxWidth: .infinity, alignment: .leading) + + Image(systemName: "chevron.right") + .frame(width: SodaSpacing.s24, height: SodaSpacing.s24) + .accessibilityHidden(true) + } + .foregroundColor(Self.foregroundColor) + .padding(.horizontal, SodaSpacing.s24) + .padding(.vertical, SodaSpacing.s6) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .id(roller.index) + .transition(reduceMotion ? .identity : .asymmetric( + insertion: .move(edge: .bottom), + removal: .move(edge: .top) + )) + } + } + .clipped() + .background(Color.black) + .onAppear { + isVisible = true + roller.update(items) + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + .onDisappear { + isVisible = false + stopRollTimer() + } + .onChange(of: items) { items in + roller.update(items) + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + .onChange(of: scenePhase) { scenePhase in + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + .onChange(of: reduceMotion) { reduceMotion in + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + } + + private func restartRollTimer(scenePhase: ScenePhase, reduceMotion: Bool) { + stopRollTimer() + guard roller.shouldRoll(isVisible: isVisible, isActive: scenePhase == .active) else { return } + + rollTimer = Timer.scheduledTimer(withTimeInterval: Self.rollInterval, repeats: true) { _ in + withAnimation(reduceMotion ? nil : .easeOut(duration: Self.transitionDuration)) { + roller.advance() + } + } + } + + private func stopRollTimer() { + rollTimer?.invalidate() + rollTimer = nil + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/state-callback.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/state-callback.json new file mode 100644 index 00000000..cb5ad824 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/state-callback.json @@ -0,0 +1,88 @@ +{ + "records" : [ + { + "count" : 0, + "current" : "none" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 1, + "date" : "2026-10-28", + "offset" : 0, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 1, + "date" : "2026-10-28", + "offset" : 1, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 2, + "date" : "2026-10-28", + "offset" : 0, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

두 번째 전체 본문 & 보존<\/p>", + "count" : 2, + "date" : "2026-10-27", + "offset" : 1, + "payloadEqual" : true, + "title" : "두 번째 서비스 소식" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 2, + "date" : "2026-10-28", + "offset" : 2, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 3, + "date" : "2026-10-28", + "offset" : 0, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

두 번째 전체 본문 & 보존<\/p>", + "count" : 3, + "date" : "2026-10-27", + "offset" : 1, + "payloadEqual" : true, + "title" : "두 번째 서비스 소식" + }, + { + "content" : "

세 번째 전체 본문<\/p>\n마지막 줄", + "count" : 3, + "date" : "2026-10-26", + "offset" : 2, + "payloadEqual" : true, + "title" : "세 번째 업데이트 안내" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 3, + "date" : "2026-10-28", + "offset" : 3, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

긴 제목의 전체 본문<\/p>", + "count" : 1, + "date" : "2026-10-25", + "payloadEqual" : true, + "title" : "서비스 업데이트와 새로운 기능을 안내합니다 공지사항의 긴 한국어 제목을 끝까지 확인해 주세요" + } + ], + "surface" : "actual state helper and extracted Button callback, NOT UI activation" +} \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/verification.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/verification.json new file mode 100644 index 00000000..bc52ef95 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native-fix/verification.json @@ -0,0 +1,412 @@ +{ + "kind": "same native RED harness, one matrix + one lifecycle + OS resume", + "image_count": 36, + "images": [ + { + "file": "lifecycle/phase-active-before-5s.png", + "sha256": "103a498d121e35cd7c0890cfdd0e9093b8dc99d822642dbd3ea8decf6830e9c7", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "lifecycle/phase-active-next.png", + "sha256": "a69fa393ba3c4cb35d59755608d8ba76bf9c0e8a6c47cb583a7ab4ffe2836bfe", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "lifecycle/phase-before-inactive.png", + "sha256": "103a498d121e35cd7c0890cfdd0e9093b8dc99d822642dbd3ea8decf6830e9c7", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "lifecycle/phase-first.png", + "sha256": "21584cbfbf9e646b76a04e8ea1a48bbffef57f018a8bf6b923056da1a3075d3d", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "lifecycle/phase-inactive-after-6s.png", + "sha256": "103a498d121e35cd7c0890cfdd0e9093b8dc99d822642dbd3ea8decf6830e9c7", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "lifecycle/phase-inactive-start.png", + "sha256": "103a498d121e35cd7c0890cfdd0e9093b8dc99d822642dbd3ea8decf6830e9c7", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/inactive-after-6s.png", + "sha256": "e079945c4c6991682cb9cd0d10341cb616242466e0508c6f00a0e61338bc481c", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/inactive-before.png", + "sha256": "e079945c4c6991682cb9cd0d10341cb616242466e0508c6f00a0e61338bc481c", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/inactive-start.png", + "sha256": "e079945c4c6991682cb9cd0d10341cb616242466e0508c6f00a0e61338bc481c", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/long-korean-dark.png", + "sha256": "811c747563f3c3eef3811054b17f96e3821bfa03a08413ab16b4fc92fd861f10", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/long-korean-light.png", + "sha256": "811c747563f3c3eef3811054b17f96e3821bfa03a08413ab16b4fc92fd861f10", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/one-after-6s.png", + "sha256": "d5bd330038376241762a2cd6cb723f072f32b0f125de774bab72f3d3fc426433", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/one-initial.png", + "sha256": "d5bd330038376241762a2cd6cb723f072f32b0f125de774bab72f3d3fc426433", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/reactivated-before-5s.png", + "sha256": "e079945c4c6991682cb9cd0d10341cb616242466e0508c6f00a0e61338bc481c", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/reactivated-next.png", + "sha256": "cd73444cafc0cce267b60e0c3d3cd5d72a1520c62e5297e6e5b56b560925d6b0", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/remounted-before-5s.png", + "sha256": "0d820088fe35e747f35e59fdd8854d4b1a85dea83d8d055770f9b97ace627cd9", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/remounted-first.png", + "sha256": "0d820088fe35e747f35e59fdd8854d4b1a85dea83d8d055770f9b97ace627cd9", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/remounted-second.png", + "sha256": "b782aa7eba591e190e60b8bc2b58c353fa358415f410384049eb2052e964c375", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/shrink-empty.png", + "sha256": "89f18c85fe95fa5a9a126cfee45e1185b7d21018943dae12e65939008ffa8fae", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/shrink-one-after-6s.png", + "sha256": "14a8d4fe2b9cb8df4d843c6337830efa1b8c304ea7a83313a48dd5945e434dbe", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/shrink-reset-first.png", + "sha256": "14a8d4fe2b9cb8df4d843c6337830efa1b8c304ea7a83313a48dd5945e434dbe", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/three-first.png", + "sha256": "6290705ceaea19c4bc7702ddcda83e30ab68ef1da46072121ab627e73f89ebb9", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/three-second.png", + "sha256": "5ad43d2dc2e39a53e31a08792b0d0280eb36a3ce46b0f29152a49db107f6b23f", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/three-third.png", + "sha256": "96494648b7e1653e83b620f3bf69c664921bd0bc3cf35da451430be2fd5469e4", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/three-wrap-first.png", + "sha256": "6290705ceaea19c4bc7702ddcda83e30ab68ef1da46072121ab627e73f89ebb9", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/two-before-5s.png", + "sha256": "a92e3ab9e7d8892eb19187f656f881861ee4ca0443a44c6282f0716a403a6186", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/two-first.png", + "sha256": "a92e3ab9e7d8892eb19187f656f881861ee4ca0443a44c6282f0716a403a6186", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/two-second.png", + "sha256": "028ac53f80d69ee0e693e33043133f4339b4cba38465e7d192ac1877689f2796", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/two-transition-mid.png", + "sha256": "028ac53f80d69ee0e693e33043133f4339b4cba38465e7d192ac1877689f2796", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/two-wrap-first.png", + "sha256": "a92e3ab9e7d8892eb19187f656f881861ee4ca0443a44c6282f0716a403a6186", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/unmounted-after-6s.png", + "sha256": "55600884241b926a4ff02b712cf7ea5162b5e937af192bbc7a177c7c4c4f5a43", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/unmounted-start.png", + "sha256": "55600884241b926a4ff02b712cf7ea5162b5e937af192bbc7a177c7c4c4f5a43", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "matrix/zero.png", + "sha256": "c8fabbad2e028ee0c2a89bc4841bf5b2233e2eb3ee33f1d25ae2d4e09f6069ad", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "os-before-background.png", + "sha256": "ca8e4b285cde47c750897384a50231d9d523ee23a6aacfea0fa34251f4f13044", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "os-resume-after-6s.png", + "sha256": "79bdf7933a64f11087975ca9e848d95d7d2be846e5f8c363f86e72124eb391fa", + "width": 750, + "height": 1334, + "fresh": true + }, + { + "file": "os-resume-initial.png", + "sha256": "65c773fef1546972fc644c96fa1e8a1b11c2635cbbda55723f2dfb0df5059487", + "width": 750, + "height": 1334, + "fresh": true + } + ], + "image_equality_checks": [ + { + "first": "matrix/one-initial.png", + "second": "matrix/one-after-6s.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "matrix/two-first.png", + "second": "matrix/two-before-5s.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "matrix/two-first.png", + "second": "matrix/two-second.png", + "expectedIdenticalPNG": false, + "actualIdenticalPNG": false, + "pass": true + }, + { + "first": "matrix/two-first.png", + "second": "matrix/two-wrap-first.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "matrix/three-first.png", + "second": "matrix/three-second.png", + "expectedIdenticalPNG": false, + "actualIdenticalPNG": false, + "pass": true + }, + { + "first": "matrix/three-second.png", + "second": "matrix/three-third.png", + "expectedIdenticalPNG": false, + "actualIdenticalPNG": false, + "pass": true + }, + { + "first": "matrix/three-first.png", + "second": "matrix/three-wrap-first.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "matrix/inactive-before.png", + "second": "matrix/inactive-start.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "matrix/inactive-start.png", + "second": "matrix/inactive-after-6s.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "matrix/inactive-after-6s.png", + "second": "matrix/reactivated-before-5s.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "matrix/reactivated-before-5s.png", + "second": "matrix/reactivated-next.png", + "expectedIdenticalPNG": false, + "actualIdenticalPNG": false, + "pass": true + }, + { + "first": "matrix/unmounted-start.png", + "second": "matrix/unmounted-after-6s.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "matrix/remounted-first.png", + "second": "matrix/remounted-before-5s.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "matrix/remounted-first.png", + "second": "matrix/remounted-second.png", + "expectedIdenticalPNG": false, + "actualIdenticalPNG": false, + "pass": true + }, + { + "first": "matrix/shrink-reset-first.png", + "second": "matrix/shrink-one-after-6s.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "lifecycle/phase-inactive-start.png", + "second": "lifecycle/phase-inactive-after-6s.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "lifecycle/phase-inactive-after-6s.png", + "second": "lifecycle/phase-active-before-5s.png", + "expectedIdenticalPNG": true, + "actualIdenticalPNG": true, + "pass": true + }, + { + "first": "lifecycle/phase-active-before-5s.png", + "second": "lifecycle/phase-active-next.png", + "expectedIdenticalPNG": false, + "actualIdenticalPNG": false, + "pass": true + }, + { + "first": "os-resume-initial.png", + "second": "os-resume-after-6s.png", + "expectedIdenticalPNG": false, + "actualIdenticalPNG": false, + "pass": true + } + ], + "failed_checks": [], + "long_title_render_unchanged_from_RED": { + "long-korean-dark.png": true, + "long-korean-light.png": true + }, + "expected_corrected": { + "matrix/reactivated-before-5s.png": "두 번째 서비스 소식", + "matrix/reactivated-next.png": "세 번째 업데이트 안내" + }, + "hit_area_proof": { + "surface": "source ownership and unchanged native pixels, not a physical tap", + "label_width_pt": 375, + "label_height_pt": 36, + "horizontal_padding_inside_label_pt": 24, + "vertical_padding_inside_label_pt": 6, + "contentShape_after_padding": true + }, + "physical_tap": "UNTESTED, no coordinate tap tool; retained native accessibility activation returned false", + "reduce_motion_runtime": "UNTESTED; new callback value is explicitly passed to timer animation choice" +} \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/README.md b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/README.md new file mode 100644 index 00000000..b08d5972 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/README.md @@ -0,0 +1,86 @@ +# 마이 탭 공지사항 Native QA 증거 + +**판정: NEEDS WORK. 비활성 중 롤링 중지 및 활성 복귀 후 재개(S5)가 실패했다. 제품 코드는 수정하지 않았다.** + +## 실행 범위와 출처 + +이 증거는 전체 SodaLive 앱이 아니라 실제 `UpdateBannerView`를 실행한 **native UIKit + SwiftUI UIHostingController 하네스**다. 로그인·서버 요청·실사용자 데이터는 사용하지 않았다. 하네스 및 빌드 캐시는 작업 전용 TMP에만 생성했고 제품 프로젝트에 추가하지 않았다. + +- 환경: Xcode 26.0 / SDK 26.0, Intel `x86_64`, iPhone SE 3세대 시뮬레이터, iOS 18.3 런타임, 375pt 폭, PNG 750×1334px. +- 소유 device: `B929E0F0-50F7-46C1-988E-95272D0CE7A2`, bundle: `local.sodalive.NoticeNativeQA`. +- 복수 구현 존재 확인 후 관련 제품 파일이 15초간 동일한 것을 확인했다. 마지막 네이티브 실행 종료 후에도 모든 제품 입력 해시가 동일했다. [provenance.json](provenance.json) 참고. +- `MyPageView.swift` SHA-256: `86a3dee7a4f2ce5bfa99624ff08c0b8eb7c1e88556fc5c04458f7ed2f72c7638`. +- 원본 `UpdateBannerView` 블록 SHA-256: `828d5737650436db9a69fd98efc3475362d7045285d2fb8dbdd17870d57047a6`. [추출본](source/UpdateBannerView.swift)은 블록을 변경하지 않고 `import SwiftUI`만 앞에 추가했다. + +`MyPageNoticeRoller`, `NoticeItem` 포함 응답 파일, `FontModifier`, `ColorExtension`, `SodaSpacing`도 실제 소스를 컴파일했다. 실제 `Pretendard-Regular.otf`를 등록했다. `AppState`/`AppStep`은 title/content/date 수집 sink로, `LanguageOption`은 폰트 선택에 필요한 enum case로 대체했다. 마이 페이지 주변부만 fixture·mount·phase 드라이버 및 QA 설명으로 대체했다. 빈 배열의 부모 조건도 현재 제품의 `!latestNotices.isEmpty`와 동일하게 구성했다. + +`PhaseProbe`는 배너 소스를 변경하지 않는 투명한 sibling이며 같은 환경의 실제 `scenePhase` 변경을 기록한다. 실제 OS 복귀 검사는 UIKit notification을 환경에 전달하는 하네스 bridge를 사용했다. 제품 앱의 전체 SwiftUI Scene/탭 라우팅을 검증했다는 뜻은 아니다. + +## 증거 목록 + +| 경로 | 내용 | +|---|---| +| `matrix/` | 현재 소스의 0/1/2/3, 긴 제목, inactive/active, unmount/remount, 축소 시나리오 27 PNG 및 `actions.json` | +| `lifecycle/` | phase 전달 자체를 기록한 별도 재현 6 PNG 및 `actions.json` | +| `os-*.png`, `os-lifecycle-actions.json` | 실제 Settings 앱으로 background 이동 후 동일 PID로 복귀한 시뮬레이터 화면 3 PNG 및 native lifecycle notification | +| `state-callback.json`, `source/ActionCheck.swift` | 실제 상태 helper와 원본 Button 콜백의 별도 드라이버. 10건의 title/전체 HTML 본문/date 동일성 검사와 빈 상태 검사 | +| `verification.json`, `ocr.json`, `provenance.json` | 36 PNG의 signature/크기/해시/신선도, Vision OCR 보조 자료, 관측값과 실패 목록, 실제 소스·하네스 출처 | + +`matrix/`와 `lifecycle/`는 실제 window에 대한 `UIGraphicsImageRenderer` + `drawHierarchy(afterScreenUpdates: true)`로 캡처했다. OS 전환 3장은 `simctl io screenshot`이다. 모든 PNG는 최종 하네스 소스 작성 이후 생성됐고 750×1334px다. 합성 화면이나 웹 대체물은 없다. `two-transition-mid.png`는 전환 시점 캡처 시도이며 정확한 중간 프레임이나 애니메이션 성능을 보증하지 않는다. + +before 이미지는 만들지 않았다. 비교 기준은 제공된 기존 title + Spacer + `자세히`/arrow 구조뿐이며, git HEAD 추출·기준 이미지 생성은 하지 않았다. + +## 관측 결과 + +| 시나리오 | 판정 | 실제 관측과 증거 | +|---|---|---| +| 0개 | PASS | `matrix/zero.png`: 배너·화살표 없음 | +| 1개 | PASS | `one-initial.png` → `one-after-6s.png`: 시나리오 시작 6.89초 후에도 첫 항목 | +| 2개 | PASS | `two-first.png` → `two-second.png` → `two-wrap-first.png`: 첫째 → 둘째 → 첫째. 4.39초 샘플은 첫째, 7.03초는 둘째, 12.21초는 첫째 | +| 3개 | PASS | `three-first.png` → `three-second.png` → `three-third.png` → `three-wrap-first.png`: 0.82/6.89/12.05/17.01초에 첫째/둘째/셋째/첫째 | +| 긴 한국어 제목·arrow-only | PASS | `long-korean-dark.png`, `long-korean-light.png`: `자세히` 없음, 제목 한 줄 tail truncation, chevron 유지, 겹침 없음. 375pt에서 소스상 제목 예산은 295pt = 375−48−24−8. before 대비 픽셀 증가는 측정하지 않음 | +| inactive 중 중지 | **FAIL** | `inactive-start.png`의 둘째가 `inactive-after-6s.png`에서 셋째가 됨. 두 시점 모두 probe는 inactive | +| active 복귀 후 재개 | **FAIL** | 실제 active 전달 이후 6.78초가 지나도 셋째 유지. 별도 `lifecycle/phase-active-next.png`에서도 active 주입 후 7.19초 이상 셋째 유지 | +| 실제 OS background/복귀 | **FAIL / 하네스 범위** | Settings 앱 이동 시 willResignActive, 같은 PID 복귀 시 didBecomeActive 기록. `os-resume-initial.png`와 `os-resume-after-7s.png`가 같은 첫 항목이며 PNG 해시도 동일. 두 캡처 간 실제 간격은 9.71초 | +| unmount/remount | PASS / 관측 범위 | 6초 이상 배너 없음. remount 후 첫째, 5초 전 샘플 첫째, 이후 둘째. 장시간 중복 타이머 부재까지 증명하지 않음 | +| 3→1→0 | PASS | `shrink-reset-first.png`에서 첫째로 초기화, 6.88초 후 고정, `shrink-empty.png`에서 숨김 | + +5초 간격 자체는 원본의 `Timer.scheduledTimer(withTimeInterval: 5, repeats: true)`를 그대로 사용했다. 표의 시간은 실제 callback 이후 캡처 완료 uptime이며 시나리오 시작 이후 값이다. 스케줄링 지연이 있으므로 정밀한 5.000초 주기·성능 통과로 해석하지 않는다. 배너 순환을 하네스 알고리즘으로 복제하거나 타이머를 빠르게 바꾸지 않았다. + +### 생명주기 실패 재현 + +1. 3개 항목을 표시하고 둘째 항목이 될 때까지 실제 타이머를 기다린다. +2. `scenePhase = .inactive`를 주입한다. probe가 inactive를 읽었음을 로그로 확인한다. +3. 6초 이상 기다린다. 둘째가 유지돼야 하지만 셋째로 바뀐다. +4. `scenePhase = .active`를 주입하고 7초 이상 기다린다. probe는 active지만 셋째가 그대로다. + +이 실패는 matrix와 별도 lifecycle 실행에서 모두 재현했다. 조사 대상은 `MyPageView.swift`의 `.onChange(of: scenePhase)`와 `restartRollTimer()`다. new phase 인자를 무시하고 캡처한 환경 값을 다시 읽는 경로를 우선 확인할 필요가 있으나, 원인 수정이나 대체 제품 구현은 이 QA에서 수행하지 않았다. + +## 상호작용 검증 경계 + +**배너 탭·접근성 버튼 활성화는 통과가 아니다.** 하네스의 공개 UIKit 접근성 traversal은 actionable node를 반환하지 않았다. `accessibilityActivateResult=false`, `captureDelta=0`, native GUI sink는 비어 있다. native 화면을 눌렀다거나 실제 detail 화면으로 이동했다고 주장하지 않는다. + +별도 macOS Swift 드라이버는 실제 `MyPageNoticeRoller.current`/`advance()`와 제품 Button에서 그대로 추출한 `AppState.shared.setAppStep(step: .noticeDetail(notice: item))` 콜백을 실행했다. 항목별 title, 전체 HTML content, 원문 date가 sink에 그대로 전달됨을 확인했다. 이것은 상태/콜백 수준 증거이며 화면에 보이는 버튼의 물리적 hit-testing 증거가 아니다. + +미검증: 실제 터치·hit area·detail 화면 렌더링, full MyPage/탭 통합, 로그인·API·실서버·오류 정책, iOS16.6 실제 런타임, 실기기, Dynamic Type·가로모드·다른 폭, VoiceOver 포커스, Reduce Motion 설정 경로, 애니메이션 매끄러움·중단·장시간 타이머 중복. 버튼 label의 소스 높이는 24pt이고 배너 외부 세로 padding은 각각 6pt다. 44pt 터치 영역 확보 여부는 별도 검토가 필요하다. + +## 실행 명령과 정리 + +전체 인자·exit code·stdout/stderr·실행 시각은 `commands-matrix.json`, `commands-lifecycle.json`, `commands-os-lifecycle.json`에 기록했다. 아래는 실제 사용한 명령 형태다. `$QA_ROOT`는 작업 종료 시 삭제된 전용 TMP다. + +```bash +export QA_ROOT=/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk +export TMPDIR="$QA_ROOT/tmp/" +export NODE_COMPILE_CACHE="$QA_ROOT/node-cache" +export BUN_RUNTIME_TRANSPILER_CACHE_PATH="$QA_ROOT/bun-cache" +xcrun --sdk iphonesimulator swiftc -sdk "$(xcrun --sdk iphonesimulator --show-sdk-path)" -target x86_64-apple-ios16.6-simulator -module-cache-path "$QA_ROOT/swift-module-cache" "$QA_ROOT/source/"*.swift -o "$QA_ROOT/app/NoticeNativeQA.app/NoticeNativeQA" +xcrun simctl install B929E0F0-50F7-46C1-988E-95272D0CE7A2 "$QA_ROOT/app/NoticeNativeQA.app" +xcrun simctl launch B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA +xcrun simctl launch B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA --lifecycle +xcrun simctl launch B929E0F0-50F7-46C1-988E-95272D0CE7A2 com.apple.Preferences +xcrun simctl io B929E0F0-50F7-46C1-988E-95272D0CE7A2 screenshot "$QA_ROOT/os-resume-after-7s.png" +``` + +제품 소스 컴파일·설치·실행은 exit 0이었다. 초기 arm64 산출물은 Intel 시뮬레이터에서 설치 거부됐고 x86_64로 해결했다. 하네스 준비 중 read-only `accessibilityReduceMotion` 환경 주입은 컴파일 불가여서 제거했으며 Reduce Motion은 미검증으로 남겼다. 공유 캐시 삭제나 라이브러리 설치는 하지 않았다. 실행 당시 임시 컴파일 디렉터리에는 별도 `ActionCheck.swift`가 없었고, 보존본은 재현을 위해 `source/`에 함께 두었으므로 그 파일을 native 앱 컴파일에 함께 넣으면 안 된다. + +`cleanup.json`이 소유 하네스/Settings 프로세스 종료, 소유 시뮬레이터 shutdown·삭제, TMP root 삭제의 명령과 최종 부재 확인 영수증이다. 전체 앱 빌드·제품 회귀 테스트·독립 리뷰는 부모 작업 범위이며 이 기록은 그 통과를 대신하지 않는다. diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/cleanup.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/cleanup.json new file mode 100644 index 00000000..42599cbe --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/cleanup.json @@ -0,0 +1,55 @@ +{ + "ownership": { + "root": "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk", + "device": "B929E0F0-50F7-46C1-988E-95272D0CE7A2", + "bundle": "local.sodalive.NoticeNativeQA", + "processes": [ + 48086 + ], + "cleanup": "terminate owned bundle, shutdown/delete owned device, remove owned TMP root only" + }, + "commands": [ + { + "command": "xcrun simctl terminate B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA", + "exit": 0, + "stdout": "", + "stderr": "" + }, + { + "command": "xcrun simctl terminate B929E0F0-50F7-46C1-988E-95272D0CE7A2 com.apple.Preferences", + "exit": 0, + "stdout": "", + "stderr": "" + }, + { + "command": "xcrun simctl shutdown B929E0F0-50F7-46C1-988E-95272D0CE7A2", + "exit": 0, + "stdout": "", + "stderr": "" + }, + { + "command": "xcrun simctl delete B929E0F0-50F7-46C1-988E-95272D0CE7A2", + "exit": 0, + "stdout": "", + "stderr": "" + }, + { + "command": "xcrun simctl list devices -j", + "exit": 0, + "stdout": "{\n \"devices\" : {\n \"com.apple.CoreSimulator.SimRuntime.watchOS-8-3\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BB13E9AA-62BB-48EB-870A-A2A24C4B9992\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BB13E9AA-62BB-48EB-870A-A2A24C4B9992\",\n \"udid\" : \"BB13E9AA-62BB-48EB-870A-A2A24C4B9992\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-45mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 45mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/50D593D4-D38C-4205-8AE4-A91C98EC2087\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/50D593D4-D38C-4205-8AE4-A91C98EC2087\",\n \"udid\" : \"50D593D4-D38C-4205-8AE4-A91C98EC2087\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-41mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 41mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/17571B1C-12BD-47CB-BFD8-0463EF9DBABF\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/17571B1C-12BD-47CB-BFD8-0463EF9DBABF\",\n \"udid\" : \"17571B1C-12BD-47CB-BFD8-0463EF9DBABF\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/644DA220-FA54-4E04-84A3-5012996CD6A9\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/644DA220-FA54-4E04-84A3-5012996CD6A9\",\n \"udid\" : \"644DA220-FA54-4E04-84A3-5012996CD6A9\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 40mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BF239C2C-1141-497F-9FEA-74A1A2BFBE74\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BF239C2C-1141-497F-9FEA-74A1A2BFBE74\",\n \"udid\" : \"BF239C2C-1141-497F-9FEA-74A1A2BFBE74\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/678EFFC7-7552-49FF-9C71-7E5DC7A175B3\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/678EFFC7-7552-49FF-9C71-7E5DC7A175B3\",\n \"udid\" : \"678EFFC7-7552-49FF-9C71-7E5DC7A175B3\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 40mm\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.tvOS-14-3\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EBEF8EF4-B7F0-456A-98CB-4DC0C891B8E8\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EBEF8EF4-B7F0-456A-98CB-4DC0C891B8E8\",\n \"udid\" : \"EBEF8EF4-B7F0-456A-98CB-4DC0C891B8E8\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/53C81E09-E8CB-41A4-9ACD-C68AD85439CA\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/53C81E09-E8CB-41A4-9ACD-C68AD85439CA\",\n \"udid\" : \"53C81E09-E8CB-41A4-9ACD-C68AD85439CA\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (at 1080p)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/FA220C1A-2E8C-4412-931E-31E3B37BFEE7\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/FA220C1A-2E8C-4412-931E-31E3B37BFEE7\",\n \"udid\" : \"FA220C1A-2E8C-4412-931E-31E3B37BFEE7\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.tvOS-15-4\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2855076F-2C47-4D7A-BC73-7A4809D5ADE6\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2855076F-2C47-4D7A-BC73-7A4809D5ADE6\",\n \"udid\" : \"2855076F-2C47-4D7A-BC73-7A4809D5ADE6\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-4K\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/01365AF3-7D83-4DE1-A01F-420C0B9D7553\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/01365AF3-7D83-4DE1-A01F-420C0B9D7553\",\n \"udid\" : \"01365AF3-7D83-4DE1-A01F-420C0B9D7553\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (at 1080p) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/FE558F45-7348-43EB-99B3-5E4FDD5AB5D2\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/FE558F45-7348-43EB-99B3-5E4FDD5AB5D2\",\n \"udid\" : \"FE558F45-7348-43EB-99B3-5E4FDD5AB5D2\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-26-0\" : [\n {\n \"lastBootedAt\" : \"2026-10-13T15:18:39Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E9FC7721-AA96-440F-8349-2DC4B85F40F5\\/data\",\n \"dataPathSize\" : 3471380480,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E9FC7721-AA96-440F-8349-2DC4B85F40F5\",\n \"udid\" : \"E9FC7721-AA96-440F-8349-2DC4B85F40F5\",\n \"isAvailable\" : true,\n \"logPathSize\" : 516096,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-17-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 17 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/8B2F8CC9-E408-46D0-AB04-86C095C47E43\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/8B2F8CC9-E408-46D0-AB04-86C095C47E43\",\n \"udid\" : \"8B2F8CC9-E408-46D0-AB04-86C095C47E43\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-17-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 17 Pro Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5BBE432B-8329-47E1-84F2-AD2C402F9CC3\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5BBE432B-8329-47E1-84F2-AD2C402F9CC3\",\n \"udid\" : \"5BBE432B-8329-47E1-84F2-AD2C402F9CC3\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-Air\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone Air\"\n },\n {\n \"lastBootedAt\" : \"2026-07-20T09:42:05Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EC77E67D-CE64-498F-BBA2-F168368CC25D\\/data\",\n \"dataPathSize\" : 2494439424,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EC77E67D-CE64-498F-BBA2-F168368CC25D\",\n \"udid\" : \"EC77E67D-CE64-498F-BBA2-F168368CC25D\",\n \"isAvailable\" : true,\n \"logPathSize\" : 417792,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-17\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 17\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5D20D331-C35B-4DD3-BA2B-6ECE680C3D86\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5D20D331-C35B-4DD3-BA2B-6ECE680C3D86\",\n \"udid\" : \"5D20D331-C35B-4DD3-BA2B-6ECE680C3D86\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16e\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16e\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/55FB4A3B-790E-4122-B0FD-43B72BDCA02E\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/55FB4A3B-790E-4122-B0FD-43B72BDCA02E\",\n \"udid\" : \"55FB4A3B-790E-4122-B0FD-43B72BDCA02E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 11-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/401AEB64-1B6F-479D-9BDD-4E7532E11469\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/401AEB64-1B6F-479D-9BDD-4E7532E11469\",\n \"udid\" : \"401AEB64-1B6F-479D-9BDD-4E7532E11469\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-13-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 13-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7A3DA0DF-2EE7-4246-8A1F-EB1BF737819B\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7A3DA0DF-2EE7-4246-8A1F-EB1BF737819B\",\n \"udid\" : \"7A3DA0DF-2EE7-4246-8A1F-EB1BF737819B\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-A17-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (A17 Pro)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E51A96B1-A61A-42DF-8F20-5B13077AE5D3\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E51A96B1-A61A-42DF-8F20-5B13077AE5D3\",\n \"udid\" : \"E51A96B1-A61A-42DF-8F20-5B13077AE5D3\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-A16\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (A16)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1D9FC9BB-EAD0-4C04-B26E-F4EBC5ECA80E\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1D9FC9BB-EAD0-4C04-B26E-F4EBC5ECA80E\",\n \"udid\" : \"1D9FC9BB-EAD0-4C04-B26E-F4EBC5ECA80E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-13-inch-M3\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 13-inch (M3)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7FA60982-6001-4EF1-9ED7-336EF4B0BB98\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7FA60982-6001-4EF1-9ED7-336EF4B0BB98\",\n \"udid\" : \"7FA60982-6001-4EF1-9ED7-336EF4B0BB98\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-11-inch-M3\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 11-inch (M3)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.watchOS-8-0\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0F2CD8F8-E3DD-4B60-A2EA-452790111CB6\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0F2CD8F8-E3DD-4B60-A2EA-452790111CB6\",\n \"udid\" : \"0F2CD8F8-E3DD-4B60-A2EA-452790111CB6\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-45mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 45mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D26A6F84-40C8-493B-A25D-B61FB47EE6CD\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D26A6F84-40C8-493B-A25D-B61FB47EE6CD\",\n \"udid\" : \"D26A6F84-40C8-493B-A25D-B61FB47EE6CD\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-41mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 41mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/83B16730-F6B1-4573-B32D-C66E881B0411\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/83B16730-F6B1-4573-B32D-C66E881B0411\",\n \"udid\" : \"83B16730-F6B1-4573-B32D-C66E881B0411\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/350CC54D-07DC-4646-9F31-7AAE9DA53D8F\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/350CC54D-07DC-4646-9F31-7AAE9DA53D8F\",\n \"udid\" : \"350CC54D-07DC-4646-9F31-7AAE9DA53D8F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 40mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/376B4CE7-8557-460D-A513-85C15D31A547\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/376B4CE7-8557-460D-A513-85C15D31A547\",\n \"udid\" : \"376B4CE7-8557-460D-A513-85C15D31A547\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/53E9955A-C6CC-479B-9066-07BA91442BCE\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/53E9955A-C6CC-479B-9066-07BA91442BCE\",\n \"udid\" : \"53E9955A-C6CC-479B-9066-07BA91442BCE\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 40mm\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.tvOS-15-2\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C429D66F-D4C5-44D4-B62C-D02CAC056566\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C429D66F-D4C5-44D4-B62C-D02CAC056566\",\n \"udid\" : \"C429D66F-D4C5-44D4-B62C-D02CAC056566\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-4K\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DB4F01B7-F7E2-4209-896E-CD352A2C9096\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DB4F01B7-F7E2-4209-896E-CD352A2C9096\",\n \"udid\" : \"DB4F01B7-F7E2-4209-896E-CD352A2C9096\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (at 1080p) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/54B8CC4C-05A3-4870-A64F-EF52856FC38E\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/54B8CC4C-05A3-4870-A64F-EF52856FC38E\",\n \"udid\" : \"54B8CC4C-05A3-4870-A64F-EF52856FC38E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-13-7\" : [\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/FC339DD9-BF4F-49C3-9D76-B6DDDCFE5239\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/FC339DD9-BF4F-49C3-9D76-B6DDDCFE5239\",\n \"udid\" : \"FC339DD9-BF4F-49C3-9D76-B6DDDCFE5239\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (2nd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/3D83634F-1277-43CA-BA3A-DF63AE50C5D4\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/3D83634F-1277-43CA-BA3A-DF63AE50C5D4\",\n \"udid\" : \"3D83634F-1277-43CA-BA3A-DF63AE50C5D4\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/81F6BDD5-AB53-4017-AD9B-63B9797E2AB3\\/data\",\n \"dataPathSize\" : 501202944,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/81F6BDD5-AB53-4017-AD9B-63B9797E2AB3\",\n \"udid\" : \"81F6BDD5-AB53-4017-AD9B-63B9797E2AB3\",\n \"isAvailable\" : false,\n \"logPathSize\" : 1146880,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max(13.7)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0D851780-0829-499E-8064-8918C2BBC7AC\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0D851780-0829-499E-8064-8918C2BBC7AC\",\n \"udid\" : \"0D851780-0829-499E-8064-8918C2BBC7AC\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/82B0EF12-2F7D-486E-9DE1-AE34E01EB70F\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/82B0EF12-2F7D-486E-9DE1-AE34E01EB70F\",\n \"udid\" : \"82B0EF12-2F7D-486E-9DE1-AE34E01EB70F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/325AA1B7-58E2-4EF9-91CE-329F40879F6E\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/325AA1B7-58E2-4EF9-91CE-329F40879F6E\",\n \"udid\" : \"325AA1B7-58E2-4EF9-91CE-329F40879F6E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F2B3964C-AE60-48EA-8110-02BDA23CE27C\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F2B3964C-AE60-48EA-8110-02BDA23CE27C\",\n \"udid\" : \"F2B3964C-AE60-48EA-8110-02BDA23CE27C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (3rd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9A277A99-89F9-458F-B542-8F76687A975D\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9A277A99-89F9-458F-B542-8F76687A975D\",\n \"udid\" : \"9A277A99-89F9-458F-B542-8F76687A975D\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch---2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EB0A5B70-5F8F-4963-82F4-960819F345E9\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EB0A5B70-5F8F-4963-82F4-960819F345E9\",\n \"udid\" : \"EB0A5B70-5F8F-4963-82F4-960819F345E9\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (4th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/99BCA292-B4F1-498B-B845-AEAFF9B0B28A\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/99BCA292-B4F1-498B-B845-AEAFF9B0B28A\",\n \"udid\" : \"99BCA292-B4F1-498B-B845-AEAFF9B0B28A\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (7th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A11F7F51-B535-464E-9E11-4117F20AF150\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A11F7F51-B535-464E-9E11-4117F20AF150\",\n \"udid\" : \"A11F7F51-B535-464E-9E11-4117F20AF150\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.watchOS-8-5\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D25C52A8-F836-45EA-9983-55F7B5900907\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D25C52A8-F836-45EA-9983-55F7B5900907\",\n \"udid\" : \"D25C52A8-F836-45EA-9983-55F7B5900907\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-45mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 45mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/21D92487-6FF9-4DAF-AF9C-42F8AD8929F7\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/21D92487-6FF9-4DAF-AF9C-42F8AD8929F7\",\n \"udid\" : \"21D92487-6FF9-4DAF-AF9C-42F8AD8929F7\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-41mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 41mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/90057085-4578-4408-B454-E4EB4080C587\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/90057085-4578-4408-B454-E4EB4080C587\",\n \"udid\" : \"90057085-4578-4408-B454-E4EB4080C587\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 40mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7693DF4F-53CA-42C8-90F1-8878164F5842\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7693DF4F-53CA-42C8-90F1-8878164F5842\",\n \"udid\" : \"7693DF4F-53CA-42C8-90F1-8878164F5842\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C6D12028-06D0-4A13-8315-9FE5A083FF9C\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C6D12028-06D0-4A13-8315-9FE5A083FF9C\",\n \"udid\" : \"C6D12028-06D0-4A13-8315-9FE5A083FF9C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 40mm\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-14-5\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/96D83B48-5DB9-40C9-B39B-BE780F19BC6A\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/96D83B48-5DB9-40C9-B39B-BE780F19BC6A\",\n \"udid\" : \"96D83B48-5DB9-40C9-B39B-BE780F19BC6A\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/01FA53D0-1B51-49A3-AF3B-AE3AC94A9800\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/01FA53D0-1B51-49A3-AF3B-AE3AC94A9800\",\n \"udid\" : \"01FA53D0-1B51-49A3-AF3B-AE3AC94A9800\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4FD70DF5-16E9-47BC-8C99-8267991F6297\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4FD70DF5-16E9-47BC-8C99-8267991F6297\",\n \"udid\" : \"4FD70DF5-16E9-47BC-8C99-8267991F6297\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/101DC27D-F515-4EB1-9FEE-46EC0FE9210F\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/101DC27D-F515-4EB1-9FEE-46EC0FE9210F\",\n \"udid\" : \"101DC27D-F515-4EB1-9FEE-46EC0FE9210F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 mini\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4EA3C791-0623-438E-9FF5-BD87F08BB974\\/data\",\n \"dataPathSize\" : 459665408,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4EA3C791-0623-438E-9FF5-BD87F08BB974\",\n \"udid\" : \"4EA3C791-0623-438E-9FF5-BD87F08BB974\",\n \"isAvailable\" : false,\n \"logPathSize\" : 909312,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2ACF79E0-783B-4124-890F-7F79FE367C50\\/data\",\n \"dataPathSize\" : 426041344,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2ACF79E0-783B-4124-890F-7F79FE367C50\",\n \"udid\" : \"2ACF79E0-783B-4124-890F-7F79FE367C50\",\n \"isAvailable\" : false,\n \"logPathSize\" : 5488640,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E3B75C24-8D35-46E2-8E10-6A70A81E6F56\\/data\",\n \"dataPathSize\" : 1679515648,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E3B75C24-8D35-46E2-8E10-6A70A81E6F56\",\n \"udid\" : \"E3B75C24-8D35-46E2-8E10-6A70A81E6F56\",\n \"isAvailable\" : false,\n \"logPathSize\" : 4349952,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1B8B2129-DB60-4691-A7E2-AEF49176B658\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1B8B2129-DB60-4691-A7E2-AEF49176B658\",\n \"udid\" : \"1B8B2129-DB60-4691-A7E2-AEF49176B658\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C334B4B2-D721-40BA-9FA7-06B6526E6194\\/data\",\n \"dataPathSize\" : 352808960,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C334B4B2-D721-40BA-9FA7-06B6526E6194\",\n \"udid\" : \"C334B4B2-D721-40BA-9FA7-06B6526E6194\",\n \"isAvailable\" : false,\n \"logPathSize\" : 1871872,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/05280FF9-4594-4C01-82BD-557D960C4ECB\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/05280FF9-4594-4C01-82BD-557D960C4ECB\",\n \"udid\" : \"05280FF9-4594-4C01-82BD-557D960C4ECB\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/8047376A-A125-4461-8523-8A74DC93FF36\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/8047376A-A125-4461-8523-8A74DC93FF36\",\n \"udid\" : \"8047376A-A125-4461-8523-8A74DC93FF36\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (3rd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6DFE142A-6921-48DD-ABE9-F78E93E0BCFD\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6DFE142A-6921-48DD-ABE9-F78E93E0BCFD\",\n \"udid\" : \"6DFE142A-6921-48DD-ABE9-F78E93E0BCFD\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/94A49A49-9AF9-4A20-AE70-01DC185814F5\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/94A49A49-9AF9-4A20-AE70-01DC185814F5\",\n \"udid\" : \"94A49A49-9AF9-4A20-AE70-01DC185814F5\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air--4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (4th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/64184FDF-1F92-483C-96E9-BCC6512C1C60\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/64184FDF-1F92-483C-96E9-BCC6512C1C60\",\n \"udid\" : \"64184FDF-1F92-483C-96E9-BCC6512C1C60\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad--8th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (8th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1FF30D99-CD14-4FEA-9A0E-AB16A15F7201\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1FF30D99-CD14-4FEA-9A0E-AB16A15F7201\",\n \"udid\" : \"1FF30D99-CD14-4FEA-9A0E-AB16A15F7201\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/CC311424-7E60-4A83-8281-BBA66CFF6E76\\/data\",\n \"dataPathSize\" : 126787584,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/CC311424-7E60-4A83-8281-BBA66CFF6E76\",\n \"udid\" : \"CC311424-7E60-4A83-8281-BBA66CFF6E76\",\n \"isAvailable\" : false,\n \"logPathSize\" : 471040,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPod touch (7th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-14-4\" : [\n {\n \"lastBootedAt\" : \"2022-11-01T05:14:00Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/18118748-986A-490D-9ECF-FC90F018505D\\/data\",\n \"dataPathSize\" : 1411719168,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/18118748-986A-490D-9ECF-FC90F018505D\",\n \"udid\" : \"18118748-986A-490D-9ECF-FC90F018505D\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"logPathSize\" : 8302592,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F2D215CC-346F-475F-AB35-9DA8710F0210\\/data\",\n \"dataPathSize\" : 648237056,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F2D215CC-346F-475F-AB35-9DA8710F0210\",\n \"udid\" : \"F2D215CC-346F-475F-AB35-9DA8710F0210\",\n \"isAvailable\" : false,\n \"logPathSize\" : 1626112,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro Max\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/B20FF060-B3E7-4DF5-85AD-70CC5BEF9D86\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/B20FF060-B3E7-4DF5-85AD-70CC5BEF9D86\",\n \"udid\" : \"B20FF060-B3E7-4DF5-85AD-70CC5BEF9D86\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/84FD2161-5E59-43CF-A0AE-48C6DC4D56CA\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/84FD2161-5E59-43CF-A0AE-48C6DC4D56CA\",\n \"udid\" : \"84FD2161-5E59-43CF-A0AE-48C6DC4D56CA\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 mini\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E7FD006A-8150-4C71-827F-7383C9AE2A1D\\/data\",\n \"dataPathSize\" : 1063428096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E7FD006A-8150-4C71-827F-7383C9AE2A1D\",\n \"udid\" : \"E7FD006A-8150-4C71-827F-7383C9AE2A1D\",\n \"isAvailable\" : false,\n \"logPathSize\" : 3088384,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (2nd generation)\"\n },\n {\n \"lastBootedAt\" : \"2022-11-24T08:18:37Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DDB42DDF-BB1A-4DD8-BF1B-C9CBA1541639\\/data\",\n \"dataPathSize\" : 1915662336,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DDB42DDF-BB1A-4DD8-BF1B-C9CBA1541639\",\n \"udid\" : \"DDB42DDF-BB1A-4DD8-BF1B-C9CBA1541639\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"logPathSize\" : 18903040,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"lastBootedAt\" : \"2023-07-07T03:09:25Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EFA6FFC5-AA34-49CD-9216-B69D0F2E865A\\/data\",\n \"dataPathSize\" : 4827611136,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EFA6FFC5-AA34-49CD-9216-B69D0F2E865A\",\n \"udid\" : \"EFA6FFC5-AA34-49CD-9216-B69D0F2E865A\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"logPathSize\" : 8552448,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max\"\n },\n {\n \"lastBootedAt\" : \"2022-11-21T09:32:38Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/25694A06-2155-4BF8-8C1B-2A646242AFC6\\/data\",\n \"dataPathSize\" : 1024917504,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/25694A06-2155-4BF8-8C1B-2A646242AFC6\",\n \"udid\" : \"25694A06-2155-4BF8-8C1B-2A646242AFC6\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"logPathSize\" : 4378624,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/09FD73D6-6B15-4C1C-A471-4DB2D983A5B0\\/data\",\n \"dataPathSize\" : 344969216,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/09FD73D6-6B15-4C1C-A471-4DB2D983A5B0\",\n \"udid\" : \"09FD73D6-6B15-4C1C-A471-4DB2D983A5B0\",\n \"isAvailable\" : false,\n \"logPathSize\" : 1425408,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C676F83C-F0A9-4E2B-BA67-A9F361651848\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C676F83C-F0A9-4E2B-BA67-A9F361651848\",\n \"udid\" : \"C676F83C-F0A9-4E2B-BA67-A9F361651848\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2F9E4A8C-45AC-4DBD-8036-6408CB7F24CB\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2F9E4A8C-45AC-4DBD-8036-6408CB7F24CB\",\n \"udid\" : \"2F9E4A8C-45AC-4DBD-8036-6408CB7F24CB\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air--4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (4th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EF6CF259-D42E-45CB-8636-C16E3201EB3E\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EF6CF259-D42E-45CB-8636-C16E3201EB3E\",\n \"udid\" : \"EF6CF259-D42E-45CB-8636-C16E3201EB3E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad--8th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (8th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A5ACE442-DF77-4BDF-973D-3A7E08DD6DFA\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A5ACE442-DF77-4BDF-973D-3A7E08DD6DFA\",\n \"udid\" : \"A5ACE442-DF77-4BDF-973D-3A7E08DD6DFA\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch---2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/841AFB16-07D5-4D52-A455-09412C65883F\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/841AFB16-07D5-4D52-A455-09412C65883F\",\n \"udid\" : \"841AFB16-07D5-4D52-A455-09412C65883F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (4th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E29B4AC1-31B9-4E1C-BB47-655A1617B4DD\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E29B4AC1-31B9-4E1C-BB47-655A1617B4DD\",\n \"udid\" : \"E29B4AC1-31B9-4E1C-BB47-655A1617B4DD\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0D87C877-0D43-410D-AD78-34FE2CE3F6F5\\/data\",\n \"dataPathSize\" : 590548992,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0D87C877-0D43-410D-AD78-34FE2CE3F6F5\",\n \"udid\" : \"0D87C877-0D43-410D-AD78-34FE2CE3F6F5\",\n \"isAvailable\" : false,\n \"logPathSize\" : 2252800,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPod touch (7th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-15-5\" : [\n {\n \"lastBootedAt\" : \"2024-05-02T05:43:54Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5A70AF8C-A57C-472D-BE41-F9109D919A45\\/data\",\n \"dataPathSize\" : 1751441408,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5A70AF8C-A57C-472D-BE41-F9109D919A45\",\n \"udid\" : \"5A70AF8C-A57C-472D-BE41-F9109D919A45\",\n \"isAvailable\" : true,\n \"logPathSize\" : 585728,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2C22AD78-F4ED-4A63-A7A5-57B9609A6568\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2C22AD78-F4ED-4A63-A7A5-57B9609A6568\",\n \"udid\" : \"2C22AD78-F4ED-4A63-A7A5-57B9609A6568\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6CC9EBE0-0A33-46B7-AC9A-C8A1A0DB5540\\/data\",\n \"dataPathSize\" : 18341888,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6CC9EBE0-0A33-46B7-AC9A-C8A1A0DB5540\",\n \"udid\" : \"6CC9EBE0-0A33-46B7-AC9A-C8A1A0DB5540\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro Max\"\n },\n {\n \"lastBootedAt\" : \"2026-06-12T06:45:20Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/3C227762-087D-453A-B96A-8372C574B99D\\/data\",\n \"dataPathSize\" : 1832259584,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/3C227762-087D-453A-B96A-8372C574B99D\",\n \"udid\" : \"3C227762-087D-453A-B96A-8372C574B99D\",\n \"isAvailable\" : true,\n \"logPathSize\" : 495616,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/887E44F2-F38F-43F6-B413-D35EF6C68B2C\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/887E44F2-F38F-43F6-B413-D35EF6C68B2C\",\n \"udid\" : \"887E44F2-F38F-43F6-B413-D35EF6C68B2C\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 mini\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/30C96AB0-7ED4-4D48-969C-79AED862BF79\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/30C96AB0-7ED4-4D48-969C-79AED862BF79\",\n \"udid\" : \"30C96AB0-7ED4-4D48-969C-79AED862BF79\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DF3455DA-F6D4-477B-95C2-82995B4C87FF\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DF3455DA-F6D4-477B-95C2-82995B4C87FF\",\n \"udid\" : \"DF3455DA-F6D4-477B-95C2-82995B4C87FF\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/87C0CB9E-B9FC-423D-984C-32011ADD8A7A\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/87C0CB9E-B9FC-423D-984C-32011ADD8A7A\",\n \"udid\" : \"87C0CB9E-B9FC-423D-984C-32011ADD8A7A\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/02BDE90D-0273-458D-8FE8-FACD2CAF443E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/02BDE90D-0273-458D-8FE8-FACD2CAF443E\",\n \"udid\" : \"02BDE90D-0273-458D-8FE8-FACD2CAF443E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 mini\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/421F30BF-FD5C-499E-9DC7-3A6EED3ECC0E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/421F30BF-FD5C-499E-9DC7-3A6EED3ECC0E\",\n \"udid\" : \"421F30BF-FD5C-499E-9DC7-3A6EED3ECC0E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4C79C49E-79DD-42D5-BFFE-29D43AFAFCBF\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4C79C49E-79DD-42D5-BFFE-29D43AFAFCBF\",\n \"udid\" : \"4C79C49E-79DD-42D5-BFFE-29D43AFAFCBF\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/95CFF117-EE25-41D9-B1FF-AF3CEAD7DB8D\\/data\",\n \"dataPathSize\" : 2458824704,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/95CFF117-EE25-41D9-B1FF-AF3CEAD7DB8D\",\n \"udid\" : \"95CFF117-EE25-41D9-B1FF-AF3CEAD7DB8D\",\n \"isAvailable\" : true,\n \"logPathSize\" : 589824,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D01C732C-1023-4B9C-8506-EDD399B21E0E\\/data\",\n \"dataPathSize\" : 1859375104,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D01C732C-1023-4B9C-8506-EDD399B21E0E\",\n \"udid\" : \"D01C732C-1023-4B9C-8506-EDD399B21E0E\",\n \"isAvailable\" : true,\n \"logPathSize\" : 389120,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone Xs Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/903B5B4B-33CA-4F7D-BF45-578B660FDEFF\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/903B5B4B-33CA-4F7D-BF45-578B660FDEFF\",\n \"udid\" : \"903B5B4B-33CA-4F7D-BF45-578B660FDEFF\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/25B96C82-F4B3-4EF0-B087-EF394C83CF12\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/25B96C82-F4B3-4EF0-B087-EF394C83CF12\",\n \"udid\" : \"25B96C82-F4B3-4EF0-B087-EF394C83CF12\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"lastBootedAt\" : \"2024-05-02T05:43:11Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/3B6F6B0D-9FCE-4D24-82C5-B3D289F1F91E\\/data\",\n \"dataPathSize\" : 509190144,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/3B6F6B0D-9FCE-4D24-82C5-B3D289F1F91E\",\n \"udid\" : \"3B6F6B0D-9FCE-4D24-82C5-B3D289F1F91E\",\n \"isAvailable\" : true,\n \"logPathSize\" : 249856,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (5th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F50CD992-E701-43D0-AAF6-6F5789D5A991\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F50CD992-E701-43D0-AAF6-6F5789D5A991\",\n \"udid\" : \"F50CD992-E701-43D0-AAF6-6F5789D5A991\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1E4BA5D3-0ADE-4118-A645-1F62F1B39368\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1E4BA5D3-0ADE-4118-A645-1F62F1B39368\",\n \"udid\" : \"1E4BA5D3-0ADE-4118-A645-1F62F1B39368\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (3rd generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4B4DF13D-4351-414A-B834-3165C167D1A3\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4B4DF13D-4351-414A-B834-3165C167D1A3\",\n \"udid\" : \"4B4DF13D-4351-414A-B834-3165C167D1A3\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (5th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4BB93F03-BCE7-4B4A-86F6-570F3B5961F7\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4BB93F03-BCE7-4B4A-86F6-570F3B5961F7\",\n \"udid\" : \"4BB93F03-BCE7-4B4A-86F6-570F3B5961F7\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-9th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (9th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BCEBC476-515E-46FC-A92D-15BE24839EBF\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BCEBC476-515E-46FC-A92D-15BE24839EBF\",\n \"udid\" : \"BCEBC476-515E-46FC-A92D-15BE24839EBF\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/55C9DB47-95DA-41E9-B5ED-EDFDDD47F476\\/data\",\n \"dataPathSize\" : 125722624,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/55C9DB47-95DA-41E9-B5ED-EDFDDD47F476\",\n \"udid\" : \"55C9DB47-95DA-41E9-B5ED-EDFDDD47F476\",\n \"isAvailable\" : true,\n \"logPathSize\" : 143360,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPod touch (7th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.tvOS-15-0\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6C199A80-BC88-4E23-A2D7-916901AFF12D\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6C199A80-BC88-4E23-A2D7-916901AFF12D\",\n \"udid\" : \"6C199A80-BC88-4E23-A2D7-916901AFF12D\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-4K\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D50ECD7D-4193-45E7-B03E-23702CCA8492\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D50ECD7D-4193-45E7-B03E-23702CCA8492\",\n \"udid\" : \"D50ECD7D-4193-45E7-B03E-23702CCA8492\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (at 1080p) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6DFBB3C8-F17A-4322-B804-6968E73BE918\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6DFBB3C8-F17A-4322-B804-6968E73BE918\",\n \"udid\" : \"6DFBB3C8-F17A-4322-B804-6968E73BE918\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-16-4\" : [\n {\n \"lastBootedAt\" : \"2024-01-19T06:56:36Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/ECADDD69-A7C6-494E-B6C7-BF98619F8353\\/data\",\n \"dataPathSize\" : 4949094400,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/ECADDD69-A7C6-494E-B6C7-BF98619F8353\",\n \"udid\" : \"ECADDD69-A7C6-494E-B6C7-BF98619F8353\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"logPathSize\" : 1327104,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro\"\n },\n {\n \"lastBootedAt\" : \"2023-08-22T12:54:30Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F3CF520C-B633-46F7-8B6A-78E6C702C19D\\/data\",\n \"dataPathSize\" : 308637696,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F3CF520C-B633-46F7-8B6A-78E6C702C19D\",\n \"udid\" : \"F3CF520C-B633-46F7-8B6A-78E6C702C19D\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"logPathSize\" : 40960,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9A061289-7CCD-4D58-B785-AEC32A9CB29B\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9A061289-7CCD-4D58-B785-AEC32A9CB29B\",\n \"udid\" : \"9A061289-7CCD-4D58-B785-AEC32A9CB29B\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/339EC42F-E665-4706-8E90-181F65B2E7FA\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/339EC42F-E665-4706-8E90-181F65B2E7FA\",\n \"udid\" : \"339EC42F-E665-4706-8E90-181F65B2E7FA\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Plus\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/8A676055-1359-493B-B5B0-CDBDBE023F86\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/8A676055-1359-493B-B5B0-CDBDBE023F86\",\n \"udid\" : \"8A676055-1359-493B-B5B0-CDBDBE023F86\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A5970A47-FB28-4B06-8AA7-F94E8BE9E58E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A5970A47-FB28-4B06-8AA7-F94E8BE9E58E\",\n \"udid\" : \"A5970A47-FB28-4B06-8AA7-F94E8BE9E58E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-4th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (4th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/CFC99F49-981C-46E4-BE1F-0C395A67DFC0\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/CFC99F49-981C-46E4-BE1F-0C395A67DFC0\",\n \"udid\" : \"CFC99F49-981C-46E4-BE1F-0C395A67DFC0\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-6th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (6th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7696CCAB-385F-4FE8-8B80-F2D15A43B1F8\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7696CCAB-385F-4FE8-8B80-F2D15A43B1F8\",\n \"udid\" : \"7696CCAB-385F-4FE8-8B80-F2D15A43B1F8\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (10th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/20EC3F56-66F9-44AB-ADC1-C128961DBF18\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/20EC3F56-66F9-44AB-ADC1-C128961DBF18\",\n \"udid\" : \"20EC3F56-66F9-44AB-ADC1-C128961DBF18\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/079259D5-EE3B-40B7-88AB-92606CAFF01C\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/079259D5-EE3B-40B7-88AB-92606CAFF01C\",\n \"udid\" : \"079259D5-EE3B-40B7-88AB-92606CAFF01C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-15-2\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A8108CE7-EA75-4392-A279-F9FEBDD48C85\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A8108CE7-EA75-4392-A279-F9FEBDD48C85\",\n \"udid\" : \"A8108CE7-EA75-4392-A279-F9FEBDD48C85\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/84D557A3-795D-413B-90A4-FE8E9E73E60C\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/84D557A3-795D-413B-90A4-FE8E9E73E60C\",\n \"udid\" : \"84D557A3-795D-413B-90A4-FE8E9E73E60C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C8AE9409-39D6-4047-B262-C897D4FC7F98\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C8AE9409-39D6-4047-B262-C897D4FC7F98\",\n \"udid\" : \"C8AE9409-39D6-4047-B262-C897D4FC7F98\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EFC02382-248F-405D-8281-2DEFEF85DEA1\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EFC02382-248F-405D-8281-2DEFEF85DEA1\",\n \"udid\" : \"EFC02382-248F-405D-8281-2DEFEF85DEA1\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 mini\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/B9A1AE4B-2012-4D3E-A1C3-0464D051EB2E\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/B9A1AE4B-2012-4D3E-A1C3-0464D051EB2E\",\n \"udid\" : \"B9A1AE4B-2012-4D3E-A1C3-0464D051EB2E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/730C4E3F-1554-4807-837F-3F063BEFAAF9\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/730C4E3F-1554-4807-837F-3F063BEFAAF9\",\n \"udid\" : \"730C4E3F-1554-4807-837F-3F063BEFAAF9\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/263536FE-B334-43F1-9383-8CD4E8AAF72B\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/263536FE-B334-43F1-9383-8CD4E8AAF72B\",\n \"udid\" : \"263536FE-B334-43F1-9383-8CD4E8AAF72B\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6C5803FB-7B86-43D6-9620-560758C6A337\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6C5803FB-7B86-43D6-9620-560758C6A337\",\n \"udid\" : \"6C5803FB-7B86-43D6-9620-560758C6A337\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 mini\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7FF701DF-617D-4979-9245-0BD95D85049D\\/data\",\n \"dataPathSize\" : 930074624,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7FF701DF-617D-4979-9245-0BD95D85049D\",\n \"udid\" : \"7FF701DF-617D-4979-9245-0BD95D85049D\",\n \"isAvailable\" : false,\n \"logPathSize\" : 376832,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9AC24800-00FD-44BE-9274-D9696F026C3E\\/data\",\n \"dataPathSize\" : 2493054976,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9AC24800-00FD-44BE-9274-D9696F026C3E\",\n \"udid\" : \"9AC24800-00FD-44BE-9274-D9696F026C3E\",\n \"isAvailable\" : false,\n \"logPathSize\" : 917504,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E9009B42-DEBE-4CCB-A5B7-6B47F3D9DA2E\\/data\",\n \"dataPathSize\" : 1297498112,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E9009B42-DEBE-4CCB-A5B7-6B47F3D9DA2E\",\n \"udid\" : \"E9009B42-DEBE-4CCB-A5B7-6B47F3D9DA2E\",\n \"isAvailable\" : false,\n \"logPathSize\" : 311296,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/41E8974C-94D8-42AD-95C3-40072CB19244\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/41E8974C-94D8-42AD-95C3-40072CB19244\",\n \"udid\" : \"41E8974C-94D8-42AD-95C3-40072CB19244\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0C208A65-2F6E-4ED2-84DE-AA51C5EDFCE9\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0C208A65-2F6E-4ED2-84DE-AA51C5EDFCE9\",\n \"udid\" : \"0C208A65-2F6E-4ED2-84DE-AA51C5EDFCE9\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/886D4227-6A31-4620-8B80-D61F195E009B\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/886D4227-6A31-4620-8B80-D61F195E009B\",\n \"udid\" : \"886D4227-6A31-4620-8B80-D61F195E009B\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6E5A4197-4FA4-4311-BF97-CE1EB1141A4B\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6E5A4197-4FA4-4311-BF97-CE1EB1141A4B\",\n \"udid\" : \"6E5A4197-4FA4-4311-BF97-CE1EB1141A4B\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6E0F8400-E758-46E3-B775-B8CF9D61BFD9\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6E0F8400-E758-46E3-B775-B8CF9D61BFD9\",\n \"udid\" : \"6E0F8400-E758-46E3-B775-B8CF9D61BFD9\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (3rd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/52BB557B-C83D-4843-ACDD-AAF5A39CC690\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/52BB557B-C83D-4843-ACDD-AAF5A39CC690\",\n \"udid\" : \"52BB557B-C83D-4843-ACDD-AAF5A39CC690\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2D3CA6A5-BBEE-496F-A31A-F6623198227C\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2D3CA6A5-BBEE-496F-A31A-F6623198227C\",\n \"udid\" : \"2D3CA6A5-BBEE-496F-A31A-F6623198227C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-9th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (9th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/85FDACD6-C3E3-4525-8256-1062C74AD945\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/85FDACD6-C3E3-4525-8256-1062C74AD945\",\n \"udid\" : \"85FDACD6-C3E3-4525-8256-1062C74AD945\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air--4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (4th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/260930BC-7361-4DD1-B450-3E4CA1BE4312\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/260930BC-7361-4DD1-B450-3E4CA1BE4312\",\n \"udid\" : \"260930BC-7361-4DD1-B450-3E4CA1BE4312\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/39662594-529D-433B-A7EC-ACBB1D0B3DB1\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/39662594-529D-433B-A7EC-ACBB1D0B3DB1\",\n \"udid\" : \"39662594-529D-433B-A7EC-ACBB1D0B3DB1\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPod touch (7th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-15-0\" : [\n {\n \"lastBootedAt\" : \"2022-12-19T09:14:01Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BD9DDA14-413A-4EA1-92B7-EE5782DD2611\\/data\",\n \"dataPathSize\" : 1628176384,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BD9DDA14-413A-4EA1-92B7-EE5782DD2611\",\n \"udid\" : \"BD9DDA14-413A-4EA1-92B7-EE5782DD2611\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"logPathSize\" : 348160,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F52821BA-0C22-4F0C-975B-8A2688C3493F\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F52821BA-0C22-4F0C-975B-8A2688C3493F\",\n \"udid\" : \"F52821BA-0C22-4F0C-975B-8A2688C3493F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro Max\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4047010A-7704-468E-912B-5E905F984555\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4047010A-7704-468E-912B-5E905F984555\",\n \"udid\" : \"4047010A-7704-468E-912B-5E905F984555\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/20A1C568-9DF0-4888-9BA9-133C928B2188\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/20A1C568-9DF0-4888-9BA9-133C928B2188\",\n \"udid\" : \"20A1C568-9DF0-4888-9BA9-133C928B2188\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 mini\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/07E0157F-B250-48DC-B40D-467961267357\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/07E0157F-B250-48DC-B40D-467961267357\",\n \"udid\" : \"07E0157F-B250-48DC-B40D-467961267357\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7289EAF4-6F35-40E3-82E2-F64343AA271B\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7289EAF4-6F35-40E3-82E2-F64343AA271B\",\n \"udid\" : \"7289EAF4-6F35-40E3-82E2-F64343AA271B\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro Max\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/92EA08EE-7E0E-42A2-9ED1-C3335A861BCE\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/92EA08EE-7E0E-42A2-9ED1-C3335A861BCE\",\n \"udid\" : \"92EA08EE-7E0E-42A2-9ED1-C3335A861BCE\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5CD296A4-211E-42D5-B712-3E74299098F0\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5CD296A4-211E-42D5-B712-3E74299098F0\",\n \"udid\" : \"5CD296A4-211E-42D5-B712-3E74299098F0\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 mini\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BDC97DB6-0800-477A-8E4F-8E1D57F8121D\\/data\",\n \"dataPathSize\" : 2687442944,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BDC97DB6-0800-477A-8E4F-8E1D57F8121D\",\n \"udid\" : \"BDC97DB6-0800-477A-8E4F-8E1D57F8121D\",\n \"isAvailable\" : false,\n \"logPathSize\" : 626688,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (2nd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0B57403F-9F04-4D92-A2DC-0B8B9A8EE432\\/data\",\n \"dataPathSize\" : 3168837632,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0B57403F-9F04-4D92-A2DC-0B8B9A8EE432\",\n \"udid\" : \"0B57403F-9F04-4D92-A2DC-0B8B9A8EE432\",\n \"isAvailable\" : false,\n \"logPathSize\" : 925696,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1E6A86AC-F23B-4299-9586-D9FC87DBD7AC\\/data\",\n \"dataPathSize\" : 536694784,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1E6A86AC-F23B-4299-9586-D9FC87DBD7AC\",\n \"udid\" : \"1E6A86AC-F23B-4299-9586-D9FC87DBD7AC\",\n \"isAvailable\" : false,\n \"logPathSize\" : 430080,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/FCDCAC3A-4211-4CDC-9903-D93282AE954A\\/data\",\n \"dataPathSize\" : 126038016,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/FCDCAC3A-4211-4CDC-9903-D93282AE954A\",\n \"udid\" : \"FCDCAC3A-4211-4CDC-9903-D93282AE954A\",\n \"isAvailable\" : false,\n \"logPathSize\" : 49152,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/81A32D52-6732-4B6B-93B6-5E212381868A\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/81A32D52-6732-4B6B-93B6-5E212381868A\",\n \"udid\" : \"81A32D52-6732-4B6B-93B6-5E212381868A\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D8FCAD0D-FEC7-4250-81F1-1BD270B73D7A\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D8FCAD0D-FEC7-4250-81F1-1BD270B73D7A\",\n \"udid\" : \"D8FCAD0D-FEC7-4250-81F1-1BD270B73D7A\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/333FA5C8-FBEA-4E97-9156-8A0DE4A7A644\\/data\",\n \"dataPathSize\" : 200552448,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/333FA5C8-FBEA-4E97-9156-8A0DE4A7A644\",\n \"udid\" : \"333FA5C8-FBEA-4E97-9156-8A0DE4A7A644\",\n \"isAvailable\" : false,\n \"logPathSize\" : 266240,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A59BC390-5CC6-4E22-9754-A7E2928FEBD3\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A59BC390-5CC6-4E22-9754-A7E2928FEBD3\",\n \"udid\" : \"A59BC390-5CC6-4E22-9754-A7E2928FEBD3\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (3rd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2F10205E-8F62-4FEE-A4F7-4D418ABCA15A\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2F10205E-8F62-4FEE-A4F7-4D418ABCA15A\",\n \"udid\" : \"2F10205E-8F62-4FEE-A4F7-4D418ABCA15A\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (5th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1A426D14-958D-4FFD-930A-718022AC3307\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1A426D14-958D-4FFD-930A-718022AC3307\",\n \"udid\" : \"1A426D14-958D-4FFD-930A-718022AC3307\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-9th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (9th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7B35591C-CA1D-473A-B688-273FEA319F46\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7B35591C-CA1D-473A-B688-273FEA319F46\",\n \"udid\" : \"7B35591C-CA1D-473A-B688-273FEA319F46\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air--4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (4th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/91623240-2D45-4FAD-A091-B5F9E3BABF35\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/91623240-2D45-4FAD-A091-B5F9E3BABF35\",\n \"udid\" : \"91623240-2D45-4FAD-A091-B5F9E3BABF35\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1537C252-D005-4ADD-B139-CAB7384C9C56\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1537C252-D005-4ADD-B139-CAB7384C9C56\",\n \"udid\" : \"1537C252-D005-4ADD-B139-CAB7384C9C56\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPod touch (7th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-16-1\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F97525EE-7975-4F46-971F-6B14CAED4B37\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F97525EE-7975-4F46-971F-6B14CAED4B37\",\n \"udid\" : \"F97525EE-7975-4F46-971F-6B14CAED4B37\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/40A9E541-8706-4C2D-BFC7-061B22F95BA6\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/40A9E541-8706-4C2D-BFC7-061B22F95BA6\",\n \"udid\" : \"40A9E541-8706-4C2D-BFC7-061B22F95BA6\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DAE61663-C807-4DE1-9740-2CDA543EB6CD\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DAE61663-C807-4DE1-9740-2CDA543EB6CD\",\n \"udid\" : \"DAE61663-C807-4DE1-9740-2CDA543EB6CD\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/65ED83C2-F0ED-489C-9690-A8DA19CF42A7\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/65ED83C2-F0ED-489C-9690-A8DA19CF42A7\",\n \"udid\" : \"65ED83C2-F0ED-489C-9690-A8DA19CF42A7\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Plus\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/38A8CC42-2ADE-4357-A3D5-CEA3E25524C2\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/38A8CC42-2ADE-4357-A3D5-CEA3E25524C2\",\n \"udid\" : \"38A8CC42-2ADE-4357-A3D5-CEA3E25524C2\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"lastBootedAt\" : \"2022-12-19T08:44:06Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/38367E7A-A881-4064-A377-84FCF8D0DF18\\/data\",\n \"dataPathSize\" : 1038458880,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/38367E7A-A881-4064-A377-84FCF8D0DF18\",\n \"udid\" : \"38367E7A-A881-4064-A377-84FCF8D0DF18\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"logPathSize\" : 53248,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/8674E410-E76C-4DB9-BF94-DB2B1AACD265\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/8674E410-E76C-4DB9-BF94-DB2B1AACD265\",\n \"udid\" : \"8674E410-E76C-4DB9-BF94-DB2B1AACD265\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-4th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (4th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/983F2C08-7725-4008-BA12-376037C4737E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/983F2C08-7725-4008-BA12-376037C4737E\",\n \"udid\" : \"983F2C08-7725-4008-BA12-376037C4737E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-6th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (6th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F6DA2F8C-5F92-482B-AE8A-DC8AB669CE9F\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F6DA2F8C-5F92-482B-AE8A-DC8AB669CE9F\",\n \"udid\" : \"F6DA2F8C-5F92-482B-AE8A-DC8AB669CE9F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (10th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5996E0B4-A2CF-4C07-96FD-FC8F19B7A6B5\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5996E0B4-A2CF-4C07-96FD-FC8F19B7A6B5\",\n \"udid\" : \"5996E0B4-A2CF-4C07-96FD-FC8F19B7A6B5\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/80583390-2027-4DF6-A237-62AF73653359\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/80583390-2027-4DF6-A237-62AF73653359\",\n \"udid\" : \"80583390-2027-4DF6-A237-62AF73653359\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-16-0\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EC720CD1-F272-4ADD-811F-9FE923BB08B5\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EC720CD1-F272-4ADD-811F-9FE923BB08B5\",\n \"udid\" : \"EC720CD1-F272-4ADD-811F-9FE923BB08B5\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9F8BAC46-BC84-421F-9253-FB7627B6914E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9F8BAC46-BC84-421F-9253-FB7627B6914E\",\n \"udid\" : \"9F8BAC46-BC84-421F-9253-FB7627B6914E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0D0984D1-BE6B-4C71-BDD9-E20E92CD8294\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0D0984D1-BE6B-4C71-BDD9-E20E92CD8294\",\n \"udid\" : \"0D0984D1-BE6B-4C71-BDD9-E20E92CD8294\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/43F5E8E5-BB18-4D11-8989-FC5A0C6D1461\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/43F5E8E5-BB18-4D11-8989-FC5A0C6D1461\",\n \"udid\" : \"43F5E8E5-BB18-4D11-8989-FC5A0C6D1461\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Plus\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/528079E1-3F26-4F27-8C74-3F07D795B468\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/528079E1-3F26-4F27-8C74-3F07D795B468\",\n \"udid\" : \"528079E1-3F26-4F27-8C74-3F07D795B468\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"lastBootedAt\" : \"2022-11-14T13:14:46Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A5759A5A-2E68-42E1-B37F-98E62BA908E2\\/data\",\n \"dataPathSize\" : 1796640768,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A5759A5A-2E68-42E1-B37F-98E62BA908E2\",\n \"udid\" : \"A5759A5A-2E68-42E1-B37F-98E62BA908E2\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"logPathSize\" : 147456,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4E0AE75F-B488-439E-BCA0-EED5CFAF62BE\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4E0AE75F-B488-439E-BCA0-EED5CFAF62BE\",\n \"udid\" : \"4E0AE75F-B488-439E-BCA0-EED5CFAF62BE\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/082BDC57-1B81-478C-8F1A-F5B95775F478\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/082BDC57-1B81-478C-8F1A-F5B95775F478\",\n \"udid\" : \"082BDC57-1B81-478C-8F1A-F5B95775F478\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2547D990-7ED4-44A9-8CDE-967551B891B0\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2547D990-7ED4-44A9-8CDE-967551B891B0\",\n \"udid\" : \"2547D990-7ED4-44A9-8CDE-967551B891B0\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (3rd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C8A2AFE9-3577-468E-B641-635494D10D5E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C8A2AFE9-3577-468E-B641-635494D10D5E\",\n \"udid\" : \"C8A2AFE9-3577-468E-B641-635494D10D5E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/76BF0CC1-6B75-4AF9-9C4D-6EBC798A67DF\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/76BF0CC1-6B75-4AF9-9C4D-6EBC798A67DF\",\n \"udid\" : \"76BF0CC1-6B75-4AF9-9C4D-6EBC798A67DF\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-9th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (9th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-18-3\" : [\n {\n \"lastBootedAt\" : \"2026-08-14T08:41:27Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/224FBAAE-B5C7-4A10-9143-3944A3280E48\\/data\",\n \"dataPathSize\" : 2566512640,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/224FBAAE-B5C7-4A10-9143-3944A3280E48\",\n \"udid\" : \"224FBAAE-B5C7-4A10-9143-3944A3280E48\",\n \"isAvailable\" : true,\n \"logPathSize\" : 491520,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0D27475E-E5A1-4E1C-91A9-D069DC2DE868\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0D27475E-E5A1-4E1C-91A9-D069DC2DE868\",\n \"udid\" : \"0D27475E-E5A1-4E1C-91A9-D069DC2DE868\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16 Pro Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/731205C3-C064-4291-825A-3205701B9666\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/731205C3-C064-4291-825A-3205701B9666\",\n \"udid\" : \"731205C3-C064-4291-825A-3205701B9666\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16e\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16e\"\n },\n {\n \"lastBootedAt\" : \"2026-08-25T04:48:39Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/30CB7307-D485-4C6E-A0C0-91AF7E0BCA11\\/data\",\n \"dataPathSize\" : 957317120,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/30CB7307-D485-4C6E-A0C0-91AF7E0BCA11\",\n \"udid\" : \"30CB7307-D485-4C6E-A0C0-91AF7E0BCA11\",\n \"isAvailable\" : true,\n \"logPathSize\" : 208896,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EDA67A4C-49F3-4EED-86B1-493FBBA17380\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EDA67A4C-49F3-4EED-86B1-493FBBA17380\",\n \"udid\" : \"EDA67A4C-49F3-4EED-86B1-493FBBA17380\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16 Plus\"\n },\n {\n \"lastBootedAt\" : \"2026-10-13T14:56:01Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2FF2505A-1336-4B48-978C-0F9A69CD3F80\\/data\",\n \"dataPathSize\" : 1078571008,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2FF2505A-1336-4B48-978C-0F9A69CD3F80\",\n \"udid\" : \"2FF2505A-1336-4B48-978C-0F9A69CD3F80\",\n \"isAvailable\" : true,\n \"logPathSize\" : 376832,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/78312258-C009-47AC-90F9-264FE3A27FD6\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/78312258-C009-47AC-90F9-264FE3A27FD6\",\n \"udid\" : \"78312258-C009-47AC-90F9-264FE3A27FD6\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 11-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E67DEBA9-B295-40D3-A742-94B2C3F693DD\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E67DEBA9-B295-40D3-A742-94B2C3F693DD\",\n \"udid\" : \"E67DEBA9-B295-40D3-A742-94B2C3F693DD\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-13-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 13-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/ED867394-0EA6-4AA0-8E5B-166E08B2DEB2\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/ED867394-0EA6-4AA0-8E5B-166E08B2DEB2\",\n \"udid\" : \"ED867394-0EA6-4AA0-8E5B-166E08B2DEB2\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-A17-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (A17 Pro)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C8ED2608-39D4-4409-A72D-13EF6D72DD33\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C8ED2608-39D4-4409-A72D-13EF6D72DD33\",\n \"udid\" : \"C8ED2608-39D4-4409-A72D-13EF6D72DD33\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-A16\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (A16)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DC3BA040-F451-44CC-A77D-7280818512F2\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DC3BA040-F451-44CC-A77D-7280818512F2\",\n \"udid\" : \"DC3BA040-F451-44CC-A77D-7280818512F2\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-13-inch-M3\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 13-inch (M3)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0DDE7C35-1407-443F-9CF3-AE583904F009\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0DDE7C35-1407-443F-9CF3-AE583904F009\",\n \"udid\" : \"0DDE7C35-1407-443F-9CF3-AE583904F009\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-11-inch-M3\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 11-inch (M3)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E993C320-5F67-4153-B3A9-D459D3FEE41C\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E993C320-5F67-4153-B3A9-D459D3FEE41C\",\n \"udid\" : \"E993C320-5F67-4153-B3A9-D459D3FEE41C\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-11-inch-M2\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 11-inch (M2)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/91390D93-7665-44DF-9444-0DDE3A75C0DE\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/91390D93-7665-44DF-9444-0DDE3A75C0DE\",\n \"udid\" : \"91390D93-7665-44DF-9444-0DDE3A75C0DE\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-13-inch-M2\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 13-inch (M2)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DCD6521E-70B3-4B29-9F3D-A98A62A8FF38\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DCD6521E-70B3-4B29-9F3D-A98A62A8FF38\",\n \"udid\" : \"DCD6521E-70B3-4B29-9F3D-A98A62A8FF38\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (10th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-17-2\" : [\n {\n \"lastBootedAt\" : \"2024-05-14T13:50:57Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BE87AC93-5C7B-42D5-B418-FBEA5F289135\\/data\",\n \"dataPathSize\" : 4014047232,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BE87AC93-5C7B-42D5-B418-FBEA5F289135\",\n \"udid\" : \"BE87AC93-5C7B-42D5-B418-FBEA5F289135\",\n \"isAvailable\" : true,\n \"logPathSize\" : 892928,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Pro\"\n },\n {\n \"lastBootedAt\" : \"2025-09-04T01:52:49Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/3E9AF11D-EF60-4490-92F3-9E90E3784A89\\/data\",\n \"dataPathSize\" : 468508672,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/3E9AF11D-EF60-4490-92F3-9E90E3784A89\",\n \"udid\" : \"3E9AF11D-EF60-4490-92F3-9E90E3784A89\",\n \"isAvailable\" : true,\n \"logPathSize\" : 40960,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Pro Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9438D3CF-CE3D-4515-B9D8-E3C501D6F6A5\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9438D3CF-CE3D-4515-B9D8-E3C501D6F6A5\",\n \"udid\" : \"9438D3CF-CE3D-4515-B9D8-E3C501D6F6A5\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15\"\n },\n {\n \"lastBootedAt\" : \"2025-01-20T06:50:56Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/CD8403B7-1CF9-40B4-8502-FEF418F8323C\\/data\",\n \"dataPathSize\" : 5076082688,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/CD8403B7-1CF9-40B4-8502-FEF418F8323C\",\n \"udid\" : \"CD8403B7-1CF9-40B4-8502-FEF418F8323C\",\n \"isAvailable\" : true,\n \"logPathSize\" : 1642496,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Plus\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/777C2DBE-0528-469B-B4F7-562F1468A675\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/777C2DBE-0528-469B-B4F7-562F1468A675\",\n \"udid\" : \"777C2DBE-0528-469B-B4F7-562F1468A675\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F38BEFB7-F9EA-4824-BCA6-FF473383806E\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F38BEFB7-F9EA-4824-BCA6-FF473383806E\",\n \"udid\" : \"F38BEFB7-F9EA-4824-BCA6-FF473383806E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro Max\"\n },\n {\n \"lastBootedAt\" : \"2026-06-12T06:46:06Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/AAACD9EF-5B5C-4B34-8479-4E668A9DAEB6\\/data\",\n \"dataPathSize\" : 781791232,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/AAACD9EF-5B5C-4B34-8479-4E668A9DAEB6\",\n \"udid\" : \"AAACD9EF-5B5C-4B34-8479-4E668A9DAEB6\",\n \"isAvailable\" : true,\n \"logPathSize\" : 49152,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E8FEB18B-714D-46D1-909B-8E8A46753BD4\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E8FEB18B-714D-46D1-909B-8E8A46753BD4\",\n \"udid\" : \"E8FEB18B-714D-46D1-909B-8E8A46753BD4\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Plus\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/43D8069D-5316-4D02-A03E-2A5428ECCE33\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/43D8069D-5316-4D02-A03E-2A5428ECCE33\",\n \"udid\" : \"43D8069D-5316-4D02-A03E-2A5428ECCE33\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/407E2255-ACBC-4F30-ABD4-36D1758ADA05\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/407E2255-ACBC-4F30-ABD4-36D1758ADA05\",\n \"udid\" : \"407E2255-ACBC-4F30-ABD4-36D1758ADA05\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-4th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (4th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A384F276-E220-4548-B038-CD5F481A4803\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A384F276-E220-4548-B038-CD5F481A4803\",\n \"udid\" : \"A384F276-E220-4548-B038-CD5F481A4803\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-6th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (6th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5D7BD8E1-4B31-4CC0-AA1C-77BA10032483\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5D7BD8E1-4B31-4CC0-AA1C-77BA10032483\",\n \"udid\" : \"5D7BD8E1-4B31-4CC0-AA1C-77BA10032483\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (10th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/455B0E7A-7699-488F-87AD-EF5BE79CE428\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/455B0E7A-7699-488F-87AD-EF5BE79CE428\",\n \"udid\" : \"455B0E7A-7699-488F-87AD-EF5BE79CE428\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (5th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/FD04DCFC-18F9-4CBB-B6C7-29DA1201887E\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/FD04DCFC-18F9-4CBB-B6C7-29DA1201887E\",\n \"udid\" : \"FD04DCFC-18F9-4CBB-B6C7-29DA1201887E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.watchOS-7-2\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/8B4A9AA9-95D3-4C28-9E91-A4E1A900B957\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/8B4A9AA9-95D3-4C28-9E91-A4E1A900B957\",\n \"udid\" : \"8B4A9AA9-95D3-4C28-9E91-A4E1A900B957\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/703C993A-71A6-4915-8761-AEC98988C6E6\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/703C993A-71A6-4915-8761-AEC98988C6E6\",\n \"udid\" : \"703C993A-71A6-4915-8761-AEC98988C6E6\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 40mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D7ABF808-DA26-44C1-9E8D-188789C773AE\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D7ABF808-DA26-44C1-9E8D-188789C773AE\",\n \"udid\" : \"D7ABF808-DA26-44C1-9E8D-188789C773AE\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7B26CEA8-BEC2-446B-8480-6BF3664F4CCE\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7B26CEA8-BEC2-446B-8480-6BF3664F4CCE\",\n \"udid\" : \"7B26CEA8-BEC2-446B-8480-6BF3664F4CCE\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 40mm\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-17-5\" : [\n {\n \"lastBootedAt\" : \"2026-08-14T03:23:50Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4DDC93E8-0813-4AE5-9AE0-DCFDF328FE9F\\/data\",\n \"dataPathSize\" : 5117435904,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4DDC93E8-0813-4AE5-9AE0-DCFDF328FE9F\",\n \"udid\" : \"4DDC93E8-0813-4AE5-9AE0-DCFDF328FE9F\",\n \"isAvailable\" : true,\n \"logPathSize\" : 1331200,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F1F07DD4-2574-42EA-A3F7-163CDA4F95B8\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F1F07DD4-2574-42EA-A3F7-163CDA4F95B8\",\n \"udid\" : \"F1F07DD4-2574-42EA-A3F7-163CDA4F95B8\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Pro Max\"\n },\n {\n \"lastBootedAt\" : \"2026-10-08T05:22:24Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C012DC2D-6F85-4C9F-AF22-A10621385D53\\/data\",\n \"dataPathSize\" : 4844900352,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C012DC2D-6F85-4C9F-AF22-A10621385D53\",\n \"udid\" : \"C012DC2D-6F85-4C9F-AF22-A10621385D53\",\n \"isAvailable\" : true,\n \"logPathSize\" : 1335296,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A41F7B0E-D402-4522-9BDF-3D4C5FE7BACB\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A41F7B0E-D402-4522-9BDF-3D4C5FE7BACB\",\n \"udid\" : \"A41F7B0E-D402-4522-9BDF-3D4C5FE7BACB\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Plus\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/16EB88C3-5B73-49EB-AD0C-4C17B34F3BE6\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/16EB88C3-5B73-49EB-AD0C-4C17B34F3BE6\",\n \"udid\" : \"16EB88C3-5B73-49EB-AD0C-4C17B34F3BE6\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9B812D1B-E1B7-4D12-93AB-ED3F9C13FCEC\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9B812D1B-E1B7-4D12-93AB-ED3F9C13FCEC\",\n \"udid\" : \"9B812D1B-E1B7-4D12-93AB-ED3F9C13FCEC\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 11-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4A0F4A15-7301-4462-95CF-F1DFB70AE061\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4A0F4A15-7301-4462-95CF-F1DFB70AE061\",\n \"udid\" : \"4A0F4A15-7301-4462-95CF-F1DFB70AE061\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-13-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 13-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E7CFE5C5-1B4F-49CB-9851-B00665071A44\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E7CFE5C5-1B4F-49CB-9851-B00665071A44\",\n \"udid\" : \"E7CFE5C5-1B4F-49CB-9851-B00665071A44\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-11-inch-M2\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 11-inch (M2)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/79EAF305-E13E-47F2-A873-A11B4B0D4B26\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/79EAF305-E13E-47F2-A873-A11B4B0D4B26\",\n \"udid\" : \"79EAF305-E13E-47F2-A873-A11B4B0D4B26\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-13-inch-M2\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 13-inch (M2)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/AA71C281-402E-45D1-A3BB-33AF160511CA\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/AA71C281-402E-45D1-A3BB-33AF160511CA\",\n \"udid\" : \"AA71C281-402E-45D1-A3BB-33AF160511CA\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (10th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7F152374-6C04-498F-BD1A-6DE0D33E7A83\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7F152374-6C04-498F-BD1A-6DE0D33E7A83\",\n \"udid\" : \"7F152374-6C04-498F-BD1A-6DE0D33E7A83\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.xrOS-1-0\" : [\n {\n \"lastBootedAt\" : \"2023-09-16T01:40:31Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/870C7A03-6056-4D70-B136-E86EAFDFA89A\\/data\",\n \"dataPathSize\" : 762941440,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/870C7A03-6056-4D70-B136-E86EAFDFA89A\",\n \"udid\" : \"870C7A03-6056-4D70-B136-E86EAFDFA89A\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"device type profile not found\",\n \"logPathSize\" : 204800,\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Vision Pro\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.tvOS-14-5\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/CDE2DE55-F4F7-46A9-BB89-0BC36C898CA3\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/CDE2DE55-F4F7-46A9-BB89-0BC36C898CA3\",\n \"udid\" : \"CDE2DE55-F4F7-46A9-BB89-0BC36C898CA3\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-4K\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D7FA8B86-04AE-4830-A8CF-39A86B2912D2\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D7FA8B86-04AE-4830-A8CF-39A86B2912D2\",\n \"udid\" : \"D7FA8B86-04AE-4830-A8CF-39A86B2912D2\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (at 1080p) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4368A4AD-24EC-484F-88B8-CCC20192AA3C\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4368A4AD-24EC-484F-88B8-CCC20192AA3C\",\n \"udid\" : \"4368A4AD-24EC-484F-88B8-CCC20192AA3C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.watchOS-7-4\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F068C2A3-30FE-4846-BE87-8014F1D1FE28\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F068C2A3-30FE-4846-BE87-8014F1D1FE28\",\n \"udid\" : \"F068C2A3-30FE-4846-BE87-8014F1D1FE28\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/54C7178C-28FE-4002-9EF9-16C82F2A3419\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/54C7178C-28FE-4002-9EF9-16C82F2A3419\",\n \"udid\" : \"54C7178C-28FE-4002-9EF9-16C82F2A3419\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 40mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4D2BCFD7-D6F5-4970-8822-C7EB02ED1A1D\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4D2BCFD7-D6F5-4970-8822-C7EB02ED1A1D\",\n \"udid\" : \"4D2BCFD7-D6F5-4970-8822-C7EB02ED1A1D\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/94FC2D89-47CD-40F7-95EC-B16526A67BC7\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/94FC2D89-47CD-40F7-95EC-B16526A67BC7\",\n \"udid\" : \"94FC2D89-47CD-40F7-95EC-B16526A67BC7\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 40mm\"\n }\n ]\n }\n}\n", + "stderr": "" + } + ], + "started_unix": 1793167950.041533, + "product_hashes_still_match_at_cleanup": true, + "owned_device_absent": true, + "owned_harness_pids": [ + 43447, + 44773, + 46539, + 48086 + ], + "owned_harness_pids_still_alive": [], + "owned_tmp_root_absent": true, + "finished_unix": 1793167960.121181 +} \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/commands-lifecycle.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/commands-lifecycle.json new file mode 100644 index 00000000..8874a19f --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/commands-lifecycle.json @@ -0,0 +1,44 @@ +[ + { + "command": "xcrun simctl terminate B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA", + "exit": 0, + "stdout": "", + "stderr": "", + "unix": 1793167219.060514 + }, + { + "command": "xcrun --sdk iphonesimulator --show-sdk-path", + "exit": 0, + "stdout": "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator26.0.sdk\n", + "stderr": "", + "unix": 1793167219.0871391 + }, + { + "command": "xcrun --sdk iphonesimulator swiftc -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator26.0.sdk -target x86_64-apple-ios16.6-simulator -module-cache-path /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/swift-module-cache /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/ColorExtension.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/FontModifier.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/GetNoticeResponse.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/Harness.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/MyPageNoticeRoller.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/Spacing.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/UpdateBannerView.swift -o /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/app/NoticeNativeQA.app/NoticeNativeQA", + "exit": 0, + "stdout": "", + "stderr": "", + "unix": 1793167227.188478 + }, + { + "command": "xcrun simctl install B929E0F0-50F7-46C1-988E-95272D0CE7A2 /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/app/NoticeNativeQA.app", + "exit": 0, + "stdout": "", + "stderr": "", + "unix": 1793167228.378902 + }, + { + "command": "xcrun simctl launch B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA --lifecycle", + "exit": 0, + "stdout": "local.sodalive.NoticeNativeQA: 46539\n", + "stderr": "", + "unix": 1793167229.6560981 + }, + { + "command": "xcrun simctl get_app_container B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA data", + "exit": 0, + "stdout": "/Users/klaus/Library/Developer/CoreSimulator/Devices/B929E0F0-50F7-46C1-988E-95272D0CE7A2/data/Containers/Data/Application/E6E5317F-E31A-48E8-B5DE-7BBFD7D4C751\n", + "stderr": "", + "unix": 1793167230.514591 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/commands-matrix.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/commands-matrix.json new file mode 100644 index 00000000..d21ad105 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/commands-matrix.json @@ -0,0 +1,44 @@ +[ + { + "command": "xcrun simctl terminate B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA", + "exit": 0, + "stdout": "", + "stderr": "", + "unix": 1793167357.147539 + }, + { + "command": "xcrun --sdk iphonesimulator --show-sdk-path", + "exit": 0, + "stdout": "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator26.0.sdk\n", + "stderr": "", + "unix": 1793167357.190179 + }, + { + "command": "xcrun --sdk iphonesimulator swiftc -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator26.0.sdk -target x86_64-apple-ios16.6-simulator -module-cache-path /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/swift-module-cache /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/ColorExtension.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/FontModifier.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/GetNoticeResponse.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/Harness.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/MyPageNoticeRoller.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/Spacing.swift /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/source/UpdateBannerView.swift -o /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/app/NoticeNativeQA.app/NoticeNativeQA", + "exit": 0, + "stdout": "", + "stderr": "", + "unix": 1793167383.799288 + }, + { + "command": "xcrun simctl install B929E0F0-50F7-46C1-988E-95272D0CE7A2 /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/app/NoticeNativeQA.app", + "exit": 0, + "stdout": "", + "stderr": "", + "unix": 1793167387.964253 + }, + { + "command": "xcrun simctl launch B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA", + "exit": 0, + "stdout": "local.sodalive.NoticeNativeQA: 48086\n", + "stderr": "", + "unix": 1793167392.272796 + }, + { + "command": "xcrun simctl get_app_container B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA data", + "exit": 0, + "stdout": "/Users/klaus/Library/Developer/CoreSimulator/Devices/B929E0F0-50F7-46C1-988E-95272D0CE7A2/data/Containers/Data/Application/7C9B2E4A-1E90-4868-87FD-4E4E74E9AD5A\n", + "stderr": "", + "unix": 1793167395.9292119 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/commands-os-lifecycle.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/commands-os-lifecycle.json new file mode 100644 index 00000000..fcb91f35 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/commands-os-lifecycle.json @@ -0,0 +1,44 @@ +[ + { + "command": "xcrun simctl get_app_container B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA data", + "exit": 0, + "stdout": "/Users/klaus/Library/Developer/CoreSimulator/Devices/B929E0F0-50F7-46C1-988E-95272D0CE7A2/data/Containers/Data/Application/E6E5317F-E31A-48E8-B5DE-7BBFD7D4C751\n", + "stderr": "", + "unix": 1793167320.8572319 + }, + { + "command": "xcrun simctl io B929E0F0-50F7-46C1-988E-95272D0CE7A2 screenshot /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/os-before-background.png", + "exit": 0, + "stdout": "", + "stderr": "Detected file type 'PNG' from extension\nWrote screenshot to: /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/os-before-background.png\n", + "unix": 1793167321.605435 + }, + { + "command": "xcrun simctl launch B929E0F0-50F7-46C1-988E-95272D0CE7A2 com.apple.Preferences", + "exit": 0, + "stdout": "com.apple.Preferences: 47181\n", + "stderr": "", + "unix": 1793167322.518283 + }, + { + "command": "xcrun simctl launch B929E0F0-50F7-46C1-988E-95272D0CE7A2 local.sodalive.NoticeNativeQA", + "exit": 0, + "stdout": "local.sodalive.NoticeNativeQA: 46539\n", + "stderr": "", + "unix": 1793167329.793157 + }, + { + "command": "xcrun simctl io B929E0F0-50F7-46C1-988E-95272D0CE7A2 screenshot /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/os-resume-initial.png", + "exit": 0, + "stdout": "", + "stderr": "Detected file type 'PNG' from extension\nWrote screenshot to: /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/os-resume-initial.png\n", + "unix": 1793167331.456439 + }, + { + "command": "xcrun simctl io B929E0F0-50F7-46C1-988E-95272D0CE7A2 screenshot /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/os-resume-after-7s.png", + "exit": 0, + "stdout": "", + "stderr": "Detected file type 'PNG' from extension\nWrote screenshot to: /var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/my-notice-native.MtXXGk/os-resume-after-7s.png\n", + "unix": 1793167341.17082 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/actions.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/actions.json new file mode 100644 index 00000000..97f73b0a --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/actions.json @@ -0,0 +1,157 @@ +[ + { + "event" : "application-didBecomeActive", + "scenario" : "preparing", + "uptime" : 0.29632126505021006 + }, + { + "event" : "scenario-start", + "scenario" : "phase-probe", + "uptime" : 1.1963586449855939 + }, + { + "elements" : [ + + ], + "event" : "phase-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-first.png", + "uptime" : 2.0939663650933653 + }, + { + "elements" : [ + + ], + "event" : "phase-before-inactive", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-before-inactive.png", + "uptime" : 8.0479924971004948 + }, + { + "event" : "inject-inactive", + "scenario" : "phase-probe", + "uptime" : 9.3028581570833921 + }, + { + "elements" : [ + + ], + "event" : "phase-inactive-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "phase-probe", + "screenshot" : "phase-inactive-start.png", + "uptime" : 10.481118135037832 + }, + { + "elements" : [ + + ], + "event" : "phase-inactive-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "phase-probe", + "screenshot" : "phase-inactive-after-6s.png", + "uptime" : 16.05128803208936 + }, + { + "event" : "inject-active", + "scenario" : "phase-probe", + "uptime" : 17.996327791013755 + }, + { + "elements" : [ + + ], + "event" : "phase-active-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-active-before-5s.png", + "uptime" : 21.553165952092968 + }, + { + "elements" : [ + + ], + "event" : "phase-active-next", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-active-next.png", + "uptime" : 25.182883065077476 + }, + { + "event" : "lifecycle-probe-finished", + "scenario" : "phase-probe", + "uptime" : 27.447052538045682 + }, + { + "event" : "application-willResignActive", + "scenario" : "phase-probe", + "uptime" : 92.289837046060711 + }, + { + "event" : "application-didBecomeActive", + "scenario" : "phase-probe", + "uptime" : 100.37458740803413 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-active-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-active-before-5s.png new file mode 100644 index 00000000..7264a234 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-active-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-active-next.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-active-next.png new file mode 100644 index 00000000..7264a234 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-active-next.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-before-inactive.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-before-inactive.png new file mode 100644 index 00000000..0e264d7e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-before-inactive.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-first.png new file mode 100644 index 00000000..3652c0c7 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-inactive-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-inactive-after-6s.png new file mode 100644 index 00000000..7264a234 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-inactive-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-inactive-start.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-inactive-start.png new file mode 100644 index 00000000..0e264d7e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/lifecycle/phase-inactive-start.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/actions.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/actions.json new file mode 100644 index 00000000..3c0fdf3d --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/actions.json @@ -0,0 +1,733 @@ +[ + { + "event" : "application-didBecomeActive", + "scenario" : "preparing", + "uptime" : 0.50778894103132188 + }, + { + "event" : "scenario-start", + "scenario" : "zero", + "uptime" : 1.2895127300871536 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "zero", + "phaseProbe" : [ + + ], + "requestedPhase" : "active", + "scenario" : "zero", + "screenshot" : "zero.png", + "sink" : [ + + ], + "uptime" : 2.1232413940597326 + }, + { + "event" : "scenario-start", + "scenario" : "one", + "uptime" : 3.2916212580166757 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "one-initial", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "one", + "screenshot" : "one-initial.png", + "sink" : [ + + ], + "uptime" : 4.109572621062398 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "one-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "one", + "screenshot" : "one-after-6s.png", + "sink" : [ + + ], + "uptime" : 10.183676649001427 + }, + { + "event" : "scenario-start", + "scenario" : "two", + "uptime" : 11.316744546056725 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-first.png", + "sink" : [ + + ], + "uptime" : 12.137990792980418 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-before-5s.png", + "sink" : [ + + ], + "uptime" : 15.702694575069472 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-transition-mid", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-transition-mid.png", + "sink" : [ + + ], + "uptime" : 16.708362187026069 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-second", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-second.png", + "sink" : [ + + ], + "uptime" : 18.346050271065906 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "two-wrap-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two", + "screenshot" : "two-wrap-first.png", + "sink" : [ + + ], + "uptime" : 23.523510750033893 + }, + { + "event" : "scenario-start", + "scenario" : "three", + "uptime" : 24.4716424200451 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-first.png", + "sink" : [ + + ], + "uptime" : 25.293358479975723 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-second", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-second.png", + "sink" : [ + + ], + "uptime" : 31.361499255988747 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-third", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-third.png", + "sink" : [ + + ], + "uptime" : 36.522232864052057 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "three-wrap-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "three", + "screenshot" : "three-wrap-first.png", + "sink" : [ + + ], + "uptime" : 41.477937716990709 + }, + { + "event" : "scenario-start", + "scenario" : "long-korean", + "uptime" : 43.373455154011026 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "long-korean-dark", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "long-korean", + "screenshot" : "long-korean-dark.png", + "sink" : [ + + ], + "uptime" : 44.191192200989462 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "long-korean-light", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "long-korean", + "screenshot" : "long-korean-light.png", + "sink" : [ + + ], + "uptime" : 46.162646057084203 + }, + { + "event" : "scenario-start", + "scenario" : "inactive-environment", + "uptime" : 47.378562799072824 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "inactive-before", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "inactive-environment", + "screenshot" : "inactive-before.png", + "sink" : [ + + ], + "uptime" : 54.609815668081865 + }, + { + "event" : "inject-scenePhase-inactive", + "scenario" : "inactive-environment", + "uptime" : 55.250484918011352 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "inactive-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "inactive-environment", + "screenshot" : "inactive-start.png", + "sink" : [ + + ], + "uptime" : 55.97593361698091 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "inactive-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "inactive-environment", + "screenshot" : "inactive-after-6s.png", + "sink" : [ + + ], + "uptime" : 62.475430538062938 + }, + { + "event" : "inject-scenePhase-active", + "scenario" : "inactive-environment", + "uptime" : 62.47890109999571 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "reactivated-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "inactive-environment", + "screenshot" : "reactivated-before-5s.png", + "sink" : [ + + ], + "uptime" : 66.760604207054712 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "reactivated-next", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "inactive-environment", + "screenshot" : "reactivated-next.png", + "sink" : [ + + ], + "uptime" : 69.25886417098809 + }, + { + "event" : "unmount-banner", + "scenario" : "remount", + "uptime" : 70.382856977055781 + }, + { + "elements" : [ + + ], + "event" : "unmounted-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "unmounted-start.png", + "uptime" : 71.197345499997027 + }, + { + "elements" : [ + + ], + "event" : "unmounted-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "unmounted-after-6s.png", + "uptime" : 77.264173908974044 + }, + { + "event" : "remount-banner", + "scenario" : "remount", + "uptime" : 77.886691326042637 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "remounted-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "remounted-first.png", + "sink" : [ + + ], + "uptime" : 78.663667659973726 + }, + { + "elements" : [ + + ], + "event" : "remounted-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "remounted-before-5s.png", + "uptime" : 82.855128771974705 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "remounted-second", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "remount", + "screenshot" : "remounted-second.png", + "sink" : [ + + ], + "uptime" : 85.163409232045524 + }, + { + "event" : "scenario-start", + "scenario" : "shrink-to-one", + "uptime" : 87.17370785807725 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "shrink-reset-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "shrink-to-one", + "screenshot" : "shrink-reset-first.png", + "sink" : [ + + ], + "uptime" : 87.98721138201654 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "shrink-one-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "shrink-to-one", + "screenshot" : "shrink-one-after-6s.png", + "sink" : [ + + ], + "uptime" : 94.048975637066178 + }, + { + "event" : "scenario-start", + "scenario" : "shrink-to-empty", + "uptime" : 95.215538030024618 + }, + { + "accessibilityActivateResult" : false, + "captureDelta" : 0, + "elements" : [ + + ], + "event" : "shrink-empty", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + }, + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "shrink-to-empty", + "screenshot" : "shrink-empty.png", + "sink" : [ + + ], + "uptime" : 96.02508452697657 + }, + { + "event" : "matrix-finished", + "scenario" : "shrink-to-empty", + "uptime" : 97.220463869976811 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/inactive-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/inactive-after-6s.png new file mode 100644 index 00000000..296f7ed9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/inactive-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/inactive-before.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/inactive-before.png new file mode 100644 index 00000000..89125a14 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/inactive-before.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/inactive-start.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/inactive-start.png new file mode 100644 index 00000000..89125a14 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/inactive-start.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/long-korean-dark.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/long-korean-dark.png new file mode 100644 index 00000000..41933d7b Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/long-korean-dark.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/long-korean-light.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/long-korean-light.png new file mode 100644 index 00000000..41933d7b Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/long-korean-light.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/one-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/one-after-6s.png new file mode 100644 index 00000000..4cbf09ad Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/one-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/one-initial.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/one-initial.png new file mode 100644 index 00000000..4cbf09ad Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/one-initial.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/reactivated-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/reactivated-before-5s.png new file mode 100644 index 00000000..296f7ed9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/reactivated-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/reactivated-next.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/reactivated-next.png new file mode 100644 index 00000000..296f7ed9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/reactivated-next.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/remounted-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/remounted-before-5s.png new file mode 100644 index 00000000..ee410d15 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/remounted-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/remounted-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/remounted-first.png new file mode 100644 index 00000000..ee410d15 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/remounted-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/remounted-second.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/remounted-second.png new file mode 100644 index 00000000..1a242d5a Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/remounted-second.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/shrink-empty.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/shrink-empty.png new file mode 100644 index 00000000..6602156d Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/shrink-empty.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/shrink-one-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/shrink-one-after-6s.png new file mode 100644 index 00000000..30db67e9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/shrink-one-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/shrink-reset-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/shrink-reset-first.png new file mode 100644 index 00000000..30db67e9 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/shrink-reset-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-first.png new file mode 100644 index 00000000..002cb87e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-second.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-second.png new file mode 100644 index 00000000..5e0e146e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-second.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-third.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-third.png new file mode 100644 index 00000000..11ac8017 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-third.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-wrap-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-wrap-first.png new file mode 100644 index 00000000..002cb87e Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/three-wrap-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-before-5s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-before-5s.png new file mode 100644 index 00000000..7cf66866 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-before-5s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-first.png new file mode 100644 index 00000000..7cf66866 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-second.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-second.png new file mode 100644 index 00000000..a71fa05d Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-second.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-transition-mid.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-transition-mid.png new file mode 100644 index 00000000..27c1301d Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-transition-mid.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-wrap-first.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-wrap-first.png new file mode 100644 index 00000000..7cf66866 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/two-wrap-first.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/unmounted-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/unmounted-after-6s.png new file mode 100644 index 00000000..10f5eadf Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/unmounted-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/unmounted-start.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/unmounted-start.png new file mode 100644 index 00000000..10f5eadf Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/unmounted-start.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/zero.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/zero.png new file mode 100644 index 00000000..0ee2c5ea Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/matrix/zero.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/ocr.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/ocr.json new file mode 100644 index 00000000..f4980d89 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/ocr.json @@ -0,0 +1,1901 @@ +[ + { + "file": "matrix/inactive-after-6s.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "inactive-environment", + "width": 296.00000000000006, + "x": 48.000001849999954, + "y": 147.99999992499997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 30.000000000000117, + "text": "세 번째 업데이트 안내", + "width": 273.99999999999994, + "x": 47.99999804285716, + "y": 288.0000000999999 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/inactive-before.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "inactive-environment", + "width": 296.00000000000006, + "x": 48.000001849999954, + "y": 147.99999992499997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 29.99999999999997, + "text": "두 번째 서비스 소식", + "width": 243.99999999999997, + "x": 47.99999847500004, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/inactive-start.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "inactive-environment", + "width": 296.00000000000006, + "x": 48.000001849999954, + "y": 147.99999992499997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 29.99999999999997, + "text": "두 번째 서비스 소식", + "width": 243.99999999999997, + "x": 47.99999847500004, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/long-korean-dark.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.536448478698713, + "text": "1ong-korean", + "width": 164.08419799804688, + "x": 45.95790052182983, + "y": 149.73177649905685 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 32.0000000000001, + "text": "서비스 업데이트와 새로운 기능을 안내합니다...", + "width": 596.0000000000001, + "x": 48.00000496666661, + "y": 288 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/long-korean-light.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.536448478698713, + "text": "1ong-korean", + "width": 164.08419799804688, + "x": 45.95790052182983, + "y": 149.73177649905685 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 32.0000000000001, + "text": "서비스 업데이트와 새로운 기능을 안내합니다...", + "width": 596.0000000000001, + "x": 48.00000496666661, + "y": 288 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/one-after-6s.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 17.999999999999954, + "text": "one", + "width": 43.99999999999999, + "x": 48.00000039999999, + "y": 154.00000018000006 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 48.00000306666661, + "y": 195.99999989999998 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/one-initial.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 17.999999999999954, + "text": "one", + "width": 43.99999999999999, + "x": 48.00000039999999, + "y": 154.00000018000006 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 48.00000306666661, + "y": 195.99999989999998 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/reactivated-before-5s.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "inactive-environment", + "width": 296.00000000000006, + "x": 48.000001849999954, + "y": 147.99999992499997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 30.000000000000117, + "text": "세 번째 업데이트 안내", + "width": 273.99999999999994, + "x": 47.99999804285716, + "y": 288.0000000999999 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/reactivated-next.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "inactive-environment", + "width": 296.00000000000006, + "x": 48.000001849999954, + "y": 147.99999992499997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 30.000000000000117, + "text": "세 번째 업데이트 안내", + "width": 273.99999999999994, + "x": 47.99999804285716, + "y": 288.0000000999999 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/remounted-before-5s.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 20.000000000000078, + "text": "remount", + "width": 104, + "x": 48.000000633333315, + "y": 151.99999983333333 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/remounted-first.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 20.000000000000078, + "text": "remount", + "width": 104, + "x": 48.000000633333315, + "y": 151.99999983333333 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/remounted-second.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 20.192977905273604, + "text": "remount", + "width": 104.03694152832034, + "x": 47.98152986948138, + "y": 151.90351088187222 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 32.0000000000001, + "text": "두 번째 서비스 소식", + "width": 246, + "x": 48.00000245999996, + "y": 287.99999987999996 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/shrink-empty.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 29.35418891906737, + "text": "shrink-to-empty", + "width": 222.7130889892578, + "x": 47.69019195049493, + "y": 146.9160460330467 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 320.000000325 + } + ], + "width": 750 + }, + { + "file": "matrix/shrink-one-after-6s.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "shrink-to-one", + "width": 192, + "x": 47.999999, + "y": 147.99999975999995 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/shrink-reset-first.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "shrink-to-one", + "width": 192, + "x": 47.999999, + "y": 147.99999975999995 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/three-first.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 20.000000000000078, + "text": "three", + "width": 74, + "x": 48.00000073999999, + "y": 151.99999991999996 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/three-second.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 20.000000000000078, + "text": "three", + "width": 74, + "x": 48.00000073999999, + "y": 151.99999991999996 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 32.0000000000001, + "text": "두 번째 서비스 소식", + "width": 246, + "x": 48.00000245999996, + "y": 287.99999987999996 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/three-third.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 20.000000000000078, + "text": "three", + "width": 74, + "x": 48.00000073999999, + "y": 151.99999991999996 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 30.000000000000117, + "text": "세 번째 업데이트 안내", + "width": 273.99999999999994, + "x": 47.99999804285716, + "y": 288.0000000999999 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/three-wrap-first.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 20.000000000000078, + "text": "three", + "width": 74, + "x": 48.00000073999999, + "y": 151.99999991999996 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/two-before-5s.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 20.000000000000078, + "text": "tWO", + "width": 43.99999999999999, + "x": 47.999999666666675, + "y": 151.99999983333333 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/two-first.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 20.000000000000078, + "text": "tWO", + "width": 43.99999999999999, + "x": 47.999999666666675, + "y": 151.99999983333333 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/two-second.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 20.000000000000078, + "text": "tWO", + "width": 43.99999999999999, + "x": 47.999999666666675, + "y": 151.99999983333333 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 32.0000000000001, + "text": "두 번째 서비스 소식", + "width": 246, + "x": 48.00000245999996, + "y": 287.99999987999996 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/two-transition-mid.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 20.000000000000078, + "text": "tWO", + "width": 43.99999999999999, + "x": 47.999999666666675, + "y": 151.99999983333333 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 30.000000000000117, + "text": "두 번째 서비스 소식", + "width": 246.00000000000006, + "x": 48.000001757142826, + "y": 291.9999999 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/two-wrap-first.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 0.5, + "height": 20.000000000000078, + "text": "tWO", + "width": 43.99999999999999, + "x": 47.999999666666675, + "y": 151.99999983333333 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "matrix/unmounted-after-6s.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 20.000000000000078, + "text": "remount", + "width": 104, + "x": 47.99999935000002, + "y": 152.00000025 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 320.000000325 + } + ], + "width": 750 + }, + { + "file": "matrix/unmounted-start.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 20.000000000000078, + "text": "remount", + "width": 104, + "x": 47.99999935000002, + "y": 152.00000025 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 320.000000325 + } + ], + "width": 750 + }, + { + "file": "matrix/zero.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344, + "x": 47.99999713333338, + "y": 94.0000000833334 + }, + { + "bannerRegion": false, + "confidence": 0.30000001192092896, + "height": 18.73281478881843, + "text": "Zer0", + "width": 60.2157554626465, + "x": 47.89212286740821, + "y": 153.63359249825666 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 320.000000325 + } + ], + "width": 750 + }, + { + "file": "lifecycle/phase-active-before-5s.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "phase-probe", + "width": 162, + "x": 48.00000115714286, + "y": 149.9999999142857 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 30.000000000000117, + "text": "세 번째 업데이트 안내", + "width": 273.99999999999994, + "x": 47.99999804285716, + "y": 288.0000000999999 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "lifecycle/phase-active-next.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "phase-probe", + "width": 162, + "x": 48.00000115714286, + "y": 149.9999999142857 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 30.000000000000117, + "text": "세 번째 업데이트 안내", + "width": 273.99999999999994, + "x": 47.99999804285716, + "y": 288.0000000999999 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "lifecycle/phase-before-inactive.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "phase-probe", + "width": 162, + "x": 48.00000115714286, + "y": 149.9999999142857 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "두 번째 서비스 소식", + "width": 243.99999999999997, + "x": 47.99999847500004, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "lifecycle/phase-first.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "phase-probe", + "width": 162, + "x": 48.00000115714286, + "y": 149.9999999142857 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 47.99999863750002, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "lifecycle/phase-inactive-after-6s.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "phase-probe", + "width": 162, + "x": 48.00000115714286, + "y": 149.9999999142857 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 30.000000000000117, + "text": "세 번째 업데이트 안내", + "width": 273.99999999999994, + "x": 47.99999804285716, + "y": 288.0000000999999 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "lifecycle/phase-inactive-start.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "phase-probe", + "width": 162, + "x": 48.00000115714286, + "y": 149.9999999142857 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "두 번째 서비스 소식", + "width": 243.99999999999997, + "x": 47.99999847500004, + "y": 288.0000001125 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "os-before-background.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 0.5, + "height": 27.259504318237386, + "text": "이동통신사 이", + "width": 144.22207641601562, + "x": 11.888962692942444, + "y": 7.370247736263773 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 21.999999999999908, + "text": "9:41AM", + "width": 96.00000000000004, + "x": 325.99999920000005, + "y": 10.000000116666696 + }, + { + "bannerRegion": false, + "confidence": 0.30000001192092896, + "height": 34.00000000000007, + "text": "D", + "width": 53.999999999999964, + "x": 689.9999998999999, + "y": 3.999999757142831 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344.00000000000006, + "x": 47.999996560000056, + "y": 94.00000009999997 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "phase-probe", + "width": 162, + "x": 48.00000115714286, + "y": 149.9999999142857 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 1, + "height": 31.999999999999947, + "text": "세 번째 업데이트 안내", + "width": 276, + "x": 45.99999846666668, + "y": 288.0000001111111 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 442.00000000000006, + "x": 48.000004924999864, + "y": 392.0000003249999 + } + ], + "width": 750 + }, + { + "file": "os-resume-after-7s.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 0.30000001192092896, + "height": 24.000000000000036, + "text": "• 설정", + "width": 68, + "x": 13.99999951428572, + "y": 8.000000114285655 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 21.999999999999908, + "text": "9:41AM", + "width": 96.00000000000004, + "x": 325.99999920000005, + "y": 10.000000116666696 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344, + "x": 47.99999713333338, + "y": 94.00000011666667 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "phase-probe", + "width": 162, + "x": 48.00000115714286, + "y": 149.9999999142857 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 48.00000121111109, + "y": 287.99999990000003 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 441.99999999999994, + "x": 48.00000393999994, + "y": 392.00000025999987 + } + ], + "width": 750 + }, + { + "file": "os-resume-initial.png", + "height": 1334, + "text": [ + { + "bannerRegion": false, + "confidence": 0.30000001192092896, + "height": 24.000000000000036, + "text": "• 설정", + "width": 68, + "x": 13.99999951428572, + "y": 8.000000114285655 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 21.999999999999908, + "text": "9:41AM", + "width": 96.00000000000004, + "x": 325.99999920000005, + "y": 10.000000116666696 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 29.99999999999997, + "text": "NATIVE QA HARNESS", + "width": 344, + "x": 47.99999713333338, + "y": 94.00000011666667 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "phase-probe", + "width": 162, + "x": 48.00000115714286, + "y": 149.9999999142857 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 24.000000000000036, + "text": "Actual Update BannerView below", + "width": 368, + "x": 47.999998733333314, + "y": 196.0000002 + }, + { + "bannerRegion": true, + "confidence": 0.5, + "height": 29.99999999999997, + "text": "첫 번째 공지 안내", + "width": 218, + "x": 48.00000121111109, + "y": 287.99999990000003 + }, + { + "bannerRegion": false, + "confidence": 1, + "height": 26.000000000000014, + "text": "Harness context / no network / no login", + "width": 441.99999999999994, + "x": 48.00000393999994, + "y": 392.00000025999987 + } + ], + "width": 750 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-before-background.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-before-background.png new file mode 100644 index 00000000..cb0cd562 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-before-background.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-lifecycle-actions.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-lifecycle-actions.json new file mode 100644 index 00000000..97f73b0a --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-lifecycle-actions.json @@ -0,0 +1,157 @@ +[ + { + "event" : "application-didBecomeActive", + "scenario" : "preparing", + "uptime" : 0.29632126505021006 + }, + { + "event" : "scenario-start", + "scenario" : "phase-probe", + "uptime" : 1.1963586449855939 + }, + { + "elements" : [ + + ], + "event" : "phase-first", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-first.png", + "uptime" : 2.0939663650933653 + }, + { + "elements" : [ + + ], + "event" : "phase-before-inactive", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-before-inactive.png", + "uptime" : 8.0479924971004948 + }, + { + "event" : "inject-inactive", + "scenario" : "phase-probe", + "uptime" : 9.3028581570833921 + }, + { + "elements" : [ + + ], + "event" : "phase-inactive-start", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "phase-probe", + "screenshot" : "phase-inactive-start.png", + "uptime" : 10.481118135037832 + }, + { + "elements" : [ + + ], + "event" : "phase-inactive-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + } + ], + "requestedPhase" : "inactive", + "scenario" : "phase-probe", + "screenshot" : "phase-inactive-after-6s.png", + "uptime" : 16.05128803208936 + }, + { + "event" : "inject-active", + "scenario" : "phase-probe", + "uptime" : 17.996327791013755 + }, + { + "elements" : [ + + ], + "event" : "phase-active-before-5s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-active-before-5s.png", + "uptime" : 21.553165952092968 + }, + { + "elements" : [ + + ], + "event" : "phase-active-next", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + }, + { + "event" : "change", + "phase" : "inactive" + }, + { + "event" : "change", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "phase-probe", + "screenshot" : "phase-active-next.png", + "uptime" : 25.182883065077476 + }, + { + "event" : "lifecycle-probe-finished", + "scenario" : "phase-probe", + "uptime" : 27.447052538045682 + }, + { + "event" : "application-willResignActive", + "scenario" : "phase-probe", + "uptime" : 92.289837046060711 + }, + { + "event" : "application-didBecomeActive", + "scenario" : "phase-probe", + "uptime" : 100.37458740803413 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-resume-after-7s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-resume-after-7s.png new file mode 100644 index 00000000..19422344 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-resume-after-7s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-resume-initial.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-resume-initial.png new file mode 100644 index 00000000..19422344 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/os-resume-initial.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/provenance.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/provenance.json new file mode 100644 index 00000000..a38bed28 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/provenance.json @@ -0,0 +1,38 @@ +{ + "kind": "Native UIKit UIHostingController harness, not full SodaLive app", + "captured_at_unix": 1793166510.4207768, + "stability_seconds": 15, + "files": { + "SodaLive/Sources/MyPage/MyPageView.swift": "86a3dee7a4f2ce5bfa99624ff08c0b8eb7c1e88556fc5c04458f7ed2f72c7638", + "SodaLive/Sources/V2/MyPage/Models/MyPageNoticeRoller.swift": "1bd3f0dfc2ee59ce692291bf3079b06874e7c1012e4365105d3636928e29fe8a", + "SodaLive/Sources/Settings/Notice/GetNoticeResponse.swift": "bbf55eb38659af3df7c6db29af0fa7904d0f87457ec098068fe96e282cee1977", + "SodaLive/Sources/Extensions/FontModifier.swift": "086fb0a19d884124a4cca638f7c8483de724ee31a61603b2cbd489aabf26a6c6", + "SodaLive/Sources/Extensions/ColorExtension.swift": "747347d86ade888fe9c1d30629285b4a71991bc0f21189a0d4b76ad314c32364", + "SodaLive/Sources/UI/Theme/Spacing.swift": "372a73b821236c15449fa022cd628f61556f1381a16f234a4b77e833c2e588c1", + "SodaLive/Resources/Font/Pretendard-Regular.otf": "3ffbacde6ab8411f1d2db54bb9b1f0b3ee2a738932033722cf0388c06aed1c93" + }, + "extracted_update_banner_sha256": "828d5737650436db9a69fd98efc3475362d7045285d2fb8dbdd17870d57047a6", + "extraction": "Exact struct UpdateBannerView through next MARK, unchanged; only import SwiftUI prepended", + "substitutions": [ + "AppState and AppStep replaced with local title/content/date capture sink, no routing/server", + "LanguageOption reduced to enum cases needed by actual FontModifier; ko locale and app.language=ko forced", + "MyPage surrounding page replaced by labeled QA context, fixtures and mount/scenePhase environment driver", + "Exact production MyPageNoticeRoller, NoticeItem file, FontModifier, ColorExtension, SodaSpacing compiled", + "Real Pretendard-Regular.otf registered in native app Info.plist", + "Invisible sibling PhaseProbe records the same injected scenePhase; actual view source unchanged", + "UIApplication notification bridge supplies real OS active/inactive to UIKit-hosted SwiftUI environment, not full app Scene" + ], + "baseline": "No before image created; baseline only supplied old title+Spacer+detail/arrow source description", + "final_product_hashes_match": true, + "verified_after_native_runs_unix": 1793167557.089371, + "compiled_sources": { + "UpdateBannerView.swift": "466fe05e96ebb70f6ae3fccdf7f62e49526035153c04eaebdeda00a2de125653", + "Harness.swift": "e444d9651cb11186a8fcc0792a147e11fe1502f1d044159ece29520d1f456fd8", + "Spacing.swift": "372a73b821236c15449fa022cd628f61556f1381a16f234a4b77e833c2e588c1", + "MyPageNoticeRoller.swift": "1bd3f0dfc2ee59ce692291bf3079b06874e7c1012e4365105d3636928e29fe8a", + "ColorExtension.swift": "747347d86ade888fe9c1d30629285b4a71991bc0f21189a0d4b76ad314c32364", + "GetNoticeResponse.swift": "bbf55eb38659af3df7c6db29af0fa7904d0f87457ec098068fe96e282cee1977", + "FontModifier.swift": "086fb0a19d884124a4cca638f7c8483de724ee31a61603b2cbd489aabf26a6c6" + }, + "harness_binary_sha256": "3a374bca52920ffe33a9f1e6dac7cfafb526e3abd749e6e0ac32240098de50ad" +} \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/ActionCheck.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/ActionCheck.swift new file mode 100644 index 00000000..3c7abb40 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/ActionCheck.swift @@ -0,0 +1,46 @@ +import Foundation +enum AppStep { case noticeDetail(notice: NoticeItem) } +final class AppState { + static let shared = AppState() + var captured: NoticeItem? + func setAppStep(step: AppStep) { + switch step { case .noticeDetail(let notice): captured = notice } + } +} +@main struct NativeActionCheck { + static func main() throws { +let first = NoticeItem(title: "첫 번째 공지 안내", content: "

첫 번째 전체 본문

누락 없이 전달

", date: "2026-10-28") + let second = NoticeItem(title: "두 번째 서비스 소식", content: "

두 번째 전체 본문 & 보존

", date: "2026-10-27") + let third = NoticeItem(title: "세 번째 업데이트 안내", content: "

세 번째 전체 본문

\n마지막 줄", date: "2026-10-26") + let long = NoticeItem(title: "서비스 업데이트와 새로운 기능을 안내합니다 공지사항의 긴 한국어 제목을 끝까지 확인해 주세요", content: "

긴 제목의 전체 본문

", date: "2026-10-25") + + var records: [[String: Any]] = [] + for count in 0...3 { + let items = Array([first, second, third].prefix(count)) + var roller = MyPageNoticeRoller() + roller.update(items) + for offset in 0...max(count, 1) { + guard let item = roller.current else { + precondition(count == 0) + records.append(["count": count, "current": "none"]) + break + } + let callback = { AppState.shared.setAppStep(step: .noticeDetail(notice: item)) } + callback() + let expected = items[count > 1 ? offset % count : 0] + precondition(item == expected && AppState.shared.captured == expected) + records.append(["count": count, "offset": offset, "title": item.title, "content": item.content, "date": item.date, "payloadEqual": true]) + roller.advance() + } + } + var roller = MyPageNoticeRoller() + roller.update([long]) + let item = roller.current! + let callback = { AppState.shared.setAppStep(step: .noticeDetail(notice: item)) } + callback() + precondition(AppState.shared.captured == long) + records.append(["count": 1, "title": item.title, "content": item.content, "date": item.date, "payloadEqual": true]) + let data = try JSONSerialization.data(withJSONObject: ["surface": "actual state helper and extracted Button callback, NOT UI activation", "records": records], options: [.prettyPrinted, .sortedKeys]) + FileHandle.standardOutput.write(data) + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/ColorExtension.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/ColorExtension.swift new file mode 100644 index 00000000..742e4ad8 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/ColorExtension.swift @@ -0,0 +1,40 @@ +// +// ColorExtension.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// +// https://seons-dev.tistory.com/174 +// + +import SwiftUI + +extension Color { + init(hex: String) { + let scanner = Scanner(string: hex) + _ = scanner.scanString("#") + + var rgb: UInt64 = 0 + scanner.scanHexInt64(&rgb) + + let r = Double((rgb >> 16) & 0xFF) / 255.0 + let g = Double((rgb >> 8) & 0xFF) / 255.0 + let b = Double((rgb >> 0) & 0xFF) / 255.0 + self.init(red: r, green: g, blue: b) + } +} + +extension UIColor { + convenience init(hex: String, alpha: CGFloat = 1.0) { + let scanner = Scanner(string: hex) + _ = scanner.scanString("#") + + var rgb: UInt64 = 0 + scanner.scanHexInt64(&rgb) + + let r = Double((rgb >> 16) & 0xFF) / 255.0 + let g = Double((rgb >> 8) & 0xFF) / 255.0 + let b = Double((rgb >> 0) & 0xFF) / 255.0 + self.init(red: r, green: g, blue: b, alpha: alpha) + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/FontModifier.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/FontModifier.swift new file mode 100644 index 00000000..33ba84e5 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/FontModifier.swift @@ -0,0 +1,164 @@ +// +// FontModifier.swift +// SodaLive +// +// Created by klaus on 1/23/26. +// + +import SwiftUI + +enum SodaTypography { + case heading1 + case heading2 + case heading3 + case heading4 + case body1 + case body2 + case body3 + case body4 + case body5 + case body6 + case caption1 + case caption2 + case caption3 + + var size: CGFloat { + switch self { + case .heading1: + return 24 + case .heading2: + return 22 + case .heading3: + return 20 + case .heading4: + return 18 + case .body1, .body2, .body3: + return 16 + case .body4, .body5, .body6: + return 14 + case .caption1, .caption2, .caption3: + return 12 + } + } + + func localizedFontName(locale: Locale = .autoupdatingCurrent) -> String? { + fontName(for: .localized, weight: weight, locale: locale) + } + + var weight: SwiftUI.Font.Weight { + switch self { + case .heading1, .heading2, .heading3, .heading4, .body1, .body4, .caption1: + return .bold + case .body2, .body5, .caption2: + return .medium + case .body3, .body6, .caption3: + return .regular + } + } +} + +enum SodaFontFamily { + case localized + case pattaya + case phosphate +} + +private func resolvedLanguageCode(currentLocale: Locale) -> String? { + if let raw = UserDefaults.standard.string(forKey: "app.language"), + let option = LanguageOption(rawValue: raw), + option != .system { + return option.rawValue + } + return currentLocale.language.languageCode?.identifier +} + +private func koreanFontName(for weight: SwiftUI.Font.Weight) -> String { + switch weight { + case .bold: + return "Pretendard-Bold" + case .medium: + return "Pretendard-Medium" + case .light: + return "Pretendard-Light" + default: + return "Pretendard-Regular" + } +} + +private func japaneseFontName(for weight: SwiftUI.Font.Weight) -> String { + switch weight { + case .bold: + return "NotoSansJP-Bold" + case .medium: + return "NotoSansJP-Medium" + case .light: + return "NotoSansJP-Light" + default: + return "NotoSansJP-Regular" + } +} + +private func fontName(for family: SodaFontFamily, weight: SwiftUI.Font.Weight, locale: Locale) -> String? { + switch family { + case .localized: + switch resolvedLanguageCode(currentLocale: locale) { + case "ko": + return koreanFontName(for: weight) + case "ja": + return japaneseFontName(for: weight) + default: + return nil + } + case .pattaya: + return "Pattaya-Regular" + case .phosphate: + return "PhosphateSolid" + } +} + +struct FontModifier: ViewModifier { + @Environment(\.locale) private var locale + let size: CGFloat + let weight: SwiftUI.Font.Weight + let family: SodaFontFamily + + func body(content: Content) -> some View { + if let fontName = fontName(for: family, weight: weight, locale: locale) { + content.font(.custom(fontName, size: size)) + } else { + content.font(.system(size: size, weight: weight)) + } + } +} + +extension View { + func appFont( + size: CGFloat, + weight: SwiftUI.Font.Weight = .regular, + family: SodaFontFamily = .localized + ) -> some View { + self.modifier(FontModifier(size: size, weight: weight, family: family)) + } + + func appFont(_ typography: SodaTypography, family: SodaFontFamily = .localized) -> some View { + appFont(size: typography.size, weight: typography.weight, family: family) + } +} + +extension Text { + func appFont( + size: CGFloat, + weight: SwiftUI.Font.Weight = .regular, + family: SodaFontFamily = .localized + ) -> Text { + if let fontName = fontName(for: family, weight: weight, locale: .autoupdatingCurrent) { + return self.font(.custom(fontName, size: size)) + } + + return self.font(.system(size: size, weight: weight)) + } + + func appFont(_ typography: SodaTypography, family: SodaFontFamily = .localized) -> Text { + appFont(size: typography.size, weight: typography.weight, family: family) + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/GetNoticeResponse.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/GetNoticeResponse.swift new file mode 100644 index 00000000..6cbe3604 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/GetNoticeResponse.swift @@ -0,0 +1,19 @@ +// +// GetNoticeResponse.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import Foundation + +struct GetNoticeResponse: Decodable { + let totalCount: Int + let noticeList: [NoticeItem] +} + +struct NoticeItem: Decodable, Hashable { + let title: String + let content: String + let date: String +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/Harness.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/Harness.swift new file mode 100644 index 00000000..e7793dfd --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/Harness.swift @@ -0,0 +1,221 @@ +import SwiftUI +import UIKit + +enum LanguageOption: String { case system, ko, en, ja } + +enum AppStep { case noticeDetail(notice: NoticeItem) } + +final class AppState { + static let shared = AppState() + var captures: [[String: String]] = [] + var phases: [[String: String]] = [] + func setAppStep(step: AppStep) { + switch step { + case .noticeDetail(let notice): + captures.append(["title": notice.title, "content": notice.content, "date": notice.date]) + } + } +} + +struct PhaseProbe: View { + @Environment(\.scenePhase) private var phase + var body: some View { + Color.clear + .onAppear { AppState.shared.phases.append(["event": "appear", "phase": String(describing: phase)]) } + .onChange(of: phase) { value in AppState.shared.phases.append(["event": "change", "phase": String(describing: value)]) } + } +} + +final class HarnessState: ObservableObject { + @Published var items: [NoticeItem] = [] + @Published var mounted = true + @Published var phase = ScenePhase.active + @Published var scenario = "preparing" +} + +struct HarnessRoot: View { + @ObservedObject var state: HarnessState + var body: some View { + VStack(alignment: .leading, spacing: 0) { + VStack(alignment: .leading, spacing: 8) { + Text("NATIVE QA HARNESS").font(.headline) + Text(state.scenario).font(.caption.monospaced()) + Text("Actual UpdateBannerView below").font(.caption) + } + .foregroundStyle(.white) + .padding(24) + if state.mounted && !state.items.isEmpty { + UpdateBannerView(items: state.items) + .background(PhaseProbe()) + .environment(\.scenePhase, state.phase) + } + Text("Harness context / no network / no login") + .font(.caption) + .foregroundStyle(.gray) + .padding(24) + Spacer() + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + .background(Color(hex: "131313")) + .environment(\.locale, Locale(identifier: "ko_KR")) + } +} + +final class HarnessDelegate: NSObject, UIApplicationDelegate { + var window: UIWindow? + let state = HarnessState() + let started = ProcessInfo.processInfo.systemUptime + var events: [[String: Any]] = [] + let output = URL.documentsDirectory.appendingPathComponent(CommandLine.arguments.contains("--lifecycle") ? "lifecycle" : "matrix", isDirectory: true) + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { + UserDefaults.standard.set("ko", forKey: "app.language") + try! FileManager.default.createDirectory(at: output, withIntermediateDirectories: true) + let window = UIWindow(frame: UIScreen.main.bounds) + window.rootViewController = UIHostingController(rootView: HarnessRoot(state: state)) + window.overrideUserInterfaceStyle = .dark + self.window = window + window.makeKeyAndVisible() + NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main) { [weak self] _ in + self?.state.phase = .inactive + self?.record("application-willResignActive") + } + NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { [weak self] _ in + self?.state.phase = .active + self?.record("application-didBecomeActive") + } + after(1) { self.run() } + return true + } + + func after(_ seconds: Double, _ action: @escaping () -> Void) { + DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: action) + } + + func record(_ event: String, details: [String: Any] = [:]) { + var entry = details + entry["event"] = event + entry["uptime"] = ProcessInfo.processInfo.systemUptime - started + entry["scenario"] = state.scenario + events.append(entry) + let data = try! JSONSerialization.data(withJSONObject: events, options: [.prettyPrinted, .sortedKeys]) + try! data.write(to: output.appendingPathComponent("actions.json")) + } + + func elements() -> [NSObject] { + var found: [NSObject] = [] + var visited = Set() + func visit(_ object: NSObject, depth: Int) { + guard depth < 30, visited.insert(ObjectIdentifier(object)).inserted else { return } + if object.isAccessibilityElement { found.append(object) } + if let children = object.accessibilityElements { + for child in children { if let child = child as? NSObject { visit(child, depth: depth + 1) } } + } + let count = object.accessibilityElementCount() + if count > 0 && count < 1000 { + for index in 0.. [String: Any] in + let frame = node.accessibilityFrame + return ["class": String(describing: type(of: node)), "label": node.accessibilityLabel ?? "", "button": node.accessibilityTraits.contains(.button), "x": frame.minX, "y": frame.minY, "width": frame.width, "height": frame.height] + }] + details["phaseProbe"] = AppState.shared.phases + details["requestedPhase"] = String(describing: state.phase) + if activate { + let before = AppState.shared.captures.count + let button = nodes.first { node in + node.accessibilityTraits.contains(.button) && state.items.contains(where: { node.accessibilityLabel?.contains($0.title) == true }) + } + details["accessibilityActivateResult"] = button?.accessibilityActivate() ?? false + details["captureDelta"] = AppState.shared.captures.count - before + details["sink"] = AppState.shared.captures + } + if screenshot, let window { + let renderer = UIGraphicsImageRenderer(bounds: window.bounds) + let image = renderer.image { _ in window.drawHierarchy(in: window.bounds, afterScreenUpdates: true) } + try! image.pngData()!.write(to: output.appendingPathComponent(name + ".png")) + details["screenshot"] = name + ".png" + } + record(name, details: details) + } + + func set(_ scenario: String, items: [NoticeItem]) { + state.scenario = scenario + state.items = items + state.phase = .active + state.mounted = true + record("scenario-start") + } + + func run() { + let first = NoticeItem(title: "첫 번째 공지 안내", content: "

첫 번째 전체 본문

누락 없이 전달

", date: "2026-10-28") + let second = NoticeItem(title: "두 번째 서비스 소식", content: "

두 번째 전체 본문 & 보존

", date: "2026-10-27") + let third = NoticeItem(title: "세 번째 업데이트 안내", content: "

세 번째 전체 본문

\n마지막 줄", date: "2026-10-26") + let long = NoticeItem(title: "서비스 업데이트와 새로운 기능을 안내합니다 공지사항의 긴 한국어 제목을 끝까지 확인해 주세요", content: "

긴 제목의 전체 본문

", date: "2026-10-25") + if CommandLine.arguments.contains("--lifecycle") { + set("phase-probe", items: [first, second, third]) + after(0.8) { self.sample("phase-first") } + after(6.8) { self.sample("phase-before-inactive") } + after(8) { self.state.phase = .inactive; self.record("inject-inactive") } + after(8.8) { self.sample("phase-inactive-start") } + after(14.8) { self.sample("phase-inactive-after-6s") } + after(16) { self.state.phase = .active; self.record("inject-active") } + after(20.3) { self.sample("phase-active-before-5s") } + after(22.8) { self.sample("phase-active-next") } + after(25) { self.record("lifecycle-probe-finished") } + return + } + func stage(_ name: String, _ items: [NoticeItem], samples: [(Double, String)], duration: Double, next: @escaping () -> Void) { + self.set(name, items: items) + for (delay, identifier) in samples { + self.after(delay) { self.sample(identifier, activate: true) } + } + self.after(duration, next) + } + stage("zero", [], samples: [(0.7, "zero")], duration: 2) { + stage("one", [first], samples: [(0.7, "one-initial"), (6.8, "one-after-6s")], duration: 8) { + stage("two", [first, second], samples: [(0.7, "two-first"), (4.3, "two-before-5s"), (5.15, "two-transition-mid"), (6.8, "two-second"), (11.8, "two-wrap-first")], duration: 13) { + stage("three", [first, second, third], samples: [(0.7, "three-first"), (6.8, "three-second"), (11.8, "three-third"), (16.8, "three-wrap-first")], duration: 18) { + stage("long-korean", [long], samples: [(0.7, "long-korean-dark"), (2.7, "long-korean-light")], duration: 4) { + self.window?.overrideUserInterfaceStyle = .dark + stage("inactive-environment", [first, second, third], samples: [(6.8, "inactive-before"), (8.2, "inactive-start"), (14.3, "inactive-after-6s"), (19.3, "reactivated-before-5s"), (21.8, "reactivated-next")], duration: 23) { + self.state.scenario = "remount" + self.state.mounted = false + self.record("unmount-banner") + self.after(0.7) { self.sample("unmounted-start") } + self.after(6.8) { self.sample("unmounted-after-6s") } + self.after(7.5) { self.state.mounted = true; self.record("remount-banner") } + self.after(8.2) { self.sample("remounted-first", activate: true) } + self.after(11.8) { self.sample("remounted-before-5s") } + self.after(14.3) { self.sample("remounted-second", activate: true) } + self.after(16) { + stage("shrink-to-one", [first], samples: [(0.7, "shrink-reset-first"), (6.8, "shrink-one-after-6s")], duration: 8) { + stage("shrink-to-empty", [], samples: [(0.7, "shrink-empty")], duration: 2) { self.record("matrix-finished") } + } + } + } + self.after(7.5) { self.state.phase = .inactive; self.record("inject-scenePhase-inactive") } + self.after(15) { self.state.phase = .active; self.record("inject-scenePhase-active") } + } + self.after(1.7) { self.window?.overrideUserInterfaceStyle = .light } + } + } + } + } + } +} + +@main +struct NoticeQAEntry { + static func main() { UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(HarnessDelegate.self)) } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/Info.plist b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/Info.plist new file mode 100644 index 00000000..244d24c0 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/Info.plist @@ -0,0 +1,16 @@ + + + +CFBundleIdentifierlocal.sodalive.NoticeNativeQA +CFBundleExecutableNoticeNativeQA +CFBundleNameNoticeNativeQA +CFBundlePackageTypeAPPL +CFBundleVersion1 +CFBundleShortVersionString1.0 +LSRequiresIPhoneOS +MinimumOSVersion16.6 +UIDeviceFamily12 +UILaunchScreen +UIAppFontsPretendard-Regular.otf +UISupportedInterfaceOrientationsUIInterfaceOrientationPortrait + diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/MyPageNoticeRoller.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/MyPageNoticeRoller.swift new file mode 100644 index 00000000..bba4fe1f --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/MyPageNoticeRoller.swift @@ -0,0 +1,25 @@ +import Foundation + +struct MyPageNoticeRoller { + private var items: [NoticeItem] = [] + private(set) var index = 0 + + var current: NoticeItem? { + items.isEmpty ? nil : items[index] + } + + mutating func update(_ items: [NoticeItem]) { + guard self.items != items else { return } + self.items = items + index = 0 + } + + mutating func advance() { + guard items.count > 1 else { return } + index = (index + 1) % items.count + } + + func shouldRoll(isVisible: Bool, isActive: Bool) -> Bool { + items.count > 1 && isVisible && isActive + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/Spacing.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/Spacing.swift new file mode 100644 index 00000000..d3d65ea3 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/Spacing.swift @@ -0,0 +1,20 @@ +// +// Spacing.swift +// SodaLive +// + +import SwiftUI + +enum SodaSpacing { + static let s4: CGFloat = 4 + static let s6: CGFloat = 6 + static let s8: CGFloat = 8 + static let s12: CGFloat = 12 + static let s14: CGFloat = 14 + static let s16: CGFloat = 16 + static let s20: CGFloat = 20 + static let s24: CGFloat = 24 + static let s28: CGFloat = 28 + static let s32: CGFloat = 32 + static let s48: CGFloat = 48 +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/UpdateBannerView.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/UpdateBannerView.swift new file mode 100644 index 00000000..5c89ac5d --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/source/UpdateBannerView.swift @@ -0,0 +1,84 @@ +import SwiftUI + +struct UpdateBannerView: View { + private static let foregroundColor = Color(hex: "B0BEC5") + private static let rollInterval: TimeInterval = 5 + private static let transitionDuration: TimeInterval = 0.35 + + let items: [NoticeItem] + + @Environment(\.scenePhase) private var scenePhase + @Environment(\.accessibilityReduceMotion) private var reduceMotion + @State private var roller = MyPageNoticeRoller() + @State private var rollTimer: Timer? + @State private var isVisible = false + + var body: some View { + ZStack { + if let item = roller.current { + Button { + AppState.shared.setAppStep(step: .noticeDetail(notice: item)) + } label: { + HStack(spacing: SodaSpacing.s8) { + Text(item.title) + .appFont(.body3) + .lineLimit(1) + .truncationMode(.tail) + .frame(maxWidth: .infinity, alignment: .leading) + + Image(systemName: "chevron.right") + .frame(width: SodaSpacing.s24, height: SodaSpacing.s24) + .accessibilityHidden(true) + } + .foregroundColor(Self.foregroundColor) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .id(roller.index) + .transition(reduceMotion ? .identity : .asymmetric( + insertion: .move(edge: .bottom), + removal: .move(edge: .top) + )) + } + } + .clipped() + .padding(.horizontal, SodaSpacing.s24) + .padding(.vertical, SodaSpacing.s6) + .background(Color.black) + .onAppear { + isVisible = true + roller.update(items) + restartRollTimer() + } + .onDisappear { + isVisible = false + stopRollTimer() + } + .onChange(of: items) { items in + roller.update(items) + restartRollTimer() + } + .onChange(of: scenePhase) { _ in + restartRollTimer() + } + .onChange(of: reduceMotion) { _ in + restartRollTimer() + } + } + + private func restartRollTimer() { + stopRollTimer() + guard roller.shouldRoll(isVisible: isVisible, isActive: scenePhase == .active) else { return } + + rollTimer = Timer.scheduledTimer(withTimeInterval: Self.rollInterval, repeats: true) { _ in + withAnimation(reduceMotion ? nil : .easeOut(duration: Self.transitionDuration)) { + roller.advance() + } + } + } + + private func stopRollTimer() { + rollTimer?.invalidate() + rollTimer = nil + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/state-callback.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/state-callback.json new file mode 100644 index 00000000..cb5ad824 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/state-callback.json @@ -0,0 +1,88 @@ +{ + "records" : [ + { + "count" : 0, + "current" : "none" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 1, + "date" : "2026-10-28", + "offset" : 0, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 1, + "date" : "2026-10-28", + "offset" : 1, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 2, + "date" : "2026-10-28", + "offset" : 0, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

두 번째 전체 본문 & 보존<\/p>", + "count" : 2, + "date" : "2026-10-27", + "offset" : 1, + "payloadEqual" : true, + "title" : "두 번째 서비스 소식" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 2, + "date" : "2026-10-28", + "offset" : 2, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 3, + "date" : "2026-10-28", + "offset" : 0, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

두 번째 전체 본문 & 보존<\/p>", + "count" : 3, + "date" : "2026-10-27", + "offset" : 1, + "payloadEqual" : true, + "title" : "두 번째 서비스 소식" + }, + { + "content" : "

세 번째 전체 본문<\/p>\n마지막 줄", + "count" : 3, + "date" : "2026-10-26", + "offset" : 2, + "payloadEqual" : true, + "title" : "세 번째 업데이트 안내" + }, + { + "content" : "

첫 번째 전체 본문<\/p>

누락 없이 전달<\/p>", + "count" : 3, + "date" : "2026-10-28", + "offset" : 3, + "payloadEqual" : true, + "title" : "첫 번째 공지 안내" + }, + { + "content" : "

긴 제목의 전체 본문<\/p>", + "count" : 1, + "date" : "2026-10-25", + "payloadEqual" : true, + "title" : "서비스 업데이트와 새로운 기능을 안내합니다 공지사항의 긴 한국어 제목을 끝까지 확인해 주세요" + } + ], + "surface" : "actual state helper and extracted Button callback, NOT UI activation" +} \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/verification.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/verification.json new file mode 100644 index 00000000..41f94ccb --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/native/verification.json @@ -0,0 +1,542 @@ +{ + "verdict": "NEEDS WORK: lifecycle fails; not a full app approval", + "imageCount": 36, + "images": [ + { + "file": "lifecycle/phase-active-before-5s.png", + "width": 750, + "height": 1334, + "sha256": "a69fa393ba3c4cb35d59755608d8ba76bf9c0e8a6c47cb583a7ab4ffe2836bfe", + "fresh": true + }, + { + "file": "lifecycle/phase-active-next.png", + "width": 750, + "height": 1334, + "sha256": "a69fa393ba3c4cb35d59755608d8ba76bf9c0e8a6c47cb583a7ab4ffe2836bfe", + "fresh": true + }, + { + "file": "lifecycle/phase-before-inactive.png", + "width": 750, + "height": 1334, + "sha256": "103a498d121e35cd7c0890cfdd0e9093b8dc99d822642dbd3ea8decf6830e9c7", + "fresh": true + }, + { + "file": "lifecycle/phase-first.png", + "width": 750, + "height": 1334, + "sha256": "21584cbfbf9e646b76a04e8ea1a48bbffef57f018a8bf6b923056da1a3075d3d", + "fresh": true + }, + { + "file": "lifecycle/phase-inactive-after-6s.png", + "width": 750, + "height": 1334, + "sha256": "a69fa393ba3c4cb35d59755608d8ba76bf9c0e8a6c47cb583a7ab4ffe2836bfe", + "fresh": true + }, + { + "file": "lifecycle/phase-inactive-start.png", + "width": 750, + "height": 1334, + "sha256": "103a498d121e35cd7c0890cfdd0e9093b8dc99d822642dbd3ea8decf6830e9c7", + "fresh": true + }, + { + "file": "matrix/inactive-after-6s.png", + "width": 750, + "height": 1334, + "sha256": "cd73444cafc0cce267b60e0c3d3cd5d72a1520c62e5297e6e5b56b560925d6b0", + "fresh": true + }, + { + "file": "matrix/inactive-before.png", + "width": 750, + "height": 1334, + "sha256": "e079945c4c6991682cb9cd0d10341cb616242466e0508c6f00a0e61338bc481c", + "fresh": true + }, + { + "file": "matrix/inactive-start.png", + "width": 750, + "height": 1334, + "sha256": "e079945c4c6991682cb9cd0d10341cb616242466e0508c6f00a0e61338bc481c", + "fresh": true + }, + { + "file": "matrix/long-korean-dark.png", + "width": 750, + "height": 1334, + "sha256": "811c747563f3c3eef3811054b17f96e3821bfa03a08413ab16b4fc92fd861f10", + "fresh": true + }, + { + "file": "matrix/long-korean-light.png", + "width": 750, + "height": 1334, + "sha256": "811c747563f3c3eef3811054b17f96e3821bfa03a08413ab16b4fc92fd861f10", + "fresh": true + }, + { + "file": "matrix/one-after-6s.png", + "width": 750, + "height": 1334, + "sha256": "d5bd330038376241762a2cd6cb723f072f32b0f125de774bab72f3d3fc426433", + "fresh": true + }, + { + "file": "matrix/one-initial.png", + "width": 750, + "height": 1334, + "sha256": "d5bd330038376241762a2cd6cb723f072f32b0f125de774bab72f3d3fc426433", + "fresh": true + }, + { + "file": "matrix/reactivated-before-5s.png", + "width": 750, + "height": 1334, + "sha256": "cd73444cafc0cce267b60e0c3d3cd5d72a1520c62e5297e6e5b56b560925d6b0", + "fresh": true + }, + { + "file": "matrix/reactivated-next.png", + "width": 750, + "height": 1334, + "sha256": "cd73444cafc0cce267b60e0c3d3cd5d72a1520c62e5297e6e5b56b560925d6b0", + "fresh": true + }, + { + "file": "matrix/remounted-before-5s.png", + "width": 750, + "height": 1334, + "sha256": "0d820088fe35e747f35e59fdd8854d4b1a85dea83d8d055770f9b97ace627cd9", + "fresh": true + }, + { + "file": "matrix/remounted-first.png", + "width": 750, + "height": 1334, + "sha256": "0d820088fe35e747f35e59fdd8854d4b1a85dea83d8d055770f9b97ace627cd9", + "fresh": true + }, + { + "file": "matrix/remounted-second.png", + "width": 750, + "height": 1334, + "sha256": "b782aa7eba591e190e60b8bc2b58c353fa358415f410384049eb2052e964c375", + "fresh": true + }, + { + "file": "matrix/shrink-empty.png", + "width": 750, + "height": 1334, + "sha256": "89f18c85fe95fa5a9a126cfee45e1185b7d21018943dae12e65939008ffa8fae", + "fresh": true + }, + { + "file": "matrix/shrink-one-after-6s.png", + "width": 750, + "height": 1334, + "sha256": "14a8d4fe2b9cb8df4d843c6337830efa1b8c304ea7a83313a48dd5945e434dbe", + "fresh": true + }, + { + "file": "matrix/shrink-reset-first.png", + "width": 750, + "height": 1334, + "sha256": "14a8d4fe2b9cb8df4d843c6337830efa1b8c304ea7a83313a48dd5945e434dbe", + "fresh": true + }, + { + "file": "matrix/three-first.png", + "width": 750, + "height": 1334, + "sha256": "6290705ceaea19c4bc7702ddcda83e30ab68ef1da46072121ab627e73f89ebb9", + "fresh": true + }, + { + "file": "matrix/three-second.png", + "width": 750, + "height": 1334, + "sha256": "5ad43d2dc2e39a53e31a08792b0d0280eb36a3ce46b0f29152a49db107f6b23f", + "fresh": true + }, + { + "file": "matrix/three-third.png", + "width": 750, + "height": 1334, + "sha256": "96494648b7e1653e83b620f3bf69c664921bd0bc3cf35da451430be2fd5469e4", + "fresh": true + }, + { + "file": "matrix/three-wrap-first.png", + "width": 750, + "height": 1334, + "sha256": "6290705ceaea19c4bc7702ddcda83e30ab68ef1da46072121ab627e73f89ebb9", + "fresh": true + }, + { + "file": "matrix/two-before-5s.png", + "width": 750, + "height": 1334, + "sha256": "a92e3ab9e7d8892eb19187f656f881861ee4ca0443a44c6282f0716a403a6186", + "fresh": true + }, + { + "file": "matrix/two-first.png", + "width": 750, + "height": 1334, + "sha256": "a92e3ab9e7d8892eb19187f656f881861ee4ca0443a44c6282f0716a403a6186", + "fresh": true + }, + { + "file": "matrix/two-second.png", + "width": 750, + "height": 1334, + "sha256": "028ac53f80d69ee0e693e33043133f4339b4cba38465e7d192ac1877689f2796", + "fresh": true + }, + { + "file": "matrix/two-transition-mid.png", + "width": 750, + "height": 1334, + "sha256": "7864b94177cd6daffa376044ff1a73d619a8421c8a63be589d0da042bd1b609d", + "fresh": true + }, + { + "file": "matrix/two-wrap-first.png", + "width": 750, + "height": 1334, + "sha256": "a92e3ab9e7d8892eb19187f656f881861ee4ca0443a44c6282f0716a403a6186", + "fresh": true + }, + { + "file": "matrix/unmounted-after-6s.png", + "width": 750, + "height": 1334, + "sha256": "55600884241b926a4ff02b712cf7ea5162b5e937af192bbc7a177c7c4c4f5a43", + "fresh": true + }, + { + "file": "matrix/unmounted-start.png", + "width": 750, + "height": 1334, + "sha256": "55600884241b926a4ff02b712cf7ea5162b5e937af192bbc7a177c7c4c4f5a43", + "fresh": true + }, + { + "file": "matrix/zero.png", + "width": 750, + "height": 1334, + "sha256": "c8fabbad2e028ee0c2a89bc4841bf5b2233e2eb3ee33f1d25ae2d4e09f6069ad", + "fresh": true + }, + { + "file": "os-before-background.png", + "width": 750, + "height": 1334, + "sha256": "3a16c67bf881dc7405c9f04aebf90d08720567d9408420e47f9e511080da6b24", + "fresh": true + }, + { + "file": "os-resume-after-7s.png", + "width": 750, + "height": 1334, + "sha256": "65c773fef1546972fc644c96fa1e8a1b11c2635cbbda55723f2dfb0df5059487", + "fresh": true + }, + { + "file": "os-resume-initial.png", + "width": 750, + "height": 1334, + "sha256": "65c773fef1546972fc644c96fa1e8a1b11c2635cbbda55723f2dfb0df5059487", + "fresh": true + } + ], + "checks": [ + { + "screenshot": "matrix/zero.png", + "expected": "", + "actualOCR": "", + "pass": true, + "uptime": 2.1232413940597326, + "secondsAfterScenarioStart": 0.8337286639725789 + }, + { + "screenshot": "matrix/one-initial.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 4.109572621062398, + "secondsAfterScenarioStart": 0.8179513630457222 + }, + { + "screenshot": "matrix/one-after-6s.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 10.183676649001427, + "secondsAfterScenarioStart": 6.892055390984751 + }, + { + "screenshot": "matrix/two-first.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 12.137990792980418, + "secondsAfterScenarioStart": 0.8212462469236925 + }, + { + "screenshot": "matrix/two-before-5s.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 15.702694575069472, + "secondsAfterScenarioStart": 4.385950029012747 + }, + { + "screenshot": "matrix/two-second.png", + "expected": "두 번째", + "actualOCR": "두 번째 서비스 소식", + "pass": true, + "uptime": 18.346050271065906, + "secondsAfterScenarioStart": 7.029305725009181 + }, + { + "screenshot": "matrix/two-wrap-first.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 23.523510750033893, + "secondsAfterScenarioStart": 12.206766203977168 + }, + { + "screenshot": "matrix/three-first.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 25.293358479975723, + "secondsAfterScenarioStart": 0.8217160599306226 + }, + { + "screenshot": "matrix/three-second.png", + "expected": "두 번째", + "actualOCR": "두 번째 서비스 소식", + "pass": true, + "uptime": 31.361499255988747, + "secondsAfterScenarioStart": 6.889856835943647 + }, + { + "screenshot": "matrix/three-third.png", + "expected": "세 번째", + "actualOCR": "세 번째 업데이트 안내", + "pass": true, + "uptime": 36.52223286405206, + "secondsAfterScenarioStart": 12.050590444006957 + }, + { + "screenshot": "matrix/three-wrap-first.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 41.47793771699071, + "secondsAfterScenarioStart": 17.00629529694561 + }, + { + "screenshot": "matrix/long-korean-dark.png", + "expected": "서비스 업데이트", + "actualOCR": "서비스 업데이트와 새로운 기능을 안내합니다...", + "pass": true, + "uptime": 44.19119220098946, + "secondsAfterScenarioStart": 0.8177370469784364 + }, + { + "screenshot": "matrix/long-korean-light.png", + "expected": "서비스 업데이트", + "actualOCR": "서비스 업데이트와 새로운 기능을 안내합니다...", + "pass": true, + "uptime": 46.1626460570842, + "secondsAfterScenarioStart": 2.7891909030731767 + }, + { + "screenshot": "matrix/inactive-before.png", + "expected": "두 번째", + "actualOCR": "두 번째 서비스 소식", + "pass": true, + "uptime": 54.609815668081865, + "secondsAfterScenarioStart": 7.23125286900904 + }, + { + "screenshot": "matrix/inactive-start.png", + "expected": "두 번째", + "actualOCR": "두 번째 서비스 소식", + "pass": true, + "uptime": 55.97593361698091, + "secondsAfterScenarioStart": 8.597370817908086 + }, + { + "screenshot": "matrix/inactive-after-6s.png", + "expected": "두 번째", + "actualOCR": "세 번째 업데이트 안내", + "pass": false, + "uptime": 62.47543053806294, + "secondsAfterScenarioStart": 15.096867738990113 + }, + { + "screenshot": "matrix/reactivated-before-5s.png", + "expected": "세 번째", + "actualOCR": "세 번째 업데이트 안내", + "pass": true, + "uptime": 66.76060420705471, + "secondsAfterScenarioStart": 19.382041407981887 + }, + { + "screenshot": "matrix/reactivated-next.png", + "expected": "첫 번째", + "actualOCR": "세 번째 업데이트 안내", + "pass": false, + "uptime": 69.25886417098809, + "secondsAfterScenarioStart": 21.880301371915266 + }, + { + "screenshot": "matrix/unmounted-start.png", + "expected": "", + "actualOCR": "", + "pass": true, + "uptime": 71.19734549999703, + "secondsAfterScenarioStart": 0.8144885229412466 + }, + { + "screenshot": "matrix/unmounted-after-6s.png", + "expected": "", + "actualOCR": "", + "pass": true, + "uptime": 77.26417390897404, + "secondsAfterScenarioStart": 6.881316931918263 + }, + { + "screenshot": "matrix/remounted-first.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 78.66366765997373, + "secondsAfterScenarioStart": 8.280810682917945 + }, + { + "screenshot": "matrix/remounted-before-5s.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 82.8551287719747, + "secondsAfterScenarioStart": 12.472271794918925 + }, + { + "screenshot": "matrix/remounted-second.png", + "expected": "두 번째", + "actualOCR": "두 번째 서비스 소식", + "pass": true, + "uptime": 85.16340923204552, + "secondsAfterScenarioStart": 14.780552254989743 + }, + { + "screenshot": "matrix/shrink-reset-first.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 87.98721138201654, + "secondsAfterScenarioStart": 0.8135035239392892 + }, + { + "screenshot": "matrix/shrink-one-after-6s.png", + "expected": "첫 번째", + "actualOCR": "첫 번째 공지 안내", + "pass": true, + "uptime": 94.04897563706618, + "secondsAfterScenarioStart": 6.875267778988928 + }, + { + "screenshot": "matrix/shrink-empty.png", + "expected": "", + "actualOCR": "", + "pass": true, + "uptime": 96.02508452697657, + "secondsAfterScenarioStart": 0.8095464969519526 + }, + { + "before": "lifecycle/phase-inactive-start.png", + "after": "lifecycle/phase-inactive-after-6s.png", + "expectedSameTitle": true, + "actualSameTitle": false, + "beforeOCR": "두 번째 서비스 소식", + "afterOCR": "세 번째 업데이트 안내", + "pass": false + }, + { + "before": "lifecycle/phase-active-before-5s.png", + "after": "lifecycle/phase-active-next.png", + "expectedSameTitle": false, + "actualSameTitle": true, + "beforeOCR": "세 번째 업데이트 안내", + "afterOCR": "세 번째 업데이트 안내", + "pass": false + }, + { + "before": "os-resume-initial.png", + "after": "os-resume-after-7s.png", + "expectedSameTitle": false, + "actualSameTitle": true, + "beforeOCR": "첫 번째 공지 안내", + "afterOCR": "첫 번째 공지 안내", + "pass": false + } + ], + "failedChecks": [ + { + "screenshot": "matrix/inactive-after-6s.png", + "expected": "두 번째", + "actualOCR": "세 번째 업데이트 안내", + "pass": false, + "uptime": 62.47543053806294, + "secondsAfterScenarioStart": 15.096867738990113 + }, + { + "screenshot": "matrix/reactivated-next.png", + "expected": "첫 번째", + "actualOCR": "세 번째 업데이트 안내", + "pass": false, + "uptime": 69.25886417098809, + "secondsAfterScenarioStart": 21.880301371915266 + }, + { + "before": "lifecycle/phase-inactive-start.png", + "after": "lifecycle/phase-inactive-after-6s.png", + "expectedSameTitle": true, + "actualSameTitle": false, + "beforeOCR": "두 번째 서비스 소식", + "afterOCR": "세 번째 업데이트 안내", + "pass": false + }, + { + "before": "lifecycle/phase-active-before-5s.png", + "after": "lifecycle/phase-active-next.png", + "expectedSameTitle": false, + "actualSameTitle": true, + "beforeOCR": "세 번째 업데이트 안내", + "afterOCR": "세 번째 업데이트 안내", + "pass": false + }, + { + "before": "os-resume-initial.png", + "after": "os-resume-after-7s.png", + "expectedSameTitle": false, + "actualSameTitle": true, + "beforeOCR": "첫 번째 공지 안내", + "afterOCR": "첫 번째 공지 안내", + "pass": false + } + ], + "interactionLimit": "Native accessibility traversal returned no actionable nodes. accessibilityActivate false, sinkDelta=0. Physical tap and UI navigation untested. Separate real helper/extracted callback driver payload checks passed.", + "sourceHashStable": true +} \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/README.md b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/README.md new file mode 100644 index 00000000..5a7fa3d7 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/README.md @@ -0,0 +1,48 @@ +# P1-T2 제목 전용 롤링 증거 + +제품 변경은 `SodaLive/Sources/MyPage/MyPageView.swift`의 `UpdateBannerView` 표시 구조뿐이다. `Text`의 identity·기존 비대칭 전환을 제목용 `ZStack` 안에 두고 그 영역을 clip했다. 화살표는 고정된 `HStack` 형제이며 Button에는 identity·전환이 없다. 기존 if-let, 현재 공지 상세 callback, padding 이후 contentShape, 글꼴·색상·제목 폭, 5초 Timer·생명주기·Reduce Motion 경로는 유지했다. + +제품 SHA-256: `af77569942c0bbdbad0242431362b5987dc278d8f70d015ccc1ef675b2b264ed`. +작업 전 SHA-256: `7f8ac15573ab4c9fe01508431297e40d2e95a22ad37585859f03224475749d02`. +현재 파일의 배너 부분을 기존 retained 배너로 메모리에서 치환한 해시가 작업 전 파일과 일치한다. 배너 밖 기존 작업은 그대로다. 이 확인은 변경 범위 증명이며 UI 동작 테스트가 아니다. + +## 네이티브 확인 + +기존 `../native-fix/rerun-154222/source/Harness.swift`를 재사용하고 임시 복사본의 `run()` 시나리오만 축소했다. 루트 뷰·캡처 구현은 동일하다. 현재 제품 배너와 실제 helper/DTO/font/spacing/color를 추출하여 UIKit `UIHostingController`로 컴파일했다. Pretendard-Regular 폰트도 앱에 포함했다. 전체 SodaLive 앱이나 웹 모사가 아니다. 입력과 대체한 AppState sink·LanguageOption은 [provenance.json](provenance.json), 실행한 정확한 명령·exit·출력은 [commands.json](commands.json), 컴파일 입력은 [source/](source/)에 있다. + +전용 iPhone SE3 / iOS 18.3 / 375pt 폭에서 새 native `drawHierarchy` PNG 10장을 생성했다. 모든 PNG의 signature·750×1334 크기·추출 배너 이후 생성 여부를 검사했다. [전체 배너 비교판](banner-contact-sheet.png) 및 원본 [frames/](frames/)를 직접 열어 확인했다. 원본 PNG를 수정하지 않았으며 `*-banner.png`는 명시적인 관찰용 crop이다. + +| 시나리오 | 근거와 관측 | +|---|---| +| 2개 첫 교체 | `frames/two-rest.png` 첫째 → `two-end.png` 둘째, 제목 영역 변경 2,213px | +| 마지막 → 처음의 rest/mid/end | `frames/wrap-rest.png` 둘째 → `wrap-mid.png` 두 제목의 세로 이동·제목 영역 경계 clipping → `wrap-end.png` 첫째. 제목 변경은 rest→mid 3,857px, mid→end 3,796px | +| 1개 고정 | `frames/one-rest.png`와 `one-after-6s.png`의 제목·화살표 영역 동일 | +| 긴 한글 제목 | `frames/long-dark.png`, `long-light.png`: 한 줄 ellipsis, 화살표 비겹침, 배너 영역 동일 | +| 화살표 고정 | 10장 모두 crop `[654,267,702,339)`에서 변경 픽셀 0. 화살표 실제 nonblack 경계 `[672,289,689,318)`도 동일 | + +화살표 RGB 해시: `bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6`. +제목 관찰 영역은 `[48,267,638,339)`, 배너는 `[0,267,750,339)`이며 좌표는 px이다. [comparison.json](comparison.json)에 각 프레임의 해시·신선도·픽셀 수·화살표 경계를 기록했다. wrap 종료 제목은 최초 첫째와 동일하고 wrap 시작은 둘째 종료와 동일하여 실제 순환도 대조했다. + +`two-mid.png`는 예약 시각과 실제 렌더링의 차이로 전환 전에 캡처되어 rest와 같다. 이를 중간 전환의 증거로 간주하지 않는다. 실제 in-flight 증거는 `wrap-mid.png`이다. 주기를 단축하거나 제품 Timer를 교체하지 않았으며 정밀 5.000초 측정·프레임 성능 보증도 아니다. + +## 명령과 결과 + +저장소 루트에서 실행: + +```sh +python3 "docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/run.py" +python3 "docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/compare.py" +xcrun swiftc -frontend -parse SodaLive/Sources/MyPage/MyPageView.swift +GIT_MASTER=1 git diff --check +``` + +- runner 내부 `bash work/tests/check-my-page-notices.sh`: exit 0, 기존 실제 소스 회귀 검사 PASS 4줄. [focused-check.log](focused-check.log). +- 실제 추출 배너 native 컴파일 `xcrun --sdk iphonesimulator swiftc -sdk -target x86_64-apple-ios16.6-simulator -module-cache-path /module-cache -o /NoticeNativeQA.app/NoticeNativeQA`: exit 0. 확장된 모든 인자는 `commands.json` 참조. +- 제품 Swift parse와 `git diff --check`: exit 0. LSP 도구는 제공되지 않았다. +- 비교 스크립트: exit 0, 화살표 불변 10장·2개 순환·1개 고정·긴 제목·배너 밖 변경 없음 확인. + +## 자원 정리와 한계 + +소유 root는 `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7`, device는 `25EC20C1-F057-4DAD-BD61-A287C5D942C7`였다. TMPDIR·임시 캐시 환경변수를 소유 root 하위로 지정하고 atexit 정리를 등록했다. 앱 종료·전용 device shutdown/delete·root 삭제 후 부재를 확인했다. 실제 launch PID를 `ps -p -o pid=,command=`로 재확인하여 exit 1·출력 없음도 기록했다. [cleanup.json](cleanup.json)이 영수증이다. 부모 root `notice-title-only.i9lFW3`와 공유 simulator/cache는 수정하지 않았다. + +물리/좌표 탭·padding hit-test·전체 상세 이동, VoiceOver·Reduce Motion 런타임 설정 변경, 다른 폭·실기기·iOS16.6 실행은 미검증이다. 전체 앱 빌드는 부모 담당이며 수행하지 않았다. API/서버 호출, 다른 제품 코드 수정, 부모 PRD/계획 수정, 새 UI 소스 문자열 테스트, 의존성 추가, 커밋, 다른 에이전트 호출은 하지 않았다. 독립 시각 리뷰 PASS를 주장하지 않으며 이 자료는 지정된 native 범위의 직접 관찰과 픽셀 비교 증거다. diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/banner-contact-sheet.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/banner-contact-sheet.png new file mode 100644 index 00000000..e54554a3 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/banner-contact-sheet.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/cleanup.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/cleanup.json new file mode 100644 index 00000000..187cc755 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/cleanup.json @@ -0,0 +1,20 @@ +{ + "root": "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7", + "device": "25EC20C1-F057-4DAD-BD61-A287C5D942C7", + "parentRootUntouched": "notice-title-only.i9lFW3", + "deviceAbsent": true, + "processAbsent": true, + "rootAbsent": true, + "appPid": 89665, + "postCleanupProcessCheck": { + "argv": [ + "ps", + "-p", + "89665", + "-o", + "pid=,command=" + ], + "exit": 1, + "output": "" + } +} \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/commands.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/commands.json new file mode 100644 index 00000000..370e27a9 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/commands.json @@ -0,0 +1,174 @@ +[ + { + "argv": [ + "bash", + "work/tests/check-my-page-notices.sh" + ], + "exit": 0, + "output": "PASS: actual NoticeApi/Repository public v2 GET requestPlain without Authorization; legacy list auth/timezone unchanged\nPASS: actual DTO/roller 0/1/2/3, omitted/null envelope, repeated order/wrap/selection, exact HTML/date, legacy no-id, shrink/reset and lifecycle predicate\nPASS: actual MyPageViewModel background delivery on main, 0/1/2/3 success, empty hides, HTTP/envelope/decode/transport failure preserves data, log-only/loading semantics\nPASS: My Page notices regression checks (actual production API/Repository/VM/DTO/roller, native Combine; no server calls)\n" + }, + { + "argv": [ + "xcrun", + "swiftc", + "-frontend", + "-parse", + "/Users/klaus/Develop/sodalive/iOS/SodaLive/SodaLive/Sources/MyPage/MyPageView.swift" + ], + "exit": 0, + "output": "" + }, + { + "argv": [ + "xcrun", + "--sdk", + "iphonesimulator", + "--show-sdk-path" + ], + "exit": 0, + "output": "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator26.0.sdk\n" + }, + { + "argv": [ + "xcrun", + "--sdk", + "iphonesimulator", + "swiftc", + "-sdk", + "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator26.0.sdk", + "-target", + "x86_64-apple-ios16.6-simulator", + "-module-cache-path", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/module-cache", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/source/UpdateBannerView.swift", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/source/Harness.swift", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/source/Spacing.swift", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/source/MyPageNoticeRoller.swift", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/source/ColorExtension.swift", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/source/GetNoticeResponse.swift", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/source/FontModifier.swift", + "-o", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/NoticeNativeQA.app/NoticeNativeQA" + ], + "exit": 0, + "output": "" + }, + { + "argv": [ + "xcrun", + "simctl", + "create", + "NoticeTitleOnly-Owned", + "com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation", + "com.apple.CoreSimulator.SimRuntime.iOS-18-3" + ], + "exit": 0, + "output": "25EC20C1-F057-4DAD-BD61-A287C5D942C7\n" + }, + { + "argv": [ + "xcrun", + "simctl", + "boot", + "25EC20C1-F057-4DAD-BD61-A287C5D942C7" + ], + "exit": 0, + "output": "" + }, + { + "argv": [ + "xcrun", + "simctl", + "bootstatus", + "25EC20C1-F057-4DAD-BD61-A287C5D942C7", + "-b" + ], + "exit": 0, + "output": "Monitoring boot status for NoticeTitleOnly-Owned (25EC20C1-F057-4DAD-BD61-A287C5D942C7).\n[2026-10-28 07:57:20 +0000] Status=1, isTerminal=NO, Elapsed=00:06.\n\tWaiting on BackBoard\n\n[2026-10-28 07:57:22 +0000] Status=2, isTerminal=NO, Elapsed=00:08.\n\tWaiting on Data Migration\n\t\tReason:(null)\n\t\tMigration Elapsed:00:00 seconds\n\n[2026-10-28 07:57:26 +0000] Status=2, isTerminal=NO, Elapsed=00:12.\n\tWaiting on Data Migration\n\t\tReason:Gathering plugins\n\t\tMigration Elapsed:00:03 seconds\n\n[2026-10-28 07:57:26 +0000] Status=2, isTerminal=NO, Elapsed=00:13.\n\tWaiting on Data Migration\n\t\tReason:Gathering plugins\n\t\tMigration Elapsed:00:04 seconds\n\n[2026-10-28 07:57:29 +0000] Status=2, isTerminal=NO, Elapsed=00:15.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.MobileContainerManager.ContainerMigrator (ContainerMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:05 seconds\n\n[2026-10-28 07:57:31 +0000] Status=2, isTerminal=NO, Elapsed=00:17.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.MobileContainerManager.ContainerMigrator (ContainerMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:06 seconds\n\n[2026-10-28 07:57:32 +0000] Status=2, isTerminal=NO, Elapsed=00:18.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:08 seconds\n\n[2026-10-28 07:57:33 +0000] Status=2, isTerminal=NO, Elapsed=00:19.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:10 seconds\n\n[2026-10-28 07:57:34 +0000] Status=2, isTerminal=NO, Elapsed=00:21.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:11 seconds\n\n[2026-10-28 07:57:35 +0000] Status=2, isTerminal=NO, Elapsed=00:21.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:12 seconds\n\n[2026-10-28 07:57:36 +0000] Status=2, isTerminal=NO, Elapsed=00:22.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:13 seconds\n\n[2026-10-28 07:57:37 +0000] Status=2, isTerminal=NO, Elapsed=00:23.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:14 seconds\n\n[2026-10-28 07:57:38 +0000] Status=2, isTerminal=NO, Elapsed=00:24.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:15 seconds\n\n[2026-10-28 07:57:39 +0000] Status=2, isTerminal=NO, Elapsed=00:25.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:16 seconds\n\n[2026-10-28 07:57:40 +0000] Status=2, isTerminal=NO, Elapsed=00:26.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:17 seconds\n\n[2026-10-28 07:57:40 +0000] Status=2, isTerminal=NO, Elapsed=00:26.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:17 seconds\n\n[2026-10-28 07:57:41 +0000] Status=2, isTerminal=NO, Elapsed=00:27.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:18 seconds\n\n[2026-10-28 07:57:42 +0000] Status=2, isTerminal=NO, Elapsed=00:28.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:19 seconds\n\n[2026-10-28 07:57:43 +0000] Status=2, isTerminal=NO, Elapsed=00:29.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:20 seconds\n\n[2026-10-28 07:57:44 +0000] Status=2, isTerminal=NO, Elapsed=00:30.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:21 seconds\n\n[2026-10-28 07:57:45 +0000] Status=2, isTerminal=NO, Elapsed=00:31.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:22 seconds\n\n[2026-10-28 07:57:46 +0000] Status=2, isTerminal=NO, Elapsed=00:33.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:23 seconds\n\n[2026-10-28 07:57:48 +0000] Status=2, isTerminal=NO, Elapsed=00:34.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:24 seconds\n\n[2026-10-28 07:57:48 +0000] Status=2, isTerminal=NO, Elapsed=00:35.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:25 seconds\n\n[2026-10-28 07:57:49 +0000] Status=2, isTerminal=NO, Elapsed=00:35.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:26 seconds\n\n[2026-10-28 07:57:50 +0000] Status=2, isTerminal=NO, Elapsed=00:36.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:27 seconds\n\n[2026-10-28 07:57:51 +0000] Status=2, isTerminal=NO, Elapsed=00:37.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:28 seconds\n\n[2026-10-28 07:57:52 +0000] Status=2, isTerminal=NO, Elapsed=00:38.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:29 seconds\n\n[2026-10-28 07:57:53 +0000] Status=2, isTerminal=NO, Elapsed=00:39.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:30 seconds\n\n[2026-10-28 07:57:54 +0000] Status=2, isTerminal=NO, Elapsed=00:40.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:31 seconds\n\n[2026-10-28 07:57:55 +0000] Status=2, isTerminal=NO, Elapsed=00:41.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:32 seconds\n\n[2026-10-28 07:57:56 +0000] Status=2, isTerminal=NO, Elapsed=00:42.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:33 seconds\n\n[2026-10-28 07:57:57 +0000] Status=2, isTerminal=NO, Elapsed=00:43.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:34 seconds\n\n[2026-10-28 07:57:58 +0000] Status=2, isTerminal=NO, Elapsed=00:44.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:35 seconds\n\n[2026-10-28 07:57:59 +0000] Status=2, isTerminal=NO, Elapsed=00:45.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:36 seconds\n\n[2026-10-28 07:58:00 +0000] Status=2, isTerminal=NO, Elapsed=00:46.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:37 seconds\n\n[2026-10-28 07:58:01 +0000] Status=2, isTerminal=NO, Elapsed=00:47.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:38 seconds\n\n[2026-10-28 07:58:02 +0000] Status=2, isTerminal=NO, Elapsed=00:48.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:39 seconds\n\n[2026-10-28 07:58:03 +0000] Status=2, isTerminal=NO, Elapsed=00:49.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:40 seconds\n\n[2026-10-28 07:58:04 +0000] Status=2, isTerminal=NO, Elapsed=00:50.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:41 seconds\n\n[2026-10-28 07:58:05 +0000] Status=2, isTerminal=NO, Elapsed=00:51.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:42 seconds\n\n[2026-10-28 07:58:06 +0000] Status=2, isTerminal=NO, Elapsed=00:52.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:43 seconds\n\n[2026-10-28 07:58:07 +0000] Status=2, isTerminal=NO, Elapsed=00:53.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:44 seconds\n\n[2026-10-28 07:58:08 +0000] Status=2, isTerminal=NO, Elapsed=00:54.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:45 seconds\n\n[2026-10-28 07:58:09 +0000] Status=2, isTerminal=NO, Elapsed=00:55.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:46 seconds\n\n[2026-10-28 07:58:10 +0000] Status=2, isTerminal=NO, Elapsed=00:56.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:47 seconds\n\n[2026-10-28 07:58:11 +0000] Status=2, isTerminal=NO, Elapsed=00:57.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:48 seconds\n\n[2026-10-28 07:58:12 +0000] Status=2, isTerminal=NO, Elapsed=00:58.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:49 seconds\n\n[2026-10-28 07:58:13 +0000] Status=2, isTerminal=NO, Elapsed=00:59.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:50 seconds\n\n[2026-10-28 07:58:14 +0000] Status=2, isTerminal=NO, Elapsed=01:00.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:51 seconds\n\n[2026-10-28 07:58:15 +0000] Status=2, isTerminal=NO, Elapsed=01:01.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:52 seconds\n\n[2026-10-28 07:58:16 +0000] Status=2, isTerminal=NO, Elapsed=01:02.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:53 seconds\n\n[2026-10-28 07:58:17 +0000] Status=2, isTerminal=NO, Elapsed=01:03.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:54 seconds\n\n[2026-10-28 07:58:18 +0000] Status=2, isTerminal=NO, Elapsed=01:04.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:55 seconds\n\n[2026-10-28 07:58:19 +0000] Status=2, isTerminal=NO, Elapsed=01:05.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:56 seconds\n\n[2026-10-28 07:58:20 +0000] Status=2, isTerminal=NO, Elapsed=01:06.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:57 seconds\n\n[2026-10-28 07:58:21 +0000] Status=2, isTerminal=NO, Elapsed=01:07.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:58 seconds\n\n[2026-10-28 07:58:22 +0000] Status=2, isTerminal=NO, Elapsed=01:08.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:00:59 seconds\n\n[2026-10-28 07:58:23 +0000] Status=2, isTerminal=NO, Elapsed=01:09.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:00 seconds\n\n[2026-10-28 07:58:24 +0000] Status=2, isTerminal=NO, Elapsed=01:10.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:01 seconds\n\n[2026-10-28 07:58:25 +0000] Status=2, isTerminal=NO, Elapsed=01:11.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:02 seconds\n\n[2026-10-28 07:58:26 +0000] Status=2, isTerminal=NO, Elapsed=01:12.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:03 seconds\n\n[2026-10-28 07:58:27 +0000] Status=2, isTerminal=NO, Elapsed=01:13.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:04 seconds\n\n[2026-10-28 07:58:28 +0000] Status=2, isTerminal=NO, Elapsed=01:14.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:05 seconds\n\n[2026-10-28 07:58:29 +0000] Status=2, isTerminal=NO, Elapsed=01:15.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:06 seconds\n\n[2026-10-28 07:58:30 +0000] Status=2, isTerminal=NO, Elapsed=01:16.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:07 seconds\n\n[2026-10-28 07:58:31 +0000] Status=2, isTerminal=NO, Elapsed=01:17.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:08 seconds\n\n[2026-10-28 07:58:32 +0000] Status=2, isTerminal=NO, Elapsed=01:18.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:09 seconds\n\n[2026-10-28 07:58:33 +0000] Status=2, isTerminal=NO, Elapsed=01:19.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:10 seconds\n\n[2026-10-28 07:58:34 +0000] Status=2, isTerminal=NO, Elapsed=01:20.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:11 seconds\n\n[2026-10-28 07:58:35 +0000] Status=2, isTerminal=NO, Elapsed=01:21.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:12 seconds\n\n[2026-10-28 07:58:36 +0000] Status=2, isTerminal=NO, Elapsed=01:22.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:13 seconds\n\n[2026-10-28 07:58:37 +0000] Status=2, isTerminal=NO, Elapsed=01:23.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:14 seconds\n\n[2026-10-28 07:58:38 +0000] Status=2, isTerminal=NO, Elapsed=01:24.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:15 seconds\n\n[2026-10-28 07:58:39 +0000] Status=2, isTerminal=NO, Elapsed=01:25.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:16 seconds\n\n[2026-10-28 07:58:40 +0000] Status=2, isTerminal=NO, Elapsed=01:26.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:17 seconds\n\n[2026-10-28 07:58:41 +0000] Status=2, isTerminal=NO, Elapsed=01:27.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:18 seconds\n\n[2026-10-28 07:58:42 +0000] Status=2, isTerminal=NO, Elapsed=01:28.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:19 seconds\n\n[2026-10-28 07:58:43 +0000] Status=2, isTerminal=NO, Elapsed=01:29.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:20 seconds\n\n[2026-10-28 07:58:44 +0000] Status=2, isTerminal=NO, Elapsed=01:30.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:21 seconds\n\n[2026-10-28 07:58:45 +0000] Status=2, isTerminal=NO, Elapsed=01:31.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:22 seconds\n\n[2026-10-28 07:58:46 +0000] Status=2, isTerminal=NO, Elapsed=01:32.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:23 seconds\n\n[2026-10-28 07:58:47 +0000] Status=2, isTerminal=NO, Elapsed=01:33.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:24 seconds\n\n[2026-10-28 07:58:48 +0000] Status=2, isTerminal=NO, Elapsed=01:34.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:25 seconds\n\n[2026-10-28 07:58:49 +0000] Status=2, isTerminal=NO, Elapsed=01:35.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:26 seconds\n\n[2026-10-28 07:58:50 +0000] Status=2, isTerminal=NO, Elapsed=01:36.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:27 seconds\n\n[2026-10-28 07:58:51 +0000] Status=2, isTerminal=NO, Elapsed=01:37.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:28 seconds\n\n[2026-10-28 07:58:52 +0000] Status=2, isTerminal=NO, Elapsed=01:38.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:29 seconds\n\n[2026-10-28 07:58:53 +0000] Status=2, isTerminal=NO, Elapsed=01:39.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:30 seconds\n\n[2026-10-28 07:58:54 +0000] Status=2, isTerminal=NO, Elapsed=01:40.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:31 seconds\n\n[2026-10-28 07:58:55 +0000] Status=2, isTerminal=NO, Elapsed=01:41.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:32 seconds\n\n[2026-10-28 07:58:56 +0000] Status=2, isTerminal=NO, Elapsed=01:42.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:33 seconds\n\n[2026-10-28 07:58:57 +0000] Status=2, isTerminal=NO, Elapsed=01:43.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:34 seconds\n\n[2026-10-28 07:58:58 +0000] Status=2, isTerminal=NO, Elapsed=01:44.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:35 seconds\n\n[2026-10-28 07:58:59 +0000] Status=2, isTerminal=NO, Elapsed=01:45.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:36 seconds\n\n[2026-10-28 07:59:00 +0000] Status=2, isTerminal=NO, Elapsed=01:46.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:37 seconds\n\n[2026-10-28 07:59:01 +0000] Status=2, isTerminal=NO, Elapsed=01:47.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:38 seconds\n\n[2026-10-28 07:59:02 +0000] Status=2, isTerminal=NO, Elapsed=01:48.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:39 seconds\n\n[2026-10-28 07:59:03 +0000] Status=2, isTerminal=NO, Elapsed=01:49.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:40 seconds\n\n[2026-10-28 07:59:04 +0000] Status=2, isTerminal=NO, Elapsed=01:50.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:41 seconds\n\n[2026-10-28 07:59:05 +0000] Status=2, isTerminal=NO, Elapsed=01:51.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:42 seconds\n\n[2026-10-28 07:59:06 +0000] Status=2, isTerminal=NO, Elapsed=01:52.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.-0LaunchServicesMigrator (00LaunchServicesMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:43 seconds\n\n[2026-10-28 07:59:12 +0000] Status=2, isTerminal=NO, Elapsed=01:58.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.securityd.KeychainMigrator (KeychainMigrator.migrator, user-agnostic)\n\t\tMigration Elapsed:01:44 seconds\n\n[2026-10-28 07:59:17 +0000] Status=2, isTerminal=NO, Elapsed=02:03.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.managedconfiguration.migrator (MCProfile.migrator, user-agnostic)\n\t\tMigration Elapsed:01:49 seconds\n\n[2026-10-28 07:59:22 +0000] Status=2, isTerminal=NO, Elapsed=02:08.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.addressbook.migrator (AddressBookLegacy.migrator)\n\t\tMigration Elapsed:01:55 seconds\n\n[2026-10-28 07:59:25 +0000] Status=2, isTerminal=NO, Elapsed=02:11.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.MobileSafari.migrator (MobileSafari.migrator)\n\t\tMigration Elapsed:02:00 seconds\n\n[2026-10-28 07:59:28 +0000] Status=2, isTerminal=NO, Elapsed=02:14.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.MobileSafari.migrator (MobileSafari.migrator)\n\t\tMigration Elapsed:02:02 seconds\n\n[2026-10-28 07:59:30 +0000] Status=2, isTerminal=NO, Elapsed=02:16.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.MobileSafari.migrator (MobileSafari.migrator)\n\t\tMigration Elapsed:02:05 seconds\n\n[2026-10-28 07:59:32 +0000] Status=2, isTerminal=NO, Elapsed=02:18.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.MobileSafari.migrator (MobileSafari.migrator)\n\t\tMigration Elapsed:02:07 seconds\n\n[2026-10-28 07:59:34 +0000] Status=2, isTerminal=NO, Elapsed=02:20.\n\tWaiting on Data Migration\n\t\tReason:Running plugin com.apple.MobileSafari.migrator (MobileSafari.migrator)\n\t\tMigration Elapsed:02:09 seconds\n\n[2026-10-28 07:59:36 +0000] Status=4294967295, isTerminal=YES, Elapsed=02:22.\n\tFinished\n\n" + }, + { + "argv": [ + "xcrun", + "simctl", + "install", + "25EC20C1-F057-4DAD-BD61-A287C5D942C7", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/NoticeNativeQA.app" + ], + "exit": 0, + "output": "" + }, + { + "argv": [ + "xcrun", + "simctl", + "launch", + "25EC20C1-F057-4DAD-BD61-A287C5D942C7", + "local.sodalive.NoticeTitleOnlyQA" + ], + "exit": 0, + "output": "local.sodalive.NoticeTitleOnlyQA: 89665\n" + }, + { + "argv": [ + "xcrun", + "simctl", + "get_app_container", + "25EC20C1-F057-4DAD-BD61-A287C5D942C7", + "local.sodalive.NoticeTitleOnlyQA", + "data" + ], + "exit": 0, + "output": "/Users/klaus/Library/Developer/CoreSimulator/Devices/25EC20C1-F057-4DAD-BD61-A287C5D942C7/data/Containers/Data/Application/D7832F32-3B95-4C5D-BCD5-922AFB0558A0\n" + }, + { + "argv": [ + "xcrun", + "simctl", + "terminate", + "25EC20C1-F057-4DAD-BD61-A287C5D942C7", + "local.sodalive.NoticeTitleOnlyQA" + ], + "exit": 0, + "output": "" + }, + { + "argv": [ + "xcrun", + "simctl", + "shutdown", + "25EC20C1-F057-4DAD-BD61-A287C5D942C7" + ], + "exit": 0, + "output": "" + }, + { + "argv": [ + "xcrun", + "simctl", + "delete", + "25EC20C1-F057-4DAD-BD61-A287C5D942C7" + ], + "exit": 0, + "output": "" + }, + { + "argv": [ + "xcrun", + "simctl", + "list", + "devices", + "-j" + ], + "exit": 0, + "output": "{\n \"devices\" : {\n \"com.apple.CoreSimulator.SimRuntime.watchOS-8-3\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BB13E9AA-62BB-48EB-870A-A2A24C4B9992\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BB13E9AA-62BB-48EB-870A-A2A24C4B9992\",\n \"udid\" : \"BB13E9AA-62BB-48EB-870A-A2A24C4B9992\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-45mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 45mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/50D593D4-D38C-4205-8AE4-A91C98EC2087\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/50D593D4-D38C-4205-8AE4-A91C98EC2087\",\n \"udid\" : \"50D593D4-D38C-4205-8AE4-A91C98EC2087\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-41mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 41mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/17571B1C-12BD-47CB-BFD8-0463EF9DBABF\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/17571B1C-12BD-47CB-BFD8-0463EF9DBABF\",\n \"udid\" : \"17571B1C-12BD-47CB-BFD8-0463EF9DBABF\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/644DA220-FA54-4E04-84A3-5012996CD6A9\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/644DA220-FA54-4E04-84A3-5012996CD6A9\",\n \"udid\" : \"644DA220-FA54-4E04-84A3-5012996CD6A9\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 40mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BF239C2C-1141-497F-9FEA-74A1A2BFBE74\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BF239C2C-1141-497F-9FEA-74A1A2BFBE74\",\n \"udid\" : \"BF239C2C-1141-497F-9FEA-74A1A2BFBE74\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/678EFFC7-7552-49FF-9C71-7E5DC7A175B3\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/678EFFC7-7552-49FF-9C71-7E5DC7A175B3\",\n \"udid\" : \"678EFFC7-7552-49FF-9C71-7E5DC7A175B3\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 40mm\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.tvOS-14-3\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EBEF8EF4-B7F0-456A-98CB-4DC0C891B8E8\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EBEF8EF4-B7F0-456A-98CB-4DC0C891B8E8\",\n \"udid\" : \"EBEF8EF4-B7F0-456A-98CB-4DC0C891B8E8\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-4K\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/53C81E09-E8CB-41A4-9ACD-C68AD85439CA\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/53C81E09-E8CB-41A4-9ACD-C68AD85439CA\",\n \"udid\" : \"53C81E09-E8CB-41A4-9ACD-C68AD85439CA\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (at 1080p)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/FA220C1A-2E8C-4412-931E-31E3B37BFEE7\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/FA220C1A-2E8C-4412-931E-31E3B37BFEE7\",\n \"udid\" : \"FA220C1A-2E8C-4412-931E-31E3B37BFEE7\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.tvOS-15-4\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2855076F-2C47-4D7A-BC73-7A4809D5ADE6\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2855076F-2C47-4D7A-BC73-7A4809D5ADE6\",\n \"udid\" : \"2855076F-2C47-4D7A-BC73-7A4809D5ADE6\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-4K\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/01365AF3-7D83-4DE1-A01F-420C0B9D7553\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/01365AF3-7D83-4DE1-A01F-420C0B9D7553\",\n \"udid\" : \"01365AF3-7D83-4DE1-A01F-420C0B9D7553\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (at 1080p) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/FE558F45-7348-43EB-99B3-5E4FDD5AB5D2\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/FE558F45-7348-43EB-99B3-5E4FDD5AB5D2\",\n \"udid\" : \"FE558F45-7348-43EB-99B3-5E4FDD5AB5D2\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-26-0\" : [\n {\n \"lastBootedAt\" : \"2026-10-13T15:18:39Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E9FC7721-AA96-440F-8349-2DC4B85F40F5\\/data\",\n \"dataPathSize\" : 3471380480,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E9FC7721-AA96-440F-8349-2DC4B85F40F5\",\n \"udid\" : \"E9FC7721-AA96-440F-8349-2DC4B85F40F5\",\n \"isAvailable\" : true,\n \"logPathSize\" : 516096,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-17-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 17 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/8B2F8CC9-E408-46D0-AB04-86C095C47E43\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/8B2F8CC9-E408-46D0-AB04-86C095C47E43\",\n \"udid\" : \"8B2F8CC9-E408-46D0-AB04-86C095C47E43\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-17-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 17 Pro Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5BBE432B-8329-47E1-84F2-AD2C402F9CC3\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5BBE432B-8329-47E1-84F2-AD2C402F9CC3\",\n \"udid\" : \"5BBE432B-8329-47E1-84F2-AD2C402F9CC3\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-Air\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone Air\"\n },\n {\n \"lastBootedAt\" : \"2026-07-20T09:42:05Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EC77E67D-CE64-498F-BBA2-F168368CC25D\\/data\",\n \"dataPathSize\" : 2494439424,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EC77E67D-CE64-498F-BBA2-F168368CC25D\",\n \"udid\" : \"EC77E67D-CE64-498F-BBA2-F168368CC25D\",\n \"isAvailable\" : true,\n \"logPathSize\" : 417792,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-17\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 17\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5D20D331-C35B-4DD3-BA2B-6ECE680C3D86\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5D20D331-C35B-4DD3-BA2B-6ECE680C3D86\",\n \"udid\" : \"5D20D331-C35B-4DD3-BA2B-6ECE680C3D86\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16e\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16e\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/55FB4A3B-790E-4122-B0FD-43B72BDCA02E\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/55FB4A3B-790E-4122-B0FD-43B72BDCA02E\",\n \"udid\" : \"55FB4A3B-790E-4122-B0FD-43B72BDCA02E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 11-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/401AEB64-1B6F-479D-9BDD-4E7532E11469\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/401AEB64-1B6F-479D-9BDD-4E7532E11469\",\n \"udid\" : \"401AEB64-1B6F-479D-9BDD-4E7532E11469\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-13-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 13-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7A3DA0DF-2EE7-4246-8A1F-EB1BF737819B\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7A3DA0DF-2EE7-4246-8A1F-EB1BF737819B\",\n \"udid\" : \"7A3DA0DF-2EE7-4246-8A1F-EB1BF737819B\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-A17-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (A17 Pro)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E51A96B1-A61A-42DF-8F20-5B13077AE5D3\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E51A96B1-A61A-42DF-8F20-5B13077AE5D3\",\n \"udid\" : \"E51A96B1-A61A-42DF-8F20-5B13077AE5D3\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-A16\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (A16)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1D9FC9BB-EAD0-4C04-B26E-F4EBC5ECA80E\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1D9FC9BB-EAD0-4C04-B26E-F4EBC5ECA80E\",\n \"udid\" : \"1D9FC9BB-EAD0-4C04-B26E-F4EBC5ECA80E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-13-inch-M3\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 13-inch (M3)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7FA60982-6001-4EF1-9ED7-336EF4B0BB98\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7FA60982-6001-4EF1-9ED7-336EF4B0BB98\",\n \"udid\" : \"7FA60982-6001-4EF1-9ED7-336EF4B0BB98\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-11-inch-M3\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 11-inch (M3)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.watchOS-8-0\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0F2CD8F8-E3DD-4B60-A2EA-452790111CB6\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0F2CD8F8-E3DD-4B60-A2EA-452790111CB6\",\n \"udid\" : \"0F2CD8F8-E3DD-4B60-A2EA-452790111CB6\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-45mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 45mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D26A6F84-40C8-493B-A25D-B61FB47EE6CD\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D26A6F84-40C8-493B-A25D-B61FB47EE6CD\",\n \"udid\" : \"D26A6F84-40C8-493B-A25D-B61FB47EE6CD\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-41mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 41mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/83B16730-F6B1-4573-B32D-C66E881B0411\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/83B16730-F6B1-4573-B32D-C66E881B0411\",\n \"udid\" : \"83B16730-F6B1-4573-B32D-C66E881B0411\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/350CC54D-07DC-4646-9F31-7AAE9DA53D8F\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/350CC54D-07DC-4646-9F31-7AAE9DA53D8F\",\n \"udid\" : \"350CC54D-07DC-4646-9F31-7AAE9DA53D8F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 40mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/376B4CE7-8557-460D-A513-85C15D31A547\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/376B4CE7-8557-460D-A513-85C15D31A547\",\n \"udid\" : \"376B4CE7-8557-460D-A513-85C15D31A547\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/53E9955A-C6CC-479B-9066-07BA91442BCE\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/53E9955A-C6CC-479B-9066-07BA91442BCE\",\n \"udid\" : \"53E9955A-C6CC-479B-9066-07BA91442BCE\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 40mm\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.tvOS-15-2\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C429D66F-D4C5-44D4-B62C-D02CAC056566\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C429D66F-D4C5-44D4-B62C-D02CAC056566\",\n \"udid\" : \"C429D66F-D4C5-44D4-B62C-D02CAC056566\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-4K\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DB4F01B7-F7E2-4209-896E-CD352A2C9096\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DB4F01B7-F7E2-4209-896E-CD352A2C9096\",\n \"udid\" : \"DB4F01B7-F7E2-4209-896E-CD352A2C9096\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (at 1080p) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/54B8CC4C-05A3-4870-A64F-EF52856FC38E\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/54B8CC4C-05A3-4870-A64F-EF52856FC38E\",\n \"udid\" : \"54B8CC4C-05A3-4870-A64F-EF52856FC38E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-13-7\" : [\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/FC339DD9-BF4F-49C3-9D76-B6DDDCFE5239\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/FC339DD9-BF4F-49C3-9D76-B6DDDCFE5239\",\n \"udid\" : \"FC339DD9-BF4F-49C3-9D76-B6DDDCFE5239\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (2nd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/3D83634F-1277-43CA-BA3A-DF63AE50C5D4\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/3D83634F-1277-43CA-BA3A-DF63AE50C5D4\",\n \"udid\" : \"3D83634F-1277-43CA-BA3A-DF63AE50C5D4\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/81F6BDD5-AB53-4017-AD9B-63B9797E2AB3\\/data\",\n \"dataPathSize\" : 501202944,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/81F6BDD5-AB53-4017-AD9B-63B9797E2AB3\",\n \"udid\" : \"81F6BDD5-AB53-4017-AD9B-63B9797E2AB3\",\n \"isAvailable\" : false,\n \"logPathSize\" : 1146880,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max(13.7)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0D851780-0829-499E-8064-8918C2BBC7AC\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0D851780-0829-499E-8064-8918C2BBC7AC\",\n \"udid\" : \"0D851780-0829-499E-8064-8918C2BBC7AC\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/82B0EF12-2F7D-486E-9DE1-AE34E01EB70F\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/82B0EF12-2F7D-486E-9DE1-AE34E01EB70F\",\n \"udid\" : \"82B0EF12-2F7D-486E-9DE1-AE34E01EB70F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/325AA1B7-58E2-4EF9-91CE-329F40879F6E\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/325AA1B7-58E2-4EF9-91CE-329F40879F6E\",\n \"udid\" : \"325AA1B7-58E2-4EF9-91CE-329F40879F6E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F2B3964C-AE60-48EA-8110-02BDA23CE27C\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F2B3964C-AE60-48EA-8110-02BDA23CE27C\",\n \"udid\" : \"F2B3964C-AE60-48EA-8110-02BDA23CE27C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air--3rd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (3rd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9A277A99-89F9-458F-B542-8F76687A975D\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9A277A99-89F9-458F-B542-8F76687A975D\",\n \"udid\" : \"9A277A99-89F9-458F-B542-8F76687A975D\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch---2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EB0A5B70-5F8F-4963-82F4-960819F345E9\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EB0A5B70-5F8F-4963-82F4-960819F345E9\",\n \"udid\" : \"EB0A5B70-5F8F-4963-82F4-960819F345E9\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (4th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/99BCA292-B4F1-498B-B845-AEAFF9B0B28A\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/99BCA292-B4F1-498B-B845-AEAFF9B0B28A\",\n \"udid\" : \"99BCA292-B4F1-498B-B845-AEAFF9B0B28A\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (7th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 13.7 simulator runtime is not supported on hosts after macOS 12.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A11F7F51-B535-464E-9E11-4117F20AF150\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A11F7F51-B535-464E-9E11-4117F20AF150\",\n \"udid\" : \"A11F7F51-B535-464E-9E11-4117F20AF150\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.watchOS-8-5\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D25C52A8-F836-45EA-9983-55F7B5900907\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D25C52A8-F836-45EA-9983-55F7B5900907\",\n \"udid\" : \"D25C52A8-F836-45EA-9983-55F7B5900907\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-45mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 45mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/21D92487-6FF9-4DAF-AF9C-42F8AD8929F7\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/21D92487-6FF9-4DAF-AF9C-42F8AD8929F7\",\n \"udid\" : \"21D92487-6FF9-4DAF-AF9C-42F8AD8929F7\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-7-41mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 7 - 41mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/90057085-4578-4408-B454-E4EB4080C587\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/90057085-4578-4408-B454-E4EB4080C587\",\n \"udid\" : \"90057085-4578-4408-B454-E4EB4080C587\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 40mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7693DF4F-53CA-42C8-90F1-8878164F5842\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7693DF4F-53CA-42C8-90F1-8878164F5842\",\n \"udid\" : \"7693DF4F-53CA-42C8-90F1-8878164F5842\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C6D12028-06D0-4A13-8315-9FE5A083FF9C\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C6D12028-06D0-4A13-8315-9FE5A083FF9C\",\n \"udid\" : \"C6D12028-06D0-4A13-8315-9FE5A083FF9C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 40mm\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-14-5\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/96D83B48-5DB9-40C9-B39B-BE780F19BC6A\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/96D83B48-5DB9-40C9-B39B-BE780F19BC6A\",\n \"udid\" : \"96D83B48-5DB9-40C9-B39B-BE780F19BC6A\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/01FA53D0-1B51-49A3-AF3B-AE3AC94A9800\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/01FA53D0-1B51-49A3-AF3B-AE3AC94A9800\",\n \"udid\" : \"01FA53D0-1B51-49A3-AF3B-AE3AC94A9800\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4FD70DF5-16E9-47BC-8C99-8267991F6297\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4FD70DF5-16E9-47BC-8C99-8267991F6297\",\n \"udid\" : \"4FD70DF5-16E9-47BC-8C99-8267991F6297\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/101DC27D-F515-4EB1-9FEE-46EC0FE9210F\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/101DC27D-F515-4EB1-9FEE-46EC0FE9210F\",\n \"udid\" : \"101DC27D-F515-4EB1-9FEE-46EC0FE9210F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 mini\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4EA3C791-0623-438E-9FF5-BD87F08BB974\\/data\",\n \"dataPathSize\" : 459665408,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4EA3C791-0623-438E-9FF5-BD87F08BB974\",\n \"udid\" : \"4EA3C791-0623-438E-9FF5-BD87F08BB974\",\n \"isAvailable\" : false,\n \"logPathSize\" : 909312,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2ACF79E0-783B-4124-890F-7F79FE367C50\\/data\",\n \"dataPathSize\" : 426041344,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2ACF79E0-783B-4124-890F-7F79FE367C50\",\n \"udid\" : \"2ACF79E0-783B-4124-890F-7F79FE367C50\",\n \"isAvailable\" : false,\n \"logPathSize\" : 5488640,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E3B75C24-8D35-46E2-8E10-6A70A81E6F56\\/data\",\n \"dataPathSize\" : 1679515648,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E3B75C24-8D35-46E2-8E10-6A70A81E6F56\",\n \"udid\" : \"E3B75C24-8D35-46E2-8E10-6A70A81E6F56\",\n \"isAvailable\" : false,\n \"logPathSize\" : 4349952,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1B8B2129-DB60-4691-A7E2-AEF49176B658\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1B8B2129-DB60-4691-A7E2-AEF49176B658\",\n \"udid\" : \"1B8B2129-DB60-4691-A7E2-AEF49176B658\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C334B4B2-D721-40BA-9FA7-06B6526E6194\\/data\",\n \"dataPathSize\" : 352808960,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C334B4B2-D721-40BA-9FA7-06B6526E6194\",\n \"udid\" : \"C334B4B2-D721-40BA-9FA7-06B6526E6194\",\n \"isAvailable\" : false,\n \"logPathSize\" : 1871872,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/05280FF9-4594-4C01-82BD-557D960C4ECB\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/05280FF9-4594-4C01-82BD-557D960C4ECB\",\n \"udid\" : \"05280FF9-4594-4C01-82BD-557D960C4ECB\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/8047376A-A125-4461-8523-8A74DC93FF36\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/8047376A-A125-4461-8523-8A74DC93FF36\",\n \"udid\" : \"8047376A-A125-4461-8523-8A74DC93FF36\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (3rd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6DFE142A-6921-48DD-ABE9-F78E93E0BCFD\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6DFE142A-6921-48DD-ABE9-F78E93E0BCFD\",\n \"udid\" : \"6DFE142A-6921-48DD-ABE9-F78E93E0BCFD\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/94A49A49-9AF9-4A20-AE70-01DC185814F5\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/94A49A49-9AF9-4A20-AE70-01DC185814F5\",\n \"udid\" : \"94A49A49-9AF9-4A20-AE70-01DC185814F5\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air--4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (4th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/64184FDF-1F92-483C-96E9-BCC6512C1C60\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/64184FDF-1F92-483C-96E9-BCC6512C1C60\",\n \"udid\" : \"64184FDF-1F92-483C-96E9-BCC6512C1C60\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad--8th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (8th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1FF30D99-CD14-4FEA-9A0E-AB16A15F7201\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1FF30D99-CD14-4FEA-9A0E-AB16A15F7201\",\n \"udid\" : \"1FF30D99-CD14-4FEA-9A0E-AB16A15F7201\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/CC311424-7E60-4A83-8281-BBA66CFF6E76\\/data\",\n \"dataPathSize\" : 126787584,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/CC311424-7E60-4A83-8281-BBA66CFF6E76\",\n \"udid\" : \"CC311424-7E60-4A83-8281-BBA66CFF6E76\",\n \"isAvailable\" : false,\n \"logPathSize\" : 471040,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPod touch (7th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-14-4\" : [\n {\n \"lastBootedAt\" : \"2022-11-01T05:14:00Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/18118748-986A-490D-9ECF-FC90F018505D\\/data\",\n \"dataPathSize\" : 1411719168,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/18118748-986A-490D-9ECF-FC90F018505D\",\n \"udid\" : \"18118748-986A-490D-9ECF-FC90F018505D\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"logPathSize\" : 8302592,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F2D215CC-346F-475F-AB35-9DA8710F0210\\/data\",\n \"dataPathSize\" : 648237056,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F2D215CC-346F-475F-AB35-9DA8710F0210\",\n \"udid\" : \"F2D215CC-346F-475F-AB35-9DA8710F0210\",\n \"isAvailable\" : false,\n \"logPathSize\" : 1626112,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro Max\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/B20FF060-B3E7-4DF5-85AD-70CC5BEF9D86\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/B20FF060-B3E7-4DF5-85AD-70CC5BEF9D86\",\n \"udid\" : \"B20FF060-B3E7-4DF5-85AD-70CC5BEF9D86\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/84FD2161-5E59-43CF-A0AE-48C6DC4D56CA\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/84FD2161-5E59-43CF-A0AE-48C6DC4D56CA\",\n \"udid\" : \"84FD2161-5E59-43CF-A0AE-48C6DC4D56CA\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 mini\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E7FD006A-8150-4C71-827F-7383C9AE2A1D\\/data\",\n \"dataPathSize\" : 1063428096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E7FD006A-8150-4C71-827F-7383C9AE2A1D\",\n \"udid\" : \"E7FD006A-8150-4C71-827F-7383C9AE2A1D\",\n \"isAvailable\" : false,\n \"logPathSize\" : 3088384,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (2nd generation)\"\n },\n {\n \"lastBootedAt\" : \"2022-11-24T08:18:37Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DDB42DDF-BB1A-4DD8-BF1B-C9CBA1541639\\/data\",\n \"dataPathSize\" : 1915662336,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DDB42DDF-BB1A-4DD8-BF1B-C9CBA1541639\",\n \"udid\" : \"DDB42DDF-BB1A-4DD8-BF1B-C9CBA1541639\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"logPathSize\" : 18903040,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"lastBootedAt\" : \"2023-07-07T03:09:25Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EFA6FFC5-AA34-49CD-9216-B69D0F2E865A\\/data\",\n \"dataPathSize\" : 4827611136,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EFA6FFC5-AA34-49CD-9216-B69D0F2E865A\",\n \"udid\" : \"EFA6FFC5-AA34-49CD-9216-B69D0F2E865A\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"logPathSize\" : 8552448,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max\"\n },\n {\n \"lastBootedAt\" : \"2022-11-21T09:32:38Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/25694A06-2155-4BF8-8C1B-2A646242AFC6\\/data\",\n \"dataPathSize\" : 1024917504,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/25694A06-2155-4BF8-8C1B-2A646242AFC6\",\n \"udid\" : \"25694A06-2155-4BF8-8C1B-2A646242AFC6\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"logPathSize\" : 4378624,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/09FD73D6-6B15-4C1C-A471-4DB2D983A5B0\\/data\",\n \"dataPathSize\" : 344969216,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/09FD73D6-6B15-4C1C-A471-4DB2D983A5B0\",\n \"udid\" : \"09FD73D6-6B15-4C1C-A471-4DB2D983A5B0\",\n \"isAvailable\" : false,\n \"logPathSize\" : 1425408,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C676F83C-F0A9-4E2B-BA67-A9F361651848\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C676F83C-F0A9-4E2B-BA67-A9F361651848\",\n \"udid\" : \"C676F83C-F0A9-4E2B-BA67-A9F361651848\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2F9E4A8C-45AC-4DBD-8036-6408CB7F24CB\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2F9E4A8C-45AC-4DBD-8036-6408CB7F24CB\",\n \"udid\" : \"2F9E4A8C-45AC-4DBD-8036-6408CB7F24CB\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air--4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (4th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EF6CF259-D42E-45CB-8636-C16E3201EB3E\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EF6CF259-D42E-45CB-8636-C16E3201EB3E\",\n \"udid\" : \"EF6CF259-D42E-45CB-8636-C16E3201EB3E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad--8th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (8th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A5ACE442-DF77-4BDF-973D-3A7E08DD6DFA\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A5ACE442-DF77-4BDF-973D-3A7E08DD6DFA\",\n \"udid\" : \"A5ACE442-DF77-4BDF-973D-3A7E08DD6DFA\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--11-inch---2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/841AFB16-07D5-4D52-A455-09412C65883F\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/841AFB16-07D5-4D52-A455-09412C65883F\",\n \"udid\" : \"841AFB16-07D5-4D52-A455-09412C65883F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (4th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E29B4AC1-31B9-4E1C-BB47-655A1617B4DD\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E29B4AC1-31B9-4E1C-BB47-655A1617B4DD\",\n \"udid\" : \"E29B4AC1-31B9-4E1C-BB47-655A1617B4DD\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n },\n {\n \"availabilityError\" : \"The iOS 14.4 simulator runtime is not supported on hosts after macOS 13.3.99.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0D87C877-0D43-410D-AD78-34FE2CE3F6F5\\/data\",\n \"dataPathSize\" : 590548992,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0D87C877-0D43-410D-AD78-34FE2CE3F6F5\",\n \"udid\" : \"0D87C877-0D43-410D-AD78-34FE2CE3F6F5\",\n \"isAvailable\" : false,\n \"logPathSize\" : 2252800,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPod touch (7th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-15-5\" : [\n {\n \"lastBootedAt\" : \"2024-05-02T05:43:54Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5A70AF8C-A57C-472D-BE41-F9109D919A45\\/data\",\n \"dataPathSize\" : 1751441408,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5A70AF8C-A57C-472D-BE41-F9109D919A45\",\n \"udid\" : \"5A70AF8C-A57C-472D-BE41-F9109D919A45\",\n \"isAvailable\" : true,\n \"logPathSize\" : 585728,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2C22AD78-F4ED-4A63-A7A5-57B9609A6568\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2C22AD78-F4ED-4A63-A7A5-57B9609A6568\",\n \"udid\" : \"2C22AD78-F4ED-4A63-A7A5-57B9609A6568\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6CC9EBE0-0A33-46B7-AC9A-C8A1A0DB5540\\/data\",\n \"dataPathSize\" : 18341888,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6CC9EBE0-0A33-46B7-AC9A-C8A1A0DB5540\",\n \"udid\" : \"6CC9EBE0-0A33-46B7-AC9A-C8A1A0DB5540\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro Max\"\n },\n {\n \"lastBootedAt\" : \"2026-06-12T06:45:20Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/3C227762-087D-453A-B96A-8372C574B99D\\/data\",\n \"dataPathSize\" : 1832259584,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/3C227762-087D-453A-B96A-8372C574B99D\",\n \"udid\" : \"3C227762-087D-453A-B96A-8372C574B99D\",\n \"isAvailable\" : true,\n \"logPathSize\" : 495616,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/887E44F2-F38F-43F6-B413-D35EF6C68B2C\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/887E44F2-F38F-43F6-B413-D35EF6C68B2C\",\n \"udid\" : \"887E44F2-F38F-43F6-B413-D35EF6C68B2C\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 mini\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/30C96AB0-7ED4-4D48-969C-79AED862BF79\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/30C96AB0-7ED4-4D48-969C-79AED862BF79\",\n \"udid\" : \"30C96AB0-7ED4-4D48-969C-79AED862BF79\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DF3455DA-F6D4-477B-95C2-82995B4C87FF\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DF3455DA-F6D4-477B-95C2-82995B4C87FF\",\n \"udid\" : \"DF3455DA-F6D4-477B-95C2-82995B4C87FF\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/87C0CB9E-B9FC-423D-984C-32011ADD8A7A\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/87C0CB9E-B9FC-423D-984C-32011ADD8A7A\",\n \"udid\" : \"87C0CB9E-B9FC-423D-984C-32011ADD8A7A\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/02BDE90D-0273-458D-8FE8-FACD2CAF443E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/02BDE90D-0273-458D-8FE8-FACD2CAF443E\",\n \"udid\" : \"02BDE90D-0273-458D-8FE8-FACD2CAF443E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 mini\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/421F30BF-FD5C-499E-9DC7-3A6EED3ECC0E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/421F30BF-FD5C-499E-9DC7-3A6EED3ECC0E\",\n \"udid\" : \"421F30BF-FD5C-499E-9DC7-3A6EED3ECC0E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4C79C49E-79DD-42D5-BFFE-29D43AFAFCBF\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4C79C49E-79DD-42D5-BFFE-29D43AFAFCBF\",\n \"udid\" : \"4C79C49E-79DD-42D5-BFFE-29D43AFAFCBF\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/95CFF117-EE25-41D9-B1FF-AF3CEAD7DB8D\\/data\",\n \"dataPathSize\" : 2458824704,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/95CFF117-EE25-41D9-B1FF-AF3CEAD7DB8D\",\n \"udid\" : \"95CFF117-EE25-41D9-B1FF-AF3CEAD7DB8D\",\n \"isAvailable\" : true,\n \"logPathSize\" : 589824,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D01C732C-1023-4B9C-8506-EDD399B21E0E\\/data\",\n \"dataPathSize\" : 1859375104,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D01C732C-1023-4B9C-8506-EDD399B21E0E\",\n \"udid\" : \"D01C732C-1023-4B9C-8506-EDD399B21E0E\",\n \"isAvailable\" : true,\n \"logPathSize\" : 389120,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone Xs Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/903B5B4B-33CA-4F7D-BF45-578B660FDEFF\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/903B5B4B-33CA-4F7D-BF45-578B660FDEFF\",\n \"udid\" : \"903B5B4B-33CA-4F7D-BF45-578B660FDEFF\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/25B96C82-F4B3-4EF0-B087-EF394C83CF12\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/25B96C82-F4B3-4EF0-B087-EF394C83CF12\",\n \"udid\" : \"25B96C82-F4B3-4EF0-B087-EF394C83CF12\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"lastBootedAt\" : \"2024-05-02T05:43:11Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/3B6F6B0D-9FCE-4D24-82C5-B3D289F1F91E\\/data\",\n \"dataPathSize\" : 509190144,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/3B6F6B0D-9FCE-4D24-82C5-B3D289F1F91E\",\n \"udid\" : \"3B6F6B0D-9FCE-4D24-82C5-B3D289F1F91E\",\n \"isAvailable\" : true,\n \"logPathSize\" : 249856,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (5th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F50CD992-E701-43D0-AAF6-6F5789D5A991\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F50CD992-E701-43D0-AAF6-6F5789D5A991\",\n \"udid\" : \"F50CD992-E701-43D0-AAF6-6F5789D5A991\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1E4BA5D3-0ADE-4118-A645-1F62F1B39368\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1E4BA5D3-0ADE-4118-A645-1F62F1B39368\",\n \"udid\" : \"1E4BA5D3-0ADE-4118-A645-1F62F1B39368\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (3rd generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4B4DF13D-4351-414A-B834-3165C167D1A3\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4B4DF13D-4351-414A-B834-3165C167D1A3\",\n \"udid\" : \"4B4DF13D-4351-414A-B834-3165C167D1A3\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (5th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4BB93F03-BCE7-4B4A-86F6-570F3B5961F7\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4BB93F03-BCE7-4B4A-86F6-570F3B5961F7\",\n \"udid\" : \"4BB93F03-BCE7-4B4A-86F6-570F3B5961F7\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-9th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (9th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BCEBC476-515E-46FC-A92D-15BE24839EBF\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BCEBC476-515E-46FC-A92D-15BE24839EBF\",\n \"udid\" : \"BCEBC476-515E-46FC-A92D-15BE24839EBF\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/55C9DB47-95DA-41E9-B5ED-EDFDDD47F476\\/data\",\n \"dataPathSize\" : 125722624,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/55C9DB47-95DA-41E9-B5ED-EDFDDD47F476\",\n \"udid\" : \"55C9DB47-95DA-41E9-B5ED-EDFDDD47F476\",\n \"isAvailable\" : true,\n \"logPathSize\" : 143360,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPod touch (7th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.tvOS-15-0\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6C199A80-BC88-4E23-A2D7-916901AFF12D\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6C199A80-BC88-4E23-A2D7-916901AFF12D\",\n \"udid\" : \"6C199A80-BC88-4E23-A2D7-916901AFF12D\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-4K\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D50ECD7D-4193-45E7-B03E-23702CCA8492\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D50ECD7D-4193-45E7-B03E-23702CCA8492\",\n \"udid\" : \"D50ECD7D-4193-45E7-B03E-23702CCA8492\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (at 1080p) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6DFBB3C8-F17A-4322-B804-6968E73BE918\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6DFBB3C8-F17A-4322-B804-6968E73BE918\",\n \"udid\" : \"6DFBB3C8-F17A-4322-B804-6968E73BE918\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-16-4\" : [\n {\n \"lastBootedAt\" : \"2024-01-19T06:56:36Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/ECADDD69-A7C6-494E-B6C7-BF98619F8353\\/data\",\n \"dataPathSize\" : 4949094400,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/ECADDD69-A7C6-494E-B6C7-BF98619F8353\",\n \"udid\" : \"ECADDD69-A7C6-494E-B6C7-BF98619F8353\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"logPathSize\" : 1327104,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro\"\n },\n {\n \"lastBootedAt\" : \"2023-08-22T12:54:30Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F3CF520C-B633-46F7-8B6A-78E6C702C19D\\/data\",\n \"dataPathSize\" : 308637696,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F3CF520C-B633-46F7-8B6A-78E6C702C19D\",\n \"udid\" : \"F3CF520C-B633-46F7-8B6A-78E6C702C19D\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"logPathSize\" : 40960,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9A061289-7CCD-4D58-B785-AEC32A9CB29B\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9A061289-7CCD-4D58-B785-AEC32A9CB29B\",\n \"udid\" : \"9A061289-7CCD-4D58-B785-AEC32A9CB29B\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/339EC42F-E665-4706-8E90-181F65B2E7FA\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/339EC42F-E665-4706-8E90-181F65B2E7FA\",\n \"udid\" : \"339EC42F-E665-4706-8E90-181F65B2E7FA\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Plus\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/8A676055-1359-493B-B5B0-CDBDBE023F86\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/8A676055-1359-493B-B5B0-CDBDBE023F86\",\n \"udid\" : \"8A676055-1359-493B-B5B0-CDBDBE023F86\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A5970A47-FB28-4B06-8AA7-F94E8BE9E58E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A5970A47-FB28-4B06-8AA7-F94E8BE9E58E\",\n \"udid\" : \"A5970A47-FB28-4B06-8AA7-F94E8BE9E58E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-4th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (4th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/CFC99F49-981C-46E4-BE1F-0C395A67DFC0\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/CFC99F49-981C-46E4-BE1F-0C395A67DFC0\",\n \"udid\" : \"CFC99F49-981C-46E4-BE1F-0C395A67DFC0\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-6th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (6th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7696CCAB-385F-4FE8-8B80-F2D15A43B1F8\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7696CCAB-385F-4FE8-8B80-F2D15A43B1F8\",\n \"udid\" : \"7696CCAB-385F-4FE8-8B80-F2D15A43B1F8\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (10th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/20EC3F56-66F9-44AB-ADC1-C128961DBF18\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/20EC3F56-66F9-44AB-ADC1-C128961DBF18\",\n \"udid\" : \"20EC3F56-66F9-44AB-ADC1-C128961DBF18\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/079259D5-EE3B-40B7-88AB-92606CAFF01C\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/079259D5-EE3B-40B7-88AB-92606CAFF01C\",\n \"udid\" : \"079259D5-EE3B-40B7-88AB-92606CAFF01C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-15-2\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A8108CE7-EA75-4392-A279-F9FEBDD48C85\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A8108CE7-EA75-4392-A279-F9FEBDD48C85\",\n \"udid\" : \"A8108CE7-EA75-4392-A279-F9FEBDD48C85\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/84D557A3-795D-413B-90A4-FE8E9E73E60C\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/84D557A3-795D-413B-90A4-FE8E9E73E60C\",\n \"udid\" : \"84D557A3-795D-413B-90A4-FE8E9E73E60C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C8AE9409-39D6-4047-B262-C897D4FC7F98\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C8AE9409-39D6-4047-B262-C897D4FC7F98\",\n \"udid\" : \"C8AE9409-39D6-4047-B262-C897D4FC7F98\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EFC02382-248F-405D-8281-2DEFEF85DEA1\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EFC02382-248F-405D-8281-2DEFEF85DEA1\",\n \"udid\" : \"EFC02382-248F-405D-8281-2DEFEF85DEA1\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 mini\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/B9A1AE4B-2012-4D3E-A1C3-0464D051EB2E\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/B9A1AE4B-2012-4D3E-A1C3-0464D051EB2E\",\n \"udid\" : \"B9A1AE4B-2012-4D3E-A1C3-0464D051EB2E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/730C4E3F-1554-4807-837F-3F063BEFAAF9\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/730C4E3F-1554-4807-837F-3F063BEFAAF9\",\n \"udid\" : \"730C4E3F-1554-4807-837F-3F063BEFAAF9\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/263536FE-B334-43F1-9383-8CD4E8AAF72B\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/263536FE-B334-43F1-9383-8CD4E8AAF72B\",\n \"udid\" : \"263536FE-B334-43F1-9383-8CD4E8AAF72B\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6C5803FB-7B86-43D6-9620-560758C6A337\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6C5803FB-7B86-43D6-9620-560758C6A337\",\n \"udid\" : \"6C5803FB-7B86-43D6-9620-560758C6A337\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 mini\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7FF701DF-617D-4979-9245-0BD95D85049D\\/data\",\n \"dataPathSize\" : 930074624,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7FF701DF-617D-4979-9245-0BD95D85049D\",\n \"udid\" : \"7FF701DF-617D-4979-9245-0BD95D85049D\",\n \"isAvailable\" : false,\n \"logPathSize\" : 376832,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9AC24800-00FD-44BE-9274-D9696F026C3E\\/data\",\n \"dataPathSize\" : 2493054976,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9AC24800-00FD-44BE-9274-D9696F026C3E\",\n \"udid\" : \"9AC24800-00FD-44BE-9274-D9696F026C3E\",\n \"isAvailable\" : false,\n \"logPathSize\" : 917504,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E9009B42-DEBE-4CCB-A5B7-6B47F3D9DA2E\\/data\",\n \"dataPathSize\" : 1297498112,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E9009B42-DEBE-4CCB-A5B7-6B47F3D9DA2E\",\n \"udid\" : \"E9009B42-DEBE-4CCB-A5B7-6B47F3D9DA2E\",\n \"isAvailable\" : false,\n \"logPathSize\" : 311296,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/41E8974C-94D8-42AD-95C3-40072CB19244\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/41E8974C-94D8-42AD-95C3-40072CB19244\",\n \"udid\" : \"41E8974C-94D8-42AD-95C3-40072CB19244\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0C208A65-2F6E-4ED2-84DE-AA51C5EDFCE9\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0C208A65-2F6E-4ED2-84DE-AA51C5EDFCE9\",\n \"udid\" : \"0C208A65-2F6E-4ED2-84DE-AA51C5EDFCE9\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/886D4227-6A31-4620-8B80-D61F195E009B\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/886D4227-6A31-4620-8B80-D61F195E009B\",\n \"udid\" : \"886D4227-6A31-4620-8B80-D61F195E009B\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6E5A4197-4FA4-4311-BF97-CE1EB1141A4B\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6E5A4197-4FA4-4311-BF97-CE1EB1141A4B\",\n \"udid\" : \"6E5A4197-4FA4-4311-BF97-CE1EB1141A4B\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/6E0F8400-E758-46E3-B775-B8CF9D61BFD9\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/6E0F8400-E758-46E3-B775-B8CF9D61BFD9\",\n \"udid\" : \"6E0F8400-E758-46E3-B775-B8CF9D61BFD9\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (3rd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/52BB557B-C83D-4843-ACDD-AAF5A39CC690\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/52BB557B-C83D-4843-ACDD-AAF5A39CC690\",\n \"udid\" : \"52BB557B-C83D-4843-ACDD-AAF5A39CC690\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2D3CA6A5-BBEE-496F-A31A-F6623198227C\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2D3CA6A5-BBEE-496F-A31A-F6623198227C\",\n \"udid\" : \"2D3CA6A5-BBEE-496F-A31A-F6623198227C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-9th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (9th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/85FDACD6-C3E3-4525-8256-1062C74AD945\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/85FDACD6-C3E3-4525-8256-1062C74AD945\",\n \"udid\" : \"85FDACD6-C3E3-4525-8256-1062C74AD945\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air--4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (4th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/260930BC-7361-4DD1-B450-3E4CA1BE4312\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/260930BC-7361-4DD1-B450-3E4CA1BE4312\",\n \"udid\" : \"260930BC-7361-4DD1-B450-3E4CA1BE4312\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/39662594-529D-433B-A7EC-ACBB1D0B3DB1\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/39662594-529D-433B-A7EC-ACBB1D0B3DB1\",\n \"udid\" : \"39662594-529D-433B-A7EC-ACBB1D0B3DB1\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPod touch (7th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-15-0\" : [\n {\n \"lastBootedAt\" : \"2022-12-19T09:14:01Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BD9DDA14-413A-4EA1-92B7-EE5782DD2611\\/data\",\n \"dataPathSize\" : 1628176384,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BD9DDA14-413A-4EA1-92B7-EE5782DD2611\",\n \"udid\" : \"BD9DDA14-413A-4EA1-92B7-EE5782DD2611\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"logPathSize\" : 348160,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F52821BA-0C22-4F0C-975B-8A2688C3493F\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F52821BA-0C22-4F0C-975B-8A2688C3493F\",\n \"udid\" : \"F52821BA-0C22-4F0C-975B-8A2688C3493F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro Max\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4047010A-7704-468E-912B-5E905F984555\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4047010A-7704-468E-912B-5E905F984555\",\n \"udid\" : \"4047010A-7704-468E-912B-5E905F984555\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/20A1C568-9DF0-4888-9BA9-133C928B2188\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/20A1C568-9DF0-4888-9BA9-133C928B2188\",\n \"udid\" : \"20A1C568-9DF0-4888-9BA9-133C928B2188\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 mini\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/07E0157F-B250-48DC-B40D-467961267357\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/07E0157F-B250-48DC-B40D-467961267357\",\n \"udid\" : \"07E0157F-B250-48DC-B40D-467961267357\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7289EAF4-6F35-40E3-82E2-F64343AA271B\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7289EAF4-6F35-40E3-82E2-F64343AA271B\",\n \"udid\" : \"7289EAF4-6F35-40E3-82E2-F64343AA271B\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 Pro Max\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/92EA08EE-7E0E-42A2-9ED1-C3335A861BCE\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/92EA08EE-7E0E-42A2-9ED1-C3335A861BCE\",\n \"udid\" : \"92EA08EE-7E0E-42A2-9ED1-C3335A861BCE\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5CD296A4-211E-42D5-B712-3E74299098F0\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5CD296A4-211E-42D5-B712-3E74299098F0\",\n \"udid\" : \"5CD296A4-211E-42D5-B712-3E74299098F0\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 12 mini\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BDC97DB6-0800-477A-8E4F-8E1D57F8121D\\/data\",\n \"dataPathSize\" : 2687442944,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BDC97DB6-0800-477A-8E4F-8E1D57F8121D\",\n \"udid\" : \"BDC97DB6-0800-477A-8E4F-8E1D57F8121D\",\n \"isAvailable\" : false,\n \"logPathSize\" : 626688,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (2nd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0B57403F-9F04-4D92-A2DC-0B8B9A8EE432\\/data\",\n \"dataPathSize\" : 3168837632,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0B57403F-9F04-4D92-A2DC-0B8B9A8EE432\",\n \"udid\" : \"0B57403F-9F04-4D92-A2DC-0B8B9A8EE432\",\n \"isAvailable\" : false,\n \"logPathSize\" : 925696,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1E6A86AC-F23B-4299-9586-D9FC87DBD7AC\\/data\",\n \"dataPathSize\" : 536694784,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1E6A86AC-F23B-4299-9586-D9FC87DBD7AC\",\n \"udid\" : \"1E6A86AC-F23B-4299-9586-D9FC87DBD7AC\",\n \"isAvailable\" : false,\n \"logPathSize\" : 430080,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11 Pro Max\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/FCDCAC3A-4211-4CDC-9903-D93282AE954A\\/data\",\n \"dataPathSize\" : 126038016,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/FCDCAC3A-4211-4CDC-9903-D93282AE954A\",\n \"udid\" : \"FCDCAC3A-4211-4CDC-9903-D93282AE954A\",\n \"isAvailable\" : false,\n \"logPathSize\" : 49152,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-11\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 11\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/81A32D52-6732-4B6B-93B6-5E212381868A\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/81A32D52-6732-4B6B-93B6-5E212381868A\",\n \"udid\" : \"81A32D52-6732-4B6B-93B6-5E212381868A\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D8FCAD0D-FEC7-4250-81F1-1BD270B73D7A\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D8FCAD0D-FEC7-4250-81F1-1BD270B73D7A\",\n \"udid\" : \"D8FCAD0D-FEC7-4250-81F1-1BD270B73D7A\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 8 Plus\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/333FA5C8-FBEA-4E97-9156-8A0DE4A7A644\\/data\",\n \"dataPathSize\" : 200552448,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/333FA5C8-FBEA-4E97-9156-8A0DE4A7A644\",\n \"udid\" : \"333FA5C8-FBEA-4E97-9156-8A0DE4A7A644\",\n \"isAvailable\" : false,\n \"logPathSize\" : 266240,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A59BC390-5CC6-4E22-9754-A7E2928FEBD3\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A59BC390-5CC6-4E22-9754-A7E2928FEBD3\",\n \"udid\" : \"A59BC390-5CC6-4E22-9754-A7E2928FEBD3\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (3rd generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2F10205E-8F62-4FEE-A4F7-4D418ABCA15A\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2F10205E-8F62-4FEE-A4F7-4D418ABCA15A\",\n \"udid\" : \"2F10205E-8F62-4FEE-A4F7-4D418ABCA15A\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (5th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1A426D14-958D-4FFD-930A-718022AC3307\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1A426D14-958D-4FFD-930A-718022AC3307\",\n \"udid\" : \"1A426D14-958D-4FFD-930A-718022AC3307\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-9th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (9th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7B35591C-CA1D-473A-B688-273FEA319F46\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7B35591C-CA1D-473A-B688-273FEA319F46\",\n \"udid\" : \"7B35591C-CA1D-473A-B688-273FEA319F46\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air--4th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (4th generation)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/91623240-2D45-4FAD-A091-B5F9E3BABF35\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/91623240-2D45-4FAD-A091-B5F9E3BABF35\",\n \"udid\" : \"91623240-2D45-4FAD-A091-B5F9E3BABF35\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro--9-7-inch-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (9.7-inch)\"\n },\n {\n \"availabilityError\" : \"The iOS 15.0 simulator runtime is not supported on hosts after macOS 14.99.0.\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/1537C252-D005-4ADD-B139-CAB7384C9C56\\/data\",\n \"dataPathSize\" : 13312000,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/1537C252-D005-4ADD-B139-CAB7384C9C56\",\n \"udid\" : \"1537C252-D005-4ADD-B139-CAB7384C9C56\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPod-touch--7th-generation-\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPod touch (7th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-16-1\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F97525EE-7975-4F46-971F-6B14CAED4B37\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F97525EE-7975-4F46-971F-6B14CAED4B37\",\n \"udid\" : \"F97525EE-7975-4F46-971F-6B14CAED4B37\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/40A9E541-8706-4C2D-BFC7-061B22F95BA6\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/40A9E541-8706-4C2D-BFC7-061B22F95BA6\",\n \"udid\" : \"40A9E541-8706-4C2D-BFC7-061B22F95BA6\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DAE61663-C807-4DE1-9740-2CDA543EB6CD\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DAE61663-C807-4DE1-9740-2CDA543EB6CD\",\n \"udid\" : \"DAE61663-C807-4DE1-9740-2CDA543EB6CD\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/65ED83C2-F0ED-489C-9690-A8DA19CF42A7\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/65ED83C2-F0ED-489C-9690-A8DA19CF42A7\",\n \"udid\" : \"65ED83C2-F0ED-489C-9690-A8DA19CF42A7\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Plus\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/38A8CC42-2ADE-4357-A3D5-CEA3E25524C2\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/38A8CC42-2ADE-4357-A3D5-CEA3E25524C2\",\n \"udid\" : \"38A8CC42-2ADE-4357-A3D5-CEA3E25524C2\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"lastBootedAt\" : \"2022-12-19T08:44:06Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/38367E7A-A881-4064-A377-84FCF8D0DF18\\/data\",\n \"dataPathSize\" : 1038458880,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/38367E7A-A881-4064-A377-84FCF8D0DF18\",\n \"udid\" : \"38367E7A-A881-4064-A377-84FCF8D0DF18\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"logPathSize\" : 53248,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/8674E410-E76C-4DB9-BF94-DB2B1AACD265\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/8674E410-E76C-4DB9-BF94-DB2B1AACD265\",\n \"udid\" : \"8674E410-E76C-4DB9-BF94-DB2B1AACD265\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-4th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (4th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/983F2C08-7725-4008-BA12-376037C4737E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/983F2C08-7725-4008-BA12-376037C4737E\",\n \"udid\" : \"983F2C08-7725-4008-BA12-376037C4737E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-6th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (6th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F6DA2F8C-5F92-482B-AE8A-DC8AB669CE9F\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F6DA2F8C-5F92-482B-AE8A-DC8AB669CE9F\",\n \"udid\" : \"F6DA2F8C-5F92-482B-AE8A-DC8AB669CE9F\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (10th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5996E0B4-A2CF-4C07-96FD-FC8F19B7A6B5\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5996E0B4-A2CF-4C07-96FD-FC8F19B7A6B5\",\n \"udid\" : \"5996E0B4-A2CF-4C07-96FD-FC8F19B7A6B5\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/80583390-2027-4DF6-A237-62AF73653359\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/80583390-2027-4DF6-A237-62AF73653359\",\n \"udid\" : \"80583390-2027-4DF6-A237-62AF73653359\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-16-0\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EC720CD1-F272-4ADD-811F-9FE923BB08B5\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EC720CD1-F272-4ADD-811F-9FE923BB08B5\",\n \"udid\" : \"EC720CD1-F272-4ADD-811F-9FE923BB08B5\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9F8BAC46-BC84-421F-9253-FB7627B6914E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9F8BAC46-BC84-421F-9253-FB7627B6914E\",\n \"udid\" : \"9F8BAC46-BC84-421F-9253-FB7627B6914E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro Max\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0D0984D1-BE6B-4C71-BDD9-E20E92CD8294\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0D0984D1-BE6B-4C71-BDD9-E20E92CD8294\",\n \"udid\" : \"0D0984D1-BE6B-4C71-BDD9-E20E92CD8294\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/43F5E8E5-BB18-4D11-8989-FC5A0C6D1461\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/43F5E8E5-BB18-4D11-8989-FC5A0C6D1461\",\n \"udid\" : \"43F5E8E5-BB18-4D11-8989-FC5A0C6D1461\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Plus\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/528079E1-3F26-4F27-8C74-3F07D795B468\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/528079E1-3F26-4F27-8C74-3F07D795B468\",\n \"udid\" : \"528079E1-3F26-4F27-8C74-3F07D795B468\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"lastBootedAt\" : \"2022-11-14T13:14:46Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A5759A5A-2E68-42E1-B37F-98E62BA908E2\\/data\",\n \"dataPathSize\" : 1796640768,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A5759A5A-2E68-42E1-B37F-98E62BA908E2\",\n \"udid\" : \"A5759A5A-2E68-42E1-B37F-98E62BA908E2\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"logPathSize\" : 147456,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 13 Pro\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4E0AE75F-B488-439E-BCA0-EED5CFAF62BE\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4E0AE75F-B488-439E-BCA0-EED5CFAF62BE\",\n \"udid\" : \"4E0AE75F-B488-439E-BCA0-EED5CFAF62BE\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/082BDC57-1B81-478C-8F1A-F5B95775F478\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/082BDC57-1B81-478C-8F1A-F5B95775F478\",\n \"udid\" : \"082BDC57-1B81-478C-8F1A-F5B95775F478\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2547D990-7ED4-44A9-8CDE-967551B891B0\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2547D990-7ED4-44A9-8CDE-967551B891B0\",\n \"udid\" : \"2547D990-7ED4-44A9-8CDE-967551B891B0\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (3rd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C8A2AFE9-3577-468E-B641-635494D10D5E\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C8A2AFE9-3577-468E-B641-635494D10D5E\",\n \"udid\" : \"C8A2AFE9-3577-468E-B641-635494D10D5E\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (5th generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/76BF0CC1-6B75-4AF9-9C4D-6EBC798A67DF\\/data\",\n \"dataPathSize\" : 13316096,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/76BF0CC1-6B75-4AF9-9C4D-6EBC798A67DF\",\n \"udid\" : \"76BF0CC1-6B75-4AF9-9C4D-6EBC798A67DF\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-9th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (9th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-18-3\" : [\n {\n \"lastBootedAt\" : \"2026-08-14T08:41:27Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/224FBAAE-B5C7-4A10-9143-3944A3280E48\\/data\",\n \"dataPathSize\" : 2566512640,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/224FBAAE-B5C7-4A10-9143-3944A3280E48\",\n \"udid\" : \"224FBAAE-B5C7-4A10-9143-3944A3280E48\",\n \"isAvailable\" : true,\n \"logPathSize\" : 491520,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0D27475E-E5A1-4E1C-91A9-D069DC2DE868\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0D27475E-E5A1-4E1C-91A9-D069DC2DE868\",\n \"udid\" : \"0D27475E-E5A1-4E1C-91A9-D069DC2DE868\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16 Pro Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/731205C3-C064-4291-825A-3205701B9666\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/731205C3-C064-4291-825A-3205701B9666\",\n \"udid\" : \"731205C3-C064-4291-825A-3205701B9666\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16e\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16e\"\n },\n {\n \"lastBootedAt\" : \"2026-08-25T04:48:39Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/30CB7307-D485-4C6E-A0C0-91AF7E0BCA11\\/data\",\n \"dataPathSize\" : 957317120,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/30CB7307-D485-4C6E-A0C0-91AF7E0BCA11\",\n \"udid\" : \"30CB7307-D485-4C6E-A0C0-91AF7E0BCA11\",\n \"isAvailable\" : true,\n \"logPathSize\" : 208896,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/EDA67A4C-49F3-4EED-86B1-493FBBA17380\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/EDA67A4C-49F3-4EED-86B1-493FBBA17380\",\n \"udid\" : \"EDA67A4C-49F3-4EED-86B1-493FBBA17380\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-16-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 16 Plus\"\n },\n {\n \"lastBootedAt\" : \"2026-10-13T14:56:01Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/2FF2505A-1336-4B48-978C-0F9A69CD3F80\\/data\",\n \"dataPathSize\" : 1078571008,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/2FF2505A-1336-4B48-978C-0F9A69CD3F80\",\n \"udid\" : \"2FF2505A-1336-4B48-978C-0F9A69CD3F80\",\n \"isAvailable\" : true,\n \"logPathSize\" : 376832,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/78312258-C009-47AC-90F9-264FE3A27FD6\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/78312258-C009-47AC-90F9-264FE3A27FD6\",\n \"udid\" : \"78312258-C009-47AC-90F9-264FE3A27FD6\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 11-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E67DEBA9-B295-40D3-A742-94B2C3F693DD\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E67DEBA9-B295-40D3-A742-94B2C3F693DD\",\n \"udid\" : \"E67DEBA9-B295-40D3-A742-94B2C3F693DD\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-13-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 13-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/ED867394-0EA6-4AA0-8E5B-166E08B2DEB2\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/ED867394-0EA6-4AA0-8E5B-166E08B2DEB2\",\n \"udid\" : \"ED867394-0EA6-4AA0-8E5B-166E08B2DEB2\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-A17-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (A17 Pro)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C8ED2608-39D4-4409-A72D-13EF6D72DD33\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C8ED2608-39D4-4409-A72D-13EF6D72DD33\",\n \"udid\" : \"C8ED2608-39D4-4409-A72D-13EF6D72DD33\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-A16\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (A16)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DC3BA040-F451-44CC-A77D-7280818512F2\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DC3BA040-F451-44CC-A77D-7280818512F2\",\n \"udid\" : \"DC3BA040-F451-44CC-A77D-7280818512F2\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-13-inch-M3\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 13-inch (M3)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/0DDE7C35-1407-443F-9CF3-AE583904F009\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/0DDE7C35-1407-443F-9CF3-AE583904F009\",\n \"udid\" : \"0DDE7C35-1407-443F-9CF3-AE583904F009\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-11-inch-M3\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 11-inch (M3)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E993C320-5F67-4153-B3A9-D459D3FEE41C\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E993C320-5F67-4153-B3A9-D459D3FEE41C\",\n \"udid\" : \"E993C320-5F67-4153-B3A9-D459D3FEE41C\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-11-inch-M2\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 11-inch (M2)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/91390D93-7665-44DF-9444-0DDE3A75C0DE\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/91390D93-7665-44DF-9444-0DDE3A75C0DE\",\n \"udid\" : \"91390D93-7665-44DF-9444-0DDE3A75C0DE\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-13-inch-M2\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 13-inch (M2)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/DCD6521E-70B3-4B29-9F3D-A98A62A8FF38\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/DCD6521E-70B3-4B29-9F3D-A98A62A8FF38\",\n \"udid\" : \"DCD6521E-70B3-4B29-9F3D-A98A62A8FF38\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (10th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-17-2\" : [\n {\n \"lastBootedAt\" : \"2024-05-14T13:50:57Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/BE87AC93-5C7B-42D5-B418-FBEA5F289135\\/data\",\n \"dataPathSize\" : 4014047232,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/BE87AC93-5C7B-42D5-B418-FBEA5F289135\",\n \"udid\" : \"BE87AC93-5C7B-42D5-B418-FBEA5F289135\",\n \"isAvailable\" : true,\n \"logPathSize\" : 892928,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Pro\"\n },\n {\n \"lastBootedAt\" : \"2025-09-04T01:52:49Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/3E9AF11D-EF60-4490-92F3-9E90E3784A89\\/data\",\n \"dataPathSize\" : 468508672,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/3E9AF11D-EF60-4490-92F3-9E90E3784A89\",\n \"udid\" : \"3E9AF11D-EF60-4490-92F3-9E90E3784A89\",\n \"isAvailable\" : true,\n \"logPathSize\" : 40960,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Pro Max\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9438D3CF-CE3D-4515-B9D8-E3C501D6F6A5\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9438D3CF-CE3D-4515-B9D8-E3C501D6F6A5\",\n \"udid\" : \"9438D3CF-CE3D-4515-B9D8-E3C501D6F6A5\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15\"\n },\n {\n \"lastBootedAt\" : \"2025-01-20T06:50:56Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/CD8403B7-1CF9-40B4-8502-FEF418F8323C\\/data\",\n \"dataPathSize\" : 5076082688,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/CD8403B7-1CF9-40B4-8502-FEF418F8323C\",\n \"udid\" : \"CD8403B7-1CF9-40B4-8502-FEF418F8323C\",\n \"isAvailable\" : true,\n \"logPathSize\" : 1642496,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Plus\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/777C2DBE-0528-469B-B4F7-562F1468A675\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/777C2DBE-0528-469B-B4F7-562F1468A675\",\n \"udid\" : \"777C2DBE-0528-469B-B4F7-562F1468A675\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F38BEFB7-F9EA-4824-BCA6-FF473383806E\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F38BEFB7-F9EA-4824-BCA6-FF473383806E\",\n \"udid\" : \"F38BEFB7-F9EA-4824-BCA6-FF473383806E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Pro Max\"\n },\n {\n \"lastBootedAt\" : \"2026-06-12T06:46:06Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/AAACD9EF-5B5C-4B34-8479-4E668A9DAEB6\\/data\",\n \"dataPathSize\" : 781791232,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/AAACD9EF-5B5C-4B34-8479-4E668A9DAEB6\",\n \"udid\" : \"AAACD9EF-5B5C-4B34-8479-4E668A9DAEB6\",\n \"isAvailable\" : true,\n \"logPathSize\" : 49152,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E8FEB18B-714D-46D1-909B-8E8A46753BD4\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E8FEB18B-714D-46D1-909B-8E8A46753BD4\",\n \"udid\" : \"E8FEB18B-714D-46D1-909B-8E8A46753BD4\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-14-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 14 Plus\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/43D8069D-5316-4D02-A03E-2A5428ECCE33\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/43D8069D-5316-4D02-A03E-2A5428ECCE33\",\n \"udid\" : \"43D8069D-5316-4D02-A03E-2A5428ECCE33\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/407E2255-ACBC-4F30-ABD4-36D1758ADA05\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/407E2255-ACBC-4F30-ABD4-36D1758ADA05\",\n \"udid\" : \"407E2255-ACBC-4F30-ABD4-36D1758ADA05\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-4th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (11-inch) (4th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A384F276-E220-4548-B038-CD5F481A4803\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A384F276-E220-4548-B038-CD5F481A4803\",\n \"udid\" : \"A384F276-E220-4548-B038-CD5F481A4803\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-12-9-inch-6th-generation-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro (12.9-inch) (6th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/5D7BD8E1-4B31-4CC0-AA1C-77BA10032483\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/5D7BD8E1-4B31-4CC0-AA1C-77BA10032483\",\n \"udid\" : \"5D7BD8E1-4B31-4CC0-AA1C-77BA10032483\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (10th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/455B0E7A-7699-488F-87AD-EF5BE79CE428\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/455B0E7A-7699-488F-87AD-EF5BE79CE428\",\n \"udid\" : \"455B0E7A-7699-488F-87AD-EF5BE79CE428\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-5th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air (5th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/FD04DCFC-18F9-4CBB-B6C7-29DA1201887E\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/FD04DCFC-18F9-4CBB-B6C7-29DA1201887E\",\n \"udid\" : \"FD04DCFC-18F9-4CBB-B6C7-29DA1201887E\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.watchOS-7-2\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/8B4A9AA9-95D3-4C28-9E91-A4E1A900B957\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/8B4A9AA9-95D3-4C28-9E91-A4E1A900B957\",\n \"udid\" : \"8B4A9AA9-95D3-4C28-9E91-A4E1A900B957\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/703C993A-71A6-4915-8761-AEC98988C6E6\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/703C993A-71A6-4915-8761-AEC98988C6E6\",\n \"udid\" : \"703C993A-71A6-4915-8761-AEC98988C6E6\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 40mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D7ABF808-DA26-44C1-9E8D-188789C773AE\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D7ABF808-DA26-44C1-9E8D-188789C773AE\",\n \"udid\" : \"D7ABF808-DA26-44C1-9E8D-188789C773AE\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7B26CEA8-BEC2-446B-8480-6BF3664F4CCE\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7B26CEA8-BEC2-446B-8480-6BF3664F4CCE\",\n \"udid\" : \"7B26CEA8-BEC2-446B-8480-6BF3664F4CCE\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 40mm\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.iOS-17-5\" : [\n {\n \"lastBootedAt\" : \"2026-08-14T03:23:50Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4DDC93E8-0813-4AE5-9AE0-DCFDF328FE9F\\/data\",\n \"dataPathSize\" : 5117435904,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4DDC93E8-0813-4AE5-9AE0-DCFDF328FE9F\",\n \"udid\" : \"4DDC93E8-0813-4AE5-9AE0-DCFDF328FE9F\",\n \"isAvailable\" : true,\n \"logPathSize\" : 1331200,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Pro\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Pro\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F1F07DD4-2574-42EA-A3F7-163CDA4F95B8\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F1F07DD4-2574-42EA-A3F7-163CDA4F95B8\",\n \"udid\" : \"F1F07DD4-2574-42EA-A3F7-163CDA4F95B8\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Pro-Max\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Pro Max\"\n },\n {\n \"lastBootedAt\" : \"2026-10-08T05:22:24Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/C012DC2D-6F85-4C9F-AF22-A10621385D53\\/data\",\n \"dataPathSize\" : 4844900352,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/C012DC2D-6F85-4C9F-AF22-A10621385D53\",\n \"udid\" : \"C012DC2D-6F85-4C9F-AF22-A10621385D53\",\n \"isAvailable\" : true,\n \"logPathSize\" : 1335296,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/A41F7B0E-D402-4522-9BDF-3D4C5FE7BACB\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/A41F7B0E-D402-4522-9BDF-3D4C5FE7BACB\",\n \"udid\" : \"A41F7B0E-D402-4522-9BDF-3D4C5FE7BACB\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-15-Plus\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone 15 Plus\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/16EB88C3-5B73-49EB-AD0C-4C17B34F3BE6\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/16EB88C3-5B73-49EB-AD0C-4C17B34F3BE6\",\n \"udid\" : \"16EB88C3-5B73-49EB-AD0C-4C17B34F3BE6\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPhone SE (3rd generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/9B812D1B-E1B7-4D12-93AB-ED3F9C13FCEC\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/9B812D1B-E1B7-4D12-93AB-ED3F9C13FCEC\",\n \"udid\" : \"9B812D1B-E1B7-4D12-93AB-ED3F9C13FCEC\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-11-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 11-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4A0F4A15-7301-4462-95CF-F1DFB70AE061\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4A0F4A15-7301-4462-95CF-F1DFB70AE061\",\n \"udid\" : \"4A0F4A15-7301-4462-95CF-F1DFB70AE061\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Pro-13-inch-M4-8GB\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Pro 13-inch (M4)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/E7CFE5C5-1B4F-49CB-9851-B00665071A44\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/E7CFE5C5-1B4F-49CB-9851-B00665071A44\",\n \"udid\" : \"E7CFE5C5-1B4F-49CB-9851-B00665071A44\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-11-inch-M2\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 11-inch (M2)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/79EAF305-E13E-47F2-A873-A11B4B0D4B26\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/79EAF305-E13E-47F2-A873-A11B4B0D4B26\",\n \"udid\" : \"79EAF305-E13E-47F2-A873-A11B4B0D4B26\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-Air-13-inch-M2\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad Air 13-inch (M2)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/AA71C281-402E-45D1-A3BB-33AF160511CA\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/AA71C281-402E-45D1-A3BB-33AF160511CA\",\n \"udid\" : \"AA71C281-402E-45D1-A3BB-33AF160511CA\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-10th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad (10th generation)\"\n },\n {\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/7F152374-6C04-498F-BD1A-6DE0D33E7A83\\/data\",\n \"dataPathSize\" : 18337792,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/7F152374-6C04-498F-BD1A-6DE0D33E7A83\",\n \"udid\" : \"7F152374-6C04-498F-BD1A-6DE0D33E7A83\",\n \"isAvailable\" : true,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.iPad-mini-6th-generation\",\n \"state\" : \"Shutdown\",\n \"name\" : \"iPad mini (6th generation)\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.xrOS-1-0\" : [\n {\n \"lastBootedAt\" : \"2023-09-16T01:40:31Z\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/870C7A03-6056-4D70-B136-E86EAFDFA89A\\/data\",\n \"dataPathSize\" : 762941440,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/870C7A03-6056-4D70-B136-E86EAFDFA89A\",\n \"udid\" : \"870C7A03-6056-4D70-B136-E86EAFDFA89A\",\n \"isAvailable\" : false,\n \"availabilityError\" : \"device type profile not found\",\n \"logPathSize\" : 204800,\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Vision Pro\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.tvOS-14-5\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/CDE2DE55-F4F7-46A9-BB89-0BC36C898CA3\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/CDE2DE55-F4F7-46A9-BB89-0BC36C898CA3\",\n \"udid\" : \"CDE2DE55-F4F7-46A9-BB89-0BC36C898CA3\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-4K\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/D7FA8B86-04AE-4830-A8CF-39A86B2912D2\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/D7FA8B86-04AE-4830-A8CF-39A86B2912D2\",\n \"udid\" : \"D7FA8B86-04AE-4830-A8CF-39A86B2912D2\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-2nd-generation-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV 4K (at 1080p) (2nd generation)\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4368A4AD-24EC-484F-88B8-CCC20192AA3C\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4368A4AD-24EC-484F-88B8-CCC20192AA3C\",\n \"udid\" : \"4368A4AD-24EC-484F-88B8-CCC20192AA3C\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple TV\"\n }\n ],\n \"com.apple.CoreSimulator.SimRuntime.watchOS-7-4\" : [\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/F068C2A3-30FE-4846-BE87-8014F1D1FE28\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/F068C2A3-30FE-4846-BE87-8014F1D1FE28\",\n \"udid\" : \"F068C2A3-30FE-4846-BE87-8014F1D1FE28\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/54C7178C-28FE-4002-9EF9-16C82F2A3419\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/54C7178C-28FE-4002-9EF9-16C82F2A3419\",\n \"udid\" : \"54C7178C-28FE-4002-9EF9-16C82F2A3419\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-6-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 6 - 40mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/4D2BCFD7-D6F5-4970-8822-C7EB02ED1A1D\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/4D2BCFD7-D6F5-4970-8822-C7EB02ED1A1D\",\n \"udid\" : \"4D2BCFD7-D6F5-4970-8822-C7EB02ED1A1D\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-44mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 44mm\"\n },\n {\n \"availabilityError\" : \"runtime profile not found using \\\"System\\\" match policy\",\n \"dataPath\" : \"\\/Users\\/klaus\\/Library\\/Developer\\/CoreSimulator\\/Devices\\/94FC2D89-47CD-40F7-95EC-B16526A67BC7\\/data\",\n \"dataPathSize\" : 0,\n \"logPath\" : \"\\/Users\\/klaus\\/Library\\/Logs\\/CoreSimulator\\/94FC2D89-47CD-40F7-95EC-B16526A67BC7\",\n \"udid\" : \"94FC2D89-47CD-40F7-95EC-B16526A67BC7\",\n \"isAvailable\" : false,\n \"deviceTypeIdentifier\" : \"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-5-40mm\",\n \"state\" : \"Shutdown\",\n \"name\" : \"Apple Watch Series 5 - 40mm\"\n }\n ]\n }\n}\n" + }, + { + "argv": [ + "pgrep", + "-f", + "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7/NoticeNativeQA.app/NoticeNativeQA" + ], + "exit": 1, + "output": "" + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/compare.py b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/compare.py new file mode 100644 index 00000000..750b29ef --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/compare.py @@ -0,0 +1,70 @@ +import hashlib +import json +from pathlib import Path +import subprocess + +from PIL import Image, ImageChops, ImageDraw + +evidence = Path(__file__).resolve().parent +frames = evidence / "frames" +names = ["two-rest", "two-mid", "two-end", "wrap-rest", "wrap-mid", "wrap-end", "one-rest", "one-after-6s", "long-dark", "long-light"] +images = {name: Image.open(frames / (name + ".png")).convert("RGB") for name in names} +arrow_box = (654, 267, 702, 339) +title_box = (48, 267, 638, 339) +banner_box = (0, 267, 750, 339) +reference_arrow = images["two-rest"].crop(arrow_box) + + +def changed_pixels(first, second): + return sum(pixel != (0, 0, 0) for pixel in ImageChops.difference(first, second).get_flattened_data()) + + +results = {} +sheet = Image.new("RGB", (750, len(names) * 110), "#202020") +draw = ImageDraw.Draw(sheet) +for index, name in enumerate(names): + path = frames / (name + ".png") + image = images[name] + assert path.read_bytes()[:8] == b"\x89PNG\r\n\x1a\n" + assert image.size == (750, 1334) + arrow = image.crop(arrow_box) + assert changed_pixels(reference_arrow, arrow) == 0 + bounds = arrow.getbbox() + assert bounds is not None + results[name] = {"sha256": hashlib.sha256(path.read_bytes()).hexdigest(), "dimensions": list(image.size), "freshAfterExtractedSource": path.stat().st_mtime > (evidence / "source/UpdateBannerView.swift").stat().st_mtime, "arrowChangedPixels": changed_pixels(reference_arrow, arrow), "arrowRGBSha256": hashlib.sha256(arrow.tobytes()).hexdigest(), "arrowInkBoundsPx": [bounds[0] + arrow_box[0], bounds[1] + arrow_box[1], bounds[2] + arrow_box[0], bounds[3] + arrow_box[1]]} + assert results[name]["freshAfterExtractedSource"] + image.crop(banner_box).save(evidence / (name + "-banner.png")) + draw.text((8, index * 110 + 5), name, fill="white") + sheet.paste(image.crop(banner_box), (0, index * 110 + 30)) + +pairs = [("two-rest", "two-mid"), ("two-rest", "two-end"), ("wrap-rest", "wrap-mid"), ("wrap-mid", "wrap-end"), ("two-rest", "wrap-end"), ("two-end", "wrap-rest"), ("one-rest", "one-after-6s"), ("long-dark", "long-light")] +title_diffs = {first + " -> " + second: changed_pixels(images[first].crop(title_box), images[second].crop(title_box)) for first, second in pairs} +assert title_diffs["two-rest -> two-end"] > 0 +assert title_diffs["wrap-rest -> wrap-mid"] > 0 +assert title_diffs["wrap-mid -> wrap-end"] > 0 +assert title_diffs["two-rest -> wrap-end"] == 0 +assert title_diffs["two-end -> wrap-rest"] == 0 +assert title_diffs["one-rest -> one-after-6s"] == 0 +assert title_diffs["long-dark -> long-light"] == 0 +provenance = json.loads((evidence / "provenance.json").read_text()) +product = Path(provenance["product"]) +text = product.read_text() +old_banner = (evidence.parent / "native-fix/rerun-154222/source/UpdateBannerView.swift").read_text().removeprefix("import SwiftUI\n\n").rstrip() +start = text.index("struct UpdateBannerView: View {") +end = text.index("// MARK: - Profile Section View") +reconstructed = text[:start] + old_banner + "\n\n" + text[end:] +assert hashlib.sha256(reconstructed.encode()).hexdigest() == "7f8ac15573ab4c9fe01508431297e40d2e95a22ad37585859f03224475749d02" +assert hashlib.sha256(product.read_bytes()).hexdigest() == provenance["sha256"] +report = {"productSha256": provenance["sha256"], "outsideBannerUnchanged": True, "arrowSlotPx": arrow_box, "titleRegionPx": title_box, "bannerPx": banner_box, "frames": results, "titleChangedPixels": title_diffs, "timingLimit": "two-mid was sampled before visible transition and equals rest; wrap-mid proves the native in-flight transition. Scheduling and rendering are not exact 5.000-second timing measurements."} +(evidence / "comparison.json").write_text(json.dumps(report, indent=2)) +sheet.save(evidence / "banner-contact-sheet.png") +commands = json.loads((evidence / "commands.json").read_text()) +launch = next(command for command in commands if "argv" in command and command["argv"][:3] == ["xcrun", "simctl", "launch"]) +pid = int(launch["output"].rsplit(":", 1)[1].strip()) +process = subprocess.run(["ps", "-p", str(pid), "-o", "pid=,command="], text=True, capture_output=True) +assert process.returncode == 1 and not process.stdout.strip() +cleanup = json.loads((evidence / "cleanup.json").read_text()) +assert not Path(cleanup["root"]).exists() +cleanup.update({"appPid": pid, "processAbsent": True, "postCleanupProcessCheck": {"argv": process.args, "exit": process.returncode, "output": process.stdout}}) +(evidence / "cleanup.json").write_text(json.dumps(cleanup, indent=2)) +print(json.dumps({"arrowInvariantFrames": len(results), "titleChangedPixels": title_diffs, "outsideBannerUnchanged": True, "productSha256": provenance["sha256"]}, indent=2)) diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/comparison.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/comparison.json new file mode 100644 index 00000000..4099f0db --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/comparison.json @@ -0,0 +1,195 @@ +{ + "productSha256": "af77569942c0bbdbad0242431362b5987dc278d8f70d015ccc1ef675b2b264ed", + "outsideBannerUnchanged": true, + "arrowSlotPx": [ + 654, + 267, + 702, + 339 + ], + "titleRegionPx": [ + 48, + 267, + 638, + 339 + ], + "bannerPx": [ + 0, + 267, + 750, + 339 + ], + "frames": { + "two-rest": { + "sha256": "9aa699352a8b59342e2dfb2d1b4e6e21aadaf7631982788036eada23b6d4d439", + "dimensions": [ + 750, + 1334 + ], + "freshAfterExtractedSource": true, + "arrowChangedPixels": 0, + "arrowRGBSha256": "bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6", + "arrowInkBoundsPx": [ + 672, + 289, + 689, + 318 + ] + }, + "two-mid": { + "sha256": "9aa699352a8b59342e2dfb2d1b4e6e21aadaf7631982788036eada23b6d4d439", + "dimensions": [ + 750, + 1334 + ], + "freshAfterExtractedSource": true, + "arrowChangedPixels": 0, + "arrowRGBSha256": "bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6", + "arrowInkBoundsPx": [ + 672, + 289, + 689, + 318 + ] + }, + "two-end": { + "sha256": "98a65e1f87fdbf4e2a5ac4cbc7862549b9863755a18a508b3e2b9a362230cff1", + "dimensions": [ + 750, + 1334 + ], + "freshAfterExtractedSource": true, + "arrowChangedPixels": 0, + "arrowRGBSha256": "bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6", + "arrowInkBoundsPx": [ + 672, + 289, + 689, + 318 + ] + }, + "wrap-rest": { + "sha256": "98a65e1f87fdbf4e2a5ac4cbc7862549b9863755a18a508b3e2b9a362230cff1", + "dimensions": [ + 750, + 1334 + ], + "freshAfterExtractedSource": true, + "arrowChangedPixels": 0, + "arrowRGBSha256": "bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6", + "arrowInkBoundsPx": [ + 672, + 289, + 689, + 318 + ] + }, + "wrap-mid": { + "sha256": "90c801bc8245634f8dcaba707ba597ed4ae324d859a442d645a254652ede8793", + "dimensions": [ + 750, + 1334 + ], + "freshAfterExtractedSource": true, + "arrowChangedPixels": 0, + "arrowRGBSha256": "bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6", + "arrowInkBoundsPx": [ + 672, + 289, + 689, + 318 + ] + }, + "wrap-end": { + "sha256": "9aa699352a8b59342e2dfb2d1b4e6e21aadaf7631982788036eada23b6d4d439", + "dimensions": [ + 750, + 1334 + ], + "freshAfterExtractedSource": true, + "arrowChangedPixels": 0, + "arrowRGBSha256": "bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6", + "arrowInkBoundsPx": [ + 672, + 289, + 689, + 318 + ] + }, + "one-rest": { + "sha256": "a046258bed2ce2d36d3e6d33600803b18f1b6de0f23f6aec9e592121af36f044", + "dimensions": [ + 750, + 1334 + ], + "freshAfterExtractedSource": true, + "arrowChangedPixels": 0, + "arrowRGBSha256": "bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6", + "arrowInkBoundsPx": [ + 672, + 289, + 689, + 318 + ] + }, + "one-after-6s": { + "sha256": "a046258bed2ce2d36d3e6d33600803b18f1b6de0f23f6aec9e592121af36f044", + "dimensions": [ + 750, + 1334 + ], + "freshAfterExtractedSource": true, + "arrowChangedPixels": 0, + "arrowRGBSha256": "bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6", + "arrowInkBoundsPx": [ + 672, + 289, + 689, + 318 + ] + }, + "long-dark": { + "sha256": "47eb29b2389c6c33242e475da6815e3bdbbf169dae29c5c893d46150c7a124e6", + "dimensions": [ + 750, + 1334 + ], + "freshAfterExtractedSource": true, + "arrowChangedPixels": 0, + "arrowRGBSha256": "bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6", + "arrowInkBoundsPx": [ + 672, + 289, + 689, + 318 + ] + }, + "long-light": { + "sha256": "47eb29b2389c6c33242e475da6815e3bdbbf169dae29c5c893d46150c7a124e6", + "dimensions": [ + 750, + 1334 + ], + "freshAfterExtractedSource": true, + "arrowChangedPixels": 0, + "arrowRGBSha256": "bbea1dbee839fd83d527bd7dedeb600b983053e8ad39b68b23e64c7982410fb6", + "arrowInkBoundsPx": [ + 672, + 289, + 689, + 318 + ] + } + }, + "titleChangedPixels": { + "two-rest -> two-mid": 0, + "two-rest -> two-end": 2213, + "wrap-rest -> wrap-mid": 3857, + "wrap-mid -> wrap-end": 3796, + "two-rest -> wrap-end": 0, + "two-end -> wrap-rest": 0, + "one-rest -> one-after-6s": 0, + "long-dark -> long-light": 0 + }, + "timingLimit": "two-mid was sampled before visible transition and equals rest; wrap-mid proves the native in-flight transition. Scheduling and rendering are not exact 5.000-second timing measurements." +} \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/focused-check.log b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/focused-check.log new file mode 100644 index 00000000..37ed2b1a --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/focused-check.log @@ -0,0 +1,4 @@ +PASS: actual NoticeApi/Repository public v2 GET requestPlain without Authorization; legacy list auth/timezone unchanged +PASS: actual DTO/roller 0/1/2/3, omitted/null envelope, repeated order/wrap/selection, exact HTML/date, legacy no-id, shrink/reset and lifecycle predicate +PASS: actual MyPageViewModel background delivery on main, 0/1/2/3 success, empty hides, HTTP/envelope/decode/transport failure preserves data, log-only/loading semantics +PASS: My Page notices regression checks (actual production API/Repository/VM/DTO/roller, native Combine; no server calls) diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/actions.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/actions.json new file mode 100644 index 00000000..106bb6f0 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/actions.json @@ -0,0 +1,187 @@ +[ + { + "event" : "application-didBecomeActive", + "scenario" : "preparing", + "uptime" : 1.3584730760194361 + }, + { + "event" : "scenario-start", + "scenario" : "two-title-only", + "uptime" : 1.5774609060026705 + }, + { + "elements" : [ + + ], + "event" : "two-rest", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two-title-only", + "screenshot" : "two-rest.png", + "uptime" : 6.7126591140404344 + }, + { + "elements" : [ + + ], + "event" : "two-mid", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two-title-only", + "screenshot" : "two-mid.png", + "uptime" : 6.8130604360485449 + }, + { + "elements" : [ + + ], + "event" : "two-end", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two-title-only", + "screenshot" : "two-end.png", + "uptime" : 7.6315462980419397 + }, + { + "elements" : [ + + ], + "event" : "wrap-rest", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two-title-only", + "screenshot" : "wrap-rest.png", + "uptime" : 11.689762036083266 + }, + { + "elements" : [ + + ], + "event" : "wrap-mid", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two-title-only", + "screenshot" : "wrap-mid.png", + "uptime" : 11.895390465040691 + }, + { + "elements" : [ + + ], + "event" : "wrap-end", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "two-title-only", + "screenshot" : "wrap-end.png", + "uptime" : 12.91269328200724 + }, + { + "event" : "scenario-start", + "scenario" : "one-static", + "uptime" : 13.90669221105054 + }, + { + "elements" : [ + + ], + "event" : "one-rest", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "one-static", + "screenshot" : "one-rest.png", + "uptime" : 14.727093173074536 + }, + { + "elements" : [ + + ], + "event" : "one-after-6s", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "one-static", + "screenshot" : "one-after-6s.png", + "uptime" : 20.693930465029553 + }, + { + "event" : "scenario-start", + "scenario" : "long-title", + "uptime" : 22.577453555073589 + }, + { + "elements" : [ + + ], + "event" : "long-dark", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "long-title", + "screenshot" : "long-dark.png", + "uptime" : 23.391706261085346 + }, + { + "elements" : [ + + ], + "event" : "long-light", + "phaseProbe" : [ + { + "event" : "appear", + "phase" : "active" + } + ], + "requestedPhase" : "active", + "scenario" : "long-title", + "screenshot" : "long-light.png", + "uptime" : 25.083867059089243 + }, + { + "event" : "title-only-finished", + "scenario" : "long-title", + "uptime" : 25.728418567101471 + } +] \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/long-dark.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/long-dark.png new file mode 100644 index 00000000..241eb769 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/long-dark.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/long-light.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/long-light.png new file mode 100644 index 00000000..241eb769 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/long-light.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/one-after-6s.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/one-after-6s.png new file mode 100644 index 00000000..2aa62acb Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/one-after-6s.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/one-rest.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/one-rest.png new file mode 100644 index 00000000..2aa62acb Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/one-rest.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/two-end.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/two-end.png new file mode 100644 index 00000000..da66204c Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/two-end.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/two-mid.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/two-mid.png new file mode 100644 index 00000000..48bb6b84 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/two-mid.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/two-rest.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/two-rest.png new file mode 100644 index 00000000..48bb6b84 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/two-rest.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/wrap-end.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/wrap-end.png new file mode 100644 index 00000000..48bb6b84 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/wrap-end.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/wrap-mid.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/wrap-mid.png new file mode 100644 index 00000000..0c2de126 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/wrap-mid.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/wrap-rest.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/wrap-rest.png new file mode 100644 index 00000000..da66204c Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/frames/wrap-rest.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/long-dark-banner.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/long-dark-banner.png new file mode 100644 index 00000000..054f72bb Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/long-dark-banner.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/long-light-banner.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/long-light-banner.png new file mode 100644 index 00000000..054f72bb Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/long-light-banner.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/one-after-6s-banner.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/one-after-6s-banner.png new file mode 100644 index 00000000..12144fa1 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/one-after-6s-banner.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/one-rest-banner.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/one-rest-banner.png new file mode 100644 index 00000000..12144fa1 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/one-rest-banner.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/provenance.json b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/provenance.json new file mode 100644 index 00000000..c46471d3 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/provenance.json @@ -0,0 +1,37 @@ +{ + "product": "SodaLive/Sources/MyPage/MyPageView.swift", + "sha256": "af77569942c0bbdbad0242431362b5987dc278d8f70d015ccc1ef675b2b264ed", + "extractedBannerSha256": "56b9f87c93d58b01d9e555b0a9d34ad5c45420929a9df81e7e64c8cf64b856fe", + "retainedHarness": "docs/20261028_\ub9c8\uc774_\ud0ed_\uacf5\uc9c0\uc0ac\ud56d_\ub864\ub9c1/reviews/evidence/native-fix/rerun-154222/source/Harness.swift", + "harnessChange": "run() scenario only; rendering/sampling/root unchanged", + "dependencies": { + "MyPageNoticeRoller.swift": { + "path": "SodaLive/Sources/V2/MyPage/Models/MyPageNoticeRoller.swift", + "sha256": "1bd3f0dfc2ee59ce692291bf3079b06874e7c1012e4365105d3636928e29fe8a", + "sameAsRetained": true + }, + "GetNoticeResponse.swift": { + "path": "SodaLive/Sources/Settings/Notice/GetNoticeResponse.swift", + "sha256": "bbf55eb38659af3df7c6db29af0fa7904d0f87457ec098068fe96e282cee1977", + "sameAsRetained": true + }, + "FontModifier.swift": { + "path": "SodaLive/Sources/Extensions/FontModifier.swift", + "sha256": "086fb0a19d884124a4cca638f7c8483de724ee31a61603b2cbd489aabf26a6c6", + "sameAsRetained": true + }, + "Spacing.swift": { + "path": "SodaLive/Sources/UI/Theme/Spacing.swift", + "sha256": "372a73b821236c15449fa022cd628f61556f1381a16f234a4b77e833c2e588c1", + "sameAsRetained": true + }, + "ColorExtension.swift": { + "path": "SodaLive/Sources/Extensions/ColorExtension.swift", + "sha256": "747347d86ade888fe9c1d30629285b4a71991bc0f21189a0d4b76ad314c32364", + "sameAsRetained": true + } + }, + "timer": "Unmodified production 5s Timer / 0.35s transition", + "substitutions": "Retained local AppState routing sink and LanguageOption; no API/network; actual product font bundled", + "root": "/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/notice-title-native.8wiga1c7" +} \ No newline at end of file diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/run.py b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/run.py new file mode 100644 index 00000000..92bce6d9 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/run.py @@ -0,0 +1,128 @@ +import atexit +import hashlib +import json +import os +from pathlib import Path +import plistlib +import shutil +import subprocess +import tempfile +import time + +repo = Path.cwd() +evidence = Path(__file__).resolve().parent +retained = evidence.parent / "native-fix/rerun-154222/source" +root = Path(tempfile.mkdtemp(prefix="notice-title-native.", dir="/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode")) +device = None +launched_pid = None +bundle = "local.sodalive.NoticeTitleOnlyQA" +commands = [] +for key in ("TMPDIR", "TMP", "TEMP", "XDG_CACHE_HOME", "NODE_COMPILE_CACHE", "BUN_RUNTIME_TRANSPILER_CACHE_PATH", "CLANG_MODULE_CACHE_PATH", "SWIFT_MODULECACHE_PATH"): + os.environ[key] = str(root / key) + Path(os.environ[key]).mkdir() + + +def run(args, timeout=120, check=True): + result = subprocess.run(args, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=timeout) + commands.append({"argv": [str(value) for value in args], "exit": result.returncode, "output": result.stdout}) + (evidence / "commands.json").write_text(json.dumps(commands, indent=2)) + if check and result.returncode: + raise RuntimeError(result.stdout) + return result.stdout.strip() + + +def cleanup(): + receipt = {"root": str(root), "device": device, "parentRootUntouched": "notice-title-only.i9lFW3"} + if device: + run(["xcrun", "simctl", "terminate", device, bundle], check=False) + run(["xcrun", "simctl", "shutdown", device], check=False) + run(["xcrun", "simctl", "delete", device], check=False) + devices = json.loads(run(["xcrun", "simctl", "list", "devices", "-j"])) + receipt["deviceAbsent"] = all(item["udid"] != device for group in devices["devices"].values() for item in group) + receipt["appPid"] = launched_pid + receipt["processAbsent"] = launched_pid is None or not run(["ps", "-p", str(launched_pid), "-o", "pid=,command="], check=False) + shutil.rmtree(root) + receipt["rootAbsent"] = not root.exists() + (evidence / "cleanup.json").write_text(json.dumps(receipt, indent=2)) + + +atexit.register(cleanup) +source = root / "source" +source.mkdir() +product = repo / "SodaLive/Sources/MyPage/MyPageView.swift" +text = product.read_text() +banner = "import SwiftUI\n\n" + text[text.index("struct UpdateBannerView: View {"):text.index("// MARK: - Profile Section View")].rstrip() + "\n" +(source / "UpdateBannerView.swift").write_text(banner) +dependencies = { + "MyPageNoticeRoller.swift": "SodaLive/Sources/V2/MyPage/Models/MyPageNoticeRoller.swift", + "GetNoticeResponse.swift": "SodaLive/Sources/Settings/Notice/GetNoticeResponse.swift", + "FontModifier.swift": "SodaLive/Sources/Extensions/FontModifier.swift", + "Spacing.swift": "SodaLive/Sources/UI/Theme/Spacing.swift", + "ColorExtension.swift": "SodaLive/Sources/Extensions/ColorExtension.swift", +} +for name, path in dependencies.items(): + shutil.copy2(repo / path, source / name) +harness = (retained / "Harness.swift").read_text() +scenario = ''' func run() { + let first = NoticeItem(title: "첫 번째 공지 안내", content: "

첫 번째 전체 본문

", date: "2026-10-28") + let second = NoticeItem(title: "두 번째 서비스 소식", content: "

두 번째 전체 본문

", date: "2026-10-27") + let long = NoticeItem(title: "서비스 업데이트와 새로운 기능을 안내합니다 공지사항의 긴 한국어 제목을 끝까지 확인해 주세요", content: "

긴 제목

", date: "2026-10-25") + set("two-title-only", items: [first, second]) + for (delay, name) in [(4.8, "two-rest"), (5.15, "two-mid"), (5.7, "two-end"), (9.8, "wrap-rest"), (10.15, "wrap-mid"), (10.7, "wrap-end")] { + after(delay) { self.sample(name) } + } + after(12) { + self.set("one-static", items: [first]) + self.after(0.7) { self.sample("one-rest") } + self.after(6.7) { self.sample("one-after-6s") } + } + after(20) { + self.set("long-title", items: [long]) + self.after(0.7) { self.sample("long-dark") } + self.after(1.5) { self.window?.overrideUserInterfaceStyle = .light } + self.after(2.3) { self.sample("long-light") } + self.after(3) { self.record("title-only-finished") } + } + } +''' +harness = harness[:harness.index(" func run() {")] + scenario + harness[harness.index("\n}\n\n@main"):] +(source / "Harness.swift").write_text(harness) +shutil.copytree(source, evidence / "source", dirs_exist_ok=True) +provenance = {"product": str(product.relative_to(repo)), "sha256": hashlib.sha256(product.read_bytes()).hexdigest(), "extractedBannerSha256": hashlib.sha256(banner.encode()).hexdigest(), "retainedHarness": str(retained.relative_to(repo) / "Harness.swift"), "harnessChange": "run() scenario only; rendering/sampling/root unchanged", "dependencies": {name: {"path": path, "sha256": hashlib.sha256((repo / path).read_bytes()).hexdigest(), "sameAsRetained": (repo / path).read_bytes() == (retained / name).read_bytes()} for name, path in dependencies.items()}, "timer": "Unmodified production 5s Timer / 0.35s transition", "substitutions": "Retained local AppState routing sink and LanguageOption; no API/network; actual product font bundled", "root": str(root)} +(evidence / "provenance.json").write_text(json.dumps(provenance, indent=2)) +check = run(["bash", "work/tests/check-my-page-notices.sh"]) +(evidence / "focused-check.log").write_text(check + "\n") +run(["xcrun", "swiftc", "-frontend", "-parse", str(product)]) +app = root / "NoticeNativeQA.app" +app.mkdir() +shutil.copy2(repo / "SodaLive/Resources/Font/Pretendard-Regular.otf", app / "Pretendard-Regular.otf") +with (app / "Info.plist").open("wb") as handle: + plistlib.dump({"CFBundleIdentifier": bundle, "CFBundleExecutable": "NoticeNativeQA", "CFBundleName": "NoticeNativeQA", "CFBundlePackageType": "APPL", "CFBundleVersion": "1", "CFBundleShortVersionString": "1", "MinimumOSVersion": "16.6", "LSRequiresIPhoneOS": True, "UIDeviceFamily": [1], "UILaunchScreen": {}, "UIAppFonts": ["Pretendard-Regular.otf"]}, handle) +sdk = run(["xcrun", "--sdk", "iphonesimulator", "--show-sdk-path"]) +run(["xcrun", "--sdk", "iphonesimulator", "swiftc", "-sdk", sdk, "-target", "x86_64-apple-ios16.6-simulator", "-module-cache-path", str(root / "module-cache"), *map(str, source.glob("*.swift")), "-o", str(app / "NoticeNativeQA")], timeout=180) +device = run(["xcrun", "simctl", "create", "NoticeTitleOnly-Owned", "com.apple.CoreSimulator.SimDeviceType.iPhone-SE-3rd-generation", "com.apple.CoreSimulator.SimRuntime.iOS-18-3"]) +run(["xcrun", "simctl", "boot", device]) +for attempt in range(2): + try: + run(["xcrun", "simctl", "bootstatus", device, "-b"], timeout=240) + break + except subprocess.TimeoutExpired: + commands.append({"event": "bootstatus-timeout", "attempt": attempt + 1}) + if attempt == 1: + raise +run(["xcrun", "simctl", "install", device, str(app)]) +launch = run(["xcrun", "simctl", "launch", device, bundle]) +launched_pid = int(launch.rsplit(":", 1)[1].strip()) +container = Path(run(["xcrun", "simctl", "get_app_container", device, bundle, "data"])) +actions = container / "Documents/matrix/actions.json" +deadline = time.monotonic() + 65 +while time.monotonic() < deadline: + if actions.exists() and any(event["event"] == "title-only-finished" for event in json.loads(actions.read_text())): + break + time.sleep(1) +else: + raise RuntimeError("Native harness did not finish within 65 seconds: " + launch) +shutil.copytree(actions.parent, evidence / "frames", dirs_exist_ok=True) +assert hashlib.sha256(product.read_bytes()).hexdigest() == provenance["sha256"] +print(check) +print("Native title-only frames: " + str(evidence / "frames")) diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/ColorExtension.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/ColorExtension.swift new file mode 100644 index 00000000..742e4ad8 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/ColorExtension.swift @@ -0,0 +1,40 @@ +// +// ColorExtension.swift +// SodaLive +// +// Created by klaus on 2023/08/09. +// +// https://seons-dev.tistory.com/174 +// + +import SwiftUI + +extension Color { + init(hex: String) { + let scanner = Scanner(string: hex) + _ = scanner.scanString("#") + + var rgb: UInt64 = 0 + scanner.scanHexInt64(&rgb) + + let r = Double((rgb >> 16) & 0xFF) / 255.0 + let g = Double((rgb >> 8) & 0xFF) / 255.0 + let b = Double((rgb >> 0) & 0xFF) / 255.0 + self.init(red: r, green: g, blue: b) + } +} + +extension UIColor { + convenience init(hex: String, alpha: CGFloat = 1.0) { + let scanner = Scanner(string: hex) + _ = scanner.scanString("#") + + var rgb: UInt64 = 0 + scanner.scanHexInt64(&rgb) + + let r = Double((rgb >> 16) & 0xFF) / 255.0 + let g = Double((rgb >> 8) & 0xFF) / 255.0 + let b = Double((rgb >> 0) & 0xFF) / 255.0 + self.init(red: r, green: g, blue: b, alpha: alpha) + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/FontModifier.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/FontModifier.swift new file mode 100644 index 00000000..33ba84e5 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/FontModifier.swift @@ -0,0 +1,164 @@ +// +// FontModifier.swift +// SodaLive +// +// Created by klaus on 1/23/26. +// + +import SwiftUI + +enum SodaTypography { + case heading1 + case heading2 + case heading3 + case heading4 + case body1 + case body2 + case body3 + case body4 + case body5 + case body6 + case caption1 + case caption2 + case caption3 + + var size: CGFloat { + switch self { + case .heading1: + return 24 + case .heading2: + return 22 + case .heading3: + return 20 + case .heading4: + return 18 + case .body1, .body2, .body3: + return 16 + case .body4, .body5, .body6: + return 14 + case .caption1, .caption2, .caption3: + return 12 + } + } + + func localizedFontName(locale: Locale = .autoupdatingCurrent) -> String? { + fontName(for: .localized, weight: weight, locale: locale) + } + + var weight: SwiftUI.Font.Weight { + switch self { + case .heading1, .heading2, .heading3, .heading4, .body1, .body4, .caption1: + return .bold + case .body2, .body5, .caption2: + return .medium + case .body3, .body6, .caption3: + return .regular + } + } +} + +enum SodaFontFamily { + case localized + case pattaya + case phosphate +} + +private func resolvedLanguageCode(currentLocale: Locale) -> String? { + if let raw = UserDefaults.standard.string(forKey: "app.language"), + let option = LanguageOption(rawValue: raw), + option != .system { + return option.rawValue + } + return currentLocale.language.languageCode?.identifier +} + +private func koreanFontName(for weight: SwiftUI.Font.Weight) -> String { + switch weight { + case .bold: + return "Pretendard-Bold" + case .medium: + return "Pretendard-Medium" + case .light: + return "Pretendard-Light" + default: + return "Pretendard-Regular" + } +} + +private func japaneseFontName(for weight: SwiftUI.Font.Weight) -> String { + switch weight { + case .bold: + return "NotoSansJP-Bold" + case .medium: + return "NotoSansJP-Medium" + case .light: + return "NotoSansJP-Light" + default: + return "NotoSansJP-Regular" + } +} + +private func fontName(for family: SodaFontFamily, weight: SwiftUI.Font.Weight, locale: Locale) -> String? { + switch family { + case .localized: + switch resolvedLanguageCode(currentLocale: locale) { + case "ko": + return koreanFontName(for: weight) + case "ja": + return japaneseFontName(for: weight) + default: + return nil + } + case .pattaya: + return "Pattaya-Regular" + case .phosphate: + return "PhosphateSolid" + } +} + +struct FontModifier: ViewModifier { + @Environment(\.locale) private var locale + let size: CGFloat + let weight: SwiftUI.Font.Weight + let family: SodaFontFamily + + func body(content: Content) -> some View { + if let fontName = fontName(for: family, weight: weight, locale: locale) { + content.font(.custom(fontName, size: size)) + } else { + content.font(.system(size: size, weight: weight)) + } + } +} + +extension View { + func appFont( + size: CGFloat, + weight: SwiftUI.Font.Weight = .regular, + family: SodaFontFamily = .localized + ) -> some View { + self.modifier(FontModifier(size: size, weight: weight, family: family)) + } + + func appFont(_ typography: SodaTypography, family: SodaFontFamily = .localized) -> some View { + appFont(size: typography.size, weight: typography.weight, family: family) + } +} + +extension Text { + func appFont( + size: CGFloat, + weight: SwiftUI.Font.Weight = .regular, + family: SodaFontFamily = .localized + ) -> Text { + if let fontName = fontName(for: family, weight: weight, locale: .autoupdatingCurrent) { + return self.font(.custom(fontName, size: size)) + } + + return self.font(.system(size: size, weight: weight)) + } + + func appFont(_ typography: SodaTypography, family: SodaFontFamily = .localized) -> Text { + appFont(size: typography.size, weight: typography.weight, family: family) + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/GetNoticeResponse.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/GetNoticeResponse.swift new file mode 100644 index 00000000..6cbe3604 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/GetNoticeResponse.swift @@ -0,0 +1,19 @@ +// +// GetNoticeResponse.swift +// SodaLive +// +// Created by klaus on 2023/08/10. +// + +import Foundation + +struct GetNoticeResponse: Decodable { + let totalCount: Int + let noticeList: [NoticeItem] +} + +struct NoticeItem: Decodable, Hashable { + let title: String + let content: String + let date: String +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/Harness.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/Harness.swift new file mode 100644 index 00000000..eab8f2e0 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/Harness.swift @@ -0,0 +1,187 @@ +import SwiftUI +import UIKit + +enum LanguageOption: String { case system, ko, en, ja } + +enum AppStep { case noticeDetail(notice: NoticeItem) } + +final class AppState { + static let shared = AppState() + var captures: [[String: String]] = [] + var phases: [[String: String]] = [] + func setAppStep(step: AppStep) { + switch step { + case .noticeDetail(let notice): + captures.append(["title": notice.title, "content": notice.content, "date": notice.date]) + } + } +} + +struct PhaseProbe: View { + @Environment(\.scenePhase) private var phase + var body: some View { + Color.clear + .onAppear { AppState.shared.phases.append(["event": "appear", "phase": String(describing: phase)]) } + .onChange(of: phase) { value in AppState.shared.phases.append(["event": "change", "phase": String(describing: value)]) } + } +} + +final class HarnessState: ObservableObject { + @Published var items: [NoticeItem] = [] + @Published var mounted = true + @Published var phase = ScenePhase.active + @Published var scenario = "preparing" +} + +struct HarnessRoot: View { + @ObservedObject var state: HarnessState + var body: some View { + VStack(alignment: .leading, spacing: 0) { + VStack(alignment: .leading, spacing: 8) { + Text("NATIVE QA HARNESS").font(.headline) + Text(state.scenario).font(.caption.monospaced()) + Text("Actual UpdateBannerView below").font(.caption) + } + .foregroundStyle(.white) + .padding(24) + if state.mounted && !state.items.isEmpty { + UpdateBannerView(items: state.items) + .background(PhaseProbe()) + .environment(\.scenePhase, state.phase) + } + Text("Harness context / no network / no login") + .font(.caption) + .foregroundStyle(.gray) + .padding(24) + Spacer() + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) + .background(Color(hex: "131313")) + .environment(\.locale, Locale(identifier: "ko_KR")) + } +} + +final class HarnessDelegate: NSObject, UIApplicationDelegate { + var window: UIWindow? + let state = HarnessState() + let started = ProcessInfo.processInfo.systemUptime + var events: [[String: Any]] = [] + let output = URL.documentsDirectory.appendingPathComponent(CommandLine.arguments.contains("--lifecycle") ? "lifecycle" : "matrix", isDirectory: true) + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { + UserDefaults.standard.set("ko", forKey: "app.language") + try! FileManager.default.createDirectory(at: output, withIntermediateDirectories: true) + let window = UIWindow(frame: UIScreen.main.bounds) + window.rootViewController = UIHostingController(rootView: HarnessRoot(state: state)) + window.overrideUserInterfaceStyle = .dark + self.window = window + window.makeKeyAndVisible() + NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main) { [weak self] _ in + self?.state.phase = .inactive + self?.record("application-willResignActive") + } + NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { [weak self] _ in + self?.state.phase = .active + self?.record("application-didBecomeActive") + } + after(1) { self.run() } + return true + } + + func after(_ seconds: Double, _ action: @escaping () -> Void) { + DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: action) + } + + func record(_ event: String, details: [String: Any] = [:]) { + var entry = details + entry["event"] = event + entry["uptime"] = ProcessInfo.processInfo.systemUptime - started + entry["scenario"] = state.scenario + events.append(entry) + let data = try! JSONSerialization.data(withJSONObject: events, options: [.prettyPrinted, .sortedKeys]) + try! data.write(to: output.appendingPathComponent("actions.json")) + } + + func elements() -> [NSObject] { + var found: [NSObject] = [] + var visited = Set() + func visit(_ object: NSObject, depth: Int) { + guard depth < 30, visited.insert(ObjectIdentifier(object)).inserted else { return } + if object.isAccessibilityElement { found.append(object) } + if let children = object.accessibilityElements { + for child in children { if let child = child as? NSObject { visit(child, depth: depth + 1) } } + } + let count = object.accessibilityElementCount() + if count > 0 && count < 1000 { + for index in 0.. [String: Any] in + let frame = node.accessibilityFrame + return ["class": String(describing: type(of: node)), "label": node.accessibilityLabel ?? "", "button": node.accessibilityTraits.contains(.button), "x": frame.minX, "y": frame.minY, "width": frame.width, "height": frame.height] + }] + details["phaseProbe"] = AppState.shared.phases + details["requestedPhase"] = String(describing: state.phase) + if activate { + let before = AppState.shared.captures.count + let button = nodes.first { node in + node.accessibilityTraits.contains(.button) && state.items.contains(where: { node.accessibilityLabel?.contains($0.title) == true }) + } + details["accessibilityActivateResult"] = button?.accessibilityActivate() ?? false + details["captureDelta"] = AppState.shared.captures.count - before + details["sink"] = AppState.shared.captures + } + if screenshot, let window { + let renderer = UIGraphicsImageRenderer(bounds: window.bounds) + let image = renderer.image { _ in window.drawHierarchy(in: window.bounds, afterScreenUpdates: true) } + try! image.pngData()!.write(to: output.appendingPathComponent(name + ".png")) + details["screenshot"] = name + ".png" + } + record(name, details: details) + } + + func set(_ scenario: String, items: [NoticeItem]) { + state.scenario = scenario + state.items = items + state.phase = .active + state.mounted = true + record("scenario-start") + } + + func run() { + let first = NoticeItem(title: "첫 번째 공지 안내", content: "

첫 번째 전체 본문

", date: "2026-10-28") + let second = NoticeItem(title: "두 번째 서비스 소식", content: "

두 번째 전체 본문

", date: "2026-10-27") + let long = NoticeItem(title: "서비스 업데이트와 새로운 기능을 안내합니다 공지사항의 긴 한국어 제목을 끝까지 확인해 주세요", content: "

긴 제목

", date: "2026-10-25") + set("two-title-only", items: [first, second]) + for (delay, name) in [(4.8, "two-rest"), (5.15, "two-mid"), (5.7, "two-end"), (9.8, "wrap-rest"), (10.15, "wrap-mid"), (10.7, "wrap-end")] { + after(delay) { self.sample(name) } + } + after(12) { + self.set("one-static", items: [first]) + self.after(0.7) { self.sample("one-rest") } + self.after(6.7) { self.sample("one-after-6s") } + } + after(20) { + self.set("long-title", items: [long]) + self.after(0.7) { self.sample("long-dark") } + self.after(1.5) { self.window?.overrideUserInterfaceStyle = .light } + self.after(2.3) { self.sample("long-light") } + self.after(3) { self.record("title-only-finished") } + } + } + +} + +@main +struct NoticeQAEntry { + static func main() { UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(HarnessDelegate.self)) } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/MyPageNoticeRoller.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/MyPageNoticeRoller.swift new file mode 100644 index 00000000..bba4fe1f --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/MyPageNoticeRoller.swift @@ -0,0 +1,25 @@ +import Foundation + +struct MyPageNoticeRoller { + private var items: [NoticeItem] = [] + private(set) var index = 0 + + var current: NoticeItem? { + items.isEmpty ? nil : items[index] + } + + mutating func update(_ items: [NoticeItem]) { + guard self.items != items else { return } + self.items = items + index = 0 + } + + mutating func advance() { + guard items.count > 1 else { return } + index = (index + 1) % items.count + } + + func shouldRoll(isVisible: Bool, isActive: Bool) -> Bool { + items.count > 1 && isVisible && isActive + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/Spacing.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/Spacing.swift new file mode 100644 index 00000000..d3d65ea3 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/Spacing.swift @@ -0,0 +1,20 @@ +// +// Spacing.swift +// SodaLive +// + +import SwiftUI + +enum SodaSpacing { + static let s4: CGFloat = 4 + static let s6: CGFloat = 6 + static let s8: CGFloat = 8 + static let s12: CGFloat = 12 + static let s14: CGFloat = 14 + static let s16: CGFloat = 16 + static let s20: CGFloat = 20 + static let s24: CGFloat = 24 + static let s28: CGFloat = 28 + static let s32: CGFloat = 32 + static let s48: CGFloat = 48 +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/UpdateBannerView.swift b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/UpdateBannerView.swift new file mode 100644 index 00000000..1033b808 --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/source/UpdateBannerView.swift @@ -0,0 +1,87 @@ +import SwiftUI + +struct UpdateBannerView: View { + private static let foregroundColor = Color(hex: "B0BEC5") + private static let rollInterval: TimeInterval = 5 + private static let transitionDuration: TimeInterval = 0.35 + + let items: [NoticeItem] + + @Environment(\.scenePhase) private var scenePhase + @Environment(\.accessibilityReduceMotion) private var reduceMotion + @State private var roller = MyPageNoticeRoller() + @State private var rollTimer: Timer? + @State private var isVisible = false + + var body: some View { + ZStack { + if let item = roller.current { + Button { + AppState.shared.setAppStep(step: .noticeDetail(notice: item)) + } label: { + HStack(spacing: SodaSpacing.s8) { + ZStack { + Text(item.title) + .appFont(.body3) + .lineLimit(1) + .truncationMode(.tail) + .frame(maxWidth: .infinity, alignment: .leading) + .id(roller.index) + .transition(reduceMotion ? .identity : .asymmetric( + insertion: .move(edge: .bottom), + removal: .move(edge: .top) + )) + } + .clipped() + + Image(systemName: "chevron.right") + .frame(width: SodaSpacing.s24, height: SodaSpacing.s24) + .accessibilityHidden(true) + } + .foregroundColor(Self.foregroundColor) + .padding(.horizontal, SodaSpacing.s24) + .padding(.vertical, SodaSpacing.s6) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + } + } + .clipped() + .background(Color.black) + .onAppear { + isVisible = true + roller.update(items) + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + .onDisappear { + isVisible = false + stopRollTimer() + } + .onChange(of: items) { items in + roller.update(items) + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + .onChange(of: scenePhase) { scenePhase in + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + .onChange(of: reduceMotion) { reduceMotion in + restartRollTimer(scenePhase: scenePhase, reduceMotion: reduceMotion) + } + } + + private func restartRollTimer(scenePhase: ScenePhase, reduceMotion: Bool) { + stopRollTimer() + guard roller.shouldRoll(isVisible: isVisible, isActive: scenePhase == .active) else { return } + + rollTimer = Timer.scheduledTimer(withTimeInterval: Self.rollInterval, repeats: true) { _ in + withAnimation(reduceMotion ? nil : .easeOut(duration: Self.transitionDuration)) { + roller.advance() + } + } + } + + private func stopRollTimer() { + rollTimer?.invalidate() + rollTimer = nil + } +} diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/two-end-banner.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/two-end-banner.png new file mode 100644 index 00000000..1e87b5e3 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/two-end-banner.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/two-mid-banner.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/two-mid-banner.png new file mode 100644 index 00000000..12144fa1 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/two-mid-banner.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/two-rest-banner.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/two-rest-banner.png new file mode 100644 index 00000000..12144fa1 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/two-rest-banner.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/wrap-end-banner.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/wrap-end-banner.png new file mode 100644 index 00000000..12144fa1 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/wrap-end-banner.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/wrap-mid-banner.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/wrap-mid-banner.png new file mode 100644 index 00000000..74210448 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/wrap-mid-banner.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/wrap-rest-banner.png b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/wrap-rest-banner.png new file mode 100644 index 00000000..1e87b5e3 Binary files /dev/null and b/docs/20261028_마이_탭_공지사항_롤링/reviews/evidence/title-only/wrap-rest-banner.png differ diff --git a/docs/20261028_마이_탭_공지사항_롤링/reviews/phase1-my-page-notices.md b/docs/20261028_마이_탭_공지사항_롤링/reviews/phase1-my-page-notices.md new file mode 100644 index 00000000..57de2c9b --- /dev/null +++ b/docs/20261028_마이_탭_공지사항_롤링/reviews/phase1-my-page-notices.md @@ -0,0 +1,72 @@ +# 마이 탭 공지 롤링 리뷰 + +## 1. 리뷰 정보 + +| 항목 | 내용 | +|---|---| +| 대상 | Phase 1 / working tree, 기준 HEAD `8c08861b34222a9c29bfa2bdaea888d111e37829` | +| 일자 | 2026-10-28 | +| 리뷰어 | Oracle 코드 리뷰, 독립 native QA, 부모 검증 | +| 기준 | `../prd.md`, `../plan-task.md` | +| 상태 | 수정 검증 완료 / 코드 APPROVE / 서버 통합 대기 | + +## 2. 목적과 범위 + +최신 공지 배열 계약·기존 상세 동작·제목 확장·0/1/2/3 순환·생명주기 회귀를 검토한다. 서버 구현과 기존 홈은 제외한다. + +## 3. 판정 기준 + +사용자 요구 또는 기존 동작을 깨는 확인된 문제만 차단한다. 전체 앱·실제 터치 검증과 하네스 검증을 구분한다. + +## 4. 검토한 근거 + +- `MyPageView.swift`, `MyPageViewModel.swift`, `NoticeApi.swift`, `NoticeRepository.swift`, `MyPageNoticeRoller.swift`, 공통 응답·기존 상세·두 메인 탭 경로. +- 신규 `work/tests/MyPageNoticesCheck.swift`와 runner, 기존 인증 종료 회귀 fixture, 두 앱 타깃 등록. +- 부모 실행: 전체 13개 스크립트 PASS. 두 앱 스킴 generic iOS 및 iOS Simulator 빌드 모두 exit 0. +- Oracle 직접 실행: 신규 공지·기존 인증 종료 검사 PASS, diff 공백 검사 PASS. +- [native QA](evidence/native/README.md): 실제 소스 기반 iPhone SE3 / iOS18.3 화면과 5초 타이머, 36 PNG. S5 실패. 전체 앱/물리 탭 검증 아님. + +## 5. 발견 사항 요약 + +| ID | 심각도 | 상태 | 제목 | 후속 Goal | +|---|---|---|---|---| +| REV-P1-001 | Medium | 확정 | 배너 외부 padding이 Button 영역 밖으로 이동해 기존 클릭 영역 축소 | P1-R1 | +| REV-P1-002 | High | 확정 | inactive에서 한 번 더 진행하고 active 복귀 후 재개하지 않음 | P1-R1 | + +## 6. 발견 사항 상세 + +### REV-P1-001 + +`MyPageView.swift`의 Button label 내부에 contentShape가 있지만 기존 좌우24·상하6 padding은 바깥 ZStack에 있다. 기존에는 padding 뒤 contentShape/onTapGesture로 배너 전체를 눌렀다. padding을 label 내부로 옮긴 뒤 contentShape를 적용하여 기존 영역을 복원한다. 실제 좌표 탭은 환경 도구 지원 범위에 따라 별도 판정한다. + +### REV-P1-002 + +`scenePhase` onChange가 전달하는 새 값을 버리고 `restartRollTimer()` 내부에서 캡처된 환경 값을 읽는다. native probe는 inactive/active 변경을 기록했지만 배너 동작은 이전 상태를 따른다. 같은 실패가 matrix, 별도 lifecycle, OS background/복귀 bridge에서 재현됐다. 새 phase를 직접 타이머 재시작 판단에 전달하는 최소 변경을 우선 검증한다. Reduce Motion 변경도 새 값을 사용해야 하는지 함께 확인한다. + +## 7. plan·goal 전환 + +두 항목을 코드 변경 전에 `plan-task.md`의 P1-R1로 등록했다. 기존 실패 증거를 보존하고 새 캡처·실행 결과를 별도로 누적한다. + +## 8. 최종 판정 + +현재 REQUEST_CHANGES. API·배열·본문/date·기존 목록 보존은 확인됐으나 위 회귀 수정이 필요하다. 실서버 공개 GET 401은 별도 외부 통합 차단 조건이다. + +### 후속 판정 — 2026-10-28 + +- **APPROVE:** Oracle 재리뷰에서 REV-P1-001/002 모두 해결, 추가 확정 제품 코드 차단 사항 없음. 위 REQUEST_CHANGES는 최초 판정 기록으로 보존한다. +- 배너 padding이 label 안에서 contentShape 앞에 적용돼 기존 영역의 소유권이 복원됐다. scenePhase/Reduce Motion의 새 값을 타이머 재시작 함수에 직접 전달한다. +- [수정 후 native 증거](evidence/native-fix/README.md): 리뷰어가 핵심 25장을 직접 확인하여 하네스 범위 시각 PASS. 0/1/2/3 순환, 한글 말줄임·화살표, inactive 유지·active 재개·OS 복귀·remount·축소를 확인했다. +- 부모 최종 검증: 전체 13개 검사 PASS, `SodaLive`/`SodaLive-dev` 각각 iOS·Simulator 빌드 exit 0. 리뷰 중 남아 있던 dev simulator 실행도 이후 exit 0으로 완료했다. 최종 제품 소스 해시는 `7f8ac15573ab4c9fe01508431297e40d2e95a22ad37585859f03224475749d02`와 일치한다. +- QA worker 서비스 연결 실패 후 fallback이 동일 소스로 [별도 재실행](evidence/native-fix/rerun-154222/README.md)을 마쳤다. 제품 수정 없이 추가 확인했으며 기존 RED/승인 대상 증거는 보존했다. +- 부모가 프로세스 부재·booted simulator 없음·모든 알려진 소유 TMP 부재를 확인했다. [정리 영수증](evidence/native-fix/cleanup.json). +- **미검증:** 실제 좌표 탭/가장자리 hit-testing, 전체 앱 상세 이동, VoiceOver·Reduce Motion 런타임, 실기기/iOS16.6, LSP(도구 미제공). 코드·하네스 승인을 전체 E2E 승인으로 확대하지 않는다. +- **외부 출시 조건:** 신규 API 무인증 GET의 HTTP 200·실제 payload 확인이 필요하다. 현재 테스트 서버는 401이며 클라이언트 fallback이나 공통 인증 변경은 하지 않았다. + +### P1-T2 후속 UI 보완 — 2026-10-28 + +- 사용자가 계약·정상 동작·롤링 정상 확인을 전달했다. 위 401 외부 확인 대기는 사용자 확인으로 해소하며 과거 측정 기록만 보존한다. +- 사용자 추가 요청에 따라 화살표·버튼은 고정하고 제목만 전환한다. 변경은 `UpdateBannerView`의 제목 ZStack과 id/transition 위치로 한정했다. +- 독립 리뷰 **APPROVE**, 확정 발견 사항 없음. 전체 padded hit area·현재 항목 callback·5초 타이머·생명주기·Reduce Motion 경로를 유지했다. +- [native 비교판](evidence/title-only/banner-contact-sheet.png)에서 실제 wrap 중간 제목 이동과 고정 화살표 확인. 부모 비교 스크립트 재실행 exit 0, 10개 프레임 화살표 변경 픽셀 0. 중간 전환 이전에 찍힌 `two-mid`는 중간 동작 증거에서 제외하고 `wrap-mid`를 사용했다. +- 부모 검증: 회귀 스크립트 13개 PASS, `SodaLive-dev` iOS Simulator 빌드 exit 0, diff 공백 검사 PASS. 제품 SHA-256 `af77569942c0bbdbad0242431362b5987dc278d8f70d015ccc1ef675b2b264ed`. +- 물리 탭·전체 상세 이동·VoiceOver/Reduce Motion 런타임 재검증은 이번 범위에서 생략했다. 하네스 렌더링·픽셀 비교와 전체 E2E를 구분한다.