2026-07-28
요약 (AI 작성)
FP16 — 파일 패널을 워크스페이스 Term 으로 통합하고 도크를 탐색기 전용으로 줄이는 대공사 — 를 하루에 끝낸 날입니다. Term 에 파일 entry 소유 슬롯을 만드는 것에서 시작해 entry 창구와 생성 경로, 복원 파이프라인, entry 제거를 차례로 Term 쪽으로 옮기고, 그 반대편에서 도크 editor chrome·기하·드래그 기계와 DockGroup/DockTree, FocusOwner.dock_surface 축, 옛 도크 포맷 읽기 경로를 단계적으로 삭제했습니다. B-4 로 파일 탭을 pane 의 file-term 필드에 영속시키고 FP16d 헤더 밴드를 파일 Term 으로 이관했으며, 창 간 이동에는 경로 유일성 admission 을 넣고 중복 정책을 문서에 적었습니다. 마이그레이션 중간중간 나온 문제 — half-migrated 조회, 파일 탭을 닫을 때 focus 재발급, Esc 복원, 워크스페이스 캡처의 파일 탭 저장, 일괄 삭제의 이중 통지, 활성 브라우저가 마지막 탭일 때 파일 탭이 사라지던 것 — 를 계속 잡았고, /code-review max 를 2차부터 6차까지 돌려 회귀·데이터 유실·누수·크래시를 포함해 매 회 15건 안팎씩 반영했습니다.
chrome 렌더링에는 grapheme cluster 모델을 도입했습니다(CG1). 텍스트 셀 배치를 OS-중립 text_layout 으로 추출하고 chrome 셀 텍스트도 cluster 단위로 그리도록 바꿔, 파일 트리·카드 제목의 NFD 한글이 자모로 흩어져 보이던 것을 완성형으로 합쳐 그립니다. cluster 규율은 경계 가드와 rename 편집 텍스트 렌더 테스트로 고정했고, /code-review max 결함 14건도 함께 반영했습니다.
파일 뷰어와 브라우저도 쓸 만해졌습니다. FP14b 로 이미지를 격리 loadFileURL 로 옮겨 복사를 없애고, 팬/줌을 WebKit 에 맡긴 뒤 주입은 체커 배경만 남겼으며, 트랙패드 핀치 줌을 붙이고 스크롤이 팬 대신 줌으로 걸리던 것과 드래그를 끝낼 때 확대/축소되던 것을 고쳤습니다. FP15 로 동영상·오디오를 파일 탭에서 재생하고, 탐색기가 활성 터미널 cwd 를 따라 펼쳐지도록 했으며(ET-CWD), 브라우저 탭의 URL 을 영속·복원하도록 했습니다(WP-P). session-host 는 외부 채택(adoption) 경로를 마무리해 source schema 봉인과 alias proof·transcript 규약 고정, plan 합성과 metadata winner materialize, typed destination 과 콜백 없는 소유권 이동, paired ownership transfer, combined commit 소유권 확정까지 이었고, allocator 재진입 ownership 창을 닫았습니다.
커밋
ohah/maru
- feat(session-host): complete adopted combined commit
- docs(file-panel): FP16e 표에서 Side를 보존으로, max_groups를 삭제로 옮깁니다
- refactor(workspace): 옛 도크 포맷 읽기 경로를 제거합니다
- docs(file-panel): 진행 상태 표기를 코드·손 테스트 결과와 맞춥니다
- feat(file-panel): 이미지 팬/줌을 WebKit에 맡기고 주입은 체커 배경만 남깁니다
- fix(file-panel): 드래그를 끝낼 때 이미지가 확대/축소되던 것을 고칩니다
- fix(file-panel): 이미지 스크롤이 팬 대신 줌으로 걸리던 것을 고칩니다
- fix(file-panel): 이미지 뷰어에 트랙패드 핀치 줌을 붙입니다
- feat(file-panel): FP14b — 이미지를 격리 loadFileURL로 옮기고 복사를 없앱니다
- docs(session-host): bind combined commit ownership
- feat(session-host): add typed adoption destinations
- feat(file-panel): FP15 media — 동영상·오디오를 파일 탭에서 재생합니다
- refactor: 도크 탭 잔재 타입과 안 쓰는 draw layer를 제거합니다
- docs(session-host): split adoption commit gates
- feat(session-host): add no-callback adoption take
- refactor: 호출자 없는 헬퍼 10개를 제거합니다
- docs(layering): tailWindow 통합 순서를 §7.9에 박고 데드코드 둘을 지웁니다
- refactor(chrome): 텍스트 셀 배치를 OS-중립 text_layout으로 추출합니다
- feat(session-host): compose external adoption plan
- fix(web-panel): URL 있는 브라우저만 있는 pane에 셸 탭이 끼는 것을 고칩니다
- feat(session-host): materialize adopted metadata winner
- test(chrome): rename 편집 텍스트의 cluster 렌더를 고정합니다
- feat(file-panel): 탐색기가 활성 터미널 cwd를 따라 펼칩니다 (ET-CWD)
- feat(web-panel): 브라우저 탭의 URL을 영속·복원합니다 (WP-P)
- feat(session-host): decide external source outcome
- fix(file-panel): 활성 브라우저가 마지막 탭일 때 파일 탭이 사라지는 것을 고칩니다
- feat(session-host): fold external client source
- docs(file-panel): FP16 상태 표기를 코드 실측에 맞춥니다
- test(session-host): avoid stream boundary assumption
- feat(session-host): seal external Client source schema
- docs(chrome): 가드 재작성에 맞춰 §3.1b를 동기화합니다
- fix(chrome): code-review max 결함 14건을 고칩니다
- feat(session-host): source alias proof를 고정합니다
- feat(session-host): source transcript 규약을 고정합니다
- refactor(session-host): source preflight 경계를 분리합니다
- feat(session-host): inherited event reducer 계약을 닫습니다
- test(chrome): chrome 텍스트 cluster 규율을 경계 가드로 강제합니다
- fix(session-host): allocator 재진입 ownership 창을 닫습니다
- feat(chrome): chrome 셀 텍스트도 grapheme cluster 모델로 그립니다 (CG1)
- fix(chrome): 파일 트리·카드 제목의 NFD 한글을 완성형으로 합쳐 그립니다
- test(session-host): resolver 픽스처를 pid 재사용에서 격리합니다
- feat(session-host): paired ownership transfer를 구현합니다
- refactor(sidebar): 카드 span 기하를 chrome 함수 하나로 모읍니다
- fix(sidebar): 밴드 기하를 클릭 판정 행에 맞춥니다
- refactor(file-panel): B-4 잔여 — 죽은 tree_size를 제거합니다
- fix(file-panel): 5차 code-review max의 결함 15건을 고칩니다 (크래시 2건 포함)
- feat(file-panel): B-4 — 파일 탭을 pane의 file-term 필드로 영속합니다
- refactor(file-panel): B-3(2/2) — DockGroup/DockTree를 삭제합니다
- fix(file-panel): 편집기 폰트 크기 단위를 pt에서 px로 바로잡습니다
- test(file-panel): 실 세션 하네스 테스트에 macOS 가드를 답니다
- feat(file-panel): 탐색기 도크 기본 폭을 사이드바 기준으로 줄입니다
- fix(file-panel): 6차 code-review max의 결함 15건을 고칩니다
- docs(file-panel): FP16 슬라이스 상태표를 실제 진행에 맞춥니다
- fix(file-panel): dock_surface 제거 후속 — barrier 가시성과 테스트 전제를 맞춥니다
- refactor(file-panel): FocusOwner.dock_surface 축을 제거합니다
- refactor(file-panel): B-3(1/2) — 도크 드래그 기계를 삭제합니다
- docs(file-panel): 창 간 이동의 중복 정책을 §3.3에 적습니다
- fix(file-panel): 워크스페이스 창 간 이동에 경로 유일성 admission을 넣습니다
- fix(file-panel): 4차 code-review max의 결함 15건을 고칩니다
- refactor(file-panel): 도크 기하를 탐색기 전용으로 줄입니다
- feat(file-panel): FP16d — 헤더 밴드를 파일 Term으로 이관합니다
- build(file-panel): ABI 테스트가 쓰는 focusTerm을 공개합니다
- test(file-panel): 남은 테스트를 파일 Term 현실에 맞춰 green으로 만듭니다
- fix(file-panel): kind가 바뀌는 rename이 파일 Term의 뷰를 다시 만듭니다
- fix(file-panel): Esc 복원이 같은 워크스페이스 안에서 파일 탭을 되돌립니다
- test(file-panel): [미완] 사라진 editor-leaf 클릭 시나리오를 실제 주제로 바꿉니다
- fix(file-panel): 파일 일괄 삭제가 surface를 두 번 통지하지 않게 합니다
- fix(file-panel): 복원된 활성 파일에 publish 대기 barrier를 겁니다
- test(file-panel): [미완] 도크 그룹 전제를 쓰던 테스트를 pane 탭으로 옮깁니다
- fix(file-panel): 워크스페이스 캡처가 파일 탭을 다시 저장합니다
- test(file-panel): [미완] FP3 도크 테스트를 탐색기 전용 현실에 맞춥니다
- fix(file-panel): [미완] 병합 focus 재발급과 빈 탐색기 권위 채택을 바로잡습니다
- fix(file-panel): [미완] 창 병합의 중복 정책과 focus token 재발급을 되돌립니다
- fix(file-panel): [미완] 파일 탭을 닫으면 승계된 파일로 focus를 다시 발급합니다
- fix(file-panel): [미완] 파일 열기가 탐색기를 다시 표시하게 합니다
- fix(file-panel): [미완] 3차 code-review max의 결함 15건을 고칩니다
- refactor(file-panel): [미완] 죽은 도크 드래그 기계와 남은 그룹 순회를 제거합니다
- refactor(file-panel): [미완] 창 병합의 entry 이관을 삭제합니다
- fix(file-panel): [미완] half-migrated 조회를 Term 창구로 마저 옮깁니다
- fix(file-panel): [미완] 2차 code-review max의 회귀 3종과 half-migrated 조회를 고칩니다
- refactor(file-panel): [미완] 도크 editor 기하 소비를 제품 코드에서 0으로 만듭니다
- refactor(file-panel): [미완] 도크 editor chrome을 제거해 탐색기 전용으로 만듭니다
- fix(file-panel): [미완] dock 조회 소비처를 Term 창구로 마저 옮깁니다
- fix(file-panel): [미완] code-review max의 데이터 유실 3종과 누수 2종을 고칩니다
- refactor(file-panel): [미완] isBrowserTerm에 파일 entry 제외 조건을 넣습니다
- refactor(file-panel): [미완] 파일 entry 제거를 Term close로 전환합니다
- refactor(file-panel): [미완] 복원 파이프라인을 entry 목록 기반으로 배선합니다
- refactor(file-panel): [미완] 복원 파이프라인의 집합/배치 분리 헬퍼를 추가합니다
- refactor(file-panel): [미완] 파일 entry 창구와 생성 경로를 Term으로 옮깁니다
- feat(file-panel): Term에 파일 entry 소유 슬롯을 만듭니다