2026-05-28

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

요약 (AI 작성)

zntc는 증분 빌드 개선 시도를 두 차례 닫는 것으로 시작했습니다. 증분 빌드에서 ModuleGraph를 재사용하는 PoC는 이전 빌드 Linker가 해제한 메모리를 다음 빌드가 읽어 segfault가 나 NO-GO로 닫았고(#3937), 대안인 chunk 단위 emit 캐시도 API 뼈대(#3938)까지 넣은 뒤 PoC가 잡음 수준이거나 회귀여서 닫았습니다(#3939). 근본 해결은 빌드 간 메모리 소유권을 다시 설계하는 일이라 보고 lifecycle scope 재설계 RFC #3940을 병합했습니다(#3940).

이후 하루 대부분은 RFC #3940의 하위 PR이었습니다. 측정 기반으로 ProfileSnapshot API와 증분 빌드·SSE 이벤트의 단계별 기록, dev 서버 HMR 벤치마크의 단계 분해, WatchHandle의 link 하위 단계 시간을 추가했습니다(#3942부터 #3947). transpile 경로는 parser·transformer arena를 나눈 뒤(#3941) Transformer.initFromOwnedAst로 AST 소유권을 넘겨 복제를 없앴는데(#3948, #3952), 87MB 합성 입력에서 peak 메모리는 RFC 추정치(-33%)에 못 미치는 84MB(-2.6%) 감소였습니다. 번들러는 SymbolID 타입과 RenameTable을 새로 두고(#3954, #3956) emitter, computeMangling, syntheticName, esm_wrap 헬퍼, carry-over가 이 표를 읽도록 단계적으로 바꾼 끝에 Symbol.canonical_name 필드를 없애 rename 정보를 한 곳으로 모았습니다(#3959부터 #3968). 다중 패스 capture의 낡은 인덱스 문제도 근본 수정했습니다(#3969).

저녁에는 mangler의 식별자 slot 할당을 liveness 기반 그래프 색칠에서 esbuild식 scope 중첩 방식으로 바꿔(#3970) typescript.js의 --minify-identifiers가 약 35초에서 128ms로 줄었고, 출력은 기존과 바이트 단위로 같았습니다. test262 스위트를 결정적으로 만들고(#3964) lib·exe 테스트 바이너리를 직렬 실행해 CI의 간헐 실패를 없앴으며(#3971), 공유 namespace 변수 이름을 모듈 순서로 결정하고(#3972) 해석되지 않은 import 진단이 두 번 찍히던 문제를 고쳤습니다(#3974).

suji는 PR 없이 커밋으로 작업했습니다. macOS·Linux 리치 알림 액션, SujiCore를 통한 창 API 노출, 공개 C 백엔드 ABI 헤더, 선택형 Lua 백엔드 런타임, 플러그인 source 명세와 권한, 모바일 HTTPS CA 번들 주입, Unix 릴리스 산출물에 libnode 포함, create-suji 도구 체인 매트릭스, CLI 설정 로딩 리팩터링을 추가했고, Electron 이전 경로와 SDK 퍼블리시 준비 상태, isolated world 제약을 문서로 정리했습니다. 블로그 저장소 ohah.github.io에는 크론의 MDX 맞춤법 점검 커밋 2개와 일일 요약 갱신 커밋 1개가 있었습니다.

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

커밋

ohah/ohah.github.io

ohah/suji

ohah/zntc

PR (해당일 생성/머지)

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

저장소PR해당일 활동상태대상 브랜치제목
ohah/zntc#3974생성 · 병합mergedmainfix(bundler): unresolved import 진단 중복 출력 제거 (#3973)
ohah/zntc#3972생성 · 병합mergedmainfix(bundler): shared namespace var 이름을 module_index rank 로 결정화 (#3966)
ohah/zntc#3971생성 · 병합mergedmainfix(build): lib/exe 테스트 바이너리 직렬 실행으로 CI flaky 제거
ohah/zntc#3970생성 · 병합mergedmainperf(mangler): 식별자 slot 할당을 esbuild 식 scope-nesting(O(N))으로 교체
ohah/zntc#3969생성 · 병합mergedmainfix(bundler): multi-pass capture stale-idx 근본 수정 (RFC #3940 L.5c review)
ohah/zntc#3968생성 · 병합mergedmainrefactor(bundler): Symbol.canonical_name field 제거 — rename_table 단일 출처 (RFC #3940 Sub-PR-L.5c)
ohah/zntc#3967생성 · 병합mergedmainfeat(bundler): syntheticName rt 필수화 (canonical 이중경로 제거) + single-file dynamic import rt (RFC #3940 Sub-PR-L.5b)
ohah/zntc#3965생성 · 병합mergedmainfeat(bundler): carry-over 를 rename_table 기반 재설계 — syncRenameTableFromCanonical 폐기 (RFC #3940 Sub-PR-L.5a)
ohah/zntc#3964생성 · 병합mergedmaintest: make test262 suite deterministic
ohah/zntc#3963생성 · 병합mergedmainfeat(bundler): esm_wrap helper layer canonical read 를 rename_table 로 (RFC #3940 Sub-PR-L.4c-2a-ii)
ohah/zntc#3962생성 · 병합mergedmainfeat(bundler): syntheticName canonical read 를 rename_table 로 — non-esm_wrap (RFC #3940 Sub-PR-L.4c-2a-i)
ohah/zntc#3961생성 · 병합mergedmainfeat(bundler): computeMangling dedup key 를 rename_table lookup 으로 전환 (RFC #3940 Sub-PR-L.4c-1)
ohah/zntc#3960생성 · 병합mergedmainfeat(bundler): emitter canonical read 를 rename_table lookup 으로 전환 (RFC #3940 Sub-PR-L.4b)
ohah/zntc#3959생성 · 병합mergedmainfeat(bundler): transform_prepass carry-over rename_table 동기화 (RFC #3940 Sub-PR-L.4a)
ohah/zntc#3958생성 · 병합mergedmaindocs(rfc): RFC #3940 다음 레버 후보를 추적 이슈 #3957 로 링크
ohah/zntc#3956생성 · 병합mergedmainfeat(bundler): RenameTable 병행 작성 (RFC #3940 Sub-PR-L.3)
ohah/zntc#3955생성 · 병합mergedmainperf(transpile): phase 메모리 계측 + RFC 분포 분석 (RFC #3940 PR-3)
ohah/zntc#3954생성 · 병합mergedmainfeat(bundler): SymbolID 타입 정의 (RFC #3940 Sub-PR-L.2)
ohah/zntc#3953생성 · 병합mergedmaindocs(rfc): Sub-PR-L.1 cross-build memory ownership audit (RFC #3940 Phase 1)
ohah/zntc#3952생성 · 병합mergedmainfeat(transpile): cloneForTransformer 회피 — initFromOwnedAst 사용 (RFC #3940 PR-2)
ohah/zntc#3951생성 · 병합mergedmainchore(profile): @setEvalBranchQuota num_categories 기반 derived 표현
ohah/zntc#3950생성 · 병합mergedmainfix(bench): devserver-hmr WS filter + warmup + SSE teardown 정리
ohah/zntc#3949생성 · 병합mergedmainfix(profile-harness): dev_server watchLoop break + incremental fatal reset
ohah/zntc#3948생성 · 병합mergedmainfeat(transformer): Transformer.initFromOwnedAst API 추가 (RFC #3940 PR-1)
ohah/zntc#3947생성 · 병합mergedmainfeat(napi): WatchHandle phaseDurations 에 link sub-phase 추가 (RFC #3940 Sub-PR-L.0e)
ohah/zntc#3946생성 · 병합mergedmaindocs(rfc): transformer ownership transfer — clone 회피 (peak RSS -33% 목표)
ohah/zntc#3945생성 · 병합mergedmainbench(devserver-hmr): SSE listener + iteration 별 phase breakdown (RFC #3940 Sub-PR-L.0d)
ohah/zntc#3944생성 · 병합mergedmainfeat(dev-server): SSE bundle_build_done 에 profile snapshot 포함 (RFC #3940 Sub-PR-L.0c)
ohah/zntc#3943생성 · 병합mergedmainfeat(incremental): doBuild 가 ProfileSnapshot 캡처 (RFC #3940 Sub-PR-L.0b)
ohah/zntc#3942생성 · 병합mergedmainfeat(profile): ProfileSnapshot API + RFC_RELEASE_PROFILING_HARNESS (RFC #3940 Sub-PR-L.0a)
ohah/zntc#3941생성 · 병합mergedmainfeat(transpile): arena 분리 (parser_arena + transformer_arena, Step 1/2)
ohah/zntc#3940생성 · 병합mergedmaindocs(rfc): lifecycle scope redesign — esbuild parity 의 architectural path (mid-term)
ohah/zntc#3939생성 · 병합mergedmaindocs(rfc): emit incremental CLOSED — 모든 Sub-PR-C PoC NO-GO
ohah/zntc#3938생성 · 병합mergedmainfeat(bundler): ChunkEmitCache API skeleton (RFC_EMIT_INCREMENTAL Sub-PR-C.1)
ohah/zntc#3937생성 · 병합mergedmaindocs(rfc): graph persistence CLOSED (PoC NO-GO) + emit incremental RFC