-
hanyul released this
2026-10-22 20:43:05 +09:00 ARCA 0.1.24 변경 사항
이전 버전: 0.1.23. 0.1.23 게시본의 지연 콘텐츠 fresh 재시작
FAIL(LINKS T81 재현)을 고치는 player SDK release다. native runtime(mkxp-z core JS·WASM)·Builder 동작·contracts schema는 0.1.23과 같다. 공개 API·타입·기본값·오류 code는 바뀌지 않았다. version 문자열, SDK bundle과 release artifact에 들어가는 package README 문구 수정 때문에 runtime ZIP·contracts tgz·Builder archive·npm tgz bytes와 release pin은 새로 고정된다.포함 변경 요약
SDK: 지연 콘텐츠 fresh 재시작의
relaunching멈춤 수정- 0.1.23에서 지연 콘텐츠(
content.reader·content.directory) launch의restart({ presentation: "fresh" })가relaunching에서 frame과 부모 page를 함께 멈출 수 있었다(LINKS 재현 조건: RTP·BGM을 읽은 instance). - 원인: 내린 runtime의
exit()중 native 소멸자가 trap하면 Nostalgist가 오류를 삼키고 keepalive가 비워진 채 SDK가 pthread Worker를 종료한다. 다음 mailbox callback(checkMailbox → callUserCallback → maybeExit)이 exit를 다시 실행해 남은 소멸자를 돌리고, 지연 mount backend의ProxyWorker소멸자가 이미 종료된 proxy thread를 main thread에서 join하며 끝없이 돌았다. heap 경로는 join할 thread가 없어 멈추지 않았다. - 수정: SDK가 bind하는 factory 결과의
release()가exit()뒤 Worker 종료 전에ABORT = true를 둔다(stop()과 prepare 실패 정리). 완료된 exit가 남기는 상태와 같으며 내린 instance의 callback은 native 코드 전에 반환한다.stop()·dispose()·fresh 재시작이 같은 정리 경로라 모두 같은 수정을 받는다. - 단위 테스트: exit가 trap하는 runtime source로
stop()뒤 Worker 종료·이후 mailbox 처리에서 exit 재진입이 없음을 고정했다(수정 없이 실패).
smoke·도구
runtime:smoke:dpr -- --scenario resize-restart --content lazy: opaque-origin 격리 선부팅 frame, 부모 page MessagePort reader·chunk cache, 고정 VX Ace RTP를 두 번째 지연 artifact로 쓰고 boot 중 RTP BGM과 재시작 호출 시 진행 중 읽기를 둔 지연 fresh 재시작 cell. 선택 flag--reader-latency-ms,--hold-reads-during-relaunch,--chunk-bytes. flag는 엄격히 parse한다.- 지연 chunk 계약·digest helper를
tools/build-runtime/smoke-common.mjs로 모으고 단위 테스트를 더했다.
문서
- 0.1.23 게시본의 지연 fresh 재시작
FAIL, 0.1.24 후보 SDK의 자동PASS, native exit trap 원인 범위, instance 보존FAIL을 호환성 매트릭스·로드맵·SDK README·LINKS 가이드(0.1.24 절)에 기록했다. - release bytes에 들어가는
packages/contracts/README.md(0.1.21 변경 이력의 release set manifest 표기)와tools/release/npm/README.md(RTP 다운로드 재시도 jitter 설명)의 사실 오류를 고쳤다.packages/packager-rgss/README.md는 바뀌지 않았다.
자동 근거(2026-10-22, 같은 PC, 로컬 runtime build = 0.1.21 native pin, 0.1.24 후보 SDK)
- 지연
resize-restartChrome 155·Firefox 153 × DPR 1·2: 결과presentation: "fresh"·completion: "native-started",synced, backing = CSS × DPR, 재시작 commit의 save 재읽기, page 응답 유지, 새 instance가 같은 proxy cache로 읽음PASS. --reader-latency-ms 200(relaunching시 응답 대기 1건) Chrome·FirefoxPASS,--hold-reads-during-relaunch(두 cell 모두 보류 읽기 1건,restart-settled에서 해제) Chrome·FirefoxPASS, heapresize-restartChromePASS.- 수정 전 같은 지연 smoke는 Chrome·Firefox 6/6에서 멈춤을 재현했다(
failure: "page-unresponsive", 마지막 phaserelaunching). - 보고서: main checkout
work/browser-smoke/의dpr-chrome-resize-restart-lazy-1792623952680(기본)·-1792623978331(latency)·-1792624020411(hold),dpr-firefox-resize-restart-lazy-1792624049603(기본)·-1792624074655(latency)·-1792624640749(hold),dpr-chrome-resize-restart-1792624118042(heap). - release 전 built SDK로 대표 browser smoke를 다시 실행하지 않았다(위 근거와 같은 SDK 코드, native runtime 불변).
알려진 문제
- native exit trap(Chrome "table index is out of bounds"·"null function", Firefox "indirect call to null"): SDK 종료는 core를 unload하지 않고 runtime을 강제 종료하므로 static
mkxp_retro::fs소멸자의PHYSFS_deinit이 audio 정리보다 먼저 돌고, PhysFScloseFileHandleList가PHYSFS_mountHandle로 mount한 archive(RTP 파일 archive, 암호화Game.rgssad·.rgss2a·.rgss3a)의 열린 항목을 닫을 때 해제한 handle을 다시 쓴다(use-after-free). heap·지연 경로 모두 해당한다. 0.1.24 SDK는 내린 runtime을 abort 상태로 두어 이 trap이 page를 멈추지 않게 격리할 뿐 trap 자체는 남는다. 수정 방향(종료 전 frame boundary core unload runtime patch, PhysFS 방어 patch)은 로드맵에 있다. - instance 보존:
stop()과restart({ presentation: "fresh" })마다 내린 WASM instance 하나가 page unload까지 남는다(Chrome 155 scratch 측정, heap VX Ace + RTP 게임measureUserAgentSpecificMemory1·2·3회 457·913·1368 MB, OS private 회당 약 +500 MB, 열린 AudioContext도 회마다 하나 증가). trap 여부와 무관하며 0.1.23과 0.1.24가 같다. host는 한 page의 fresh 재시작과stop()뒤 재launch 횟수를 제한하고 반복되면 page·frame을 다시 읽는다.
host 적용 순서
LINKS 적용 가이드 0.1.24 절을 따른다. 요약:
@rgss23/arca전체를 0.1.24 exact pin으로 올린다(runtime·SDK·Builder·contracts 함께). 0.1.22 이하에서 올리면 0.1.23 절도 함께 적용한다.- frame의 지연 콘텐츠 경로(catalog 선부팅)에서도 설정
재시작에restart({ presentation: "fresh" })를 허용한다. listener 재연결·canvas 표시 유지·FAILED뒤 새 canvas 규칙은 0.1.23과 같다. run-player-lazy의 resize→재시작 cell을presentation: "fresh",synced, save 유지, page 응답 유지의 assert로 바꾼다.- instance 보존 경고(fresh 재시작 횟수 제한)는 해제 수정이 든 release 전까지 유지한다.
NOT RUN
- LINKS opaque frame 적용, 실기 모바일·DPR, 사용자 acceptance(제공 VX/VX Ace acceptance 기준은 2026-08-05 그대로).
- 지연
stop()뒤 재launch의 browser smoke(단위 테스트만), 기존 browser smoke 행렬 재실행(native runtime 불변), Linux 재현.
배포 검증
- tag:
0.1.24(annotated, tag objectc9340df496) - release source:
fda2d8ea66(버전 커밋Release: prepare ARCA 0.1.24) - manifest SHA-256: e69467eb549c95482b0262ac6279e806f74d07990a66a0ea6dd488b97b159712
- Builder digest(pin): sha256:e506f39a54ce2b46f4299e83c29a25db0e08dc8abc37b0bbf3cd6de07bd25f97 · Builder config digest(pin
builderConfigDigest): sha256:13698bac4fda730918fb4b8be2e81ebc1eaf2b8f8c6290e83000f8ad3e23a0c7 - artifact SHA-256: builder 4400fac4911cdef1c201d4d15a1947763e9231ed6f9fa003f08e9fca4fd20784 · contracts 5f89b64588341bcee5cf6d51296fbc85738ad42d08b59dbdcf183dff20c014e9 · runtime 4c1040c60000025f69228953d254c0b9747cfa370e66dc6a49b11e5f626f6636
- npm:
rgss23-arca-0.1.24.tgzSHA-256 37c2b058be6de83440b64731e1779f7a6117f6a8c15152ae031cea0b6a27a856, integritysha512-LEdmfb9RtBCrc5Vve3bP/NT5ZtLsONRYLjPRjfQzBCqwoe/Y9C+Y1M3ccf1X6tGNl3zGQqNQ/fVuh1hUXD/W5A==(로컬 계산, registry 게시NOT RUN) - runtime ZIP의
rgss23-core.js(d4884b14…256,567 B)·rgss23-core.wasm(39085f4e…44,432,926 B)은 0.1.23과 byte 동일하다.redistribution-policy.jsonruntimeLockSha256은dependencies.lock.json과 일치(불변). - 게이트(버전 커밋
fda2d8e, 2026-10-22):install --frozen-lockfile, 단위 테스트 640개, 타입 검사, release 회귀 47개, browser 도구 회귀 127개,verify:locks, native 준비 recipe 검증,git diff --checkPASS(work/release-0.1.24/logs/gates.log) release:build(Builder gate·source-free consumer gate)·release:verify·release:npm:test·release:reproduce: PASS(2026-10-22, sourcefda2d8e, manifestsourceCommit= HEAD;release:reproduceend-to-end pin·세 artifact·npm 동일,work/release-0.1.24/logs/pipeline.log). Windows·같은 Docker host만, Linux 재현NOT RUN.
asset 7개
파일 크기(B) SHA-256 release-manifest.json2,155 e69467eb549c95482b0262ac6279e806f74d07990a66a0ea6dd488b97b159712release-manifest.sha25688 800e6a7eabe60f77d334b8530bc0c2b422832b55d130e277220d67f6f66f22f1release-pin.json537 db2984a36e7fd17227bc302ebff2eb654839e43edd4bf6bdd1f05cb42b2911cbrgss23-arca-0.1.24.tgz99,994,874 37c2b058be6de83440b64731e1779f7a6117f6a8c15152ae031cea0b6a27a856rgss23-builder-0.1.24.oci.tar61,884,928 4400fac4911cdef1c201d4d15a1947763e9231ed6f9fa003f08e9fca4fd20784rgss23-contracts-0.1.24.tgz38,268 5f89b64588341bcee5cf6d51296fbc85738ad42d08b59dbdcf183dff20c014e9rgss23-runtime-0.1.24.zip45,714,599 4c1040c60000025f69228953d254c0b9747cfa370e66dc6a49b11e5f626f6636로컬 경로:
dist/release/0.1.24/,dist/npm/0.1.24/rgss23-arca-0.1.24.tgz.artifacts.json·npm-package.json은 업로드하지 않는다.Downloads 9
-
release-manifest.json
2
2.1 KiB
2026-10-22 20:43:36 +09:00 -
release-manifest.sha256
2
88 B
2026-10-22 20:43:36 +09:00 -
release-pin.json
2
537 B
2026-10-22 20:43:37 +09:00 -
rgss23-arca-0.1.24.tgz
2
95 MiB
2026-10-22 20:43:43 +09:00 -
rgss23-builder-0.1.24.oci.tar
2
59 MiB
2026-10-22 20:43:45 +09:00 -
rgss23-contracts-0.1.24.tgz
2
37 KiB
2026-10-22 20:43:45 +09:00 -
rgss23-runtime-0.1.24.zip
2
44 MiB
2026-10-22 20:43:46 +09:00 -
Source code (zip)
0
2026-10-22 20:43:05 +09:00 -
Source code (tar.gz)
0
2026-10-22 20:43:05 +09:00
- 0.1.23에서 지연 콘텐츠(