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
- fix(platform): harden macos window smoke visibility and duration guards
- feat(platform): add macOS window smoke
- fix(app): fix app-host smoke double-free on push-then-error path
- feat(app): add app host frame smoke
- fix(renderer): apply code-review fixes for cursor overlay contract
- feat(renderer): add cursor overlay dirty contract
- docs(renderer): note glyph atlas contract-stage tradeoffs
- fix(review): harden pump termination and apply code-review cleanups
- feat(renderer): add glyph atlas cache contract
- docs(font): pin glyph cache key style_flags to raster-affecting only
- fix(renderer): keep underline out of glyph cache key per review
- feat(renderer): add fake glyph layout contract
- docs(renderer): record cursor rendering + cursor-move dirty gap
- fix(renderer): harden draw list ownership and build cost per review
- feat(renderer): add draw list contract
- refactor(app): tidy headless demo artifact writing per review
- feat(app): add headless pty demo
- fix(test): surface read errors in drainRuntimeQueueUntilExit
- refactor(app): return pump termination data
- fix(pty): drop close-path tradeoffs with self-pipe wake + kqueue NOTE_EXIT
- feat(pty): add reader stop lifecycle
- docs: add step-7 frame loop drain-termination design memo
- test(pty): stress bounded queue stdout
- docs: note drainBlockingUntilExit has no integration consumer yet
- refactor(app): drop unreachable read_error_events drain counter
- feat(app): add runtime event pump
- fix(app): drop double deinit and dead reader indirection
- feat(app): add pty reader queue
- test(pty): write artifacts before assertions so failures stay diagnosable
- test(pty): route controlled output through surface runtime
- fix(app): latch surface exited on read_error and key attach by surface.id
- feat(app): add surface runtime routing
- refactor(pty): drop dead session field and fix exit-status decode
- fix(pty): preserve exit status and add HUP→TERM→KILL close policy
ohah/suji
- test(mobile): run.sh 호스트 하니스에 python 추가 — 모바일 python CI 자동 커버리지
- fix(test): android-e2e.sh e2e.html 체크 pipefail+SIGPIPE false-FAIL
- feat(python): Android embedded CPython 백엔드 — 실 에뮬레이터 e2e 5/5
- feat(python): iOS embedded CPython 백엔드 — 실 시뮬레이터 e2e 5/5
- ci(sdk): sdk-publish.yml 에 PyPI(suji-stubs) 발행 잡 추가
- feat(python): packaged .app/CLI 번들 + PYTHONHOME 자립 해석 + 후속 마감
- feat(python): embedded CPython 3.13 백엔드 (1급 시민, GIL, 번들 stdlib)
- feat(macos): app.icon 으로 앱 아이콘 설정 (.png→.icns 생성 / .icns 복사)
- refactor(core): EventBus UAF off-quiescence + embed 폴백 통일 (is_catch_all)
ohah/zntc
- fix(test): dev HMR new-css-import flake — 재시도마다 fresh diff 강제 (#3813)
- perf(linker): lNs(populateNamespaceAccesses) 변경∪importer 한정 partial-skip (#4176)
- fix(linker): ns_member_rewrites borrowed 값 deinit double-free 제거 (#4178)
- perf(linker): reuse-hit injection 의 canonical_names_used dead-write 제거 — lInj 절감 (#4176)
- perf(linker): renameReuseGuard 변경-모듈 한정 O(N)→O(changed) — lGuard 절감 (#4176)
- perf(linker): injectPreservedRenames 스냅샷 문자열 borrow — dev HMR lInj 절감 (#4176)
- docs(rfc): Persistent Linker — dev HMR link 증분화 RFC 초안 (#4176)
- test(bundler): dev HMR 보존-hit link sub-phase 분해 bench (#4176 측정 인프라)
- perf(profile): link
other분해 계측 — chain_scan/rename_guard/inject_renames (#4176) - fix(fmt): preset.test.ts oxfmt drift 해소 — CI Lint & Format 복구
- test(renumber): identity 멱등 가드 — finalize/renumber skip 선행
- perf(linker): renameReuseGuard 변경-모듈 한정 — dev HMR lnk 절감
- perf(emit): HMR 보존-hit unchanged 모듈 source 해시 skip — eMod 절감
- perf(linker): reuse-hit 에서 populateSymbolRefCounts skip — dev HMR lnk 절감
- feat(hmr): plugin 게이트를 결정적 plugin 한정 완화 — RN preset opt-in (#4123)
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.