2026-06-23

요약 (AI 작성)

maru의 유니코드 텍스트 처리(grapheme cluster)를 근본적으로 넣은 날입니다(69커밋). UAX#29 기반 한글 grapheme 분절 순수 함수(HG1)에서 출발해, 셀 다중 코드포인트 저장과 NFD 한글 cluster producer·무손실 직렬화(HG2), CoreText 셰이퍼에 cluster 전체 전달(HG3a)과 Cell.combining 제거(HG3b)로 이어졌고, emoji ZWJ 시퀀스(GB11)·키캡을 클러스터 경로로 통합했습니다. grapheme_store dedup(link_ids 패턴)으로 반복 cluster의 per-cell 증가도 차단했습니다. 이 밖에 사이드바가 접혀도 알림 종·배지를 최소 폭에 유지하도록 다듬었습니다.

커밋

ohah/maru

ohah/zntc

PR (해당일 생성/머지)

repo#상태제목
ohah/maru#1014mergedfix(settings): 세팅 GUI 토글이 런타임 폰트 줌(⌘+/−)을 리셋하던 문제
ohah/maru#1013mergeddocs(notifications): 종 col을 cols-12로 정합(코드와 불일치 수정)
ohah/maru#1012mergedfeat(notifications): background pane·가로탭 알림 발화 + 발신 Term 점프
ohah/maru#1011mergedfeat(notifications): 헤더 액션을 버튼으로(셀 fill 배경 + 빈 상태 비활성)
ohah/maru#1010mergeddocs(renderer): 좌표 회수 packer 보류 결정 + 재검토 조건 기록
ohah/maru#1009mergedfix(renderer): code-review 후속 — grow 무한루프 가드 + UV 재정규화를 Zig로
ohah/maru#1008mergedfeat(notifications): 알림 패널 리디자인 + 종 우상단 원형 배지
ohah/maru#1007mergedfix(renderer): glyph atlas grow-on-full — ─가 ?로 깨지던 좌표 충돌 해소
ohah/maru#1006mergeddocs(grapheme): §11 B 불가에 맞춰 page-local 회수 보류로 정정·정합
ohah/maru#1005mergeddocs(terminal): §11 종료 — full B는 A2와 구조적 충돌로 불가, A1/A2/P4로 완성 정정
ohah/maru#1004mergeddocs(grapheme): preedit는 codepoint 단위(의도) — HG3/HG4 cluster 약속 정정
ohah/maru#1003mergeddocs(terminal): §11.10 full-B 설계(활성 grid 통합 PageList·다단계)
ohah/maru#1002mergedfix(terminal): setScrollbackArena assert가 pool 페이지까지 검사 (§11 P4 리뷰 후속)
ohah/maru#1001mergedrefactor(terminal): 스크롤백 cell arena를 mmap page_allocator로 backing (§11 P4)
ohah/maru#1000mergeddocs(terminal): §11.9 P4 설계(mmap backing for 스크롤백 page arena)
ohah/maru#999mergedfix(grapheme): 리뷰 후속 — dedup 해시 계약·색 회귀·emoji 클러스터 엣지 3건
ohah/maru#998mergedfix(terminal): 빈(len-0) 스크롤백 행에서 단어/URL 선택 OOB 가드 (§11 A2 리뷰 후속)
ohah/maru#997mergedfeat(terminal): emoji ZWJ 시퀀스(GB11) + emoji 클러스터 경로 통합
ohah/maru#996mergedrefactor(terminal): 스크롤백 행 가변폭/trailing-trim — per-row-descriptor arena (§11 A2)
ohah/maru#995mergeddocs(grapheme): grapheme의 page-local 귀속 결정·플랜(§11.8) — 활성 grid 페이징 B에서
ohah/maru#994mergeddocs(terminal): §11.7 A2 설계 정제 — arena 고정-크기·soft 행 비-trim
ohah/maru#993mergeddocs(terminal): §11 A2 설계(가변폭/trailing-trim) + setup-path OOM 누수 후속
ohah/maru#992mergedfix(terminal): rewrap commit을 OOM-트랜잭션으로 — 옛 스크롤백 보존 (§11 A1 리뷰 후속)
ohah/maru#991mergedperf(terminal): grapheme_store dedup(link 패턴) — 반복 cluster per-cell 증가 차단
ohah/maru#990mergedrefactor(terminal): 스크롤백을 page 저장으로(per-row ring → page+pool) — §11 A1
ohah/maru#989mergedtest(terminal): HG4 — NFD 한글 recorded-oracle fixture + 검증 매트릭스 갱신
ohah/maru#988mergedfeat(terminal): HG3b — Cell.combining 제거(pure-B) + 단일-combining hack 제거
ohah/maru#987mergeddocs(terminal): §11 page-aligned storage 설계·결정(C: 측정→A→게이트 B)
ohah/maru#986mergedfix(terminal): RIS(ESC c)가 DECSC 저장 슬롯도 공장 초기화
ohah/maru#985mergedfeat(renderer): HG3a — CoreText 셰이퍼에 grapheme cluster 전체 전달(NFD 한글 합성)
ohah/maru#984mergedrefactor(terminal): B4~B5 /code-review max 후속 cleanup — resize 헬퍼·activeSavedCursor 인라인 (분할 B6)
ohah/maru#983mergedfix(terminal): NFD cluster 흡수를 conjoining 자모로 한정(ZWJ scope, review #2)
ohah/maru#982mergedrefactor(terminal): DECSC 저장 슬롯을 화면에 귀속(per-screen saved_cursor) (core.zig 분할 B5 — Option 3)
ohah/maru#981mergedrefactor(terminal): 커서를 화면에 귀속(per-screen cursor)·alt 통째 swap (core.zig 분할 B4 — Option 3)
ohah/maru#980mergedfeat(terminal): HG2b — 다중 combining·키캡 무손실 저장(grapheme_store 누적)
ohah/maru#979mergedfeat(terminal): HG2a — 셀 다중 코드포인트 저장(NFD 한글 cluster, 무손실)
ohah/maru#978mergedrefactor(terminal): B-min /code-review max 후속 cleanup (B1~B3 리뷰)
ohah/maru#977mergedrefactor(terminal): alt 화면을 saved_screen struct swap으로 — B-min 완결 (방향 B-min B3)
ohah/maru#976mergedrefactor(terminal): 활성 스크롤백 sb를 Screen에 fold (방향 B-min B2)
ohah/maru#975mergedrefactor(terminal): Screen struct 신설 + 활성 grid fold (방향 B-min B1)
ohah/maru#974mergedfix(build): .app 공증·staple로 타 맥 '손상' 방지 + dmg detach 가드
ohah/maru#973mergedrefactor(terminal): input_report.zig /code-review max 후속 — reportMouse doc dedup (R1 리뷰)
ohah/maru#972mergedfeat(terminal): HG1 — 한글 grapheme cluster 분절 순수 함수(UAX#29 GB6/7/8/9)
ohah/maru#971mergedrefactor(terminal): 입력/이벤트 host 인코딩을 input_report.zig로 (R1)
ohah/maru#970mergedrefactor(terminal): kitty.zig 분리 /code-review max 후속 cleanup (K1~K3 리뷰)
ohah/zntc#4465mergedfix(cache): #4438 디스크 캐시 견고성 후속 — LOW 4건 + 버전별 GC
ohah/maru#969mergeddocs(grapheme): 한글 NFD conjoining 자모 grapheme cluster 렌더링 정공법 설계 문서
ohah/maru#968mergedrefactor(terminal): kitty orchestrator를 kitty.zig로 — kitty 분리 완결 (K3)
ohah/maru#967mergedrefactor(terminal): kitty storage/evict mid를 kitty.zig로 (kitty 분리 K2)
ohah/maru#966mergedrefactor(terminal): kitty.zig 신설 + graphics struct·leaf 이동 (kitty 분리 K1)
ohah/maru#965mergedrefactor(terminal): selection.zig 분리 /code-review max 후속 cleanup (S1~S5 리뷰)
ohah/maru#964mergedrefactor(terminal): 검색·추출·preedit를 selection.zig로 — selection 분리 완결 (S5)
ohah/maru#963mergedrefactor(terminal): URL 감지를 selection.zig로 (selection 분리 S4)
ohah/maru#962mergedfix(notifications): caret 채움=패널 일치(rich quad 감마 2.4) + 접힘 헤더 종→◧ 순서 고정
ohah/maru#961mergedrefactor(terminal): word-bounds + 포인터 선택을 selection.zig로 (selection 분리 S3)
ohah/zntc#4464mergedfix(cache): #4438 디스크 캐시 ON==OFF 감사 후속 3건 (진단 누락 / .d.ts 키 / import.meta)
ohah/maru#960mergedrefactor(terminal): selection.zig 신설 + 선택/검색/URL 순수 leaf 12개 이동 (selection 분리 S2)
ohah/maru#959mergedrefactor(terminal): 스크롤백 절대행 accessor를 screen.zig로 (selection 분리 S1 — 11b/N)
ohah/maru#958mergeddocs(terminal): 분해 doc·모듈 헤더를 실제 코드·완결 상태와 정합 (SSOT 점검 후속)
ohah/maru#957mergeddocs(terminal): 배치3 /code-review max 후속 — parser·core 주석·분해 완결 doc 정합성 (분할 19~21/N 리뷰)
ohah/maru#956mergedrefactor(terminal): write 상태기계(feed) + escape/UTF-8을 parser.zig로 (core.zig 분할 21/N — 분해 완결)
ohah/zntc#4463mergedci: PR 에선 무거운 매트릭스 축소, push(main)는 풀 매트릭스 (PR-B)
ohah/maru#955mergedrefactor(terminal): CSI 상태기계(handleCsiByte·dispatchCsi)를 parser.zig로 (core.zig 분할 20/N)
ohah/maru#954mergedrefactor(terminal): SGR + 모드 dispatch를 parser.zig로 (core.zig 분할 19/N — Phase D 시작)
ohah/maru#953mergedrefactor(terminal): 배치2 /code-review max 후속 — pub 최소화·stale 주석·분해 현황표
ohah/maru#952mergedrefactor(terminal): snapshot/viewport 합성을 screen.zig로 (core.zig 분할 18/N — Phase C 완료)
ohah/maru#951mergedrefactor(terminal): resize/reflow를 screen.zig로 (core.zig 분할 17/N)
ohah/maru#950mergedrefactor(terminal): print 핫패스(writeCodepoint·putCell)를 screen.zig로 (core.zig 분할 16/N)
ohah/maru#949mergedrefactor(terminal): alt screen + 커서 저장/복원을 screen.zig로 (core.zig 분할 15/N)
ohah/maru#948mergedrefactor(terminal): scroll/feed(LF·SU/SD·IL/DL·DECSTBM)를 screen.zig로 (core.zig 분할 14/N)
ohah/maru#947mergedrefactor(terminal): erase/insert/delete를 screen.zig로 (core.zig 분할 13/N)
ohah/maru#946mergedrefactor(terminal): 커서 이동/위치를 screen.zig로 (core.zig 분할 12/N — Phase C 시작)
ohah/zntc#4462mergedci: integration 잡별 path 필터 + draft PR skip (PR-A)
ohah/maru#945mergedfeat(sidebar): 접힘에도 알림 종 유지 + 최소 폭에 종/배지 포함
ohah/maru#944mergeddocs(terminal): 배치1 /code-review max 후속 — parser 모듈 doc·분해 현황표 정합성
ohah/maru#943mergedrefactor(terminal): 스크롤백 저장·재-wrap을 screen.zig로 (core.zig 분할 11/N — Phase B 완료)