Skip to content

fix(extractor): locate diagnostics and enforce deterministic evaluation - #757

Open
owjs3901 wants to merge 58 commits into
mainfrom
fix/located-diagnostics
Open

owjs3901 wants to merge 58 commits into
mainfrom
fix/located-diagnostics

Conversation

@owjs3901

@owjs3901 owjs3901 commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Refs #685, #694 (W19가 확인한 오류 위치, 결정적 build-time 평가). #750 위에 쌓은 브랜치이며 #750과 그 선행 PR들이 먼저 병합되어야 합니다. PR base는 요청대로 main입니다.

요약

extractor의 파싱, 모듈 해석, stylesheet 실행 오류를 원본 파일:줄:열과 원인·수정 방법으로 보고합니다. TypeScript 제거, import 별칭, 모듈 치환, 생성 prelude를 역매핑하므로 가져온 helper/stylesheet와 import-cycle 조기 읽기도 실제 원본 위치를 가리킵니다.

두 Boa 평가 경로가 공통 deterministic sandbox를 사용합니다. 실행에서 실패한 stylesheet를 일반 추출로 다시 처리해서 CSS를 내보내지 않으며, 원래 코드의 의미와 정확히 같은 정적 추출만 실행 전에 선택합니다.

동작

  • 최초 베이스 29812f376f62b74071080aec2f35efb9f0424d0f를 직접 빌드한 WASM에서 요청한 다섯 항목을 모두 먼저 재현했습니다.
  • fatal Oxc parse는 첫 parser diagnostic의 원본 label 위치와 Oxc 메시지를 보존합니다.
  • import/re-export/literal require 해석 실패는 이를 요구한 원본 파일과 위치를 표시합니다. JS resolver callback·getter 예외와 잘못된 반환값은 일반 cannot-resolve로 바꾸지 않고 원래 원인을 유지합니다.
  • 실행 및 객체 직렬화 오류도 같은 위치 매핑을 사용하며, 생성 코드의 좌표를 사용자 코드의 좌표로 표시하지 않습니다.
  • 금지된 읽기는 호스트가 기록하므로 사용자 코드가 예외를 catch해도 빌드가 실패합니다. 시간·난수·환경·locale 값 대신 literal 또는 CSS 변수를 사용해야 합니다.
  • 합법적인 변수 이름 __style_1__이 내부 placeholder와 충돌해 export/CSS를 잃던 문제를 별도 map으로 이름을 옮겨 수정했습니다. getter·toJSON 등의 예외가 빈 스타일로 바뀌던 직렬화도 오류를 전파합니다.
  • 새 runtime과 의존성을 추가하지 않았습니다. changepack은 WASM package Patch만 포함합니다.
  • package 이름의 단순 prefix를 API package로 오인하던 버그도 수정했습니다. @devup-ui/react-values나 사용자 지정 @my/ui-tokens는 외부 module로 해석해 알려진 값을 static CSS로 inline하며, bare package와 /compat 등 실제 subpath는 그대로 API package로 취급합니다. 모든 비정확 import 경계 비교는 같은 helper를 사용하며 새로운 오류는 추가하지 않습니다.
  • 평가한 helper의 CSS import는 stripped module에 남는 import만 유지합니다. bare import는 항상, TS value import는 binding의 value 참조가 있을 때, JS/JSX/MJS/CJS는 unused value import도 유지합니다. helper import 위치에서 dependency-first 깊이 우선·source 순서로 출력하고 root의 직접 import까지 같은 resolved file의 첫 발생만 남깁니다. helper 디렉터리에서 resolver로 찾은 파일을 root-relative ./ 또는 ../ 경로와 forward slash로 내보내며 query suffix를 보존합니다. CSS content는 extractor dependency가 아니고, helper JavaScript의 효과는 build-time에만 실행됩니다.
  • CSS module binding의 class 이름은 추측하지 않습니다. default/namespace 객체 자체를 전달하거나 typeof로 확인하는 것은 허용하지만 property·conversion·in·열거·descriptor·prototype 관찰과 named binding의 value 읽기는 호스트가 기록하여 catch 후에도 실패합니다. 실행되지 않는 함수 안의 읽기는 오류가 아니며 해당 value import는 유지합니다.

새로 생기는 오류

변경되거나 추가된 메시지는 모두 원본 위치와 원인·수정 방법을 포함합니다.

  • source parse: 치명적인 오류뿐 아니라 Oxc가 복구할 수 있는 문법 오류와 semantic early error도 trigger입니다. 잘못된 JSX, 최상위 return, 잘못된 정규식, 중복 lexical 선언, module의 legacy octal을 포함하며 Cannot parse source: <Oxc 메시지>의 원본 지점에서 문법을 고칩니다. 오류가 있는 소스를 유효해 보이는 JS로 고쳐 쓰거나 CSS와 함께 성공시키지 않습니다.
  • 지원하지 않는 확장자: 입력 파일의 위치와 기존 Unknown file extension 원인을 보고합니다. 지원하는 JS/TS 확장자를 사용합니다.
  • stylesheet parser/semantic 오류: 잘못된 imported source와 중복 lexical 선언을 실행 전에 차단합니다. 표시된 원본 위치의 문법/선언을 고칩니다.
  • module resolver 없음/미해석: 값을 읽는 import/re-export/literal require가 trigger입니다. Devup plugin의 resolver를 사용하거나 import 경로·파일·bundler 해석 설정을 고칩니다.
  • root CommonJS stylesheet의 package require도 module error를 fallback으로 숨기지 않고 실제 require 위치에서 보고합니다. stylesheet API는 ESM import로 작성하거나 해당 module 경로와 resolver 원인을 고쳐야 하며, 실패한 CommonJS 실행을 CSS와 함께 성공시키지 않습니다.
  • JS resolver 예외/잘못된 결과: callback, path/code getter 예외 또는 non-object/non-string/빈 path가 trigger입니다. 원래 메시지를 유지하며 resolver를 고치고 {path:string,code:string} 또는 미해석을 뜻하는 null/undefined를 반환합니다.
  • stylesheet 실행 예외: 사용자 throw, 잘못된 값 접근·호출·생성, import-cycle 초기화 전 읽기, imported helper/stylesheet 예외가 trigger입니다. 원인을 고치거나 cycle을 없애고 두 모듈 초기화 뒤에 읽습니다.
  • 비결정적 읽기: Date, Math.random, performance, crypto, host/browser/process 환경, Intl/locale/Unicode 의존 읽기가 trigger입니다. catch해도 실패하며 literal 또는 CSS 변수를 사용합니다.
  • guard로 교체한 intrinsic의 descriptor나 변환된 function source를 읽어 CSS를 고르는 경우도 실패합니다. Object/Reflect descriptor API 및 legacy __lookupGetter__/__lookupSetter__가 synthetic accessor 정보로 다른 CSS를 조용히 선택하지 않도록 원래 guarded slot을 추적하고, Function.prototype.toString은 build instrumentation이 바꾸는 source text를 반환하므로 literal/CSS 변수로 바꾸도록 안내합니다. 일반 사용자 객체의 getter/setter/descriptor와 명시적으로 덮어쓴 사용자 값은 유지합니다.
  • 스타일/export 객체 직렬화 예외: getter, toJSON, proxy/array 읽기와 cyclic rule 직렬화 실패가 trigger입니다. 던지는 코드나 cycle을 없애고 정확히 직렬화할 수 있는 static data를 사용합니다.
  • serializer 설정 오류: 사용자 코드가 JSON.stringify를 호출 불가능한 값으로 바꾼 경우 JSON.stringify is not callable 원인을 그대로 보고합니다. 내장 serializer를 덮어쓰지 않습니다.
  • 내부 source-map 오류: retained stylesheet 코드에 필요한 map/content가 없거나 잘못된 map을 읽는 경우 Cannot trace retained stylesheet code 또는 Cannot read stylesheet source map과 원인을 파일 위치로 보고합니다. 내부 오류를 재현 가능한 원본과 함께 보고하도록 안내하며, 잘못된 좌표나 빈 CSS로 대신 성공하지 않습니다.
  • 내부 build-time helper 초기화 오류: 초기화가 실제로 실패하면 원래 JavaScript 원인과 report internal evaluation setup failure 안내를 유지합니다. 사용자 소스를 임의로 바꾸거나 오류를 빈 결과로 대신하지 않고 재현 가능한 입력과 함께 내부 오류를 보고합니다.
  • 실제 실행 실패 뒤의 fallback은 삭제했습니다. 단순히 Devup API import가 없어졌다는 이유로 오류를 숨기지 않습니다. 실행 전의 정적 증명이 통과하는 모듈만 일반 추출하며, 그 밖의 모듈은 실행의 성공이 필요합니다.
  • imported literal의 값이 알려졌다는 사실만으로 helper의 실행 효과를 건너뛰지 않습니다. helper의 throw나 catch한 금지 읽기도 실제 helper의 원본 위치에서 실패합니다. 반면 실행되지 않는 함수 선언과 정확한 Devup helper 계산은 일반 .tsx와 동일한 결과를 유지합니다(twice(3)을 w에 주면 Devup spacing 변환으로 24px).
  • 평가하는 helper가 bare import로 읽는 JavaScript dependency의 실행 효과도 유지합니다. transitive dependency의 throw와 catch한 Date 읽기는 해당 dependency의 원본 위치에서 실패하며, 정상 dependency도 watch 목록에서 빠지지 않습니다. 원래 유지하던 외부/CSS side-effect import 규칙은 별도로 보존합니다.
  • helper CSS 해석 실패: style import를 찾지 못하면 helper의 원본 import 위치, specifier, helper를 통해 stylesheet가 CSS를 불러오지만 파일을 찾을 수 없다는 원인과 correct the path or import CSS from a component module 수정 방법을 보고합니다. 다른 Windows drive 또는 호환되지 않는 root이면 원본 import 위치에서 양쪽 경로를 보고하고 같은 drive를 쓰거나 component module에서 CSS를 import하도록 안내합니다. 절대 경로 import로 대체하지 않습니다.
  • CSS export 관찰: bundler가 생성하는 class 이름은 build-time에 알 수 없으므로 default/namespace의 property·conversion·in·키 열거·descriptor·prototype 관찰이나 named binding의 value 읽기는 첫 실제 원본 읽기 위치, CSS 파일, key 또는 operation을 보고합니다. catch하거나 예외 객체를 바꾸어도 실패하며 같은 site의 반복 읽기는 하나로 기록합니다. Fix는 한 번만 표시하고 runtime component의 className={styles.card}에서 읽거나 css()로 스타일을 쓰도록 안내합니다.

남는 한계

theme/devup.json과 plugin config loading은 W34, StyleX는 #758 범위라 수정하지 않았습니다. vanilla-extract theme 계약과 cross-module vars는 W35이며, 기존 Vite plugin 문제는 #755 범위입니다. imported_constants의 shadowed require 탐색은 #756 (W22c)에 coordinator를 통해 보고했으며 해당 브랜치를 합치지 않았습니다.

helper의 CSS import를 찾지 못한 실패 경로는 성공한 extraction의 dependency 목록을 bundler에 반환할 수 없습니다. 누락 CSS 파일을 생성한 뒤 stylesheet를 다시 저장해 재변환해야 합니다. 성공 시 CSS content를 extractor dependency에 넣지 않고 출력 import로 bundler가 추적하므로 정상 CSS 수정은 CSS HMR 경로를 유지합니다.

TypeScript의 기본 import elision을 따르므로 binding이 value로 참조되지 않는 TS CSS import는 유지하지 않습니다. .js/.jsx/.mjs/.cjs는 unused value import도 유지합니다. verbatimModuleSyntax/preserveValueImports 설정을 읽는 기능은 이 PR에 포함되지 않으므로 해당 프로젝트의 unused TS value import 보존 설정은 남는 한계이며 coordinator가 별도로 라우팅합니다.

같은 source에 있던 sandbox prelude가 정확한 local Math 상수까지 TDZ로 막던 경우도 제거했습니다. local max: () => 1은 builtin Math.max로 취급하지 않고 실제 1을 계산하며, 회귀 테스트는 Devup 변환 결과 width:4px 전체를 검증합니다. 정적으로 알 수 없는 shadowed Math/ambient 선언 입력은 기존 오류 또는 CSS 변수 경로를 유지합니다.

검증

  • 최종 head: 6d0c9c837598a08103051f51effda5ea65ffb2fc. Linux CI 37272641562는 Rust coverage 13650/13650 = 100.00%, 테스트, publish의 landing E2E 두 모드, landing-next-e2e, vinext-rsc-css-e2e 및 benchmark를 통과했습니다. 전체 conclusion은 failure이며 유일하게 실패한 step은 Upload to codecov.io입니다. cli.codecov.io의 Codecov CLI 다운로드에서 curl: (35) ... sslv3 alert handshake failure가 발생했고 뒤이어 내려받지 못한 codecov.SHA256SUM.sig의 GPG 확인이 실패한 외부 장애입니다. workflow나 검증을 약화하지 않았고, coordinator가 서비스 복구 뒤 실패 job을 재실행·확인합니다. upload 성공이나 전체 green을 주장하지 않습니다. Verify clean publish checkout과 changepack publish 단계는 skipped이므로 통과·배포로 표시하지 않습니다.
  • native workspace 테스트 3133개(그중 extractor 2410개), Rust 1.99 all-target clippy, cargo fmt, root build 및 모든 커밋의 기본 hook을 통과했습니다. lint는 0 error와 기존 2 warning입니다.
  • Bun: 로컬 5504 pass / 0 fail, Linux CI 5512 pass / 0 fail. CI aggregate 함수·줄 coverage 100%; 별도 로컬 파일인 기존 Vite comment line 303의 99.63%는 fix(plugin-core): align bundler resolution, roots and WASM diagnostics #755 범위이며 수정하지 않았습니다. publish의 Bun preload 회귀 6개와 landing E2E 130개씩 두 모드도 성공했습니다.
  • 최종 재빌드 WASM의 48개 공개 probe: 48 PASS. 아래 출력은 실제 before/after이며 긴 로컬 prefix와 공통 theme header만 줄였습니다.
  • package 경계 공개 probe: 별도 12 PASS. 기본·사용자 지정 package의 sibling 값은 static CSS로, 실제 bare/subpath API는 기존대로 처리하며 sibling side-effect import도 잃지 않습니다.
  • 추가 공개 probe: proof gap 15, Oracle repair 12, CSS import retention 13, CSS observation 17개 모두 PASS. CSS observation은 catch한 금지 관찰 14개가 원본 위치의 fatal 오류이며 typeof·객체 전달·미호출 함수 3개는 성공합니다.
  • 직전 repair head CI 37267674033은 coverage 13645/13650 = 99.96%만 실패했고 benchmark/Next/vinext는 성공했습니다. CI가 가리킨 absolute-root/leading-relative-parent path normalization 및 computed/private member provenance를 인접한 의미 있는 테스트로 보강했습니다. coverage 제외 없이 최종 run에서 다시 측정했습니다.
  • Windows 기본 main-thread stack에서 unchanged debug benchmark 14개 전부 성공했습니다. stack 환경 변수·linker flag·큰 stack thread·benchmark 제외는 없습니다. 기존 베이스의 all-target LLVM coverage 97.86%와 Windows 측정은 Linux 100% 판정을 대신하지 않습니다.
  • Rust LSP daemon은 timeout, JS LSP는 설치되지 않아 LSP-clean은 주장하지 않습니다. 실제 compiler/clippy/test/WASM 및 Linux CI로 검증했습니다.
  • foreground read-only delta Oracle 1회는 legacy accessor lookup 및 evaluated helper의 bare dependency 누락 두 P1을 발견해 REJECT했습니다. 두 항목은 failing-before 회귀, 별도 수정 commit 및 재빌드 WASM/native/CI로 해소했습니다(gate-delta-resolution.md). coordinator 지시대로 두 번째 Oracle는 호출하지 않았으며 첫 판정은 승인으로 바꾸지 않았습니다.
  • gate 이전 head 3dc297ca의 CI 37245692977은 두 attempt 모두 Rust 13430/13430 = 100% 및 테스트/E2E/benchmark를 통과했고 Codecov CLI 인증서/TLS/GPG 다운로드만 실패했습니다. 최종 repair head의 측정은 위 새 run에 따로 기록합니다.

Oracle 지적별 해소

  • imported literal만 확인하고 helper의 throw/금지 읽기를 건너뛰던 정적 증명: dca611f6에서 dependency graph의 실행 효과까지 재귀적으로 증명한 뒤에만 exact precompute를 허용했습니다. helper/transitive throw·caught Date·cycle negative와 pure helper control이 15개 공개 probe로 검증되었습니다.
  • inert 함수 선언과 exact twice(3) 계산을 stylesheet가 잘못 거부: Function shape를 plain data와 구분하고 기존 exact evaluator를 실행 전 dispatch에 재사용했습니다. 미호출 함수는 성공하고 호출한 Date 함수는 실패하며 .css.ts와 .tsx 모두 width:24px입니다. Function/data branch join gap도 별도 9개 회귀로 막았습니다.
  • 일반 extractor의 recoverable parser/semantic early error 수용: 06c66b96에서 parser diagnostic, regex 검증 및 semantic syntax 검증의 첫 원본 label을 전파했습니다. 최상위 return·잘못된 regex·중복 const·octal의 이전 성공이 원본 위치의 build error로 바뀐 실제 출력은 아래에 있습니다.
  • synthetic getter 노출로 red 대신 blue CSS 선택: descriptor/Function-source guard를 보강한 뒤 042d6a69에서 legacy getter/setter의 반환 accessor identity까지 호스트가 추적하고 throw 전에 기록했습니다. 일반 사용자 accessor와 override는 유지하며 anonymous callee의 sparse source-map mark를 구조적으로 보완해 정확한 원본 expression token을 보고합니다. legacy 6개 fatal과 일반 accessor/override 3개 control을 공개 WASM으로 검증했습니다.
  • evaluated helper의 bare dependency 누락: 042d6a69에서 기존 loader/cache/cycle/definition 경로로 helper의 JavaScript bare dependency를 source/DFS 순서대로 한 번 실행하고 dependency 목록에 남겼습니다. effect 파일의 throw·caught Date는 원본 effect 위치에서 실패하고 pure effect/helper는 둘 다 추적됩니다. 확장한 CSS retention/관찰 규칙도 13+17개 공개 probe와 인접 native 회귀로 검증했습니다.
parser: before / after
BEFORE
=== ERROR ===
Parser panicked
AFTER
=== ERROR ===
fixtures/syntax-before.tsx:2:31: Cannot parse source: Unterminated regular expression. Fix: correct the syntax at this location
no-resolver: before / after
BEFORE
=== ERROR ===
Cannot load './tokens' without a module resolver
AFTER
=== ERROR ===
fixtures/resolve.css.ts:2:23: Cannot load './tokens' without a module resolver. Fix: build through a Devup UI plugin, which resolves imports, or write what './tokens' provides in this file
missing: before / after
BEFORE
=== ERROR ===
Cannot resolve './missing' from 'fixtures/missing-before.css.ts'
AFTER
=== ERROR ===
fixtures/missing-before.css.ts:2:23: Cannot resolve './missing' from 'fixtures/missing-before.css.ts'. Fix: check that './missing' exists with a supported extension and that the bundler's resolver can find it from this file
cycle: before / after
BEFORE
=== ERROR ===
JS execution error: ReferenceError: Cannot access 'color' of 'fixtures/cycle-a.ts' before its initialization: it is part of an import cycle (unknown at :11:3)
    at get (unknown at :1:157)
    at <main> (unknown at :9:28)
    at <main> (unknown at :11:3)
AFTER
=== ERROR ===
fixtures/cycle-b.ts:2:22: JS execution error: ReferenceError: Cannot access 'color' of 'fixtures/cycle-a.ts' before its initialization: it is part of an import cycle. Fix: break the import cycle, or read the imported value only after both modules finished evaluating, for example inside a function called later
    at <main> (fixtures/cycle-b.ts:2:22)
throw: before / after
BEFORE
=== ERROR ===
JS execution error: Error: fixture boom (unknown at :2:7)
    at <main> (unknown at :2:7)
AFTER
=== ERROR ===
fixtures/throw-before.css.ts:2:7: JS execution error: Error: fixture boom. Fix: remove or guard the code that fails here, or correct the cause above, so the stylesheet evaluates without throwing
    at <main> (fixtures/throw-before.css.ts:2:7)
imported-stylesheet: before / after
BEFORE
=== ERROR ===
JS execution error: Error: imported stylesheet boom (unknown at :3:7)
    at <main> (unknown at :3:7)
AFTER
=== ERROR ===
fixtures/broken.css.ts:4:7: JS execution error: Error: imported stylesheet boom. Fix: remove or guard the code that fails here, or correct the cause above, so the stylesheet evaluates without throwing
    at <main> (fixtures/broken.css.ts:4:7)
imported-helper: before / after
BEFORE
=== ERROR ===
JS execution error: Error: imported helper boom (unknown at :13:3)
    at fail (unknown at :9:8)
    at <main> (unknown at :11:19)
    at <main> (unknown at :13:3)
AFTER
=== ERROR ===
fixtures/broken-helper.ts:4:9: JS execution error: Error: imported helper boom. Fix: remove or guard the code that fails here, or correct the cause above, so the stylesheet evaluates without throwing
    at fail (fixtures/broken-helper.ts:4:9)
    at <main> (fixtures/broken-helper.ts:6:34)
resolver-throw: before / after
BEFORE
=== ERROR ===
Cannot resolve './tokens' from 'fixtures/resolve.css.ts'
AFTER
=== ERROR ===
fixtures/resolve.css.ts:2:23: module resolver failed for `./tokens` from `fixtures/resolve.css.ts`: resolver fixture: permission denied
Fix: repair the module resolver; return {path:string,code:string} with a non-empty path, or null/undefined for an unresolved module.
resolver-getter: before / after
BEFORE
=== ERROR ===
Cannot resolve './tokens' from 'fixtures/resolve.css.ts'
AFTER
=== ERROR ===
fixtures/resolve.css.ts:2:23: module resolver failed for `./tokens` from `fixtures/resolve.css.ts`: resolver fixture: path getter failed
Fix: repair the module resolver; return {path:string,code:string} with a non-empty path, or null/undefined for an unresolved module.
resolver-malformed: before / after
BEFORE
=== ERROR ===
Cannot resolve './tokens' from 'fixtures/resolve.css.ts'
AFTER
=== ERROR ===
fixtures/resolve.css.ts:2:23: module resolver failed for `./tokens` from `fixtures/resolve.css.ts`: malformed module resolver result: `path` must be a string
Fix: repair the module resolver; return {path:string,code:string} with a non-empty path, or null/undefined for an unresolved module.
clock-first: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{width:1791113503291px}
AFTER
=== ERROR ===
fixtures/clock.css.ts:2:39: JS execution error: ReferenceError: `Date` cannot be read at build time: the time it gives differs on every build. Fix: use a literal or a CSS variable for `Date`: the time it gives differs on every build
    at <read> (fixtures/clock.css.ts:2:39)
clock-second: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{width:1791113503389px}
AFTER
=== ERROR ===
fixtures/clock.css.ts:2:39: JS execution error: ReferenceError: `Date` cannot be read at build time: the time it gives differs on every build. Fix: use a literal or a CSS variable for `Date`: the time it gives differs on every build
    at <read> (fixtures/clock.css.ts:2:39)
caught-clock: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{width:1791113502929px}
AFTER
=== ERROR ===
fixtures/caught-clock.css.ts:3:15: JS execution error: ReferenceError: `Date` cannot be read at build time: the time it gives differs on every build. Fix: use a literal or a CSS variable for `Date`: the time it gives differs on every build
    at <read> (fixtures/caught-clock.css.ts:3:15)
devup-fallback: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
throw new Error("fixture boom");
export const red = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
fixtures/css-fallback.css.ts:2:7: JS execution error: Error: fixture boom. Fix: remove or guard the code that fails here, or correct the cause above, so the stylesheet evaluates without throwing
    at <main> (fixtures/css-fallback.css.ts:2:7)
style-getter-throw: before / after
BEFORE
=== CODE ===
export const card = "";
=== CSS (theme header omitted) ===

AFTER
=== ERROR ===
fixtures/getter-throw.css.ts:2:49: JS execution error: Error: style getter boom. Fix: remove or guard the code that fails here, or correct the cause above, so the stylesheet evaluates without throwing
    at get width (fixtures/getter-throw.css.ts:2:49)
    at stringify (native)
    at style (native)
    at <main> (fixtures/getter-throw.css.ts:2:26)
placeholder-name: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const second = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const __style_1__ = "a";
export const second = "b";
=== CSS (theme header omitted) ===
.b{color:blue}.a{color:red}
gate effects-throw: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import { color } from "./helper";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
fixtures/effects-throw.ts:2:7: JS execution error: Error: helper boom. Fix: remove or guard the code that fails here, or correct the cause above, so the stylesheet evaluates without throwing
    at <main> (fixtures/effects-throw.ts:2:7)
gate effects-caught-clock: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import { color } from "./helper";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
fixtures/effects-caught-clock.ts:2:7: JS execution error: ReferenceError: `Date` cannot be read at build time: the time it gives differs on every build. Fix: use a literal or a CSS variable for `Date`: the time it gives differs on every build
    at <read> (fixtures/effects-caught-clock.ts:2:7)
gate unused-function: before / after
BEFORE
=== ERROR ===
/src/card.css.ts:3:24: JS execution error: TypeError: not a callable function. Fix: check that every value read, called or constructed here exists when the stylesheet is evaluated at build time
    at <main> (/src/card.css.ts:3:24)
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
function unused() {}
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
gate twice-css: before / after
BEFORE
=== ERROR ===
/src/card.css.ts:3:24: JS execution error: TypeError: not a callable function. Fix: check that every value read, called or constructed here exists when the stylesheet is evaluated at build time
    at <main> (/src/card.css.ts:3:24)
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
const twice = (n: number) => n * 2;
export const card = "a";
=== CSS (theme header omitted) ===
.a{width:24px}
recoverable-0: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
return 1;
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
fixtures/recoverable-0.tsx:2:1: Cannot parse source: A 'return' statement can only be used within a function body. Fix: correct the syntax at this location
recoverable-1: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
const invalid = /[z-a]/;
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
fixtures/recoverable-1.tsx:2:20: Cannot parse source: Invalid regular expression: Character class atom range out of order. Fix: correct the syntax at this location
recoverable-2: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
const repeated = 1;
const repeated = 2;
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
fixtures/recoverable-2.tsx:2:7: Cannot parse source: Identifier `repeated` has already been declared. Fix: correct the syntax at this location
recoverable-3: before / after
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
const invalid = 1;
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
fixtures/recoverable-3.tsx:2:17: Cannot parse source: '0'-prefixed octal literals and octal escape sequences are deprecated. Fix: correct the syntax at this location
guarded-descriptors: 기록된 이전 관찰 / 실제 after

descriptor-result.md의 기존 WASM 관찰: export const card = "a"; 및 .a{color:blue}. 보호용 accessor의 value가 undefined인 정보를 노출해 일반 JS와 다른 분기를 선택했습니다.

AFTER
=== ERROR ===
fixtures/reflected-random.css.ts:2:36: JS execution error: ReferenceError: `Math.random` cannot be read at build time: the chance it gives differs on every build. Fix: use a literal or a CSS variable for `Math.random`: the chance it gives differs on every build
    at <read> (fixtures/reflected-random.css.ts:2:36)
function-source: 기록된 이전 관찰 / 실제 after

W32-progress.md의 기존 WASM 관찰: 함수에 삽입한 _devup_read_site 문자열을 읽어 blue CSS를 선택했습니다. 원래 함수 소스를 읽는 의미를 보존하지 못했습니다.

AFTER
=== ERROR ===
fixtures/function-source.css.ts:3:36: JS execution error: ReferenceError: `Function.prototype.toString` cannot be read at build time: its text changes when the build transforms the function. Fix: use a literal or a CSS variable for `Function.prototype.toString`: its text changes when the build transforms the function
    at <read> (fixtures/function-source.css.ts:3:36)
package 경계: 실제 before / after 12개
@devup-ui/react:css-sibling
BEFORE
=== ERROR ===
/src/shared.ts:1:108: `css()` cannot use `value` at build time: its values must be literals, theme tokens or constants, or be computed from them
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import { value } from "@devup-ui/react-values";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
@devup-ui/react:jsx-sibling
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import { value } from "@devup-ui/react-values";
export const View = <div className="a c" style={{ "--b": value }} />;
=== CSS (theme header omitted) ===
.a{color:var(--b)}.c{padding:16px}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import { value } from "@devup-ui/react-values";
export const View = <div className="a b" />;
=== CSS (theme header omitted) ===
.a{color:red}.b{padding:16px}
@devup-ui/react:api
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
@devup-ui/react:api/compat
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
@devup-ui/react:side-effect-sibling
BEFORE
=== CODE ===
export const token = "var(--var-0-0)";
=== CSS (theme header omitted) ===

AFTER
=== CODE ===
import "@devup-ui/react-values";
export const token = "var(--var-0-0)";
=== CSS (theme header omitted) ===

@devup-ui/react:generated-css-subpath
BEFORE
=== CODE ===
export const token = "var(--var-0-0)";
=== CSS (theme header omitted) ===

AFTER
=== CODE ===
export const token = "var(--var-0-0)";
=== CSS (theme header omitted) ===

@my/ui:css-sibling
BEFORE
=== ERROR ===
/src/shared.ts:1:90: `css()` cannot use `value` at build time: its values must be literals, theme tokens or constants, or be computed from them
AFTER
=== CODE ===
import "@my/ui/devup-ui.css";
import { value } from "@my/ui-tokens";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
@my/ui:jsx-sibling
BEFORE
=== CODE ===
import "@my/ui/devup-ui.css";
import { value } from "@my/ui-tokens";
export const View = <div className="a c" style={{ "--b": value }} />;
=== CSS (theme header omitted) ===
.a{color:var(--b)}.c{padding:16px}
AFTER
=== CODE ===
import "@my/ui/devup-ui.css";
import { value } from "@my/ui-tokens";
export const View = <div className="a b" />;
=== CSS (theme header omitted) ===
.a{color:red}.b{padding:16px}
@my/ui:api
BEFORE
=== CODE ===
import "@my/ui/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@my/ui/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
@my/ui:api/compat
BEFORE
=== CODE ===
import "@my/ui/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@my/ui/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
@my/ui:side-effect-sibling
BEFORE
=== CODE ===
export const token = "var(--var-0-0)";
=== CSS (theme header omitted) ===

AFTER
=== CODE ===
import "@my/ui-tokens";
export const token = "var(--var-0-0)";
=== CSS (theme header omitted) ===

@my/ui:generated-css-subpath
BEFORE
=== CODE ===
export const token = "var(--var-0-0)";
=== CSS (theme header omitted) ===

AFTER
=== CODE ===
export const token = "var(--var-0-0)";
=== CSS (theme header omitted) ===

Oracle 두 P1 해소: 실제 before / after 12개
legacy-function-getter
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:blue}
AFTER
=== ERROR ===
/src/card.css.ts:3:38: JS execution error: ReferenceError: `Function.prototype.toString` cannot be read at build time: its text changes when the build transforms the function. Fix: use a literal or a CSS variable for `Function.prototype.toString`: its text changes when the build transforms the function
    at <read> (/src/card.css.ts:3:38)
legacy-math-getter
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:blue}
AFTER
=== ERROR ===
/src/card.css.ts:3:37: JS execution error: ReferenceError: `Math.random` cannot be read at build time: the chance it gives differs on every build. Fix: use a literal or a CSS variable for `Math.random`: the chance it gives differs on every build
    at <read> (/src/card.css.ts:3:37)
legacy-function-setter
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:blue}
AFTER
=== ERROR ===
/src/card.css.ts:3:38: JS execution error: ReferenceError: `Function.prototype.toString` cannot be read at build time: its text changes when the build transforms the function. Fix: use a literal or a CSS variable for `Function.prototype.toString`: its text changes when the build transforms the function
    at <read> (/src/card.css.ts:3:38)
legacy-math-setter
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:blue}
AFTER
=== ERROR ===
/src/card.css.ts:3:37: JS execution error: ReferenceError: `Math.random` cannot be read at build time: the chance it gives differs on every build. Fix: use a literal or a CSS variable for `Math.random`: the chance it gives differs on every build
    at <read> (/src/card.css.ts:3:37)
legacy-date-getter
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:blue}
AFTER
=== ERROR ===
/src/card.css.ts:3:37: JS execution error: ReferenceError: `Date` cannot be read at build time: the time it gives differs on every build. Fix: use a literal or a CSS variable for `Date`: the time it gives differs on every build
    at <read> (/src/card.css.ts:3:37)
legacy-date-setter
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:blue}
AFTER
=== ERROR ===
/src/card.css.ts:3:37: JS execution error: ReferenceError: `Date` cannot be read at build time: the time it gives differs on every build. Fix: use a literal or a CSS variable for `Date`: the time it gives differs on every build
    at <read> (/src/card.css.ts:3:37)
ordinary-getter
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
ordinary-setter
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
own-random-override
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
bare-helper-throw
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/effect.ts:2:7: JS execution error: Error: side-effect boom. Fix: remove or guard the code that fails here, or correct the cause above, so the stylesheet evaluates without throwing
    at <main> (/src/effect.ts:2:7)
bare-helper-caught-date
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/effect.ts:2:7: JS execution error: ReferenceError: `Date` cannot be read at build time: the time it gives differs on every build. Fix: use a literal or a CSS variable for `Date`: the time it gives differs on every build
    at <read> (/src/effect.ts:2:7)
bare-helper-pure
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
helper CSS import: 실제 before / after 13개

unused TS default/named/namespace import는 기본 elision에 따라 출력하지 않는 정상 control입니다. value로 참조되지만 호출되지 않는 함수의 import는 유지되며, JS/CJS의 unused load는 native 회귀가 별도로 검증합니다.

bare-css
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./theme.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
other-directory
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "../helpers/theme.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
package-exports-css
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "../node_modules/theme/dist/main.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
default-unused
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
named-unused
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
namespace-unused
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
query-suffix
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./theme.module.css?inline";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
root-helper-order
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./before.css";
import "./after.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./before.css";
import "./theme.module.css";
import "./after.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
root-helper-dedup
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./theme.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./theme.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
missing-css
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/project/src/helper.ts:1:8: Cannot resolve CSS './theme.module.css' from '/project/src/helper.ts': the stylesheet loads CSS through this helper and the file cannot be found. Fix: correct the path or import CSS from a component module; after creating a missing file, re-save the stylesheet to retry
css-export-read
BEFORE
=== ERROR ===
/project/src/theme.module.css:1:1: JS execution error: SyntaxError: Unexpected token. Fix: correct the syntax at this location
AFTER
=== ERROR ===
/project/src/helper.ts:2:22: JS execution error: ReferenceError: Cannot read CSS export 'card' of '/project/src/theme.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/project/src/helper.ts:2:22)
    at  (/project/src/helper.ts:2:22)
uncalled-css-export-read
BEFORE
=== ERROR ===
/project/src/theme.module.css:1:1: JS execution error: SyntaxError: Unexpected token. Fix: correct the syntax at this location
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./theme.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
called-css-export-read
BEFORE
=== ERROR ===
/project/src/theme.module.css:1:1: JS execution error: SyntaxError: Unexpected token. Fix: correct the syntax at this location
AFTER
=== ERROR ===
/project/src/helper.ts:2:26: JS execution error: ReferenceError: Cannot read CSS export 'card' of '/project/src/theme.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/project/src/helper.ts:2:26)
    at read (/project/src/helper.ts:2:26)
    at  (/project/src/helper.ts:2:65)
CSS 관찰과 catch: 실제 before / after 17개
caught-property
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'card' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
caught-named
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'card' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
caught-namespace
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'card' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
primitive-conversion
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'Symbol(Symbol.toPrimitive)' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
value-of
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'valueOf' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
to-string
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'toString' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
in-check
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'has:card' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
keys
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'ownKeys' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
for-in
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:16: JS execution error: ReferenceError: Cannot read CSS export 'ownKeys' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:16)
    at  (/src/helper.ts:2:16)
    at  (/src/helper.ts:2:54)
spread
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:10: JS execution error: ReferenceError: Cannot read CSS export 'ownKeys' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:10)
    at  (/src/helper.ts:2:10)
json
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'toJSON' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
descriptor
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'getOwnPropertyDescriptor:card' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
prototype
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:7: JS execution error: ReferenceError: Cannot read CSS export 'getPrototypeOf' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:7)
    at  (/src/helper.ts:2:7)
called-function-caught
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== ERROR ===
/src/helper.ts:2:29: JS execution error: ReferenceError: Cannot read CSS export 'card' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css()
    at <read> (/src/helper.ts:2:29)
    at  (/src/helper.ts:2:29)
    at  (/src/helper.ts:2:68)
typeof-object
BEFORE
=== ERROR ===
/src/helper.ts:2:29: JS execution error: ReferenceError: Cannot read CSS export 'default' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css(). Fix: remove or guard the code that fails here, or correct the cause above, so the stylesheet evaluates without throwing
    at <main> (/src/helper.ts:2:29)
    at <main> (/src/helper.ts:2:29)
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
object-passing
BEFORE
=== ERROR ===
/src/helper.ts:2:61: JS execution error: ReferenceError: Cannot read CSS export 'default' of '/src/styles.module.css' at build time: CSS module class names are generated by the bundler and are unknown at build time. Fix: use the class in a runtime component (className={styles.card}) or write the style with css(). Fix: remove or guard the code that fails here, or correct the cause above, so the stylesheet evaluates without throwing
    at <main> (/src/helper.ts:2:61)
    at <main> (/src/helper.ts:2:61)
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
uncalled-read
BEFORE
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
AFTER
=== CODE ===
import "@devup-ui/react/devup-ui.css";
import "./styles.module.css";
export const card = "a";
=== CSS (theme header omitted) ===
.a{color:red}
전체 48개 QA 및 추가 회귀

W32 Real WASM QA

Case Observed Contract Verdict Artifact
parser located build error, cause and fix PASS after.json
parser-repair compiled exact static input PASS after.json
no-resolver located build error, cause and fix PASS after.json
resolved-repair compiled exact static input PASS after.json
missing located build error, cause and fix PASS after.json
cycle located build error, cause and fix PASS after.json
throw located build error, cause and fix PASS after.json
throw-repair compiled exact static input PASS after.json
window located build error, cause and fix PASS after.json
environment located build error, cause and fix PASS after.json
vanilla-fallback located build error, cause and fix PASS after.json
devup-fallback located build error, cause and fix PASS after.json
imported-stylesheet located build error, cause and fix PASS after.json
imported-helper located build error, cause and fix PASS after.json
require-missing located build error, cause and fix PASS after.json
require-helper-missing located build error, cause and fix PASS after.json
caught-clock located build error, cause and fix PASS after.json
style-getter-throw located build error, cause and fix PASS after.json
placeholder-name compiled exact static input PASS after.json
clock-repair compiled exact static input PASS after.json
deterministic-helper compiled exact static input PASS after.json
safe-css compiled exact static input PASS after.json
effects-throw located build error, cause and fix PASS after.json
effects-caught-clock located build error, cause and fix PASS after.json
effects-pure compiled exact static input PASS after.json
unused-function compiled exact static input PASS after.json
twice-css compiled exact static input PASS after.json
guarded-descriptors located build error, cause and fix PASS after.json
function-source located build error, cause and fix PASS after.json
recoverable-0 located build error, cause and fix PASS after.json
recoverable-1 located build error, cause and fix PASS after.json
recoverable-2 located build error, cause and fix PASS after.json
recoverable-3 located build error, cause and fix PASS after.json
clock-first located build error, cause and fix PASS after.json
clock-second located build error, cause and fix PASS after.json
Date.now() located build error, cause and fix PASS after.json
new Date().getTime() located build error, cause and fix PASS after.json
Math.random() located build error, cause and fix PASS after.json
performance.now() located build error, cause and fix PASS after.json
crypto.randomUUID() located build error, cause and fix PASS after.json
process.env.NODE_ENV located build error, cause and fix PASS after.json
Intl.DateTimeFormat().resolvedOptions().locale located build error, cause and fix PASS after.json
'I'.toLocaleLowerCase() located build error, cause and fix PASS after.json
'x'.normalize() located build error, cause and fix PASS after.json
resolver-throw located build error, cause and fix PASS after.json
resolver-getter located build error, cause and fix PASS after.json
resolver-primitive located build error, cause and fix PASS after.json
resolver-malformed located build error, cause and fix PASS after.json

조건·논리 연산에서 Function을 Unknown-data로 잃는 proof gap도 인접 회귀 테스트로 막고, mutation/clock helper negative fixture는 실제 export를 사용하도록 복구했습니다. 일반 descriptor, 사용자 override, getter 미실행, symbol/flags/receiver 및 catch 후 불변 오류 증거는 native 회귀가 검증합니다.

2026-10-08 main 11790bef를 병합하여 업데이트했습니다. 충돌 없이 갱신된 부모 PR의 변경과 main의 변경을 모두 보존했습니다.

owjs3901 and others added 30 commits October 1, 2026 21:16
…rations

css(a, b) composing classes whose styles the build knows, bound to css() in the file or exported by another module, merges their atoms per property, selector, breakpoint and layer, conditions included, instead of joining classes whose winner the stylesheet order picked. vanilla-extract style([...]) passes each composed style as its own argument, keeping a style composed again later.

Refs #688

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

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

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

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

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

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

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

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

Refs #688

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…JSX spreads win

Refs #688

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…led order and JSX element className

Refs #688

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

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

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…uate shouldForwardProp at build time

Refs #689

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

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

Refs #689

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

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

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

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

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
… and conditional styles

Refs #690

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

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

Refs #690

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

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

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

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

Refs #690

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

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

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…ead through namespaces

Refs #695

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…akes from the visitor

Refs #695

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…eclared after their use

Refs #695, #686

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

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

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

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

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

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

Refs #695

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
owjs3901 and others added 18 commits October 8, 2026 15:11
No conflicted files; preserve composition changes and main ESLint checks.
No conflicted files; combine updated parent and PR changes.
No conflicted files; combine updated parent and PR changes.
Conflicted file: libs/extractor/src/lib.rs. Retain both composition helper and regression tests from PR 706 and Tailwind per-class regression tests from main 11790be; take rewritten main Tailwind implementation with Rust 1.99 assertions. bun.lock regenerated by bun install; no snapshots were hand-merged.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Merge updated parent PR 706 (30247ba), containing main 11790be. Conflicted file: libs/extractor/src/prop_modify_utils.rs. Preserve PR 707's last-written className/style spread semantics and no spread_props parameter with capacity 2, together with main's per-class Tailwind compiler. No snapshots were hand-merged.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
No conflicted files; retain PR changes and merge updated parent #707, which contains main 11790be.
No conflicted files; retain PR changes and merge updated parent #710, which contains main 11790be.
No conflicted files; retain PR changes and merge updated parent #711, which contains main 11790be.
No conflicted files; retain PR changes and merge updated parent #722, which contains main 11790be.
Merge updated parent PR 727 (12328b9), containing main 11790be. Conflicted file: packages/bun-plugin/src/plugin.ts. Preserve PR 728's readJsxImportSource alias discovery and main PR 703's compiledPackages scanner, Bun.build stylesheet deferral, runtime writes and debug policy; keep main PR 704 plugin CSS behavior. WASM/root builds and real Bun stylesheet regression passed; no snapshots were hand-merged.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
No conflicted files; retain PR changes and merge updated parent #728, which contains main 11790be.
No conflicted files; retain PR changes and merge updated parent #729, which contains main 11790be.
No conflicted files; retain PR changes and merge updated parent #730, which contains main 11790be.
Merge updated parent PR 737 (70d6417), containing main 11790be. Conflicted file: packages/bun-plugin/src/plugin.ts. Union main's direct StyleX/alias package scanner with PR 742's alias-aware hasDevupUI resolver detection so local barrel consumers remain compiled; preserve main Bun.build CSS deferral, runtime writes and debug policy. Add real Box/css local-barrel regression; all 7 Bun CSS regressions and fresh WASM/root builds pass. No snapshots were hand-merged.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
The automatic merge of main 11790be replaced the Bun source gate with a direct package scanner, which missed PR 737 local barrel imports. Keep that scanner for main's StyleX/alias behavior and add the original three-argument resolver-aware hasDevupUI fallback. Add a real-process Box/css barrel regression; fresh WASM/root builds and all 7 Bun stylesheet regressions pass. No new build errors or runtime styling are introduced.

Refs #686

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Merge updated parent PR 737 fix f66b4c5, containing main 11790be and the real Bun barrel regression. Conflicted file: packages/bun-plugin/src/plugin.ts. Preserve the identical scanner/resolver union and retain PR 742's fourth importAliases argument instead of the parent's three-argument API. The resolved tree is identical to the already-verified PR 742 tree; fresh WASM/root builds still pass.

Refs #686

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
No conflicted files; retain PR changes and merge updated parent #742, which contains main 11790be.
No conflicted files; retain PR changes and merge updated parent #750, which contains main 11790be.
owjs3901 added a commit that referenced this pull request Oct 8, 2026
Merge #757 at 78ef660 after the genuine
#756 integration975f3371. Recursive merge bases74afb760 and6d0c9c83 produce
an identical tree3c14e7e427686d8802d1e0722afc33515d3eed28 with no conflicts
or source changes. Preserve both exact base histories and normal hook gates.

Keep the approved six incoming Tailwind expectation and two incoming ESLint
fixture reconciliations from the prior merge, current JSX capture/constant-fold
semantics, located metadata errors, and existing HEAD assertions/goldens.
F195 and the remaining coverage units are separate subsequent changes.

Refs #684 #685

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
owjs3901 added a commit that referenced this pull request Oct 9, 2026
Refs #690, #693

Merge exact 78ef660 as the second parent of c464f90, preserving MERGE_HEAD through one real CI-unset hook with CARGO_BUILD_JOBS=2. The indexed tree 09c939d is identical to the previous HEAD; this is a history-only merge, not an ordinary empty commit. No rebuild or additional gate rerun is required for an identical tree by the coordinator's W35j instruction. Linux CI 37854211490 remains the coverage authority at 98.05 percent, 368 uncovered lines, with no failing test; meaningful coverage completion follows.

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

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
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