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
- docs(notifications): 종 col을 cols-12로 정합(코드와 불일치 수정)
- feat(notifications): 헤더 액션을 버튼으로(셀 fill 배경 + 호버 토큰, 빈 상태 비활성)
- feat(notifications): background pane·가로탭 알림 발화 + 발신 Term 점프
- docs(renderer): 좌표 회수 packer 보류 결정 + 재검토 조건 기록
- fix(renderer): code-review 후속 — grow 무한루프 가드 + UV 재정규화를 Zig로
- fix(notifications): 펼침 종을 cols-12로 옮겨 원형 배지를 ◧와 한 칸 떼기
- feat(notifications): 종 우상단 빨강 원형 알림 배지(렌더러 layer 4 신설)
- feat(notifications): 알림 패널 헤더 밴드·빈 상태 일러스트·폭 cap 리디자인
- fix(renderer): glyph atlas grow-on-full — ─가 ?로 깨지던 좌표 충돌 해소
- docs(grapheme): §11 B 불가에 맞춰 page-local 회수 보류로 정정·정합
- docs(terminal): §11 종료 — full B는 A2와 구조적 충돌로 불가, A1/A2/P4로 완성 정정
- docs(grapheme): preedit는 codepoint 단위(의도) — HG3/HG4 cluster 약속 정정
- docs(terminal): §11.10 full-B 설계(활성 grid 통합 PageList·다단계)
- fix(terminal): setScrollbackArena assert가 pool 페이지까지 검사 (§11 P4 리뷰 후속)
- refactor(terminal): 스크롤백 cell arena를 mmap page_allocator로 backing (§11 P4)
- fix(grapheme): 리뷰 후속 — dedup 해시 계약·색 회귀·emoji 클러스터 엣지 3건
- docs(terminal): §11.9 P4 설계(mmap backing for 스크롤백 page arena)
- fix(terminal): 빈(len-0) 스크롤백 행에서 단어/URL 선택 OOB 가드 (§11 A2 리뷰 후속)
- feat(terminal): emoji ZWJ 시퀀스(GB11) + emoji 클러스터 경로 통합
- refactor(terminal): 스크롤백 행 가변폭/trailing-trim — per-row-descriptor arena (§11 A2)
- docs(grapheme): grapheme의 page-local 귀속 결정·플랜 박기(§11.8) — 활성 grid 페이징 B에서
- docs(terminal): §11.7 A2 설계 정제 — arena 고정-크기·soft 행 비-trim (구현 전 발견)
- docs(terminal): §11 A2 설계(가변폭/trailing-trim) + setup-path OOM 누수 후속 등재
- fix(terminal): rewrap commit을 OOM-트랜잭션으로 — 옛 스크롤백 보존 (§11 A1 리뷰 후속)
- perf(terminal): grapheme_store dedup (link_ids 패턴) — 반복 cluster per-cell 증가 차단
- refactor(terminal): 스크롤백을 page 저장으로(per-row ring → page+pool) — §11 A1
- test(terminal): HG4 — NFD 한글 recorded-oracle fixture + 검증 매트릭스 갱신
- feat(terminal): HG3b — Cell.combining 제거(pure-B) + 단일-combining hack 3곳 제거
- docs(terminal): §11 page-aligned storage 설계·결정(C: 측정→A→게이트 B)
- fix(terminal): RIS(ESC c)가 DECSC 저장 슬롯도 공장 초기화
- feat(renderer): HG3a — CoreText 셰이퍼에 grapheme cluster 전체 전달(NFD 한글 합성)
- refactor(terminal): B4~B5 /code-review max 후속 cleanup — resize 헬퍼·activeSavedCursor 인라인 (분할 B6)
- fix(terminal): NFD cluster 흡수를 conjoining 자모(U+1100~U+11FF)로 한정
- refactor(terminal): DECSC 저장 슬롯을 화면에 귀속(per-screen saved_cursor) (core.zig 분할 B5 — Option 3)
- refactor(terminal): 커서를 화면에 귀속(per-screen cursor)·alt 통째 swap (core.zig 분할 B4 — Option 3)
- feat(terminal): HG2b — 다중 combining·키캡을 grapheme_store에 무손실 누적
- docs(grapheme): HG2b를 순수 Zig 저장 이전으로 좁히고 ABI·hack 제거를 HG3로 이관
- feat(terminal): HG2a 무손실 직렬화 — selection 복사·observability snapshot
- feat(terminal): HG2a 셀 다중 코드포인트 저장 + NFD 한글 cluster producer
- docs(grapheme): HG2a를 append-only 무손실 저장으로 정정, id 회수는 refcount 후속 분리
- refactor(terminal): B-min /code-review max 후속 cleanup (B1~B3 리뷰)
- refactor(terminal): alt 화면을 saved_screen struct swap으로 — B-min 완결 (방향 B-min B3)
- refactor(terminal): 활성 스크롤백 sb를 Screen에 fold (방향 B-min B2)
- feat(terminal): HG1 — 한글 grapheme cluster 분절 순수 함수(UAX#29 GB6/7/8/9)
- refactor(terminal): Screen struct 신설 + 활성 grid fold (방향 B-min B1)
- fix(build): .app 자체 공증·staple로 타 맥 '손상' 방지 + dmg 마운트 detach 가드
- refactor(terminal): input_report.zig /code-review max 후속 — reportMouse doc dedup (R1 리뷰)
- refactor(terminal): 입력/이벤트 host 인코딩을 input_report.zig로 (R1)
- docs(grapheme): 설계를 B 저장 방식·기존 combining 통합·입력 경로 일관성으로 최신화
- docs(grapheme): 한글 NFD conjoining 자모 grapheme cluster 렌더링 정공법 설계 문서 신설
- refactor(terminal): kitty.zig 분리 /code-review max 후속 cleanup (K1~K3 리뷰)
- refactor(terminal): kitty orchestrator를 kitty.zig로 — kitty 분리 완결 (K3)
- refactor(terminal): kitty storage/evict mid를 kitty.zig로 (kitty 분리 K2)
- refactor(terminal): kitty.zig 신설 + graphics struct 4개 + leaf 8개 이동 (kitty 분리 K1)
- refactor(terminal): selection.zig 분리 /code-review max 후속 cleanup (S1~S5 리뷰)
- refactor(terminal): 검색·추출·preedit를 selection.zig로 — selection 분리 완결 (S5)
- refactor(terminal): URL 감지(urlAnchorAt·urlSpanAtAbs·extractUrlAt·wordIsUrl)를 selection.zig로 (selection 분리 S4)
- fix(notifications): caret를 단일 surface_bg 삼각형으로 + 접힘 헤더 종↔◧ 순서 고정
- fix(renderer): rich quad sRGB 역감마 지수 3.0→2.4 (모달/quad 색이 테마 토큰대로 렌더)
- refactor(terminal): word-bounds + 포인터 선택을 selection.zig로 (selection 분리 S3)
- refactor(terminal): selection.zig 신설 + 선택/검색/URL 순수 leaf 12개 이동 (selection 분리 S2)
- refactor(terminal): 스크롤백 절대행 accessor(absRow·absRowWrapped)를 screen.zig로 (selection 분리 S1 — 11b/N)
- docs(terminal): 분해 doc·모듈 헤더를 실제 코드·완결 상태와 정합(SSOT 점검 후속)
- docs(terminal): 배치3 /code-review max 후속 — parser/core 주석·분해 완결 doc 정합성 (분할 19~21/N 리뷰)
- refactor(terminal): write 상태기계(feed) + escape/UTF-8을 parser.zig로 (core.zig 분할 21/N — 분해 완결)
- refactor(terminal): CSI 상태기계(handleCsiByte·dispatchCsi)를 parser.zig로 (core.zig 분할 20/N)
- refactor(terminal): SGR + 모드 dispatch를 parser.zig로 (core.zig 분할 19/N — Phase D 시작)
- refactor(terminal): 배치2 /code-review max 후속 — pub 최소화·stale 주석·분해 현황표 (분할 12~18/N 리뷰)
- refactor(terminal): snapshot/viewport 합성을 screen.zig로 (core.zig 분할 18/N — Phase C 완료)
- refactor(terminal): resize/reflow를 screen.zig로 (core.zig 분할 17/N)
- refactor(terminal): print 핫패스(writeCodepoint·putCell)를 screen.zig로 (core.zig 분할 16/N)
- refactor(terminal): alt screen + 커서 저장/복원을 screen.zig로 (core.zig 분할 15/N)
- refactor(terminal): scroll/feed(LF·SU/SD·IL/DL·DECSTBM·DECALN)를 screen.zig로 (core.zig 분할 14/N)
- refactor(terminal): erase/insert/delete를 screen.zig로 (core.zig 분할 13/N)
- refactor(terminal): 커서 이동/위치를 screen.zig로 (core.zig 분할 12/N — Phase C 시작)
- feat(sidebar): 접힘에도 알림 종 유지 + 최소 폭에 종/배지 포함
- docs(terminal): 배치1 /code-review max 후속 — parser.zig 모듈 doc·분해 현황표 정합성 (분할 5~11/N 리뷰)
- refactor(terminal): 스크롤백 저장·재-wrap을 screen.zig로 (core.zig 분할 11/N — Phase B 완료)
ohah/zntc
- fix(cache): #4438 디스크 캐시 견고성 후속 — LOW 4건 + 버전별 GC
- fix(cache): #4438 디스크 캐시 ON==OFF 감사 후속 3건 (진단 누락 / .d.ts 키 / import.meta)
- ci: PR 에선 무거운 매트릭스 축소, push(main)는 풀 매트릭스 (PR-B)
- ci: integration 잡별 path 필터 + draft PR skip (PR-A)
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.