f105bab(칸 어긋남 고침) 뒤부터 스크롤을 내리면 응답 없음(AppHang)으로 닫혔다.
같은 재료로 BASE 칸을 휠로 끝까지 내려 재현했고, 임시 기록으로 원인 넷을 찾았다
(기록 코드는 뺐다).
1. 사람이 BASE 를 굴려도 BASE 맞추기가 LOCAL 기준으로 되돌렸다 - 굴린 만큼(48px)을
끌어당기고 보정값이 오르내려 초당 32번 밀고 당겼다. 손이 닿은 칸(휠 · 누름 · 키)을
기준(_scrollDriver)으로 삼고 LOCAL 쪽일 때만 BASE 를 맞춘다. 스크롤 이벤트로 정하면
글자 크기를 바꿀 때 목록이 저절로 내는 스크롤까지 BASE 로 읽었다. 확대 · 다음 차이 ·
줄 이동은 LOCAL 기준.
2. 따라 굴러가는 도중에 재서 휠 한 칸(48px)씩 보정값이 6,619px 까지 쌓였다. 메아리
막기 중이면 큰 맞추기는 앱이 한가할 때(ApplicationIdle) 한 번 하고, 못 굴리는
끝에서는 실제로 움직인 만큼만 보정한다.
3. 칸 목록(그 칸에 있는 줄만 거른 PaneView)의 항목 번호를 정렬 행 번호로 써서
한쪽에만 있는 줄만큼 엉뚱한 줄끼리 견줬다(10줄 -> 157px, 마지막 차이에서 칸이
228px 밀림). 줄 객체로 오간다(RowOf · ContainerOfRow).
4. 빠르게 굴리면 사람의 스크롤까지 메아리로 버려져 따라가는 칸이 멈췄다(BASE 784 ·
LOCAL 555). 버려지면 표시만 남기고 멈춘 뒤 한 번 따라잡는다. BASE 를 굴릴 때는
보정값을 보이는 줄에서 다시 잰다(MeasureBias).
시험: 빌드 경고 0 · 오류 0. 화면 g20-scroll-end(새, 보통 · 빠르게) 모든 단계 응답 ·
BASE · LOCAL 가운데 줄 한 줄 안, g21-blocks-fast(새, 한쪽에만 있는 묶음이 많은 재료)
응답 · 따라옴(가운데가 묶음에 걸리면 10줄 남짓 벗어날 때 있음), g7-verify(Alt+↓)
실패 0, g17(엔터 · 확대 · 내리기) 통과. 사용자 파일로는 확인하지 않았다. 기존 회귀는
사용자 지시로 돌리지 않았다.
Agent: main (claude-opus-5-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>