-
hanyul released this
2026-10-09 05:29:16 +09:00 LINKS 0.22
이전 릴리스 0.21(
a5688d6b34)부터 최종 소스a96fbde7d0까지의 전체 변경 사항입니다. 루트 패키지는 0.22.0, ARCA는 exact 0.1.16 → 0.1.17입니다. 기준 schema는 0.21과 같고, 운영 Compose·배포 wrapper·package coordinator script가 바뀌었습니다.업그레이드 주의 — DB 초기화는 필요 없지만, 실행 build·준비본·coordinator를 함께 갱신합니다
기준 schema는 바뀌지 않았습니다(
743448f6d2891794e5ba98834d9f5055c3f5c58e22276ed701de36650f4b2b07유지). 0.21 DB·사용자·패스키·세이브·backup을 그대로 사용하며reset.sh를 실행하지 않습니다.- ARCA Builder digest 변경: ARCA 0.1.17의 native runtime은 0.1.16과 같지만 Builder OCI digest와 runtime ZIP identity(release manifest hash)가 달라집니다. 배포 뒤 VX/VX Ace 기존 active build는 로그인 사용자의 실행 준비 절차로 새 generation을 만듭니다. 실행 중 session 종료나 save 삭제로 업그레이드하지 않습니다.
- 봉인 입력 v2·scan shape v3: 원본 세이브 제외로 봉인 입력 형식이
web-static-sealed-input-v2·rgss-wasm-sealed-input-v2가 되어 기존 준비본은 재사용되지 않고 다음 준비 때 새로 봉인됩니다. 기존 active build는 자동 재게시하지 않으므로, 원본 폴더의 세이브가 들어간 기존 build는 관리자 화면에서 재빌드합니다(찾는 절차는 운영 가이드Schema 변경과 DB 초기화). scan shape가installation-shape-v3로 바뀌므로 배포 뒤 모든 root의 scan이 한 번 성공한 다음에 설치본 폴더를 옮겨야 재연결 후보가 나옵니다. - coordinator claim 형식 변경(2 → 4 필드): host package coordinator script와 package worker image의 claim 형식이 달라 혼용하면 첫 작업에서 멈춥니다. 운영 배포는 coordinator를 정지하고 같은 0.22 태그의
update.sh·ops/runtime-package-coordinator.sh·compose.yaml을 아래 해시로 대조해 함께 교체한 뒤sh update.sh --defer-package-readiness로 image를 갱신하고, 새 coordinator를 시작한 다음 출력된runtime-readiness-command.js --package가 종료 코드 0이어야 완료입니다(운영 가이드NAS ARCA package coordinator).
0.21의 ARCA 0.1.16 pin은 registry가 최신 버전만 보관해 cache 없는 build의 frozen install이
ERR_PNPM_TARBALL_URL_MISMATCH로 실패하므로 소스 build는 0.22를 사용합니다. 원본 game library는 읽기 전용으로 유지하며 변경하지 않습니다. 이번 게시 작업에서 개발·운영 DB 초기화나 NAS 배포는 실행하지 않았습니다.실행 준비 단축
- RGSS(VX/VX Ace)와 MV/MZ가 원본 파일 목록 확인을 공용 구현으로 하고, 원본 hash 읽기와 봉인 사본 복사·검증을
LINKS_RUNTIME_SOURCE_READ_CONCURRENCY(1·2·4, 기본 1)로 동시에 처리합니다. 개발(Windows bind mount)은 4로 측정했고 운영은 NAS I/O 측정 전까지 1을 유지합니다. - 원본 나이 판정: 목록의 모든 파일·디렉터리의 변경 시각(mtime·ctime)이 안정화 창과 여유 시간보다 오래되었으면 실행 준비의 안정화 대기와 두 번째 목록을 생략합니다. 기본으로 켜져 있고
LINKS_RUNTIME_QUIESCENCE_SKIP_IF_AGED=false로 끕니다(여유LINKS_RUNTIME_QUIESCENCE_AGE_MARGIN_SECONDS, 기본 30초). 판정 근거는 checkpoint에 보존합니다. scan 안정화(LINKS_SCAN_QUIESCENCE_SECONDS)는 그대로입니다. - VX publish의 봉인 입력·release set·portable archive 중복 재검증과 MV/MZ build의 봉인 입력 중복 전체 hash를 identity 대조와 작성 중 파일별 hash 한 번으로 줄입니다. 봉인 사본 게시 확인은 전체 재hash 대신 partial identity 대조입니다.
- package coordinator는 대기 중 2초마다 claim하고 작업 중 3초마다 heartbeat합니다. 시도마다 실행하던
ready는 claim이 검증한 release·Builder digest로 대체하며, 실행 준비 checkpoint는 시작 직후와 단계 위치 변경 뒤 약 1초 안에 저장합니다(1초 안에 끝난 작업의 마지막 변경 포함). - 리뷰 수정: MV/MZ 복사 fsync와 공간 부족 분류, 동시성 0·NaN 거부, 봉인 identity의 발급 출처 결속, portable artifact CAS 봉인을 no-follow descriptor의
fchmod로 처리합니다. - 합성 benchmark(개발 서버와 같은 Windows Docker 읽기 전용 bind mount, 합성 VX Ace 1,717개·약 215 MB와 MZ 3,626개·약 330 MB, claim·Builder·게시·후속 build 제외): stage 소계가 변경 전 VX 131.8초·MZ 87.6초에서 동시성 4·나이 판정 켬일 때 10.0초·12.8초가 되었습니다. 실제 표본 전체 준비 시간으로 환산하지 않습니다.
실행 준비·불러오기 화면
- 실행 준비 단계를 관측 가능한 단위로 줄여 VX/VX Ace 6단계, MV/MZ 5단계로 표시합니다. 조건부·짧은 처리는 보조 문구로 흡수하며, 같은 attempt 안에서 번호가 줄지 않는 규칙과 식별할 수 없는 상태에 번호를 붙이지 않는 규칙은 유지합니다.
- 용량 줄은 무결성 검사 단계부터 표시합니다.
- 게임 불러오기 화면: MV/MZ는 서버가 정의하는 전송 대상 총량이 없으므로 분모를 만들지 않고
현재 요청 파일 읽기 · N 불러옴과 미정 막대를 표시합니다. VX/VX Ace는 받은 loading plan이 있을 때전체 파일 읽기 · X / Y를 표시합니다. 끝나지 않던용량 확인 중은 더 이상 나오지 않습니다.
원본 세이브 제외
- 원본 폴더의 세이브 파일을 봉인 입력·fingerprint·package에서 제외합니다. MV/MZ는
index.html이 있는 payload root 아래save/디렉터리, VX/VX Ace는 payload root 바로 아래 숫자 슬롯 이름의Save*.rvdata·Save*.rvdata2입니다. 비슷한 이름의 다른 파일은 유지합니다. - 제외 항목도 목록 단계의 link·root 밖·이름 충돌 검사를 받으며, 원본 나이 판정에서는 제외 항목의 변경 시각을 보지 않습니다. 원본은 바꾸지 않습니다.
- scan shape를 v3로 올려 VX/VX Ace root 슬롯 세이브를 재연결·중복 비교에서 뺍니다. v2 shape만 가진 누락 설치본은 재연결 후보에서 빠지므로 위 업그레이드 주의대로 배포 뒤 전체 scan을 먼저 합니다.
- 세이브가 있던 설치본은 package가 달라지므로 이전 build에서 만든 사용자 save는 기존
SAVE_BUILD_MISMATCH·실행 버전 가져오기 흐름을 따릅니다.
UI 정리
- 홈의
최근 실행·내 실행 준비목록을 제거합니다(서버 API는 유지). - 라이브러리 실행 기록을 두 줄로 나누고
기록된·측정 안내 문장과 목록 끝의전체 N개 중 N개 표시를 지웁니다. - 게임 상세의
태그 원문 보기접기와 태그 chip의 원문 tooltip을 제거합니다. - 운영 경고에서 backup 실패·미실행 경고를 제거합니다(
LINKS_ALERT_BACKUP_OVERDUE_HOURS삭제). - 라이브러리 스캔 상태창이 라이브러리 화면에서도 떠 있도록 흐름 배치 기준을 64rem으로 낮추고, 좁은 화면·글자 200%에서 상태 버튼이 넘치지 않게 합니다.
의존성·base image
- Node 24.21.0(bookworm-slim digest), pnpm 11.28.5.
- npm 의존성을 같은 major의 최신 patch·minor로 올리고
@simplewebauthn/server14.0.3·browser14.0.0으로 올립니다. TypeScript 7·Vitest 5 major는 보류했습니다. - PostgreSQL 18.6(bookworm), Caddy 2.11.7(alpine), browser acceptance runner Playwright 1.63.0(noble), 모두 digest 고정입니다.
ARCA 0.1.17
- root dependency·lockfile·release age 예외를 0.1.17 exact pin으로 맞춥니다. lockfile 변경은
@rgss23/arca항목뿐이며 integrity는 ARCA 게시 identity·registry metadata와 같습니다. - 0.1.17의 게임패드 배치(하단=결정·오른쪽=취소, 왼쪽 스틱 D-pad, 첫 pad만 입력)를 위해 Player frame
allow에gamepad *를 위임합니다. 위임은autoplay·cross-origin-isolated *·gamepad *뿐입니다. - 새
player.inputAPI는 사용하지 않습니다. native runtime은 0.1.16과 같고 Builder digest·runtime ZIP identity만 바뀌므로 기존 build는 위 업그레이드 주의를 따릅니다.
환경과 운영
- 새 환경 key:
LINKS_RUNTIME_QUIESCENCE_SKIP_IF_AGED(기본true),LINKS_RUNTIME_QUIESCENCE_AGE_MARGIN_SECONDS(기본 30).LINKS_RUNTIME_SOURCE_READ_CONCURRENCY는 runtime-stager와 runtime-package-worker가 함께 씁니다. 모두 Compose 기본값이 있어 필수 key 추가는 없습니다.LINKS_ALERT_BACKUP_OVERDUE_HOURS는 삭제되었습니다. compose.yaml(image digest·위 환경 key),ops/deploy-registry.sh(--defer-package-readiness),ops/reset-registry.sh(cleanup image Node 24.21.0),ops/runtime-package-coordinator.sh·.ps1(4필드 claim, 2·3초 주기)이 바뀌었습니다. Caddyfile·backup script·backup-verify Compose는 0.21과 byte 동일합니다.- 운영 가이드 배포 목록에
ops/runtime-package-coordinator.sh가 추가되었습니다. 이미지와 같은 0.22 태그에서 받아 아래 해시를 모두 대조한 뒤 배포합니다.
검증과 남은 범위
- PASS — 통합 소스
fcfd7ee: 격리 Compose에서 static(Prettier·ESLint·typecheck·문서 검사), 전체 unit 146개 파일 / 1048개 테스트, scanner, runtime-workers, rgss23-builder, catalog browser acceptance, run-browser(합성 MV/MZ Chromium·Firefox),git diff --check가 모두 종료 코드 0입니다. - PASS — ARCA 0.1.17 브랜치(병합
bb193b5와 같은 tree): cache 없는 image build, lockfile 재해석·integrity 대조, static, 전체 unit 146/1048(첫 실행에서 coordinator test 1건 timing 실패, 단독 3회·전체 재실행 PASS), arca-npm-check, release set·runtime binding·Builder 입력·Builder(합성 세이브 제외 포함)·Builder 격리, runtime-workers, PowerShell coordinator container 6/6, 합성 Player check(sandbox-rgss·player-restart·player-refresh-storage·player-layout, Chromium·Firefox, gamepad 위임 포함)가 종료 코드 0입니다. - PASS — 최종 0.22 소스: 릴리스 커밋 두 개(root version, 완료 기준선 version 문구) 뒤 문서 검사(746개 파일 / Markdown 30개, mount 6개 / 29개 문서 파일), static과
git diff --check를 다시 통과했습니다. 게시 이미지는 같은 최종 소스에서 build했고 image 안의 root version 0.22.0·ARCA 0.1.17을 확인했습니다. - PARTIAL — 전체 UI/제품 acceptance: 화면·fixture·package/build 성공을 실제 browser play PASS로 기록하지 않습니다.
- NOT RUN: 실제 library/private game, 입력·오디오·save/reload의 실제 게임 acceptance, 실제 게임패드 입력, 개선 뒤 실제 표본의 전체 준비 시간 재측정, NAS 실측(I/O 동시성·mount ctime·idle 2초 claim 부하), 실제 RTP 다운로드, live provider, fresh schema 테스트(schema 변경 없음), 개발 rebuild와 NAS/production 배포.
배포 이미지와 파일
- Git annotated tag: 0.22, 최종 소스
a96fbde7d0. - 단일 linux/amd64 이미지:
git.2ex.dev/hanyul/links:0.22=git.2ex.dev/hanyul/links:latest. - 원격 digest:
sha256:17803f0803b8bf42f5798c767a9513a3ee5905279c2208717548a9e5f7351b3a. - 아래 SHA-256은 checkout의 CRLF 변환본이 아닌 0.22 태그의 Git blob 원본 byte 기준입니다. NAS 배포 목록은 위 6개이며,
reset-registry.sh는 전체 초기화 때만,.ps1은 Windows 개발 coordinator입니다.
e89f4579c3840c391ef34b249908019c22c1ed2dc8765b2aac0f2ad32ae9d14f compose.yaml 6e1fd3f2f73faee52abca28c8552cde417f496d86fc3d78c7001dec480e171a3 infra/docker/Caddyfile 39a4c55050e76043c8ca70f11f59dbdf08fff7ef38c1f1ec878f96194988d9d8 ops/backup-verify.compose.yaml 3f86889f9380114017cd424b4892f8d5877dab1ec3505dc267754030873dfba6 ops/deploy-registry.sh 89375a986b3cb64cf74145541701b32c6a0e983a72ca46be21a8bcfad7beaa3d ops/backup-registry.sh 79c5fbd082ada3117e0915af76c714ed498ea018f151a998cd23f53d92fc3530 ops/runtime-package-coordinator.sh 84bcc60de28de692fba4d7bea16bf008a8ac55abe394e26f87e541abf5db52dc ops/reset-registry.sh 0593ef6347103a9ceffb65969c63794ce6ab6f5321e094a7681b61f54ca19104 ops/runtime-package-coordinator.ps1Downloads 2
-
Source code (zip)
0
2026-10-09 05:29:16 +09:00 -
Source code (tar.gz)
0
2026-10-09 05:29:16 +09:00