Skip to content

test(binding): validate native addon coverage on Linux (spike) - #796

Draft
owjs3901 wants to merge 4 commits into
fix/portable-binding-statefrom
feat/napi-binding
Draft

owjs3901 wants to merge 4 commits into
fix/portable-binding-statefrom
feat/napi-binding

Conversation

@owjs3901

@owjs3901 owjs3901 commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Refs #686 (napi phase 1). 이 Draft는 #794 (fix/portable-binding-state) 위에 쌓입니다. #794는 #752에 기존 디스크 상태 및 allocator-only 체크포인트 admission guard가 포함되기 전에 병합하면 안 됩니다. 두 PR 모두 Draft를 유지합니다.

요약

  • 현재 제품 head는 승인된 중간 커밋 A ddc9ea601decc4a84d715d255a2a613c1cb9c99b입니다. 공통 libs/binding, WASM의 기계적 위임, 실제 N-API 백엔드와 25개 시나리오 원시 바이트 비교 하네스를 포함합니다.
  • 플러그인, plugin-utils 및 엔진 선택 옵션은 변경하지 않았습니다. 공개 로더, 플랫폼 패키지 8개, 실제 제품 Rust/Bun 100%, 플랫폼 matrix, 패킹·릴리스와 최적화 성능 검증은 미완료입니다.
  • 커밋 B는 아직 미커밋이며 성능 승인을 받지 않았습니다. 별도 CI 성능 실험은 아래의 두 측정 전 설정 실패로 중단했습니다. 측정값이 없으므로 후보의 우열이나 성능 회복을 주장하지 않습니다.

동작

  • 공통 코어가 단일 stylesheet, 추출 결과, 예약 scratch 상태, 네 가지 결정론적 원시 export/import 및 두 종류의 reset을 소유합니다. JS 값과 resolver 핸들은 각 호스트 어댑터에 남습니다.
  • 네이티브 디코더는 원래 JS 값을 대상으로 기존 Rust Deserialize 구현을 호출합니다. Map/Set/struct 구분과 wasm32 인덱스 범위를 보존하며 JSON 변환으로 입력을 정규화하지 않습니다. JSON.stringify는 기존 WASM 형식의 오류 진단에만 사용합니다.
  • 비동기 풀, WASI, WASM 자동 폴백, 설치 시 컴파일과 스타일링 런타임은 추가하지 않았습니다. 현재 private createBinding(raw)는 29개 이름과 추출 함수 인자 8개를 유지하지만 공개 패키지 로더의 대체 증거는 아닙니다.

새로 생기는 오류

중간 커밋 A는 기존 WASM 동작을 변경하지 않습니다. A의 엄격한 identity는 396개 레코드 중 390·392의 setPrefix(false) / setPrefix(true)에서 WASM RuntimeError와 native Error가 달라 여전히 RED입니다. 이 실패를 제외하거나 정규화하지 않습니다.

승인된 별도 커밋 B는 잘못된 JS 타입에 대해 함수·인자·기대 타입을 명시한 동일한 TypeError를 두 엔진에서 상태 변경 전에 발생시키며, WASM의 잘못된 타입 메모리 trap을 TypeError로 바꿀 예정입니다. 실제 extractor 위치 오류, 사용자 getter/iterator 예외 및 resolver callback 정책은 보존해야 합니다. B의 소스는 보존했지만 이 변경은 아직 제품 head에 전달하지 않았습니다. 아래 CI 설정 오류는 새로운 제품 빌드 오류가 아닙니다.

남는 한계

  • 실제 제품 소스의 Linux Node-host tarpaulin 100%와 Bun authored JS 100%는 미완료입니다. 기존 스파이크 19/19를 제품 커버리지로 대신하지 않습니다.
  • Linux Bun 1.4.3의 스파이크 실제 애드온 실행은 성공했지만 Rust 프로파일이 없었습니다. 승인된 분리 정책에 따라 Rust 계측은 실제 Node 호스트로, Bun은 동일 애드온 실행과 JS 동작·커버리지로 검증해야 합니다. Node 프로파일 재사용은 하지 않습니다.
  • 임시 스파이크 fixture/workflow는 실제 제품 커버리지 작업으로 교체한 뒤 함께 제거합니다. ci: fail the benchmark job on a Devup UI regression and keep a WASM size budget #746 WASM 크기 게이트와 기존 임계값은 그대로 유지합니다.
  • 이전 미커밋 B의 보조 진단에서 unminified glue는 raw 48,063 > 44,032, gzip 8,788 > 8,192로 RED입니다. 승인된 생성 glue minification 커밋 C는 B 이후의 별도 작업이며 아직 구현하지 않았습니다. 이번 실패한 CI는 새 크기 측정 증거가 아닙니다.
  • npm 패키지 9개 이름 등록과 trusted publisher 설정은 유지보수자 사전 작업입니다. 게시나 공유 설정 변경은 하지 않았습니다.
  • 프로세스 전역 native 상태는 독립 빌드의 병렬 격리를 보장하지 않습니다. 지원 대상 8개 플랫폼의 실제·에뮬레이션·cross-build, libc/CPU 조건 및 최신 Node musl 가용성도 미검증입니다.

검증

  • 제품 A의 push CI 39527146351는 SUCCESS입니다. scratch-controls 성공이며 제품 native Linux 100%, 전체 identity나 플랫폼 matrix의 통과를 뜻하지 않습니다.
  • 이번 임시 실험 트리 두 개는 각각 전체 동일 tree에 정상 훅을 한 번씩 실행해 커밋했습니다. 두 훅 모두 Bun 6,631 pass / 0 fail, All files 함수 100.00 / 줄 100.00입니다. Windows Rust는 **96.66%(22,187/22,953)**이며 Linux 제품 100%로 주장하지 않습니다. 훅 우회, amend, 강제 push, 부분 스테이징은 없습니다.
  • 첫 훅은 866.799초, 시작 여유 7.144 GiB, 12 GiB 소유 Job 한도, 소유 프로세스 2,037개·잔여 0개였습니다. 승인된 수정의 실제 훅은 861.474초, 시작 여유 7.317 GiB, 동일 한도, 2,555개·잔여 0개였습니다. 수정 전 한 차례 메모리 preflight는 자식/훅 실행 전에 중단했습니다. 기본 Rust stack, stable, jobs=2, CI unset을 유지했습니다.
  • B의 원래 16개 소스 경로와 모든 SHA256을 복구·검증했으며 index는 비어 있습니다. 후보/입력/타이밍 드라이버/프로토콜 바이트는 변경하지 않았습니다. 별도 임시 성능 브랜치는 로컬과 원격 모두 삭제했고 ls-remote --heads의 빈 결과로 원격 삭제를 확인했습니다.
  • LSP 서버는 미설치 상태이므로 LSP 무오류를 주장하지 않습니다. 실제 syntax/ESLint, 비측정 contract 및 preflight 검증과 정상 훅의 결과를 구분해 기록합니다.

격리 CI 성능 실험 중단

프로토콜은 첫 실행 전에 고정했습니다. 37-valid-call corpus와 14개 cell, 후보별 32-process ABBA, 세 독립 runner job, Node/Bun latest, WASM inherited release와 native opt-level 3, 모든 샘플 보존 및 1%/3% 승인 기준을 선언했습니다. 로컬의 혼잡한 타이밍 결과로 승인하지 않았습니다.

실행 임시 head 실제 결과
39564789105 3cc50057297efc775ead53e8ec40d864169161d2 세 작업 모두 action이 주입한 CARGO_PROFILE_DEV_DEBUG=0을 preflight에서 거부했습니다. 컴파일러·API 증명·타이머 이전 실패이며 샘플 0개입니다.
39569692916 e9dd92745daf669bfa2d86dbae68ed7c3a8a5b18 승인된 workflow/preflight 수정 후 dev override는 실제 unset 상태입니다. 세 작업 모두 첫 frozen-A 조상 확인 Git 명령이 container checkout의 detected dubious ownership으로 exit 128을 반환했습니다. 컴파일러·API 증명·타이머 이전 실패이며 샘플 0개입니다.

두 실행의 모든 아티팩트를 보존했습니다. 각 작업에서 커밋된 harness와 26개 frozen manifest 항목의 해시를 재확인했습니다. 두 번째 실행도 측정 전에 실패하면 중단하라는 승인 조건에 따라 세 번째 실행은 하지 않았습니다. 절대 µs/call, 후보/A 비율, 최적화 native/WASM 수치는 아직 없으며 B, C 및 남은 native 단계는 추가 승인과 실제 측정 전까지 진행하지 않습니다.

owjs3901 and others added 4 commits October 20, 2026 23:28
Refs #686

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

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

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

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

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

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

Approved intermediate baseline A. Strict identity remains RED only at records 390 and 392: false/true setPrefix throws a WASM memory-access RuntimeError but a native Error. The shared all-position TypeError validation fix follows in its own commit B; this baseline does not waive identity, actual Linux native coverage, JS coverage, packaging, release, matrix, WASM size or performance gates.

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