Files

193 lines
17 KiB
Markdown
Raw Permalink Normal View History

2026-10-14 12:12:13 +00:00
# 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는 실행하지 않았다**.