2026-05-31

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

요약 (AI 작성)

zntc는 하루 내내 lazy compilation을 진행했습니다. 번들러가 동적 import 경계에서 멈춰 파싱하지 않은 seed를 남기고, 그 청크는 emit을 건너뛰되 경로 기반의 안정된 이름을 갖게 한 뒤(#4053, #4054), emitChunks가 단일 청크만 내보내는 기능과 강제 파싱 primitive를 더해 dev 서버에 요청 시점 청크 라우트를 열었습니다(#4055부터 #4058). 서버는 watch에 따라 lazy 청크 캐시를 무효화하고, 중첩된 import()의 seed를 누적하며, 그래프가 바뀌면 entry를 다시 계산하도록 했고(#4059, #4060, #4061), NAPI startDevServer에 lazyCompilation 옵션을 노출했습니다(#4064). 오전에는 linker의 mangle 경로 헬퍼를 통합하고 청크별 bitset 누수를 막는 정리도 있었습니다(#4052).

오후에는 같은 기능을 JS 쪽으로 넓혔습니다. lazy 프리미티브를 build·watch API에 노출하고 watch()의 onReady·onRebuild 이벤트에 lazySeeds를 담았으며(#4069, #4070, #4075), JS dev 서버에 요청 시점 청크 라우트와 캐시 epoch 가드를 붙인 끝에 zntc dev --lazy 플래그를 추가했습니다(#4073, #4077, #4078). 무관한 파일을 고쳐도 cold 재빌드가 일어나지 않도록 seed 단위로 캐시를 무효화했고(#4080), 방문한 lazy 청크를 watch 그래프에서 materialize하는 설계와 WatchHandle.requestLazySeed() 구현(#4081부터 #4084), 깊은 파일 편집이 화면에 반영되지 않던 문제의 full-reload 대체와 브라우저 e2e(#4085)가 이어졌습니다. 밤에는 리로드 없이 상태를 보존하는 split 청크 모듈별 HMR RFC(#4086)와 그 첫 단계로 청크 모듈별 HMR 코드 수집(#4087)을 병합했습니다.

버그 수정으로는 entry 모드 dev 서버 종료 시 watch 스레드를 기다리지 않아 생기던 segfault(#4065), keep-alive 연결 스레드 종료 시 해제 후 사용(#4067), watch·dev lazy 경로가 동적 청크를 만들지 않던 문제(#4072), cache-hit 재빌드가 lazy seed를 즉시 파싱·emit하던 문제(#4076)가 있습니다. 문서에는 주 설정이 자체 zntc.config이고 Vite·Rollup 어댑터는 호환용이라는 점을 명시했습니다(#4068).

suji는 PR 없이 5,500줄이 넘던 main.zig에서 CLI 진단·사용법, runInit, 백엔드 빌드 헬퍼, runTypes와 스키마 덤프, 플러그인 로더와 패키징 경로 헬퍼, 백엔드 수명 주기를 각각 별도 파일로 분리했습니다.

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

커밋

ohah/suji

ohah/zntc

PR (해당일 생성/머지)

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

저장소PR해당일 활동상태대상 브랜치제목
ohah/zntc#4087생성 · 병합mergedmainfeat(bundler): dev+split emit 가 청크 모듈별 HMR code 수집 (RFC_LAZY_DEV_MODULE_HMR PR-1)
ohah/zntc#4086생성 · 병합mergedmaindocs: RFC — lazy dev split 청크 모듈별 HMR (리로드 없이 상태 보존, #4038 재해결)
ohah/zntc#4085생성 · 병합mergedmainfix(cli): --lazy dev 깊은 파일 편집이 화면에 반영 안 되던 버그 — full-reload 폴백 + 브라우저 e2e (#4079)
ohah/zntc#4084생성 · 병합mergedmainfeat(cli): dev 서버가 방문된 lazy 청크를 watch 에 materialize 요청 (#4079 PR-3)
ohah/zntc#4083생성 · 병합mergedmainfeat(napi): WatchHandle.requestLazySeed() — 요청된 lazy seed 를 watch 그래프에서 force-parse (#4079 PR-2)
ohah/zntc#4082생성 · 병합mergedmainfeat(bundler): lazy 빌드 동적 청크가 force-parse 후에도 path-hash 안정 이름 유지 (#4079 PR-1)
ohah/zntc#4081생성 · 병합mergedmaindocs: RFC — lazy dev 요청 seed materialize (#4079 설계)
ohah/zntc#4080생성 · 병합mergedmainperf(cli): lazy on-demand 캐시 정밀(per-seed) 무효화 — 무관한 편집 시 cold 재빌드 회피 (#4062 후속)
ohah/zntc#4078생성 · 병합mergedmainfeat(cli): zntc dev --lazy 플래그 — 동적 import 청크 on-demand 컴파일 (#4062 PR-C-3)
ohah/zntc#4077생성 · 병합mergedmainfeat(cli): lazy on-demand 캐시 epoch 가드로 rebuild-중-빌드 stale 캐시 방지 (#4062 PR-C-2)
ohah/zntc#4076생성 · 병합mergedmainfix(bundler): cache-hit rebuild replay 경로가 lazy seed 를 eager parse·emit 하던 버그 (#4074)
ohah/zntc#4075생성 · 병합mergedmainfeat(napi): watch() onRebuild 이벤트에 lazySeeds 노출 (#4062 PR-C-1)
ohah/zntc#4073생성 · 병합mergedmainfeat(cli): JS dev 서버 lazy on-demand 청크 라우트 (env ZNTC_LAZY, #4062 PR-B-2)
ohah/zntc#4072생성 · 병합mergedmainfix(bundler): watch/dev lazy 경로가 동적 청크를 안 만들던 버그 — buildIncremental 에서 materializeLazySeeds 호출 (#4071)
ohah/zntc#4070생성 · 병합mergedmainfeat(napi): watch() onReady 에 lazySeeds 노출 + 공용 빌더 추출 (D105 PR-B-1)
ohah/zntc#4069생성 · 병합mergedmainfeat(napi): lazy compilation 프리미티브를 build/watch API 에 노출 (D105 PR-A)
ohah/zntc#4068생성 · 병합mergedmaindocs(claude): 메인 설정은 자체 zntc.config — Vite/Rollup 어댑터는 호환 목적 명확화
ohah/zntc#4067생성 · 병합mergedmainfix(server): keep-alive connection thread teardown UAF — shutdown 으로 깨우기 (#4066)
ohah/zntc#4065생성 · 병합mergedmainfix(server): entry 모드 dev 서버 teardown segfault — watch thread join (#4063)
ohah/zntc#4064생성 · 병합mergedmainfeat(napi): lazy compilation PR-5 — startDevServer 에 lazyCompilation 옵션 노출
ohah/zntc#4061생성 · 병합mergedmainfeat(server): lazy compilation PR-4-iii — 그래프 변경 entry 재계산 + TOCTOU 캐시 가드
ohah/zntc#4060생성 · 병합mergedmainfeat(server): lazy compilation PR-4-ii — 재귀 lazy (중첩 import() seed 누적)
ohah/zntc#4059생성 · 병합mergedmainfeat(server): lazy compilation PR-4-i — watch-driven lazy 청크 캐시 무효화
ohah/zntc#4058생성 · 병합mergedmainfeat(bundler): lazy compilation PR-3b-iii — dev 서버 lazy on-demand 라우트
ohah/zntc#4057생성 · 병합mergedmainfeat(bundler): lazy compilation PR-3b-ii 완성 — shared-off + entry export-all-by-local
ohah/zntc#4056생성 · 병합mergedmainfeat(bundler): lazy compilation PR-3b-ii — force-parse primitive + (B) 결정론 재빌드 검증
ohah/zntc#4055생성 · 병합mergedmainfeat(bundler): lazy compilation PR-3b-i — emitChunks 단일 청크 emit(restrict_to_chunk)
ohah/zntc#4054생성 · 병합mergedmainfeat(bundler): lazy compilation PR-3a-ii — 미파싱 seed 청크 emit-skip + 경로기반 안정 이름
ohah/zntc#4053생성 · 병합mergedmainfeat(bundler): lazy compilation PR-3a-i — 동적 import 경계 정지 + 미파싱 seed 인프라
ohah/zntc#4052생성 · 병합mergedmainrefactor(linker): mangle 경로 헬퍼 통합 + per-chunk bitset/leak hardening