-
hanyul released this
2026-10-04 09:30:20 +09:00 LINKS 0.20
이전 릴리스 0.19부터 최종 소스
5e8cc51c7a까지의 전체 변경 사항입니다. 루트 패키지는 0.20.0, ARCA는 exact 0.1.14 → 0.1.15입니다.업그레이드 주의 — 파생 운영 데이터 전체 초기화 필요
schema가
cd63767d7f446938be9a915103cc57f130f7e85781ff390f5a3803c833a77b9b에서743448f6d2891794e5ba98834d9f5055c3f5c58e22276ed701de36650f4b2b07로 바뀝니다. 기존 DB를 자동 변환하는 migration·업그레이드 경로는 없으며, 다른 schema의 DB에서는 기동이 멈춥니다.같은 0.20 태그의 배포 파일을 아래 SHA-256으로 대조한 뒤, 운영 가이드의 전체 초기화 절차에 따라
reset.sh --execute→update.sh를 실행합니다. DB·사용자·패스키·설정·세이브·표지·artifact·sealed input·runtime package·Caddy 파생 데이터를 초기화하고 관리자 등록, 라이브러리 스캔과 실행 준비를 다시 진행합니다. 기존 세이브·사용자·패스키는 이어지지 않습니다. RTP는--delete-rtp를 추가하지 않으면 보존됩니다.원본 game library는 읽기 전용으로 유지하며 변경하지 않습니다. 환경 파일과 backup은 초기화 보존 대상이지만 다른 schema 버전의 0.19 이하 backup은 0.20 DB에 복원할 수 없습니다. 이번 게시 작업에서 개발·운영 DB 초기화나 NAS 배포는 실행하지 않았습니다.
화면과 탐색
- 목록·검색·필터·상세·최근 실행·북마크·개인 라이브러리의 간격, 상태 안내와 작은 화면 배치를 개선합니다. 결과 수와 페이지/추가 읽기 상태를 구분하고 실패 뒤 기존 결과와 재시도 조작을 유지합니다.
- 라이브러리의 빠른 조건을 키보드 Tab으로 이동하면 해당 버튼이 가로 목록 안에 완전히 보입니다. 초점 이동만으로 조건·주소·선택 게임을 바꾸지 않으며 클릭·Enter·Space로 적용합니다. 큰 글자에서도 컨테이너가 재배치됩니다.
- 카드·목록·상세의 표지 실패는 공통 대체 화면으로 표시합니다. 판본 언어 label, 선택·저장·취소 결과와 로딩/오류 안내를 일관되게 표시합니다.
- 패스키·계정 보안·사용자 관리·초대, 작업·로그·운영 경고, 수집 요청·스캔, 매칭 검토·설치본 후보·실행 빌드 관리 화면의 상태 feedback과 확인 dialog를 개선합니다. 위험 작업은 취소에 처음 초점을 두고 닫힌 뒤 적절한 조작으로 초점을 복원합니다.
- 관리자 cursor 목록 요청과 공유 태그 계약을 공용 helper로 정리하며 요청 실패·다음 페이지·갱신 상태를 화면에서 구분합니다. 매칭·후보 검토의 사유 입력 오류와 결정 결과를 해당 조작에 연결해 표시합니다.
실행 준비 복구와 취소
- VX/VX Ace package의 실제 stage/publish 명령에서 준비 시간 측정 JSON이 stdout에 섞여 coordinator가 결과를 거부하던 문제를 수정합니다. 측정 진단은 stderr로 보내며 stage stdout은 digest·sealed key·attempt key 세 필드, publish stdout은 빈 출력입니다. 기존 worker의 기본 stdout 로그와 lease·취소·무결성·게시 검사는 유지합니다. 마지막 줄만 고르는 parser 우회는 추가하지 않습니다.
- 인증된
/play의 게임 연결 전 준비·대기·로딩 화면에취소하기조작을 제공합니다. 누르면 로컬 실행 의도를 중단하고 조회·세션·bridge 요청을 abort하며 늦은 응답으로 게임을 다시 시작하지 않습니다. - 준비 중인 관리자는 기존 CSRF·idempotency 취소 API로 공유 서버 준비의 취소를 요청합니다. 요청 접수는 worker 종료 완료를 뜻하지 않으며, viewer는 서버 취소 요청 없이 라이브러리로 돌아갑니다.
- 서버 취소 요청은 10초로 제한합니다. 실패·결과 미확인도 라이브러리로 돌아가 해당 설치본·현재 탭에 결과 안내를 유지하고, 현재 관리자만 같은 key로 다시 요청할 수 있습니다. 취소 요청 중 숨김/복귀에서도 중단 의도와 결과 미확인 안내를 보존합니다.
- 연결 전 Player 배치·준비·실패 안내를 작은 화면과 큰 글자에 맞게 개선합니다. 이미 연결된 게임의 저장·이탈 계약은 기존 구현을 유지합니다.
ARCA 0.1.15
- root dependency·lockfile·승인된 release age 예외를 0.1.15 exact pin으로 맞추며, 설치된 공개 deploy/contracts export와 검증된 release를 이미지에 결속합니다.
- 공식 RTP 준비의 전송 오류·HTTP 5xx/429·무수신 재시도와 제한 시간은 ARCA가 소유합니다. LINKS는
prepareArcaRtp에 별도 재시도·timeout을 추가하지 않고 공개 오류 code를 사용합니다. - VX game
mkxp.json의 비 UTF-8·JSON·형식 오류는 ARCA Builder의 원본 입력 실패 code로 분류되어 재시도 불가 원인을 보존합니다. - ARCA 공개 verifier로 대체된 RGSS scratch·acceptance handoff와 부모 runtime cache의 미사용 wrapper를 정리합니다. 실제 게임 지원 범위 확대나 실제 RTP 다운로드 성공을 이번 릴리스 검증으로 주장하지 않습니다.
데이터·공급자·worker 정리
- observation의 shape 다섯 필드를 필수로 저장하고 nullable 호환 경로를 제거합니다. 사용하지 않는
foundation.noophandler·scanner capability·RLS와 준비 run 없는runtime.stage경로를 제거합니다. - 표지 후보·제작사/공급자 태그 filter·metadata asset 공개 판정을 공통
installation_publishable_identitiesview로 모읍니다. 현재 충돌 없는 외부 ID와 VNDB 승인 연결 조건을 유지하고 누락 설치본의 기존 표지 fallback은 보존합니다. - editions trim 제약을 기준 SQL에 직접 두고 중복 FK·UNIQUE·기본값·잔여 SQL 설정을 정리합니다. 기준 schema는 빈 DB에 새로 적용하며 이전 데이터를 변환하지 않습니다.
- API와 catalog 공개 projection, 스캔 완료·공급자 수집·번역 job, 공급자 응답 크기 제한·이미지 판별·요청 간격·ID 정규화의 중복을 줄입니다. 원문·정규화·번역·사용자 override와 provenance 경계를 유지합니다.
- DLsite·VNDB의 Content-Length 선검사와 재판정 sentinel 상한의 Unicode 비교를 보존합니다. schema 파일 정렬도 공용 code point 비교를 사용합니다.
- provider/scanner/schema/backup fixture와 합성 browser runner를 현재 계약에 맞춰 정리합니다. 문서만 검사하는 read-only mount runner와 합성 browser harness typecheck를 추가하고, scanner의 완료 로그와 seed job의 requestId/jobId 상관을 검증합니다.
환경과 운영
- 0.19 대비 새 필수 환경 key는 없습니다.
.env.example의 개발 기본 host/origin/RP ID를localhost로 통일합니다. 실제 운영 host·origin·RP ID를 임의로 바꾸지 마세요. RP ID를 변경하면 이전 패스키로 로그인할 수 없습니다. - 환경 준비는 기존 유효 비밀값과 운영자 설정을 보존하고 폐기 key의 이름만 경고합니다. 0.19에서 이미 폐기된
LINKS_USER_REGISTRATION_ENABLED는 사용하지 않습니다. - 개발 build 사본은 실행별 디렉터리를 사용하고 해당 사본만 정리합니다. npm 인증은 기존 사용자 설정을 BuildKit secret으로 전달하며 token을 소스·환경 파일·build argument에 넣지 않습니다.
- 운영 Compose·Caddy·backup/deploy/reset script는 이미지 밖의 배포 파일입니다. 이미지와 같은 0.20 태그에서 받아 아래 해시를 모두 대조해야 합니다.
검증과 남은 범위
- PASS — 이번 최종 0.20 소스: 격리
links-release-020Compose에서 runtime/test image build, format·lint·workspace/test/harness typecheck·문서 검사, 전체 unit 134개 파일 / 870개 테스트. 소스와 test/runtime 이미지에서 721개 파일 SHA-256, root 0.20.0, ARCA 0.1.15 공개 계약 결속, schema checksum, 컴파일된 stderr 선택 두 곳을 확인합니다. 현재 문서를 read-only mount한 검사도 721개 파일 / Markdown 30개, mount 6개 / 29개 문서 파일로 통과합니다. - PASS — 이전 독립 검토 증거 재사용: 최종 소스는 검토된 721개 파일과 비교해 root version과 완료 기준선의 version 문구 두 파일만 다릅니다. 이번 이미지의 production HTML/JS/map/CSS 4개 해시는 당시 검토 이미지와 모두 같습니다. 같은 compiled UI의 Chromium·Firefox 취소 각 19/19, 라이브러리 5개 폭·100/200% 글자·즉시/250ms Tab, 연결 전 layout, 합성 취소/autoplay 증거를 재사용하며 이번 게시에서 browser matrix를 다시 실행하지 않습니다.
- PASS — 과거 동일 schema 범위: main 기준선의 fresh schema 31개 파일 / 191개 테스트 증거를 재사용합니다. 이번 게시에서 fresh DB/schema 실행은 NOT RUN입니다. 실제 POSIX·Compose PowerShell parser의 각 7개 vector와 stdout 오염 RED/GREEN 회귀 증거는 검토된 이전 실행이며 새 전체 unit에도 관련 회귀 test가 포함됩니다.
- PARTIAL — 전체 UI/제품 acceptance: 기존 legacy engine-filter runner FAIL과 과거 RF04 원인/덮어쓴 evidence 한계는 남습니다. 화면·fixture·package/build 성공을 실제 browser play PASS로 기록하지 않습니다.
- 알려진 기존 제한: 독립 검토 RR-01의 POSIX stage descriptor parser는 PowerShell보다 느슨해 짧은 sealed object key와 숫자가 아닌 attempt 접미사를 허용하는 기존 P3 형식 경계 차이가 있습니다. 이번 stdout 수정에서 parser 동작은 바뀌지 않으며 별도 후속 항목입니다.
- NOT RUN: 실제 library/private game, 입력·오디오·save/reload의 실제 게임 acceptance, 실제 account/installation 전환·logout matrix, native BFCache/history, 실제 관리자 취소·worker 종료 및 package-loop 복구, live provider·실제 RTP 다운로드, 최신 연결된 Player acceptance, 개발 reset/rebuild와 NAS/production 배포. 개발 적용은 조정자의 별도 후속 작업입니다.
배포 이미지와 파일
- Git annotated tag: 0.20, 최종 소스
5e8cc51c7a. - 단일 linux/amd64 이미지:
git.2ex.dev/hanyul/links:0.20=git.2ex.dev/hanyul/links:latest. - 원격 OCI index digest:
sha256:68b68cd8e70d6ace14600f2f00c44f7aa175b8b22b790845e7efc419ce592ae5. - 아래 SHA-256은 checkout의 CRLF 변환본이 아닌 0.20 태그의 Git blob 원본 byte 기준입니다.
e63f9cccdaa99f26cedc2d5583c22d0cf036e57d4df4a9f21a381c65ee269e8c compose.yaml 6e1fd3f2f73faee52abca28c8552cde417f496d86fc3d78c7001dec480e171a3 infra/docker/Caddyfile 39a4c55050e76043c8ca70f11f59dbdf08fff7ef38c1f1ec878f96194988d9d8 ops/backup-verify.compose.yaml 590c58c5adc610cfe369c64e7d3c297ae172a7e68698c6ee23ee283dac2e69f9 ops/deploy-registry.sh 89375a986b3cb64cf74145541701b32c6a0e983a72ca46be21a8bcfad7beaa3d ops/backup-registry.sh 5a9c19ba45b598974cc4393952da58df454ae9430257b927ac5106a114b8033e ops/reset-registry.shDownloads 2
-
Source code (zip)
0
2026-10-04 09:30:20 +09:00 -
Source code (tar.gz)
0
2026-10-04 09:30:20 +09:00