• LINKS 1.0.16 — VX/VX Ace 실행 준비 시간 단축(T79)·북마크 저장과 ARCA pin 변경 자동 재준비

    LINKS 1.0.16

    이 릴리스는 이전 릴리스 1.0.15(37f9ca3af3) 위에 VX/VX Ace 실행 준비 소요 시간 단축(T79 A·B·C·D)과 북마크 저장·ARCA pin 변경 자동 재준비를 더했습니다. 최종 소스는 79c115dc9c, 루트 패키지는 1.0.16, ARCA pin은 exact 0.1.21(변경 없음)입니다. schema 변경은 없습니다(infra/schema·infra/migrations는 1.0.15와 동일).

    업그레이드: 1.0.15 → 1.0.16은 sh update.sh만 실행합니다

    1. 갱신 방법: 배포 디렉터리에서 sh update.sh만 실행합니다. reset.sh는 실행하지 않습니다.
    2. schema: migration이 없으므로 update.sh는 [4/6]에서 pending migration을 출력하지 않습니다. 1.0.15 image를 rollback pin으로 지정하면 같은 DB로 되돌아갑니다.
    3. 배포 파일 변경: update.sh가 받는 5개 파일 중 compose.yaml(catalog 환경 변수 LINKS_RUNTIME_REPREPARE_ON_PIN_CHANGE 한 줄, 기본 true)과 ops/runtime-package-coordinator.sh(상주 claim worker 프로토콜)가 바뀌었고 update.sh가 둘을 설치합니다. 두 파일은 1.0.16 worker image와 짝이므로 1.0.15 image와 섞어 쓰지 않습니다. ops/deploy-registry.sh(update.sh), reset.sh, infra/docker/Caddyfile은 1.0.15와 byte 단위로 같습니다. .env.example에 위 키가 추가됐지만 선택 항목이라 .env.production에 할 일은 없습니다.
    cd /volume1/docker/links
    sh update.sh
    

    운영자 작업은 없습니다. 기존 MV/MZ·VX/VX Ace 실행 버전, 세이브, RTP, 설정은 그대로입니다. 원본 game library는 읽기 전용으로 유지합니다. 갱신 뒤 설치본의 첫 재준비는 원본을 한 번 더 복사한 뒤 기존 sealed input과 대조하고(copy-then-dedupe), 기존 CAS object의 첫 재사용은 전체 검증 1회로 검증 기록을 남깁니다. ARCA pin이 같으므로 catalog 기동 때의 pin 변경 재준비 sweep은 대상이 없습니다.

    변경 내용

    A. package job 검증·container 축소(apps/worker, ops/)

    • VX/VX Ace package job은 ARCA release set(contracts 결속 포함)을 job당 한 번(claim) 전체 검증하고, stage·publish는 그 identity 기록을 확인만 합니다(다르면 전체 검증).
    • coordinator는 job마다 상주 claim worker 하나를 두어 3초마다 lease를 갱신하고 Builder 진행을 중계하며, lease를 잃으면 Builder를 멈춥니다(stdin stage/end 프레이밍, end가 순서 장벽). Builder 밖 container 시작은 job당 6→4, cleanupAttempts·capability 확인은 job당 1회입니다.

    B. CAS object 검증 기록(packages/runtime-builder)

    • game·RTP CAS object의 전체 검증 결과를 object 옆 봉인된 <hash>.verified.json에 남깁니다. 이후 준비의 import와 build job의 load는 stat identity가 같으면 archive 재hash를 생략하고, 기록이 없거나 identity가 다르면 전체 검증으로 돌아가며 손상 object는 거부합니다.
    • GC는 마지막 참조가 사라진 RGSS portable object를 기록과 함께 수거합니다.

    C. 원본 본문 1회 읽기(packages/scanner, packages/contracts, apps/web)

    • 최초 검사 pass는 경로·size·mtime·ctime만 열거하고(VX는 Game.ini만 읽음) 복사 pass가 hash와 봉인을 한 번에 수행합니다. verify-source는 파일을 읽지 않고 목록 metadata digest를 대조합니다. 준비당 원본 읽기 횟수는 MV/MZ 2→1회, VX/VX Ace 3→1회입니다.
    • 나이 판정으로 대기를 생략하지 않는 경로는 두 번째 관찰을 유지하고, 복사 전후 identity·size·mtime·ctime·파일 집합 비교와 복사 중 변경의 RUNTIME_SOURCE_CHANGED는 그대로입니다. partial 사본의 identity는 쓰기 descriptor에 결속합니다.
    • 준비 화면은 MV/MZ 4단계·VX/VX Ace 5단계를 번호로 표시합니다. 준비 상태 API의 inspectionPass·operation 값이 이에 맞춰 바뀌었습니다.

    D. 자동 준비 요청(apps/api, packages/db)

    • 북마크 저장(PUT /bookmarks/{installationId})이 저장한 사용자의 실행 준비를 요청합니다. 같은 설치본의 준비 중 요청은 설치본 잠금 아래에서 replay하고, 요청 실패는 북마크 응답에 영향을 주지 않습니다.
    • ARCA pin을 바꾼 image의 catalog는 기동 때 한 번 다른 release로 만든 rgss-wasm ready active build의 재준비를 마지막 준비 요청자 이름으로 priority -20에 요청합니다(LINKS_RUNTIME_REPREPARE_ON_PIN_CHANGE, 기본 켬). 발급 여부는 서버가 쓴 audit(after.trigger: arca-pin·after.release)로 설치본·release마다 한 번만 판정하고, worker가 없거나 준비 중이면 30분간 1분·그 뒤 10분 간격으로 다시 돕니다. /runtime-preparations/mine은 자동 요청을 숨기고 관리자 감사 기록 API는 trigger를 반환합니다.

    검증과 남은 범위

    • PASS(릴리스 소스 79c115d, 코디네이터 실행): static(Prettier·ESLint·typecheck·docs-static), 전체 unit 186 files·1,669 tests, schema 40 files·288 tests(빈 DB fresh 적용과 baseline+0001~0005 사슬 적용의 구조 등가 포함), 문서 검사, git diff --check, run-catalog-browser(Chromium 153, 21개 단언, 오류 0), no-cache frozen install image build(이미지 안 root 1.0.16·migration 5개·자동 갱신 표식), foundation, run-browser matrix(MZ·MV × Chromium·Firefox browser-acceptance 4개와 guest-play-acceptance 4개), run-runtime-workers.
    • PASS(브랜치별 작업자·독립 리뷰어 실행): 합성 fixture의 읽기 횟수 unit(VX 3→1, MV/MZ 2→1, release 3→1, CAS 재hash 0), lease 상실 → Builder 중단·cancel → attempt 실패, 검증 기록 누락·identity 불일치의 전체 검증 fallback과 손상 object 거부, 복사 중 변경 → RUNTIME_SOURCE_CHANGED, 북마크·pin sweep schema test(동시 저장 action 1개, release당 자동 요청 1회, 요청자 변경·동시 catalog·재시작에 추가 job 0), 독립 Sol 리뷰(A 3회·B 2회·C 2회·D 3회) 병합 가능.
    • 변경 전 실측(운영 NAS, 2026-10-19, 재준비 1건, 1,716 파일·436 MB): enqueue→package 완료 231 s, 그중 container·Compose 비용 약 145 s. 변경 뒤 같은 NAS·설치본 재측정은 배포 뒤 실행 예정(NOT RUN).
    • 알려진 제한·NOT RUN: 실제 VX/VX Ace 게임의 브라우저 타이틀·save/load 확인, 실제 모바일 기기·실제 망, 실제 오디오 출력, 격리 dind의 1.0.15→1.0.16 update.sh 리허설.

    배포 이미지와 파일

    • Git annotated tag는 1.0.16이고 최종 소스는 79c115dc9c(branch main)입니다.
    • 단일 linux/amd64 이미지: git.2ex.dev/hanyul/links:1.0.16 = git.2ex.dev/hanyul/links:latest(index digest sha256:4994796a90bb7c54b866be8c4104b12adbb70f6cc0c8f0ce2e6a605a5f12c09c, 로컬 image ID와 동일).
    • release asset은 없습니다. 배포 파일은 update.sh가 tag에서 HTTPS로 받습니다.
    Downloads 2