• LINKS 0.18 — UI 개편·기능 추가·기준 schema 전환

    LINKS 0.18

    이전 릴리스 0.17 대비 변경 사항입니다. 루트 패키지는 0.18.0이고 ARCA는 0.1.13을 그대로 사용합니다.

    업그레이드 주의 — DB 초기화 필요
    DB schema를 migration 이력 방식에서 기준 schema 방식으로 바꿨습니다. 0.17 이하 DB는 새 이미지가 변환하지 않고 resetRequired로 멈춥니다. 배포 전에 데이터 초기화(reset.sh)를 실행한 뒤 관리자 패스키를 다시 등록하고 library를 다시 스캔하세요. 0.17 이하 형식의 backup은 이 버전에서 복원할 수 없습니다. 원본 game library는 읽기 전용이라 영향이 없습니다.

    화면(UI/UX) 개편

    • 디자인 토큰을 정의했습니다: 간격, radius, 글꼴 단계, 표면 단계, 상태 색.
    • 공통 컴포넌트를 통일했습니다: 버튼 위계(화면당 주 행동 하나), 입력, 상태 배지, 태그, 대화상자, 페이지 번호, 빈 상태·로딩·오류.
    • 화면별 정리
      • 상단 바: 불투명 처리와 blur를 제거했습니다. 좁은 화면에서는 한 줄로 표시하고 계정 이름은 말줄임합니다.
      • 홈: 카드 구조를 통일했습니다. 0건이나 오류일 때 페이지 번호가 나오지 않습니다. 제목은 "전체 게임"입니다.
      • 상세·라이브러리: 저장 버튼이 주 행동이 됩니다. 설명 폭(70ch)과 썸네일 크기를 조정했고, 표지가 없으면 "표지 없음"을 표시합니다.
      • Player: 390px에서 잘리던 문제를 고쳤습니다. 모든 상태를 같은 위치에 배치하고, 실패 원인은 경고로 강조합니다.
      • 관리자: 폭과 색 토큰을 통일하고, 위험한 행동은 위험 버튼으로 표시합니다.
    • 상세 "실행 환경"에 브라우저 실행 지원 배지(미검증/미지원, 중립색)를 표시합니다.
    • 문구를 통일했습니다.
      • 역할: 사용자/관리자
      • 다시 읽기는 "다시 불러오기", 실패한 행동을 다시 할 때는 "다시 시도"
      • 판본 필드: "배포판"
    • 접근성: 가로 넘침 0, 텍스트 대비 실패 0, 글자 200%에서도 동작합니다.

    새 기능

    • 개인 라이브러리
      • 서버 검색을 지원합니다.
      • 저장함·실행함·세이브 있음 필터를 추가했습니다.
      • 마지막 실행 시각과 플레이 시간을 표시합니다(서버 측정).
      • 내 실행 준비 목록과 완료 알림을 추가했습니다.
    • 세이브 관리
      • 내 세이브 목록을 보여 줍니다.
      • 이전 버전을 보존(슬롯당 최대 10개)하고, 사용자가 확인한 뒤 복원할 수 있습니다.
      • 새 실행 버전으로 세이브를 가져올 수 있습니다.
      • 저장 일시 실패는 재시도합니다. 화면을 떠날 때 저장을 마칠 때까지 기다리고, 실패 원인을 구분해 안내합니다.
    • 관리자 검토
      • 이동하거나 이름이 바뀐 설치본의 재연결 후보를 제시합니다.
      • 내용 형태 기반으로 중복·판본 후보를 찾습니다.
      • DLsite·Steam·Getchu의 정확한 ID로 작품 연결 후보를 만듭니다.
      • 일괄 결정과 최근 스캔 변경 보기를 추가했습니다.
    • 메타데이터
      • 이미지 decode 검증과 WebP 썸네일(320/640, srcset)을 추가했습니다.
      • 가져온 번역을 표시합니다(기계 번역 배지 포함).
      • 작품 설명 번역은 offline import로만 가져옵니다.
      • 연령 등급 등 필드를 수집합니다. 화면 표시는 아직 하지 않습니다.
      • 관리자 화면에 공급자 상태를 표시합니다.

    표시 규칙 변경

    • 제목과 판본 메모를 고를 때 같은 언어(ko·ko-KR) 안에서는 입력 방식을 먼저 비교합니다. 우선순위는 직접 입력 > 공식 > 검토된 기계 번역 > 기계 번역입니다. 그래서 사용자가 직접 입력한 한국어 값은 기계 번역에 가려지지 않습니다.
    • '세이브 있음' 필터는 Player의 세이브 목록을 조회합니다. Player가 응답하지 않으면 이 조건만 SAVE_SERVICE_NOT_READY로 실패하고, 목록은 조건을 해제한 상태로 계속 볼 수 있습니다.

    신뢰성·성능

    • 변경 없는 증분 스캔이 실패하던 문제와 증분 운용 중 매칭 후보가 생기지 않던 문제를 고쳤습니다.
    • 빈 mount나 대량 누락을 감지하면 보호 동작을 합니다(SCAN_MISSING_GUARD).
    • 내용 변경이 없는 재스캔은 준비된 실행 build를 무효로 만들지 않습니다.
    • 스캔 성능 개선(합성 측정)
      • 2만 entry discovery: 24.3초 → 0.23초
      • 디렉터리 재열거: 335배 → 1배
      • DB 일괄 저장: 약 12배 빨라짐
    • 실행 준비 build 검증을 한 번만 하도록 바꿨습니다(합성 기준 약 10초 → 약 4초). OPFS 캐시 lock을 파일 단위로 낮춰 동시 다운로드가 가능해졌습니다.
    • DLsite 연령 확인·점검 페이지를 "정보 없음"으로 확정하지 않고, 재시도할 수 있는 실패로 처리합니다.
    • 공급자별 circuit breaker를 추가했습니다. 이미지는 조건부 요청(ETag)과 재사용을 하고, VNDB는 DB cache를 사용합니다.
    • PlaySession 만료 정리를 추가했습니다.
    • job lease를 개선했습니다: 종료 시 반환, 재큐 backoff, 처리되지 않은 예외 기록, worker 정지 감지.

    운영·보안

    • catalog·scanner·metadata worker가 서비스별 최소 권한 DB role로 접속합니다(RLS 포함).
    • 로그인 rate limit은 gateway 뒤 실제 client 주소를 기준으로 계산합니다.
    • 운영 backup 명령(ops/backup-registry.sh)을 추가했습니다. 복원 훈련을 포함하고, GC가 쓰는 backup 증거와 연결됩니다.
    • 배포 스크립트는 schema 버전을 확인하고 이미지 digest rollback을 안내합니다. NAS 다운로드 스크립트는 tag를 고정하고 SHA-256으로 검증합니다.
    • 미참조 표지는 정리 전 격리를 거칩니다(7일 격리 후 삭제, 다시 참조되면 복구).
    • 스캔 기록은 최근 성공 3회분만 보존합니다(LINKS_SCAN_ENTRY_RETENTION_SCANS).
    • 새 환경 키:
      • LINKS_PLAYER_CATALOG_TOKEN: catalog↔Player 내부 통신, 필수
      • LINKS_SCAN_MISSING_GUARD_RATIO
      • LINKS_SCAN_ENTRY_RETENTION_SCANS
      • 서비스별 DB role 비밀번호
      • 정확한 목록은 .env.example을 참고하세요.

    알려진 제한

    • catalog↔Player 내부 listener(3005)는 gateway 경로로는 닿지 않습니다. 다만 같은 내부 network의 서비스에서는 접근할 수 있어서 토큰으로 보호합니다.
    • 이미지 decode child process에는 DB 자격 증명이 없지만, worker와 network namespace를 공유합니다.
    • 세이브 용량 활용(SV-05)은 일부만 구현했고, 무중단 save backup(SV-08)은 보류했습니다. VNDB와 DLsite ID를 하나의 Work로 병합하는 기능은 지원하지 않습니다. 자세한 내용은 개발 계획을 참고하세요.

    검증

    • PASS: 통합 소스에서 static, unit, 전체 schema(fresh), scanner, runtime-workers, backup-restore, 운영 backup e2e, provider contract, translation import, foundation, 격리 catalog 통합(패스키·acceptance), 신규·핵심 browser check(Chromium·Firefox)
    • NOT RUN: 실제 게임 전체 acceptance(입력·오디오·save/reload), NAS 배포, live 공급자 호출
    Downloads 2