2026-06-05

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

요약 (AI 작성)

maru는 PTY와 앱 런타임 흐름을 이어 붙였습니다. 종료 상태를 보존하고 HUP→TERM→KILL 순서로 닫는 정책(#43), surface 런타임 라우팅(#45)과 그 리뷰 후속, PTY reader 큐(#48), 런타임 이벤트 펌프(#50), 제한된 큐로 대량 stdout을 흘리는 스트레스 테스트(#52)가 들어왔습니다. reader 정지 생명주기는 self-pipe wake와 kqueue NOTE_EXIT로 닫기 경로의 절충을 없앤 형태로 병합됐고(#53), 펌프가 종료 데이터를 반환하도록 정리한 뒤(#55) 헤드리스 PTY 데모를 붙였습니다(#56). 밤부터는 렌더러 계약으로 DrawList(#57), 가짜 glyph 레이아웃(#58), glyph atlas 캐시(#59), 커서 overlay dirty(#60)가 차례로 들어왔고, 앱 호스트 frame smoke(#61)와 macOS 창 smoke(#62)까지 병합됐습니다. macOS Metal smoke #63은 이날 PR이 열렸습니다.

suji는 EventBus off()가 진행 중인 emit을 기다리게 해 UAF를 정리한 뒤(#69) CPython 3.13을 프로세스 안에 임베드하는 Python 백엔드를 추가했습니다(#70). Python이 없는 머신에서도 돌도록 .app·CLI 번들과 PYTHONHOME 해석을 갖추고(#71), 타입 stub 패키지 suji-stubs의 PyPI 발행 잡(#72)을 넣었으며, iOS 시뮬레이터(#73)와 Android 에뮬레이터(#74)에서도 e2e를 통과시켰습니다. 모바일 Python 백엔드는 호스트 하니스에 넣어 CI에서 돌게 했고(#76), app.icon으로 macOS 앱 아이콘을 지정하는 기능도 들어왔습니다.

zntc는 dev HMR 위상 보존 경로의 링크 비용을 줄였습니다. 결정적인 plugin만 허용하도록 게이트를 완화해 RN preset이 보존 경로를 쓰게 하고(#4170), reuse-hit에서 심볼 참조 수 계산과 변경 없는 모듈의 source 해시를 건너뛰었으며(#4171, #4172), renameReuseGuard를 변경 모듈로 한정했습니다(#4173, #4181). 링크 하위 단계 분해 bench와 계측(#4177), Persistent Linker RFC 초안을 바탕으로 injectPreservedRenames 문자열 borrow(#4179)와 불필요한 쓰기 제거(#4182), namespace 접근 분석의 부분 생략(#4184)이 이어졌습니다. 같은 namespace를 여러 모듈이 쓸 때 병렬 emit에서 나던 double-free(#4183), main의 포맷 체크 실패(#4180), new-css-import 테스트 flake(#4185)도 고쳤습니다.

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

커밋

ohah/maru

ohah/suji

ohah/zntc

PR (해당일 생성/머지)

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

저장소PR해당일 활동상태대상 브랜치제목
ohah/maru#63생성mergedmainfeat(platform): add macOS Metal smoke
ohah/maru#62생성 · 병합mergedmainfeat(platform): add macOS window smoke
ohah/maru#61생성 · 병합mergedmainfeat(app): add app host frame smoke
ohah/maru#60생성 · 병합mergedmainfeat(renderer): add cursor overlay dirty contract
ohah/maru#59생성 · 병합mergedmainfeat(renderer): add glyph atlas cache contract
ohah/maru#58생성 · 병합mergedmainfeat(renderer): add fake glyph layout contract
ohah/maru#57생성 · 병합mergedmainfeat(renderer): add DrawList contract
ohah/maru#56생성 · 병합mergedmainfeat(app): add headless PTY demo
ohah/maru#55생성 · 병합mergedmainrefactor(app): return pump termination data
ohah/maru#54생성 · 병합mergedmaindocs: add step-7 frame loop drain-termination design memo
ohah/maru#53생성 · 병합mergedmainfeat(pty): add reader stop lifecycle
ohah/maru#52생성 · 병합mergedmaintest(pty): stress bounded queue stdout
ohah/maru#51생성 · 병합mergedmainrefactor(app): drop dead read_error_events counter and align pump docs
ohah/maru#50생성 · 병합mergedmainfeat(app): add runtime event pump
ohah/maru#49생성 · 병합mergedmainfix(app): drop double deinit and dead reader indirection
ohah/maru#48생성 · 병합mergedmainfeat(app): add pty reader queue
ohah/maru#47생성 · 병합mergedmaintest(pty): route controlled output through surface runtime
ohah/maru#46생성 · 병합mergedmainfix(app): latch surface exited on read_error and key attach by surface.id
ohah/maru#45생성 · 병합mergedmainfeat(app): add surface runtime routing
ohah/maru#44생성 · 병합mergedmainrefactor(pty): drop dead session field and fix exit-status decode
ohah/maru#43생성 · 병합mergedmainfix(pty): preserve exit status and add HUP→TERM→KILL close policy
ohah/suji#76생성 · 병합mergedmaintest(mobile): 호스트 하니스에 python 추가 — 모바일 python CI 자동 커버리지
ohah/suji#75생성 · 병합mergedmainfix(test): android-e2e.sh e2e.html 체크 pipefail+SIGPIPE false-FAIL
ohah/suji#74생성 · 병합mergedmainfeat(python): Android embedded CPython 백엔드 (실 에뮬레이터 e2e 5/5)
ohah/suji#73생성 · 병합mergedmainfeat(python): iOS embedded CPython 백엔드 (실 시뮬레이터 e2e 5/5)
ohah/suji#72생성 · 병합mergedmainci(sdk): sdk-publish.yml 에 PyPI(suji-stubs) 발행 잡 추가
ohah/suji#71생성 · 병합mergedmainfeat(python): packaged .app/CLI 번들 + PYTHONHOME 자립 해석 (후속 마감)
ohah/suji#70생성 · 병합mergedmainfeat(python): embedded CPython 3.13 백엔드 (1급 시민, GIL, 번들 stdlib)
ohah/suji#69생성 · 병합mergedmainrefactor(core): EventBus UAF off-quiescence + embed 폴백 통일 (is_catch_all)
ohah/zntc#4185생성 · 병합mergedmainfix(test): dev HMR new-css-import flake — 재시도마다 fresh diff 강제 (#3813)
ohah/zntc#4184생성 · 병합mergedmainperf(linker): lNs(populateNamespaceAccesses) 변경∪importer 한정 partial-skip (#4176)
ohah/zntc#4183생성 · 병합mergedmainfix(linker): ns_member_rewrites borrowed 값 deinit double-free 제거 (#4178)
ohah/zntc#4182생성 · 병합mergedmainperf(linker): reuse-hit injection canonical_names_used dead-write 제거 — lInj −48% (#4176)
ohah/zntc#4181생성 · 병합mergedmainperf(linker): renameReuseGuard 변경-모듈 한정 O(N)→O(changed) — lGuard −60% (#4176)
ohah/zntc#4180생성 · 병합mergedmainfix(fmt): preset.test.ts oxfmt drift 해소 — CI Lint & Format 복구
ohah/zntc#4179생성 · 병합mergedmainperf(linker): injectPreservedRenames 스냅샷 문자열 borrow — dev HMR lInj −95% (#4176)
ohah/zntc#4177생성 · 병합mergedmainfeat(profile): dev HMR link sub-phase 측정 인프라 — 분해 bench + other 계측 (#4176)
ohah/zntc#4174생성 · 병합mergedmaintest(renumber): identity 멱등 가드 — finalize/renumber skip 선행
ohah/zntc#4173생성 · 병합mergedmainperf(linker): renameReuseGuard 변경-모듈 한정 — dev HMR lnk 절감
ohah/zntc#4172생성 · 병합mergedmainperf(emit): HMR 보존-hit unchanged 모듈 source 해시 skip — eMod 절감
ohah/zntc#4171생성 · 병합mergedmainperf(linker): reuse-hit 에서 populateSymbolRefCounts skip — dev HMR lnk 절감
ohah/zntc#4170생성 · 병합mergedmainfeat(hmr): plugin 게이트를 결정적 plugin 한정 완화 — RN preset opt-in (#4123)