문제
letterbox 보정(#527)의 발동 게이트는 standalone && portrait && shortfall >= 24 && safeAreaTop > 0인데(e2e/fixture/launcher/letterbox.ts), safeAreaTop은 env(safe-area-inset-top) CSS 측정값이다. iOS standalone(웹 클립)에는 cold start에서 env()가 0/stale 값을 반환하고 회전(orientationchange) 후에야 정정되는 알려진 WebKit 결함이 있다:
이 경우 shortfall은 47로 정확히 측정되지만(screen.height − max(innerHeight, visualViewport.height) — env() 비의존이라 견고) safeAreaTop이 0으로 읽혀 verdict=false → 보정 미발동 → 하단 47pt 밴드가 빈 채 남는다. 현재 완화책은 mount + 600ms settle 단일 재측정 + resize/orientationchange 리스너(Launcher.tsx)인데, gist 관측대로라면 600ms 시점에도 env()가 stale일 수 있다 — 그 세션은 사용자가 회전하기 전까지 영구히 미보정.
제안
- settle 재측정을 단일 600ms → multi-timeout(예: 100/600/1500ms) 으로 확장.
- (검토)
pageshow/visibilitychange(bfcache·standalone resume 복귀 시) 재측정 추가 — standalone은 메모리 resume이 잦아 cold-start 측정이 오래 살아남는다.
- diag 배너/진단 패널에 measured
safeAreaTop 원시값 + verdict 사유를 노출해, 폰 관측만으로 "shortfall 47인데 top 0이라 미발동" 상태를 식별 가능하게.
Out of scope
safeAreaTop > 0 게이트 자체의 완화(top=0 케이스에 보정 발동)는 하지 않는다 — 구메타(stale web clip) healthy below-sb 케이스(shortfall 47–59, top 0, 창이 이미 물리 바닥에 도달)에 보정을 발동하면 47px 오버플로/스크롤을 만든다. letterbox.ts 케이스 매트릭스의 false 판정은 의도된 것.
Acceptance
- cold start 직후 env()가 stale 0이어도, 회전 없이 수 초 내 재측정으로 verdict가 정정된다 (시뮬레이터/실기기).
- 진단 표면에서
safeAreaTop 원시값과 verdict 사유를 읽을 수 있다.
- 기존 케이스 매트릭스(healthy below-sb 포함)의 판정 회귀 없음 — letterbox.vitest 케이스 유지.
문제
letterbox 보정(#527)의 발동 게이트는
standalone && portrait && shortfall >= 24 && safeAreaTop > 0인데(e2e/fixture/launcher/letterbox.ts),safeAreaTop은env(safe-area-inset-top)CSS 측정값이다. iOS standalone(웹 클립)에는 cold start에서env()가 0/stale 값을 반환하고 회전(orientationchange) 후에야 정정되는 알려진 WebKit 결함이 있다:이 경우 shortfall은 47로 정확히 측정되지만(
screen.height − max(innerHeight, visualViewport.height)— env() 비의존이라 견고)safeAreaTop이 0으로 읽혀 verdict=false → 보정 미발동 → 하단 47pt 밴드가 빈 채 남는다. 현재 완화책은 mount + 600ms settle 단일 재측정 + resize/orientationchange 리스너(Launcher.tsx)인데, gist 관측대로라면 600ms 시점에도 env()가 stale일 수 있다 — 그 세션은 사용자가 회전하기 전까지 영구히 미보정.제안
pageshow/visibilitychange(bfcache·standalone resume 복귀 시) 재측정 추가 — standalone은 메모리 resume이 잦아 cold-start 측정이 오래 살아남는다.safeAreaTop원시값 + verdict 사유를 노출해, 폰 관측만으로 "shortfall 47인데 top 0이라 미발동" 상태를 식별 가능하게.Out of scope
safeAreaTop > 0게이트 자체의 완화(top=0 케이스에 보정 발동)는 하지 않는다 — 구메타(stale web clip) healthy below-sb 케이스(shortfall 47–59, top 0, 창이 이미 물리 바닥에 도달)에 보정을 발동하면 47px 오버플로/스크롤을 만든다. letterbox.ts 케이스 매트릭스의 false 판정은 의도된 것.Acceptance
safeAreaTop원시값과 verdict 사유를 읽을 수 있다.