Files

193 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Find-Word v0.2.5 exact 자산 승인 및 독립 리뷰 수정 결과
2026-10-14 UTC · `/home/hermes/worktrees/find-word-v0.2.5` · `fix/v0.2.5-ambience-loudness`.
HEAD `812540c7438639f25b886cfd620201d92de15362` 유지. **commit/push/merge/tag/deploy 미실행.**
## 릴리스 판정: exact-byte 소유자 청취 승인 경로 수용
Oz는 현재 8 WAV·manifest·notice를 포함한 검수 ZIP을 받은 뒤 **“승인합니다. 이대로 진행하세요”**라고
**2026-10-14T11:29:51Z / 2026-10-14 20:29:51 KST**에 회신했다. 사용자가 전달한 이 회신을
[RELEASE-APPROVAL-v0.2.5.json](RELEASE-APPROVAL-v0.2.5.json)에 기록했다.
ZIP SHA-256 `bb2e974b652df43db4a1f2a59716836e2c521839c724b34d4b71c1b40c3322e5`,
현재 manifest SHA-256 `6433bf23af35f24031c6bbe784dd0abf9330f276da6b8705e47c7a1144a285b7`,
8 WAV 및 notice 해시를 모두 연결했다. **productOwnerReleaseApproval=true, humanListeningAcceptance=true,
legalPrivacyClearance=false**다. 자동 ASR 실패는 그대로이며 이 승인은 법적/privacy clearance가 아니다.
릴리스 계약은 **자동 empty-ASR 조건 OR 유효한 exact-byte 소유자 청취 승인**이다.
현재는 후자만 통과한다. `python3 scripts/release_approval.py`는 고정 전달 ZIP의 해시 및 현재 파일 전체의
바이트 동일성, 정확한 소유자/회신/시각/범위/flags를 검사한다. 잘못된 승인 기록은 자동 조건이 통과해도
거부하며, WAV/manifest/ZIP 변경·누락된 필드·법적 clearance 과장을 허용하지 않는다.
현재 검증 결과는 문서 마지막 표에 있으며 아래 ASR/이전 테스트 실패를 PASS로 바꾸지 않는다.
정규화 결함은 strict TDD로 수정했다. 전용 **FFmpeg `ebur128=peak=true`**가 릴리스 수용 계기이며,
8개 exact 최종 WAV 모두 **−32.5 LUFS**, spread **0.0 LU**, 최대 true peak **−6.2 dBTP**다.
독립 **pyloudnorm 0.2.0 / soundfile 0.13.1**도 **−32.6062~−32.5291 LUFS**, spread **0.0771547792 LU**로
목표 ±0.2 LU / spread≤0.4 LU를 통과했다. loudnorm input_i를 수용 계기로 사용하는 주장은 철회했다.
같은 faster-whisper/VAD 설정으로 새 바이트를 검사했을 때 **market 1개 segment**가 반환되었다.
**requiredEmptyPassed=false**로 자동 조건은 여전히 실패다. 승인 전 `npm test`의 **143 통과 / 1 실패**와
`requiredEmptyPassed=true`를 요구하던 원래 테스트 소스·실패 로그를 역사 진단으로 보존했다.
- exact market WAV SHA-256: `7178307c48c192ac396dcd3c880c377bf56b45e829b459b1feca9f986437e632`
- 보존한 원본 구간: 24–36초. ASR 반환 구간: **10.45–12.45초**. 반환 끝 시각도 수정하지 않았다.
- 후보 텍스트: ` Let's go, let's go, let's go.` (검증된 전사가 아님)
- mall/cafe 및 다른 5개는 segment 0개. market을 포함한 필수 3개 전부 empty 조건은 미충족.
- [실패 원문](evidence-v0.2.5/review-fixes/final-asr.json), [실행 로그](evidence-v0.2.5/review-fixes/08-asr.log),
[승인 전 unit 실패](evidence-v0.2.5/review-fixes/15-unit.log).
설정/threshold/모델/선택 구간을 바꾸거나 반환 segment를 삭제하지 않았다.
ASR 보고서의 `humanListeningAcceptance=false`, `legalPrivacyClearance=false`는 그대로다.
ASR 원문 SHA-256은 `98acdb16bc5dce57bb3609b705b63125e5511c2d5f7b26bdde54f4b7bd9a5e49`다.
소유자 청취 인수는 새 별도 승인 기록에서만 true다. 이전 Oz 승인은 당시 v0.2.3 exact WAV에 한정된다.
ASR의 후보 텍스트가 실제 발화를 입증한다고 주장하지 않는다.
## 거부된 역사와 불변 보존
독립 리뷰 결과를 적용했다. 이전 loudnorm input_i는 spread **0.01 LU**를 보고했지만 같은 WAV의
전용 FFmpeg ebur128은 **2.0 LU**, 별도 pyloudnorm 0.2.0은 **1.925 LU**였다. 당시 정규화 결과는
릴리스 조건 실패다. 계기 차이를 진단값으로만 분류하고 ebur128 equality assertion을 제거한 판단은 철회했다.
이전 [RESULT 사본](evidence-v0.2.5/review-fixes/rejected-RESULT-v0.2.5.md),
[당시 bundle](evidence-v0.2.5/review-fixes/rejected-loudnorm-bundle/),
[당시 정규화 계획](evidence-v0.2.5/review-fixes/rejected-AMBIENCE-NORMALIZATION-v0.2.5.json)을 별도 보관했다.
앞선 독립 리뷰 수정은 기존 `.agent/evidence-v0.2.5` **150개 파일**을 byte 동일하게 보존하고 `review-fixes/`에 추가했다.
이번 승인 작업은 이 `review-fixes/`까지 전부 보존하고 `release-approval/`에만 새 증거를 추가한다.
승인 직전 [RESULT 사본](evidence-v0.2.5/release-approval/before-RESULT-v0.2.5.md)과
[ACCEPTANCE 사본](evidence-v0.2.5/release-approval/before-ACCEPTANCE-v0.2.5.md)도 보관한다.
상위 evidence의 GREEN/완료 표시는 거부된 당시 기준의 역사이며 현재 릴리스 통과를 뜻하지 않는다.
기존 불변 파일 **660개**, voice WAV **101개**, source **8개**의 hash/bytes와 원본 선택 구간·creator·license·attribution을
보존했다. source plan hash는 `3529c8534be204208ac504a0f4c1a69b312131f9bbff92aa9a3135d61d24db65`다.
[history hash 목록](evidence-v0.2.5/review-fixes/history-sha256.json),
[보존 검증 결과](evidence-v0.2.5/review-fixes/preservation.json).
## 구현과 manifest
1. 불변 source plan으로 모든 원본 SHA-256/bytes를 먼저 검증한다. 기존 seek 및 짧은 Ogg의
full decode/sample trim fallback, 12초/24kHz/mono와 양끝 50ms 선형 fade를 보존한다.
2. 정확한 faded f32 PCM을 새 `ebur128=peak=true` 프로세스로 측정한다.
3. 모든 환경의 공통 target **−32.5 LUFS**에서 `gain_db=target−measured_i`를 구한다.
market의 입력 I=−26.4 LUFS, TP=−0.1 dBTP이므로 gain=−6.1 dB로 파형을 보존하며 내부 ceiling에 맞춘다.
4. 입력 true peak+gain이 **−6.2 dBTP**를 넘으면 변환 전에 실패한다.
**`volume=<gain_db>dB:precision=double`만 적용**하고 FFmpeg `pcm_s16le`로 인코딩한다.
5. staged WAV를 새 ebur128 프로세스로 측정한다. 오차가 ±0.2 LU 밖일 때만 같은 원본 PCM에서 스칼라를 보정한다.
매번 peak를 사전 검사하며 최대 총 3회다. 비수렴/NaN/측정 실패/내부 peak 초과는 공개를 차단한다.
6. staging의 8 WAV·manifest·notice 전체를 검증하고 새 ebur128 측정으로 bundle spread≤0.4 LU 및
각 파일 target±0.2 LU/TP≤−6 dBTP를 강제한 뒤 단일 `renameat2(RENAME_EXCHANGE)`로 원자 교환한다.
이번 8개는 모두 첫 시도에 통과하여 보정 반복은 필요하지 않았다. 모든 sample에 동일 scalar만 적용하고
PCM16 반올림 오차만 남는다는 실제 FFmpeg fixture 검사, corrective gain/비수렴/peak 초과 검사가 있다.
실패하면 기존 공개 디렉터리를 보존하는 검증/쓰기/교환/중단 테스트도 유지했다.
[manifest](../public/ambience/manifest.json)는 입력 ebur128 통계, faded PCM hash, 각 iteration의 정확한 gain/filter,
예측 peak/출력 통계, 최종 ebur128 통계, 목표/허용오차/spread/내부·릴리스 ceiling/최대 반복 수와
**FFmpeg 6.1.1-3ubuntu5** 버전을 기록한다. [정규화 계획](AMBIENCE-NORMALIZATION-v0.2.5.json)도 같은 계약이다.
12초, 288,000 frames, mono 24kHz PCM16, 576,044 bytes와 고유 hash/non-silence/양끝 0을 유지한다.
| 환경 | 원본 시작 초 | gain dB | 최종 ebur128 LUFS | 최종 dBTP |
| --- | --- | --- | --- | --- |
| street | 35 | +3.2 | −32.5 | −10.2 |
| mall | 36 | −10.4 | −32.5 | −12.2 |
| theater | 45 | −6.8 | −32.5 | −16.1 |
| department | 90 | −8.4 | −32.5 | −16.6 |
| market | 24 | −6.1 | −32.5 | −6.2 |
| subway | 65 | −16.0 | −32.5 | −16.2 |
| cafe | 0 | −13.0 | −32.5 | −18.2 |
| rain | 180 | +19.7 | −32.5 | −12.1 |
[독립 ebur128 script/hash/raw summary/결과](evidence-v0.2.5/review-fixes/ebur128-results.json),
[독립 pyloudnorm script/hash/version/결과](evidence-v0.2.5/review-fixes/pyloudnorm-results.json).
일반 npm test는 Python 표준 라이브러리와 FFmpeg만 사용하며 네트워크나 전역 pyloudnorm을 요구하지 않는다.
독립 meter는 별도 disposable venv에서 실행했다. 7개 의존성 전부 version/wheel SHA-256을 고정한
[lock과 재현 명령](evidence-v0.2.5/review-fixes/README.md#독립-pyloudnorm-재현)을 보존했다.
같은 원본에서 별도 임시 디렉터리로 두 번 재생성해 공개 WAV/notice/입력·iteration·최종 통계가 동일함을 확인했다.
manifest 생성 시각만 제외한다. [재현 결과](evidence-v0.2.5/review-fixes/reproducibility.json).
재현성 범위는 기록한 도구 빌드/플랫폼이며 다른 FFmpeg 빌드의 byte 동일성을 주장하지 않는다.
## 런타임과 검증
기존 고정 배경 gain **G=0.4198884518664126**을 변경하지 않았다. 환경·SNR·intro 유무와 무관하다.
voice/intro RMS .03, SNR은 voice 상대 gain만, master는 세 경로에 동일 적용한다.
보수적 상한 B=.55,V=.25,I=.20, SNR_MAX=12, intro=1.8, ceiling=.8을 유지한다.
```text
G = 0.8 / (0.55 + 0.25*10^(12/20) + 0.20*1.8)
|mix| ≤ master * G * (B + V*10^(12/20) + I*1.8) ≤ 0.8
```
101 voice×8 배경×25 SNR, **20,200개** 조합을 다시 검사했다. 새 background 최대 sample peak는
**0.471954345703125**, voice=0.2052977830171585, intro=0.14995422959327698이며,
실측 peak를 대입한 최악 합성 상계는 **0.6546804814413929 < .8**이다. 배경 gain 집합의 크기는 1이다.
[전수 runtime/doc 검사](evidence-v0.2.5/review-fixes/21-docs-runtime.log).
아래 표와 Chrome 수치는 **승인 전 독립 리뷰 수정 당시 기록**이다. 최신 검증은 다음 절에 별도로 기록한다.
| 검사 | 당시 결과 | 보존 증거 |
| --- | --- | --- |
| ebur128 TDD | RED 2.0 LU 실패 → GREEN | [01](evidence-v0.2.5/review-fixes/01-ebur128-RED.log), [06](evidence-v0.2.5/review-fixes/06-ebur128-GREEN.log) |
| 선형 gain/peak/비수렴 TDD | RED → 7 PASS | [02](evidence-v0.2.5/review-fixes/02-linear-RED.log), [04](evidence-v0.2.5/review-fixes/04-linear-GREEN.log) |
| ASR gate TDD | RED, 실제 재검사도 FAIL 유지 | [03](evidence-v0.2.5/review-fixes/03-asr-gate-RED.log), [08](evidence-v0.2.5/review-fixes/08-asr.log) |
| build manifest 계약 TDD | RED → 해당 39 PASS | [07](evidence-v0.2.5/review-fixes/07-build-contract-RED.log), [15](evidence-v0.2.5/review-fixes/15-unit.log) |
| `npm run lint` | PASS | [14](evidence-v0.2.5/review-fixes/14-lint.log) |
| `npm test` | **143 PASS / 1 FAIL (ASR)** | [15](evidence-v0.2.5/review-fixes/15-unit.log) |
| 전체 Python | **47 PASS** | [11](evidence-v0.2.5/review-fixes/11-python.log) |
| `npm run build` | PASS, 109 WAV 및 notice/manifest 일치 | [16](evidence-v0.2.5/review-fixes/16-build.log) |
| `npm audit --json` | 취약점 0개 | [audit](evidence-v0.2.5/review-fixes/npm-audit.json) |
| system Chrome desktop/mobile | **36 PASS**, skipped/flaky/unexpected=0 | [17](evidence-v0.2.5/review-fixes/17-browser.log), [summary](evidence-v0.2.5/review-fixes/browser-summary.json) |
| 문서 변경 후 관련 계약/runtime 재검사 | **12 PASS** | [21](evidence-v0.2.5/review-fixes/21-docs-runtime.log) |
| 불변 이력/원본/음성/public-dist | PASS | [20](evidence-v0.2.5/review-fixes/20-preservation.log) |
Chrome은 system executable의 sandbox를 켜서 실행했다. 실제 프로세스 인자에 `--no-sandbox`가 없음을
[기록](evidence-v0.2.5/review-fixes/chrome-sandbox-final.json)했다. desktop/mobile은 viewport/touch emulation이며
물리 모바일/Safari 인증은 아니다. 109 WAV의 24/44.1/48/96kHz decode/peak와 8환경×3 SNR의 native GainNode,
3문항·종료·재청취·오류 재시도·무결성·axe·네트워크를 검증했다. 정상 흐름 console/page 오류·실패 요청·외부 요청·axe 위반은 모두 0개다. 의도적인 404/변조 오류는 정상 흐름 통계와 구분한다.
각 프로젝트 436개 리샘플 측정에서 최대 background=0.4879775941371918, voice=0.20585650454525403,
intro=0.14999594059820148로 기존 보수적 상한 이하다. 두 프로젝트 모두 24개 GainNode 관측의
예약 gain은 0.4198884518664126, 실제 Float32 plateau는 0.4198884665966034로 동일하다.
앞선 작업은 당시 차단 상태로 문서를 기록했다. 이번 작업은 README/CHANGELOG/ARCHITECTURE/
AUDIO_PROVENANCE/DEPLOYMENT/RESULT/ACCEPTANCE를 새 소유자 승인 상태로 갱신한다.
제품/query 버전 0.2.5, 정확한 `Designed by OZ at Heat-T Medical Inc.`, 제3자 notice/market CC BY-SA 4.0,
정규화 계획·manifest·source/segment·loudness/gain 수학과 runtime 코드는 그대로다.
원래 TASK와 이전 릴리스 기록은 역사로 보존하며 이번 사용자 지시가 별도 소유자 승인 경로를 추가한다.
## exact 자산 승인 후 전체 검증
승인 기록이 없는 RED를 먼저 실행하고, 승인 기록 및 별도 OR gate를 추가했다.
원래 ASR 테스트의 전체 소스와 실제 FAIL 로그는 보존하고 현재 진단 테스트는 원문 SHA-256과 실패 상태를 고정한다.
승인 없이 현재 ASR만으로 통과할 수 없다. Python 변조 테스트는 WAV/manifest/ASR/승인 해시를 함께 고쳐도
고정된 전달 ZIP과 일치하지 않으면 거부됨을 검사한다. 자동 성공 fixture는 테스트 임시 사본에서만 사용했다.
| 검사 | 현재 결과 | 새 증거 |
| --- | --- | --- |
| 승인 기록 누락 TDD | RED → 승인 계약 GREEN | [01 RED](evidence-v0.2.5/release-approval/01-approval-absent-RED.log), [03 GREEN](evidence-v0.2.5/release-approval/03-contract-GREEN.log) |
| 원래 ASR true 요구 테스트 | **FAIL 유지, 역사 진단** | [원래 소스](evidence-v0.2.5/release-approval/before-ambience.test.ts.txt), [02 FAIL](evidence-v0.2.5/release-approval/02-original-ASR-FAIL.log) |
| 현재 릴리스 gate | **PASS: exact-byte-owner-listening-approval**, 자동 ASR false, 법적 clearance false | [gate JSON](evidence-v0.2.5/release-approval/release-gate.json) |
| 승인/해시/범위/법적 과장 변조 | **13 Python 테스트 + 필드별 subtest PASS** | [04](evidence-v0.2.5/release-approval/04-mutation-tests.log) |
| lint/typecheck | **PASS** | [06](evidence-v0.2.5/release-approval/06-lint.log) |
| 전체 unit/component/release | **146 PASS**, 16 files, 실패/skip 없음 | [07](evidence-v0.2.5/release-approval/07-unit.log) |
| 전체 Python | **60 PASS** | [08](evidence-v0.2.5/release-approval/08-python.log) |
| build | **PASS**, 101 voice + 8 ambience 및 notice/manifest | [05](evidence-v0.2.5/release-approval/05-build.log) |
| npm audit | **취약점 0개** | [audit](evidence-v0.2.5/release-approval/npm-audit.json) |
| 전체 sandboxed Chrome desktop/mobile | **36 PASS**, unexpected/skipped/flaky=0 | [09](evidence-v0.2.5/release-approval/09-browser.log), [summary](evidence-v0.2.5/release-approval/browser-summary.json) |
| 이전 evidence/원본/구간/음원/수학 보존 | **1,029개 원위치 불변 + 2개 상태 문서 원문 사본**, 원본 8개 일치, public 113개 dist 일치 | [보존 JSON](evidence-v0.2.5/release-approval/preservation.json) |
| secret scan | **발견 0개** | [scan](evidence-v0.2.5/release-approval/secret-scan.json) |
| git diff --check 및 새 파일 whitespace | **PASS** | [diff](evidence-v0.2.5/release-approval/12-diff-check.log), [new files](evidence-v0.2.5/release-approval/new-files-whitespace.json) |
Chrome **146.0.7680.80**, `chromiumSandbox=true`, 실제 browser **4개** 및 renderer **72개**를 관측했다.
`--no-sandbox`는 없으며 모든 관측 renderer의 **Seccomp=2 / NoNewPrivs=1**이다.
처음 수집기는 `/proc`의 전체 명령이 argv[0] 하나로 들어오는 형식을 오해하여 renderer 미관측으로
종료 코드 1을 냈다(Playwright 자체는 0, 36 PASS). [원래 수집기](evidence-v0.2.5/release-approval/run-browser-initial.py.txt)와
[원문 프로세스/초기 판정](evidence-v0.2.5/release-approval/chrome-process-observations.json)을 보존했다.
원문을 바꾸지 않고 정확한 flag 경계로 재분석했으며 분리/통합 argv 양쪽의 음성/양성 검사를 수행했다.
[교정한 sandbox 요약](evidence-v0.2.5/release-approval/chrome-sandbox.json)은 이 파서 교정 경위를 명시한다.
양쪽 프로젝트에서 109 WAV hash/decode, 436개 resampling 관측, 8환경×3 SNR native GainNode,
실제 loop 재생/중지와 전체 게임·접근성·오류 복구 흐름을 통과했다. 정상 흐름 오류/실패 요청/외부 요청은 0이며
axe 검사도 통과했다. 실제 gain은 기존 예약값 **0.4198884518664126**, Float32 관측값 **0.4198884665966034**다.
desktop/mobile은 viewport/touch emulation이고 production/물리 모바일 검증은 수행하지 않았다.
README, CHANGELOG, AUDIO_PROVENANCE, ARCHITECTURE, DEPLOYMENT 및 이 RESULT/ACCEPTANCE를 갱신했다.
검수 ZIP과 모든 이전 증거를 보존했으며 **commit/push/merge/tag/deploy는 실행하지 않았다**.