2026-06-23

날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.

요약 (AI 작성)

maru는 core.zig 분해를 마무리했습니다. 스크롤백 저장과 재배치(#943)로 screen 쪽 이전을 끝낸 뒤 커서 이동, erase·insert·delete, scroll과 줄 이동, alt screen과 커서 저장, 출력 핫패스, resize·reflow, snapshot 합성을 screen.zig로, SGR·모드 dispatch와 CSI 상태 기계, write 상태 기계를 parser.zig로 옮겨 분해를 완결했고(#956), 이어 선택·검색·URL 감지를 selection.zig(#964), kitty graphics를 kitty.zig(#968), 입력 이벤트 인코딩을 input_report.zig(#971)로 분리했습니다. Screen 구조체를 만들어 활성 grid와 스크롤백, 커서, DECSC 슬롯을 화면에 귀속시키고 alt screen을 구조체 swap으로 바꿨으며(#977), RIS가 저장 슬롯도 초기화하게 했습니다. 단계마다 코드 리뷰 후속 정리가 함께 들어왔습니다.

같은 날 한글 NFD 자모 grapheme cluster 렌더링을 설계 문서와 함께 구현했습니다. UAX#29 규칙으로 한글 cluster를 나누는 순수 함수(HG1, #972)와 셀 하나에 여러 코드포인트를 무손실로 저장하는 grapheme_store, 다중 combining·키캡 누적을 넣은 뒤 CoreText 셰이퍼에 cluster 전체를 넘기고(#985) 기존 Cell.combining과 단일 combining 우회 코드를 없앴으며(#988), recorded oracle fixture(#989)와 저장소 중복 제거, emoji ZWJ 시퀀스 통합(#997)으로 이어졌습니다. 스크롤백은 행별 ring에서 page와 pool 저장(#990), 가변 폭과 끝 공백 잘라 내기, mmap page_allocator backing(#1001)으로 바꿨고, 활성 grid까지 합치는 full B 방식은 구조적 충돌로 불가하다고 결론을 문서에 남겼습니다(#1005).

이 밖에 다른 맥에서 '손상'으로 뜨지 않도록 .app 자체를 공증·staple하고(#974), rich quad 역감마 지수를 2.4로 바로잡았으며, atlas가 가득 차면 키우도록 해 ─ 문자가 ?로 깨지던 문제를 고쳤습니다(#1007). 알림은 접힘 상태에서도 종을 유지하고 빨간 원형 배지와 패널 헤더·빈 상태 디자인을 더했으며, 백그라운드 pane과 가로 탭에서도 알림을 보내고 발신 Term으로 이동하게 했습니다(#1012). 세팅 토글이 런타임 폰트 줌을 초기화하던 문제의 #1014는 이날 PR이 열렸습니다.

zntc는 integration 잡별 path 필터와 draft PR 건너뛰기(#4462), PR에서는 매트릭스를 줄이고 main push에서만 전체를 돌리는 방식(#4463)으로 CI를 가볍게 했고, 디스크 캐시 감사 후속으로 진단 누락·.d.ts 키·import.meta 문제와 견고성 항목, 버전별 GC를 처리했습니다(#4464, #4465).

공개 커밋 82개, 해당일 생성 또는 병합된 PR 76개를 정리했습니다. PR 생성 76개·병합 75개는 같은 PR이 양쪽에 포함될 수 있습니다.

커밋

ohah/maru

ohah/zntc

PR (해당일 생성/머지)

상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.

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