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
- CRON: Verified and corrected './docs/index.mdx' for spelling
- docs: update 2026-05-28 daily commit summary (AI written)
- CRON Task: Validating one MDX file for spelling correction
ohah/suji
- Refactor CLI config loading
- Add create-suji toolchain matrix
- Fix log plugin clock API
- Sync plugin plan checklist
- Add plugin source specs and permissions
- Add optional Lua backend runtime
- Mark shared state management complete
- Document isolated world blocker
- Add mobile HTTPS CA bundle injection
- Bundle libnode with Unix release artifacts
- Clarify SDK publish readiness
- Document Electron migration path
- Add public C backend ABI header
- Expose window API through SujiCore
- Add macOS and Linux rich notification actions
ohah/zntc
- fix(bundler): unresolved import 진단 중복 출력 제거 (#3973)
- fix(bundler): shared namespace var 이름을 module_index rank 로 결정화 (#3966)
- fix(build): lib/exe 테스트 바이너리 직렬 실행 — CI flaky spurious fail 제거
- chore(mangler): code-review max 대응 — stale 주석 정정 + slot 연속성 assert + depth-3 테스트
- perf(mangler): 식별자 slot 할당을 esbuild 식 scope-nesting(O(N))으로 교체
- docs(bundler): pending_renames 가 parse_arena 소유임을 명시 (#1287 가드)
- fix(bundler): multi-pass capture stale-idx 근본 수정 (RFC #3940 L.5c review)
- test(bundler): cross-build cache-hit 충돌 rename 회귀 테스트 (RFC #3940 Sub-PR-L.5c)
- feat(bundler): Symbol.canonical_name field 제거 — rename_table 단일 출처 (RFC #3940 Sub-PR-L.5c)
- docs(bundler): cjs_wrap 의 stale 주석 정정 (L.5b review)
- feat(bundler): syntheticName rt 필수화 (canonical 이중경로 제거) + single-file dynamic import rt 전파 (RFC #3940 Sub-PR-L.5b)
- fix(bundler): carry-over capture 를 !code_splitting 게이트 — dangling 방지 (RFC #3940 L.5a review)
- feat(bundler): carry-over 를 rename_table 기반으로 재설계, syncRenameTableFromCanonical 폐기 (RFC #3940 Sub-PR-L.5a)
- test: make test262 suite deterministic
- feat(bundler): esm_wrap helper layer 의 canonical read 를 rename_table 로 (RFC #3940 Sub-PR-L.4c-2a-ii)
- feat(bundler): syntheticName 의 canonical read 를 rename_table 로 — non-esm_wrap (RFC #3940 Sub-PR-L.4c-2a-i)
- feat(bundler): computeMangling dedup key 를 rename_table lookup 으로 전환 (RFC #3940 Sub-PR-L.4c-1)
- feat(bundler): emitter canonical read 를 rename_table lookup 으로 전환 (RFC #3940 Sub-PR-L.4b)
- feat(bundler): transform_prepass carry-over rename_table 동기화 (RFC #3940 Sub-PR-L.4a)
- docs(rfc): RFC #3940 의 다음 레버 후보를 추적 이슈 #3957 로 링크
- feat(bundler): RenameTable 병행 작성 (RFC #3940 Sub-PR-L.3)
- perf(transpile): phase 메모리 계측 (ZNTC_MEM_PROFILE) + RFC 분포 분석 (RFC #3940 PR-3)
- feat(bundler): SymbolID 타입 정의 (RFC #3940 Sub-PR-L.2)
- review(transpile): code-review max findings — 측정 정확성 + comment rot
- feat(transpile): cloneForTransformer 회피 — initFromOwnedAst 사용 (RFC #3940 PR-2)
- docs(rfc): Sub-PR-L.1 cross-build memory ownership audit (RFC #3940 Phase 1)
- chore(profile): @setEvalBranchQuota 를 num_categories 기반 derived 표현으로
- fix(bench): devserver-hmr WS filter + warmup + SSE teardown 정리
- fix(profile-harness): dev_server watchLoop break + incremental fatal reset
- review(transformer): code-review max findings + cleanup
- feat(transformer): Transformer.initFromOwnedAst API 추가 (RFC #3940 PR-1)
- feat(napi): WatchHandle phaseDurations 에 link sub-phase 추가 (RFC #3940 Sub-PR-L.0e)
- docs(rfc): transformer ownership transfer — clone 회피 RFC
- bench(devserver-hmr): SSE listener + iteration 별 phase breakdown (RFC #3940 Sub-PR-L.0d)
- feat(dev-server): SSE bundle_build_done 에 profile snapshot 포함 (RFC #3940 Sub-PR-L.0c)
- feat(incremental): doBuild 가 ProfileSnapshot 캡처 (RFC #3940 Sub-PR-L.0b)
- feat(profile): ProfileSnapshot API + RFC_RELEASE_PROFILING_HARNESS (RFC #3940 Sub-PR-L.0a)
- feat(transpile): arena 분리 (parser_arena + transformer_arena, Step 1)
- docs(rfc): lifecycle scope redesign — cross-build memory ownership 명확화 (mid-term epic)
- docs(rfc): emit incremental CLOSED — Sub-PR-C 모든 PoC noise/회귀, 진짜 fix 는 lifecycle redesign
- feat(bundler): ChunkEmitCache API skeleton (RFC_EMIT_INCREMENTAL Sub-PR-C.1)
- docs(rfc): graph persistence CLOSED (Sub-PR-B.3 PoC NO-GO) + emit incremental RFC
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.