2026-05-31

요약 (AI 작성)

zntc는 lazy compilation 작업이 하루 종일 대규모로 진척되었습니다. 동적 import 경계에서 멈춰 미파싱 seed를 남기고 on-demand로 청크를 컴파일하는 인프라(PR-3a/3b)를 시작으로, watch 기반 lazy 청크 캐시 무효화와 재귀 seed 누적(PR-4), startDevServer의 lazyCompilation 옵션 노출(PR-5), 그리고 napi build/watch API에 프리미티브를 노출하는 D105 시리즈까지 한꺼번에 머지되었습니다. CLI에는 zntc dev --lazy 플래그가 들어가 dev 서버가 방문된 lazy 청크를 watch 그래프에서 materialize하도록 연결했고(#4079), per-seed 정밀 캐시 무효화로 무관한 편집 시 cold 재빌드를 회피하는 최적화도 더해졌습니다.

안정성 측면에서는 dev 서버 teardown 경로의 결함 두 건을 잡았습니다 — entry 모드 teardown segfault(watch thread join, #4063)와 keep-alive connection thread teardown UAF(shutdown으로 깨우기, #4066). 또한 cache-hit rebuild replay가 lazy seed를 eager parse·emit하던 버그(#4074)와 watch/dev lazy 경로가 동적 청크를 만들지 않던 버그(#4071)도 수정했습니다.

suji에서는 5,500줄을 넘긴 거대한 main.zig를 도메인별 모듈로 쪼개는 리팩토링이 이어졌습니다 — backend lifecycle/build helpers, CLI diagnostics, types_cmd, plugin loader, runInit를 각각 별도 파일로 추출해 진입점을 정리했습니다.

커밋

ohah/suji

ohah/zntc

PR (해당일 생성/머지)

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