Skip to content

fix(vite-plugin): make shared class slots order independent - #802

Merged
owjs3901 merged 14 commits into
mainfrom
fix/order-independent-vite-slots
Oct 23, 2026
Merged

owjs3901 merged 14 commits into
mainfrom
fix/order-independent-vite-slots

Conversation

@owjs3901

@owjs3901 owjs3901 commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Refs #694 (PR B). #803 위에 스택되어 있으며 #803이 먼저 병합되어야 합니다. MAIN SETTLED 78d7c2b2와 #803 head 968f0d36의 실제 두 부모 merge를 포함합니다.

최신 완료 상태 (2026-10-23)

현재 HEAD는 0fd8679fbc528e62d81e35006bcf2aae1c470783, tree는 99fe3d264b19f2d1dd33984d8d0c74a67ddc6320입니다. 자체 CI 39925527829는 첫 시도에 SUCCESS이며, 필수 8개 job과 codecov/patch가 모두 성공했습니다. PR 조건상 실행하지 않는 main 전용 release/deploy만 정상 skip입니다. 아래 과거 실패·재현 기록은 경과 보존이며 현재 CI 결과와 구분합니다.

스택과 커버리지 보완

  • test: restore latest Bun coverage and preserve sparse values #803 head 968f0d36을 실제 merge e0b90106으로 통합했습니다. 부모는 ac26d073과 968f0d36 두 개이며 test: restore latest Bun coverage and preserve sparse values #803 자체는 변경하지 않았습니다. #803이 먼저 병합되어야 합니다.
  • main의 최신 Bun 커버리지 보완은 #803에서 상속하고, #802에 남은 build-session.ts:10–12와 reservation-inputs.ts:90–93만 각 owner seam의 행동 테스트로 커버했습니다. 상속 후 추가 커밋은 두 테스트 파일뿐이며 제품 소스 변경은 없습니다.
  • cold ownership은 실제 TypeScript source를 서로 다른 query 파일 경로로 native import합니다. 격리된 globalThis 별칭 shadow만 잠시 사용하며 실제 live ownership 객체를 지우거나 교체하지 않습니다. cold 초기값, 독립 모듈 평가, 중첩 시 active 출력 보존, 공유 세대 전이와 종료 멱등성, 원래 live 참조·snapshot·descriptor 복원을 단언합니다. 원본 canonical source LCOV에서 실제 initializer 행이 양수가 되는 것도 확인했습니다. preload 변경·가짜 AST·수동 LCOV 병합·coverage-only global reset은 없습니다.
  • HTML의 ENOENT/EISDIR/EACCES/EPERM/ENOTDIR 읽기 실패 후에도 해당 HTML은 watch 대상에 남고, 뒤의 실제 정상 HTML 모듈과 직접 JS 입력은 계속 발견하는 것을 검증합니다. 예상 밖 TypeError 전파 단언은 유지합니다.

최종 로컬 Gate

실행 root Vite 두 All files functions/lines
최종 서식 Bun 1.4.3 6,245 pass / 0 fail 868 pass / 0 fail 각각 100.00 / 100.00
최종 정확한 staged tree의 Bun 1.4.4 hook 6,245 pass / 0 fail 868 pass / 0 fail 각각 100.00 / 100.00

별도 merge hook 1회는 알려진 #802 소유 1.4.4 RED를 다음 커밋과 분리하기 위해 명시 승인된 공유 Bun 1.4.3으로 실행했으며 당시 root 6,244/Vite 863, 두 표 100/100이었습니다. 최종 테스트 커밋 hook 1회는 공식 SHA 검증한 private 최신 Bun 1.4.4+38afee6c8을 PATH에 두고 실행했습니다. 공유 설치는 1.4.3 그대로이며 버전 고정이나 CI 설정 변경은 없습니다.

최종 두 버전의 원본 LCOV·통과 수치와 정확한 테스트 파일 해시를 staged/committed tree에 연결해 대조한 뒤 정상 fast-forward push를 한 번 수행했습니다. source 128개/정상 artifact 7개, clean index/no MERGE_HEAD를 독립 확인했습니다. 기본 스택 stable Rust workspace test, fmt/clippy, fresh install/WASM/root build와 strict TypeScript 통과, lint 오류 0/기존 경고 20개입니다. LSP 미설치로 clean-LSP 결과는 주장하지 않습니다. 실제 source/published API의 cold 시작·중첩·종료·재시작과 실제 누락/디렉터리 HTML 입력도 별도 driver로 통과했습니다. gate review는 APPROVE/HIGH입니다.

제품 예산은 같은 frozen 기준과 명시적 parser rename으로 302 pure added / 77 removed (<320), raw 399/174 그대로입니다. #803에서 상속한 제품 파일은 그 PR head와 동일함을 확인했고 예산 기준을 바꾸지 않았습니다. 스타일링 런타임, 해시 클래스 이름, 의존성 추가, 커버리지 제외나 threshold 완화는 없습니다. 새로운 소스 빌드 오류 범주는 없습니다.

최신 Linux CI

실제 로그의 Bun은 **1.4.4 (38afee6c8)**입니다. root는 6,245 pass/0 fail, Vite는 867 pass/0 fail/Windows 전용 held-directory 정리 fixture 1 skip이며 두 All files는 모두 100.00/100.00입니다. 같은 fixture는 Windows 로컬에서 포함하여 868개가 통과했습니다. Linux Rust는 **100.00%(16602/16602)**입니다.

publish, benchmark, Next landing, React 18, packed release compatibility, webpack theme, RSC CSS, WASM size job과 Codecov patch가 성공했습니다. Vinext landing per-file/singleCss 모두 71 routes/0 skipped, 각 E2E 190 passed이고 별도 RSC fixture도 각 6 routes/0 skipped입니다. prerender skip 예외나 job 재실행은 사용하지 않았습니다. CI checkout merge ref b3245563의 부모가 main 78d7c2b2와 현재 HEAD이고 실제 tree도 99fe3d26으로 동일함을 GitHub commit API와 원본 benchmark artifact에서 확인했습니다.

benchmark의 9개 비교 모두 PASS, baseline/threshold 변경과 재실행 0회입니다. 아래는 같은 원본 3-sample artifact의 대표 행이며 서로 다른 run의 절대 시간을 성능 개선으로 해석하지 않습니다.

비교 row cold median tailwind-turbo 비율 build size 결과
stylex-turbo-devup-ui 6.20s 1.714x 25,308,021B PASS
devup-ui-collapse 3.76s 1.039x 25,876,200B PASS
devup-ui-single-turbo 3.86s 1.068x 29,910,493B PASS

single-turbo는 기존 기준 1.081x ±10% 이내입니다. row12는 여전히 미검증 0/20이고, main에서 확인한 HEAD preload 순서와 Windows mixed-preload fileMap은 후속 과제로 유지합니다. 이 cold-load unit test를 row12 native qualification이나 과거 FULL 60회/cold build 9회의 새 실행으로 표시하지 않습니다.

이전 구현 및 검증 기록

아래는 각 원래 HEAD에서 얻은 증거와 실패 경과를 그대로 보존한 기록입니다. 현재 완료 상태는 위 0fd8679f 및 run 39925527829 결과가 우선합니다.

요약

  • Vite의 물리 모듈 변환 순서와 무관하게 공유/파일별 클래스 슬롯을 예약하며 짧은 카운터 이름을 유지합니다. 콘텐츠 해시 클래스 이름이나 애플리케이션 스타일링 런타임을 추가하지 않습니다.
  • 기본 atomHoist는 물리 모듈 경계 2개이며 0은 비활성화합니다. singleCss 동작을 유지하고 HMR에서 이미 확정한 이름 이력을 재배치하지 않습니다.
  • serve 전용 추출 캐시로 동일 입력의 중복 추출을 줄입니다. 실제 CSS 텍스트가 달라지는 쓰기만 ?v= 개정값을 갱신하며 매 요청 시각이나 Vite가 제거하는 timestamp로 모듈 정체성을 만들지 않습니다.

동작

설정 상속 파일과 누락된 후보, 선택/가져온 Tailwind 입력, 실제 모듈 공급자와 해석 메타데이터를 추적합니다. 설정 갱신을 직렬화하고 이미 허용한 비동기 작업이 끝나기 전에 공유 엔진 소유권을 반환하지 않습니다. 중첩 소유 기간에는 캐시를 사용하지 않으며 인스턴스별 엔진 격리를 약속하지 않습니다.

캐시는 전체 변환 ID, 정확한 입력, 최신 물리 입력 정체성, 원래 준비 완료 세션, 실제 예약 current/prepared 개정값, 설정 세대, 공유 엔진 독점 소유 세대를 확인합니다. 세션 교체 이전의 연속 작업도 최신 입력 관측에 반영합니다. 히트도 현재 환경/ID의 의존성을 등록한 뒤 준비 완료를 기다립니다. CSS 스냅샷/RustOutput/쓰기 동작을 저장하거나 재실행하지 않고 실제 누적 시트에서 CSS를 읽으며 빌드에서는 캐시를 우회합니다.

물리 패키지 경계 탐색은 유효한 지배 패키지에서 멈추되 더 가까운 누락 package.json 후보와 실제 진입점 메타데이터는 유지합니다. 디렉터리 생성/삭제는 실제 예약을 무효화하며 JSON/CSS/CJS 전체 허용, 가짜 epoch, 이벤트 억제/재생은 없습니다. outside-native 테스트는 실제 Vite 수명주기와 backend registration observer barrier를 사용합니다. 공개 ready를 경로별 등록 완료로 간주하지 않으며 실제 등록 반환 뒤 관측기 신호만 완료합니다. 네이티브 all 이벤트와 비동기 HMR 완료도 구분합니다.

새로 생기는 오류

새로운 소스 빌드 오류 범주는 없습니다. 기존 위치 정보와 빌드 시점 오류 정책을 유지합니다.

남는 한계

  • 설치된 node_modules 패키지 수정은 새 빌드/개발 서버 재시작으로 반영합니다. node_modules 밖에 연결된 입력의 live HMR과 구분합니다.
  • 추가 캐시 PENDING/COMPLETED native control인 **row12는 미검증이며 20개 후보 중 통과 0개(실제 후보 실행 0개)**입니다. 고정 시간 내 생성 바이트 준비가 import-qualified guard 검사에서 실패했고 정상/negative native arm은 시작하지 않았습니다. Oracle가 확인한 일곱 harness blocker는 생성 seam/소비 번들 해시·live identity, 원본 assertion collect-all 누락, CSS write·잔여 tuple 비교 누락, OUTPUT RED의 이벤트 시점·단언 집계, barrier census 판정, candidate raw tuple·공유 STOP 누락, one-time negative 중복 실행입니다. 이는 제품 버그나 통과 결과가 아니며, PR B 이후 별도 qualification으로 남깁니다. 나머지는 아래 원본 FULL 60회와 cold build 9회로 검증했습니다.
  • 과거 uncached reference AB 정지는 이후 진단 1회 완료로 원인이 반증되거나 수정되었다고 주장하지 않습니다. 이전 V2는 두 nominal reference 완료와 negative count 실패가 있었으나 생성 번들이 둘 다 정상 lookup/guard여서 uncached/guard RED가 아니었습니다. 추가 추출이 supplier였고 A 추출은 변하지 않았다는 보정도 유지합니다.
  • Windows에서 실제 Bun preload와 Vite가 한 프로세스를 공유하면 같은 물리 파일에 역슬래시/POSIX fileMap 키가 함께 생기는 기존 main 버그가 확인되었습니다. 실제 main 770aaac5의 RED는 exclusive POSIX A=0 대비 mixed native A=0/POSIX A=1이며 code/map/full CSS/classMap 비교는 같았습니다. 렌더링 오류나 지연 개선으로 확대 해석하지 않고 PR B 이후 main 기반 수정 PR로 분리합니다.
  • raw page는 1/9 동일이며 전체 dist 9/9 동일을 주장하지 않습니다. 7개 component route의 html/txt 14경로에서 Flight 직렬화 순서/ID/참조가 달랐고 select에는 실제 HEAD modulepreload 순서 차이도 있었습니다. Flight 밖의 body/style 내용은 같았습니다. settled main 78d7c2b2의 별도 shimmed cold build 첫 2회에서도 select의 Radio/Checkbox 참조와 실제 HEAD preload 순서가 뒤바뀌었습니다. main은 청크명/manifest도 달라 순수 동일-tag 집합이라고 주장하지 않습니다. 직접 emitter는 @vitejs/plugin-rsc@0.5.38/dist/shared-DH8gaClP.js:81의 preload 호출이며 React DOM react-dom-server.edge.production.js:7330이 삽입 순서로 HEAD에 출력합니다. Vinext/plugin-rsc/React 통합의 기존 비결정성은 main 기반 후속 과제로 기록했고 PR B에 섞지 않았습니다.

커버리지 구성

Rust 뒤 root와 Vite 두 Bun lane을 순서대로 실행하며 각각 명시적으로 --coverage를 전달합니다. 각 lane은 새 보고서 디렉터리를 쓰고 Codecov에 두 LCOV를 전달합니다. Bun styling preload가 Vite source 테스트의 엔진 소유권/캐시 전제에 섞이지 않도록 발견 범위를 나누며 source 커버리지 제외는 추가하지 않습니다. main의 globals-first root preload와 pkg/dist 산출물 전용 ignore를 유지하고 공통 matrix globals만 중립 모듈로 분리했습니다.

두 설정의 coverageThreshold = { lines = 1.0, functions = 1.0, statements = 1.0 }와 도달 가능한 --config 설정 검사를 유지합니다. 현재 Bun은 functions/lines를 실제 강제하지만 statements 키는 강제하지 않는 upstream 한계가 있어 statement 100% 수치는 주장하지 않습니다. Changepack은 관리 대상 packages/bindings의 package.json만 포함하며 모두 Patch입니다.

검증

  • 제품/native qualification 커밋 fa7aef2da308a891fec2cb690f82100c0f130667, tree 39a209efdd09cc9f842a2ebe9c5bb70e0d67c4d4, 부모 d57f9c3c와 78d7c2b2. 정확한 staged tree의 정상 merge hook 1회 통과. root 6051 pass/0 fail, Vite 849 pass/0 fail, 두 All files functions/lines 모두 100.00/100.00. 로컬 Windows Rust 97.99%(23411/23892)는 Linux CI 100%를 대신하지 않습니다.
  • 동일 커밋의 원본 FULL 60회, 매번 24 pass/0 fail, mismatch/stall/other 0. 원본 native 14파일과 source/artifact 212개 해시 유지, 재시도/폐기/보충 stimulus preload 없음.
  • 실제 cold build 9회 모두 성공, 각 618 추출/610 물리 추출/181 keyed record, 잔여 슬롯/API 오류 0. CSS·JS·filename+input keyed code/map/cssFile/dependencies는 9/9 동일. 관측 키에 환경/옵션을 추가한 증거라고 확대하지 않으며 raw page 결과는 위와 구분합니다. Vinext 1.3.0 prerender 검증을 실행했고 skip/rerun 예외는 없습니다.
  • 최종 트리 브라우저 QA: max-width 1439px HMR, primary RGB 255→254 테마 이동/재로드, pageerror 0, desktop 1365×900/mobile 390×844, 입력/산출물 복원 및 프로세스 종료 확인. 이 단일 표본의 추출은 startup 66개 모듈/66회, 편집 1회, 테마/재로드 각 0회입니다. 별도의 과거 동일 입력 paired 비교는 145→66회, 편집 2→1회였으며 새로운 paired latency나 빌드 시간 개선 주장은 아닙니다.
  • 기본 스택 stable Rust workspace test/clippy, fresh install/WASM/root build, strict test TypeScript 통과. lint 오류 0, 기존 경고 20개. LSP는 설치되지 않아 별도 LSP clean 결과를 주장하지 않습니다. 최종 source 113개/정상 artifact 7개 해시와 clean index/no MERGE_HEAD를 독립 재검증했습니다.

실제 WASM 출력 예시:

// 입력
import { Box } from '@devup-ui/react'; export const Example = () => <Box color='red' w='$probe' p={2} />
// 출력
import "./styles/devup-ui.css";
export const Example = () => <div className="a b c" />;
/*! devup-ui v1.0.83, | Apache License 2.0 | https://devup-ui.com */@layer t;@layer t{:root{--probe:11px}}.a{color:red}.c{padding:8px}.b{width:var(--probe)}

최종 gate review는 APPROVE/HIGH이며 제품/local gate 범위입니다. fa7aef2da308a891fec2cb690f82100c0f130667를 정상 fast-forward push했고 직후 context는 2026-10-22 07:51:33Z 기준 302.1K로 측정했습니다.

격리 이전 CI HEAD는 accb5f80d1f64677d1111b201ccbc7b35c00b79f이며 부모는 위 제품 커밋입니다. 변경은 e2e/landing-zero-runtime.spec.ts 한 파일뿐입니다. 실제 CI trace의 ak-a~ak-f가 기존 한 글자 파일 prefix 가정에서 거부되는 것을 확인하고, 임의의 문자열 길이 완화 대신 27/37 알파벳·정규 ad escape·WASM32 카운터 범위로 인식하게 고쳤습니다. 두 >1 단언, typography 예외와 독립 runtime 검사는 유지합니다. 같은 실제 출력에서 수정 전 Chromium RED, 수정 후 zero-runtime E2E 6 pass/0 fail, strict TypeScript와 lint 통과. 잘못된 기존 Window cast도 같은 검사 의미로 제거했습니다. 정상 hook은 root 6051/0, Vite 849/0, 두 표 100.00/100.00으로 통과했습니다. 원래 113파일/7artifact 해시는 모두 같고 추가 테스트를 포함한 114/7 custody는 clean입니다. 이 test-only 변경으로 제품 예산이나 60/nine 결과를 바꾸지 않습니다. 정상 push 직후 context는 2026-10-22 08:45:32Z 기준 415.5K입니다.

자체 CI 상태 (파서 격리 이전 기록)

첫 자체 run 39743564528의 실제 로그에서 Linux Rust **100.00%(16602/16602)**와 root/Vite All files 100.00/100.00을 확인했습니다. Vinext는 71 routes/0 skipped였습니다. 단일 E2E prefix 검사 실패(189개 나머지 통과)는 위 test-only 수정으로 대응했습니다. benchmark는 두 turbo output-size 비교에서 실패했고 허용된 해당 job 1회 재실행도 실패했습니다. 재실행의 stylex-turbo-devup-ui는 25,590,816B >25,551,940B, collapse는 26,145,281B >26,127,024B였으며 single-turbo 시간 비율도 1.245x로 기준 1.081x+10%를 넘었습니다. 실패를 runner noise로 단정하거나 baseline/threshold를 변경하지 않았고 추가 job 재시도도 하지 않았습니다.

test-only 새 HEAD의 정상 run 39750171304은 publish와 나머지 필수 job이 성공했고 benchmark 비교만 실패했습니다. 새 로그의 Linux Rust는 100.00%(16602/16602), root는 6051 pass/0 fail, Vite는 848 pass/0 fail/Windows 전용 fixture 1 skip이며 두 All files는 100.00/100.00입니다. Windows 로컬에서는 해당 fixture까지 849/0으로 통과했습니다. Vinext per-file/singleCss 모두 71 routes/0 skipped, 각 실제 E2E는 190 pass였습니다. Next landing, React 18, packed release compatibility, webpack theme, RSC CSS, WASM size job도 성공했습니다. main push 전용 release/deploy는 PR 조건에 따라 실행하지 않습니다.

새 benchmark의 single-turbo는 6.04s/1.075x로 기준 1.081x+10% 안에 돌아와 별도 runner timing 비교 조건은 성립하지 않습니다. 남은 실패는 stylex-turbo-devup-ui 25,586,352B >25,551,940B와 collapse 26,129,495B >26,127,024B 두 output-size 비교입니다. 따라서 전체 CI 결론은 여전히 failure이며 green으로 표현하지 않습니다. 이후 아래 Vite 전용 parser 격리를 적용했으며, 이 문단은 격리 이전 run의 보존 기록입니다. baseline/threshold는 변경하지 않습니다.

출력 크기 원인 (격리 이전 대조)

허용된 bounded attribution으로 main 78d7c2b2와 현재 PR의 두 fixture를 정상 cold build로 각 1회, 총 4회 빌드했습니다. 매 진입 실제 9GiB 이상 여유 메모리, 직렬 실행, 6GB watchdog, 성공한 소유 프로세스 종료와 원본 복원을 확인했습니다. 로컬 .next 크기는 stylex 25,248,632→25,542,977B(+294,345B), collapse **25,823,357→26,073,511B(+250,154B)**였습니다. 이는 CI 측정 대체나 로컬 시간 개선 주장이 아닙니다.

원본 716파일을 길이/SHA로 확인하고 CSS/JS를 파일별로 비교한 결과 브라우저 CSS/JS, application-server/build-worker chunk와 31개 emitted map은 동일합니다. stylex 증가는 Turbopack persistent cache +294,265B와 경로 metadata +80B, collapse는 cache +249,484B, TypeScript build-info +589B, 경로 metadata +80B, trace +1B입니다. JavaScript 중 크기가 늘어난 것은 절대 경로 설정을 담는 required-server-files.js의 fixture별 +40B이며 사용자 코드 증가는 아닙니다.

shared plugin-utils의 HTML physical entry 발견용 htmlReservationEntries export가 await import('parse5')를 포함하여 Next/Turbopack의 build-tool dependency/cache graph에 parse5를 추가하는 경로를 확인했습니다. 보존한 SST frame을 메모리에서 해제한 실제 기록에도 parser 경로와 해당 export가 나타납니다. parser는 emitted browser/server/build-worker chunk나 map에는 추가되지 않았습니다. 압축 cache delta 전부를 parse5 단독 payload로 배분하는 것은 packing/경로 차이와 분리해 입증하지 못했으므로 그런 수치는 주장하지 않습니다. HTML을 파싱하지 않는 loader/plugin graph에서 이 비용을 제거하도록 parser를 Vite 전용 모듈/의존성 경계로 옮기는 수정이 승인되었습니다. Vite 동작과 출력, 두 lane 커버리지를 보존하는 격리 구현과 검증은 아래 최신 결과로 구분합니다. baseline/threshold 변경이나 CI 통과 주장은 없습니다.

Vite 전용 파서 격리 (ac26d07 기록)

파서 격리 당시 HEAD는 ac26d0738e2f253159a21f198280db8f69f6a893, tree cd093009ecf429258ead094fae92104fc105d766입니다. HTML을 해석하지 않는 Next/webpack/Rsbuild/Bun의 plugin·loader graph가 shared barrel의 htmlReservationEntries를 통해 비동기 parse5 graph를 분석하는 비용이 원인이었습니다. HTML parser를 Vite의 private 모듈로 옮기고 shared export를 제거했으며 기존 parse5 ^8.0.1 의존성의 소유 패키지만 Vite로 이동했습니다. 새 의존성/버전 고정/스타일링 런타임은 없습니다. 두 공개 모듈 형식 모두 실제 await import('parse5')를 유지하며 shared 산출물과 선언 graph에서는 parser가 사라집니다.

비-Vite 제품 source/loader 전체에서 value import·reexport·dynamic import를 추적하는 회귀 검사를 먼저 실행해 4개 모두 shared parser 도달로 RED를 확인한 뒤 4/0 GREEN으로 전환했습니다. 기존 HTML 단언과 CJS/ESM 공개 hook 검사는 Vite로 이동했고 실제 parser await 전/후의 native 수명·소유권 단언은 private in-memory emitted-test binding으로 유지했습니다. 제품 test hook, 가짜 epoch/event, 단언 완화는 없습니다. 실제 예약 본문은 import 이외 바이트 동일하며 parser의 유일한 계산 변경은 같은 parseImports 결과의 projection 배열을 루프에 옮긴 것입니다.

frozen 기준 제품 예산은 명시적 parser rename 대응을 적용한 **302 pure added / 77 removed (<320)**입니다. 경로만 비교한 raw 399/174도 숨기지 않습니다. 원래 parser 100 pure lines 중 97개를 보존한 이동이며 새 구현은 3/3입니다. 정상 hook 1회가 정확한 staged tree에서 통과했고 root 6041/0, Vite 863/0, 두 All files 100.00/100.00입니다. Windows Rust 97.99%는 Linux 결과를 대신하지 않습니다. source 116개/정상 artifact 7개 custody, strict TypeScript, lint 0 errors/기존 20 warnings, 실제 native HTML matrix 24 tests와 공개 CJS/ESM/비동기 barrier 검사가 통과했습니다. LSP 미설치 상태는 그대로 명시합니다. 최종 local gate review는 APPROVE/HIGH이며 아직 실행되지 않은 CI를 면제한 것이 아닙니다.

동일한 정상 cold build의 로컬 결과:

fixture main 격리 전 PR 격리 후 PR
stylex 25,248,632B 25,542,977B 25,222,411B
collapse 25,823,357B 26,073,511B 25,835,695B

원본 1,074파일을 길이/SHA로 대조했고, 브라우저 CSS/JS·application-server/build-worker·map·df CSS 147파일은 main/이전 PR/새 PR 모두 바이트 동일합니다. 남은 main 대비 차이는 stylex -26,221B = cache -26,304 + 경로 metadata 80 + trace 3, collapse +12,338B = cache 11,758 + TypeScript bookkeeping 479 + 경로 metadata 80 + trace 21로 전부 분할했습니다. TypeScript의 추가 선언은 reservation-graph.d.ts 하나이고 HTML 선언은 없습니다. 2,523/2,583개의 보존 Zstd frame에서 실제 parse5 parser-module 경로는 0개입니다. parse5 이름이 남은 fixture별 3개 frame은 node_modules 디렉터리 목록이며 parser module graph라고 주장하지 않습니다. 압축 cache delta를 parser 단독 payload로 배분하거나 전체 dist 동일/새 시간 개선으로 확대하지 않습니다.

이전 자체 CI (ac26d07 기록)

정상 push 후 run 39765794551의 benchmark 9개 비교가 모두 PASS입니다. 같은 gate와 baseline을 그대로 사용했고 재시도하지 않았습니다. 이전 run39750171304의 stylex 25,586,352→25,301,396B, collapse 26,129,495→25,869,977B로 크기 실패가 해소되었습니다.

비교 row 3회 cold median tailwind-turbo 비율 build size 결과
stylex-turbo-devup-ui 6.72s 1.435x 25,301,396B PASS
devup-ui-collapse 4.82s 1.030x 25,869,977B PASS
devup-ui-single-turbo 5.00s 1.067x 29,927,685B PASS

single-turbo는 기준 1.081x ±10% 이내입니다. Linux Rust는 실제 **100.00%(16602/16602)**이며 benchmark 외 Next landing/React18/release compatibility/RSC CSS/webpack theme/WASM size job도 성공했습니다. 그러나 publish의 root Bun은 6041 pass/0 fail, functions100.00/lines99.76로 커버리지 gate가 실패하여 이 run의 Vite/landing 단계는 실행되지 않았습니다. 따라서 전체 CI는 여전히 failure이며 green으로 표시하지 않습니다. Windows의 정상 hook 두 lane100과 다른 이 Linux 커버리지 차이의 원인을 확인 중이며 threshold/coverage 제외를 바꾸지 않고 해결 후 최신 결과로 갱신합니다. 새 소스 빌드 오류 범주는 없고 row12 미검증0/20 및 기존 main 후속 과제의 범위/표현은 위 기록 그대로입니다.

Bun 1.4.4 최초 전환 검증 (이전 RED)

Bun 1.4.4+38afee6c8이 이번 작업 도중인 2026-10-22 10:11:32Z에 배포되었습니다. 앞서 통과한 정상 로컬 hook은 1.4.3+c6da4a4d3이며 새 CI는 latest인 1.4.4를 사용했습니다. CI merge ref 46563068의 실제 tree는 현재 HEAD와 동일하고 부모도 main 78d7c2b2와 ac26d073이므로 다른 소스를 검사한 결과가 아닙니다.

공식 latest Windows binary를 release의 SHA-256과 대조하여 별도 경로에 설치하고, 같은 커밋·source116개·artifact7개를 유지한 채 재현했습니다. 1.4.4에서는 Windows도 root 6041/0, functions100.00/lines99.76, Vite 863/0, functions100.00/lines99.65입니다. root의 10파일 32개 라인과 Vite reservation-inputs.ts:90–93의 실제 DA:0 LCOV를 보존했습니다. 따라서 Linux 전용 현상으로 단정하거나 Bun reporter 버그로 확정하지 않습니다. 최신 도구가 드러낸 실제 입력별 테스트 누락과 불가능한 조건을 구분해 확인하는 후속 단위가 필요하며, 아직 수정·100% 통과로 표시하지 않습니다. 이전 버전 고정, 커버리지 제외나 threshold 변경은 하지 않았고 parser 격리 및 benchmark PASS 결과와도 구분합니다.

owjs3901 and others added 8 commits October 18, 2026 18:47
Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…oundaries

Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
… changes

Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@codecov

codecov Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

Files with missing lines Coverage Δ
bun.matrix.ts 100.00% <100.00%> (ø)
bun.setup.ts 100.00% <100.00%> (ø)
...plugin/src/rules/no-useless-tailing-nulls/index.ts 100.00% <100.00%> (ø)
packages/plugin-utils/src/build-session.ts 100.00% <100.00%> (ø)
packages/plugin-utils/src/import-graph.ts 100.00% <100.00%> (ø)
packages/plugin-utils/src/index.ts 100.00% <100.00%> (ø)
packages/plugin-utils/src/load-config.ts 100.00% <100.00%> (ø)
packages/plugin-utils/src/reservation-discovery.ts 100.00% <100.00%> (ø)
packages/plugin-utils/src/reservation-graph.ts 100.00% <100.00%> (ø)
packages/plugin-utils/src/shared-slots.ts 100.00% <100.00%> (ø)
... and 12 more

... and 79 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

owjs3901 and others added 3 commits October 22, 2026 19:34
Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #683

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #683

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
owjs3901 and others added 3 commits October 23, 2026 14:57
Refs #683

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Refs #694

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@owjs3901
owjs3901 merged commit 2c24b28 into main Oct 23, 2026
11 checks passed
@owjs3901
owjs3901 deleted the fix/order-independent-vite-slots branch October 23, 2026 11:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant