Skip to content

fix(extractor): stabilize names across build environments - #764

Draft
owjs3901 wants to merge 24 commits into
mainfrom
fix/environment-stable-names
Draft

owjs3901 wants to merge 24 commits into
mainfrom
fix/environment-stable-names

Conversation

@owjs3901

@owjs3901 owjs3901 commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

Refs #694 (G: 환경 및 컴파일러 처리 순서와 무관한 클래스·동적 변수 이름). #751(aaab756) 위에 쌓았으며 #743을 포함한 #751이 먼저 병합되어야 합니다. Base는 main이며 자동 병합하지 않습니다.

요약

환경마다 import 값이 정상적으로 달라도 프로그램을 계속 컴파일하면서 이름과 최종 CSS/JS를 처리 순서에 독립적으로 만듭니다. 환경 간 사전 수집, resolver 의미 변경, 새 의존성 또는 styling runtime은 없습니다. ce6296e0은 static/scope/naming-root/원본 counter/cache v4를 함께 검증한 커밋이고, a9c804a3은 동적 typography와 class-only 평가 순서를 별도로 고친 커밋입니다. 두 커밋 모두 격리된 전체 트리의 실제 hooks를 통과하고 푸시했습니다. 후속 135d0aacd0d4106d5b54373f1b0ba02854757c47은 styled 생성 시점 수정과 기존33 coverage 파일의 보존·수리 union을 포함한47 whole-file 단위이며 실제 hooks(CI unset)를 통과하고 푸시했습니다. 이 과거 head의 Linux coverage는99.85%로 실패했습니다. 현재 committed/pushed head는 f317421be26bcfc68da7c3e89e8fb3fa0381a410, 실제 hook-tested tree는 **b6e0380f42febd74024b4d39d4550f8fc031c09f**입니다. 승인된 argument-spread 정책과 coverage 수정17 paths가 완료됐고 해당 head의 실제 Linux coverage100.00% 및 CI4 jobs가 모두 성공했습니다. 크기·적격성 감사는 INCOMPLETE / BLOCKED이며 PR764는 DRAFT를 유지합니다. 이 문안은 release/ready 승인이나 감사 완료 선언이 아닙니다.

동작

  • 파일 자체의 소스와 테마, 같은 파일 안에서 닫힌 initializer chain으로 CSS 내용·존재가 결정되는 Own atom은 원본 D9 파일의 짧은 counter를 씁니다. Named/default/namespace/re-export/require/dynamic import에 의존하는 값·스타일 선택 조건·selector·key·spread·반응형 형태/길이는 Risky content 이름이며 counter slot을 쓰지 않습니다. 같은 내용이어도 Own/Risky identity를 합치지 않습니다. Devup package 경계는 정확한 이름 또는 / subpath이며 lookalike는 외부 import입니다.
  • Canonical bucket에 여러 원본 파일이 합쳐져도 CounterOwner는 원본 D9 identity를 유지합니다. 번호 없는 원본이 번호 있는 canonical root의 counter를 빌리지 않습니다. Class allocation과 registry가 같은 owner/eligibility 규칙을 사용하며 진단 위치는 identity에 영향을 주지 않습니다.
  • Content 이름은 실제 effective 선언/selector/at-rule/breakpoint/order/layer 및 keyframes 순서의 내용만으로 정합니다. <O|R|K><L|H><payload>에서 L은 lossless, H는 dependency-free 고정 SHA-256 앞 80 bits의 16자리 padded base-37입니다. 더 짧은 이름을 고르고 동률은 L입니다. 두 문법은 겹치지 않으며 fingerprint claim은 전체 descriptor를 정확히 비교합니다. Native/WASM golden 및 production-default 80, 좁은 폭의 실제 충돌 회귀가 있습니다.
  • Birthday bound는 n(n-1)/(2*2^80)입니다. 백만 이름에서 약 4.14e-13, 1,150개에서 약 5.46e-19이며 72-bit 백만 이름은 약 1.06e-10입니다. 확률로 정확성을 대신하지 않습니다. 실제 서로 다른 descriptor가 같은 이름을 가지면 빌드가 실패합니다.
  • Content naming은 이름만 바꾸며 #751의 CSS sheet placement, 전달 횟수와 cascade를 바꾸지 않습니다. Per-file atom은 <prefix><D9-base37>-<O|R><L|H>… 또는 <prefix><F><L|H>…-<O|R><L|H>…로 구분됩니다. Unprefixed 공유 이름은 이미 한 sheet로 전달되는 order0 base, singleCss, hoisted sheet 및 keyframes에만 씁니다. Specificity bump, breakpoint cascade layer, runtime ordering은 없습니다. 새 atom grammar의 길이는 prefix+27(D9) / prefix+37(비번호), 기존 anti-ad splice를 포함합니다.
  • setNamingRoot(root, relative_base?)는 WASM의 이름 전용 입력입니다. Vite root, webpack/Rspack context와 기존 cwd-relative ID basis, Rsbuild root, Next project cwd(각 compiler/loader), Bun root를 추출 전에 전달합니다. 같은 build의 환경들은 같은 root를 씁니다. Resolver/extraction/canonical/route key, placement, D9 API는 바꾸지 않으며 reset은 이 입력을 지웁니다. 비번호 file key는 project-relative forward slash이고 외부 파일의 ../를 유지합니다. 새 scope claim은 root 절대경로 대신 이 key를 저장합니다.
  • 런타임 값의 CSS 변수는 content 이름이 아닙니다. 문법은 ---<prefix>S(<D9-base37>|UL<escaped-normalized-source>|UH<16-base37>)-<position-base37>[-<nonzero-role-base37>]입니다. File part는 최대18 ASCII bytes, 전체는 prefix+50(native64)/+38(wasm32), role0은 +36/+30입니다. 숫자 alphabet과 separator/domain 문법은 겹치지 않으며 theme 변수와도 분리됩니다.
  • Source position은 Devup이 받은 소스의 offset에서 자체 prelude, 선행 BOM 하나와 이전 CR만 뺀 값입니다. Upstream source map으로 바꾸지 않습니다. LF/CRLF/BOM의 전체 출력이 같습니다. 같은 소스 텍스트와 테마/이름 설정을 받는 환경에서는 이름이 같고, 편집으로 site가 이동하면 dev 이름은 바뀔 수 있습니다. 비번호 source fingerprint에는 전체 정규화 source claim을 먼저 검사합니다.
  • 생성 변수는 요소 자신의 dynamic class에 unconditional initial reset 하나를 둡니다. Plain base rule에 합치거나 별도 plain rule로 내며 pseudo-element/descendant 소비자 또는 media/hover 조건 안에만 reset하지 않습니다. Theme 변수는 reset하지 않습니다. 같은 site/다른 site의 중첩, 상속 property, pseudo/descendant, responsive/hover 소비자가 Chromium gate에 포함됩니다.
  • Version4 exportSheet는 claims, class/file map, original IDs, atom plan을 포함하는 self-contained snapshot이며 유일한 restore authority입니다. Companion map은 스스로 state를 추가하지 않습니다. 버전 누락/이전 버전/해독 불가/구조 오류/companion 불일치는 전체 cache miss로 cold와 같은 출력으로 다시 씁니다. Reset-consumer proof, dense allocator와 선언/slot/source 대응을 검사하고 rollback은 fresh seed 호출 순서까지 보존합니다. 유효한 현재 claim의 실제 충돌만 located sticky 오류이며 reset까지 유지됩니다. 실제 main cache, 보존한 landing4 파일, WASM에 도달한 truncated 값 및 양쪽 restore 순서를 검증했습니다.
  • 평가가 없는 literal/local-constant/theme 배열은 #751처럼 static className으로 컴파일하며 불필요한 tuple/IIFE를 만들지 않습니다. 평가가 있는 표현식만 source의 순서·횟수·lazy branch를 유지합니다. Import된 JSX render condition이 양쪽 potential element의 추출을 바꾸지 않으면 그 아래 literal atom은 Own을 유지합니다. 실제 true/false/unresolved provider 모두 같은 CSS/class를 만드는 회귀가 있습니다.
  • 동적 typography의 identifier/member/computed/call/conditional 및 className 앞/뒤 위치는 한 번 평가한 typo class selection입니다. CSS 변수나 typography: 선언으로 내리지 않습니다. Responsive/scoped preset, positioning의 조건부 styleOrder, template coercion와 기존 spread-after 계약을 유지합니다. Body14px/heading24px의 실제 서로 다른 선언으로 선택/범위 assertions를 유지하고 226 native 및 92 fresh-WASM 회귀를 검증했습니다.
  • 기존 a && b style guard는 controller가 false/null/undefined/0/빈 문자열/NaN이면 스타일 없음입니다. a는 한 번, b는 실행하지 않습니다. a=0에서 일반 JavaScript가 0을 반환하는 것과 다른 기존 convention을 명시합니다.

W31j: styled 생성 시점 수정(별도 항목)

  • 변경하지 않은 기존 회귀의 실제 결과 [0,2,true]를 요구된 [1,1,true]로 고쳤습니다. Whole styled argument는 생성 시점에 한 번 바인딩하고 선택된 packet의 class/style projections를 재사용합니다. 반복 render에서 getter를 다시 읽지 않으며 conditional/logical의 선택하지 않은 branch는 실행하지 않습니다. Source field order와 호출 횟수를 보존합니다.
  • Attrs로 component를 먼저 감싼 뒤 creation capture를 그 바깥에 둡니다. Base binding은 그보다 바깥에서 rule 평가 전에 실행됩니다. Authored attrs/template callbacks는 여전히 render 시점이며 일반 JSX의 per-render ownership과 css()의 per-call 평가는 그대로입니다. Supported computed-member composition, 동적 변수/typography 선택, nested selector/layer 및 alternate order를 함께 보존합니다. 임의 runtime rule-object grammar나 styling runtime을 추가하지 않았습니다.
  • S1은 whole conditional typography의 한/두 항목 배열에서 index0 Typography와 source-owned empty-record consumer를 잃지 않도록 shared array seam을 고쳤습니다. Primary/alternate slot이 같은 원래 operand를 사용합니다. S2는 responsive/scoped typography를 default order로 미리 평탄화하지 않고 실제 styleOrder에서 class를 생성합니다. ClassName 앞/뒤, 직접/조건부 배열, JSX 및 runtime JSX-call의 두 visitor 경로에서 whole operand 읽기·순서·lazy 선택을 보존합니다.
  • Lean literal lookup은 두 증명을 모두 만족할 때만 scalar projection입니다: IR은 재귀적 base Typography/StaticArray/Conditional/Member로 order-invariant여야 하고, source projection은 controller/key의 canonical AST와 inert literal-table 생산을 보존해야 합니다. Observable table getter/call, computed key/spread/method/accessor 또는 folded inner read를 지울 수 없으면 기존 typed packet을 유지합니다. 따라서 기존 두 lookup snapshot에 불필요한 tuple/empty inline style을 넣지 않습니다.
  • 당시 S1/S2 최종 native styled170/0(기존128+새 lean42), typography226/0, assignment296/0, source121/0를 검증했습니다. Lean42에는 실제 수정 전 own-style 실패32개, 선택하지 않은 table field의 authored order, nested lookup 및 folded-inner-read 반례가 포함됩니다. 실제 public95/0는 원래21+S1 배열8+S2 독립 choice/order/topology64+selected throw2이며 생성 class를 실제 order/breakpoint/selector와14px/24px 선언에 연결해 검증했습니다. Public 최초 실패는 기존 sheet의 layert/default order255에 대한 새 observer 기대 오류였고, TEMP observer만 수정했습니다. Timing/count/reset/association 기대는 약화하지 않았습니다.
  • 역사적 S1/S2 보존 기록: 그 단계에서 보호한118 Rust bodies, 그 밖의 기존 apply_var_typography-5/extract_style_props_with_class_name-9 두 bodies와 Textarea5 bodies는 변경하지 않았습니다. 거절된 두 candidates와 원래 red 로그를 보존했으며 당시 새 snapshot 수락이나 fixture 삭제는 없었습니다. W31j-S1-S2-final.md, W31j-oracle-delta-approve.md 및 parent의 fresh public/application receipts가 각각 native/검토/실행 근거입니다. 현재 ledger는118 unchanged가 아니라117 unchanged + 승인된1 replacement입니다(아래 W31k 항목).

새로 생기는 오류

  • 서로 다른 content/source/scope descriptor가 같은 fingerprint 이름이면 sheet mutation 전에 오류입니다. 양쪽 전체 내용과 수정 방법을 출력하며 위치는 exact source witness → 사용자가 작성한 가장 바깥 생산 호출의 실제 Boa 위치(produced by the call at file:line:col) → stylesheet 파일/export binding(position unavailable) 순서입니다. 생성 코드나 추측 좌표를 출력하지 않습니다.
  • 하나의 sparse role에 다른 assignment가 들어오면 실제 위치/표현식을 포함한 identity 오류입니다. 환경별 합법적 값 차이는 오류가 아닙니다. 이전/손상 cache 자체는 새 빌드 오류가 아니며 cold로 재생성됩니다. 새 JavaScript wrapper는 없습니다.
  • 새 승인 정책 — IMPLEMENTED / 검증 완료: styled와 css 모두 operand가 statically composable literal array가 아닌 argument spread(문자열/다른 iterable/unknown/정적으로 합성 불가능한 literal array)를 기존 located uncomposable-style build error로 거절합니다. 오류 끝의 수정 안내는 ; pass the value itself instead of spreading it입니다. Iterator를 실행하지 않으며 정적으로 합성 가능한 literal-array spread와 기존 source-order positive controls는 유지합니다. 이는 fix(extractor): preserve JavaScript semantics across values and element calls #756 JSX spread와 별개입니다. 135d0aac의 fresh 실제 probe에서 styled.div(...'color:red;')와 css(...'color:red;')가 문자열 전체를 하나로 취급해 잘못된 .OLcolor-vred{color:red} CSS를 냈던 red를 보존합니다. 실제 JavaScript 인수는 ['c','o','l','o','r',':','r','e','d',';']10개였습니다(W31j-string-spread-actual.log). 현재 shared style_arguments/reads_directly seam과 양쪽 caller가 이를 거절하며, 네 원래 invalid object-spread sources는 각각 located negative control로 유지했습니다. Native 반례/수정 근거는 W31k-binding-review.md와 coverage2 native-final입니다. Parent fresh SDK W31k-spread-public.log는8/8 PASS: 양쪽 API의 string/iterable/unknown6 located errors, styled array getter의 creation-once/two-render 및 static CSS positive2를 실제 검증했습니다.

남는 한계

  • fix(extractor): preserve JavaScript semantics across values and element calls #756 unknown spread의 explicit/undefined/style/className precedence, JSX-02 fallback 및 spread-only w={({...theme.more})[key]}는 여기서 구현하거나 테스트하지 않습니다. Supported overwritten-key 경로는 유지하며 두 PR 병합 후 결합 gate가 필요합니다.
  • #750이 고치는 inherited lexical shadowing, fix(extractor): locate diagnostics and enforce deterministic evaluation #757 lookalike package의 end-to-end constant inlining은 별도 스택입니다. Unknown call로 탈출한 객체를 잘못 constant-fold하는 inherited 문제도 별도 수정으로 이관합니다. 보존한 escaped-fold15 회귀는 이 inherited 한계를 해결했다는 주장이 아닙니다.
  • 다른 drive/filesystem root의 파일은 normalized absolute key로 fallback하므로 그 경우 checkout-independent 상대 key를 보장하지 않습니다. 관찰 불가능한 eval/callback은 module/export 위치만 보고하며 위치를 얻으려고 코드를 추가 실행하지 않습니다.
  • Plugin/loader가 WASM 호출 전에 JSON.parse에 실패한 파일은 main의 기존 JSON 오류를 유지합니다. Atomic cache write/parse-as-absent는 fix(plugin-core): align bundler resolution, roots and WASM diagnostics #755/fix(next-plugin): isolate coordinator sessions and enforce complete CSS #752 follow-up입니다. 일반 authored .js를 제외하는 Bun filter는 inherited fix(plugin-core): align bundler resolution, roots and WASM diagnostics #755/W20e 한계이며 이 PR에서 바꾸지 않습니다.
  • #755와 #752가 같은 plugin 파일을 바꾸므로 나중에 병합되는 쪽이 setNamingRoot call site를 reconcile해야 합니다. Vite fix(vite-plugin): keep server page css dependencies in vinext/RSC builds #747 보호 영역은 origin/main과 byte-identical입니다.
  • Next16.3.6 webpack은 Devup 없는 ordinary-CSS control에서도 absolute config/appDir/route paths와 path-derived module IDs/chunk hashes를 넣으므로 두 checkout의 전체 bundle byte equality는 성립하지 않습니다. 승인된 gate는 모든 Devup CSS, 모든 post-loader user module source, 모든 route server HTML의 class/CSS-variable 이름이 byte-identical이며 same-physical-roots control보다 추가 differing role/chunk가0임을 검사합니다. Control receipt W31h-approved-next-tUU2wH/approved-receipt.json은 양쪽8 differing roles/추가0을 보존합니다. W31j fresh gate는9 changed roles=9 control roles/추가0이며 이 계약을 바꾸지 않았습니다. 다른4 plugin은 모든 CSS/JS 파일 이름과 raw hash 전체를 비교합니다. 이 five-checkout 증거는 아래 historical cce 빌드에 대한 것이며 e323/current 전체 matrix 증명으로 재명명하지 않습니다.

크기

아래 Current는 W31h에서 측정한 a9c804a3의 보존 수치입니다. 135d0aac 또는 최종 f317421b를 새로 측정한 표가 아닙니다. W31j의 app memory 기록은 style-size 재측정이나 performance benchmark가 아닙니다. 표·분해·비교 범위와 provenance를 그대로 보존하며 최신 값으로 조용히 바꾸지 않습니다.

같은 Bun에서 실행한 node:zlib.gzipSync per-file 합산으로 CSS/JS raw·gzip을 측정했습니다(직접 Bun.gzipSync API가 아닙니다). 8-route fixture는 원래 w31-measure.mjs의 8 routes/32 shared×80 atoms/route당25 private atoms와 Bun.Transpiler-minified extracted source이며 bundled JS가 아닙니다. 이 fixture는 historical method처럼 NODE_ENV를 unset했습니다. Landing은 각 원본 cwd의 실제 vinext dist/client 전부이며 production 환경입니다. #751은 독립 w31f751의 자체 binary/dependencies/cwd에서 같은 mode로 다시 측정했습니다. 각 mode 전에4 generated cache JSON과 기존 dist를 고유 T backup으로 보존하여 cold로 빌드했습니다. Variable/reset/file-prefix/evaluation bytes를 모두 포함합니다.

AtomHoist2에만 각 쪽의 Devup options 한 줄을 잠시 바꾸고 즉시 원래 bytes로 복구했습니다. 양쪽 rawSHA 81e66b8378fd646841281a1aa6ff6aea98f9dbb6734bea938429e206d8befe70, current diff empty 및 HEAD blob 54635f970fdd24c5d95a790369bf5735171be370을 검증했습니다. Generated/ignored next-env.d.ts는 source pin에서 제외하되 전후 hash를 output receipt에 별도로 기록했습니다. 모든 authored source/package/config pin은 동일하며 시작한 process는 종료했습니다.

Fixture / Mode #751 CSS Raw / Gzip Current CSS Raw / Gzip #751 JS Raw / Gzip Current JS Raw / Gzip CSS+JS Gzip Δ
8 routes ordinary 69604 / 19138 69604 / 19138 206438 / 14081 206438 / 14081 0.00%
8 routes singleCss 6310 / 1465 10806 / 3792 200694 / 13876 244560 / 34235 +147.88%
8 routes atomHoist2 30352 / 7180 11526 / 6336 346366 / 20718 241670 / 32384 +38.79%
landing ordinary 60265 / 28819 73443 / 33321 686594 / 219818 716659 / 228739 +5.40%
landing singleCss 35639 / 8389 48394 / 15308 680758 / 218628 709234 / 230346 +8.21%
landing atomHoist2 346589 / 34180 68026 / 23055 905078 / 237024 716113 / 228693 -7.17%

Ordinary static fixture CSS/JS는 #751과 크기가 같습니다. 공유 namespace의 결정론적 content 이름과 runtime site/reset/evaluation 보존 비용은 표에서 숨기지 않았습니다. Landing ordinary/singleCss의 합산 gzip 증가가1%를 넘으므로 전체 표를 coordinator에게 먼저 알렸습니다. Historical W31f landing 값도 별도로 보존했습니다: ordinary CSS60265/28815 JS686594/219800; single CSS35639/8392 JS680758/218625; atom CSS355317/34322 JS911062/237139. 표는 새 original-cwd/cold before와 비교하며 이전 값으로 조용히 대체하지 않습니다. 모든 실제12 rows와 asset hashes는 W31h-size-original-7XzdEu/six-mode-comparison-historical-env.json에 있습니다.

Landing 비용 분해

새 build 없이 보존한 ordinary/singleCss client assets의 원래 SHA/raw/gzip을 먼저 검증하고 w31h-size-breakdown.mjs로 계산했습니다(4.28초). 표의 각 칸은 raw/gzip bytes입니다. CSS selector에 있는 content class token, 그 file-scope prefix, CSS에 선언/참조되는 변수 이름, 생성된 triple-hyphen initial reset 선언을 분리했습니다. 기존 counter/theme/keyframe/typography class 이름은 other에 남습니다. Reset은 변수 이름까지 포함한 전체 선언이며 변수 항목과 중복하지 않습니다.

Gzip은 category를 독립 압축한 숫자가 아닙니다. 각 원래 파일에서 reset → variable name → file prefix → lossless atom → fingerprint atom 순서로 text를 제거하며 Bun에서 실행한 node:zlib.gzipSync per-file 차이를 계산한 순서 의존적 marginal ablation입니다. Other는 마지막 remainder와 gzip overhead입니다. 각 category의 raw/gzip 합은 실제 전체 합과 정확히 같고, 아래 delta의 합도 실제 증가분과 같습니다. 분석용 제거 결과를 실행하거나 CSS/JS 기대를 바꾸지 않았습니다.

Category Ordinary #751 → Current Raw/Gzip Ordinary Δ Raw/Gzip SingleCss #751 → Current Raw/Gzip SingleCss Δ Raw/Gzip
Content class atoms (L+H) 0/0 → 16533/10707 +16533/+10707 0/0 → 29034/18097 +29034/+18097
Content atom file prefixes 0/0 → 15537/654 +15537/+654 0/0 → 0/0 0/0
CSS variable names 4452/1785 → 5314/2022 +862/+237 3378/812 → 4294/1049 +916/+237
Generated resets 0/0 → 103/25 +103/+25 0/0 → 103/22 +103/+22
Other code / existing names 742407/246852 → 752615/248652 +10208/+1800 713019/226205 → 724197/226486 +11178/+281
Total 746859/248637 → 790102/262060 +43243/+13423 716397/227017 → 757628/245654 +41231/+18637

이 정의에서 fingerprint atom은 ordinary12924 raw/9278 gzip bytes, singleCss22392 raw/15592 gzip bytes입니다. 각각 합산 gzip 증가13423/18637 bytes의69.12%/83.66%를 차지합니다. 해시 이름의 압축 비용을 숨기지 않습니다. 전체 asset별 hashes/분해 수치는 W31h-size-breakdown.json에 보존했습니다.

결정론성을 유지할 수 있는 후속 lever는 compression-aware lossless/fingerprint 선택(현재 raw-shortest 정책 변경에 대한 별도 결정 필요), 동일 prefix/name 반복을 줄이는 정적 출력 형식, 원본 번호를 더 넓게 제공하는 plugin pre-pass(#755/#752 소유 범위) 등입니다. 이름에 필요한 content/범위/충돌 증명을 지우거나 counter eligibility를 넓히는 방식은 제안하지 않습니다. 이 PR에서는 해당 최적화나 새 runtime/precollection을 구현하지 않습니다. 과거 coordinator는 size 증가 자체를 release blocker로 삼지 않고 비용을 사용자가 리뷰하도록 공개하기로 결정했습니다. 이는 후속 사용자 감사 요구를 면제하거나 현재 ready를 승인한 결정이 아닙니다.

현재 크기·적격성 감사 상태 — INCOMPLETE / BLOCKED

  • W31j-size-explanation.md215 lines와 authoritative size receipts는 역사적 fix(wasm): align deterministic atom hoist names #751→a9 ordinary +5.3986%, singleCss **+8.2095%**를 원본 SHA/raw/원래 gzip으로 재확인했습니다. Fingerprint marginal 비중69.12%/83.66%도 유지합니다. a9 atomHoist after97/97도 검증됐지만 fix(wasm): align deterministic atom hoist names #751 atomHoist before는19/97만 확인, 원본78 files(25 CSS·53 JS)가 미확보입니다. 표의−7.17%(정밀−7.1739%)는 보존 receipt 산술이지 before 전 파일 재검증 완료가 아닙니다.
  • 요구된 source-line/old-name/new-name 사례는 0/30 인증입니다. 관측 token ledger는 semantic descriptor/original-owner/site와 연결된 per-atom eligibility 감사가 아니며, 결정2/3/5/6/22별 전수 인과 비용·atomHoist shrink 인과 분해·정량 gzip 절감 추정도 미완료입니다. 과분류가 없다는 결론을 내리지 않습니다(no-overclassification-no-claim). 새로운 자료나 절감량을 추정해 채우지 않았습니다.
  • 필요한 것은 missing78 원본 bytes/exact-hash archive와 각 mode의 원본 descriptor/registry/owner/site 및 pinned source association입니다. W31k-size-recovery.md의 제한된 두 검색 iteration은 after/complete 보존 계약과 세 ZIP의 중앙 디렉터리를 확인했으나 인증 가능한 추가 자료를 확보하지 못했습니다. Before-build cache를 after-mode 증거로 승격하지 않았으며, 검사하지 않은 모든 위치에 자료가 없다고 단정하지 않습니다. 기존 자료를 제공받거나 별도 허가로 새로운 isolated audit capture를 진행해야 합니다. 삭제된 baseline 디렉터리 재생성이나 추가 baseline build는 실행하지 않았습니다. Green CI와 별개로 이 감사 gate가 미완료이므로 PR은 DRAFT 유지, ready/release passed를 선언하지 않습니다.

W31j 메모리·실제 hook 기록(역사적 근거)

  • 최신 coordinator 정책은 small fixtures/focused tests6,000,000,000 bytes, 실제 landing app build와 전체 commit hook12,000,000,000 bytes의 whole-process-tree cap입니다. Rust jobs4를 유지하며 실제 paging/OOM 때만2로 줄입니다. Cap을12GB보다 높이거나 hook을 우회하지 않았습니다.
  • 첫 cold Next Turbopack은 compile 뒤 기본23 prerender workers에서6,087,979,008 bytes(약6.088GB),13.45초에6GB guard exit137로 중단됐습니다(W31j-next-cold-build.log). 원래 실패 기록은 삭제하지 않았습니다. Source/config/workflow 변경 없이2-worker rerun은 cold3.3386GB/upgraded3.6463GB로6GB 아래에서 완료하고 landing221개씩 통과했습니다. 이는 최종 기본 worker 결과를 대신하지 않습니다.
  • 최종 W31j fresh 기본23-worker cold는5,179,482,112 bytes, upgraded는5,238,083,584 bytes로 각각 완료했으며 실제 landing221개씩 통과했습니다(W31j-final-next-cold.log, W31j-final-next-upgrade.log 및 각각의 e2e 로그). 이 수치가 최종 W31j app memory 기록입니다.
  • 비교용 base는 aaab75652615aedae65ec102e3576ea05b3c3c33의 새 clean export W31j-base-751-7cb9d2e4/source이며 자체 WASM/plugin/dependencies를 빌드했습니다. 삭제된 과거 baseline 디렉터리들은 재생성하지 않았고 현재 repo의 WASM/plugin을 빌리지 않았습니다. 원본1975파일 raw hash는 정확히 같고 유일한 generated demos.generated.ts 차이는 CRLF→LF의 text-identical 변경으로 분류했습니다. Source/manifest/lock/config patch나 fixture 삭제는 없습니다.
  • Authentic base Next는 Turbopack compile을 완료했으나 /team prerender의 GitHub403으로 실패했습니다. 실제 peak7,585,779,712 bytes/30.48초(base-next-cold-bin-repaired-12gb.log, 새 export의 보존 로그)와 current의 완료된 cold5,179,482,112/upgraded5,238,083,584 bytes를 모두 기록합니다. 완료된 paired 비교가 아니므로 성장률/감소율을 계산하지 않습니다. Coordinator는 충분한 evidence이며 growth 징후가 없다고 판단하고 baseline 추가 추적 중단을 지시했습니다. App/network data hack이나 추가 baseline build로403을 숨기지 않았습니다. 이 판단은 performance benchmark 또는 완전한 paired percentage가 아닙니다.
  • Hook attempt1은 실제 hooks/CI unset/jobs4/47 whole files 상태에서6,146,457,600 bytes(약6.146GB)에6GB guard로 중단돼 commit이 생기지 않았습니다. 새로 승인된 전체 hook12GB 정책의 새 attempt2는 jobs4로403초/peak6,586,667,008 bytes(약6.587GB)에 통과했습니다. Bypass/amend/12GB 초과 cap 인상은 없습니다. Hook-tested index tree는 80e52d631c5b3fdd635f276c081b3d06ff595007, committed/pushed head는 135d0aacd0d4106d5b54373f1b0ba02854757c47이며 source/package manifest 대조0 mismatches였습니다. 이는 해당 과거 단위의 증거이며 아래 최종 f317 hook 결과와 구분합니다.

검증

기존 공개 검증(역사적 근거 보존)

  • Combined: 일반 native2847, freshWASM/root, Bun5589/0 및 함수/라인100%, fmt/lint/Rust1.99 all-target Clippy, current/old/main cache33+exact-main2+original-owner5, 네 종류 full JS/maps/CSS 양방향 probes, 실제 multi-env/compiler plugin matrix, 5 plugin 두-checkout build gate 통과.
  • Cascade: ordinary/singleCss/atomHoist, 번호/비번호, AB/BA extraction 및 명시적 stylesheet loading order, 320/1440px의 Chromium51개 통과. Cold ordinary Next와 실제 old-cache upgrade Next에서 landing221개씩 통과했습니다. Header link/footer row 및 기존 visual 기대/스크린샷은 변경하지 않았습니다.
  • Typography: 일반 native3073/0(226 class-only 포함), fresh WASM92/0, Bun5589/0 함수/라인100%, fmt/lint/1.99 Clippy 및 실제 Next landing221개 통과. Snapshot을 추가 수락하거나 기대를 약화하지 않았습니다.
  • 당시118 Rust 및 Textarea snapshot5 bodies는 개별 source/descriptor/whole forward-inverse 증명으로 승인했고 당시 최종 accepted hashes를 재검증했습니다. Source-faithful 읽기/횟수/순서, rule placement, reset/DOM/effective declaration을 보존했습니다. 이름 scope 변화와 closed-literal capture 제거만 해당 수락 이유입니다. 현재117+approved1 ledger와 혼동하지 않습니다.
  • 당시 head a9c804a3, CI 37498939552: benchmark, RSC CSS, landing-next-e2e 성공; publish는 Linux99.01%(12148/12270) coverage로 실패하여122 uncovered lines를 실제 CI wide-format source에 매핑했습니다. 이는 아래 current run과 구분하는 역사적 실패 기록이며 Codecov-only outage가 아니고 workflow/rerun loop를 바꾸지 않았습니다.

W31j fresh 결과(역사적 cce qualification)

  • 135d0aac 단위를 위한 최종 fresh normal native3321/0, styled170/0, typography226/0, assignment296/0, source121/0, Rust1.99 workspace all-target Clippy0 및 fmt/lint를 통과했습니다. Fresh WASM/root, Bun5589/0 함수/라인100%, public95/0와 typography92/92, cache40 및 네 종류 full JS/maps/CSS 양방향 probes, 실제5 plugin 두-checkout gate5PASS, cold/upgraded 기본23-worker Next landing221개씩, Chromium cascade51개를 통과했습니다. 당시 최종 public/application qualification은 WASM SHA256 cce0724c7bda52fe22a335bf0d2544abb90d24df0dc530ab255dd2e7588a1727에 묶인 fresh 결과이며 초기 cd82 또는 W31h 결과를 빌린 것이 아닙니다. 이 historical five-checkout/current-matrix 결과를 이후 e323 또는 f317 전체 matrix qualification으로 재사용하지 않습니다.
  • Fresh Oracle delta APPROVE는 code/precommit delta에 대한 판단입니다(W31j-oracle-delta-approve.md). 과거 Oracle REJECT와 red 로그를 유지합니다. 이 승인은 최종 release CI100%/최종 hooks/ready/merge authority가 아닙니다.
  • 과거 공개 head/run: 135d0aacd0d4106d5b54373f1b0ba02854757c47, CI 37584716306. Publish는 Linux 99.85%(12321/12339),18 uncovered lines/8 files로 실패했습니다. Benchmark/RSC CSS/landing-next-e2e의 나머지3 jobs는 GREEN이었습니다. W31j-ci135-publish-authority.log의 실제 job log와 committed135+Rust1.99 명시적8-entry config로 작성한 W31j-ci135-exact.md/json이 당시 line authority입니다. 해당 파일은 as_visit.rs, assignment_object.rs, assignment_value.rs, coverage_tests.rs, evaluation_location.rs, extractor/extract_style_from_styled.rs, prop_modify_utils.rs, typography_scalar_projection.rs입니다. Codecov outage가 아니었습니다. Windows local97.94%도 Linux authority를 대신하지 않습니다. 후속 f317은 threshold/workflow 변경이나 rerun loop 없이 의미 있는 회귀/coverage 수정과 승인된 spread 정책을 완료했습니다.

W31k 현재 exact-source / 실제 hooks / 최종 CI

  • 현재 보호 ledger: W31k-binding-review.md의 독립 source/caller review 및 parent immutable audit는15 Rust source hashes exact, 보호117 unchanged + 승인된1 replacement, 두 extra Rust bodies와 Textarea5 exact를 확인했습니다. Sole replacement는 styles_the_build_cannot_read.snap이며 accepted raw SHA256 e723803ccc30714c40e5319ca0690b782d6a338b4f593e94a38f693b6316eca9입니다. 승인된 literal-array fixture 교정으로 비번호 파일의 whole normalized source identity가 바뀌어 네 이름만 바뀝니다(decisions5/17). Entire-body forward/inverse substitution은 styles/JS/evaluation 불변을 증명합니다. 원래 invalid-object sources는 located negatives로 보존하고 다른 protected hashes는 exact입니다. survey/replies/w31j-four-names.txt의 exact-delta approval이며 blanket snapshot acceptance나 production naming 변경은 없습니다. Candidate는 남지 않았습니다. 이 준비 작업에서 snapshot을 수락/삭제한 것은 없습니다.
  • 현재 native/공개 artifact binding: normal native 3375PASS/0FAIL, extractor2258,20 suites 모두0ignored/0filtered, fmt/Rust1.99 all-target Clippy exit0는 동일한15 source hashes에 다시 묶인 보존 exact-source receipts를 사용했습니다(새 rerun이라고 주장하지 않습니다). Current WASM SHA256는 e3237683a335627ac3dbe34a6d2b12b348b1a4143680264a92fceeb8275047dd, index.js는 6d6d6c8416b1b5107edb8abe04210d84e480565340897737c1b11e3d9931a40c입니다. Public95 receipt SHA256 e69092f8ac367abe845e65c8acba7152c9eb79a6acbefdfcc8859d899d87b5ba는 e323+index.js를, typography92/92 receipt 7656515e29a3049b1c49660eadcebbbd1f8a38152bb8d91309008552d3aecaf7는 e323를 pin합니다(후자에 없는 pkg field를 만들지 않습니다). Saved fresh WASM/root와 Bun 5589/0·함수/라인100%, Next221 qualification도 기록돼 있습니다. Parent의 별도 fresh spread SDK8/8 PASS는 W31k-spread-public.log이며 old cce checkout manifest로 대체하지 않았습니다.
  • Authentic final hook/commit/push: exact17 paths, Rust jobs4, CI/INSTA unset,12,000,000,000-byte cap에서 실제 fmt/Clippy/ESLint/tarpaulin/Bun hooks가 exit0, peak6,718,418,944 bytes, elapsed291,917ms로 완료됐습니다. Source/artifact manifest hashes는 hook 전후 stable이며 committed tree는 tested tree **b6e0380f42febd74024b4d39d4550f8fc031c09f**와 같습니다. Parent HEAD=origin은 **f317421be26bcfc68da7c3e89e8fb3fa0381a410**입니다. W31k-commit-qualified.json/W31k-progress.md가 권위이고289 owned processes exit를 기록합니다. Windows hook98.16%(17427/17753)는 Linux authority가 아니며 아래 실제 CI로 구분합니다. Hook bypass/amend/workflow·coverage 변경은 없습니다.
  • 현재 최종 head CI: 37634542733, exact head f317421be26bcfc68da7c3e89e8fb3fa0381a410, completed/SUCCESS. publish, benchmark, vinext-rsc-css-e2e, landing-next-e2e 모두4/4 SUCCESS입니다. Publish job112837164090 raw log의 Linux Rust1.99 fail-under100 결과는 100.00%,12335/12335, uncovered0이며120 file rows 합도 정확히 일치합니다. Codecov upload도 SUCCESS, failed steps0입니다. GitHub publish log의 Bun5589/0, preload-race8/0, 두 publish landing modes221씩도 관측됐습니다. PR run에서 snapshot 생성/commit 및 Pages upload/deploy4 steps의 조건부 skip은 실패가 아니며 npm/Pages 배포를 주장하지 않습니다. W31k-ci-f317-final.md와 W31k-ci-f317-validation.json이 final authority이고, commit receipt/QA의 당시 CI pending 기록은 이 후속 완료 근거로 대체합니다. 새 coverage denominator를 과거 uncovered 수로 추정하지 않았고 branch100%라고 주장하지 않습니다.
  • Rust LSP daemon timeout과 미설치/설치 거절된 TS/Biome 때문에 editor diagnostics-clean은 주장하지 않습니다. Native compiler/Clippy와 실제 surface gates의 결과를 구분해 기록합니다. 코드/최종 hooks/CI 완료와 감사/release gate는 별개이며, 크기·적격성 감사 INCOMPLETE / BLOCKED 때문에 PR764는 DRAFT를 유지합니다. Ready는 감사 gate 완료 또는 명시적 결정 없이는 진행하지 않습니다. 자동 merge/approve/close는 하지 않습니다.

owjs3901 and others added 24 commits October 1, 2026 01:50
…nd StyleX imports

The generated stylesheet always resolved to an empty module, so Bun.build dropped every style, and the pre-parse gate only accepted import declarations of @devup-ui/react, so files using the alias packages, StyleX, subpaths or re-exports ran the runtime stubs. DevupUI() now serves the complete sheet to the CSS loader after defer(), and the gate reads the real imports with Bun.Transpiler.scanImports.

Refs #686

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

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

A stylesheet module is built on its first import, and the shared base is read from disk past the plugin, so styles extracted later were missing from webpack and Rsbuild output; Rsbuild also served a module-wide string kept only when it grew. The files the entries reach are now extracted before the build, the base on disk is kept current, and a compilation whose stylesheets changed is run once more, writing only the complete result. Rsbuild serves each stylesheet from the current sheet.

Refs #686

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…into feat/deterministic-numbering

# Conflicts:
#	packages/next-plugin/src/loader.ts
…ing order

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>
… forwarding alone

Refs #694

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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>
…tion

Refs #694

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

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

Refs #694

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Preserve whole styled argument creation-time evaluation and qualify the inherited naming/extractor coverage union, including sticky getCss proof.

Refs #694

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…l Linux branches

Cover final Linux semantic branches and reject unsupported css/styled argument spreads without executing iterators. Preserve optional producer coordinates and source-order literal-array composition.

The approved invalid-object-to-literal-array fixture correction changes whole-source identity in an unnumbered file (decisions 5 and 17): only two g classes and two g variables change in one reviewed snapshot, with entire-body forward/inverse proof; styles and JavaScript evaluation are identical.

Refs #694

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

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

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

Changepacks

@devup-ui/wasm@1.0.83 → 1.0.84 - bindings/devup-ui-wasm/package.json

Patch

  • Keep JavaScript argument-spread semantics in css() and styled(): compose supported literal arrays statically, and reject strings, other iterables and unknown spreads with a located composition error instructing users to pass the value itself instead. No iterators execute at build time or at styling runtime. Preserve optional producer coordinates and checked prelude offsets for located collision diagnostics.
  • Make atomHoist class names deterministic and match generated references to emitted CSS, freeze hoisting from predeclared route reach, and preserve dynamic !important, keyframes, and first-value responsive-token identities. No new build errors.
  • Class names and file numbers no longer depend on the order files are processed in. Every plugin walks the files it can extract (the project's source and the included packages) before the first transform and numbers them in path order (a file collapsed into a bucket is numbered as the bucket, and only files that mention the package, StyleX or an aliased package take numbers) through the new seedFileMap, so identical builds give identical class prefixes, CSS file names and output hashes; in development, files that appear later are numbered after the existing ones. Styles are given class names in a fixed order, not the order of a hash set. The exported class, file and canonical maps are canonical JSON (sorted keys). Stylesheet evaluation (vanilla-extract) refuses Math.random(), Date.now(), new Date() and Date(), which differ between builds, with a build error; fixed dates such as new Date(0) are unchanged. resetBuildState starts a build from its own options: the prefix, atom hoisting, routes, buckets, names, numbers and styles an earlier build in the process left are cleared, and the prefix is set on every setup even when it is absent. Engine snapshots from concurrent transforms are written one after another per file, so an older snapshot is never written last. File lists are ordered by code point rather than the locale
  • Stabilize class and runtime-variable names across build environments, bound unnumbered source identities with compact deterministic names, reset generated variables on their owning elements, and preserve authored evaluation order and lazy selection. Exact content-name and source-name collisions report both contents and their best real source locations; conflicting source-variable roles and unprotected naming caches now fail closed without rejecting literal CSS content strings.
  • Compile proven static responsive arrays directly to classes and isolate content-named atoms by their existing delivered sheet identity. Safe original sources keep independent D9 counter namespaces even when their CSS shares a collapsed bucket. Build adapters supply an independent names-only project root; resolver IDs, D9 numbering and stylesheet placement stay unchanged. Versioned self-contained naming snapshots ignore and rebuild obsolete or invalid cache data that reaches WASM; cache build errors are reserved for real exact name collisions with located diagnostics. Static Textarea font-size arrays retain their declarations and DOM while compiling directly to classes.
  • Evaluate supported conditional styled rule arguments once when the component is created, preserving branch laziness, authored field order, static selectors and layers, typography and runtime value associations. Keep rule capture outside attrs wrappers while authored attrs callbacks remain render-time. Responsive typography retains its shared base class and order-aware class selection without introducing empty styles for proven inert base-preset lookups. This scheduling repair adds no build errors or styling runtime.
  • Select dynamic typography and enum classes from the authored value exactly once in source order, without typography CSS variables or declarations. Preserve responsive and selector-scoped presets, conditional style order, template coercion and the existing spread contract. No new build errors or styling runtime are introduced.

@devup-ui/bun-plugin@1.0.22 → 1.0.23 - packages/bun-plugin/package.json

Patch

  • Bun plugin works with Bun.build: DevupUI() (from @devup-ui/bun-plugin/register) serves the generated stylesheet to the bundler's CSS loader once every other module is loaded, so the build emits a CSS output with the styles of the whole bundle instead of an empty module; class names are short there and readable under the runtime (debug option). Files importing the packages Devup UI takes the place of (@emotion/react, @emotion/styled, styled-components, @vanilla-extract/css), @stylexjs/stylex, or a subpath or re-export of these or @devup-ui/react, are compiled instead of skipped
  • Class names and file numbers no longer depend on the order files are processed in. Every plugin walks the files it can extract (the project's source and the included packages) before the first transform and numbers them in path order (a file collapsed into a bucket is numbered as the bucket, and only files that mention the package, StyleX or an aliased package take numbers) through the new seedFileMap, so identical builds give identical class prefixes, CSS file names and output hashes; in development, files that appear later are numbered after the existing ones. Styles are given class names in a fixed order, not the order of a hash set. The exported class, file and canonical maps are canonical JSON (sorted keys). Stylesheet evaluation (vanilla-extract) refuses Math.random(), Date.now(), new Date() and Date(), which differ between builds, with a build error; fixed dates such as new Date(0) are unchanged. resetBuildState starts a build from its own options: the prefix, atom hoisting, routes, buckets, names, numbers and styles an earlier build in the process left are cleared, and the prefix is set on every setup even when it is absent. Engine snapshots from concurrent transforms are written one after another per file, so an older snapshot is never written last. File lists are ordered by code point rather than the locale
  • Compile proven static responsive arrays directly to classes and isolate content-named atoms by their existing delivered sheet identity. Safe original sources keep independent D9 counter namespaces even when their CSS shares a collapsed bucket. Build adapters supply an independent names-only project root; resolver IDs, D9 numbering and stylesheet placement stay unchanged. Versioned self-contained naming snapshots ignore and rebuild obsolete or invalid cache data that reaches WASM; cache build errors are reserved for real exact name collisions with located diagnostics. Static Textarea font-size arrays retain their declarations and DOM while compiling directly to classes.

@devup-ui/components@0.1.60 → 0.1.61 - packages/components/package.json

Patch

  • Stabilize class and runtime-variable names across build environments, bound unnumbered source identities with compact deterministic names, reset generated variables on their owning elements, and preserve authored evaluation order and lazy selection. Exact content-name and source-name collisions report both contents and their best real source locations; conflicting source-variable roles and unprotected naming caches now fail closed without rejecting literal CSS content strings.
  • Compile proven static responsive arrays directly to classes and isolate content-named atoms by their existing delivered sheet identity. Safe original sources keep independent D9 counter namespaces even when their CSS shares a collapsed bucket. Build adapters supply an independent names-only project root; resolver IDs, D9 numbering and stylesheet placement stay unchanged. Versioned self-contained naming snapshots ignore and rebuild obsolete or invalid cache data that reaches WASM; cache build errors are reserved for real exact name collisions with located diagnostics. Static Textarea font-size arrays retain their declarations and DOM while compiling directly to classes.

@devup-ui/next-plugin@1.0.90 → 1.0.91 - packages/next-plugin/package.json

Patch

  • Make atomHoist class names deterministic and match generated references to emitted CSS, freeze hoisting from predeclared route reach, and preserve dynamic !important, keyframes, and first-value responsive-token identities. No new build errors.
  • Isolate the coordinator port file per owning process when another live next dev/build holds it, record the owner pid, and report port, pid and recovery when the coordinator is missing or unreachable
  • Class names and file numbers no longer depend on the order files are processed in. Every plugin walks the files it can extract (the project's source and the included packages) before the first transform and numbers them in path order (a file collapsed into a bucket is numbered as the bucket, and only files that mention the package, StyleX or an aliased package take numbers) through the new seedFileMap, so identical builds give identical class prefixes, CSS file names and output hashes; in development, files that appear later are numbered after the existing ones. Styles are given class names in a fixed order, not the order of a hash set. The exported class, file and canonical maps are canonical JSON (sorted keys). Stylesheet evaluation (vanilla-extract) refuses Math.random(), Date.now(), new Date() and Date(), which differ between builds, with a build error; fixed dates such as new Date(0) are unchanged. resetBuildState starts a build from its own options: the prefix, atom hoisting, routes, buckets, names, numbers and styles an earlier build in the process left are cleared, and the prefix is set on every setup even when it is absent. Engine snapshots from concurrent transforms are written one after another per file, so an older snapshot is never written last. File lists are ordered by code point rather than the locale
  • Stabilize class and runtime-variable names across build environments, bound unnumbered source identities with compact deterministic names, reset generated variables on their owning elements, and preserve authored evaluation order and lazy selection. Exact content-name and source-name collisions report both contents and their best real source locations; conflicting source-variable roles and unprotected naming caches now fail closed without rejecting literal CSS content strings.
  • Compile proven static responsive arrays directly to classes and isolate content-named atoms by their existing delivered sheet identity. Safe original sources keep independent D9 counter namespaces even when their CSS shares a collapsed bucket. Build adapters supply an independent names-only project root; resolver IDs, D9 numbering and stylesheet placement stay unchanged. Versioned self-contained naming snapshots ignore and rebuild obsolete or invalid cache data that reaches WASM; cache build errors are reserved for real exact name collisions with located diagnostics. Static Textarea font-size arrays retain their declarations and DOM while compiling directly to classes.

@devup-ui/plugin-utils@1.0.17 → 1.0.18 - packages/plugin-utils/package.json

Patch

  • Webpack and Rsbuild builds hold every style in their stylesheets: a stylesheet module is built on its first import, so styles extracted later (the global styles of files webpack or Rsbuild reached late, often outside src) were missing from the output. The files the entries reach under src are now extracted before the build, the shared base on disk is kept current, and when a stylesheet still changed during the build it is compiled once more, writing only the complete result. Rsbuild serves each stylesheet from the current sheet instead of a module-wide string kept only when it grew, which left edits that shortened the CSS and later builds in the same process stale. plugin-utils adds computeReachableFiles
  • Class names and file numbers no longer depend on the order files are processed in. Every plugin walks the files it can extract (the project's source and the included packages) before the first transform and numbers them in path order (a file collapsed into a bucket is numbered as the bucket, and only files that mention the package, StyleX or an aliased package take numbers) through the new seedFileMap, so identical builds give identical class prefixes, CSS file names and output hashes; in development, files that appear later are numbered after the existing ones. Styles are given class names in a fixed order, not the order of a hash set. The exported class, file and canonical maps are canonical JSON (sorted keys). Stylesheet evaluation (vanilla-extract) refuses Math.random(), Date.now(), new Date() and Date(), which differ between builds, with a build error; fixed dates such as new Date(0) are unchanged. resetBuildState starts a build from its own options: the prefix, atom hoisting, routes, buckets, names, numbers and styles an earlier build in the process left are cleared, and the prefix is set on every setup even when it is absent. Engine snapshots from concurrent transforms are written one after another per file, so an older snapshot is never written last. File lists are ordered by code point rather than the locale

@devup-ui/react@1.0.44 → 1.0.45 - packages/react/package.json

Patch

  • Stabilize class and runtime-variable names across build environments, bound unnumbered source identities with compact deterministic names, reset generated variables on their owning elements, and preserve authored evaluation order and lazy selection. Exact content-name and source-name collisions report both contents and their best real source locations; conflicting source-variable roles and unprotected naming caches now fail closed without rejecting literal CSS content strings.

@devup-ui/reset-css@1.0.31 → 1.0.32 - packages/reset-css/package.json

Patch

  • Auto-update: depends on '@devup-ui/react' via a local workspace dependency

@devup-ui/rsbuild-plugin@1.0.67 → 1.0.68 - packages/rsbuild-plugin/package.json

Patch

  • Make atomHoist class names deterministic and match generated references to emitted CSS, freeze hoisting from predeclared route reach, and preserve dynamic !important, keyframes, and first-value responsive-token identities. No new build errors.
  • Webpack and Rsbuild builds hold every style in their stylesheets: a stylesheet module is built on its first import, so styles extracted later (the global styles of files webpack or Rsbuild reached late, often outside src) were missing from the output. The files the entries reach under src are now extracted before the build, the shared base on disk is kept current, and when a stylesheet still changed during the build it is compiled once more, writing only the complete result. Rsbuild serves each stylesheet from the current sheet instead of a module-wide string kept only when it grew, which left edits that shortened the CSS and later builds in the same process stale. plugin-utils adds computeReachableFiles
  • Class names and file numbers no longer depend on the order files are processed in. Every plugin walks the files it can extract (the project's source and the included packages) before the first transform and numbers them in path order (a file collapsed into a bucket is numbered as the bucket, and only files that mention the package, StyleX or an aliased package take numbers) through the new seedFileMap, so identical builds give identical class prefixes, CSS file names and output hashes; in development, files that appear later are numbered after the existing ones. Styles are given class names in a fixed order, not the order of a hash set. The exported class, file and canonical maps are canonical JSON (sorted keys). Stylesheet evaluation (vanilla-extract) refuses Math.random(), Date.now(), new Date() and Date(), which differ between builds, with a build error; fixed dates such as new Date(0) are unchanged. resetBuildState starts a build from its own options: the prefix, atom hoisting, routes, buckets, names, numbers and styles an earlier build in the process left are cleared, and the prefix is set on every setup even when it is absent. Engine snapshots from concurrent transforms are written one after another per file, so an older snapshot is never written last. File lists are ordered by code point rather than the locale
  • Stabilize class and runtime-variable names across build environments, bound unnumbered source identities with compact deterministic names, reset generated variables on their owning elements, and preserve authored evaluation order and lazy selection. Exact content-name and source-name collisions report both contents and their best real source locations; conflicting source-variable roles and unprotected naming caches now fail closed without rejecting literal CSS content strings.
  • Compile proven static responsive arrays directly to classes and isolate content-named atoms by their existing delivered sheet identity. Safe original sources keep independent D9 counter namespaces even when their CSS shares a collapsed bucket. Build adapters supply an independent names-only project root; resolver IDs, D9 numbering and stylesheet placement stay unchanged. Versioned self-contained naming snapshots ignore and rebuild obsolete or invalid cache data that reaches WASM; cache build errors are reserved for real exact name collisions with located diagnostics. Static Textarea font-size arrays retain their declarations and DOM while compiling directly to classes.

@devup-ui/vite-plugin@1.0.73 → 1.0.74 - packages/vite-plugin/package.json

Patch

  • Make atomHoist class names deterministic and match generated references to emitted CSS, freeze hoisting from predeclared route reach, and preserve dynamic !important, keyframes, and first-value responsive-token identities. No new build errors.
  • Class names and file numbers no longer depend on the order files are processed in. Every plugin walks the files it can extract (the project's source and the included packages) before the first transform and numbers them in path order (a file collapsed into a bucket is numbered as the bucket, and only files that mention the package, StyleX or an aliased package take numbers) through the new seedFileMap, so identical builds give identical class prefixes, CSS file names and output hashes; in development, files that appear later are numbered after the existing ones. Styles are given class names in a fixed order, not the order of a hash set. The exported class, file and canonical maps are canonical JSON (sorted keys). Stylesheet evaluation (vanilla-extract) refuses Math.random(), Date.now(), new Date() and Date(), which differ between builds, with a build error; fixed dates such as new Date(0) are unchanged. resetBuildState starts a build from its own options: the prefix, atom hoisting, routes, buckets, names, numbers and styles an earlier build in the process left are cleared, and the prefix is set on every setup even when it is absent. Engine snapshots from concurrent transforms are written one after another per file, so an older snapshot is never written last. File lists are ordered by code point rather than the locale
  • Stabilize class and runtime-variable names across build environments, bound unnumbered source identities with compact deterministic names, reset generated variables on their owning elements, and preserve authored evaluation order and lazy selection. Exact content-name and source-name collisions report both contents and their best real source locations; conflicting source-variable roles and unprotected naming caches now fail closed without rejecting literal CSS content strings.
  • Compile proven static responsive arrays directly to classes and isolate content-named atoms by their existing delivered sheet identity. Safe original sources keep independent D9 counter namespaces even when their CSS shares a collapsed bucket. Build adapters supply an independent names-only project root; resolver IDs, D9 numbering and stylesheet placement stay unchanged. Versioned self-contained naming snapshots ignore and rebuild obsolete or invalid cache data that reaches WASM; cache build errors are reserved for real exact name collisions with located diagnostics. Static Textarea font-size arrays retain their declarations and DOM while compiling directly to classes.

@devup-ui/webpack-plugin@1.0.71 → 1.0.72 - packages/webpack-plugin/package.json

Patch

  • Webpack and Rsbuild builds hold every style in their stylesheets: a stylesheet module is built on its first import, so styles extracted later (the global styles of files webpack or Rsbuild reached late, often outside src) were missing from the output. The files the entries reach under src are now extracted before the build, the shared base on disk is kept current, and when a stylesheet still changed during the build it is compiled once more, writing only the complete result. Rsbuild serves each stylesheet from the current sheet instead of a module-wide string kept only when it grew, which left edits that shortened the CSS and later builds in the same process stale. plugin-utils adds computeReachableFiles
  • Class names and file numbers no longer depend on the order files are processed in. Every plugin walks the files it can extract (the project's source and the included packages) before the first transform and numbers them in path order (a file collapsed into a bucket is numbered as the bucket, and only files that mention the package, StyleX or an aliased package take numbers) through the new seedFileMap, so identical builds give identical class prefixes, CSS file names and output hashes; in development, files that appear later are numbered after the existing ones. Styles are given class names in a fixed order, not the order of a hash set. The exported class, file and canonical maps are canonical JSON (sorted keys). Stylesheet evaluation (vanilla-extract) refuses Math.random(), Date.now(), new Date() and Date(), which differ between builds, with a build error; fixed dates such as new Date(0) are unchanged. resetBuildState starts a build from its own options: the prefix, atom hoisting, routes, buckets, names, numbers and styles an earlier build in the process left are cleared, and the prefix is set on every setup even when it is absent. Engine snapshots from concurrent transforms are written one after another per file, so an older snapshot is never written last. File lists are ordered by code point rather than the locale
  • Compile proven static responsive arrays directly to classes and isolate content-named atoms by their existing delivered sheet identity. Safe original sources keep independent D9 counter namespaces even when their CSS shares a collapsed bucket. Build adapters supply an independent names-only project root; resolver IDs, D9 numbering and stylesheet placement stay unchanged. Versioned self-contained naming snapshots ignore and rebuild obsolete or invalid cache data that reaches WASM; cache build errors are reserved for real exact name collisions with located diagnostics. Static Textarea font-size arrays retain their declarations and DOM while compiling directly to classes.

@codecov

codecov Bot commented Oct 7, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

Files with missing lines Coverage Δ
...ndings/devup-ui-wasm/src/atom_hoist_measurement.rs 100.00% <100.00%> (ø)
bindings/devup-ui-wasm/src/atom_tests.rs 100.00% <100.00%> (ø)
...indings/devup-ui-wasm/src/cache_admission_tests.rs 100.00% <100.00%> (ø)
...indings/devup-ui-wasm/src/cache_allocator_proof.rs 100.00% <100.00%> (ø)
bindings/devup-ui-wasm/src/cache_atom_proof.rs 100.00% <100.00%> (ø)
bindings/devup-ui-wasm/src/cache_descriptor.rs 100.00% <100.00%> (ø)
bindings/devup-ui-wasm/src/cache_names.rs 100.00% <100.00%> (ø)
bindings/devup-ui-wasm/src/cache_reset_proof.rs 100.00% <100.00%> (ø)
bindings/devup-ui-wasm/src/cache_restore.rs 100.00% <100.00%> (ø)
bindings/devup-ui-wasm/src/cache_seed_tests.rs 100.00% <100.00%> (ø)
... and 68 more

... and 41 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.

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