• ARCA 0.1.16

    ARCA 0.1.16 변경 사항

    이전 버전: 0.1.15. 지원 native upstream·toolchain을 최신으로 올리고, JS 의존성(Nostalgist 0.22.0·@noble/hashes 2.4.0)과 TypeScript 7·pnpm 12 이행에 맞춰 player SDK의 private runtime 연결을 Emscripten 6 출력에 맞게 고친 release다. native runtime(mkxp-z core JS·WASM)이 0.1.13~0.1.15와 다르다. 새 공개 export·schema·오류 code·CLI 명령·Builder subcommand는 없고 삭제된 공개 API도 없다. rgss23-runtime-status-v1, 오류 code enum, inspection v1/fingerprint ABI, Builder 기본 출력·exit code는 그대로다.

    업그레이드 시 확인할 동작 변경

    삭제된 공개 API는 없다. 다만 아래는 기존 host가 관찰하는 결과가 달라질 수 있으므로 pin 갱신 전에 확인한다.

    • native runtime identity: runtime ZIP의 dist/rgss23-core.js(SHA-256 2f71fcaa…, 250,836 B)·dist/rgss23-core.wasm(d527ce81…, 44,417,072 B)가 바뀌었다. mkxp-z libretro Emscripten wrapper f0a1ff80, mkxp-z 5cd32036, RetroArch a7054054, Emscripten 6.0.11(4.0.8에서), WASI SDK 34(30에서), binaryen 133, CMake 4.4.4, Meson 1.12.1, sandbox CRuby 3.3.12(3.3.10에서), host CRuby 4.0.7, WABT 1.0.42, zlib 1.3.2, Boost 1.92.0으로 고정했다. sandbox CRuby는 upstream syntax-transform이 3.1/3.3 계열만 지원하므로 3.3 최신 patch를 유지한다. host는 새 release pin·Builder digest를 함께 적용하며 runtime artifact를 release 간에 섞지 않는다.
    • runtime license inventory: runtime ZIP 파일 수가 53개에서 67개로 늘었다. license exporter가 Stage 1 component(CRuby·libyaml·zlib·WABT)와 toolchain runtime component(wasi-libc), 전이 dependency(GCEM 등)의 원문 license를 source commit·hash로 검증해 runtime ZIP LICENSES/에 함께 넣는다. runtime ZIP의 파일 수와 THIRD_PARTY_NOTICES.json 구성 요소가 0.1.15와 다르다. verifyArcaRuntimeDirectory()는 ZIP의 SHA256SUMS를 따르므로 host 코드 변경은 없다.
    • player SDK private runtime 연결(관측 동작 동일, 공개 API 불변): Emscripten 6 출력에는 Module.calledRun이 없으므로 SDK는 같은 private factory 반환에서 실제 runtimeInitialized·ABORT를 읽어 초기화·abort를 관찰한다. Worker 생성 adapter는 Emscripten 4/6 두 source 형태를 받고 그 밖의 형태는 거부한다. canvas resize 별칭은 기존 export를 보존한다. Nostalgist 0.22.0의 keyboard cache가 retroarch.cfg의 mtime을 Date로 기대하므로 해당 instance의 private filesystem wrapper에서만 숫자 초를 Date로 변환한다(native Module.FS·다른 경로·공개 filesystem 의미 불변). 지원하지 않는 runtime 출력 형태는 준비 단계에서 실패한다.
    • Builder OCI: base image node:24.21.0-alpine(digest 고정)·Dockerfile frontend 1.27.1로 올리고 frozen install context에 apps/web/package.json을 포함한다. Builder subcommand·flag·exit code·오류 code는 그대로이며 digest만 바뀐다.
    • artifact identity: contracts tgz는 dist/builder.*의 producer version과 package.json만 0.1.15와 다르다. runtime ZIP은 native JS/WASM·provenance·license inventory·SDK module·SHA256SUMS가 다르다.

    추가된 API·계약

    없다. 공개 export·schema·오류 code·CLI 명령·Builder subcommand와 flag를 추가하거나 삭제하지 않았다.

    저장소·도구 정리

    • runtime build script: 고정 URL(ftp.gnu.org)에 접근할 수 없을 때 operator가 GNU mirror에서 받은 libiconv·libidn archive를 named volume의 /build/archive-seeds/<sourceFilename>에 두면 lock SHA-256이 같을 때만 network 없이 재사용한다(hash 불일치·symlink는 실패, seed 없으면 기존 download). seed 복사본은 download와 같은 mode 0644로 정규화한다. 이 변경으로 core stamp의 coreRecipeSha256가 바뀌며 lock·URL·patch는 그대로다.
    • runtime 재현성: mkxp-z-stage1-determinism patch와 SOURCE_DATE_EPOCH(고정 wrapper commit 시각)·LC_ALL=C·TZ=UTC로 Stage 1·core·frontend clean rebuild의 산출물·stamp를 결정적으로 만들었다. 재현 판정은 아래 검증 범위를 따른다.
    • native build helper: core dependency helper가 보존된 core source를 검증하고 syntax-transform smoke가 cleanup 증거를 남긴다. runtime:test:patches와 test:browser-tools에 page·VX save 입력 회귀를 추가했다.
    • smoke 도구: runtime·package identity를 tools/browser-smoke/artifact-identity.mjs가 소유하고 관측 report와 독립된 고정값을 쓴다. native VX save read entrypoint 두 형태를 모두 받는다.
    • JS 의존성: pnpm 12.8.1, TypeScript 7.0.2, Vite 8, Vitest 5, puppeteer-core 25.12.0, @types/node 24.19.1. SDK 검증 container image·RTP Docker base image도 함께 올렸다.
    • reference app: OPFS directory iteration이 표준 entries() 타입을 사용한다(동작 동일).

    검증 범위와 알려진 제한

    합성·단위 검증, 제공 fixture 자동화와 사람의 입력·실제 청취·완전 종료 저장 acceptance는 별도 판정한다. 이번 release는 새 사용자 acceptance를 포함하지 않으며 사람 검토, 실제 청취, LINKS 통합과 장시간 검증은 NOT RUN이다.

    • 제공 VX·VX Ace 자동 smoke: 2026-10-04 0296cf5(release source와 native JS·WASM·SDK source 동일)에서 Edge 154·Chrome 154·Firefox 153의 gold 시나리오 22개(이전 무관한 6개 통과 재사용 + 16개 직렬 실행)가 자동 PASS다. 새 사람 acceptance는 NOT RUN이다.
    • native runtime clean rebuild 재현: PASS(처음 게시하는 결정적 runtime). 2026-10-07 새 runtime image와 새 named volume에서 runtime:image·preflight·checkout·Stage 1 clean·core clean·frontend를 다시 실행한 export가 검증된 export와 JS·WASM byte 동일하고 provenance stamp도 archive seed 재사용 변경에 따른 coreRecipeSha256(와 frontend stamp의 core stamp hash)만 다르다. 같은 Docker host·Windows에서의 재현이며 다른 CPU 수·host·Linux는 NOT RUN이다.
    • 다른 CPU 수·host·Linux에서의 runtime·release 재현은 NOT RUN이다.
    • LINKS형 기본 저장소 경로는 package를 WASM heap에 복사한다. 큰 게임에서는 메모리 여유를 확인한다.
    • UTF-8 BOM이 있는 Game.ini는 지원하지 않는다(형식 오류로 처리).

    게시 identity와 registry 검증은 현재 상태, 상세 값은 해당 release manifest/pin을 따른다.

    배포 검증

    • release source: d4b864bc57 (버전 커밋 9759559 뒤에 release 생성 BLOCKED 기록 452e19a와 runtime build script의 archive seed 재사용 d4b864b를 포함)
    • manifest SHA-256: 3ea1e1945ce6136b446b54ca8fba356175891011c6c0c4b440349e18aa1fc804
    • Builder digest: sha256:8a1ce16a6f19e1d8a3d263e67627b1c0bbc01549ddf9e873d7fb92c1b3e70548
    • native runtime: rgss23-core.js 2f71fcaa…(250,836 B), rgss23-core.wasm d527ce81…(44,417,072 B). 0.1.15와 다르다.
    • 단위 테스트 426개, 타입 검사, release 회귀 33개, runtime lock·native 진단 lock·native 준비 recipe 검증, git diff --check: PASS(2026-10-07, host Node 24.18.0·pnpm 12.8.1).
    • release build·verify, npm 생성, source-free SDK/types/contracts/runtime 결속/Builder/CLI 소비(release:build·release:verify·release:npm:test): PASS(2026-10-07, source commit d4b864b).
    • release 재현(별도 clean detached worktree, frozen install, 같은 volume의 runtime:export, release:build): PASS(2026-10-07, 같은 Docker host·buildx cache, Windows만: pin·manifest·세 artifact·Builder digest·npm tgz byte 동일. Linux 재현은 NOT RUN)
    • release:reproduce script 자체는 pnpm 12의 corepack native 실행 파일(pnpm-native.exe)을 node로 실행하려다 ERR_UNKNOWN_FILE_EXTENSION으로 실패했다(도구 결함, 재현성 판정 아님). 수동 절차로 대신했고 수정은 다음 release 작업이다.
    • npm: @rgss23/arca@0.1.16 (Forgejo registry).

    0.1.15 대비 전체 변경

    Downloads 9