← 목록
기타 2026-06-29 6KB 읽기 6분

music.crowny.org 재생길이(dur) 버그 수정 + courage 런칭

개요

2026-06-29 작업 재개 세션. music.crowny.org:9886 음악 허브 상태 점검 중 카탈로그 3소스의 재생길이(dur)가 전부 틀려있는 버그를 발견·수정하고, iCloud 다운로드 완료된 마스터곡 1개를 런칭했다.

발견한 문제

  • 라이브 트랙의 재생길이가 잘못됨 → 플레이어 시크바/시간표시 깨짐:
  • hsp-freestyle: 저장값 195s → 실제 61s
  • hsp-jiin-s: 0s → 실제 703s
  • hsp-0ef790: 0s → 실제 187s
  • 근본원인: tools/발매확인.js 런칭()entry.길이초 || 0 만 사용. 길이초 없으면 dur=0으로 박힘.
  • 수정 내용

    1. 데이터 보정: ffprobe로 4곡 실측 → 3소스 일괄 갱신
    - data/index/tracks-shard-0.jsonl (스트리밍 SSOT, dur 초) - data/카탈로그.jsonl (발매 SSOT, 길이ms) - data/tracks.seed.json (앨범 메타, durationSec 초)
    1. 근본원인 수정: tools/발매확인.jsprobeDur(audioPath, fallback) 추가
    - 배치된 mp3에서 ffprobe format=duration 실측·반올림 - 실패 시 entry.길이초, 그것도 없으면 0 (ffprobe 미설치 안전) - 런칭 시 3소스 모두 이 실측값 기입 → 신곡 dur=0 재발 방지
    1. courage to change 런칭: iCloud 다운로드 완료 확인(✔) → 확인 5 런칭. dur=119s 자동 실측되어 라이브. fix 엔드투엔드 검증 완료.

    검증

    • /api/health 200, 서버 재기동 정상
    • /api/music/tracks 4곡, 전 dur 정확(61·703·187·119)
    • /api/music/stream/hsp-courage-to-change HTTP 206
    • 3소스 카운트 동기(shard 4 · 카탈로그 4 · seed 4)

    관련 파일

    • tools/발매확인.js (probeDur 추가, 런칭 3소스 기입부 수정)
    • data/index/tracks-shard-0.jsonl, data/카탈로그.jsonl, data/tracks.seed.json

    잔여 이슈

    • 한선피아노 5곡(사랑하기때문에·beautiful savior·flower dance·지금까지지내온것·피난처있으니) iCloud evicted → Finder 다운로드 후 node tools/발매확인.js 확인 <번호>
    • 부팅 영속(LaunchAgent) 미설치 — 현재 세션 백그라운드 기동
    • 길이추출은 fact-collection이라 Node 유지. 판정 SSOT는 한선/발매확인.한선(4상)

    추가 (TASK 1·셋다 진행): 한선피아노 5곡 일괄 런칭

    • iCloud 다운로드 완료 확인 → node tools/발매확인.js 확인 전체 일괄 런칭
    • 신규: beautiful savior(564s)·flower dance(168s)·지금까지지내온것(162s)·피난처있으니(140s)·사랑하기때문에(33s)
    • probeDur 자동 실측으로 5곡 모두 정확한 dur (dur=0 재발 없음). 현재 라이브 9곡, 3소스 동기(9/9/9)

    스카우트 발견(노래방·발매 — 워크플로우로 강화 중)

    • 노래방: ①karaoke.js runToau가 stale build/*.toau를 읽음(selfHeal은 한선/*.toau로 컴파일) ②채점.한선 미배선(라우트가 클라 점수에 인라인 0.6/0.4만, 한선 SSOT 미사용) ③고아 hsp-courage.lrc.json(실 pitch데이터)가 라이브 id hsp-courage-to-change와 불일치
    • 발매 상태기계: ①canTransit/nextState 정의됐으나 미호출 → 전이 무가드(검수 없이 distribute 가능) ②_crmSeq/_crrSeq 메모리 → 재시작 시 식별자 충돌 ③payout 상태 게이트 없음

    TASK 2·3 (울트라 워크플로우 2트랙 + 적대검증, 2026-06-30)

    트랙 A — 노래방 채점/가사싱크 (PASS)

    1. toau 경로 버그: routes/karaoke.js가 stale build/*.toau를 읽음(selfHeal은 한선/*.toau로 컴파일) → BUILD 상수를 한선/로 교정해 SSOT 일치
    2. 채점.한선 배선(死코드였음): /api/karaoke/score가 raw입력(기준midi/입력hz/박자오차ms)이면 SCORE_ACTION=calc로 서버계산, 없으면 클라 제공점수(하위호환). 저장은 SCORE_ACTION=save 한 곳만(이중저장 제거)
    3. 고아 가사: hsp-courage.lrc.json(실 pitch contour) → hsp-courage-to-change.lrc.json로 교체+trackId 교정, 고아 삭제
    4. hz→midi 공식 버그 수정: 로그()=ln(x)×1000 고정소수점인데 코드가 float로 가정(ln2=693147, ×1e6 스케일)해 반음수가 0으로 붕괴 → 항상 오답. ln2=693, 스케일 정정. 검증: C4 262Hz→음정100, 277→90, 294→75, 330→45, 220→60 (정확)

    트랙 B — 발매 7단계 상태기계 (적대검증이 회귀 검출 → 메인 수정 후 통과)

    1. 전이 무가드 해소: computeReleaseState+canTransit 배선 → 단계 건너뛰기 400 전이불가 차단
    2. review 4상: 티→배급대기 / 옴→검수 / 타→초안 / 음→검수 (한선 SSOT 일치)
    3. CRR/CRM 영속: 메모리 변수 → data/seq.json 카운터(재시작 충돌 방지)
    4. payout 게이트: 라이브/정산 상태만 정산 허용
    5. ⚠️ 적대검증 검출 회귀: 1차 구현의 computeReleaseState_patch:'meta'/'cover' 레코드를 미추적 → meta 후 상태가 영구 '초안' 정체, 전 파이프라인 차단. 메인 세션이 직접 수정(meta/cover 패치도 상태 운반하므로 추적 추가)

    통합 검증 (라이브)

    • 발매 E2E: 초안→메타입력→커버업로드→검수→배급대기(review 티)→라이브 전구간 통과, 초안에서 distribute 시도=400 차단✓
    • 노래방: 완벽음정 종합100/티/S, 빗나감+박자늦음 종합37/음/C, 리더보드 집계✓
    • 회귀 없음: health 200, 스트리밍 9곡 dur 전부 정상

    잔여(무해/별도 세션)

    • build/ stale .toau 미정리(미참조), distribute 중복 상태패치, 발매 live 경로가 tracks-shard-0.jsonl 미갱신(3소스 불일치 잔류)