2026-05-15
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
zntc는 새벽에 전날 이어 온 파서 정합성 수정과 TSC 감사 오라클 보강을 계속했습니다. for 문 머리의 using·await using 선언(#3202), if·while·for 본문 첫머리의 /를 정규식으로 다시 읽기(#3206), 타입 있는 화살표 함수 재해석 실패의 롤백(#3207), 문맥 키워드 레이블과 제네릭 메서드 이름 처리, stage3 accessor 데코레이터의 computed key(#3203)를 고쳤고, 추측 파싱의 저장·복원을 SpeculationCheckpoint로 묶었습니다(#3217). RN 에셋은 등록된 릴리스 에셋만 복사하도록 고친 뒤(#3216) 복사를 비동기 병렬로 바꾸고 AssetRegistry 메타데이터를 번들러 API로 노출하는 정리가 이어졌습니다(#3222). Flow는 라벨 있는 튜플 요소와 Hermes 규격을 따르는 튜플·조건부 타입·declare export·match 패턴 처리를 더했습니다(#3282, #3292, #3298).
낮부터는 minify 결과 크기를 줄이는 작업이 하루의 대부분을 차지했습니다. mangle을 tree-shake 뒤로 미뤄 죽은 바인딩이 짧은 이름을 차지하던 문제를 고치고(#3229), Phase B 예약 이름을 모듈 단위로 좁히고 전역 예약 집합을 모듈 사이에 공유했습니다(#3247, #3280). CJS 래퍼는 객체 리터럴 간접 참조 제거, 콜백 매개변수 단축, 쓰지 않는 module 매개변수와 createRequire shim 생략, 래퍼 안 "use strict" 제거 등을 하나씩 적용해 rxjs 번들을 PR마다 수 퍼센트씩 줄였습니다(#3250–#3264). 한 번만 쓰는 순수 복합식 인라인(#3232)과 쓰지 않는 함수식 이름 제거(#3266)에 이어, 모듈 수준 죽은 최상위 선언을 감사하고 사용자 순수 모듈에서 지우는 N-step 작업으로 mobx를 3.2KB 줄였습니다(#3268, #3272, #3274). mobx 형식의 CJS main shim을 자동 감지해 mobx 번들을 21% 줄인 resolver 변경(#3290)과 typeof 비교 단축, void 0 괄호 제거, return·throw 뒤 공백 제거 같은 세부 최적화도 병합됐습니다. 화살표 IIFE 축약은 커밋으로 main에 들어갔고 같은 이름의 PR #3231은 닫혔습니다.
그 밖에 Zig CLI의 --browserslist와 opera를 Chromium으로 대응시키는 처리(#3242, #3244), esbuild·swc처럼 네이티브 API를 처음 호출할 때 자동 초기화하는 기능(#3245), React 19 vite와 react-compiler 예제(#3249), Astro 문서 사이트의 SSR 막힘을 echarts 지연 로딩으로 푼 수정(#3239)이 들어왔습니다. 블로그 저장소 ohah.github.io의 커밋 8개는 크론 점검 기록과 일일 요약 갱신입니다.
공개 커밋 108개, 해당일 생성 또는 병합된 PR 93개를 정리했습니다. PR 생성 93개·병합 92개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/ohah.github.io
- cron: verify one MDX file for spelling (2026-05-16 19:30 KST)
- docs: CRON_CRD_WRITE.md - verified index.mdx spelling (2026-05-16 21:00 KST)
- chore: add CRON task entry for 2026-05-16 development-3.mdx spelling check
- docs: update 2026-05-15 daily activity summary
- docs: cron crd-write entry (2026-05-15 23:00 KST)
- docs(cron): complete CRD write spelling check 2026-05-16 20:30 KST (craby/development-3.mdx)
- docs: update CRON_CRD_WRITE.md - 2026-05-16 20:30 KST completion logged
- docs: add 2026-05-14 daily activity summary
ohah/zntc
- fix(flow): match expression pattern soundness (Hermes parity)
- perf(minify): if-else multi-expr block → ternary (three -54B jotai -6B, S6-step1)
- perf(minify): const → let 변환 + mergeDecls 통합 (three -40B, S4b)
- perf(minify): return/throw + string/array/object/template 공백 제거 (mobx -31B, S3b)
- perf(minify): return/throw + paren/unary 공백 제거 (three -14B, mobx -13B, S3)
- fix(flow): declare export sub-form dispatch + ambient opaque type
- fix(flow): conditional type infer/extends priority follows Hermes
- perf(minify): undefined → void 0 paren elision (three -50B, S1)
- feat(resolver): mobx-style cjs main shim 자동 검출 (mobx -21%, ratio 1.80x→0.96x) (#3289)
- perf(mangler): skip path 의 redundant 원본 이름 reserve 정리 (J epic step1)
- perf(minify): typeof X === "literal" → == (mobx -30B) (#3267 follow-up)
- perf(minify): elide function body trailing
return;(#3267 follow-up) - perf(minify): typeof X !== "undefined" → typeof X < "u" (mobx -100B) (#3267 follow-up)
- refactor(flow): tuple element parsing follows Hermes spec
- style(flow-libs): apply oxfmt
- feat(flow): support labeled tuple elements
- perf(mangler): K2-perf — global_reserved share across modules (#46)
- refactor(minify): dead_toplevel_audit counter atomic 화 (#3267 follow-up)
- test(node-compat): align CJS shim splitting test with cbd201f6
- fix(mangler): cross-module Phase A reserve in ESM bundle
- refactor(emitter): N-step4b cleanup — alloc+memcpy → Allocator.dupe
- perf(minify): N-step4b — prepass→emitter ref_deltas hydrate (#3267)
- perf(minify): N-step4 — dead branch cascade ref decrement (#3267)
- feat(linker): shared namespace inline 의 per-entry size audit (#3267 follow-up)
- perf(minify): N-step3b — module-level dead store elide for user-pure modules (mobx -3.2KB / -4.2%) (#3267)
- feat(minify): N-step3a — dead toplevel audit 에 binding name + span dump (#3267)
- fix(minify): function expression name elide 를 minify_syntax 만 적용
- test(stmt_info): N-step2 — mobx-style cascade graph correctness 검증 (#3267)
- feat(minify): N-step1 — module-level dead toplevel candidate audit (#3267)
- perf(minify): named function expression unused name elide (mobx -593B)
- perf(codegen): multi-expr block 을 sequence 로 unwrap (rxjs -61B)
- perf(emitter): CJS wrap body 의 trailing
;elide (rxjs -211B) - refactor(emitter): M2-M4 follow-up — needsRequireShim helper + narration 정리
- refactor(codegen): "use strict" directive 리터럴을 const 로 추출
- refactor(emitter): CJS var-merge 패턴을 helper 로 통합 + narration 정리
- fix(test): allow
m.exportsform in CJS wrapper bundle-minify - perf(emitter): helper var + 첫 CJS module 합치기 (rxjs -4B)
- perf(codegen): CJS wrap 안 "use strict" directive elide (rxjs -1.94%)
- perf(emitter): CJS_FACTORY_MIN $cj → $c 단축 (rxjs -224B)
- perf(emitter): minify CJS wrapper 의 module var 선언 합치기 (rxjs -0.6%)
- perf(emitter): minify CJS wrapper helper to anonymous arrow (rxjs -16B)
- perf(emitter): elide createRequire shim when no external require call (rxjs -84B)
- perf(emitter): CJS wrap unused 'module' param drop (rxjs -0.3%)
- perf(emitter): CJS wrap callback param
(exports,module)→(e,m)단축 (rxjs -5.7%) - fix(core): update init-lifecycle tests for lazy auto-init contract
- perf(emitter): minify CJS wrapper 의 object literal indirection 제거
- docs(examples): add react-19 vite + zntc-standalone react-compiler examples
- test(mangler): add unified mangler Phase A/B integration guards (#1760)
- feat(mangler): Phase B reserved 를 모듈 단위로 좁힘 (rxjs -3.7%)
- fix(astro): preserve landing code-example indent; clean up JSDoc samples
- feat(core): lazy auto-init for native API — match esbuild/swc UX
- feat(mangler): mangle_audit category — Phase A/B base54 1-char skip 측정
- feat(compat): map opera/op_mob to Chromium in parseBrowserslistEntry
- feat(cli): support --browserslist in Zig CLI with simple engine+version queries
- refactor(astro): single echarts-setup module — union register, dedup imports
- refactor(astro): consolidate brand hex tokens to single source
- fix(astro): unblock SSR by lazy-loading echarts; mermaid + benchmark share dark hook
- docs(astro): fix audit findings — WASM scope, vite link, RN flag split, intro links, chart re-render
- perf(emitter): elide CJS wrapper module name string in minify mode
- perf(bundler): namespace inline elide for tree-shaken re-exports (root cause)
- test(minify): cover esm_var_assign_only mode + drop probe-file reference
- test(minify): dead-brace unwrap regression guards
- refactor(codegen): allow var unwrap in non-esm-wrap mode (root cause guard)
- refactor(codegen): collapse dead-branch
kind != varcheck in tryUnwrapStandaloneBlock - perf(codegen): unwrap declaration-free standalone block at program-root
- perf(bundler): namespace getter minify-whitespace tokens
- feat(minify): paren-elimination at statement-root for pure compound inline
- fix(mangle): statement-level reachability guard for UMD libs + namespace getter dead-export skip
- feat(minify): IIFE collapse —
(()=>X)()→ X (arrow + zero-arg) - feat(minify): inline single-use pure compound expressions
- fix(mangle): defer mangling until tree-shake to stop dead bindings wasting short-name pool
- feat(mangle-report): nested stats + ZNTC_DEBUG=mangle_dump
- refactor(rn-asset): drop unread width/height/hash from metadata sidechannel
- refactor(rn-asset): collapse emitAssetRegistryCall args into input struct + drop dead hash
- refactor(rn-asset): emit follow-up — borrow escape + arena for temp rel + doc
- perf(rn-asset): emit directly into metadata allocator, drop clone step
- refactor(rn-asset): tighten metadata wire-up after simplify follow-up
- refactor(rn-asset): expose AssetRegistry metadata as bundler API
- perf(rn-asset): switch release copy to fs/promises + Promise.all
- refactor(esm_wrap): dedupe re-export guard + flatten star getter nesting
- chore(rn-asset): drop legacy projectRoot walk helpers
- style(rn-asset): apply oxfmt formatting
- refactor(rn-asset): dedupe sanitize/mkdir + drop existsSync TOCTOU
- fix(rn): copy only registered release assets
- test(parser): add regression guard for ternary parenthesized arrow speculation
- refactor(parser): extract SpeculationCheckpoint struct for save/rollback boilerplate
- fix(parser): reject literal keyword as labeled break/continue label + comment cleanup
- chore(scripts): audit detects await-as-identifier patterns as policy_strict
- chore(scripts): audit treats TS2405/TS2499/TS2500 as syntax-equivalent
- fix(parser): isModifierTerminator includes
<for contextual modifiers as method names - fix(parser): accept contextual keyword as labeled break/continue label
- chore(scripts): audit detects "use strict" in non-simple params as policy_strict
- chore(scripts): audit treats TS2660 as syntax-equivalent
- fix(parser): clear in_decorator inside parenthesized expression
- fix(parser): tryReinterpretAsTypedArrow rolls back ParseError without propagating
- fix(parser): rescan
/as regex at start of if/while/for/with body - chore(scripts): audit adds TS2427/TS5076 + Duplicate parameter as spec-strict
- chore(scripts): audit treats TS2356 as syntax-equivalent
- fix(parser): handle computed key in stage3 accessor decorator transform
- fix(parser): support
using/await usingdeclarations in for-statement header
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.