2026-05-20
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
zntc는 빌드 결과가 바이트 단위로 같게 나오는지 10회 반복으로 검사하는 결정성 게이트와 CI job을 먼저 세우고(#3565), 모듈 인덱스 부여, mangler 후보 정렬, 이름 충돌 해결의 NameOwner 정렬, exec_index 동률 처리, emit 경로의 hashmap 순회, 치명적 진단 출력 순서를 모두 경로 기준의 안정된 순서로 바꿨습니다(#3566, #3567, #3568, #3569, #3570, #3571). 재번호 매김 때 SymbolRef.module을 다시 매핑하지 않아 생긴 모듈 간 심볼 해석 문제는 바로 hotfix했습니다(#3583).
이어 한 번의 빌드에서 여러 포맷을 내보내는 다중 포맷 출력을 쌓았습니다. 링커 메타데이터에 포맷을 전달하고 emit마다 상태를 초기화하는 진입점을 둔 뒤, OutputConfig와 BundleOptions.output 배열, 다중 포맷 emit 루프, 동등성·순서 불변·메모리 안전 게이트를 거쳐(#3576, #3577, #3578) rollup 방식의 zntc(input).write(output).close() API(#3579)와 esbuild 방식의 build 함수 output 배열 문법(#3585)을 추가했습니다. Module Federation과 다중 포맷을 함께 쓰는 설정은 거부하고(#3582), 공유 에셋 정책은 문서와 CSS 테스트로 정했습니다.
오후에는 증분 리빌드 측정 인프라를 만들고 M0부터 M8까지 단계별로 프로파일 구간을 쪼갠 뒤, export 이름 인덱스 사전 계산과 호출부 이전(#3593, #3594), re-export 진입의 스택 버퍼, RequestedExports.names의 HashMap을 평탄한 배열로 바꾸는 변경(#3599), 의존성 배열 용량 예약, 모듈 경로용 arena allocator(#3602)로 그래프 처리를 줄였습니다. 문서 사이트에는 /llms.txt·/llms-full.txt 엔드포인트와 Claude Code용 zntc-cli 스킬을 추가해 영어로 통일하고 간소화했습니다(#3604, #3605, #3606).
밤에는 RN 수정을 대거 묶은 ESM re-export getter PR(#3542)이 병합됐습니다. 여기에는 pnpm 심링크 모듈 정규화, Hermes용 미해결 dynamic import 낮추기, styled-components 처리의 Metro 정렬, scale 전용 에셋 해석, 엄격 순서에서 inline require 보존, throw 뒤 CJS factory 재시도, TSX generic JSX 속성 보존 등이 들어 있습니다. 헤드리스 Chromium으로 런타임을 확인하는 zntc verify --browser CLI(#3609)와 이를 에이전트가 부를 수 있는 verify_in_chrome MCP 도구(#3610), dev overlay 클라이언트의 .js 파일 분리(#3608), Electron 타깃별 config 예제 문서(#3563)도 병합됐습니다. 블로그 저장소 ohah.github.io의 커밋 14개는 크론의 문서 점검 표시와 요약 갱신 커밋입니다.
공개 커밋 86개, 해당일 생성 또는 병합된 PR 46개를 정리했습니다. PR 생성 44개·병합 46개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/ohah.github.io
- docs(cron): update cron task log - verify MDX spelling (2026-05-21 08:00 UTC)
- docs(cron): verify MDX file spelling for CRD development log
- cron: verify spelling in docs/monthly-opensource/crd/development-9.mdx
- cron: verify crd/development.mdx (2026-05-21 19:00 UTC)
- docs: Add 2026-05-21 03:00 UTC CRON check result (cheolsu-proxy/development-1.mdx)
- docs: add 2026-05-20 commit summary - zntc multi-format build and profile infra
- chore: cron task completed - verify one MDX file for spelling (2026-05-20 19:00 KST)
- cron: mark CRD doc spelling check complete (2026-05-21 23:30 UTC)
- cron: 2026-05-21 23:30 verify spelling (development-7)
- docs: update CRON_CRD_WRITE.md - development-6.mdx verified
- cron: verify spelling in cheolsu-proxy/development-8.mdx (2026-05-21 08:00 UTC)
- feat(cron): Add 2026-05-21 16:00 UTC CRON task completion record
- cron: CRON_CRD_WRITE.md - verify development-8.mdx spelling
- crd: update cron log for development-1.mdx verification
ohah/zntc
- feat(dev-server): verify_in_chrome MCP tool — agent-driven browser verify
- chore(deps): refresh bun.lock for playwright optionalDependency
- feat(core): zntc verify --browser CLI — headless Chromium runtime gate
- refactor(dev-server): extract Zig dev overlay client into @embedFile-backed .js
- fix(react-native): satisfy tsc strict + isolatedDeclarations
- chore(react-native): apply oxfmt formatting
- perf(tree-shake): iterate re_export_modules cache in named re-export propagation
- refactor(emitter): dedupe runBeforeMain closure helpers
- fix(rn): capture dev flag in worklet closure
- test(rn): align CJS inline require expectation
- fix(rn): propagate late namespace re-export requests
- fix(rn): keep intermediate re-export getters live
- fix(rn): lower unresolved dynamic imports for hermes
- fix(cli): inline dynamic imports for single-file bundles
- fix(rn): canonicalize pnpm symlink modules
- fix(rn): preserve inline requires under strict order
- fix(rn): align styled-components handling with metro
- fix(rn): rename lexical loop headers during lowering
- fix(rn): resolve scale-only asset imports
- fix(rn): skip unused default re-export assignments
- fix(parser): preserve TSX generic JSX attributes
- test(react-native): cover directory JSX component imports
- fix(react-native): keep styled-components native sheet selection
- fix(react-native): forward CLI aliases into RN bundle options
- fix(bundler): drop transformed type-only imports
- fix(bundler): order RN setup before entry execution
- fix(bundler): retry CJS factory after throw
- fix(rn): resolve scale-only assets like Metro
- fix(rn): preserve dev server default mode
- fix(rn): resolve ESM re-export getters from source
- docs(documents): zntc-cli skill — use @zntc/init for setup, drop Vite snippet
- docs(documents): simplify zntc-cli skill — usage + llms-full.txt fetch hint
- docs(documents): make /llms.txt + /llms-full.txt + skill English-only
- docs(documents): LLM-friendly endpoints + Claude Code skill + 20-iter benchmark
- chore(documents): refresh benchmark data 2026-05-21 (post-Z4)
- feat(graph): path arena allocator for module paths (Z4)
- feat(graph): ensureCapacity(8) for Module.dependencies/importers (Z3)
- chore(profile): record_dep + add_module internal decomposition (M8)
- feat(graph): RequestedExports.names HashMap → flat array (Z2)
- chore(profile): re_export entry 3-way decomposition (M7)
- feat(graph): stack buffer for requested_names in re_export entry (Z1)
- chore(profile): re_export caller side entry/outer decomposition (M6)
- chore(profile): requestNamed/All internals 4-way decomposition (M5)
- feat(graph): migrate request_exports callers to index lookup (Y2)
- feat(graph): export_index_by_name precompute (dormant Y1)
- chore(profile): split requestDependencyExports into 3 branches (M4)
- chore(profile): decompose replay into add_module/request_exports/record_dep/other (M3)
- chore(bench): sub-phase µs output for incremental bench (M2)
- chore(profile): incremental rebuild sub-phase categories (M1)
- chore(bench): production-realistic incremental rebuild measurement (M0)
- docs(roadmap): RN CLI/MCP 스코프를 빌드+실행+디버깅으로 확장
- chore(bench): incremental rebuild measurement infra (ROI investigation)
- feat(core): esbuild-style build({output:[]}) sugar
- feat(emit): document multi-format shared-asset policy + CSS test gate
- fix(graph): remap SymbolRef.module in renumber (cross-module symbol resolution)
- feat(bundler): reject Module Federation + multi-format combination
- test(integration): rollup-style multi-format API smoke
- feat(core): rollup-style zntc(input) → BuildInstance.write(output) API
- test(bundler): multi-format equivalence + order invariance + memory safety gates
- feat(bundler): emit loop for multi-format (single path only)
- feat(bundler): OutputConfig + BundleOptions.output[] (infrastructure only)
- feat(linker): setEmitFormat + resetEmitTransients per-emit entry points
- refactor(linker): thread Format through metadata builders
- test(infra): determinism gate code-splitting fixture — outdir 모드 helper 확장
- fix(linker): stable-order fatal diagnostics flush
- fix(emitter): sort emit-path hashmap iterators (esm-wrap star + chunk exports)
- fix(bundler): path-stable bundleOrderLessThan for exec_index ties
- fix(linker): path-stable NameOwner sort in name collision resolution
- feat(mangler): path-stable candidate tie-breaker for cross-module frequency sort
- fix(graph): deterministic module index assignment via path-stable renumber
- test(infra): byte-identical determinism gate (N=10) — 5 fixture + helpers + CI job
- docs(electron): zntc.config.ts 타깃별 config 파일 예제 추가
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.