# v0.2.5 독립 리뷰 수정 증거 **릴리스 차단.** ebur128/pyloudnorm loudness 조건은 통과했지만 동일 faster-whisper VAD gate가 새 market WAV에서 1개 segment를 반환했다. `requiredEmptyPassed=false`이며 이를 `true`로 요구하는 단위 테스트는 실패 상태다. 승인/commit/push/merge/tag/deploy는 하지 않았다. 기존 상위 `.agent/evidence-v0.2.5`의 150개 파일은 [history-sha256.json](history-sha256.json)으로 고정했다. 수정 전 bundle과 RESULT/정규화 계획은 `rejected-*` 사본으로 보존한다. 기존 loudnorm input_i의 0.01 LU spread 주장은 전용 ebur128 2.0 LU / 독립 리뷰의 pyloudnorm 0.2.0 1.925 LU와 모순되어 **거부된 역사 증거**다. 상위 GREEN 표시는 당시 테스트 결과이며 현재 릴리스 통과가 아니다. ## TDD와 결과 | 검사 | 증거 | 결과 | | --- | --- | --- | | 복원한 전용 ebur128 목표/동등성 | [01 RED](01-ebur128-RED.log), [06 GREEN](06-ebur128-GREEN.log) | 2.0 LU 실패 → 0.0 LU 통과 | | 순수 scalar/사전 peak/보정/비수렴 | [02 RED](02-linear-RED.log), [04 GREEN](04-linear-GREEN.log) | 7개 통과 | | exact 새 WAV ASR gate | [03 RED](03-asr-gate-RED.log), [08 실제 실행](08-asr.log), [결과](final-asr.json) | 실패 보존 | | 새 manifest의 빌드 계약 | [07 RED](07-build-contract-RED.log), [15 unit](15-unit.log) | 해당 39개 통과 | | 새 원자 생성 | [05](05-regenerate.log) | 8개 전체 교환 | | 전용 ebur128 독립 측정 | [스크립트](measure-ebur128.py), [결과](ebur128-results.json) | 전수 −32.5 LUFS, spread 0.0 LU, 최대 −6.2 dBTP | | 별도 pyloudnorm 독립 측정 | [스크립트](measure-pyloudnorm.py), [결과](pyloudnorm-results.json) | −32.6062~−32.5291 LUFS, spread 0.0771547792 LU | | Python 전체 | [11](11-python.log) | 47개 통과 | | lint/typecheck | [14](14-lint.log) | 통과 | | npm test | [15](15-unit.log) | 143 통과 / 1 실패 (ASR) | | build | [16](16-build.log) | 통과 | | audit | [JSON](npm-audit.json) | 취약점 0개 | | Chrome desktop/mobile | [17](17-browser.log), [summary](browser-summary.json) | 36 PASS, skipped/flaky/unexpected=0 | | 같은 원본에서 두 번 재생성 | [18](18-reproducibility.log), [JSON](reproducibility.json) | PCM/통계/notice 동일, generatedAtUtc만 제외 | | 역사/원본/음성/dist 보존 | [20](20-preservation.log), [JSON](preservation.json) | 통과 | 현재 manifest의 hash는 ASR와 pyloudnorm 결과에 연결되어 있고 각 WAV hash도 기록되어 있다. ASR 모델 revision/모델 파일 hash/VAD hash/전체 기본 옵션/seed/의존성/스크립트 hash는 [final-asr.json](final-asr.json)에 있다. 기존 실패·no-VAD는 수정하지 않았다. market의 exact SHA-256은 `7178307c48c192ac396dcd3c880c377bf56b45e829b459b1feca9f986437e632`이며, 반환 구간 10.45–12.45초, 후보 텍스트 ` Let's go, let's go, let's go.`를 그대로 남겼다. 이 텍스트는 검증된 전사가 아니다. humanListeningAcceptance/legalPrivacyClearance는 모두 false다. ## 독립 pyloudnorm 재현 일반 npm test는 이 가상 환경이나 네트워크를 사용하지 않는다. 아래 절차는 별도의 독립 증거 재현용이다. Python 3.11/Linux x86_64 wheel을 고정했다. [의존성 lock](pyloudnorm-requirements.lock)의 모든 버전과 SHA-256을 사용한다. [wheel inventory](pyloudnorm-wheels.json), [설치 로그](09-pyloudnorm-install.log), [freeze](pyloudnorm-requirements.txt)를 함께 보존했다. pyloudnorm=0.2.0, soundfile=0.13.1, libsndfile=1.2.2; 나머지 패키지 버전과 Python 버전은 결과 JSON에 있다. 기존 증거를 덮어쓰지 않도록 새 임시 디렉터리에 같은 상대 경로를 구성한다. 설치에는 네트워크가 필요할 수 있지만 WAV 측정은 로컬 파일만 읽는다. `open('x')`가 기존 결과 덮어쓰기를 거부한다. ```bash review_run=$(mktemp -d /tmp/findword-independent-XXXXXX) python3 -m venv "$review_run/venv" "$review_run/venv/bin/pip" install --require-hashes -r .agent/evidence-v0.2.5/review-fixes/pyloudnorm-requirements.lock mkdir -p "$review_run/public" "$review_run/.agent/evidence-v0.2.5/review-fixes" cp -a public/ambience "$review_run/public/ambience" cp .agent/evidence-v0.2.5/review-fixes/measure-pyloudnorm.py "$review_run/.agent/evidence-v0.2.5/review-fixes/" "$review_run/venv/bin/python" "$review_run/.agent/evidence-v0.2.5/review-fixes/measure-pyloudnorm.py" ``` 동일한 임시 경로에 `measure-ebur128.py`도 복사해 `python3`로 실행하면 전용 FFmpeg 계기를 별도 재현할 수 있다. FFmpeg 6.1.1-3ubuntu5와 정확한 input bytes 범위에서 재현성을 검증했으며 다른 빌드의 byte 동일성을 보장하지 않는다.