• ARCA 0.1.20

    ARCA 0.1.20 변경 사항

    이전 버전: 0.1.19. SA-06 빠른 시작·heap 축소 release다. native runtime(mkxp-z core JS·WASM)·SDK bundle·contracts tgz·Builder archive·npm tgz bytes가 바뀐다. 기존 heap 경로(content 생략)와 공개 API는 그대로이고 삭제된 export는 없다. schema 변경은 game·RTP manifest의 선택 필드 payload.archive.chunks 하나이며 0.1.19 이하 contracts parser는 이 필드를 거부하므로 host는 contracts(= @rgss23/arca 전체)를 먼저 올린다. 지연 콘텐츠·선부팅·폴더 실행은 opt-in이고 keyboard.minimumPressMs는 기본값이 켜진 가산 option이다.

    포함 변경 요약

    contracts·packager: manifest chunk digest

    • rgss23-game-package-v1·rgss23-rtp-package-v1의 payload.archive에 선택 필드 chunks({ algorithm: "sha256", chunkBytes, digests })를 추가했다. chunkBytes는 65,536–16,777,216 사이의 2의 거듭제곱이고 packager 기본은 1 MiB다. archive bytes·sha256(content ID)은 그대로이고 manifest bytes만 바뀐다.
    • 0.1.19 이하 parser는 chunks를 unknown field로 거부한다. chunk가 있는 manifest를 만들거나 받기 전에 consumer가 먼저 0.1.20으로 올라가야 한다(contracts 변경 이력).

    SDK

    • 지연 콘텐츠(가산): content: { mode: "lazy", reader, cache }. game·RTP package를 Wasm memory에 복사하지 않고 runtime이 읽은 chunk만 host reader에 요청한다. 첫 읽기 chunk를 manifest chunks로 WebCrypto 검증하고 기본 createRgss23LazyOpfsCache()가 검증된 chunk를 OPFS에 저장한다(OPFS가 없는 opaque-origin frame은 64 MiB 메모리 LRU). content를 생략한 기본 heap 경로도 mount 선할당으로 Wasm memory가 줄었다.
    • 선부팅(가산): prepareRgss23Player({ preboot: true })·onBoot. 메뉴·설명 화면 동안 타이틀까지 무음·입력 차단으로 부팅해 일시정지하고, 클릭 gesture 안의 start()는 재개만 한다.
    • 폴더 실행(files-only, 가산): Builder package 없이 directory handle·webkitdirectory FileList·Range 지원 서버의 HTTP manifest로 게임 폴더를 지연 모드로 실행한다. 경로를 NFC·/로 정규화해 빈·상위 segment와 대소문자·NFC 충돌을 거부하고, identity는 내용을 읽지 않는 sha256-path-size-v1 fingerprint(Builder 원본 fingerprint와 같음), save namespace 기본값은 dir-<fingerprint>다. 브라우저 안 inspect가 Game.ini·mkxp.json만 읽고 VX syntaxTransform: 2·글꼴 치환 mkxp.json·선택적 PNG tRNS 정리를 메모리 overlay로 얹는다. 폴더 bytes는 host 입력이라 chunk 검증·chunk cache가 없고 Builder의 script 감사·package 한도 검사·game-scoped overlay가 적용되지 않는다.
    • native 키 최소 누름: runtime keyup을 keydown 뒤 keyboard.minimumPressMs(기본 50 ms, 0~1000 정수, 0은 지연 없음, 범위 밖은 launch 전 TypeError)까지 늦추고 같은 키 연타는 누름·뗌이 각각 runtime input poll에 보이게 한다. 물리 키·별칭·가상 입력에 같이 적용하며 host page listener와 onInputAlias 호출 시점은 바뀌지 않는다.
    • API 세부: SDK 지연 콘텐츠와 선부팅, SDK 폴더 실행, SDK 입력과 focus.

    runtime patch와 identity

    • frontend patch retroarch-rgss23-lazy-mount: game·RTP package를 Wasm memory에 복사하지 않고 읽힌 chunk만 MessagePort로 embedder에게 요청하는 읽기 전용 WASMFS backend(/arca/lazy)를 추가했다. read 하나는 기본 30초 안에 응답받지 못하면 EIO다(rgss23 lazy mount).
    • core patch mkxp-z-lazy-archive-reads: PhysFS ZIP stat이 local header를 읽지 않게 하고 글꼴 scan을 FreeType stream 읽기로 바꿔, 부팅 중 path cache가 game·RTP의 모든 local header를 읽고 RTP 글꼴 2개를 통째로 읽던 접근을 없앴다(부팅 read 줄이기).
    • runtimes/mkxp-z/dependencies.lock.json·build recipe·verifier와 redistribution-policy.json의 lock hash를 갱신했다. 제3자 dependency·license 변경은 없다.
    • native runtime export(named volume clean build, canonical pin과 일치): rgss23-core.js 8cc0c878c70332c76fdb09d350d0b9fe6ac5caa90d15821369ff78c8789d16f7(256,567 B), rgss23-core.wasm d3f17b3569e99d42e7c9e182f3b9500b5551156a636cb92d224668d2d0fbfb4c(44,432,679 B).

    reference app·smoke·문서

    • reference app은 catalog 게임을 지연 콘텐츠(HTTP Range reader, OPFS chunk cache)와 선부팅으로 준비하고, “게임 폴더 열기”(directory picker·webkitdirectory·끌어 놓기)로 폴더 실행을 제공한다.
    • browser smoke 계약: staged artifact는 runtime JS·WASM만이고 game·RTP는 catalog 항목 pin·206 Range 읽기·[Rgss23Lazy] mounted log·RTP mount·Wasm memory 상한·선부팅 timeline으로 검사한다(gold·입력·save/load 단언 유지, 지연 실행 계약).
    • 문서: fast-start 분석(Tier 1~3 설계 근거, Tier 3 CRuby 직접 링크 spike NO-GO/보류 판정), LINKS 가이드 0.1.20 절, 프로젝트 상태·호환성 매트릭스 갱신. release bytes에 들어가는 packages/contracts/README.md·packages/packager-rgss/README.md가 바뀌었다.

    측정 요약

    2026-10-16, 같은 PC, runtime:smoke:host-storage-metrics(opaque-origin Worker), Chrome 155·Firefox 153 headless, 자동화 PASS·사람 검토 NOT RUN. artifact는 page가 미리 Blob으로 받아 둔 뒤 재므로 네트워크 전송 시간은 포함하지 않는다. 수치는 측정이며 판정이 아니다.

    게임·브라우저 heap 클릭→타이틀 cold / cache hit 지연 cold / cache hit 선부팅 클릭→start() Wasm memory(타이틀 뒤) heap → 지연
    VX Ace Chrome 8.5 s / 8.5 s 3.5 s / 2.6 s 32 ms 432 → 184 MiB
    VX Chrome 12.5 s / 12.5 s 3.4 s / 2.8 s 34 ms 627 → 184 MiB
    VX Ace Firefox 9.4 s / 8.9 s 4.0 s / 2.7 s 33 ms 432 → 184 MiB
    VX Firefox 13.6 s / 14.4 s 3.7 s / 2.9 s 32 ms 627 → 184 MiB

    mkxp-z-lazy-archive-reads 전/후 지연 cold source 요청(Chrome 155, 1 MiB chunk): VX Ace RTP 156회 163.0 MB → 8회 7.8 MB·game 19회 → 14회, 클릭→타이틀 3.6 → 2.5 s; VX RTP 39회 → 5회·game 84회 87.8 MB → 10회 10.2 MB, 3.7 → 2.7 s. 측정 조건·각주·회귀 smoke는 프로젝트 상태 0.1.19 대비 변경과 LINKS host 판정이 소유한다.

    host 적용 순서

    LINKS 적용 가이드 0.1.20 절을 따른다. 요약:

    1. contracts 먼저: @rgss23/arca 전체(contracts·SDK·runtime·Builder)를 0.1.20 exact pin과 registry integrity로 올린다. 이전 pin의 coordinator·API가 chunk가 있는 manifest를 읽는 혼합 배포를 하지 않는다.
    2. release pin·runtime generation 적용: 새 runtime identity와 release pin을 함께 적용한다(절차는 0.1.19와 같다).
    3. 지연 모드를 켤 때만: 새 Builder로 generation을 다시 만들어 chunks를 얻고, descriptor의 game·RTP artifact에 chunks를 넣고(RTP fileName은 RTP/<Game.ini RTP 이름>.mkxpz와 일치), PlaySession이 허용한 content-addressed URL의 HTTP Range나 Blob slice()로 reader를 구현하고, opaque frame에서 chunk 재사용이 필요하면 Rgss23LazyCacheAdapter를 parent 저장소로 구현한다.
    4. 선부팅은 곧 시작할 게임 하나에만 쓰고 양수 크기로 보이는 canvas에서 준비하며 떠나면 dispose()한다.
    5. 폴더 실행은 host가 bytes를 보증하는 입력에만 쓰고 승인된 Installation 배포는 Builder package·chunks 검증 경로를 유지한다. cache/save namespace는 기존처럼 host가 주입한다.
    6. keyboard.minimumPressMs 기본 50 ms가 켜진다. 이전 keyup 시점이 필요하면 0을 준다.
    7. lazy 경로(/arca/lazy)는 읽기 전용이며 host가 main thread에서 그 경로를 동기로 읽지 않는다. custom workerFactory는 SDK port 메시지를 Emscripten load보다 먼저 전달한다.

    NOT RUN

    • 실제 망(HTTP Range) 측정, opaque frame chunk cache, LINKS 적용·실제 플레이 재검증, NAS 실환경.
    • 사람 화면·청취 확인, 새 사용자 acceptance(제공 VX/VX Ace acceptance 기준은 2026-08-05 그대로).
    • Edge 155 save-load gold 검토(browser:smoke:edge:vx-ace:save-load는 모든 동작·화소 검사를 통과했지만 Edge version pin drift로 NOT REVIEWED), 새 runtime의 나머지 browser smoke 행렬.
    • 폴더 실행의 VX·Firefox·Edge·자동 smoke와 사용자 acceptance(자동 근거는 Chrome VX Ace만), 짧은 키 tap 사용자 acceptance.
    • 실기 모바일·Safari, Linux 재현.

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

    배포 검증

    • tag: 0.1.20(annotated, tag object a685cde46f)
    • release source: e859dc27b3(버전 커밋 b31ba50 뒤 npm facade 중첩 선언 복사 수정 커밋)
    • manifest SHA-256: a6dac661743a62b332ee395cd65bb39b9578a640a151bb736c4a35a173055891
    • Builder digest(pin): sha256:6b0f47faa2197d31417bc9fdfaf372e9660167c944e2c21d973d99d4b85a364c · Builder config digest(Docker 24 image ID): sha256:a2c4940dd4322af01e14ec1495dc40aa2a458f4c36a4a67af3ce71d601eed2a1
    • artifact SHA-256: builder 38d560fc6e1ab42137708a9f35baa7e328287bcabfd80b1e2f05fccce6bd451b · contracts c915415c93d56e9a3dcdcbd446f676949c3e5afddc4176295e8df709040fd766 · runtime 74994b84c427fc020d1f7a480467607f38f69f219838b63c9ce4b0e9cdff5b98
    • npm: @rgss23/arca@0.1.20 (Forgejo registry), rgss23-arca-0.1.20.tgz SHA-256 056acb021cf93daf650c9cc037e5a395fd87a3b3ae37be3f1915ff8b7b4c78d2, integrity sha512-b4QlYhHLa1fbVozueuqQqnVsGhtVZZuO+p7j+wJ0LOPIJ0X7PdhuGVR2rWyHLS8EZkkwE6e8MgLzOeuJGPRSCA==
    • 단위 테스트 609개, 타입 검사, release 회귀 45개(수정 커밋 뒤 46개), browser 도구 회귀 125개, runtime lock·native 진단 lock·native 준비 recipe 검증, git diff --check: PASS(2026-10-16, 버전 커밋 b31ba50).
    • release:build(Builder gate·source-free consumer gate)·release:verify·release:npm:test: PASS(2026-10-16, source e859dc2). release:reproduce(clean detached worktree e859dc2, pin·세 artifact·Builder digest·npm tgz byte 동일): PASS(2026-10-16). Windows·같은 Docker host만, Linux 재현 NOT RUN.

    asset 7개

    파일 크기(B) SHA-256
    release-manifest.json 2,155 a6dac661743a62b332ee395cd65bb39b9578a640a151bb736c4a35a173055891
    release-manifest.sha256 88 6d39f5824ca9ce54565919e89c4aaa2f50d617466232b9ea334c95a9c65d45b8
    release-pin.json 441 b1be6a0c1188d3d185f5d687710e650732e9f1f9341971abcd11f4ece00f83e8
    rgss23-arca-0.1.20.tgz 99,982,340 056acb021cf93daf650c9cc037e5a395fd87a3b3ae37be3f1915ff8b7b4c78d2
    rgss23-builder-0.1.20.oci.tar 61,884,928 38d560fc6e1ab42137708a9f35baa7e328287bcabfd80b1e2f05fccce6bd451b
    rgss23-contracts-0.1.20.tgz 37,871 c915415c93d56e9a3dcdcbd446f676949c3e5afddc4176295e8df709040fd766
    rgss23-runtime-0.1.20.zip 45,705,529 74994b84c427fc020d1f7a480467607f38f69f219838b63c9ce4b0e9cdff5b98

    로컬 경로: dist/release/0.1.20/(manifest·sha256·pin·Builder·contracts·runtime), dist/npm/0.1.20/rgss23-arca-0.1.20.tgz. artifacts.json·npm-package.json은 업로드하지 않는다.

    0.1.19 대비 전체 변경

    Downloads 9