2026-08-06

요약 (AI 작성)

스크롤 컨테이너를 제대로 된 추상으로 만든 날입니다. ScrollView 설계를 문서로 세우고 이름부터 코드가 실제로 부르던 ScrollArea 로 맞춘 뒤, SV1a 로 스크롤 좌표계를 도크 밖 공용 자리로 옮기고, SV1b 로 스크롤 발행과 clip 을 tree.build 가 소유하게 했으며, SV1c 로 뷰포트 높이를 예측하는 대신 layout 에게 묻고 스크롤바 드래그 수명과 분수 휠 잔여까지 scroll_area.State 가 소유하도록 옮겼습니다. 각 단계마다 문서를 실제로 만들어진 구조에 맞춰 고쳐 썼고, 도크 build 버퍼 크기를 build 자신이 소유하게 하고 도크 props 를 한 함수로 모아 테스트가 같은 경로를 타게 했습니다.

이 리팩터를 받쳐 준 건 촘촘한 판정자들입니다. 예측한 뷰포트와 layout 이 만든 뷰포트가 같은지, 스크롤 좌표와 발행된 tree 가 실제로 맞는지, 텍스트가 나르는 clip rect 가 무엇인지, 재투영이 스냅샷 세대를 올리는지, 무변화 이동이 리페인트를 부르지 않는지를 각각 고정했고, 휠 스크롤 경로 전체와 스크롤바 드래그의 down·흡수·소비 계약, 키보드 스크롤과 anchor 경계, 상한 축소와 빈 목록이라는 무판정 구간까지 덮었습니다. 스크롤바를 실제로 보는 골든 게이트도 세우고, 그 골든이 무엇을 판정하고 무엇을 안 하는지 명시했습니다. 적대적 검증은 여러 라운드에 걸쳐 렌더 낡음·깜빡임, 기하 스탬프, lock 계약, 배치 실패 가드 같은 프레임 일관성 결함을 계속 찾아냈고 — 검증이 이번 수선 자체에서 만든 결함까지 포함해 — 라운드마다 고쳤습니다. "계약을 깨뜨려 확인할 때 틀리는 여섯 가지"를 문서로 남긴 것도 이 과정의 산물입니다.

그 위에서 기능 두 가지가 들어왔습니다. 도크 그룹 헤더를 스크롤 상단에 고정(sticky)하면서 sticky 가 자식 슬롯일 수 없는 이유와 emit 순서를 문서에 적었고, 하단 상태표시줄 자리를 dock_layout 에 내고(SB1-S1, 높이 0) 상태바가 사이드바 배경 strip 을 자를 수 있는 ABI 를 열었습니다(SB1-S2a·S2b). 아이콘 스택도 정리해 semantic 이름 registry 를 생성물로 만들고(IC1), 소비처를 codepoint 리터럴에서 이름으로 옮기고(IC2), 소비처 이름으로 등록하던 아이콘을 fit 축으로 흡수하고(IC3), 크기 값을 chrome 토큰으로 모았습니다(IC4). 여기서도 적대적 검증이 가드 구멍과 이름↔그림 사슬의 끊김을 라운드마다 찾아내 메웠고, 화면 배치 소유권 규칙(ML-GEO)을 문서로 세우면서 stale 서술을 함께 걷어냈습니다.

커밋

ohah/maru

PR (해당일 생성/머지)

repo#상태제목
ohah/maru#1911mergedfeat(chrome): 도크 그룹 헤더를 스크롤 상단에 고정한다
ohah/maru#1910mergedfeat(chrome): 하단 상태표시줄 높이를 세운다 (SB1-S2b)
ohah/maru#1909mergedfeat(chrome): 상태바가 사이드바 배경 strip을 자를 수 있게 ABI를 낸다 (SB1-S2a, 값 0)
ohah/maru#1908mergedtest(chrome): SV1 적대적 검증 — clip 상한 판정자와 문서 stale 다섯 곳
ohah/maru#1907mergedfeat(chrome): 하단 상태표시줄 자리를 dock_layout에 낸다 (SB1-S1, 높이 0)
ohah/maru#1906mergedrefactor(chrome): 측정 pass·drag·휠 잔여를 scroll_area가 소유하게 한다 (SV1c)
ohah/maru#1905mergedrefactor(chrome): 스크롤 발행과 clip을 tree.build가 소유하게 한다 (SV1b)
ohah/maru#1904mergedfix(chrome): 렌더 프레임 일관성 결함 여섯 개를 고친다 — 낡음·깜빡임·기하 스탬프·lock 계약
ohah/maru#1903mergedrefactor(chrome): 스크롤 좌표계를 도크 밖 공용 자리로 옮긴다 (SV1a)
ohah/maru#1902mergeddocs(chrome): 화면 배치 소유권 규칙(ML-GEO)을 적고 아이콘 스택의 stale 서술을 고친다
ohah/maru#1901mergedrefactor(icons): 아이콘 소비처를 codepoint 리터럴에서 이름으로 옮긴다 (IC2)
ohah/maru#1900mergedrefactor(icons): 아이콘 크기 값을 chrome 토큰으로 모으고 .m도 이름으로 고르게 한다 (IC4)
ohah/maru#1899mergedrefactor(icons): 소비처 이름으로 등록하던 아이콘을 Fit 축으로 흡수한다 (IC3)
ohah/maru#1898closedrefactor(icons): 아이콘 소비처를 codepoint 리터럴에서 이름으로 옮긴다 (IC2)
ohah/maru#1897mergedfeat(icons): 아이콘 semantic 이름 registry를 생성물로 만든다 (IC1)
ohah/maru#1896mergedtest(chrome): 스크롤바를 실제로 보는 골든 게이트를 세운다
ohah/maru#1895mergeddocs(chrome): ScrollView 스크롤 컨테이너 설계를 세운다