1 Commits
Author SHA1 Message Date
oz 91aff66445 fix: normalize ambience loudness for v0.2.5 2026-10-14 12:12:13 +00:00
390 changed files with 97709 additions and 257 deletions
+64
View File
@@ -0,0 +1,64 @@
# Find-Word v0.2.5 수용 기준
현재 판정: **exact-byte 소유자 청취 승인 경로 수용, 배포 미실행**.
Oz 회신 **“승인합니다. 이대로 진행하세요”**, **2026-10-14T11:29:51Z / 2026-10-14 20:29:51 KST**를
[승인 기록](RELEASE-APPROVAL-v0.2.5.json)에 고정했다. 사용자에게서 전달받은 회신이며,
`productOwnerReleaseApproval=true`, `humanListeningAcceptance=true`, **`legalPrivacyClearance=false`**다.
자동 ASR은 market 1 segment와 `requiredEmptyPassed=false`로 여전히 실패다.
아래 구현 조건의 이전 증거를 보존하고 이번 전체 검증 결과는 [RESULT](RESULT-v0.2.5.md)에 기록했다: unit 146, Python 60, sandboxed Chrome 36 PASS; lint/build/audit/scan/diff도 통과.
승인 전 이 문서의 미체크 상태는 [원문 사본](evidence-v0.2.5/release-approval/before-ACCEPTANCE-v0.2.5.md)에 보존했다.
## 오류 재현과 loudness 자산
- [x] v0.2.3 실제 8 WAV의 integrated loudness spread가 약 16.49 LU임을 RED evidence로 보존한다.
- [x] 기존 runtime peak-dependent mix에서 같은 SNR의 background final gain/RMS가 환경별로 달라지는 RED를 보존한다.
- [x] 8개 final WAV를 실제 EBU R128 방식으로 측정하고 integrated loudness가 선언 목표의 ±0.2 LU 안에 든다.
- [x] 8개 간 integrated loudness spread가 0.4 LU 이하이다.
- [x] 모든 true peak가 선언 ceiling 이하이며 clipping/full-scale sample이 없다.
- [x] 8개 모두 24kHz mono PCM16, 정확히 12초, non-silent, 고유 hash, fade 경계다.
- [x] 기존 source SHA-256·bytes·creator·license·selected segment는 변경하지 않는다.
- [x] generator는 실제 loudness 측정 실패, 목표 이탈, peak 초과, source mismatch, publication 실패에서 기존 디렉터리를 보존한다.
- [x] manifest/provenance에는 normalization target, true-peak ceiling, algorithm/filter, FFmpeg version, pass 측정값과 final measured LUFS/LRA/true peak를 기록한다.
## Runtime 혼합
- [x] background load는 저장된 loudness-normalized PCM을 파일별 RMS 재정규화 없이 사용한다.
- [x] voice와 intro는 기존 normalization을 유지한다.
- [x] environment 8개와 SNR −12~+12 dB에서 background gain은 완전히 동일하다.
- [x] SNR 변화는 voice/background 상대 voice gain만 바꾸고 background gain을 바꾸지 않는다.
- [x] 고정 common/headroom gain은 검증된 최대 peak와 최대 SNR에서 수학적으로 clipping ceiling 이하이다.
- [x] 실제 101 voice × 8 ambience × 허용 SNR 경계를 검사해 peak 안전성과 유한 gain을 보장한다.
- [x] 재생·재청취·중도 종료·loop stop·404/decode/timeout/abort 복구를 보존한다.
## 버전·문서·주석
- [x] package/lock/HTML/UI/README/voice manifest/ambience manifest/query가 `0.2.5`다.
- [x] `CHANGELOG.md`에 v0.2.5의 모든 오류 원인·자산·runtime·수치·검증 변경이 있다.
- [x] README, ARCHITECTURE, AUDIO_PROVENANCE, DEPLOYMENT가 새 loudness 계약과 일치한다.
- [x] 변경한 모듈·함수·클래스·핵심 변수/매개변수·비자명한 오디오 로직에 상세 한국어 주석이 있다.
- [x] 정확한 credit, 라이선스 notice, v0.2.3 이전 역사/evidence를 보존한다.
## 전체 검증
- [x] lint/typecheck, unit/component/release/Python, build, npm audit를 통과한다.
- [x] sandboxed Chrome desktop/mobile에서 109 WAV 전수 hash/decode와 8 환경 실제 loop 재생을 통과한다.
- [x] 브라우저에서 실제 각 environment의 background GainNode 설정값이 동일함을 검증한다.
- [x] 3문항 고정난이도, 다음 단계, 시작 난이도, SNR 조절, 중도 종료, 무응답 표시가 회귀 없이 동작한다.
- [x] console/page error, failed request, 외부 runtime request, axe violation이 0이다.
- [x] secret scan과 `git diff --check`가 통과한다.
## exact 자산 릴리스 승인
- [x] 승인 JSON이 없어 실패하는 집중 테스트를 먼저 기록했다.
- [x] 전달 ZIP SHA-256 `bb2e974b652df43db4a1f2a59716836e2c521839c724b34d4b71c1b40c3322e5`와 현재 manifest·8 WAV·notice를 전수 비교한다.
- [x] 정확한 Oz 회신/소유자/범위/UTC·KST 시각 및 세 승인 flags를 검증한다.
- [x] 자동 empty-ASR OR 유효한 exact-byte 소유자 청취 승인 계약이며 현재 통과 사유는 후자뿐이다.
- [x] stale 자산/manifest, 다른 ZIP, 문구/범위/시각 누락·변경 및 법적 clearance 과장을 거부한다.
- [x] ASR 원문·market segment·`requiredEmptyPassed=false`와 원래 실패 테스트/로그를 역사 진단으로 보존한다.
- [x] 기존 evidence·원본·구간·loudness/gain 수학·음원 바이트를 보존한다.
## 배포/Git 작업 — 이번 작업 범위 제외, 미실행
- [ ] Neo 독립 검증 뒤 findword.heart-m.com에 commit-addressed release로 원자 배포한다.
- [ ] 공개 8 WAV의 LUFS/true peak/hash/MIME를 재측정하고 production Chrome 흐름을 확인한다.
- [ ] feature push, main fast-forward merge, annotated `v0.2.5`, fresh clone 검증을 완료한다.
+45
View File
@@ -0,0 +1,45 @@
{
"version": "0.2.5",
"sourcePlan": ".agent/AMBIENCE-SOURCES-v0.2.3.json",
"sourcePlanSha256": "3529c8534be204208ac504a0f4c1a69b312131f9bbff92aa9a3135d61d24db65",
"sourcePolicy": "Preserve all eight source hashes, bytes, segments, creators, licenses and attribution exactly. Offline input cache only.",
"normalization": {
"algorithm": "FFmpeg ebur128 measurement; scalar volume in double precision; PCM16; fresh ebur128 verification",
"targetIntegratedLUFS": -32.5,
"truePeakCeilingDBTP": -6.0,
"internalTruePeakCeilingDBTP": -6.2,
"toleranceLU": 0.2,
"maximumSpreadLU": 0.4,
"measurementFilter": "ebur128=peak=true",
"maximumIterations": 3
},
"ffmpegVersion": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers",
"pcm": {
"durationSeconds": 12,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"fadeSeconds": 0.05
},
"runtime": {
"peakBounds": {
"background": 0.55,
"voice": 0.25,
"intro": 0.2
},
"snrMax": 12,
"introRelativeGain": 1.8,
"mixCeiling": 0.8,
"fixedHeadroomGain": 0.4198884518664126
},
"privacy": {
"priorScreening": ".agent/evidence-v0.2.3/privacy-screening/final-asr.json",
"priorOwnerApprovalScope": "Exact v0.2.3 derivative WAVs only; no inferred approval of changed v0.2.5 WAVs.",
"humanListeningAcceptance": false,
"legalPrivacyClearance": false
},
"rejectedHistoricalEvidence": {
"path": ".agent/evidence-v0.2.5/independent-loudness.json",
"reason": "loudnorm input_i spread 0.01 LU contradicted by dedicated ebur128 spread 2.0 LU and independent pyloudnorm 0.2.0 spread 1.925 LU; not accepted for release"
}
}
+91
View File
@@ -0,0 +1,91 @@
{
"schemaVersion": 1,
"owner": "Oz",
"statement": "승인합니다. 이대로 진행하세요",
"statementSource": "User-reported Oz reply after receipt of the review bundle",
"timestampUtc": "2026-10-14T11:29:51Z",
"timestampKst": "2026-10-14T20:29:51+09:00",
"scope": {
"version": "0.2.5",
"kind": "exact-byte-ambience-bundle",
"directory": "public/ambience",
"files": [
"street.wav",
"mall.wav",
"theater.wav",
"department.wav",
"market.wav",
"subway.wav",
"cafe.wav",
"rain.wav",
"manifest.json",
"AMBIENCE_NOTICES.md"
]
},
"productOwnerReleaseApproval": true,
"humanListeningAcceptance": true,
"legalPrivacyClearance": false,
"reviewBundle": {
"file": ".agent/evidence-v0.2.5/release-approval/review-bundle.zip",
"deliveredPath": "/home/hermes/voice-memos/find-word-v0.2.5-normalized-ambience-review.zip",
"sha256": "bb2e974b652df43db4a1f2a59716836e2c521839c724b34d4b71c1b40c3322e5"
},
"manifest": {
"file": "public/ambience/manifest.json",
"sha256": "6433bf23af35f24031c6bbe784dd0abf9330f276da6b8705e47c7a1144a285b7"
},
"notice": {
"file": "public/ambience/AMBIENCE_NOTICES.md",
"sha256": "01d70fca0f4578b0ed8cda0c0ffb172867221029e31efe8136473711683dbf66"
},
"wavs": [
{
"environmentId": "street",
"file": "public/ambience/street.wav",
"sha256": "dace0969087539e5b67fb6fac11b759e81626574230ca7f8d2feb484753656a8",
"bytes": 576044
},
{
"environmentId": "mall",
"file": "public/ambience/mall.wav",
"sha256": "a0a135e319ed70f55b03c6e266fb047e53db8008277a6ba8b855a05a1b82662f",
"bytes": 576044
},
{
"environmentId": "theater",
"file": "public/ambience/theater.wav",
"sha256": "634fc25e8c4e9dcbab97688bc4c0ef9b0299cc7c4c921781a70740aabe46b900",
"bytes": 576044
},
{
"environmentId": "department",
"file": "public/ambience/department.wav",
"sha256": "93e5c23bff2b19716dd21111746837a4df8c52d4b88c6874e57828d09ca5507e",
"bytes": 576044
},
{
"environmentId": "market",
"file": "public/ambience/market.wav",
"sha256": "7178307c48c192ac396dcd3c880c377bf56b45e829b459b1feca9f986437e632",
"bytes": 576044
},
{
"environmentId": "subway",
"file": "public/ambience/subway.wav",
"sha256": "e85cf77a9baa7560fb09966c4eda3b128b92647bc4c54c417a29b4e0f4ac129f",
"bytes": 576044
},
{
"environmentId": "cafe",
"file": "public/ambience/cafe.wav",
"sha256": "864a81571a2e25a99d6408aa282570e7996c7ace432cf4f4f294677ea5bcad63",
"bytes": 576044
},
{
"environmentId": "rain",
"file": "public/ambience/rain.wav",
"sha256": "1842a717e6c77811cb6d6cb09d364e8ef644d50e6beb97d3d187c96e95d85784",
"bytes": 576044
}
]
}
+192
View File
@@ -0,0 +1,192 @@
# 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는 실행하지 않았다**.
+39
View File
@@ -0,0 +1,39 @@
# Find-Word v0.2.5 배경음 loudness 균일화 작업
## 기준
- canonical repository: `https://source.ibit.kr/OZ-Group/Find-Word`
- 기준 커밋: `812540c7438639f25b886cfd620201d92de15362`
- 작업 브랜치: `fix/v0.2.5-ambience-loudness`
- 제품 버전: `0.2.5`
- 배포 대상: `https://findword.heart-m.com/`
- 정확한 credit: `Designed by OZ at Heat-T Medical Inc.`
## 사용자 증상
대화 음성은 일정하지만 배경 소음은 선택한 현장음 파일에 따라 체감 크기가 다르다. 모든 배경음을 같은 체감 loudness로 맞춘다.
## 측정된 근본 원인
v0.2.3의 8개 WAV는 원본 추출 뒤 단순 RMS/peak 기준으로 처리되어 통합 loudness가 약 `−38.69~−22.20 LUFS`, **16.49 LU** 차이였다. 브라우저는 각 배경을 RMS 0.03으로 다시 정규화하지만 주파수 가중 loudness 차이는 남는다. 또한 `mixingGains`가 파일별 peak를 사용해 공통 gain을 계산하여 crest factor가 큰 market만 같은 SNR에서도 background RMS가 추가 감쇠됐다. 예를 들어 +6 dB에서 market은 약 0.021779 RMS, 다른 환경은 0.03이었다.
## 구현 계약
1. 8개 현장음의 source, license, selected segment는 v0.2.3과 동일하게 보존한다.
2. 생성 단계에서 FFmpeg EBU R128/loudnorm 기반의 재현 가능한 loudness normalization을 적용한다. 목표 integrated loudness, true-peak ceiling, 측정 알고리즘·도구 버전·pass 통계·최종 측정값을 계획/manifest/provenance에 기록한다.
3. 최종 8개 WAV의 integrated loudness 편차는 엄격한 허용오차 안에 들어야 하며 true peak, PCM, duration, fade, non-silence 계약을 함께 만족한다. 테스트는 manifest 자기보고가 아니라 실제 파일을 독립 측정한다.
4. runtime은 loudness-normalized 배경을 다시 파일별 RMS로 정규화하지 않는다. 목표 음성·intro 정규화는 유지한다.
5. 파일별 peak 차이가 background gain을 바꾸지 않게 한다. 검증된 background/voice/intro peak 상한과 허용 SNR 최대값에서 구한 보수적이고 **환경 독립적인 고정 headroom gain**을 사용한다. 같은 master volume과 SNR에서 모든 environment의 background gain 값은 동일해야 한다.
6. SNR slider는 목표 음성 gain만 상대적으로 바꾸며 background gain은 environment와 SNR 모두에서 일정하게 유지한다. 음량 master는 모든 경로에 동일하게 적용한다.
7. 변조·과도 peak·잘못된 자산은 fail closed한다. 8개 실제 현장음, 101개 voice, same-origin runtime, cache busting, atomic ambience publication, attribution/license를 보존한다.
8. 제품 버전과 audio/ambience asset query version을 `0.2.5`로 일관되게 갱신한다.
9. `CHANGELOG.md`의 v0.2.5 절에 원인, 알고리즘, 수치 계약, runtime 변경, 테스트, 배포 변경을 모두 기록한다.
10. 직접 변경하는 모듈·함수·클래스·핵심 변수/매개변수·비자명한 수학/오디오 로직에 상세 한국어 설계 주석을 쓴다.
## 개발 방식
- strict vertical-slice TDD: 실제 실패하는 loudness/runtime 계약을 먼저 기록한다.
- 기존 `.agent/evidence*`와 `RESULT*.md`는 수정하지 않는다.
- v0.2.5 결과는 `.agent/evidence-v0.2.5/`와 `.agent/RESULT-v0.2.5.md`에 별도로 저장한다.
- `/tmp/findword-ambience-sources`의 해시 고정 원본 8개를 사용한다.
- Codex는 commit/push/merge/tag/deploy를 하지 않는다. Neo가 독립 검증 뒤 수행한다.
@@ -0,0 +1,31 @@
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) ... ERROR
test_manifest_records_complete_passes_and_independent_final_metrics (test_loudness_audio.FinalLoudness.test_manifest_records_complete_passes_and_independent_final_metrics) ... ERROR
======================================================================
ERROR: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 35, in test_final_wavs_meet_fixed_loudness_and_true_peak
rows = {p.stem: independent_measure(p) for p in sorted((ROOT / "public/ambience").glob("*.wav"))}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 35, in <dictcomp>
rows = {p.stem: independent_measure(p) for p in sorted((ROOT / "public/ambience").glob("*.wav"))}
^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 26, in independent_measure
summary = result.stderr.rsplit("Summary:", 1)[1]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
IndexError: list index out of range
======================================================================
ERROR: test_manifest_records_complete_passes_and_independent_final_metrics (test_loudness_audio.FinalLoudness.test_manifest_records_complete_passes_and_independent_final_metrics)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 50, in test_manifest_records_complete_passes_and_independent_final_metrics
self.assertEqual(manifest["normalization"]["targetIntegratedLUFS"], TARGET)
~~~~~~~~^^^^^^^^^^^^^^^^^
KeyError: 'normalization'
----------------------------------------------------------------------
Ran 2 tests in 0.311s
FAILED (errors=2)
+168
View File
@@ -0,0 +1,168 @@
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) ... {
"targetLUFS": -32.0,
"truePeakCeilingDBTP": -6.0,
"spreadLU": 16.49,
"files": {
"cafe": {
"input_i": -22.2,
"input_tp": -7.79,
"input_lra": 0.3,
"input_thresh": -32.2,
"ebur128_i": -22.1,
"ebur128_tp": -7.8
},
"department": {
"input_i": -22.22,
"input_tp": -6.4,
"input_lra": 3.7,
"input_thresh": -32.22,
"ebur128_i": -22.3,
"ebur128_tp": -6.4
},
"mall": {
"input_i": -22.65,
"input_tp": -2.33,
"input_lra": 1.4,
"input_thresh": -32.65,
"ebur128_i": -22.6,
"ebur128_tp": -2.3
},
"market": {
"input_i": -26.51,
"input_tp": -1.12,
"input_lra": 7.1,
"input_thresh": -36.53,
"ebur128_i": -27.3,
"ebur128_tp": -1.1
},
"rain": {
"input_i": -38.69,
"input_tp": -19.77,
"input_lra": 10.1,
"input_thresh": -48.69,
"ebur128_i": -40.1,
"ebur128_tp": -19.8
},
"street": {
"input_i": -30.54,
"input_tp": -8.02,
"input_lra": 3.9,
"input_thresh": -40.54,
"ebur128_i": -30.3,
"ebur128_tp": -8.0
},
"subway": {
"input_i": -24.14,
"input_tp": -7.42,
"input_lra": 4.8,
"input_thresh": -34.14,
"ebur128_i": -23.7,
"ebur128_tp": -7.4
},
"theater": {
"input_i": -22.66,
"input_tp": -6.1,
"input_lra": 1.0,
"input_thresh": -32.66,
"ebur128_i": -22.6,
"ebur128_tp": -6.1
}
}
}
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='cafe') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='department') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='mall') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='market') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='rain') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='street') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='subway') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='theater') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) ... FAIL
test_manifest_records_complete_passes_and_independent_final_metrics (test_loudness_audio.FinalLoudness.test_manifest_records_complete_passes_and_independent_final_metrics) ... ERROR
======================================================================
ERROR: test_manifest_records_complete_passes_and_independent_final_metrics (test_loudness_audio.FinalLoudness.test_manifest_records_complete_passes_and_independent_final_metrics)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 50, in test_manifest_records_complete_passes_and_independent_final_metrics
self.assertEqual(manifest["normalization"]["targetIntegratedLUFS"], TARGET)
~~~~~~~~^^^^^^^^^^^^^^^^^
KeyError: 'normalization'
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='cafe')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 42, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["input_i"] - TARGET), 0.2)
AssertionError: 9.8 not less than or equal to 0.2
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='department')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 42, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["input_i"] - TARGET), 0.2)
AssertionError: 9.780000000000001 not less than or equal to 0.2
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='mall')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 42, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["input_i"] - TARGET), 0.2)
AssertionError: 9.350000000000001 not less than or equal to 0.2
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='market')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 42, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["input_i"] - TARGET), 0.2)
AssertionError: 5.489999999999998 not less than or equal to 0.2
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='rain')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 42, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["input_i"] - TARGET), 0.2)
AssertionError: 6.689999999999998 not less than or equal to 0.2
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='street')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 42, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["input_i"] - TARGET), 0.2)
AssertionError: 1.4600000000000009 not less than or equal to 0.2
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='subway')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 42, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["input_i"] - TARGET), 0.2)
AssertionError: 7.859999999999999 not less than or equal to 0.2
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='theater')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 42, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["input_i"] - TARGET), 0.2)
AssertionError: 9.34 not less than or equal to 0.2
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 46, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(spread, 0.4 + 1e-9)
AssertionError: 16.49 not less than or equal to 0.40000000100000005
----------------------------------------------------------------------
Ran 2 tests in 2.827s
FAILED (failures=9, errors=1)
@@ -0,0 +1,51 @@
test_real_loudness_measurement_failure_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_real_loudness_measurement_failure_preserves_prior_directory)
최종 실측 FFmpeg만 실패시켜 원자 교환 전 실패 전파를 확인한다. ... FAIL
test_actual_target_or_true_peak_violation_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_actual_target_or_true_peak_violation_preserves_prior_directory)
manifest가 정상이라고 주장해도 별도 실측 위반은 공개하지 않는다. ...
test_actual_target_or_true_peak_violation_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_actual_target_or_true_peak_violation_preserves_prior_directory) (metric='input_i')
manifest가 정상이라고 주장해도 별도 실측 위반은 공개하지 않는다. ... FAIL
test_actual_target_or_true_peak_violation_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_actual_target_or_true_peak_violation_preserves_prior_directory) (metric='input_tp')
manifest가 정상이라고 주장해도 별도 실측 위반은 공개하지 않는다. ... FAIL
test_actual_target_or_true_peak_violation_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_actual_target_or_true_peak_violation_preserves_prior_directory) (metric='input_i')
manifest가 정상이라고 주장해도 별도 실측 위반은 공개하지 않는다. ... FAIL
======================================================================
FAIL: test_real_loudness_measurement_failure_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_real_loudness_measurement_failure_preserves_prior_directory)
최종 실측 FFmpeg만 실패시켜 원자 교환 전 실패 전파를 확인한다.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_ambience_audio.py", line 299, in test_real_loudness_measurement_failure_preserves_prior_directory
with self.assertRaises(subprocess.CalledProcessError): self.run_generate()
AssertionError: CalledProcessError not raised
======================================================================
FAIL: test_actual_target_or_true_peak_violation_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_actual_target_or_true_peak_violation_preserves_prior_directory) (metric='input_i')
manifest가 정상이라고 주장해도 별도 실측 위반은 공개하지 않는다.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_ambience_audio.py", line 313, in test_actual_target_or_true_peak_violation_preserves_prior_directory
with self.assertRaises(ValueError): self.run_generate()
AssertionError: ValueError not raised
======================================================================
FAIL: test_actual_target_or_true_peak_violation_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_actual_target_or_true_peak_violation_preserves_prior_directory) (metric='input_tp')
manifest가 정상이라고 주장해도 별도 실측 위반은 공개하지 않는다.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_ambience_audio.py", line 313, in test_actual_target_or_true_peak_violation_preserves_prior_directory
with self.assertRaises(ValueError): self.run_generate()
AssertionError: ValueError not raised
======================================================================
FAIL: test_actual_target_or_true_peak_violation_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_actual_target_or_true_peak_violation_preserves_prior_directory) (metric='input_i')
manifest가 정상이라고 주장해도 별도 실측 위반은 공개하지 않는다.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_ambience_audio.py", line 313, in test_actual_target_or_true_peak_violation_preserves_prior_directory
with self.assertRaises(ValueError): self.run_generate()
AssertionError: ValueError not raised
----------------------------------------------------------------------
Ran 2 tests in 1.325s
FAILED (failures=4)
File diff suppressed because one or more lines are too long
+4
View File
@@ -0,0 +1,4 @@
{
"files": 8,
"bytes": 4608352
}
@@ -0,0 +1,52 @@
test_convert_format_fade_normalization_and_reproducibility (test_ambience_audio.AmbienceConversion.test_convert_format_fade_normalization_and_reproducibility)
스테레오 48kHz 입력을 실제로 내려 섞고 길이·양끝·안전 피크를 확인한다. ... ERROR
test_short_input_seek_retries_full_decode_without_padding_or_truncating (test_ambience_audio.AmbienceConversion.test_short_input_seek_retries_full_decode_without_padding_or_truncating) ... ERROR
test_silence_fails_before_publishing (test_ambience_audio.AmbienceConversion.test_silence_fails_before_publishing)
무음을 정상 현장 녹음으로 포장하지 않는다. ... ok
test_actual_target_or_true_peak_violation_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_actual_target_or_true_peak_violation_preserves_prior_directory)
manifest가 정상이라고 주장해도 별도 실측 위반은 공개하지 않는다. ... ok
test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) ... ok
test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem (test_ambience_audio.AtomicPublication.test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem) ... ok
test_conversion_cannot_override_approved_segment (test_ambience_audio.AtomicPublication.test_conversion_cannot_override_approved_segment) ... ok
test_conversion_failure_and_keyboard_interrupt_preserve_prior_directory (test_ambience_audio.AtomicPublication.test_conversion_failure_and_keyboard_interrupt_preserve_prior_directory) ... ok
test_exchange_failure_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_exchange_failure_preserves_prior_directory) ... ok
test_first_publication_and_real_exchange (test_ambience_audio.AtomicPublication.test_first_publication_and_real_exchange) ... ok
test_manifest_and_notice_write_failures_preserve_prior_directory (test_ambience_audio.AtomicPublication.test_manifest_and_notice_write_failures_preserve_prior_directory) ... ok
test_plan_alone_controls_selection_and_is_preserved_in_manifest_and_notice (test_ambience_audio.AtomicPublication.test_plan_alone_controls_selection_and_is_preserved_in_manifest_and_notice) ... ok
test_readers_observe_whole_directory_during_real_exchange (test_ambience_audio.AtomicPublication.test_readers_observe_whole_directory_during_real_exchange) ... ok
test_real_loudness_measurement_failure_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_real_loudness_measurement_failure_preserves_prior_directory)
최종 실측 FFmpeg만 실패시켜 원자 교환 전 실패 전파를 확인한다. ... ok
test_sigterm_before_commit_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_sigterm_before_commit_preserves_prior_directory) ... ok
test_staged_manifest_notice_and_inventory_tampering_are_rejected (test_ambience_audio.AtomicPublication.test_staged_manifest_notice_and_inventory_tampering_are_rejected) ... ok
test_symlink_output_is_rejected_before_conversion (test_ambience_audio.AtomicPublication.test_symlink_output_is_rejected_before_conversion) ... ok
test_unsupported_atomic_exchange_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_unsupported_atomic_exchange_preserves_prior_directory) ... ok
test_all_sources_checked_before_first_conversion (test_ambience_audio.SourceGuard.test_all_sources_checked_before_first_conversion) ... ok
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) ... ok
======================================================================
ERROR: test_convert_format_fade_normalization_and_reproducibility (test_ambience_audio.AmbienceConversion.test_convert_format_fade_normalization_and_reproducibility)
스테레오 48kHz 입력을 실제로 내려 섞고 길이·양끝·안전 피크를 확인한다.
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_ambience_audio.py", line 25, in test_convert_format_fade_normalization_and_reproducibility
first = audio.convert(source, target, 1, 12)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/worktrees/find-word-v0.2.5/scripts/ambience_audio.py", line 144, in convert
raise ValueError("loudnorm 선형 정규화 불가; 원본 다이내믹 보존을 위해 공개 중단")
ValueError: loudnorm 선형 정규화 불가; 원본 다이내믹 보존을 위해 공개 중단
======================================================================
ERROR: test_short_input_seek_retries_full_decode_without_padding_or_truncating (test_ambience_audio.AmbienceConversion.test_short_input_seek_retries_full_decode_without_padding_or_truncating)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_ambience_audio.py", line 59, in test_short_input_seek_retries_full_decode_without_padding_or_truncating
expected = audio.convert(source, target, 1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/worktrees/find-word-v0.2.5/scripts/ambience_audio.py", line 144, in convert
raise ValueError("loudnorm 선형 정규화 불가; 원본 다이내믹 보존을 위해 공개 중단")
ValueError: loudnorm 선형 정규화 불가; 원본 다이내믹 보존을 위해 공개 중단
----------------------------------------------------------------------
Ran 20 tests in 31.412s
FAILED (errors=2)
@@ -0,0 +1,78 @@
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) ... {
"targetLUFS": -32.0,
"truePeakCeilingDBTP": -6.0,
"spreadLU": 0.01,
"files": {
"cafe": {
"input_i": -32.0,
"input_tp": -17.59,
"input_lra": 0.3,
"input_thresh": -42.0,
"ebur128_i": -31.9,
"ebur128_tp": -17.6
},
"department": {
"input_i": -32.0,
"input_tp": -16.18,
"input_lra": 3.7,
"input_thresh": -42.0,
"ebur128_i": -32.1,
"ebur128_tp": -16.2
},
"mall": {
"input_i": -32.01,
"input_tp": -11.68,
"input_lra": 1.3,
"input_thresh": -42.01,
"ebur128_i": -32.0,
"ebur128_tp": -11.7
},
"market": {
"input_i": -32.01,
"input_tp": -6.62,
"input_lra": 7.1,
"input_thresh": -42.03,
"ebur128_i": -32.8,
"ebur128_tp": -6.6
},
"rain": {
"input_i": -32.01,
"input_tp": -13.09,
"input_lra": 10.1,
"input_thresh": -42.01,
"ebur128_i": -33.5,
"ebur128_tp": -13.1
},
"street": {
"input_i": -32.0,
"input_tp": -9.49,
"input_lra": 4.0,
"input_thresh": -42.0,
"ebur128_i": -31.8,
"ebur128_tp": -9.5
},
"subway": {
"input_i": -32.0,
"input_tp": -15.29,
"input_lra": 4.9,
"input_thresh": -42.0,
"ebur128_i": -31.5,
"ebur128_tp": -15.3
},
"theater": {
"input_i": -32.0,
"input_tp": -15.44,
"input_lra": 0.9,
"input_thresh": -42.0,
"ebur128_i": -31.9,
"ebur128_tp": -15.4
}
}
}
ok
test_manifest_records_complete_passes_and_independent_final_metrics (test_loudness_audio.FinalLoudness.test_manifest_records_complete_passes_and_independent_final_metrics) ... ok
----------------------------------------------------------------------
Ran 2 tests in 5.982s
OK
+40
View File
@@ -0,0 +1,40 @@
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
❯ tests/audio.test.ts (13 tests | 2 failed | 11 skipped) 5032ms
× 배경 PCM은 그대로 복사하고 voice/intro만 RMS .03을 유지한다 25ms
× 배경의 과도 peak·NaN·무음은 소스 시작 전 거부하고 다시 시도할 수 있다 5006ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 2 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/audio.test.ts > 배경 PCM은 그대로 복사하고 voice/intro만 RMS .03을 유지한다
AssertionError: expected 0.03000000000094529 to be greater than 0.1
❯ tests/audio.test.ts:329:59
327| await flush();
328| const energy = (data: Float32Array) => Math.sqrt(data.reduce((sum, x…
329| expect(energy(f.sources[0]!.buffer!.getChannelData(0))).toBeGreaterT…
| ^
330| expect(energy(f.sources[1]!.buffer!.getChannelData(0))).toBeCloseTo(…
331| expect(energy(f.sources[2]!.buffer!.getChannelData(0))).toBeCloseTo(…
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯
FAIL tests/audio.test.ts > 배경의 과도 peak·NaN·무음은 소스 시작 전 거부하고 다시 시도할 수 있다
Error: Test timed out in 5000ms.
If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".
❯ tests/audio.test.ts:337:1
335| });
336|
337| it("배경의 과도 peak·NaN·무음은 소스 시작 전 거부하고 다시 시도할 수 있다", async () => {
| ^
338| for (const sample of [0.9, NaN, 0]) {
339| const f = fixture();
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯
Test Files 1 failed (1)
Tests 2 failed | 11 skipped (13)
Start at 10:21:04
Duration 5.91s (tests 87%, environment 10%, setup 2%, transform 1%)
@@ -0,0 +1,9 @@
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
Test Files 3 passed (3)
Tests 20 passed (20)
Start at 10:22:14
Duration 5.55s (tests 69%, environment 22%, setup 6%, transform 3%, import 1%)
+4
View File
@@ -0,0 +1,4 @@
{
"files": 8,
"bytes": 4608352
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,25 @@
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
❯ tests/audio-integrity.test.ts (0 test)
⎯⎯⎯⎯⎯⎯ Failed Suites 1 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/audio-integrity.test.ts [ tests/audio-integrity.test.ts ]
Error: Cannot find module '../src/audio/integrity' imported from /home/hermes/worktrees/find-word-v0.2.5/tests/audio-integrity.test.ts
❯ tests/audio-integrity.test.ts:4:1
2| import { readFileSync } from "node:fs";
3| import { expect, it } from "vitest";
4| import { verifyAudioAsset } from "../src/audio/integrity";
| ^
5|
6| // 신뢰 기준은 JS 번들에 고정한 manifest다. 요청 파일이 자기 해시를 선언할 수 없다.
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯
Test Files 1 failed (1)
Tests no tests
Start at 10:23:35
Duration 268ms (setup 89%, transform 7%, worker 4%)
@@ -0,0 +1,9 @@
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
Test Files 4 passed (4)
Tests 22 passed (22)
Start at 10:24:21
Duration 5.77s (tests 75%, environment 15%, setup 6%, transform 3%, import 1%)
+9
View File
@@ -0,0 +1,9 @@
src/audio/assets.ts 70ms (unchanged)
src/audio/dsp.ts 39ms
src/audio/engine.ts 66ms
src/audio/integrity.ts 13ms
tests/mixing-loudness.test.ts 28ms
tests/audio-integrity.test.ts 8ms
tests/audio.test.ts 63ms
tests/dsp.test.ts 13ms
tests/browser/gains.spec.ts 33ms
@@ -0,0 +1,7 @@
> find-word@0.2.5 lint
> eslint . && tsc --noEmit
tests/browser/gains.spec.ts(36,35): error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.
tests/browser/gains.spec.ts(36,62): error TS2554: Expected 2-3 arguments, but got 4.
tests/browser/gains.spec.ts(37,17): error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation.
@@ -0,0 +1,10 @@
test_convert_format_fade_normalization_and_reproducibility (test_ambience_audio.AmbienceConversion.test_convert_format_fade_normalization_and_reproducibility)
스테레오 48kHz 입력을 실제로 내려 섞고 길이·양끝·안전 피크를 확인한다. ... ok
test_short_input_seek_retries_full_decode_without_padding_or_truncating (test_ambience_audio.AmbienceConversion.test_short_input_seek_retries_full_decode_without_padding_or_truncating) ... ok
test_silence_fails_before_publishing (test_ambience_audio.AmbienceConversion.test_silence_fails_before_publishing)
무음을 정상 현장 녹음으로 포장하지 않는다. ... ok
----------------------------------------------------------------------
Ran 3 tests in 5.789s
OK
@@ -0,0 +1,33 @@
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
❯ tests/App.test.tsx (23 tests | 1 failed | 22 skipped) 802ms
❯ 시작부터 결과까지 사용자 흐름 (13)
× 다섯 난이도의 SNR과 음성·배경 크기 관계를 설명하고 결과에도 표시한다 799ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/App.test.tsx > 시작부터 결과까지 사용자 흐름 > 다섯 난이도의 SNR과 음성·배경 크기 관계를 설명하고 결과에도 표시한다
FAIL tests/App.test.tsx > 시작부터 결과까지 사용자 흐름 > 다섯 난이도의 SNR과 음성·배경 크기 관계를 설명하고 결과에도 표시한다
FAIL tests/App.test.tsx > 시작부터 결과까지 사용자 흐름 > 다섯 난이도의 SNR과 음성·배경 크기 관계를 설명하고 결과에도 표시한다
Error: expect(received).toBeInTheDocument()
received value must be an HTMLElement or an SVGElement.
Received has type: Null
Received has value: null
❯ tests/App.test.tsx:128:10
126| expect
127| .soft(screen.queryByText(description, { exact: false }))
128| .toBeInTheDocument();
| ^
129| await f.user.click(
130| screen.getByRole("button", {
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/3]⎯
Test Files 1 failed (1)
Tests 1 failed | 22 skipped (23)
Start at 10:26:10
Duration 2.03s (tests 43%, environment 37%, transform 11%, setup 6%, import 4%)
+4
View File
@@ -0,0 +1,4 @@
src/App.tsx 219ms
src/content.ts 29ms (unchanged)
tests/ambience.test.ts 68ms
tests/browser/gains.spec.ts 32ms
@@ -0,0 +1,15 @@
> find-word@0.2.5 build
> tsc --noEmit && vite build && node scripts/check-build.mjs
vite v8.3.4 building client environment for production...
transforming...
✓ 24 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html 1.31 kB │ gzip: 0.91 kB
dist/assets/index-CgXbHuMU.css 16.11 kB │ gzip: 4.53 kB
dist/assets/index-UAH83Dwf.js 296.33 kB │ gzip: 92.20 kB
✓ built in 186ms
빌드 음성 자산 101개 + 현장음 8개 및 런타임/현장음 notice 확인
+9
View File
@@ -0,0 +1,9 @@
{"environmentId": "street", "sha256": "1e12ed82c07550e22905b912a8f862ce10dfe884b5d36a928f7a04628665529d", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "mall", "sha256": "c1100129d5e05b5fa7a7545b44ebe5cff455576543a27f3c7cbb937fde6a7c69", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "theater", "sha256": "1fa8c57ce39013ff6bc4c0c4e8aff42f295781d27ba763b2990efe4727b4bd27", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "department", "sha256": "101683ffb99c666a36b42b92661fdc404f1e2eb114f52ad03dc971734fcab375", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "market", "sha256": "b85044f3f0a9717f8bc86152ccacaf9752d63f156e9044a6ab955b33caeebad8", "language": "nn", "languageProbability": 0.09586193412542343, "segments": [{"id": 1, "seek": 0, "start": 10.45, "end": 12.45, "text": " Let's go, let's go, let's go!", "tokens": [50364, 961, 311, 352, 11, 718, 311, 352, 11, 718, 311, 352, 0, 50464], "avg_logprob": -0.744892938931783, "compression_ratio": 1.3181818181818181, "no_speech_prob": 0.429909884929657, "words": null, "temperature": 0.0}], "text": " Let's go, let's go, let's go!"}
{"environmentId": "subway", "sha256": "c613d36d303194a2768da0a93156b2e5a4073460fe899bb2f42ba330521443fd", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "cafe", "sha256": "6a86d722d23c47d6f3512cf364de18287335b050ad72e639f9a83ba40b669016", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "rain", "sha256": "06d59315d23343fab9c5bd8fbbec044f797d7384480b7f70454b11b1676355ae", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
Required changed excerpts produced ASR segments; screening criterion failed.
@@ -0,0 +1,98 @@
> find-word@0.2.5 test:browser
> playwright test --output=.agent/evidence-v0.2.5/browser-initial --reporter=line,json
[WebServer] (node:1540298) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)
Running 34 tests using 2 workers
(node:1540320) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
(node:1540321) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[1/34] [desktop] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
[2/34] [desktop] › tests/browser/gains.spec.ts:74:1 › 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다
1) [desktop] › tests/browser/gains.spec.ts:74:1 › 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다 ──────
Error: expect(received).toBeCloseTo(expected, precision)
Expected: 0.4198884518664126
Received: 1
Expected precision: 6
Expected difference: < 0.0000005
Received difference: 0.5801115481335875
117 | expect(background!.duration).toBe(12);
118 | expect(background!.scheduled).toBe(FIXED_HEADROOM_GAIN);
> 119 | expect(background!.observed).toBeCloseTo(FIXED_HEADROOM_GAIN, 6);
| ^
120 | expect(voice!.scheduled / background!.scheduled).toBeCloseTo(
121 | 10 ** (db / 20),
122 | 10,
at /home/hermes/worktrees/find-word-v0.2.5/tests/browser/gains.spec.ts:119:36
Error Context: .agent/evidence-v0.2.5/browser-initial/gains-실제-GainNode의-배경-배율은-8환경-×-SNR-경계·0에서-동일하다-desktop/error-context.md
attachment #2: trace (application/zip) ─────────────────────────────────────────────────────────
.agent/evidence-v0.2.5/browser-initial/gains-실제-GainNode의-배경-배율은-8환경-×-SNR-경계·0에서-동일하다-desktop/trace.zip
Usage:
npx playwright show-trace .agent/evidence-v0.2.5/browser-initial/gains-실제-GainNode의-배경-배율은-8환경-×-SNR-경계·0에서-동일하다-desktop/trace.zip
────────────────────────────────────────────────────────────────────────────────────────────────
(node:1540578) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[3/34] [desktop] › tests/browser/gains.spec.ts:169:1 › 실제 WAV 변조는 소스 시작 전에 거부하고 원본 재시도로 회복한다
[4/34] [desktop] › tests/browser/game.spec.ts:8:1 › 실제 오디오로 혼합 모드 완주·레이아웃·접근성·외부 요청 없음
[5/34] [desktop] › tests/browser/game.spec.ts:130:3 › intro WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[6/34] [desktop] › tests/browser/game.spec.ts:130:3 › target WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[7/34] [desktop] › tests/browser/release.spec.ts:6:1 › 릴리스는 사용자 크레딧과 런타임 MIT notice 전문을 제공한다
[8/34] [desktop] › tests/browser/release.spec.ts:24:1 › 누락 음성·환경음은 query와 HTML accept에도 404이고 출처 고지는 번들된다
[9/34] [desktop] › tests/browser/review-fixes.spec.ts:27:1 › 리뷰: 한국어 모드·결과 어절은 320px와 360px에서도 갈라지거나 넘치지 않는다
[10/34] [desktop] › tests/browser/review-fixes.spec.ts:62:1 › 리뷰: 실제 진행 막대는 현재 문항의 1/3·2/3·3/3을 채운다
[11/34] [desktop] › tests/browser/rounds.spec.ts:35:1 › 시작 단계·SNR·3문항 완료→다음 단계·재생 중 종료·응답 후 종료·홈 초기화
[12/34] [desktop] › tests/browser/rounds.spec.ts:135:1 › 여덟 환경의 실제 WAV를 각각 디코드하고 루프 재생한 뒤 즉시 정지한다
[13/34] [desktop] › tests/browser/rounds.spec.ts:178:1 › 환경음 404는 한국어 오류와 재시도 후 정상 답변으로 복구한다
[14/34] [desktop] › tests/browser/ui.spec.ts:4:1 › 전체 음량은 설정 흐름 안에 들어가며 키보드로 조절된다
[15/34] [desktop] › tests/browser/ui.spec.ts:52:1 › 난이도 설명은 모바일에서도 보인다
[16/34] [desktop] › tests/browser/ui.spec.ts:68:1 › 한국어 제목은 단어 중간에서 줄바꿈하지 않는다
[17/34] [desktop] › tests/browser/ui.spec.ts:121:1 › 시작 단계와 SNR 설정은 카드 안에 들어가고 터치 영역을 확보한다
(node:1541947) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[18/34] [mobile] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
(node:1542476) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[19/34] [mobile] › tests/browser/gains.spec.ts:74:1 › 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다
[20/34] [mobile] › tests/browser/gains.spec.ts:169:1 › 실제 WAV 변조는 소스 시작 전에 거부하고 원본 재시도로 회복한다
[21/34] [mobile] › tests/browser/game.spec.ts:8:1 › 실제 오디오로 혼합 모드 완주·레이아웃·접근성·외부 요청 없음
[22/34] [mobile] › tests/browser/game.spec.ts:130:3 › intro WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[23/34] [mobile] › tests/browser/game.spec.ts:130:3 › target WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[24/34] [mobile] › tests/browser/release.spec.ts:6:1 › 릴리스는 사용자 크레딧과 런타임 MIT notice 전문을 제공한다
[25/34] [mobile] › tests/browser/release.spec.ts:24:1 › 누락 음성·환경음은 query와 HTML accept에도 404이고 출처 고지는 번들된다
[26/34] [mobile] › tests/browser/review-fixes.spec.ts:27:1 › 리뷰: 한국어 모드·결과 어절은 320px와 360px에서도 갈라지거나 넘치지 않는다
[27/34] [mobile] › tests/browser/review-fixes.spec.ts:62:1 › 리뷰: 실제 진행 막대는 현재 문항의 1/3·2/3·3/3을 채운다
[28/34] [mobile] › tests/browser/rounds.spec.ts:35:1 › 시작 단계·SNR·3문항 완료→다음 단계·재생 중 종료·응답 후 종료·홈 초기화
[29/34] [mobile] › tests/browser/rounds.spec.ts:135:1 › 여덟 환경의 실제 WAV를 각각 디코드하고 루프 재생한 뒤 즉시 정지한다
[30/34] [mobile] › tests/browser/rounds.spec.ts:178:1 › 환경음 404는 한국어 오류와 재시도 후 정상 답변으로 복구한다
[31/34] [mobile] › tests/browser/ui.spec.ts:4:1 › 전체 음량은 설정 흐름 안에 들어가며 키보드로 조절된다
[32/34] [mobile] › tests/browser/ui.spec.ts:52:1 › 난이도 설명은 모바일에서도 보인다
[33/34] [mobile] › tests/browser/ui.spec.ts:68:1 › 한국어 제목은 단어 중간에서 줄바꿈하지 않는다
[34/34] [mobile] › tests/browser/ui.spec.ts:121:1 › 시작 단계와 SNR 설정은 카드 안에 들어가고 터치 영역을 확보한다
1 failed
[desktop] › tests/browser/gains.spec.ts:74:1 › 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다 ───────
33 passed (4.3m)
@@ -0,0 +1,34 @@
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
❯ tests/build.test.ts (35 tests | 5 failed | 30 skipped) 3352ms
× 현장음 manifest 사본을 함께 바꿔도 승인 targetIntegratedLUFS 계약 위반을 거부한다 661ms
× 현장음 manifest 사본을 함께 바꿔도 승인 truePeakCeilingDBTP 계약 위반을 거부한다 626ms
× 현장음 manifest 사본을 함께 바꿔도 승인 finalLoudness 계약 위반을 거부한다 703ms
× 현장음 manifest 사본을 함께 바꿔도 승인 pass2Filter 계약 위반을 거부한다 813ms
× 현장음 manifest 사본을 함께 바꿔도 승인 version 계약 위반을 거부한다 547ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 5 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/build.test.ts > 현장음 manifest 사본을 함께 바꿔도 승인 targetIntegratedLUFS 계약 위반을 거부한다
FAIL tests/build.test.ts > 현장음 manifest 사본을 함께 바꿔도 승인 truePeakCeilingDBTP 계약 위반을 거부한다
FAIL tests/build.test.ts > 현장음 manifest 사본을 함께 바꿔도 승인 finalLoudness 계약 위반을 거부한다
FAIL tests/build.test.ts > 현장음 manifest 사본을 함께 바꿔도 승인 pass2Filter 계약 위반을 거부한다
FAIL tests/build.test.ts > 현장음 manifest 사본을 함께 바꿔도 승인 version 계약 위반을 거부한다
AssertionError: expected [Function verify] to throw an error
❯ tests/build.test.ts:327:22
325| JSON.stringify(manifest),
326| );
327| expect(verify).toThrow();
| ^
328| } finally {
329| rmSync(temporary, { recursive: true, force: true });
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/5]⎯
Test Files 1 failed (1)
Tests 5 failed | 30 skipped (35)
Start at 10:30:43
Duration 3.84s (tests 93%, setup 4%, transform 3%)
+2
View File
@@ -0,0 +1,2 @@
scripts/check-build.mjs 278ms
tests/build.test.ts 255ms
@@ -0,0 +1,9 @@
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
Test Files 4 passed (4)
Tests 69 passed (69)
Start at 10:31:32
Duration 42.50s (tests 93%, environment 3%, setup 2%, transform 1%)
@@ -0,0 +1 @@
PASS: all eight source hashes verified, two independent generations and published WAVs/pass metrics/notices match.
@@ -0,0 +1,55 @@
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
[
{
"file": "cafe.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.01087210480748187
},
{
"file": "department.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.010889483784877002
},
{
"file": "mall.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.01144242842378468
},
{
"file": "market.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.009606899802162226
},
{
"file": "rain.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.01031321695987317
},
{
"file": "street.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.02838867853757971
},
{
"file": "subway.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.013582375978916386
},
{
"file": "theater.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.011467003332480628
}
]
{"combinations":20200,"maximum":0.6459797899491659,"voicePeak":0.2052977830171585,"backgroundPeak":0.45123291015625,"introPeak":0.14995422959327698,"bounds":{"background":0.55,"voice":0.25,"intro":0.2},"fixedGain":0.4198884518664126,"backgroundGains":[0.4198884518664126]}
✓ tests/mixing-loudness.test.ts > 같은 +6dB에서 여덟 배경의 gain은 파일 피크와 무관하다 368ms
✓ tests/mixing-loudness.test.ts > 101 voice × 8 배경 × 모든 SNR 눈금은 동일 배경 gain과 안전 피크를 가진다 4490ms
✓ tests/mixing-loudness.test.ts > SNR과 모든 경로의 peak 상한 위반은 fail closed한다 3ms
Test Files 1 passed (1)
Tests 3 passed (3)
Start at 10:32:41
Duration 5.14s (tests 97%, setup 2%, transform 1%)
+2
View File
@@ -0,0 +1,2 @@
tests/ambience.test.ts 211ms
tests/browser/resampling.spec.ts 33ms
+4
View File
@@ -0,0 +1,4 @@
> find-word@0.2.5 lint
> eslint . && tsc --noEmit
+529
View File
@@ -0,0 +1,529 @@
test_convert_format_fade_normalization_and_reproducibility (test_ambience_audio.AmbienceConversion.test_convert_format_fade_normalization_and_reproducibility)
스테레오 48kHz 입력을 실제로 내려 섞고 길이·양끝·안전 피크를 확인한다. ... ok
test_short_input_seek_retries_full_decode_without_padding_or_truncating (test_ambience_audio.AmbienceConversion.test_short_input_seek_retries_full_decode_without_padding_or_truncating) ... ok
test_silence_fails_before_publishing (test_ambience_audio.AmbienceConversion.test_silence_fails_before_publishing)
무음을 정상 현장 녹음으로 포장하지 않는다. ... ok
test_actual_target_or_true_peak_violation_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_actual_target_or_true_peak_violation_preserves_prior_directory)
manifest가 정상이라고 주장해도 별도 실측 위반은 공개하지 않는다. ... ok
test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) ... ok
test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem (test_ambience_audio.AtomicPublication.test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem) ... ok
test_conversion_cannot_override_approved_segment (test_ambience_audio.AtomicPublication.test_conversion_cannot_override_approved_segment) ... ok
test_conversion_failure_and_keyboard_interrupt_preserve_prior_directory (test_ambience_audio.AtomicPublication.test_conversion_failure_and_keyboard_interrupt_preserve_prior_directory) ... ok
test_exchange_failure_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_exchange_failure_preserves_prior_directory) ... ok
test_first_publication_and_real_exchange (test_ambience_audio.AtomicPublication.test_first_publication_and_real_exchange) ... ok
test_manifest_and_notice_write_failures_preserve_prior_directory (test_ambience_audio.AtomicPublication.test_manifest_and_notice_write_failures_preserve_prior_directory) ... ok
test_plan_alone_controls_selection_and_is_preserved_in_manifest_and_notice (test_ambience_audio.AtomicPublication.test_plan_alone_controls_selection_and_is_preserved_in_manifest_and_notice) ... ok
test_readers_observe_whole_directory_during_real_exchange (test_ambience_audio.AtomicPublication.test_readers_observe_whole_directory_during_real_exchange) ... ok
test_real_loudness_measurement_failure_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_real_loudness_measurement_failure_preserves_prior_directory)
최종 실측 FFmpeg만 실패시켜 원자 교환 전 실패 전파를 확인한다. ... ok
test_sigterm_before_commit_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_sigterm_before_commit_preserves_prior_directory) ... ok
test_staged_manifest_notice_and_inventory_tampering_are_rejected (test_ambience_audio.AtomicPublication.test_staged_manifest_notice_and_inventory_tampering_are_rejected) ... ok
test_symlink_output_is_rejected_before_conversion (test_ambience_audio.AtomicPublication.test_symlink_output_is_rejected_before_conversion) ... ok
test_unsupported_atomic_exchange_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_unsupported_atomic_exchange_preserves_prior_directory) ... ok
test_all_sources_checked_before_first_conversion (test_ambience_audio.SourceGuard.test_all_sources_checked_before_first_conversion) ... ok
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) ... ok
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) ... {
"targetLUFS": -32.0,
"truePeakCeilingDBTP": -6.0,
"spreadLU": 0.01,
"files": {
"cafe": {
"input_i": -32.0,
"input_tp": -17.59,
"input_lra": 0.3,
"input_thresh": -42.0,
"ebur128_i": -31.9,
"ebur128_tp": -17.6
},
"department": {
"input_i": -32.0,
"input_tp": -16.18,
"input_lra": 3.7,
"input_thresh": -42.0,
"ebur128_i": -32.1,
"ebur128_tp": -16.2
},
"mall": {
"input_i": -32.01,
"input_tp": -11.68,
"input_lra": 1.3,
"input_thresh": -42.01,
"ebur128_i": -32.0,
"ebur128_tp": -11.7
},
"market": {
"input_i": -32.01,
"input_tp": -6.62,
"input_lra": 7.1,
"input_thresh": -42.03,
"ebur128_i": -32.8,
"ebur128_tp": -6.6
},
"rain": {
"input_i": -32.01,
"input_tp": -13.09,
"input_lra": 10.1,
"input_thresh": -42.01,
"ebur128_i": -33.5,
"ebur128_tp": -13.1
},
"street": {
"input_i": -32.0,
"input_tp": -9.49,
"input_lra": 4.0,
"input_thresh": -42.0,
"ebur128_i": -31.8,
"ebur128_tp": -9.5
},
"subway": {
"input_i": -32.0,
"input_tp": -15.29,
"input_lra": 4.9,
"input_thresh": -42.0,
"ebur128_i": -31.5,
"ebur128_tp": -15.3
},
"theater": {
"input_i": -32.0,
"input_tp": -15.44,
"input_lra": 0.9,
"input_thresh": -42.0,
"ebur128_i": -31.9,
"ebur128_tp": -15.4
}
}
}
ok
test_manifest_records_complete_passes_and_independent_final_metrics (test_loudness_audio.FinalLoudness.test_manifest_records_complete_passes_and_independent_final_metrics) ... ok
test_all_101_are_validated_before_single_atomic_publication (test_neural_audio.GeneratorContract.test_all_101_are_validated_before_single_atomic_publication) ... [001/101] intro.wav 1.000s
[002/101] target-0.wav 1.000s
[003/101] target-1.wav 1.000s
[004/101] target-2.wav 1.000s
[005/101] target-3.wav 1.000s
[006/101] target-4.wav 1.000s
[007/101] target-5.wav 1.000s
[008/101] target-6.wav 1.000s
[009/101] target-7.wav 1.000s
[010/101] target-8.wav 1.000s
[011/101] target-9.wav 1.000s
[012/101] target-10.wav 1.000s
[013/101] target-11.wav 1.000s
[014/101] target-12.wav 1.000s
[015/101] target-13.wav 1.000s
[016/101] target-14.wav 1.000s
[017/101] target-15.wav 1.000s
[018/101] target-16.wav 1.000s
[019/101] target-17.wav 1.000s
[020/101] target-18.wav 1.000s
[021/101] target-19.wav 1.000s
[022/101] target-20.wav 1.000s
[023/101] target-21.wav 1.000s
[024/101] target-22.wav 1.000s
[025/101] target-23.wav 1.000s
[026/101] target-24.wav 1.000s
[027/101] target-25.wav 1.000s
[028/101] target-26.wav 1.000s
[029/101] target-27.wav 1.000s
[030/101] target-28.wav 1.000s
[031/101] target-29.wav 1.000s
[032/101] target-30.wav 1.000s
[033/101] target-31.wav 1.000s
[034/101] target-32.wav 1.000s
[035/101] target-33.wav 1.000s
[036/101] target-34.wav 1.000s
[037/101] target-35.wav 1.000s
[038/101] target-36.wav 1.000s
[039/101] target-37.wav 1.000s
[040/101] target-38.wav 1.000s
[041/101] target-39.wav 1.000s
[042/101] target-40.wav 1.000s
[043/101] target-41.wav 1.000s
[044/101] target-42.wav 1.000s
[045/101] target-43.wav 1.000s
[046/101] target-44.wav 1.000s
[047/101] target-45.wav 1.000s
[048/101] target-46.wav 1.000s
[049/101] target-47.wav 1.000s
[050/101] target-48.wav 1.000s
[051/101] target-49.wav 1.000s
[052/101] target-50.wav 1.000s
[053/101] target-51.wav 1.000s
[054/101] target-52.wav 1.000s
[055/101] target-53.wav 1.000s
[056/101] target-54.wav 1.000s
[057/101] target-55.wav 1.000s
[058/101] target-56.wav 1.000s
[059/101] target-57.wav 1.000s
[060/101] target-58.wav 1.000s
[061/101] target-59.wav 1.000s
[062/101] target-60.wav 1.000s
[063/101] target-61.wav 1.000s
[064/101] target-62.wav 1.000s
[065/101] target-63.wav 1.000s
[066/101] target-64.wav 1.000s
[067/101] target-65.wav 1.000s
[068/101] target-66.wav 1.000s
[069/101] target-67.wav 1.000s
[070/101] target-68.wav 1.000s
[071/101] target-69.wav 1.000s
[072/101] target-70.wav 1.000s
[073/101] target-71.wav 1.000s
[074/101] target-72.wav 1.000s
[075/101] target-73.wav 1.000s
[076/101] target-74.wav 1.000s
[077/101] target-75.wav 1.000s
[078/101] target-76.wav 1.000s
[079/101] target-77.wav 1.000s
[080/101] target-78.wav 1.000s
[081/101] target-79.wav 1.000s
[082/101] target-80.wav 1.000s
[083/101] target-81.wav 1.000s
[084/101] target-82.wav 1.000s
[085/101] target-83.wav 1.000s
[086/101] target-84.wav 1.000s
[087/101] target-85.wav 1.000s
[088/101] target-86.wav 1.000s
[089/101] target-87.wav 1.000s
[090/101] target-88.wav 1.000s
[091/101] target-89.wav 1.000s
[092/101] target-90.wav 1.000s
[093/101] target-91.wav 1.000s
[094/101] target-92.wav 1.000s
[095/101] target-93.wav 1.000s
[096/101] target-94.wav 1.000s
[097/101] target-95.wav 1.000s
[098/101] target-96.wav 1.000s
[099/101] target-97.wav 1.000s
[100/101] target-98.wav 1.000s
[101/101] target-99.wav 1.000s
ok
test_atomic_exchange_keeps_old_tree_at_staging_path (test_neural_audio.GeneratorContract.test_atomic_exchange_keeps_old_tree_at_staging_path) ... ok
test_atomic_first_publication (test_neural_audio.GeneratorContract.test_atomic_first_publication) ... ok
test_cli_import_has_no_generation_or_filesystem_side_effects (test_neural_audio.GeneratorContract.test_cli_import_has_no_generation_or_filesystem_side_effects) ... ok
test_edge_adapter_uses_pinned_python_prosody_timeout_and_no_shell (test_neural_audio.GeneratorContract.test_edge_adapter_uses_pinned_python_prosody_timeout_and_no_shell) ... ok
test_exhausted_provider_failure_preserves_existing_files_and_redacts_secrets (test_neural_audio.GeneratorContract.test_exhausted_provider_failure_preserves_existing_files_and_redacts_secrets) ... ok
test_ffmpeg_adapter_actually_decodes_mp3_to_normalized_pcm24 (test_neural_audio.GeneratorContract.test_ffmpeg_adapter_actually_decodes_mp3_to_normalized_pcm24) ... ok
test_ffmpeg_failure_is_not_retried_and_preserves_existing_files (test_neural_audio.GeneratorContract.test_ffmpeg_failure_is_not_retried_and_preserves_existing_files) ... ok
test_full_validation_detects_changed_earlier_file_before_publication (test_neural_audio.GeneratorContract.test_full_validation_detects_changed_earlier_file_before_publication) ... [001/101] intro.wav 1.000s
[002/101] target-0.wav 1.000s
[003/101] target-1.wav 1.000s
[004/101] target-2.wav 1.000s
[005/101] target-3.wav 1.000s
[006/101] target-4.wav 1.000s
[007/101] target-5.wav 1.000s
[008/101] target-6.wav 1.000s
[009/101] target-7.wav 1.000s
[010/101] target-8.wav 1.000s
[011/101] target-9.wav 1.000s
[012/101] target-10.wav 1.000s
[013/101] target-11.wav 1.000s
[014/101] target-12.wav 1.000s
[015/101] target-13.wav 1.000s
[016/101] target-14.wav 1.000s
[017/101] target-15.wav 1.000s
[018/101] target-16.wav 1.000s
[019/101] target-17.wav 1.000s
[020/101] target-18.wav 1.000s
[021/101] target-19.wav 1.000s
[022/101] target-20.wav 1.000s
[023/101] target-21.wav 1.000s
[024/101] target-22.wav 1.000s
[025/101] target-23.wav 1.000s
[026/101] target-24.wav 1.000s
[027/101] target-25.wav 1.000s
[028/101] target-26.wav 1.000s
[029/101] target-27.wav 1.000s
[030/101] target-28.wav 1.000s
[031/101] target-29.wav 1.000s
[032/101] target-30.wav 1.000s
[033/101] target-31.wav 1.000s
[034/101] target-32.wav 1.000s
[035/101] target-33.wav 1.000s
[036/101] target-34.wav 1.000s
[037/101] target-35.wav 1.000s
[038/101] target-36.wav 1.000s
[039/101] target-37.wav 1.000s
[040/101] target-38.wav 1.000s
[041/101] target-39.wav 1.000s
[042/101] target-40.wav 1.000s
[043/101] target-41.wav 1.000s
[044/101] target-42.wav 1.000s
[045/101] target-43.wav 1.000s
[046/101] target-44.wav 1.000s
[047/101] target-45.wav 1.000s
[048/101] target-46.wav 1.000s
[049/101] target-47.wav 1.000s
[050/101] target-48.wav 1.000s
[051/101] target-49.wav 1.000s
[052/101] target-50.wav 1.000s
[053/101] target-51.wav 1.000s
[054/101] target-52.wav 1.000s
[055/101] target-53.wav 1.000s
[056/101] target-54.wav 1.000s
[057/101] target-55.wav 1.000s
[058/101] target-56.wav 1.000s
[059/101] target-57.wav 1.000s
[060/101] target-58.wav 1.000s
[061/101] target-59.wav 1.000s
[062/101] target-60.wav 1.000s
[063/101] target-61.wav 1.000s
[064/101] target-62.wav 1.000s
[065/101] target-63.wav 1.000s
[066/101] target-64.wav 1.000s
[067/101] target-65.wav 1.000s
[068/101] target-66.wav 1.000s
[069/101] target-67.wav 1.000s
[070/101] target-68.wav 1.000s
[071/101] target-69.wav 1.000s
[072/101] target-70.wav 1.000s
[073/101] target-71.wav 1.000s
[074/101] target-72.wav 1.000s
[075/101] target-73.wav 1.000s
[076/101] target-74.wav 1.000s
[077/101] target-75.wav 1.000s
[078/101] target-76.wav 1.000s
[079/101] target-77.wav 1.000s
[080/101] target-78.wav 1.000s
[081/101] target-79.wav 1.000s
[082/101] target-80.wav 1.000s
[083/101] target-81.wav 1.000s
[084/101] target-82.wav 1.000s
[085/101] target-83.wav 1.000s
[086/101] target-84.wav 1.000s
[087/101] target-85.wav 1.000s
[088/101] target-86.wav 1.000s
[089/101] target-87.wav 1.000s
[090/101] target-88.wav 1.000s
[091/101] target-89.wav 1.000s
[092/101] target-90.wav 1.000s
[093/101] target-91.wav 1.000s
[094/101] target-92.wav 1.000s
[095/101] target-93.wav 1.000s
[096/101] target-94.wav 1.000s
[097/101] target-95.wav 1.000s
[098/101] target-96.wav 1.000s
[099/101] target-97.wav 1.000s
[100/101] target-98.wav 1.000s
[101/101] target-99.wav 1.000s
ok
test_interruption_preserves_existing_files_and_cleans_temporary_data (test_neural_audio.GeneratorContract.test_interruption_preserves_existing_files_and_cleans_temporary_data) ... ok
test_invalid_pcm_never_reaches_publication (test_neural_audio.GeneratorContract.test_invalid_pcm_never_reaches_publication) ... ok
test_publication_failure_preserves_existing_files (test_neural_audio.GeneratorContract.test_publication_failure_preserves_existing_files) ... [001/101] intro.wav 1.000s
[002/101] target-0.wav 1.000s
[003/101] target-1.wav 1.000s
[004/101] target-2.wav 1.000s
[005/101] target-3.wav 1.000s
[006/101] target-4.wav 1.000s
[007/101] target-5.wav 1.000s
[008/101] target-6.wav 1.000s
[009/101] target-7.wav 1.000s
[010/101] target-8.wav 1.000s
[011/101] target-9.wav 1.000s
[012/101] target-10.wav 1.000s
[013/101] target-11.wav 1.000s
[014/101] target-12.wav 1.000s
[015/101] target-13.wav 1.000s
[016/101] target-14.wav 1.000s
[017/101] target-15.wav 1.000s
[018/101] target-16.wav 1.000s
[019/101] target-17.wav 1.000s
[020/101] target-18.wav 1.000s
[021/101] target-19.wav 1.000s
[022/101] target-20.wav 1.000s
[023/101] target-21.wav 1.000s
[024/101] target-22.wav 1.000s
[025/101] target-23.wav 1.000s
[026/101] target-24.wav 1.000s
[027/101] target-25.wav 1.000s
[028/101] target-26.wav 1.000s
[029/101] target-27.wav 1.000s
[030/101] target-28.wav 1.000s
[031/101] target-29.wav 1.000s
[032/101] target-30.wav 1.000s
[033/101] target-31.wav 1.000s
[034/101] target-32.wav 1.000s
[035/101] target-33.wav 1.000s
[036/101] target-34.wav 1.000s
[037/101] target-35.wav 1.000s
[038/101] target-36.wav 1.000s
[039/101] target-37.wav 1.000s
[040/101] target-38.wav 1.000s
[041/101] target-39.wav 1.000s
[042/101] target-40.wav 1.000s
[043/101] target-41.wav 1.000s
[044/101] target-42.wav 1.000s
[045/101] target-43.wav 1.000s
[046/101] target-44.wav 1.000s
[047/101] target-45.wav 1.000s
[048/101] target-46.wav 1.000s
[049/101] target-47.wav 1.000s
[050/101] target-48.wav 1.000s
[051/101] target-49.wav 1.000s
[052/101] target-50.wav 1.000s
[053/101] target-51.wav 1.000s
[054/101] target-52.wav 1.000s
[055/101] target-53.wav 1.000s
[056/101] target-54.wav 1.000s
[057/101] target-55.wav 1.000s
[058/101] target-56.wav 1.000s
[059/101] target-57.wav 1.000s
[060/101] target-58.wav 1.000s
[061/101] target-59.wav 1.000s
[062/101] target-60.wav 1.000s
[063/101] target-61.wav 1.000s
[064/101] target-62.wav 1.000s
[065/101] target-63.wav 1.000s
[066/101] target-64.wav 1.000s
[067/101] target-65.wav 1.000s
[068/101] target-66.wav 1.000s
[069/101] target-67.wav 1.000s
[070/101] target-68.wav 1.000s
[071/101] target-69.wav 1.000s
[072/101] target-70.wav 1.000s
[073/101] target-71.wav 1.000s
[074/101] target-72.wav 1.000s
[075/101] target-73.wav 1.000s
[076/101] target-74.wav 1.000s
[077/101] target-75.wav 1.000s
[078/101] target-76.wav 1.000s
[079/101] target-77.wav 1.000s
[080/101] target-78.wav 1.000s
[081/101] target-79.wav 1.000s
[082/101] target-80.wav 1.000s
[083/101] target-81.wav 1.000s
[084/101] target-82.wav 1.000s
[085/101] target-83.wav 1.000s
[086/101] target-84.wav 1.000s
[087/101] target-85.wav 1.000s
[088/101] target-86.wav 1.000s
[089/101] target-87.wav 1.000s
[090/101] target-88.wav 1.000s
[091/101] target-89.wav 1.000s
[092/101] target-90.wav 1.000s
[093/101] target-91.wav 1.000s
[094/101] target-92.wav 1.000s
[095/101] target-93.wav 1.000s
[096/101] target-94.wav 1.000s
[097/101] target-95.wav 1.000s
[098/101] target-96.wav 1.000s
[099/101] target-97.wav 1.000s
[100/101] target-98.wav 1.000s
[101/101] target-99.wav 1.000s
ok
test_rejects_incomplete_or_duplicate_or_unsafe_inventory_before_requests (test_neural_audio.GeneratorContract.test_rejects_incomplete_or_duplicate_or_unsafe_inventory_before_requests) ... ok
test_timeout_is_bounded_and_preserves_existing_files (test_neural_audio.GeneratorContract.test_timeout_is_bounded_and_preserves_existing_files) ... intro.wav: provider 시도 1/3 실패
intro.wav: provider 시도 2/3 실패
intro.wav: provider 시도 3/3 실패
ok
test_transient_provider_failures_retry_cleanly_with_bounded_backoff (test_neural_audio.GeneratorContract.test_transient_provider_failures_retry_cleanly_with_bounded_backoff) ... intro.wav: provider 시도 1/3 실패
intro.wav: provider 시도 2/3 실패
[001/101] intro.wav 1.000s
[002/101] target-0.wav 1.000s
[003/101] target-1.wav 1.000s
[004/101] target-2.wav 1.000s
[005/101] target-3.wav 1.000s
[006/101] target-4.wav 1.000s
[007/101] target-5.wav 1.000s
[008/101] target-6.wav 1.000s
[009/101] target-7.wav 1.000s
[010/101] target-8.wav 1.000s
[011/101] target-9.wav 1.000s
[012/101] target-10.wav 1.000s
[013/101] target-11.wav 1.000s
[014/101] target-12.wav 1.000s
[015/101] target-13.wav 1.000s
[016/101] target-14.wav 1.000s
[017/101] target-15.wav 1.000s
[018/101] target-16.wav 1.000s
[019/101] target-17.wav 1.000s
[020/101] target-18.wav 1.000s
[021/101] target-19.wav 1.000s
[022/101] target-20.wav 1.000s
[023/101] target-21.wav 1.000s
[024/101] target-22.wav 1.000s
[025/101] target-23.wav 1.000s
[026/101] target-24.wav 1.000s
[027/101] target-25.wav 1.000s
[028/101] target-26.wav 1.000s
[029/101] target-27.wav 1.000s
[030/101] target-28.wav 1.000s
[031/101] target-29.wav 1.000s
[032/101] target-30.wav 1.000s
[033/101] target-31.wav 1.000s
[034/101] target-32.wav 1.000s
[035/101] target-33.wav 1.000s
[036/101] target-34.wav 1.000s
[037/101] target-35.wav 1.000s
[038/101] target-36.wav 1.000s
[039/101] target-37.wav 1.000s
[040/101] target-38.wav 1.000s
[041/101] target-39.wav 1.000s
[042/101] target-40.wav 1.000s
[043/101] target-41.wav 1.000s
[044/101] target-42.wav 1.000s
[045/101] target-43.wav 1.000s
[046/101] target-44.wav 1.000s
[047/101] target-45.wav 1.000s
[048/101] target-46.wav 1.000s
[049/101] target-47.wav 1.000s
[050/101] target-48.wav 1.000s
[051/101] target-49.wav 1.000s
[052/101] target-50.wav 1.000s
[053/101] target-51.wav 1.000s
[054/101] target-52.wav 1.000s
[055/101] target-53.wav 1.000s
[056/101] target-54.wav 1.000s
[057/101] target-55.wav 1.000s
[058/101] target-56.wav 1.000s
[059/101] target-57.wav 1.000s
[060/101] target-58.wav 1.000s
[061/101] target-59.wav 1.000s
[062/101] target-60.wav 1.000s
[063/101] target-61.wav 1.000s
[064/101] target-62.wav 1.000s
[065/101] target-63.wav 1.000s
[066/101] target-64.wav 1.000s
[067/101] target-65.wav 1.000s
[068/101] target-66.wav 1.000s
[069/101] target-67.wav 1.000s
[070/101] target-68.wav 1.000s
[071/101] target-69.wav 1.000s
[072/101] target-70.wav 1.000s
[073/101] target-71.wav 1.000s
[074/101] target-72.wav 1.000s
[075/101] target-73.wav 1.000s
[076/101] target-74.wav 1.000s
[077/101] target-75.wav 1.000s
[078/101] target-76.wav 1.000s
[079/101] target-77.wav 1.000s
[080/101] target-78.wav 1.000s
[081/101] target-79.wav 1.000s
[082/101] target-80.wav 1.000s
[083/101] target-81.wav 1.000s
[084/101] target-82.wav 1.000s
[085/101] target-83.wav 1.000s
[086/101] target-84.wav 1.000s
[087/101] target-85.wav 1.000s
[088/101] target-86.wav 1.000s
[089/101] target-87.wav 1.000s
[090/101] target-88.wav 1.000s
[091/101] target-89.wav 1.000s
[092/101] target-90.wav 1.000s
[093/101] target-91.wav 1.000s
[094/101] target-92.wav 1.000s
[095/101] target-93.wav 1.000s
[096/101] target-94.wav 1.000s
[097/101] target-95.wav 1.000s
[098/101] target-96.wav 1.000s
[099/101] target-97.wav 1.000s
[100/101] target-98.wav 1.000s
[101/101] target-99.wav 1.000s
ok
test_wrong_edge_version_fails_before_network_or_asset_changes (test_neural_audio.GeneratorContract.test_wrong_edge_version_fails_before_network_or_asset_changes) ... ok
test_rejects_silence_clipping_bad_format_and_abnormal_duration (test_neural_audio.PCMContract.test_rejects_silence_clipping_bad_format_and_abnormal_duration) ... ok
test_valid_pcm_returns_measured_hash_bytes_duration_and_levels (test_neural_audio.PCMContract.test_valid_pcm_returns_measured_hash_bytes_duration_and_levels) ... ok
----------------------------------------------------------------------
Ran 40 tests in 64.954s
OK
+31
View File
@@ -0,0 +1,31 @@
> find-word@0.2.5 test
> vitest run
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
❯ tests/generator.test.ts (2 tests | 1 failed) 62735ms
× neural 생성기의 실패 보존·retry·PCM·비밀값 부재 계약 62654ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/generator.test.ts > neural 생성기의 실패 보존·retry·PCM·비밀값 부재 계약
Error: Test timed out in 60000ms.
If this is a long-running test, pass a timeout value as the last argument or configure it globally with "testTimeout".
❯ tests/generator.test.ts:7:1
5| // Python 경계 테스트도 npm test에 포함한다. provider 호출은 fake이며 ffmpeg
6| // 변환과 Linux 원자 디렉터리 교체는 실제로 실행한다. 외부 네트워크는 쓰지 않는다.
7| it("neural 생성기의 실패 보존·retry·PCM·비밀값 부재 계약", () => {
| ^
8| const result = spawnSync(
9| "python3",
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯
Test Files 1 failed | 14 passed (15)
Tests 1 failed | 138 passed (139)
Start at 10:33:44
Duration 65.31s (tests 91%, environment 5%, setup 2%)
+3
View File
@@ -0,0 +1,3 @@
tests/browser/gains.spec.ts 127ms
tests/generator.test.ts 12ms
src/audio/assets.ts 6ms (unchanged)
+4
View File
@@ -0,0 +1,4 @@
> find-word@0.2.5 lint
> eslint . && tsc --noEmit
@@ -0,0 +1,33 @@
> find-word@0.2.5 test:browser
> playwright test tests/browser/gains.spec.ts tests/browser/resampling.spec.ts --output=.agent/evidence-v0.2.5/browser-gains-resample --reporter=line,json
[WebServer] (node:1547262) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)
Running 6 tests using 2 workers
(node:1547338) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
(node:1547337) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[1/6] [desktop] › tests/browser/gains.spec.ts:185:1 › 실제 WAV 변조는 소스 시작 전에 거부하고 원본 재시도로 회복한다
[2/6] [desktop] › tests/browser/gains.spec.ts:87:1 › 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다
[3/6] [desktop] › tests/browser/resampling.spec.ts:7:1 › 109 WAV의 24·44.1·48·96kHz 디코드는 고정 peak 상한 안에 있다
(node:1548620) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[4/6] [mobile] › tests/browser/gains.spec.ts:87:1 › 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다
(node:1549247) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[5/6] [mobile] › tests/browser/gains.spec.ts:185:1 › 실제 WAV 변조는 소스 시작 전에 거부하고 원본 재시도로 회복한다
[6/6] [mobile] › tests/browser/resampling.spec.ts:7:1 › 109 WAV의 24·44.1·48·96kHz 디코드는 고정 peak 상한 안에 있다
6 passed (1.4m)
+13
View File
@@ -0,0 +1,13 @@
> find-word@0.2.5 test
> vitest run
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
Test Files 15 passed (15)
Tests 139 passed (139)
Start at 10:35:37
Duration 85.02s (tests 92%, environment 5%, setup 2%)
@@ -0,0 +1,14 @@
{
"before": {
"minimumLUFS": -38.69,
"maximumLUFS": -22.2,
"spreadLU": 16.49,
"ebur128DiagnosticSpreadLU": 18.0
},
"after": {
"minimumLUFS": -32.01,
"maximumLUFS": -32.0,
"spreadLU": 0.01,
"ebur128DiagnosticSpreadLU": 2.0
}
}
+15
View File
@@ -0,0 +1,15 @@
> find-word@0.2.5 build
> tsc --noEmit && vite build && node scripts/check-build.mjs
vite v8.3.4 building client environment for production...
transforming...
✓ 24 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html 1.31 kB │ gzip: 0.91 kB
dist/assets/index-CgXbHuMU.css 16.11 kB │ gzip: 4.53 kB
dist/assets/index-UAH83Dwf.js 296.33 kB │ gzip: 92.20 kB
✓ built in 195ms
빌드 음성 자산 101개 + 현장음 8개 및 런타임/현장음 notice 확인
+63
View File
@@ -0,0 +1,63 @@
> find-word@0.2.5 test:browser
> playwright test --output=.agent/evidence-v0.2.5/browser-final --reporter=line,json
[WebServer] (node:1550565) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)
Running 36 tests using 2 workers
(node:1550587) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
(node:1550588) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[1/36] [desktop] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
[2/36] [desktop] › tests/browser/gains.spec.ts:87:1 › 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다
[3/36] [desktop] › tests/browser/gains.spec.ts:185:1 › 실제 WAV 변조는 소스 시작 전에 거부하고 원본 재시도로 회복한다
[4/36] [desktop] › tests/browser/game.spec.ts:8:1 › 실제 오디오로 혼합 모드 완주·레이아웃·접근성·외부 요청 없음
[5/36] [desktop] › tests/browser/game.spec.ts:130:3 › intro WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[6/36] [desktop] › tests/browser/game.spec.ts:130:3 › target WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[7/36] [desktop] › tests/browser/release.spec.ts:6:1 › 릴리스는 사용자 크레딧과 런타임 MIT notice 전문을 제공한다
[8/36] [desktop] › tests/browser/release.spec.ts:24:1 › 누락 음성·환경음은 query와 HTML accept에도 404이고 출처 고지는 번들된다
[9/36] [desktop] › tests/browser/resampling.spec.ts:7:1 › 109 WAV의 24·44.1·48·96kHz 디코드는 고정 peak 상한 안에 있다
[10/36] [desktop] › tests/browser/review-fixes.spec.ts:27:1 › 리뷰: 한국어 모드·결과 어절은 320px와 360px에서도 갈라지거나 넘치지 않는다
[11/36] [desktop] › tests/browser/review-fixes.spec.ts:62:1 › 리뷰: 실제 진행 막대는 현재 문항의 1/3·2/3·3/3을 채운다
[12/36] [desktop] › tests/browser/rounds.spec.ts:35:1 › 시작 단계·SNR·3문항 완료→다음 단계·재생 중 종료·응답 후 종료·홈 초기화
[13/36] [desktop] › tests/browser/rounds.spec.ts:135:1 › 여덟 환경의 실제 WAV를 각각 디코드하고 루프 재생한 뒤 즉시 정지한다
[14/36] [desktop] › tests/browser/rounds.spec.ts:178:1 › 환경음 404는 한국어 오류와 재시도 후 정상 답변으로 복구한다
[15/36] [desktop] › tests/browser/ui.spec.ts:4:1 › 전체 음량은 설정 흐름 안에 들어가며 키보드로 조절된다
[16/36] [desktop] › tests/browser/ui.spec.ts:52:1 › 난이도 설명은 모바일에서도 보인다
[17/36] [desktop] › tests/browser/ui.spec.ts:68:1 › 한국어 제목은 단어 중간에서 줄바꿈하지 않는다
[18/36] [desktop] › tests/browser/ui.spec.ts:121:1 › 시작 단계와 SNR 설정은 카드 안에 들어가고 터치 영역을 확보한다
(node:1551353) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[19/36] [mobile] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
(node:1551507) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[20/36] [mobile] › tests/browser/gains.spec.ts:87:1 › 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다
[21/36] [mobile] › tests/browser/gains.spec.ts:185:1 › 실제 WAV 변조는 소스 시작 전에 거부하고 원본 재시도로 회복한다
[22/36] [mobile] › tests/browser/game.spec.ts:8:1 › 실제 오디오로 혼합 모드 완주·레이아웃·접근성·외부 요청 없음
[23/36] [mobile] › tests/browser/game.spec.ts:130:3 › intro WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[24/36] [mobile] › tests/browser/game.spec.ts:130:3 › target WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[25/36] [mobile] › tests/browser/release.spec.ts:6:1 › 릴리스는 사용자 크레딧과 런타임 MIT notice 전문을 제공한다
[26/36] [mobile] › tests/browser/release.spec.ts:24:1 › 누락 음성·환경음은 query와 HTML accept에도 404이고 출처 고지는 번들된다
[27/36] [mobile] › tests/browser/resampling.spec.ts:7:1 › 109 WAV의 24·44.1·48·96kHz 디코드는 고정 peak 상한 안에 있다
[28/36] [mobile] › tests/browser/review-fixes.spec.ts:27:1 › 리뷰: 한국어 모드·결과 어절은 320px와 360px에서도 갈라지거나 넘치지 않는다
[29/36] [mobile] › tests/browser/review-fixes.spec.ts:62:1 › 리뷰: 실제 진행 막대는 현재 문항의 1/3·2/3·3/3을 채운다
[30/36] [mobile] › tests/browser/rounds.spec.ts:35:1 › 시작 단계·SNR·3문항 완료→다음 단계·재생 중 종료·응답 후 종료·홈 초기화
[31/36] [mobile] › tests/browser/rounds.spec.ts:135:1 › 여덟 환경의 실제 WAV를 각각 디코드하고 루프 재생한 뒤 즉시 정지한다
[32/36] [mobile] › tests/browser/rounds.spec.ts:178:1 › 환경음 404는 한국어 오류와 재시도 후 정상 답변으로 복구한다
[33/36] [mobile] › tests/browser/ui.spec.ts:4:1 › 전체 음량은 설정 흐름 안에 들어가며 키보드로 조절된다
[34/36] [mobile] › tests/browser/ui.spec.ts:52:1 › 난이도 설명은 모바일에서도 보인다
[35/36] [mobile] › tests/browser/ui.spec.ts:68:1 › 한국어 제목은 단어 중간에서 줄바꿈하지 않는다
[36/36] [mobile] › tests/browser/ui.spec.ts:121:1 › 시작 단계와 SNR 설정은 카드 안에 들어가고 터치 영역을 확보한다
36 passed (4.9m)
@@ -0,0 +1,9 @@
{
"headUnchanged": true,
"head": "812540c7438639f25b886cfd620201d92de15362",
"priorAgentFilesUnchanged": 660,
"voiceWavsUnchanged": 101,
"allPublicBytesMatchDist": true,
"sourcePlanUnchanged": true,
"noCommitPushMergeTagDeploy": true
}
@@ -0,0 +1,7 @@
{
"method": "High-confidence credential signatures in git-tracked and unignored new text files; no environment/secret access",
"textFilesScanned": 643,
"findings": [],
"passed": true,
"limitation": "Pattern scan is not a proof that every possible secret format is absent."
}
@@ -0,0 +1,23 @@
$ python3 /home/hermes/worktrees/find-word-v0.2.5/.agent/evidence-v0.2.5/check-preservation.py
{
"headUnchanged": true,
"head": "812540c7438639f25b886cfd620201d92de15362",
"priorAgentFilesUnchanged": 660,
"voiceWavsUnchanged": 101,
"allPublicBytesMatchDist": true,
"sourcePlanUnchanged": true,
"noCommitPushMergeTagDeploy": true
}
EXIT 0
$ python3 /home/hermes/worktrees/find-word-v0.2.5/.agent/evidence-v0.2.5/secret-scan.py
{
"method": "High-confidence credential signatures in git-tracked and unignored new text files; no environment/secret access",
"textFilesScanned": 603,
"findings": [],
"passed": true,
"limitation": "Pattern scan is not a proof that every possible secret format is absent."
}
EXIT 0
$ git diff --check
EXIT 0
RESULT local evidence links: 51 resolved
+768
View File
@@ -0,0 +1,768 @@
{
"commit": "812540c7438639f25b886cfd620201d92de15362",
"immutable": {
".agent/ACCEPTANCE-v0.1.1.md": "7e9d5aa5c608d3d86c0c30a51a8322713a2c5d072e57002ac5af9b63127c68a5",
".agent/ACCEPTANCE-v0.2.3.md": "4698a24cf492562c0f10b243c06a0ed2f930a9f0828f3ac08e0507d7a1cf7267",
".agent/ACCEPTANCE.md": "57598e4c5c37a658ce5fe366826983987178ed9c565355413ab3669c839eec78",
".agent/AMBIENCE-SOURCES-v0.2.3.json": "3529c8534be204208ac504a0f4c1a69b312131f9bbff92aa9a3135d61d24db65",
".agent/CONTEXT.md": "712bd056cfc8d0254d6c96e7a604d364779d3734d14899111792e7f343e6819b",
".agent/RESULT-v0.1.1.md": "d5d7077d4977d70a89086801dd8e7d5ae04e16a8e8009e41f3216008b743ac5b",
".agent/RESULT-v0.2.3.md": "389bc9b4bc4af59952d530d3d3d484387c12f9836d89cfd2131cf587c1f7d842",
".agent/RESULT.md": "eef6d73a67a8a7e90cd7b4747debc5976cc51571bc268328634413f698d0e311",
".agent/TASK-v0.1.1.md": "4e4a81c02cf16ae8a2a6b53da8501de512b6a6387d7d4eaf932833c63ada4aa7",
".agent/TASK-v0.2.3.md": "46ae8118506c756b97e29424e580843d0557c2f663f069e9ae71c04904fafb18",
".agent/TASK.md": "7e52739d5de3161aa60004ca8e65b5a5041d62c1b6a0e50c6c72ad8f6b183d61",
".agent/evidence-v0.1.1/00-audio-venv.log": "365f1b3cf48e7f6de9c24d28e4326a245d3a54eb329af4b41a9441ec546dabdc",
".agent/evidence-v0.1.1/00-npm-ci.log": "14a6e676c84fa9b2cc39a251aef0c593cda9903f9e5f2d9581bc4153c9f69e09",
".agent/evidence-v0.1.1/01-version-docs-red.log": "edb26b949d0dc28340989601e781df3582cf784220235d19c16a46aeee97d302",
".agent/evidence-v0.1.1/02-assets-red.log": "ccb8a354e2975c944fb2bde24492fe06a6c1b71add6ce65259d840c66836a1db",
".agent/evidence-v0.1.1/03-generator-red.log": "d78b7c9237c18ba8a87a77a116ea7561ae79af6e88718f9c087c1d8e2c70b1f1",
".agent/evidence-v0.1.1/04-generator-additional-red.log": "9a519598915fbdd98108ee1b364f634905e29a5a01bfdd7ffec22a8b359e9217",
".agent/evidence-v0.1.1/05-generator-green.log": "414464526a325b424e5c5305e3066b79c55527fb67b11a3b9eb3bb33dcecea93",
".agent/evidence-v0.1.1/06-audio-generate.log": "7b605184e89fd033378e6869236553a3d6e040087de23e8ae165f1e304f3b067",
".agent/evidence-v0.1.1/07-format.log": "ce1a102d13a7dfd78130216cea192e3230efa3612e999cb8a6bfd55e8eb6d471",
".agent/evidence-v0.1.1/08-version-docs-green.log": "671c2889a69c83ad24293d8e92d0076255bd00c5100c2a9eb764a570e1344edd",
".agent/evidence-v0.1.1/09-lint.log": "43d5238bc8e59b93cf3a9bc0f444f0165697b5584078973bd92efce056136c1e",
".agent/evidence-v0.1.1/10-audit.log": "6d8c5c8f3d7684adb070417bd608d01ae90aa3dc26a65af03ffda4955f38d9a3",
".agent/evidence-v0.1.1/11-full-test.log": "65721fcf2b03f153274c9cc1da13c6a1f265ab6f084be8b5921a898fbfd6b40b",
".agent/evidence-v0.1.1/12-independent-audio.log": "5ffd6173941d75deb028741cdba549705b652218f418c6d40ceb7f4b216f2d9d",
".agent/evidence-v0.1.1/13-build.log": "42ac41188359699f5f24c7f86de9d7ca6503d714a7be9e277ac2fd01be21614c",
".agent/evidence-v0.1.1/14-browser.log": "657ddc9f60ffa35684110766b2e459842cd1ab10a90b0002256a945f227a16b7",
".agent/evidence-v0.1.1/15-browser-audio.log": "cb16ec7009a88f911632d0bef64692066873d81372e65fea8dac800d59304214",
".agent/evidence-v0.1.1/16-final-lint.log": "43d5238bc8e59b93cf3a9bc0f444f0165697b5584078973bd92efce056136c1e",
".agent/evidence-v0.1.1/17-security-history.json": "5ba66683c3ae29e01f25cfae2ed832e33b07f866bfccd0e1d331a8f102d3d3c7",
".agent/evidence-v0.1.1/18-environment.log": "19a1da4298ba5a51f8dce5e6669205987bb48438e5c98f3ddcbc347ce0f91e46",
".agent/evidence-v0.1.1/19-final-integrity.json": "38f5af8927d95e9dae780decf146eb3d5feb610629202ef9ee67bf223647132f",
".agent/evidence-v0.1.1/audio-integrity.json": "d82b192602b1f054fce5f61479832666f237d7da2698afe84b09186dac90f321",
".agent/evidence-v0.1.1/baseline.json": "085be97acb81dcc83477ebc5f42dd2fd5729d9f5821cbc659df9c00b648ceb34",
".agent/evidence-v0.1.1/browser-audio-integrity.json": "2c0f59ed178285c0d338171328232351aab2b55e22371b3652453afa34849b65",
".agent/evidence-v0.1.1/cache-regression/00-baseline.json": "66afb3cfa4b4ba46b24d08d046066b27e7bf7d7af382f3776339b41d15b41f3c",
".agent/evidence-v0.1.1/cache-regression/01-unit-red.log": "cfbe949c8b24cb2b1c699a2d456529ac017caa1df2307b0c8d05f1dc4e7d22cf",
".agent/evidence-v0.1.1/cache-regression/02-build-before-fix.log": "2c2775dafb756ff1389b1c979c051b880929bf63b6286109c6ddc66d4ed75c6c",
".agent/evidence-v0.1.1/cache-regression/03-browser-red.log": "3af050a469281666912d91fc4c747b0135c636fbacc3094d8d823f96376509ed",
".agent/evidence-v0.1.1/cache-regression/04-red-state.json": "fd6eaad1aa47e8463bb020eb0de894a98871c4772ded56f370426c1903c20d3b",
".agent/evidence-v0.1.1/cache-regression/05-unit-green.log": "0ecd4924f62abbb6a619faf3cabc6bfa02c020e83cb37af79449ffce88486428",
".agent/evidence-v0.1.1/cache-regression/06-lint.log": "c85ee435a4f57d13173d4f4db27bdc9edbe6845a08d7d0b47de15c69ef715b71",
".agent/evidence-v0.1.1/cache-regression/07-full-test.log": "c8524e4c5e47a35a99d9cd2b23cf093e91d9fe1d557a78bfc7e4797fea659ba9",
".agent/evidence-v0.1.1/cache-regression/08-build.log": "e01eb47b14d5e14a49afe5cd750daa9cf86fd3ba389c6ece366e667efa1a282f",
".agent/evidence-v0.1.1/cache-regression/09-browser-green.log": "1f422035d506da11683299cd31a7cdf48284d285623e846f8f3785ab3412be9d",
".agent/evidence-v0.1.1/cache-regression/10-sandbox.log": "1ce93b0a638b60fd26d46a5f0fe2c124bc198d3e852ab4b6f94e9b3cf2f8cfb9",
".agent/evidence-v0.1.1/cache-regression/11-sandbox-green.log": "f75b42f1b7e8570d8fc3845c1837bdef0d8e4d8977c192df786e91ec5c15f5f7",
".agent/evidence-v0.1.1/cache-regression/12-cache-regression-result.log": "65e37c6d39f77f2ffb3765a6508a8469a69d1443b304fe3082474d041105a840",
".agent/evidence-v0.1.1/cache-regression/13-final-integrity.json": "60c8aa79c7c4d4a6cc42e71c6fc2e7af8f07473c69517da60481aa14b8d7cd0b",
".agent/evidence-v0.1.1/cache-regression/artifacts/desktop-browser-audio-integrity.json": "3aa78dfd8a3acb45a445306dae6d7517b16f32744b6f468e7e2a32a91a4ac9e0",
".agent/evidence-v0.1.1/cache-regression/artifacts/desktop-game.png": "d3ccf902a6865a781edd88da2df3ea5ae2cc30f79b32a574194a5e65c1b4bc10",
".agent/evidence-v0.1.1/cache-regression/artifacts/desktop-heading.png": "a21b7af15a73f66589df7dacff7ce7424177a735969a39afff92b90fd51278b5",
".agent/evidence-v0.1.1/cache-regression/artifacts/desktop-home.png": "cec5a0a94df0c6896cfe7cc89e49bb6ac0eddadae598833b19ed158958e96beb",
".agent/evidence-v0.1.1/cache-regression/artifacts/desktop-results.png": "fd3208180016a30b682d80cb73580aa3a9cf2d5a6f8f426958c409222adcf251",
".agent/evidence-v0.1.1/cache-regression/artifacts/mobile-browser-audio-integrity.json": "3aa78dfd8a3acb45a445306dae6d7517b16f32744b6f468e7e2a32a91a4ac9e0",
".agent/evidence-v0.1.1/cache-regression/artifacts/mobile-game.png": "c5d885f3cd8f51e3e0519459e3fd2bca801f2ac9703e15b11bb2d73628869e25",
".agent/evidence-v0.1.1/cache-regression/artifacts/mobile-heading.png": "4c8b1c4652dd3aff3703ee273695544d4948d39fa6b5c0b1df9313db47e1d537",
".agent/evidence-v0.1.1/cache-regression/artifacts/mobile-home.png": "6a5b776c6111929c20a4800904c160c6c983b442f9ec9f8395061e9142c20d64",
".agent/evidence-v0.1.1/cache-regression/artifacts/mobile-results.png": "a5bce60459ba2147fe080cba6666c1e39b6a97ade6f244a7b955f5371cb594e3",
".agent/evidence-v0.1.1/changed-files.txt": "4877f3d1003372868b5a9f72326ccf0870b22daf35a71b60b67dc761342fa50f",
".agent/evidence-v0.1.1/desktop-game.png": "02c59fa37c4d4f19e5c74e56fc889105b4d280a0a4cf2c14c1838947859a3a8b",
".agent/evidence-v0.1.1/desktop-heading.png": "920d3d998d93f463be9ac6a682c1f7d5d9ac36944b52b715345c865ae46f566d",
".agent/evidence-v0.1.1/desktop-home.png": "9c6f92b67db249b2a1d3e752052678d7ae0af6be426d976d12237d84c105bf76",
".agent/evidence-v0.1.1/desktop-results.png": "3811eae6f5827760499c9c64053a2cb2ecbb1d87ed2ddf11b757eb44e56c64bd",
".agent/evidence-v0.1.1/mobile-game.png": "bb0dec7ec2c99b55caafd729e2f9c9c01875e3b6dd577cc377a76bbfd5c95a7e",
".agent/evidence-v0.1.1/mobile-heading.png": "d61f2d1b01c654a5cfe841e49e244af4e232b5fc9c899e77523b336411e99316",
".agent/evidence-v0.1.1/mobile-home.png": "7c4a4643a5222f45c6492ebf78780a317e26d423bf244fc16ea24a186a76f506",
".agent/evidence-v0.1.1/mobile-results.png": "f2a095ab1d2a3a95a1a275b652fcd31275a5803a926e01b5fcd1e9a9e127cfb9",
".agent/evidence-v0.1.1/verify_audio.py": "7751c03b83dbbd3b222f6d5a68eb1d78dac2bbf82c0fd79345ccca86a15fcb69",
".agent/evidence-v0.1.1/verify_browser.mjs": "53f0f6317274a91017a4f508ef9237e022f7d333ef4243f324720f8d7f85abeb",
".agent/evidence-v0.2.3/01-round-GREEN.log": "80beec689bea21086449b7edc9c61414af289722584478463fdd5deac9cba39d",
".agent/evidence-v0.2.3/01-round-RED.log": "986a49e5522b1c7dbadf97e0c308af87de589d7a9524ec85c4ba891deb603d3f",
".agent/evidence-v0.2.3/01-round-sampling-regression.log": "e71f6e853a00941decac3df722369f3bba38f177b8d4ceb7be326522326604f5",
".agent/evidence-v0.2.3/02-snr-exit-GREEN.log": "6bbf48b3aef1b15de7576a8c4ee5608c382aa5cc92c95a844aca32d705208e23",
".agent/evidence-v0.2.3/02-snr-exit-RED.log": "ac7bc8813ca67a1413678e97c36d05e03bd1f3d9c99656671e3a81bac38c89ac",
".agent/evidence-v0.2.3/03-screen-GREEN.log": "39564011526efb4ff5a277774394d26ae8e8d241e233d53a950cd258ed26c001",
".agent/evidence-v0.2.3/03-screen-RED.log": "98e50844d757b9dee2426f93ed89ab6d158b30116212908fd098eda68f4b848b",
".agent/evidence-v0.2.3/03-screen-duplicate-description-RED.log": "186940b7e422c6096fdc3c3cf4280661a75d4f02d3b97e3015a070f5d8ff0323",
".agent/evidence-v0.2.3/04-recorded-mix-GREEN.log": "323468e46e58b9f51340f63ecc41fc0bfd9fcd4a9e91e409550d484c49ff6b6e",
".agent/evidence-v0.2.3/04-recorded-mix-RED.log": "b74bfd906276af2211ccbc8a6da10ebf86146fda613622c20e4a939ae45dd55f",
".agent/evidence-v0.2.3/05-playback-GREEN.log": "4d43b75d4671d9aaffaa5db4d32299260a440978a3699c92d384443ba4766bea",
".agent/evidence-v0.2.3/05-playback-RED.log": "02aa8f0a48af5b6f157451029963aa90664c5fedd89491e174e9b2d7bce1d159",
".agent/evidence-v0.2.3/05-playback-fixture-regression.log": "925f6be228ab0eb568c27d79fb1b477a8737cfd94be34d0f7d79d1d7e4989bfa",
".agent/evidence-v0.2.3/06-node-import-GREEN.log": "0bceb35eedea301af580ec093349973e9230d37921d5c4476587ee335e28554d",
".agent/evidence-v0.2.3/06-node-import-RED.log": "9b7ed2c611e2e36041f8a34e3295ad2ff506f0feb427e4a51978ce9efc252cf1",
".agent/evidence-v0.2.3/07-asset-conversion.log": "ce2e395db0bfce47953cd7c9ff3311a733376d8109941f7f04a919659f0d95f8",
".agent/evidence-v0.2.3/07-assets-GREEN.log": "f04418ee6b67f14c62e17c53027e7ea1bde58d38a7cdc54f0edee15e1643847e",
".agent/evidence-v0.2.3/07-assets-RED.log": "5c173b8b2c64b4c661cb58ab22788216b0d90799378a3fcf234087182f3b1d78",
".agent/evidence-v0.2.3/07-converter-GREEN.log": "53a049e86064db709a80d1487a099fe154f99fb6a9821639a24390f88aacbf5a",
".agent/evidence-v0.2.3/07-converter-RED.log": "53cefcd04c8ac4354b5e891a4e65810c21ece90503a3f2ed3392c046feaeb9c9",
".agent/evidence-v0.2.3/08-heard-snr-GREEN.log": "347cdd6ceffa01e0227a17b5af604e96e8081aeaadfc95cf33155ab0af0f813b",
".agent/evidence-v0.2.3/08-heard-snr-RED.log": "82b0d04bfd2e99ad36b59325581b5527fa1fa8ae8953db3ed402fb381356fd90",
".agent/evidence-v0.2.3/09-version-docs-GREEN.log": "8ac6c86e13de85121607e93da4316c2220ad0edb95ac091048767a903f65152c",
".agent/evidence-v0.2.3/09-version-docs-RED.log": "21733781658b1d6525746f6a3dd59337774990c53689f7883e7ff8ddc7c65398",
".agent/evidence-v0.2.3/10-environment-rotation-GREEN.log": "5dc34db413e4ed7918dad60a49ae97532d701aa52d10b49459e77f75c925231d",
".agent/evidence-v0.2.3/10-environment-rotation-RED.log": "ae7914b7fca896a77478e36ea79bfc51d3a13f976e0f722c7c1615daf6e6837e",
".agent/evidence-v0.2.3/11-bundle-notice-GREEN.log": "d6ba07866a02eab665c215f1ce6588e4f5a9157baf4be6e9befba0f945e379bd",
".agent/evidence-v0.2.3/11-bundle-notice-RED.log": "82d52d3905b35948abbaf7e912de5480a959780731fd04be4110674cf2d6ec63",
".agent/evidence-v0.2.3/12-build-initial.log": "508b0f60d2378679873fbd17784725323fe7ccc267fb3b8b180a7bd59b861176",
".agent/evidence-v0.2.3/12-lint-followup.log": "058127eb4022e13fe809a0c56c3d3a43177b6088f284811e926452185772de6b",
".agent/evidence-v0.2.3/12-lint-initial.log": "7a5fdab53449ff945e4f8694164cbb1792f01a19d3d97c151590df5bdfb1506e",
".agent/evidence-v0.2.3/13-static-404-GREEN.log": "dee59b03d1eb3e0a59828d4f50ea372c78c231000cdd1c77965fcdf42864042b",
".agent/evidence-v0.2.3/13-static-404-RED.log": "7b4822f9d121f963dbab27155aaf0627fbbfbadd855adf4da4224388e35b230c",
".agent/evidence-v0.2.3/14-browser-initial.log": "d2178d18a7e1b2f84e4a430a884ca442070b1a455217f6f594ed4c5f160b426e",
".agent/evidence-v0.2.3/14-full-test-initial.log": "08a7d3bb30acbc04f9b63e49a0ba5a34628e00613a97660cfb6f467c74854aee",
".agent/evidence-v0.2.3/14-npm-audit.json": "ea7bab3cc606a95eecdf538b0d02d3cf928bf0f3a1cfb1d2c8ddbe02846d5658",
".agent/evidence-v0.2.3/15-results-anchor-GREEN.log": "48c5b15b6b2dc661a0410af2cfe501d9efafac55d085c29ab74f44ea76e7e8a3",
".agent/evidence-v0.2.3/15-results-anchor-RED.log": "cb113c8ceeeb48d7573b1de0b9d8263e25e4f7a28dd811404a057d5d6c623157",
".agent/evidence-v0.2.3/16-controls-build.log": "ae8849619608d58763d2ce301bcdba420054bd29174b1bc8dca86790b82fc5e7",
".agent/evidence-v0.2.3/16-controls-layout-GREEN.log": "7be2b42602a98167b83c12bce3af7b0856ccd10be68d477e5dba39db99991c03",
".agent/evidence-v0.2.3/16-controls-layout-RED.log": "9060a0e1d36a15a35b3b189f5b210fdab9fe9579b06e6b19f645bfe8f2914603",
".agent/evidence-v0.2.3/17-bonus-copy-GREEN.log": "f988cf9fda0bc4dd4b7818dde11094f6fb75b9540ccfcb9f964acec003ff3de7",
".agent/evidence-v0.2.3/17-bonus-copy-RED.log": "fd11d5b64c06cfa28c839cdddb7e2f2ac2406f8c1101f1fb9e262ae9cfaf6b85",
".agent/evidence-v0.2.3/18-browser.log": "a92ba8db852111170403932bb8b4dbd49345936156fbbc3ef61f5c612609a55e",
".agent/evidence-v0.2.3/18-build.log": "3f0bd258866ed4f29f8a8ab5d88fc7db68f67abe9bc51fed22563d51200d9f72",
".agent/evidence-v0.2.3/18-format.log": "d78946d25140238f764ccf3fca989a0aa42b25162cfba7d92dbb10256db45401",
".agent/evidence-v0.2.3/18-full-test.log": "bf358255a30c2d18b82af8f8c5942d0b9ee7c100c40114fe8666e7f564829d79",
".agent/evidence-v0.2.3/18-lint.log": "058127eb4022e13fe809a0c56c3d3a43177b6088f284811e926452185772de6b",
".agent/evidence-v0.2.3/18-python.log": "911637068f7c09de38cd38b9d13cdb23b365812521ed8b1f75328b1960b085bf",
".agent/evidence-v0.2.3/19-favicon-GREEN.log": "34fd3cd00d40ae5766b2364cef81fe90accc8f8ec03788959680d118ecbf9b13",
".agent/evidence-v0.2.3/19-favicon-RED.log": "49fc230ab2adeceb6613e6b9019f31f12b2dd3764096a85f391f91e83479e6cb",
".agent/evidence-v0.2.3/20-browser.log": "cfc61835f7061d6301b54ce07e8f1c1aaba5c3a29d7df85d767eb1cf898217a6",
".agent/evidence-v0.2.3/20-build.log": "77a52828d2b1d1d46efa6a3f5b4ded7ca12da6db5896b1ee9a2fefebf50bcb85",
".agent/evidence-v0.2.3/20-full-test.log": "10c46b00ad407161154f57c060599dca379effef2c5c80e0d24edd366c08817a",
".agent/evidence-v0.2.3/20-lint.log": "058127eb4022e13fe809a0c56c3d3a43177b6088f284811e926452185772de6b",
".agent/evidence-v0.2.3/21-format.log": "48a148bd43ecea64bd7604be2431e2072fe390bbc578a71d65df4d1c0a369412",
".agent/evidence-v0.2.3/21-select-label-GREEN.log": "2ce474d915736281c05591c4753e23d555eda186b13c85a2ae96f8481cf35d86",
".agent/evidence-v0.2.3/21-select-label-RED.log": "149ee8ca004c8f63765d642305cf9e6b0ad3de5986bf0dcefaf656844c22a73d",
".agent/evidence-v0.2.3/22-browser.log": "b2e4e82e78376042ea1297c930403889b22e8a275e226736c232b8cbaa74fadd",
".agent/evidence-v0.2.3/22-build.log": "ed77e72c527fa7ab9d9c5c2447cd1bff34824ee6eac384bd18a50303607cbca9",
".agent/evidence-v0.2.3/22-full-test.log": "c3f38be3d6e00dc983e29a3cbfb632192a0fe64c151f06edcd8b35188edcde5c",
".agent/evidence-v0.2.3/22-lint.log": "058127eb4022e13fe809a0c56c3d3a43177b6088f284811e926452185772de6b",
".agent/evidence-v0.2.3/browser-favicon-RED.json": "036a734efcdff9481b3d10f1b07159ef6ca056d9245cffa469c5b1c8fe87f2bb",
".agent/evidence-v0.2.3/browser-results.json": "060d18bd74f7179884205117c6c853dc783ec7a818bdfcc8a490ef1a679c77f6",
".agent/evidence-v0.2.3/browser/desktop-audio-integrity.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/browser/desktop-early-exit.png": "a6a68bcc871939cd945f0b7a96dddd7c3b371b069efa7171fa6d3fe39e352d5f",
".agent/evidence-v0.2.3/browser/desktop-game.png": "c7c5a04608075edf836718e6479cc776773fa22d2cd8fe3aa230bdf3ec82ccc1",
".agent/evidence-v0.2.3/browser/desktop-normal-results.png": "cf98d5168a96fac8a87718bd5a771d81e8e02dc4d46c93904556319033fe2bc0",
".agent/evidence-v0.2.3/browser/desktop-runtime-audit.json": "afdf38d83cf77e91b478bc806f4da007860c5db6e6146995d5d405883de8bc13",
".agent/evidence-v0.2.3/browser/desktop-start.png": "911b923e3a68e8deb0063efd88ed43eb1ed6c597c14bd5b9ee71f6b5161b6d7b",
".agent/evidence-v0.2.3/browser/mobile-audio-integrity.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/browser/mobile-early-exit.png": "5e2ef07c6c3b7672e0aa82f248a5a245d60a10f86633fab2b2dd45ecff81d7fa",
".agent/evidence-v0.2.3/browser/mobile-game.png": "f4890f7d61b87c102c68f285108584ac58182186b685f73ea05f64bf51a64a0c",
".agent/evidence-v0.2.3/browser/mobile-normal-results.png": "5eccd53853c27a7c1385f1219b0a9bb7af60070fbdd1469ef3265e40377f3eaa",
".agent/evidence-v0.2.3/browser/mobile-runtime-audit.json": "949c6829af7030728c7382c0ac8bde8a8cd8e3b46cf5a5919f5a6d281d4ba657",
".agent/evidence-v0.2.3/browser/mobile-start.png": "c04abd43e93e46fde7e1591bde24a3073d584226e93ba5661bac1b5cd78a4695",
".agent/evidence-v0.2.3/chrome-sandbox.json": "0e0d0d3a4618e4c607a6cccd1ff04d9fdc9dcc70ff76e909e614e90b6607cae8",
".agent/evidence-v0.2.3/commons-license-audit.json": "2a36e3ac168d223849a2f171457ebd87b236301a65c8e13f5061f484c18e31d6",
".agent/evidence-v0.2.3/environment.json": "9e1c233d564982ef3b9712c2bcb5c85aef32d2276d0c3b6f5e02a009db76796e",
".agent/evidence-v0.2.3/final-review.log": "1692e79cc7e03cd3a71e10f4497914df13931aa08e1c5a66a84545ce318b5ea4",
".agent/evidence-v0.2.3/preservation.json": "a938ce612b594f99e4bbd2457f3a2c665af4aeb6a465ca4c459d74c5375eb4ff",
".agent/evidence-v0.2.3/primary-page-verification.json": "2b4a6fcaf55b51a10d378a888a634e7aeac8591d3dd5fa537f4a70806c536fd0",
".agent/evidence-v0.2.3/privacy-screening/01-provenance-RED.log": "4dd0f47347add3e34dea419d891ab51a3e8d5504cacbb3821ce482c7302bfd2f",
".agent/evidence-v0.2.3/privacy-screening/02-generator-GREEN.log": "2c85f8e50ac29484748f1069aa7bc8fbeb848fbefc1cb5e01150bce7895f2b66",
".agent/evidence-v0.2.3/privacy-screening/02-generator-RED.log": "ce4eb7cb38410babeff3de3a809a92b0987a77b58213dba86f406cb977b51ef0",
".agent/evidence-v0.2.3/privacy-screening/03-browser-RED.log": "21939f1ada40160d48babbbaaf01c732d20b0b192b5e02f713f9ea31620372cd",
".agent/evidence-v0.2.3/privacy-screening/04-screening-RED.log": "a28c766db9781d6d7df784472ea1c6cf5a4ead0b80b749ab9f01357e9db95e1a",
".agent/evidence-v0.2.3/privacy-screening/05-regeneration.log": "908e4acd8d2a3c9936bfbf2196c5ed0d2f30a43b619a1fa376a6c388edfe01a8",
".agent/evidence-v0.2.3/privacy-screening/06-seek-GREEN.log": "55c5edc79d467bdb7cc286e7b84ebd878fbf36ece1609cc0eee31564bd164eed",
".agent/evidence-v0.2.3/privacy-screening/06-seek-RED.log": "300fafca43579ee884f9bebd755a56055c9c6c08fd28087563b05350eda82ed1",
".agent/evidence-v0.2.3/privacy-screening/06-seek-provenance-RED.log": "090820b7767f983c8289d99ed777a3a33250c1dde58adb92bd8f54e1ea190cbf",
".agent/evidence-v0.2.3/privacy-screening/07-regeneration.log": "43496216e477826add4ab0365898e0128882c3d501f956d4857abe4353b5e27c",
".agent/evidence-v0.2.3/privacy-screening/08-sample-trim-GREEN.log": "d2e738e446794043fd67ca79015c166d495837ab88d7644fbd300d34d554a059",
".agent/evidence-v0.2.3/privacy-screening/08-sample-trim-RED.log": "f9f2304682b1fa4030170ac890be02f26726dc36f31fb09a4df3449a0e7252aa",
".agent/evidence-v0.2.3/privacy-screening/09-regeneration.log": "bdd4f7745d05b19fd99c1a6dbe9f8307c17e8ab5fee5a7fbdc0a77f27131e70c",
".agent/evidence-v0.2.3/privacy-screening/10-final-asr.log": "81c513ce9dc761655829422e24b71b333ffa01445685bc91ef100e740c9a72c0",
".agent/evidence-v0.2.3/privacy-screening/11-provenance-GREEN.log": "f44950a82573773c46285cdc5996dde86b6a161f8b421cc3c915e852c17e1a54",
".agent/evidence-v0.2.3/privacy-screening/12-build.log": "3930ccb7b01e122ac7e67e3aeb170e6eaaa2f8ad1a50443c71ed35767b061509",
".agent/evidence-v0.2.3/privacy-screening/12-lint.log": "0cabf7a5edcc813b0900f3b7cf73d4bbc9b17e5f35ad8ad4a740aa2c53f732b8",
".agent/evidence-v0.2.3/privacy-screening/12-python.log": "b46991f65fed587e34c5c4974608b60bd908e2c95fd12529a7d96d5b9db39291",
".agent/evidence-v0.2.3/privacy-screening/13-screening-criterion-RED.log": "0593334ad9d70d84049748f01402b6d79fb9695a78ae67de56b96807a08c056e",
".agent/evidence-v0.2.3/privacy-screening/14-final-asr-vad.log": "0379152c054bdfb816bdef3dbc7a91a62113fd5974363030acb13eb7730c051a",
".agent/evidence-v0.2.3/privacy-screening/15-audit.log": "bfc68a63acc9d349ef80b0269b0340dd1e2b934907d894d534602ae4d75309cc",
".agent/evidence-v0.2.3/privacy-screening/15-browser.log": "43aae40f119cb7c1975bf22c1088be837a6d70b1b9d295fb5c11890f933a623b",
".agent/evidence-v0.2.3/privacy-screening/16-final-asr-vad-json.log": "22f87eb3462b0d6a0ba15f47ae6dcf9b8e12be592d07cd42c4bb19a1dc4e580d",
".agent/evidence-v0.2.3/privacy-screening/17-unit.log": "3bd2ae0598a35af2e98b6bc5c72cde152228a258902604e8dd2d22621ecb5522",
".agent/evidence-v0.2.3/privacy-screening/18-final-lint.log": "51c4852c3516766c555e3199afbebc3c3017e9da4c5b017312ce2fa51e7eb838",
".agent/evidence-v0.2.3/privacy-screening/19-diff-check.log": "8dc5136a348ad652edc50fbc7ff7958effd276e06284e70b7f90195c5ed26728",
".agent/evidence-v0.2.3/privacy-screening/README.md": "a5a103f7a92e8ecdf38c9d2fb41830b828fe42252fb0f46871121bf5d01407fe",
".agent/evidence-v0.2.3/privacy-screening/asr-serialization-failure.json": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
".agent/evidence-v0.2.3/privacy-screening/baseline.json": "0d3c17cf6c63e660bc0b15b1e3b39cedb8d66886c41d1e83d1320aa5117bfc1d",
".agent/evidence-v0.2.3/privacy-screening/before-manifest.json": "54581c0c1c6cf3eb3761ad87a8fd5e3ef455dca26f5150a47f48758c01692c4a",
".agent/evidence-v0.2.3/privacy-screening/before-notices.md": "b0329e057acc56f825a733f727cf01c22d23c1eb226726c0c177832e7ee2e98d",
".agent/evidence-v0.2.3/privacy-screening/before-result.md": "d186104a6cda2dddd13314e4225c0e4158ab36a85d4d3f16fbc0cfc593171e66",
".agent/evidence-v0.2.3/privacy-screening/before-source-plan.json": "e4d400b32344a0a45debc807c058e4c8bfa30d3cf947e75ef81dc40beddbbc8b",
".agent/evidence-v0.2.3/privacy-screening/browser-final/.last-run.json": "91d1c43004802cd49950d78eb11c8fa7d05da8ffffe219a8b13b2f561bc00903",
".agent/evidence-v0.2.3/privacy-screening/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/attachments/109-versioned-WAV-integrity-bcde2a64dc46084caae2c89272a63e0ce1b6dc06.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/browser-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/attachments/109-versioned-WAV-integrity-c90c562b8cfd985ad0d76e1c0d918e5063cd2fba.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/browser-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/game.png": "a96e59237e3869125eb6099b15dc55fb5d7bd08af0f10c4d7e1b3d2d1eb2b8e3",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/home.png": "911b923e3a68e8deb0063efd88ed43eb1ed6c597c14bd5b9ee71f6b5161b6d7b",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/results.png": "51d34a4717075e8b516b2f334d6a30affecea776568052cc9ccb9d7518ecbebf",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/game.png": "a3c49b633277b3cd05e607f2bfe851b1b24a82cd16d7c5dcdbf6a75ecdf228d3",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/normal-results.png": "85e8b066ac128239de765f001c3542e6905018f5deaec7abac4a985006fb03b5",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-1.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-2.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-3.png": "fde834aa2f803612ef9cc7a68cea0c8d5a225289a82321ba0a59063d151e66a0",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-1.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-2.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-3.png": "9d198c8b07ea84e9f3d9ebad03831ffd61b98672a9e637e7ee9e9eead959cf28",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/browser-final/rounds-시작-단계·SNR·3문항-완료→다음-단계·재생-중-종료·응답-후-종료·홈-초기화-desktop/early-exit.png": "47cf4429695d65ddad8d353aaa14dd5edcea3ef4c09c16b537d6a72c3e256533",
".agent/evidence-v0.2.3/privacy-screening/browser-final/rounds-시작-단계·SNR·3문항-완료→다음-단계·재생-중-종료·응답-후-종료·홈-초기화-mobile/early-exit.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/browser-final/ui-한국어-제목은-단어-중간에서-줄바꿈하지-않는다-desktop/heading.png": "56fa16aa968018bcc3252168a0c9e7fd3b30d352cb831b29caed75329c96dac7",
".agent/evidence-v0.2.3/privacy-screening/browser-final/ui-한국어-제목은-단어-중간에서-줄바꿈하지-않는다-mobile/heading.png": "8ae22f403cacecc1d4e59bfeb1faec5b1be1038f87e1bbd564a9e8b5065c693e",
".agent/evidence-v0.2.3/privacy-screening/browser-integrity-summary.json": "7a208920dc76f8e75c4ccf4b23fc0a21e539a2ea6d616a2a6d30083deeb869ce",
".agent/evidence-v0.2.3/privacy-screening/browser-red/.last-run.json": "a5e3a6fa62bb09c07b34963c1f8807efc83e81627b0f665fe83e34a6a094fa15",
".agent/evidence-v0.2.3/privacy-screening/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/error-context.md": "958700898c966a2ab19189862cc6bc40bb168b0131c90c381220df9f05426f5f",
".agent/evidence-v0.2.3/privacy-screening/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/trace.zip": "a4d9f4a9cfb1be6becad762bd6b5da9610e023ec1a5f675abe188320603aaae7",
".agent/evidence-v0.2.3/privacy-screening/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/error-context.md": "caa0871351f61738f3a139ab12945f8255c826e0b0c34417c93167eb5b5fb41a",
".agent/evidence-v0.2.3/privacy-screening/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/trace.zip": "0ee5218c088e5e9ff4e3bff0744fa4beb58aab4f076758a1e1cdce6d8ec7a522",
".agent/evidence-v0.2.3/privacy-screening/browser-results.json": "f0bdecf74bcd8f245609fc0c4286f4008aeed352904da1e9b6b41ab6cffffb76",
".agent/evidence-v0.2.3/privacy-screening/candidate-scan-original.json": "2f89b954b323d2d1da96ce5927d68771f9f7ec82331c04a3bfdefbdb693b4ef6",
".agent/evidence-v0.2.3/privacy-screening/chrome-sandbox.json": "26ecfbe458db915fea59f743664b51780cae088a1109e098ea371b9b95b6adb7",
".agent/evidence-v0.2.3/privacy-screening/desktop-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/earlier-asr-provenance.json": "9a6a1adc439f3af55150216bae85fc9daee953c768dca3a4d014336bb281bdad",
".agent/evidence-v0.2.3/privacy-screening/failed-regeneration-preservation.json": "42872c56d849ec4fe3c4f62b02a46496d155be8fc6c5b68fd62e81c6395e3989",
".agent/evidence-v0.2.3/privacy-screening/final-asr.json": "82df338d83f7b6c8b6b04ecf43c7218b6787cc1b72d73d5c898197ec957a7070",
".agent/evidence-v0.2.3/privacy-screening/mobile-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/no-vad-asr.json": "14b42ee0b80c194caa3c0de2644f647d6d7720c60c2208374778619f47c2e969",
".agent/evidence-v0.2.3/privacy-screening/npm-audit.json": "ea7bab3cc606a95eecdf538b0d02d3cf928bf0f3a1cfb1d2c8ddbe02846d5658",
".agent/evidence-v0.2.3/privacy-screening/preservation.json": "db50497ae6251b67021c0e47ee7298a5cf4b98e1ec6da3010d183f5758831bd9",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/01-provenance-RED.log": "4dd0f47347add3e34dea419d891ab51a3e8d5504cacbb3821ce482c7302bfd2f",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/02-generator-GREEN.log": "2c85f8e50ac29484748f1069aa7bc8fbeb848fbefc1cb5e01150bce7895f2b66",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/02-generator-RED.log": "ce4eb7cb38410babeff3de3a809a92b0987a77b58213dba86f406cb977b51ef0",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/03-browser-RED.log": "21939f1ada40160d48babbbaaf01c732d20b0b192b5e02f713f9ea31620372cd",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/04-screening-RED.log": "a28c766db9781d6d7df784472ea1c6cf5a4ead0b80b749ab9f01357e9db95e1a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/05-regeneration.log": "908e4acd8d2a3c9936bfbf2196c5ed0d2f30a43b619a1fa376a6c388edfe01a8",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/06-seek-GREEN.log": "55c5edc79d467bdb7cc286e7b84ebd878fbf36ece1609cc0eee31564bd164eed",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/06-seek-RED.log": "300fafca43579ee884f9bebd755a56055c9c6c08fd28087563b05350eda82ed1",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/06-seek-provenance-RED.log": "090820b7767f983c8289d99ed777a3a33250c1dde58adb92bd8f54e1ea190cbf",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/07-regeneration.log": "43496216e477826add4ab0365898e0128882c3d501f956d4857abe4353b5e27c",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/08-sample-trim-GREEN.log": "d2e738e446794043fd67ca79015c166d495837ab88d7644fbd300d34d554a059",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/08-sample-trim-RED.log": "f9f2304682b1fa4030170ac890be02f26726dc36f31fb09a4df3449a0e7252aa",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/09-regeneration.log": "bdd4f7745d05b19fd99c1a6dbe9f8307c17e8ab5fee5a7fbdc0a77f27131e70c",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/10-final-asr.log": "81c513ce9dc761655829422e24b71b333ffa01445685bc91ef100e740c9a72c0",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/11-provenance-GREEN.log": "f44950a82573773c46285cdc5996dde86b6a161f8b421cc3c915e852c17e1a54",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/12-build.log": "3930ccb7b01e122ac7e67e3aeb170e6eaaa2f8ad1a50443c71ed35767b061509",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/12-lint.log": "0cabf7a5edcc813b0900f3b7cf73d4bbc9b17e5f35ad8ad4a740aa2c53f732b8",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/12-python.log": "b46991f65fed587e34c5c4974608b60bd908e2c95fd12529a7d96d5b9db39291",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/13-screening-criterion-RED.log": "0593334ad9d70d84049748f01402b6d79fb9695a78ae67de56b96807a08c056e",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/14-final-asr-vad.log": "0379152c054bdfb816bdef3dbc7a91a62113fd5974363030acb13eb7730c051a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/15-audit.log": "bfc68a63acc9d349ef80b0269b0340dd1e2b934907d894d534602ae4d75309cc",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/15-browser.log": "43aae40f119cb7c1975bf22c1088be837a6d70b1b9d295fb5c11890f933a623b",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/16-final-asr-vad-json.log": "22f87eb3462b0d6a0ba15f47ae6dcf9b8e12be592d07cd42c4bb19a1dc4e580d",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/17-unit.log": "3bd2ae0598a35af2e98b6bc5c72cde152228a258902604e8dd2d22621ecb5522",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/18-final-lint.log": "51c4852c3516766c555e3199afbebc3c3017e9da4c5b017312ce2fa51e7eb838",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/19-diff-check.log": "8dc5136a348ad652edc50fbc7ff7958effd276e06284e70b7f90195c5ed26728",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/asr-serialization-failure.json": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/baseline.json": "0d3c17cf6c63e660bc0b15b1e3b39cedb8d66886c41d1e83d1320aa5117bfc1d",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/before-manifest.json": "54581c0c1c6cf3eb3761ad87a8fd5e3ef455dca26f5150a47f48758c01692c4a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/before-notices.md": "b0329e057acc56f825a733f727cf01c22d23c1eb226726c0c177832e7ee2e98d",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/before-result.md": "d186104a6cda2dddd13314e4225c0e4158ab36a85d4d3f16fbc0cfc593171e66",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/before-source-plan.json": "e4d400b32344a0a45debc807c058e4c8bfa30d3cf947e75ef81dc40beddbbc8b",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/.last-run.json": "91d1c43004802cd49950d78eb11c8fa7d05da8ffffe219a8b13b2f561bc00903",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/attachments/109-versioned-WAV-integrity-bcde2a64dc46084caae2c89272a63e0ce1b6dc06.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/browser-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/attachments/109-versioned-WAV-integrity-c90c562b8cfd985ad0d76e1c0d918e5063cd2fba.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/browser-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/game.png": "a96e59237e3869125eb6099b15dc55fb5d7bd08af0f10c4d7e1b3d2d1eb2b8e3",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/home.png": "911b923e3a68e8deb0063efd88ed43eb1ed6c597c14bd5b9ee71f6b5161b6d7b",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/results.png": "51d34a4717075e8b516b2f334d6a30affecea776568052cc9ccb9d7518ecbebf",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/game.png": "a3c49b633277b3cd05e607f2bfe851b1b24a82cd16d7c5dcdbf6a75ecdf228d3",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/normal-results.png": "85e8b066ac128239de765f001c3542e6905018f5deaec7abac4a985006fb03b5",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-1.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-2.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-3.png": "fde834aa2f803612ef9cc7a68cea0c8d5a225289a82321ba0a59063d151e66a0",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-1.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-2.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-3.png": "9d198c8b07ea84e9f3d9ebad03831ffd61b98672a9e637e7ee9e9eead959cf28",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/rounds-시작-단계·SNR·3문항-완료→다음-단계·재생-중-종료·응답-후-종료·홈-초기화-desktop/early-exit.png": "47cf4429695d65ddad8d353aaa14dd5edcea3ef4c09c16b537d6a72c3e256533",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/rounds-시작-단계·SNR·3문항-완료→다음-단계·재생-중-종료·응답-후-종료·홈-초기화-mobile/early-exit.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/ui-한국어-제목은-단어-중간에서-줄바꿈하지-않는다-desktop/heading.png": "56fa16aa968018bcc3252168a0c9e7fd3b30d352cb831b29caed75329c96dac7",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/ui-한국어-제목은-단어-중간에서-줄바꿈하지-않는다-mobile/heading.png": "8ae22f403cacecc1d4e59bfeb1faec5b1be1038f87e1bbd564a9e8b5065c693e",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-integrity-summary.json": "7a208920dc76f8e75c4ccf4b23fc0a21e539a2ea6d616a2a6d30083deeb869ce",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-red/.last-run.json": "a5e3a6fa62bb09c07b34963c1f8807efc83e81627b0f665fe83e34a6a094fa15",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/error-context.md": "958700898c966a2ab19189862cc6bc40bb168b0131c90c381220df9f05426f5f",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/trace.zip": "a4d9f4a9cfb1be6becad762bd6b5da9610e023ec1a5f675abe188320603aaae7",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/error-context.md": "caa0871351f61738f3a139ab12945f8255c826e0b0c34417c93167eb5b5fb41a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/trace.zip": "0ee5218c088e5e9ff4e3bff0744fa4beb58aab4f076758a1e1cdce6d8ec7a522",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-results.json": "f0bdecf74bcd8f245609fc0c4286f4008aeed352904da1e9b6b41ab6cffffb76",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/candidate-scan-original.json": "2f89b954b323d2d1da96ce5927d68771f9f7ec82331c04a3bfdefbdb693b4ef6",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/chrome-sandbox.json": "26ecfbe458db915fea59f743664b51780cae088a1109e098ea371b9b95b6adb7",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/desktop-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/earlier-asr-provenance.json": "9a6a1adc439f3af55150216bae85fc9daee953c768dca3a4d014336bb281bdad",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/failed-regeneration-preservation.json": "42872c56d849ec4fe3c4f62b02a46496d155be8fc6c5b68fd62e81c6395e3989",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/final-asr.json": "01c8a92fab9f8df7a5f778c5f7e478ce96bcedc33e11a1055bd29154a08b706b",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/mobile-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/no-vad-asr.json": "14b42ee0b80c194caa3c0de2644f647d6d7720c60c2208374778619f47c2e969",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/npm-audit.json": "ea7bab3cc606a95eecdf538b0d02d3cf928bf0f3a1cfb1d2c8ddbe02846d5658",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/preservation.json": "db50497ae6251b67021c0e47ee7298a5cf4b98e1ec6da3010d183f5758831bd9",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/prior-derivatives-asr-original.json": "ab65f3d21655ee1894d16b2836d8976ba6419457aabc67a2f90a66eb8fa8bb88",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/regenerate.py": "c7b1af006bf4a9c1dba67225c2d0c1892b89cc677eaa92ac06e442e43f3d674e",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/regeneration.json": "6b3d5147143c87db78b7ddc2ddd3ef40586b65cf701c288da96f3d4e34af2d2f",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/screen-final.py": "9aa0912152952179f0a541e7dfb06a893114a2d5361e266fd24fff567fb60183",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/screen-with-vad-json.py": "b2d7d4075b56f6d2bcd40966ccc0d787f20a5fb7b9322d9d0547fe1915a909eb",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/screen-with-vad.py": "14431705ea1fe016601377ffc481037257a9449fd00b4dc664ca12616d086d27",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/seek-diagnostics-followup.json": "c7b2a73048c2e4c1b20bddfda2a165bbaddd3896e0d63d959f6d37733a53b847",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/seek-diagnostics.json": "f4ee88bf21a717c0020cd8b79f769c590c0ff3716e4e75038ce618f1b6440dba",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/validation-summary.json": "a1ddbeff130d719d5f0f0fe046ad1f751b3963c3bdc30c2303bb14894c602d34",
".agent/evidence-v0.2.3/privacy-screening/prior-derivatives-asr-original.json": "ab65f3d21655ee1894d16b2836d8976ba6419457aabc67a2f90a66eb8fa8bb88",
".agent/evidence-v0.2.3/privacy-screening/regenerate.py": "c7b1af006bf4a9c1dba67225c2d0c1892b89cc677eaa92ac06e442e43f3d674e",
".agent/evidence-v0.2.3/privacy-screening/regeneration.json": "6b3d5147143c87db78b7ddc2ddd3ef40586b65cf701c288da96f3d4e34af2d2f",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/01-release-RED.log": "d1edd19723e15a77df466adcf60019826384d81875d83e39b25971677ba02b5d",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/02-regeneration.log": "61a223840a2e45d71474b2cc1df4e1d8b1cce86d9cd3758c5b0cfb87338ff40e",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/03-final-asr.log": "51057a31eb64389c932c6f71ae72ccb6a5c773488724e22fb424a399f9eab371",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/04-release-GREEN.log": "246891fcef85bc98e0f744a4c187116fcd7afceb94d51c7ac1c2f17c1bac66e2",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/05-audit.log": "cc88d23257cf1c0ce0c4682b7f2c2398558dbdbd5aa167a084499110da671d2e",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/05-build.log": "150b500f6af6c22ff8208ef1ed79f7ae9a537841294c82aed242352645185fa5",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/05-lint.log": "393c1893fc4db234374b77644a65e06c1607feacfc1cea1671fbd69aa901c2b8",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/05-python.log": "3e62e2978e27c9836cd0827455dc371e310ce6c62e3a2405c87b2770f9737e6e",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/05-unit.log": "1f32661ac83547ee13e0bd482cae0ffb3d4cf472721c75e4f2c83cba1690b79d",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/06-browser.log": "be20185d752e2712ce704736ed884c158d8380bce8df01ce5ad1e7ea11f9dcb4",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/07-preservation.log": "cab76258d1786ed4bee1902e13ec942f1e0094e34fe297c0df67155c6ebcdbe0",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/08-browser-integrity.log": "3f23c2e8e198915538be52a431c6184a5b80485b6404ec5c2cfc34e2c6a15645",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/09-browser-integrity.log": "9ebfad7584c5d29b72fb72c24ee04eeb8136a838f9818d2373a4a34c4293a70d",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/10-final-check.json": "3aba259014fdcf7e2b18aea66d994540384f571f69ecfd92aa2794d34e99ea65",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/baseline.json": "19e40ee0c329ed973b7eb673dbdf8616938d8aa55336474644ac05f044371118",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/before-audio-provenance.md": "05985b1fce91866c81e74cfd2e0262d126c96e3dcde74025b1784e9f8db065b1",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/before-changelog.md": "22a787f85f10f208d4c6d3a9f36d7457ad7898bb39d12df4236f01ecfef34f1e",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/before-manifest.json": "4f21df1c046e545553319889218c29b3efe0da0d49d45d3e09a36fb7759a617c",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/before-notices.md": "73b3425eeacc9276fc152d28b0a5ea92d21d2ae7dff74361f6d21b3a571c395b",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/before-readme.md": "ad964e1c9d4f339df08fff0c65dcc7f6ccf88f5e8898f8ff8df83b1cf83c7ae5",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/before-result.md": "6baf60ed6fa1c94c08f0c427946c552af9f605d42af07f1734edd8528451eda3",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/before-source-plan.json": "428185e3d58f60c9de1efbeb57dd59e4a308d9901a5b8f0d045456a51ec09672",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/.last-run.json": "91d1c43004802cd49950d78eb11c8fa7d05da8ffffe219a8b13b2f561bc00903",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/attachments/109-versioned-WAV-integrity-2b27561345ca20a250ae4a95a2d6d0debbea1fac.json": "ccc86c0355e3b06a0cf58946b229cda41e3a2cdc2077f7cfcfd36a989dae552a",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/browser-audio-integrity.json": "ccc86c0355e3b06a0cf58946b229cda41e3a2cdc2077f7cfcfd36a989dae552a",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/attachments/109-versioned-WAV-integrity-97ee3b5865219c6147fb1222e703bb461d1d71b0.json": "ccc86c0355e3b06a0cf58946b229cda41e3a2cdc2077f7cfcfd36a989dae552a",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/browser-audio-integrity.json": "ccc86c0355e3b06a0cf58946b229cda41e3a2cdc2077f7cfcfd36a989dae552a",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/game.png": "ce74f9025a8a0d70d9792fb23c93efdd14aaa746e41711d4de4e622b384faf99",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/home.png": "911b923e3a68e8deb0063efd88ed43eb1ed6c597c14bd5b9ee71f6b5161b6d7b",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/results.png": "51d34a4717075e8b516b2f334d6a30affecea776568052cc9ccb9d7518ecbebf",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/game.png": "dd5e533443bace14fc248964570119b7d5eda3c77bd3d924cf9a3914fe23b1ae",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/normal-results.png": "85e8b066ac128239de765f001c3542e6905018f5deaec7abac4a985006fb03b5",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-1.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-2.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-3.png": "fde834aa2f803612ef9cc7a68cea0c8d5a225289a82321ba0a59063d151e66a0",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-1.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-2.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-3.png": "9d198c8b07ea84e9f3d9ebad03831ffd61b98672a9e637e7ee9e9eead959cf28",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/rounds-시작-단계·SNR·3문항-완료→다음-단계·재생-중-종료·응답-후-종료·홈-초기화-desktop/early-exit.png": "47cf4429695d65ddad8d353aaa14dd5edcea3ef4c09c16b537d6a72c3e256533",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/rounds-시작-단계·SNR·3문항-완료→다음-단계·재생-중-종료·응답-후-종료·홈-초기화-mobile/early-exit.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/ui-한국어-제목은-단어-중간에서-줄바꿈하지-않는다-desktop/heading.png": "56fa16aa968018bcc3252168a0c9e7fd3b30d352cb831b29caed75329c96dac7",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final/ui-한국어-제목은-단어-중간에서-줄바꿈하지-않는다-mobile/heading.png": "8ae22f403cacecc1d4e59bfeb1faec5b1be1038f87e1bbd564a9e8b5065c693e",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-integrity-summary.json": "89d3df877279baa9455676d34b6f02d6eb60901caf94f36cf62a7c5b2e6aa916",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-results.json": "6b6e7ca9ced76714090c564284eec12ff6d93b7436d0d5ad3d8f420dd4309c94",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/chrome-sandbox.json": "103ba54e8346c1a65c7274097eb3e50bc1dc7d4916949e038b7e4ab81df38b38",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/collect-browser-evidence-v2.py": "fd0f0d56ee23f9f5c987552d0e1585e585948eff2185b3b28aa3cade2fe09ff7",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/collect-browser-evidence.py": "a7486722e7ff1b3048b716aca8ecdf60f2f9c0d79e9334af80fde621abbaa732",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/desktop-audio-integrity.json": "ccc86c0355e3b06a0cf58946b229cda41e3a2cdc2077f7cfcfd36a989dae552a",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/desktop-runtime-audit.json": "c03ec00f07f69455add8cdc404e8e4a972c511ed46059648a2a222199ec8a3c9",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/environment.json": "3ed6931c7a4aabb4ec546b5b12ddc722ccf855e689c815c3edc76194880660f5",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/finalize.py": "337f4d94da0c37240a00f08613dc510db89569869204953ada6b4ee5f3d7b73b",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/mobile-audio-integrity.json": "ccc86c0355e3b06a0cf58946b229cda41e3a2cdc2077f7cfcfd36a989dae552a",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/mobile-runtime-audit.json": "a266a21e4ec98d4c222cf2e416c705477f1698ab6460a3e9e8aa5a0f6162b129",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/npm-audit.json": "ea7bab3cc606a95eecdf538b0d02d3cf928bf0f3a1cfb1d2c8ddbe02846d5658",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/preservation.json": "cba79ba89a441a4172e534571ba878aaa14c8198060c51b0b45e77b0c7974b82",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/regenerate.py": "002b3ad51495d210b4bb66c2597141c28a18d11339bf806379fe5ee1be88d724",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/regeneration.json": "302a6ffb0ef85f009974db421a82297f93a5af261fa58af47b6c47fba85a59ea",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/run-browser.py": "da307521c9c533331ecd7d6ac08bfc738717c4bbcabe74c9e31d29e8ea626603",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screen-final.py": "49dbb095773ba4d66404a7b15c125e799ce43933e1f21bbb77183dfb74ffa5ed",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screenshots/desktop-early-exit.png": "47cf4429695d65ddad8d353aaa14dd5edcea3ef4c09c16b537d6a72c3e256533",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screenshots/desktop-game.png": "ce74f9025a8a0d70d9792fb23c93efdd14aaa746e41711d4de4e622b384faf99",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screenshots/desktop-normal-results.png": "51d34a4717075e8b516b2f334d6a30affecea776568052cc9ccb9d7518ecbebf",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screenshots/desktop-start.png": "911b923e3a68e8deb0063efd88ed43eb1ed6c597c14bd5b9ee71f6b5161b6d7b",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screenshots/mobile-early-exit.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screenshots/mobile-game.png": "dd5e533443bace14fc248964570119b7d5eda3c77bd3d924cf9a3914fe23b1ae",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screenshots/mobile-normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screenshots/mobile-start.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/selection-context.json": "2b1756533ad8f78f903162e16d0cba4eb5f0ba3fe386758bdac28fd5231641c4",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/validation-summary.json": "dab632d4d2937b79426d9b95ea2be48c7e289c2713fec6d965082a9ced02a9cb",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/verified-files-sha256.json": "695754706bb6bd80a33bfc0732929248a10a5f1f971cd0e4372ad47b4e9c1a87",
".agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/verify-preservation.py": "8bb8b409422cdb330cd9571a89008d8a6243dd800238c479d1c420ab5dae2ae5",
".agent/evidence-v0.2.3/privacy-screening/screen-final.py": "9aa0912152952179f0a541e7dfb06a893114a2d5361e266fd24fff567fb60183",
".agent/evidence-v0.2.3/privacy-screening/screen-with-vad-json.py": "b2d7d4075b56f6d2bcd40966ccc0d787f20a5fb7b9322d9d0547fe1915a909eb",
".agent/evidence-v0.2.3/privacy-screening/screen-with-vad.py": "14431705ea1fe016601377ffc481037257a9449fd00b4dc664ca12616d086d27",
".agent/evidence-v0.2.3/privacy-screening/seek-diagnostics-followup.json": "c7b2a73048c2e4c1b20bddfda2a165bbaddd3896e0d63d959f6d37733a53b847",
".agent/evidence-v0.2.3/privacy-screening/seek-diagnostics.json": "f4ee88bf21a717c0020cd8b79f769c590c0ff3716e4e75038ce618f1b6440dba",
".agent/evidence-v0.2.3/privacy-screening/validation-summary.json": "71d674ecbf115814feb21e93083c97a49067e280e9f5be700f1396e69ac8af43",
".agent/evidence-v0.2.3/rain-download.log": "701d47a1c31b5232d682641f05d71c01dc908b03b58ed1bc270a27ba9b32fea0",
".agent/evidence-v0.2.3/review-fixes/01-ui-GREEN-02.log": "b64774bcb477aa04981b81d7764760202d0d3be110eeaa557623c3e519f9f157",
".agent/evidence-v0.2.3/review-fixes/01-ui-GREEN.log": "ea5aff1ded1cd2dbea86f7d9e7aa7b0d69770706c98f3786722709d99aa9b5ee",
".agent/evidence-v0.2.3/review-fixes/01-ui-RED.log": "b0323edc4c9c13fcfd373185bd09f469b2d182fe0f4fb57cb504c228fca575b2",
".agent/evidence-v0.2.3/review-fixes/02-browser-GREEN.log": "1ae7f17b05363b418f42199c27d940cd5441a7e933ea6b069ee7932b89145662",
".agent/evidence-v0.2.3/review-fixes/02-browser-RED.log": "f8a13650707bfe2b40458eb315f481cd61a3e5289f4b7aa0a4c59a3fbcebaabe",
".agent/evidence-v0.2.3/review-fixes/02-progress-pixels-GREEN.log": "66a53270ec9e2a28a07ba3883156085399c1a55959c3e8bb0b4a9c26648e1f46",
".agent/evidence-v0.2.3/review-fixes/02-progress-pixels-RED.log": "f6b7cec9c22947edc85b438ea6852884a6a6851f40c0fbd53371839942bc97e9",
".agent/evidence-v0.2.3/review-fixes/02-ui-build.log": "f147abc7cc99e466f4fb5d7414db343e8d3bb032c14ed85b8f4e85e98b83146c",
".agent/evidence-v0.2.3/review-fixes/03-voice-inventory-GREEN.log": "e37b30669c6e20a575cca867cdb5e0526e1152b256a8d6e63c37c6186da48e49",
".agent/evidence-v0.2.3/review-fixes/03-voice-inventory-RED.log": "dad1ecd96671351fc95b481609a1eb2b124e377875813839e26da87cb781be60",
".agent/evidence-v0.2.3/review-fixes/04-source-plan-GREEN.log": "f0186fee755ec5a6de817f1624ce3bc183c5869e052340980e0015baeef06951",
".agent/evidence-v0.2.3/review-fixes/04-source-plan-RED.log": "24e5cc322d42d76c16e203527ef26e8b7b3da527da6f474078cd6ca23e8cb49a",
".agent/evidence-v0.2.3/review-fixes/05-source-guard-GREEN.log": "02c54871fb1cfb26ea95314dfdc4fe8fa6faaaf6a7e19a2c0fb67a75ee0dd204",
".agent/evidence-v0.2.3/review-fixes/05-source-guard-RED.log": "d0be14c43c6dbf4227b31721f6cb5ac66483759e4bd8da59f01b1df14b08d30f",
".agent/evidence-v0.2.3/review-fixes/06-atomic-GREEN.log": "26c5dd649f0c0f479b42ba74f0e9cce2fb859f7e6b5823b4a02771fb7074d12f",
".agent/evidence-v0.2.3/review-fixes/06-atomic-RED.log": "991397dd9a5f32440286f2bb6a3700b9c58668ebfecceffab0caa7164f69dc38",
".agent/evidence-v0.2.3/review-fixes/07-notice-path-GREEN.log": "fcd49f3a5c9808120843e11fcb229ff7fbb12c7280e27ef6a0632357ea05dd34",
".agent/evidence-v0.2.3/review-fixes/07-notice-path-RED.log": "183bc30494bd1469cc06715835bff326b7032c6c9fb66ed737d7442acf07ac78",
".agent/evidence-v0.2.3/review-fixes/08-09-build-GREEN.log": "1a5db16769387ebbc54c55f62a78b28b5fd29cfdbcc4d480468386b0e11cac87",
".agent/evidence-v0.2.3/review-fixes/08-notice-verifier-RED.log": "854524d46b7eb1c21e9ca71b60e6521c81f8cc5f9d88fef3c3d5c43a0a4f7604",
".agent/evidence-v0.2.3/review-fixes/09-build-plan-RED.log": "90c91a0fbe5e1e94ea6d0038e5e4a8d03b9a3d6b1351732b5fdc57e136560166",
".agent/evidence-v0.2.3/review-fixes/10-atomic-additional.log": "111dc0d42b1ce8bc943e8f703e299dfab403dd404a052b71d2f98135c0bdda4f",
".agent/evidence-v0.2.3/review-fixes/11-audit.log": "a04f4ab13e5181be11c7873e3049d1261dd797289ac0fcb1d91717a851eb51dd",
".agent/evidence-v0.2.3/review-fixes/11-build.log": "eb8475c95e82d05326e49e21a456a55a8a696614a51a42df069f483fdadbc834",
".agent/evidence-v0.2.3/review-fixes/11-lint.log": "72a25d6d1240a619ca103674b65757f4932f3001927ffd196789a6485045a947",
".agent/evidence-v0.2.3/review-fixes/11-python.log": "e8e018fc7a14b6eeece5f2b88da0b36bbdd6d351fcced327acbf06e1b0e11e6c",
".agent/evidence-v0.2.3/review-fixes/11-unit.log": "dcbfe3302e8e45b1b3a1a5c1e5edf107349427ac57fb0292a78cb217142eaaa8",
".agent/evidence-v0.2.3/review-fixes/12-browser.log": "67f709fec8bab3b19fcbba0f04f919cf784cbb4fd1ac508f4f704835787c1481",
".agent/evidence-v0.2.3/review-fixes/13-diff-check.log": "c39401a8c3e072c068daf658cbf95a8518a8186cb92da02cc6ac067de4ee0b6c",
".agent/evidence-v0.2.3/review-fixes/14-final-review.log": "0f2c5d1943a3a8c3d3cc02d2cd5d8c70c2d3b2ef080ec81fb839edadb47b6b82",
".agent/evidence-v0.2.3/review-fixes/baseline-sha256.json": "3e59389b32cdeafc2dcec3cb846a1d141d13935e09ea23c49a8fa119c1444704",
".agent/evidence-v0.2.3/review-fixes/browser-final/.last-run.json": "91d1c43004802cd49950d78eb11c8fa7d05da8ffffe219a8b13b2f561bc00903",
".agent/evidence-v0.2.3/review-fixes/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/attachments/109-versioned-WAV-integrity-7406877c173ee35afff758c9c5f1645f0dc02fa5.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/review-fixes/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/browser-audio-integrity.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/review-fixes/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/attachments/109-versioned-WAV-integrity-9b9f8223b6524087ac395eb7a96ac0d386fbcb95.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/review-fixes/browser-final/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/browser-audio-integrity.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/game.png": "17c22581f74ddcd78770ebfbb75f0041298baab336c17cd5b37ff5e29b8b6a7d",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/home.png": "911b923e3a68e8deb0063efd88ed43eb1ed6c597c14bd5b9ee71f6b5161b6d7b",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-desktop/results.png": "51d34a4717075e8b516b2f334d6a30affecea776568052cc9ccb9d7518ecbebf",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/game.png": "13291f8ba632d1962611e25c99f73fa3d7732f7b8ef3a9222a5ddd5082576353",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-실제-오디오로-혼합-모드-완주·레이아웃·접근성·외부-요청-없음-mobile/results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/normal-results.png": "85e8b066ac128239de765f001c3542e6905018f5deaec7abac4a985006fb03b5",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-1.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-2.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-3.png": "fde834aa2f803612ef9cc7a68cea0c8d5a225289a82321ba0a59063d151e66a0",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-1.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-2.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-3.png": "9d198c8b07ea84e9f3d9ebad03831ffd61b98672a9e637e7ee9e9eead959cf28",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/review-fixes/browser-final/rounds-시작-단계·SNR·3문항-완료→다음-단계·재생-중-종료·응답-후-종료·홈-초기화-desktop/early-exit.png": "47cf4429695d65ddad8d353aaa14dd5edcea3ef4c09c16b537d6a72c3e256533",
".agent/evidence-v0.2.3/review-fixes/browser-final/rounds-시작-단계·SNR·3문항-완료→다음-단계·재생-중-종료·응답-후-종료·홈-초기화-mobile/early-exit.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/review-fixes/browser-final/ui-한국어-제목은-단어-중간에서-줄바꿈하지-않는다-desktop/heading.png": "56fa16aa968018bcc3252168a0c9e7fd3b30d352cb831b29caed75329c96dac7",
".agent/evidence-v0.2.3/review-fixes/browser-final/ui-한국어-제목은-단어-중간에서-줄바꿈하지-않는다-mobile/heading.png": "8ae22f403cacecc1d4e59bfeb1faec5b1be1038f87e1bbd564a9e8b5065c693e",
".agent/evidence-v0.2.3/review-fixes/browser-green/.last-run.json": "91d1c43004802cd49950d78eb11c8fa7d05da8ffffe219a8b13b2f561bc00903",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/normal-results.png": "85e8b066ac128239de765f001c3542e6905018f5deaec7abac4a985006fb03b5",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-1.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-2.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-3.png": "fde834aa2f803612ef9cc7a68cea0c8d5a225289a82321ba0a59063d151e66a0",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-1.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-2.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-3.png": "9d198c8b07ea84e9f3d9ebad03831ffd61b98672a9e637e7ee9e9eead959cf28",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/review-fixes/browser-red/.last-run.json": "78fe937fdabae861b58404e69d2faec459c97fbe435f74222101037f0b9a3315",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/error-context.md": "fa4b05c6fb8ec98c57ff96e2f0d568aeb7ed027d8763712e767e50e13b25b31c",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/normal-results.png": "d3caf1e2d8625d6020e1e9061143b38843fa5698e7316b65a73569cce6026b73",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-1.png": "e4f413e3dd1379a913a1d94ec5f084f607a80fe375382eb74cee2ac515aa8590",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-2.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/progress-3.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-desktop/trace.zip": "f415eaae383b21d1fd059b3f99b2a1ec962a34facd2959406985e08710bf7a54",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/error-context.md": "1a289b42d134b84701446f0bfe2f1e462121412930595617023c1cf93e2e0c40",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/normal-results.png": "5eccd53853c27a7c1385f1219b0a9bb7af60070fbdd1469ef3265e40377f3eaa",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-1.png": "3597007bfc13a2a9dcb9477ce836b68cccb78f55957f1f460431b67fe90e0f13",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-2.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/progress-3.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-실제-진행-막대는-현재-문항의-1-3·2-3·3-3을-채운다-mobile/trace.zip": "022a0078453d25254bb6bb4af59fbd3696abd5acaaee750343adea3cd9b8aa0d",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-320-results.png": "b1dae69c908b9911d536d3e41553447bc71908a035f28bbc1f885d1def337b92",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-home.png": "c04abd43e93e46fde7e1591bde24a3073d584226e93ba5661bac1b5cd78a4695",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/copy-360-results.png": "5e2ef07c6c3b7672e0aa82f248a5a245d60a10f86633fab2b2dd45ecff81d7fa",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/error-context.md": "d186519b7904a6ef3096e49c18e5e410528df127a7de409e237e7571d8a89f1b",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-desktop/trace.zip": "6d2abede66a4b0784accca9a0fea36ea71cabb138855e84343a2cb7f64cdab71",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-320-results.png": "b1dae69c908b9911d536d3e41553447bc71908a035f28bbc1f885d1def337b92",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-home.png": "c04abd43e93e46fde7e1591bde24a3073d584226e93ba5661bac1b5cd78a4695",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/copy-360-results.png": "5e2ef07c6c3b7672e0aa82f248a5a245d60a10f86633fab2b2dd45ecff81d7fa",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/error-context.md": "d186519b7904a6ef3096e49c18e5e410528df127a7de409e237e7571d8a89f1b",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-리뷰-한국어-모드·결과-어절은-320px와-360px에서도-갈라지거나-넘치지-않는다-mobile/trace.zip": "8ced8d12bbceb962456728ce1e2fe7c687503594ab0e14774f13368705b3ac6f",
".agent/evidence-v0.2.3/review-fixes/browser-results.json": "81cb42ae097d36878f0263e41f3a9e4fb2f5f2394d4331332517818b434ba521",
".agent/evidence-v0.2.3/review-fixes/chrome-sandbox.json": "915067209786cb6fe2c83e90fb8f9d9d9b3f7af876786819a9a54ee6a96aab6d",
".agent/evidence-v0.2.3/review-fixes/desktop-audio-integrity.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/review-fixes/desktop-runtime-audit.json": "61b9c48518a9cad75f53b8084ddf18910d6e028b2c8696cdda338a37f5bc283c",
".agent/evidence-v0.2.3/review-fixes/environment.json": "924a9c62b6f0da242b09c9374f6e9f5ef75b09a5f7c0eb8776ad1e701b31436e",
".agent/evidence-v0.2.3/review-fixes/mobile-audio-integrity.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/review-fixes/mobile-runtime-audit.json": "9059b42becd1dc1a3923053a5792c83ca9574f185b9a82c1cf1f6aa48296a055",
".agent/evidence-v0.2.3/review-fixes/npm-audit.json": "ea7bab3cc606a95eecdf538b0d02d3cf928bf0f3a1cfb1d2c8ddbe02846d5658",
".agent/evidence-v0.2.3/review-fixes/preservation.json": "5057edde3be25fb79d8dcbcaf54eaee315f40b4852064fc6509814da2e70b7bf",
".agent/evidence-v0.2.3/review-fixes/screenshots/desktop-early-exit.png": "47cf4429695d65ddad8d353aaa14dd5edcea3ef4c09c16b537d6a72c3e256533",
".agent/evidence-v0.2.3/review-fixes/screenshots/desktop-game.png": "17c22581f74ddcd78770ebfbb75f0041298baab336c17cd5b37ff5e29b8b6a7d",
".agent/evidence-v0.2.3/review-fixes/screenshots/desktop-normal-results.png": "85e8b066ac128239de765f001c3542e6905018f5deaec7abac4a985006fb03b5",
".agent/evidence-v0.2.3/review-fixes/screenshots/desktop-progress-1.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/review-fixes/screenshots/desktop-progress-2.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/review-fixes/screenshots/desktop-progress-3.png": "fde834aa2f803612ef9cc7a68cea0c8d5a225289a82321ba0a59063d151e66a0",
".agent/evidence-v0.2.3/review-fixes/screenshots/desktop-start.png": "911b923e3a68e8deb0063efd88ed43eb1ed6c597c14bd5b9ee71f6b5161b6d7b",
".agent/evidence-v0.2.3/review-fixes/screenshots/mobile-early-exit.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/review-fixes/screenshots/mobile-game.png": "13291f8ba632d1962611e25c99f73fa3d7732f7b8ef3a9222a5ddd5082576353",
".agent/evidence-v0.2.3/review-fixes/screenshots/mobile-normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/review-fixes/screenshots/mobile-progress-1.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/review-fixes/screenshots/mobile-progress-2.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/review-fixes/screenshots/mobile-progress-3.png": "9d198c8b07ea84e9f3d9ebad03831ffd61b98672a9e637e7ee9e9eead959cf28",
".agent/evidence-v0.2.3/review-fixes/screenshots/mobile-start.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/source-reverification.json": "f92d3d9a6d613eb7432b59c5587f39be4c23090566ae0f01bd0bd2fe2d25feaa",
".agent/evidence-v0.2.3/review-fixes/verified-code-sha256.json": "3002de6366d74baa493d28fa1009b04c09926d379d67da44e077cee3f6ec93cd",
".agent/evidence-v0.2.3/secret-scan.json": "8928209f4e2bef083901f845ae3fd8e949c0a266cefa15ff4563eef337a008d2",
".agent/evidence-v0.2.3/source-downloads.log": "c49692acca2fddc1cdbea155ef0ae6191a9f7eeee3508d3bf608a71bec349e46",
".agent/evidence-v0.2.3/source-integrity.json": "61c080d80081a3fdc9b2c78a4183805df6293184add2bca9534aee8d82bd5b96",
".agent/evidence/01-content-green.log": "5585acd257b49225218835acd69a1d240c7737d12dba62949f31a5b7c1c9ed2a",
".agent/evidence/01-content-red.log": "0f28fe2ae2c4669a52ba2fc15bfa6285e4922474dc2b2571098b522679948e12",
".agent/evidence/02-game-green.log": "5ca5895f8a09f4e9de7a846bf9ab37fb3715623e8e7654dab095505c097fc0c7",
".agent/evidence/02-game-red.log": "78468ee5c25c1685f3613926f636b6fb4569227533feda3547afc6b8123d6452",
".agent/evidence/03-dsp-green.log": "d3d08683a1426b845a2e987572861b82b3ac978b8c352991950c0f32a473d3de",
".agent/evidence/03-dsp-intermediate.log": "084a52294f718718256eb1516048a672d045a5f7dcb5d11c646092d29efbab58",
".agent/evidence/03-dsp-red.log": "bacf42e5c808d32702b9bcd30523d1fcf17d5ff75b281233d9e84f33b6e42589",
".agent/evidence/04-audio-green.log": "d48c93fa7d32315ed4f719dee19222e7398bc4c4bceb8cf345e0e221a9ac89d8",
".agent/evidence/04-audio-red.log": "58bbf8eae572f83e408dd101eac738a5f6963550e21c8265f42a7eeba18be7a7",
".agent/evidence/05-assets-red.log": "04388acb098f7dabe9a35783b496075ee7c39757d3fde5361c9ac080188ac371",
".agent/evidence/06-ui-05-assets-green.log": "ced2ad738cda673b24308dcb9d99d59e3ae918709eeb32de359d6ab1022133e2",
".agent/evidence/06-ui-intermediate.log": "3295b3ae691dadb8feb7f0aaf604a1aa56cbfae27b5dbdd486cb5645f5edabe9",
".agent/evidence/06-ui-red.log": "1f1ed6bd440af22f5abf59e4be194f969bee1d115d436a155d879d8cffddb747",
".agent/evidence/07-build-green.log": "ec98087d20a68c5b81c6c23406316f1e5f19c6124498e1fc005d04bb78894a57",
".agent/evidence/07-build-red.log": "138802de7bc67c1535668efe7a915424a70d5d7994acb7f366a139e89c1da77f",
".agent/evidence/08-rule-green.log": "91b7ce3fda181fbe51cbe4e6debb61dd44dd55226dcfa81ed73559ba76811f3f",
".agent/evidence/08-rule-red.log": "2cc1854cf6a4b9e8d53a7a36b1dde1fb6c6970b89f841b9e8f404e6e42bb929e",
".agent/evidence/09-ime-green.log": "e5d5d1cfa2b6db724ded97d5f3309a517bcf637d9b2b417e9110dc9da0a48d72",
".agent/evidence/09-ime-red.log": "10e5f9f99609044c768cd338df0d574a06a7442e0debe0e61ca16a6b5873adf3",
".agent/evidence/10-ime-reset-green.log": "e12761b3a2814a79d1448e7452474a086bf371921287718eb72dd9b0f6b8fc82",
".agent/evidence/10-ime-reset-red.log": "f6cb7c1724b8f9c410385e9970051577c03527fb7e719f43a77c967ca08ef18f",
".agent/evidence/11-provenance-green.log": "54dcc417b97f82422c5c3e0ae11caa1f15a60412853ea1dc0152d15031bcd935",
".agent/evidence/11-provenance-red.log": "e69fa7989223e659c16b8030f8668e562ad5b0daa060fbb1c9eff41a37fd56fd",
".agent/evidence/12-ime-replay-green.log": "a93d9f16c7d81ed5e9a7c0b70ffee1e393d2943ddf3149a5bb115c5517327c44",
".agent/evidence/12-ime-replay-red.log": "8cf5dab06d93cc544c21276ee633829f8b137b4b6d7c5fe47aadcad6fc2afb71",
".agent/evidence/13-heading-build-after.log": "19829ac264f97aa023baf7d5e1fd429343272f3bd952e8b6dfb9eec0f594b453",
".agent/evidence/13-heading-build-before.log": "646d197d2ef93c19fec4719e20297de1b22eff54f3e6155ba2125fd3dd372c46",
".agent/evidence/13-heading-green.log": "d59fa8546083e9d371c7a552287f27bf3acd572bd0cce3da8eba860da5c05880",
".agent/evidence/13-heading-red.log": "33acc2838786a87b8ecc170a1ac0a9d7521daf8e5b9aed2195e76e45ea327f76",
".agent/evidence/14-snr-browser-green.log": "fcb82296e9af4b96112fae0bbb77c6ba41230c117021243e85916ae1130a462d",
".agent/evidence/14-snr-browser-red.log": "36298e5bb1f45a69b0ca75e5cbce85ee1455c4485759670268fbbcf55bacd4d4",
".agent/evidence/14-snr-build.log": "1e9ce36a48904a58195f9d1c2d9ca6cf2895fcb8bd0b5ab9b72f76e92c6b2585",
".agent/evidence/14-snr-green.log": "ae74e57cea20841299a8c1ee5eaf60efad34bda697339f45527cdec83578e6df",
".agent/evidence/14-snr-red.log": "b39bdbd8815d0d9cfcedc41c61124afece2011ea6c6c250b0ee0139eae7e9edd",
".agent/evidence/15-volume-browser-green.log": "aeccd5f13eb9db4062cbf2c70eee332d0c39540d580e113d0a79a899b2ef02de",
".agent/evidence/15-volume-browser-red.log": "84954280c1729703f9e9c2680c8933c3b0752b19fb9c3562e7dbf2ea1b4a548c",
".agent/evidence/15-volume-build.log": "2767b794124804b3447f529eef025e2530975fcc506e1cbe8994acf8243e6ba8",
".agent/evidence/15-volume-green.log": "0f9a90923f4fdc477c8f2436653eb2bf0e4b251bcb52e795701309ba14f23c7d",
".agent/evidence/15-volume-red.log": "9beae6305080cd0d869bf3fd2093beb6e2e25e5424223aa7e4ad4db96954f37e",
".agent/evidence/16-copy-green.log": "dacbdbab5d4af2b6e19eb4e0502a70720aac9fb6cf3b9d6dfdc73a5bf7edabfe",
".agent/evidence/16-copy-red.log": "ebe3d7c86938d33d7f1a4818b18c7e94ab8feb18bee099fcb535a93d8083861b",
".agent/evidence/17-spacing-green.log": "8ab85362ceadcdfecf4f7b1e95abfb4237e15018692e14f937be90265c351b11",
".agent/evidence/17-spacing-red.log": "12db8083cd8627a81a52cd32358780a3c2257cb3bd702350b190b39226f6550f",
".agent/evidence/18-literal-green.log": "878a8d788a8cedbf652fe0e819fe482099249a52ae7b5cc3d8826e64b32c6377",
".agent/evidence/18-literal-red.log": "ad23ae7be3d9aab83907c12849012a01f9d1b12e5a174c3acede89817a74d2d2",
".agent/evidence/19-notices-green.log": "efc51aca0738f3cb5264ec3c3ad0d17bb150d685f5fdb5e200bc1eedc0e3c02b",
".agent/evidence/19-notices-red.log": "8f34c583cb8563803828d72fe56622d84bcf59a9541d983d6c0b705225955794",
".agent/evidence/20-audio-generate.log": "f864fc266f7ca50c600457399f198a77949e9ee1601b0d2fc19b64942a2030cb",
".agent/evidence/20-audio-green.log": "edb9b9f0aa1af11835960eee9bb6e8c013341aa528d2857bac0b89ac38457528",
".agent/evidence/20-audio-red.log": "c1cbd5b585e8a70e23b88bfcee0c6479f85fdec0d1e06d13c81c689a140c0ac0",
".agent/evidence/20-mechanics-green.log": "9776c68143f668e35df8b2e19884b25d2369e4800b4c264e635d0c260818c5f1",
".agent/evidence/20-mechanics-red.log": "d25a1c844366e14fe1db9bb7c243fe0adb6857ee5b4548cf2865de96589af647",
".agent/evidence/21-node-green.log": "3c36e9e45b6844ae2c184f943b61195482d9de53ceab06221093c8281d210d73",
".agent/evidence/21-node-red.log": "ee25556037bdbd6b099dbb087a522284e8df00bd573dfcf0e42c734e31e09e84",
".agent/evidence/22-sandbox-green.log": "e8a1a17e49c22dea81d7f85111c744473427466791ddeda75047cd0082e7faba",
".agent/evidence/22-sandbox-red.log": "c8a97270f0f68367d6edb3e5ee10f34bbda1127f8dae2c5639afd482198e7bcd",
".agent/evidence/23-delivery-browser-red.log": "180a61bbacf85db9e52f721b50da683103b719bc350454cc99d4c8954b2ae86e",
".agent/evidence/24-retry-audio-budget.log": "b9241872b4ecd80265df4c6c2be90b31e9de4d0754772655e50b7fb4f05e2d3b",
".agent/evidence/24-retry-final-browser.log": "68029aae89adf86fd60ee56a20a1e2f769cb4f894f27ae23963ca5b5b58c62c4",
".agent/evidence/24-retry-final-build.log": "702c20554872e437137097ca59a80d911188477f018bc48c4b49a770b73d5a84",
".agent/evidence/24-retry-final-lint.log": "8682ca1f55e3ec58f13321cc339c8647ef72c1934d74ea9b980aee717e528819",
".agent/evidence/24-retry-final-test.log": "b71bb1375a039bcc3d7b3c5070da85ece3551f32ae1b8bb3a2abc5ef1edd57b8",
".agent/evidence/24-retry-integrity.log": "a188fe54dce05f6caa868b3d9f2c22a852f6a8cdc462355673316578be623a08",
".agent/evidence/24-retry-targeted-green.log": "4e53f2de988040540f5075b2e4a483ca53b671486c35e864fbc3c2c9c5361c61",
".agent/evidence/audio-reproduce.log": "5f5726f3ed6845882c7a6d6f9a8d898c2b73bf61fa6328e8bbafd25f61ed4268",
".agent/evidence/browser-final.log": "9273c91613160e239027452894b3735f9657ccad97a52412eb889290aebd5adf",
".agent/evidence/browser-first.log": "f3087028d76aae36d61d7a14da488bd809079a9e121a2d8fb01fa034f99d4f05",
".agent/evidence/browser-second.log": "2ff1d16f51b9384cf431d5923ad87d773510fe4b89bdf62f09cbda2efae20e3b",
".agent/evidence/browser-third.log": "1b6c264930da8934e7f1c8da6c998543f35e68b1c3159dad722cfe23a8e5244c",
".agent/evidence/changed-files.txt": "2b609231e5c7becd581f79413a4f7443312e71f0099ac6a51b2c5f0dfdee576f",
".agent/evidence/desktop-game.png": "42702e89264357257db8bf54c2b3743e3212e62cfd3476a8c25bad83fb59ff81",
".agent/evidence/desktop-home.png": "bf2f515fcd483cd5ca9a3b408f484d3556b75b1be0bb70360b7fd5f7c3404993",
".agent/evidence/desktop-results.png": "003df3aeb08ce66618775377d9b2003809d696629f61cf54b7b86e7a0ed63593",
".agent/evidence/final-audit.log": "6d8c5c8f3d7684adb070417bd608d01ae90aa3dc26a65af03ffda4955f38d9a3",
".agent/evidence/final-browser.log": "5855691def462b23667a9d658338a0458a53d984b5b5f7e11b45f9a63092abcd",
".agent/evidence/final-build.log": "565a95a51a10f78bc08f256755afce5ef183440dcdea5e75b3aefde8d7c5b837",
".agent/evidence/final-lint.log": "d2354c241320f11f07890cbf32f99a5d88f1c7f4f236d860e2cd26db739badd8",
".agent/evidence/final-security.log": "c585566624a4596e97327fb1864b1ac2a3189c0794b1e25a9d6ff1abb86046cb",
".agent/evidence/final-test.log": "af03027cb22a090ecd107c10e3fc7e2f9ceb394122b0b73caa7d362310504170",
".agent/evidence/mobile-game.png": "20a3f02f70a28b2faae1b33d0d4d6fea10b77caa426e4bf9faa5ef6d4474a846",
".agent/evidence/mobile-home.png": "7f84bd54183fcdd03fe136b41145146ddfb323041c96a8b9e6b670c9a923033a",
".agent/evidence/mobile-results.png": "ec2938c03ac03da8e33e25f043522b317b60c16be1c29f9dd325a81ae84513a8",
".agent/evidence/neo-before-spacing-browser.log": "e5c214f14bd93ef1bb731f87ecfd3a02d299c9f9e5a788233f6eda5eb8946b4f",
".agent/evidence/neo-desktop-game.png": "f5966688ba46f14fab5125452f935e55f6e6dc4355c876416729866129daea70",
".agent/evidence/neo-desktop-heading.png": "db609f2f54af0e6b1bb96bce9bf839454403d6e2787e6520a2928fad31beb021",
".agent/evidence/neo-desktop-home.png": "826c5da794c4ea3c15bd6c13e81d1c021fbeb8a902fc4908b78f9c457f091c0f",
".agent/evidence/neo-desktop-results.png": "98a68ca050a4e66c17dcc3f1bd5f0e86bfc88c2ebe9a75284766d17e10426632",
".agent/evidence/neo-final-browser.log": "582e7cbb643201e4b197b566b021322448abaae0b383967ad0e816d0c351e96b",
".agent/evidence/neo-final-build.log": "f30138e53b8c12e70e80e2cd5f4bdfcf8d1f6a095216a4f9ade6687bca1f0488",
".agent/evidence/neo-final-lint.log": "d2354c241320f11f07890cbf32f99a5d88f1c7f4f236d860e2cd26db739badd8",
".agent/evidence/neo-final-test.log": "f718e2acda255fcba67b272c7fa625af450714b384bb67a72f09328bf6964f0b",
".agent/evidence/neo-intermediate-build.log": "9d8a1f0586d58196e03e45330b6e8ff5522fdd3c27870aae2fb052199f8cf5cb",
".agent/evidence/neo-intermediate-lint.log": "5e94ea847c3a092f4ff8e97ac5b61ebef805b3c859ad38461f4a437045d1b5b9",
".agent/evidence/neo-mobile-game.png": "1a6733a3293204e4841ec8722a1ffe37033943097c691bcfadbcd907fde024ef",
".agent/evidence/neo-mobile-heading.png": "ae07d0a1cb6f835525c7e0ef31655a543eaa9e10183596c2d409dead6faccf15",
".agent/evidence/neo-mobile-home.png": "9b3ba8b0a9f7b321882429e31ac4a0472fcc13a998dfadfc930c273bc37558d4",
".agent/evidence/neo-mobile-results.png": "d49fdf6ae9566d7a2003db3f252d84ed88ac4d73a0390ce404b47e7bab9c60df",
".agent/evidence/release-desktop-game.png": "7300a06a507f651a587ed3deb36cc5bb728f4a36c30b7b1cf409a3b209ba564c",
".agent/evidence/release-desktop-heading.png": "de454d77e29737e23c573646404489d5682004521deabfa01b439d607faa32ca",
".agent/evidence/release-desktop-home.png": "f28f744e11b66373ee8db6eda2f7bdc384da4f7e763fbb467a4cda30090e869b",
".agent/evidence/release-desktop-results.png": "2ebb4056d0ecdadea8a3469500801065ae158c17cd2db27817e813e53adc71f3",
".agent/evidence/release-docs-final.log": "3529acce5befee536ec7d8e9d22cbbf27182297bb07408ab6e31551aaee76ed3",
".agent/evidence/release-final-audit.log": "6d8c5c8f3d7684adb070417bd608d01ae90aa3dc26a65af03ffda4955f38d9a3",
".agent/evidence/release-final-browser.log": "2a9881cef8c379f41abf5d69dd5ad21881988f78c0579c95e463121dc37f6e09",
".agent/evidence/release-final-build.log": "3fba8356382341db9c562d985ca2229fd0b81969532746b0146bc489d54c321e",
".agent/evidence/release-final-lint.log": "d2354c241320f11f07890cbf32f99a5d88f1c7f4f236d860e2cd26db739badd8",
".agent/evidence/release-final-test.log": "46d5d0fc0180adc00a734b64db4acb4cbaa37d12567d0224836306312213870c",
".agent/evidence/release-format.log": "57658c36cb3161b53cdf934017e4b7a733a273509ace184e0a2a6eaa046c742b",
".agent/evidence/release-integrity.log": "cc77121b43a6b24a358999cf1a3bbf701d467fcee9730095f318303c2e80602b",
".agent/evidence/release-intermediate-lint.log": "ee597e984ebdf11ea247c8cb1551cda446580cbd7a3dc708f85fa78bb72700ad",
".agent/evidence/release-mobile-game.png": "83a918e5ff2142e540cd12b85806b3e69a71bc66df5d241f4b2f5abdaf493f82",
".agent/evidence/release-mobile-heading.png": "d5c92a3b62f749d5f064af12efa5a1a2ad13b177270ec01dd10a549a8437899d",
".agent/evidence/release-mobile-home.png": "c7fc37a247bbadba60de9dff3c8d87930a2e6ebb868f687a4135b3fd035ed1c3",
".agent/evidence/release-mobile-results.png": "587956c9ad5eca054e4bb4b44748a2c637655e407427ba5b4c6ad7bf5a74539a"
},
"voiceWavs": {
"public/audio/correction-apple.wav": "ccd7327a3fb54d3320d049ffdced3bc17595861cee69429c0ee97182d454195b",
"public/audio/correction-furniture.wav": "5c004a7b2f5a4a918c9f689f1a2dcb219a620ed14313f40a9655b36dbf64948d",
"public/audio/correction-hat.wav": "f9f98c91cfbcfcb106eef7d5d3795a9cf3c3aab7e19a60f13d7dffe284d19f86",
"public/audio/correction-market.wav": "b8d25b867497adcd0fe7c8b6a8a8d2e7a52965956738a83e53f58735708773f9",
"public/audio/correction-meat.wav": "48e91b3932d3798e852041a854b3ee08c72127e092c62083a47af6b99adff241",
"public/audio/correction-oil.wav": "f6eff0cdddcad9790351491e60c53cb2a70d222033a583652f2de0b8cd6abcc7",
"public/audio/correction-sea.wav": "9233431d78ab4b144e3c33ad0cf0d49fc0fb91b29514343230ba32987b794bb3",
"public/audio/correction-sound.wav": "5a603bc69979603afddcaeb6edf500a7c540b72405daeb33f5335d746b327da1",
"public/audio/correction-tree.wav": "b8e8bbe6b8b14727efd953fae9d4aed2caeb004055d52f611c6378322847edbe",
"public/audio/correction-umbrella.wav": "92b54f04884ab915783945077efd8f3bd443849a1720f72168b6348cae1f8e85",
"public/audio/first-apple.wav": "7c1dbcb3082055df2b8f087f7e906ec867c92f679de0894c34740c05e61a4bc1",
"public/audio/first-furniture.wav": "29f007b385b7182db1d8aeccad4fc3c260df5e66e14e52a46b0ef0fcd0ff3a0a",
"public/audio/first-hat.wav": "17c8cde90567e7574b0c0702663bd70713054089ee920241b5444d9b7869eef5",
"public/audio/first-market.wav": "1e00b8f70a796cdebb0feb00c605fece7488b06915e6e036f54206f05e201e0c",
"public/audio/first-meat.wav": "f51a37c1722fef581f7d642a4dcae7fcb9953b3c318dce971bf616cd1a81fecc",
"public/audio/first-oil.wav": "f415195e0cfc7ee711d09de7519e88eab62cc8b58d70772c83c3f5c27c267819",
"public/audio/first-sea.wav": "0f0b39314c5f7d7168d4854003c0c284e7bc3438cdc4d1d1c5adab7cb5ed30e5",
"public/audio/first-sound.wav": "46f6adeed928a16af0700f1e8626cf8049f124632a04a5d10604426fb06f9596",
"public/audio/first-tree.wav": "3178230fd5850b6277a2153b438ec5289720e3db7ac929914cc213964f004bd5",
"public/audio/first-umbrella.wav": "878e0bd2e6e4105f175aef51a028f6b141f3a2072be20f783193f3ba897a3ee0",
"public/audio/intro.wav": "90d9f46e6e3f9c8a0c1a781096df54d7809ef4ad38b289508ef7b8c0411465ce",
"public/audio/last-apple.wav": "4cb2a8579fa3a7b91bb36363826ce8ca0d6d86e96e16a479e226a2802edd82f7",
"public/audio/last-furniture.wav": "5ad4f776e35439d408abed0e66567d6b5cdc80fc54d579165472e474f1238776",
"public/audio/last-hat.wav": "bdaf8fbc54df8061e9e58aa8c14b3044a6e863dc54973ee3ee6ae2c5ae1a28f1",
"public/audio/last-market.wav": "7857e87e9dbfe8fe849cc0b18c1d45b60916cb337328099c7a87a42c82e2821e",
"public/audio/last-meat.wav": "10f8ad4259ed8945c9da831e80b3902303c09caef96d400298599168fb1efed4",
"public/audio/last-oil.wav": "b5ce34950b8b31b1baf6ce55410797f0d8aa5478a670d6eace87cf76d134d6d3",
"public/audio/last-sea.wav": "f755452e1da44674aa1df7d12edffa988091b89a394e7eb6d4a00eb721f07cbf",
"public/audio/last-sound.wav": "ec9c49802aebeb6a8b898a1c0d8ad1daa127d2d64c905c197ed49a8e0c4eb64a",
"public/audio/last-tree.wav": "589e56d940a3c9e80ec02ae0b2dd93463fdc85ef019a753fcd0fded0752055f9",
"public/audio/last-umbrella.wav": "c801293a34013a8d93d3289a2cc87cd3eed83f97ba4647f5060efa00b117a9ad",
"public/audio/luck-apple.wav": "7c8f413f4b7e164f090e508ba090448f1376c6012649bbb6a917d45851313883",
"public/audio/luck-furniture.wav": "52cb92cdb8ee92b6f581c9d68dbc346f180c470564809ba57185429c9eb84127",
"public/audio/luck-hat.wav": "4ff43dd042f4b5451e9fdeb3edd59f1e389a7d1dd488094587a3a9fc7dfffa44",
"public/audio/luck-market.wav": "356af25332bf2000ed349671f3ff39767929e1f4599af622c021f907d11fb7bf",
"public/audio/luck-meat.wav": "d36dfc395a5c53fbfa4abe9980db7bb59adfdac59e40318c4aca365365e3f2ab",
"public/audio/luck-oil.wav": "3fa1e662a3af8f2726b17b2baa5bec2934406e6595ebc243c8380dd16e190977",
"public/audio/luck-sea.wav": "47aa31d757c9fb49c9b53a1c052d90a5ced4be57549d649850d9b48f8864045b",
"public/audio/luck-sound.wav": "34e4d9758d2ed448646fda364610e34779c84794403d9051ab3d8c1d33e2c80c",
"public/audio/luck-tree.wav": "122f496834fb16d6da47f801e50e46e272e4e934af959467d1db4e490f79be7a",
"public/audio/luck-umbrella.wav": "8d3e8e8bc97e5fe3f3362184c4abb12f01a882a1f1174d2644f0f70aac677c0a",
"public/audio/message-apple.wav": "d85e6f47d871369f00de2274139e5ad6b4b5686b5e20e248df0ed6b9a320d942",
"public/audio/message-furniture.wav": "26c331b7e12311236f4bb48f88918dfbf53cccd2f50b55741ea6ff4473e71dd8",
"public/audio/message-hat.wav": "5a713a8522b231bb8276805c014b385b9150b79f58ff2618446607e2b442495e",
"public/audio/message-market.wav": "9242d4cd6e0030e6b073e4d2360f84aa8a454d1749711cdb2d64c14f28a7ea20",
"public/audio/message-meat.wav": "ce19735df079b54c171e775b6b365385a80160b9033442abab95b2b9c8505e1a",
"public/audio/message-oil.wav": "a2a71a7e5e07c81871a25c6cb7540c39aa0b32fc44f78cda66b5f34ace98d805",
"public/audio/message-sea.wav": "28a461fbe03bffe2560030dea8b60715f7c0fe262dcf85b5b7f7daf483836382",
"public/audio/message-sound.wav": "1e682147dae8026ba78dc8f256c7f24acb3a6743bfd88a0fcc86096930eef078",
"public/audio/message-tree.wav": "5d684aa710a63d36ed8dcc2a8bfbdd5c71b0b1c63dad2a324adecb76591e85b8",
"public/audio/message-umbrella.wav": "41d5866dae66600df4694a8312b531571d44cece6dba0e423e7c43d09d184819",
"public/audio/middle-apple.wav": "8832f1b793ab3eedbe663875ea8dbeabb122c329bd5879437c71230b0418c3c8",
"public/audio/middle-furniture.wav": "b45b1afc8d9b534ff3e0a2a2ecb99efc1f4e40d41f89f55c4ed8ba94ad6d76d4",
"public/audio/middle-hat.wav": "b01ef9762ac84e3eb757243bc9286c62f7d45444a821ae35ac36a8b095e1598a",
"public/audio/middle-market.wav": "c855b449e0d4ace74681bfe68e5e7f0b063568827ae872017234dbe8ae119e4c",
"public/audio/middle-meat.wav": "d416107cc05e7c5b92ca27100a10a8a9689de913346179945d5542de4a6bac0c",
"public/audio/middle-oil.wav": "7a6b122b11c07da86c95fb78e2db2a70681b5219c63d6441fe56da1979ac1dc3",
"public/audio/middle-sea.wav": "b6dbe0af143ea775f05bd59a3d6af348bcc770ab378ac91ea75a56e06c326edf",
"public/audio/middle-sound.wav": "4d00aa6114327f450a00dacbc7e7b572ebf1de4ce9dc2fe4b5505766cca71ce9",
"public/audio/middle-tree.wav": "341888c75275c13eb31058f53a1d4276be0daa0a1b5a3a45522036928b83b0c1",
"public/audio/middle-umbrella.wav": "399ea2f681f755918f1117c8baba42739ceca64b307b999342f457a9235050b6",
"public/audio/mission-apple.wav": "3ef42e276ff3500c3e197d149f29f79d6a0c1d5516ed1d5a2c57210333fded9c",
"public/audio/mission-furniture.wav": "af82e03b686635c3356e706fe5b05c1231aeaaeab33f275aa5b8714988c65d43",
"public/audio/mission-hat.wav": "308278ec2bd27d4224976a55632d1f7fa1edabb0792126d9d858a699c287aee4",
"public/audio/mission-market.wav": "cefa0e95649ea6bd1df4c8dfccd2b74b4f4c028714420ce1087b61db2f2a8d47",
"public/audio/mission-meat.wav": "94f8a4f9e116a787e5ed052661d6de9ecf3ad8629db476661dd59ad03014b0c9",
"public/audio/mission-oil.wav": "5fb63e04520c312aa6b7b48b70c2f7c140b5ab480e5c6992edbc2ba85b9a06e7",
"public/audio/mission-sea.wav": "8838d6a1ee8a790427dc5aa761e70b3d8872af62086efeed743297ff7f8b8a06",
"public/audio/mission-sound.wav": "659eb0e2b06e6b165b46744769743e032e2282519f8486c57bc45e0f7d07a069",
"public/audio/mission-tree.wav": "00d8e77ec0371971d632724d91f8cf8d947bfb83c582a513b6421be4c457a1da",
"public/audio/mission-umbrella.wav": "4b4c858a25659540f9dbc524664496fc6de61ab8c1627f3cfee8c9c744e11d5b",
"public/audio/password-apple.wav": "b6f5de3fe571fe3a7fdb722fe49250bcfeedef49475271e0ec76a7630907edd5",
"public/audio/password-furniture.wav": "fb2b631dd4e12120d08a84cce6450f9cd9cd68105d13d7001d808e7deaa1df4a",
"public/audio/password-hat.wav": "e91bfc97df90a1675b6cd856880ac15c54de32cfc3b23603bdd1c2c5ac3ce6b8",
"public/audio/password-market.wav": "02e325fb753ef7a3ee585a03d2ca2aa3f1fbc58523b062222ae1136eeed7a95c",
"public/audio/password-meat.wav": "b009caadd56350d6a641ff17f0973e2b2724c183e1f45ae0bf3c483e237fa99e",
"public/audio/password-oil.wav": "b472957b27ff98ea7b8894fa1ff12653f7e9f66f77870faa9e52a1c1bf116c41",
"public/audio/password-sea.wav": "03f45b8cb5b3dc72faf5c6e3d0e2a10cea6b60301ea400d0a4453596d2f0b337",
"public/audio/password-sound.wav": "044aafff08a19e39f21e58b963644715a987cd155896998769ef8e9ce6449628",
"public/audio/password-tree.wav": "67da8147296e35134ec254bc82b58317630061b2c64d2d63c4be197ce8692d50",
"public/audio/password-umbrella.wav": "ab3ca6398c879971dc793eb25b472fcc0db72d76e386f11ef4d32c639f37c69d",
"public/audio/remember-apple.wav": "1bf2aef9a9f030af1a8fd7dee8f44aa420a397b3ba99b575feeb3dc7a63ec191",
"public/audio/remember-furniture.wav": "442bdcb956f120c270e1f321feae0415c897de0183e468980fcc119b898b2a67",
"public/audio/remember-hat.wav": "31a6a4270bf368cda419094d87a303ac3cd5c22539786cb165f8044b0b8e9d6e",
"public/audio/remember-market.wav": "d89792da51c83ac49d27e55aa6d822a338899a5ee487b34b552748201e1522f6",
"public/audio/remember-meat.wav": "9183ef90b64f5ceaf3bb0178c689231ff3e9981d6ce889124a15f2a6e2b7a344",
"public/audio/remember-oil.wav": "3ca98682ff06d1d6b8af02c0fd5b2124f42266ac989884223eff4a9bbde1287a",
"public/audio/remember-sea.wav": "5c91a36496e274d2be9c6fa8d9b506cd04f2a1b7ceb05ed1b7bb03fe7fca99d9",
"public/audio/remember-sound.wav": "98387ccc7aab566f6487d4c250b2128082cc527e013a6f7b7bc4d0266ac295df",
"public/audio/remember-tree.wav": "bc8e54f5407e8866bf1ca1ddfd4f6c63d85fee29bd9e430c7dd33e87974fc5b8",
"public/audio/remember-umbrella.wav": "c8988e604ba05d52597e561389541e8f9cda86e052279f1862bbf8399ead314e",
"public/audio/repeat-apple.wav": "cb7da4e9a1288cac64d168b241f27d7d2bc2dfecace58744f9bbf2792dfad04e",
"public/audio/repeat-furniture.wav": "bf84dc6cff1f227924a3a62158d2fc18769fb0ca40b91418fa19e534dbf92f00",
"public/audio/repeat-hat.wav": "6e089a42fd7e65e82eec7186d369c926fb7fdac794365b2bd7658822fd92437c",
"public/audio/repeat-market.wav": "68a5b899115a66ab225d610ec47b4de56cc8793657362bc38f533c06f741e4cc",
"public/audio/repeat-meat.wav": "6599d2fac73ea616a793151b4ce6f51af673988d630bac6219a77e78ae6cb34e",
"public/audio/repeat-oil.wav": "55b2c7d6aa8bbce04edf8661882c9781da81c57f56217f99b80457a3bb895da0",
"public/audio/repeat-sea.wav": "db2f235bee26ac804b5362e8e013b8f40c8da24fd3a34e0fb3b43c6d264feb36",
"public/audio/repeat-sound.wav": "e9d636ff7f4777f38b1ff15bebdcec6fbde95b4b4b05625a7415b4cfa0025b59",
"public/audio/repeat-tree.wav": "8735c3d9672561ca237fa87317beec2878492eb9063d6048d5b214423561acc1",
"public/audio/repeat-umbrella.wav": "5e59ef39113c3d5e106862356d715f4cef2862ef8ee02654a97e532675c1ac6d"
}
}
@@ -0,0 +1,93 @@
# Find-Word v0.2.3 — Field recording notices
These third-party recordings retain their own licenses. The private project license does not apply to them.
All files are modified excerpts: trimmed, faded, downmixed, resampled, normalized and converted to WAV.
The market derivative remains CC BY-SA 4.0. No additional restrictions are imposed on that audio.
## 길거리 — street
Suggested: Sunday, 4th May 2008 5.05pm - sounds outside my window, by cori (Cori Samuel), via Wikimedia Commons; public domain.
Creator: cori (Cori Samuel)
Source: https://commons.wikimedia.org/wiki/File:Sunday_in_the_city_street_noise2.ogg
Download: https://upload.wikimedia.org/wikipedia/commons/2/24/Sunday_in_the_city_street_noise2.ogg
License: Public domain (PD-author) — https://commons.wikimedia.org/wiki/Template:PD-author
Output license: Public domain (PD-author)
Changes: excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding; source seconds 35–47.
## 쇼핑몰 — mall
Suggested: 1 minute at the Alexa mall in Berlin, by thore, via Wikimedia Commons; public domain.
Creator: thore (Thore)
Source: https://commons.wikimedia.org/wiki/File:1_minute_at_the_alexa_mall_in_berlin.ogg
Download: https://upload.wikimedia.org/wikipedia/commons/f/fd/1_minute_at_the_alexa_mall_in_berlin.ogg
License: Public domain (PD-author) — https://commons.wikimedia.org/wiki/Template:PD-author
Output license: Public domain (PD-author)
Changes: excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding; source seconds 36–48.
## 극장 — theater
Suggested: Crowd Ambience - Theater, by ElevatorFan2020, from Freesound, CC0 1.0.
Creator: ElevatorFan2020
Source: https://freesound.org/people/ElevatorFan2020/sounds/853576/
Download: https://cdn.freesound.org/previews/853/853576_14269391-lq.mp3
License: CC0 1.0 Universal — https://creativecommons.org/publicdomain/zero/1.0/
Output license: CC0 1.0 Universal
Changes: excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding; source seconds 45–57.
## 백화점 — department
Suggested: US Department store - checkouts, by icmusic, from Freesound, CC0 1.0.
Creator: icmusic
Source: https://freesound.org/people/icmusic/sounds/268941/
Download: https://cdn.freesound.org/previews/268/268941_40107-lq.mp3
License: CC0 1.0 Universal — https://creativecommons.org/publicdomain/zero/1.0/
Output license: CC0 1.0 Universal
Changes: excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding; source seconds 90–102.
## 시장 — market
Italia Palermo mercato-Ballaro 20161225 122421, by Marie Flutre, CC BY-SA 4.0, via Wikimedia Commons. Modified by excerpting, trimming, fades, normalization, downmixing, resampling and PCM WAV conversion. The derivative audio remains CC BY-SA 4.0.
Creator: Marie Flutre (Wikimedia user Timflutre)
Source: https://commons.wikimedia.org/wiki/File:Italia_Palermo_mercato-Ballaro_20161225_122421.ogg
Download: https://upload.wikimedia.org/wikipedia/commons/e/e8/Italia_Palermo_mercato-Ballaro_20161225_122421.ogg
License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/
Output license: CC BY-SA 4.0
Changes: excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding; source seconds 24–36.
## 지하철 — subway
TTC Subway Line 1 Ambience - Museum to Union, by PascalHD, CC BY 4.0, via Wikimedia Commons/Freesound. Modified by excerpting, trimming, fades, normalization, downmixing, resampling and PCM WAV conversion.
Creator: PascalHD
Source: https://commons.wikimedia.org/wiki/File:TTC_Subway_Line_1_Ambience_-_Museum_to_Union_(Freesound).ogg
Download: https://upload.wikimedia.org/wikipedia/commons/d/d3/TTC_Subway_Line_1_Ambience_-_Museum_to_Union_%28Freesound%29.ogg
License: CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/
Output license: CC BY 4.0
Changes: excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding; source seconds 65–77.
## 카페 — cafe
Suggested: Cafe ambiance, by Marble Toast, via Wikimedia Commons, CC0 1.0.
Creator: Marble Toast
Source: https://commons.wikimedia.org/wiki/File:Cafe_ambiance.ogg
Download: https://upload.wikimedia.org/wikipedia/commons/5/54/Cafe_ambiance.ogg
License: CC0 1.0 Universal — https://creativecommons.org/publicdomain/zero/1.0/
Output license: CC0 1.0 Universal
Changes: excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding; source seconds 0–12.
## 비 오는 거리 — rain
Suggested: Urban Street on a Rainy Afternoon, by Extemporalist, via Wikimedia Commons, CC0 1.0.
Creator: Extemporalist
Source: https://commons.wikimedia.org/wiki/File:Urban_Street_on_a_Rainy_Afternoon.flac
Download: https://upload.wikimedia.org/wikipedia/commons/8/8c/Urban_Street_on_a_Rainy_Afternoon.flac
License: CC0 1.0 Universal — https://creativecommons.org/publicdomain/zero/1.0/
Output license: CC0 1.0 Universal
Changes: excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding; source seconds 180–192.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,356 @@
{
"version": "0.2.3",
"generatedAtUtc": "2026-10-14T09:33:24.077276+00:00",
"toolVersions": {
"ffmpeg": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers"
},
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16",
"files": [
{
"environmentId": "street",
"displayName": "길거리",
"pageUrl": "https://commons.wikimedia.org/wiki/File:Sunday_in_the_city_street_noise2.ogg",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/2/24/Sunday_in_the_city_street_noise2.ogg",
"creator": "cori (Cori Samuel)",
"license": "Public domain (PD-author)",
"licenseUrl": "https://commons.wikimedia.org/wiki/Template:PD-author",
"attribution": "Suggested: Sunday, 4th May 2008 5.05pm - sounds outside my window, by cori (Cori Samuel), via Wikimedia Commons; public domain.",
"expectedSourceSha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"sourceBytes": 3414104,
"directMediaDurationSeconds": 264.254694,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 35,
"file": "street.wav",
"sourceSha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"outputLicense": "Public domain (PD-author)",
"verificationDateUtc": "2026-10-14",
"sha256": "a8bffa201b174618955bc51b860167169125304811aabe2086b0bb35b06c3ae1",
"bytes": 576044,
"duration": 12.0,
"rms": 0.07999756262285758,
"peak": 0.396759033203125,
"conversion": {
"startSeconds": 35,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 1.849547024580241,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
},
{
"environmentId": "mall",
"displayName": "쇼핑몰",
"pageUrl": "https://commons.wikimedia.org/wiki/File:1_minute_at_the_alexa_mall_in_berlin.ogg",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/f/fd/1_minute_at_the_alexa_mall_in_berlin.ogg",
"creator": "thore (Thore)",
"license": "Public domain (PD-author)",
"licenseUrl": "https://commons.wikimedia.org/wiki/Template:PD-author",
"attribution": "Suggested: 1 minute at the Alexa mall in Berlin, by thore, via Wikimedia Commons; public domain.",
"expectedSourceSha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"sourceBytes": 1666896,
"directMediaDurationSeconds": 60.05551,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 36,
"file": "mall.wav",
"sourceSha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"outputLicense": "Public domain (PD-author)",
"verificationDateUtc": "2026-10-14",
"sha256": "680a769940c08f0d12c6c954c08366598dd8b5745e276f39c82b10d1a88261a1",
"bytes": 576044,
"duration": 12.0,
"rms": 0.07999755012072322,
"peak": 0.71917724609375,
"conversion": {
"startSeconds": 36,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.9433928828892831,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
},
{
"environmentId": "theater",
"displayName": "극장",
"pageUrl": "https://freesound.org/people/ElevatorFan2020/sounds/853576/",
"directUrl": "https://cdn.freesound.org/previews/853/853576_14269391-lq.mp3",
"creator": "ElevatorFan2020",
"license": "CC0 1.0 Universal",
"licenseUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
"attribution": "Suggested: Crowd Ambience - Theater, by ElevatorFan2020, from Freesound, CC0 1.0.",
"expectedSourceSha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"sourceBytes": 1485015,
"directMediaDurationSeconds": 176.901224,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 45,
"file": "theater.wav",
"sourceSha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"outputLicense": "CC0 1.0 Universal",
"verificationDateUtc": "2026-10-14",
"sha256": "2d6a444fb7874cdf6b2d8a741a69175299b112eb66834912c025437d8277d635",
"bytes": 576044,
"duration": 12.0,
"rms": 0.0799975663639253,
"peak": 0.495086669921875,
"conversion": {
"startSeconds": 45,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 1.438006249673014,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
},
{
"environmentId": "department",
"displayName": "백화점",
"pageUrl": "https://freesound.org/people/icmusic/sounds/268941/",
"directUrl": "https://cdn.freesound.org/previews/268/268941_40107-lq.mp3",
"creator": "icmusic",
"license": "CC0 1.0 Universal",
"licenseUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
"attribution": "Suggested: US Department store - checkouts, by icmusic, from Freesound, CC0 1.0.",
"expectedSourceSha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"sourceBytes": 2445024,
"directMediaDurationSeconds": 292.872,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 90,
"file": "department.wav",
"sourceSha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"outputLicense": "CC0 1.0 Universal",
"verificationDateUtc": "2026-10-14",
"sha256": "aa43f3d1d3e7c2b1f8ace24ecbda45d0ea3a031db941c39506dc6c1665b8efa7",
"bytes": 576044,
"duration": 12.0,
"rms": 0.07999757899341044,
"peak": 0.4749755859375,
"conversion": {
"startSeconds": 90,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 1.2266018453762095,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
},
{
"environmentId": "market",
"displayName": "시장",
"pageUrl": "https://commons.wikimedia.org/wiki/File:Italia_Palermo_mercato-Ballaro_20161225_122421.ogg",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/e/e8/Italia_Palermo_mercato-Ballaro_20161225_122421.ogg",
"creator": "Marie Flutre (Wikimedia user Timflutre)",
"license": "CC BY-SA 4.0",
"licenseUrl": "https://creativecommons.org/licenses/by-sa/4.0/",
"attribution": "Italia Palermo mercato-Ballaro 20161225 122421, by Marie Flutre, CC BY-SA 4.0, via Wikimedia Commons. Modified by excerpting, trimming, fades, normalization, downmixing, resampling and PCM WAV conversion. The derivative audio remains CC BY-SA 4.0.",
"expectedSourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"sourceBytes": 622200,
"directMediaDurationSeconds": 76.696961,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 24,
"file": "market.wav",
"sourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"outputLicense": "CC BY-SA 4.0",
"verificationDateUtc": "2026-10-14",
"sha256": "d6f73d86aea98b83e2995e61baaa7315a0ea7adeebc093769d76e1569b207658",
"bytes": 576044,
"duration": 12.0,
"rms": 0.04309857288377583,
"peak": 0.8499755859375,
"conversion": {
"startSeconds": 24,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.8923059364616298,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
},
{
"environmentId": "subway",
"displayName": "지하철",
"pageUrl": "https://commons.wikimedia.org/wiki/File:TTC_Subway_Line_1_Ambience_-_Museum_to_Union_(Freesound).ogg",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/d/d3/TTC_Subway_Line_1_Ambience_-_Museum_to_Union_%28Freesound%29.ogg",
"creator": "PascalHD",
"license": "CC BY 4.0",
"licenseUrl": "https://creativecommons.org/licenses/by/4.0/",
"attribution": "TTC Subway Line 1 Ambience - Museum to Union, by PascalHD, CC BY 4.0, via Wikimedia Commons/Freesound. Modified by excerpting, trimming, fades, normalization, downmixing, resampling and PCM WAV conversion.",
"expectedSourceSha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"sourceBytes": 3343901,
"directMediaDurationSeconds": 425.024,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 65,
"file": "subway.wav",
"sourceSha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"outputLicense": "CC BY 4.0",
"verificationDateUtc": "2026-10-14",
"sha256": "9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f",
"bytes": 576044,
"duration": 12.0,
"rms": 0.07999755256849092,
"peak": 0.42529296875,
"conversion": {
"startSeconds": 65,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.4367522670617141,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
},
{
"environmentId": "cafe",
"displayName": "카페",
"pageUrl": "https://commons.wikimedia.org/wiki/File:Cafe_ambiance.ogg",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/5/54/Cafe_ambiance.ogg",
"creator": "Marble Toast",
"license": "CC0 1.0 Universal",
"licenseUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
"attribution": "Suggested: Cafe ambiance, by Marble Toast, via Wikimedia Commons, CC0 1.0.",
"expectedSourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"sourceBytes": 19947952,
"directMediaDurationSeconds": 1200.000998,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 0,
"file": "cafe.wav",
"sourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"outputLicense": "CC0 1.0 Universal",
"verificationDateUtc": "2026-10-14",
"sha256": "6853c121104940041c268a2891eadae032c17aa22b4c3b3ddfbc025262434995",
"bytes": 576044,
"duration": 12.0,
"rms": 0.07999753838852817,
"peak": 0.405731201171875,
"conversion": {
"startSeconds": 0,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.7436988602699036,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
},
{
"environmentId": "rain",
"displayName": "비 오는 거리",
"pageUrl": "https://commons.wikimedia.org/wiki/File:Urban_Street_on_a_Rainy_Afternoon.flac",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/8/8c/Urban_Street_on_a_Rainy_Afternoon.flac",
"creator": "Extemporalist",
"license": "CC0 1.0 Universal",
"licenseUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
"attribution": "Suggested: Urban Street on a Rainy Afternoon, by Extemporalist, via Wikimedia Commons, CC0 1.0.",
"expectedSourceSha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"sourceBytes": 91187572,
"directMediaDurationSeconds": 1800.0,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 180,
"file": "rain.wav",
"sourceSha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"outputLicense": "CC0 1.0 Universal",
"verificationDateUtc": "2026-10-14",
"sha256": "f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9",
"bytes": 576044,
"duration": 12.0,
"rms": 0.011384632877156162,
"peak": 0.1024169921875,
"conversion": {
"startSeconds": 180,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 4,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
}
]
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,935 @@
{
"version": "0.2.3",
"provider": "Microsoft Edge online TTS",
"voice": "ko-KR-HyunsuMultilingualNeural",
"rate": "-6%",
"pitch": "-4Hz",
"sampleRate": 24000,
"channels": 1,
"sampleFormat": "PCM s16le",
"toolVersions": {
"edge-tts": "7.3.1",
"ffmpeg": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers"
},
"generatedAtUtc": "2026-10-14T06:55:41.751382+00:00",
"source": "https://github.com/rany2/edge-tts",
"method": "온라인 neural 생성 MP3 → FFmpeg decode → 파일별 선형 gain → 로컬 PCM WAV",
"normalization": {
"targetRms": 0.1,
"peakCeiling": 0.89,
"maxGain": 2.0
},
"files": [
{
"file": "intro.wav",
"text": "으하하하~~ 나는 에스다. 널 위한 행운의 단어를 불러주마, 잘 찾아보거라.",
"sha256": "90d9f46e6e3f9c8a0c1a781096df54d7809ef4ad38b289508ef7b8c0411465ce",
"bytes": 338732,
"duration": 7.056,
"rms": 0.09999999766232884,
"peak": 0.499847412109375
},
{
"file": "luck-apple.wav",
"text": "오늘의 행운을 담은 단어는 ‘사과’입니다.",
"sha256": "7c8f413f4b7e164f090e508ba090448f1376c6012649bbb6a917d45851313883",
"bytes": 188972,
"duration": 3.936,
"rms": 0.10000000059246013,
"peak": 0.401641845703125
},
{
"file": "luck-sea.wav",
"text": "오늘의 행운을 담은 단어는 ‘바다’입니다.",
"sha256": "47aa31d757c9fb49c9b53a1c052d90a5ced4be57549d649850d9b48f8864045b",
"bytes": 191276,
"duration": 3.984,
"rms": 0.09999997583491328,
"peak": 0.388702392578125
},
{
"file": "luck-tree.wav",
"text": "오늘의 행운을 담은 단어는 ‘나무’입니다.",
"sha256": "122f496834fb16d6da47f801e50e46e272e4e934af959467d1db4e490f79be7a",
"bytes": 183212,
"duration": 3.816,
"rms": 0.1000000469252297,
"peak": 0.36920166015625
},
{
"file": "luck-hat.wav",
"text": "오늘의 행운을 담은 단어는 ‘모자’입니다.",
"sha256": "4ff43dd042f4b5451e9fdeb3edd59f1e389a7d1dd488094587a3a9fc7dfffa44",
"bytes": 191276,
"duration": 3.984,
"rms": 0.09999997899323479,
"peak": 0.417083740234375
},
{
"file": "luck-umbrella.wav",
"text": "오늘의 행운을 담은 단어는 ‘우산’입니다.",
"sha256": "8d3e8e8bc97e5fe3f3362184c4abb12f01a882a1f1174d2644f0f70aac677c0a",
"bytes": 192428,
"duration": 4.008,
"rms": 0.09999996793233332,
"peak": 0.385650634765625
},
{
"file": "luck-market.wav",
"text": "오늘의 행운을 담은 단어는 ‘시장’입니다.",
"sha256": "356af25332bf2000ed349671f3ff39767929e1f4599af622c021f907d11fb7bf",
"bytes": 194732,
"duration": 4.056,
"rms": 0.09999998683675566,
"peak": 0.4022216796875
},
{
"file": "luck-oil.wav",
"text": "오늘의 행운을 담은 단어는 ‘기름’입니다.",
"sha256": "3fa1e662a3af8f2726b17b2baa5bec2934406e6595ebc243c8380dd16e190977",
"bytes": 190124,
"duration": 3.96,
"rms": 0.09999999431198445,
"peak": 0.3817138671875
},
{
"file": "luck-sound.wav",
"text": "오늘의 행운을 담은 단어는 ‘소리’입니다.",
"sha256": "34e4d9758d2ed448646fda364610e34779c84794403d9051ab3d8c1d33e2c80c",
"bytes": 184364,
"duration": 3.84,
"rms": 0.10000003234489044,
"peak": 0.386322021484375
},
{
"file": "luck-meat.wav",
"text": "오늘의 행운을 담은 단어는 ‘고기’입니다.",
"sha256": "d36dfc395a5c53fbfa4abe9980db7bb59adfdac59e40318c4aca365365e3f2ab",
"bytes": 187820,
"duration": 3.912,
"rms": 0.0999999898733683,
"peak": 0.371124267578125
},
{
"file": "luck-furniture.wav",
"text": "오늘의 행운을 담은 단어는 ‘가구’입니다.",
"sha256": "52cb92cdb8ee92b6f581c9d68dbc346f180c470564809ba57185429c9eb84127",
"bytes": 186668,
"duration": 3.888,
"rms": 0.10000004096194225,
"peak": 0.387054443359375
},
{
"file": "password-apple.wav",
"text": "연습 암호는 ‘다과’, 진짜 암호는 ‘사과’입니다.",
"sha256": "b6f5de3fe571fe3a7fdb722fe49250bcfeedef49475271e0ec76a7630907edd5",
"bytes": 235052,
"duration": 4.896,
"rms": 0.09999999690557956,
"peak": 0.483428955078125
},
{
"file": "password-sea.wav",
"text": "연습 암호는 ‘사다’, 진짜 암호는 ‘바다’입니다.",
"sha256": "03f45b8cb5b3dc72faf5c6e3d0e2a10cea6b60301ea400d0a4453596d2f0b337",
"bytes": 232748,
"duration": 4.848,
"rms": 0.09999999075635248,
"peak": 0.533905029296875
},
{
"file": "password-tree.wav",
"text": "연습 암호는 ‘나루’, 진짜 암호는 ‘나무’입니다.",
"sha256": "67da8147296e35134ec254bc82b58317630061b2c64d2d63c4be197ce8692d50",
"bytes": 233900,
"duration": 4.872,
"rms": 0.10000002225030123,
"peak": 0.490386962890625
},
{
"file": "password-hat.wav",
"text": "연습 암호는 ‘포자’, 진짜 암호는 ‘모자’입니다.",
"sha256": "e91bfc97df90a1675b6cd856880ac15c54de32cfc3b23603bdd1c2c5ac3ce6b8",
"bytes": 235052,
"duration": 4.896,
"rms": 0.10000000521661735,
"peak": 0.505889892578125
},
{
"file": "password-umbrella.wav",
"text": "연습 암호는 ‘부산’, 진짜 암호는 ‘우산’입니다.",
"sha256": "ab3ca6398c879971dc793eb25b472fcc0db72d76e386f11ef4d32c639f37c69d",
"bytes": 239660,
"duration": 4.992,
"rms": 0.10000000645104105,
"peak": 0.4776611328125
},
{
"file": "password-market.wav",
"text": "연습 암호는 ‘지장’, 진짜 암호는 ‘시장’입니다.",
"sha256": "02e325fb753ef7a3ee585a03d2ca2aa3f1fbc58523b062222ae1136eeed7a95c",
"bytes": 230444,
"duration": 4.8,
"rms": 0.10000002623625086,
"peak": 0.481689453125
},
{
"file": "password-oil.wav",
"text": "연습 암호는 ‘이름’, 진짜 암호는 ‘기름’입니다.",
"sha256": "b472957b27ff98ea7b8894fa1ff12653f7e9f66f77870faa9e52a1c1bf116c41",
"bytes": 240812,
"duration": 5.016,
"rms": 0.10000000204728039,
"peak": 0.4945068359375
},
{
"file": "password-sound.wav",
"text": "연습 암호는 ‘오리’, 진짜 암호는 ‘소리’입니다.",
"sha256": "044aafff08a19e39f21e58b963644715a987cd155896998769ef8e9ce6449628",
"bytes": 236204,
"duration": 4.92,
"rms": 0.10000000001020605,
"peak": 0.46209716796875
},
{
"file": "password-meat.wav",
"text": "연습 암호는 ‘보기’, 진짜 암호는 ‘고기’입니다.",
"sha256": "b009caadd56350d6a641ff17f0973e2b2724c183e1f45ae0bf3c483e237fa99e",
"bytes": 240812,
"duration": 5.016,
"rms": 0.10000000456206941,
"peak": 0.49786376953125
},
{
"file": "password-furniture.wav",
"text": "연습 암호는 ‘하구’, 진짜 암호는 ‘가구’입니다.",
"sha256": "fb2b631dd4e12120d08a84cce6450f9cd9cd68105d13d7001d808e7deaa1df4a",
"bytes": 233900,
"duration": 4.872,
"rms": 0.10000001899065697,
"peak": 0.483642578125
},
{
"file": "remember-apple.wav",
"text": "‘다과’. 이 단어는 잊으세요. 이제 ‘사과’, 이 단어를 기억하세요.",
"sha256": "1bf2aef9a9f030af1a8fd7dee8f44aa420a397b3ba99b575feeb3dc7a63ec191",
"bytes": 395180,
"duration": 8.232,
"rms": 0.10000000668138131,
"peak": 0.563568115234375
},
{
"file": "remember-sea.wav",
"text": "‘사다’. 이 단어는 잊으세요. 이제 ‘바다’, 이 단어를 기억하세요.",
"sha256": "5c91a36496e274d2be9c6fa8d9b506cd04f2a1b7ceb05ed1b7bb03fe7fca99d9",
"bytes": 399788,
"duration": 8.328,
"rms": 0.09999999180525658,
"peak": 0.546539306640625
},
{
"file": "remember-tree.wav",
"text": "‘나루’. 이 단어는 잊으세요. 이제 ‘나무’, 이 단어를 기억하세요.",
"sha256": "bc8e54f5407e8866bf1ca1ddfd4f6c63d85fee29bd9e430c7dd33e87974fc5b8",
"bytes": 409004,
"duration": 8.52,
"rms": 0.09999998112848245,
"peak": 0.54864501953125
},
{
"file": "remember-hat.wav",
"text": "‘포자’. 이 단어는 잊으세요. 이제 ‘모자’, 이 단어를 기억하세요.",
"sha256": "31a6a4270bf368cda419094d87a303ac3cd5c22539786cb165f8044b0b8e9d6e",
"bytes": 402092,
"duration": 8.376,
"rms": 0.09999997909968193,
"peak": 0.541778564453125
},
{
"file": "remember-umbrella.wav",
"text": "‘부산’. 이 단어는 잊으세요. 이제 ‘우산’, 이 단어를 기억하세요.",
"sha256": "c8988e604ba05d52597e561389541e8f9cda86e052279f1862bbf8399ead314e",
"bytes": 403244,
"duration": 8.4,
"rms": 0.10000001748273872,
"peak": 0.557830810546875
},
{
"file": "remember-market.wav",
"text": "‘지장’. 이 단어는 잊으세요. 이제 ‘시장’, 이 단어를 기억하세요.",
"sha256": "d89792da51c83ac49d27e55aa6d822a338899a5ee487b34b552748201e1522f6",
"bytes": 398636,
"duration": 8.304,
"rms": 0.09999999983200249,
"peak": 0.57281494140625
},
{
"file": "remember-oil.wav",
"text": "‘이름’. 이 단어는 잊으세요. 이제 ‘기름’, 이 단어를 기억하세요.",
"sha256": "3ca98682ff06d1d6b8af02c0fd5b2124f42266ac989884223eff4a9bbde1287a",
"bytes": 399788,
"duration": 8.328,
"rms": 0.09999999241389293,
"peak": 0.524383544921875
},
{
"file": "remember-sound.wav",
"text": "‘오리’. 이 단어는 잊으세요. 이제 ‘소리’, 이 단어를 기억하세요.",
"sha256": "98387ccc7aab566f6487d4c250b2128082cc527e013a6f7b7bc4d0266ac295df",
"bytes": 394028,
"duration": 8.208,
"rms": 0.10000002803973357,
"peak": 0.53778076171875
},
{
"file": "remember-meat.wav",
"text": "‘보기’. 이 단어는 잊으세요. 이제 ‘고기’, 이 단어를 기억하세요.",
"sha256": "9183ef90b64f5ceaf3bb0178c689231ff3e9981d6ce889124a15f2a6e2b7a344",
"bytes": 395180,
"duration": 8.232,
"rms": 0.10000003134220614,
"peak": 0.519287109375
},
{
"file": "remember-furniture.wav",
"text": "‘하구’. 이 단어는 잊으세요. 이제 ‘가구’, 이 단어를 기억하세요.",
"sha256": "442bdcb956f120c270e1f321feae0415c897de0183e468980fcc119b898b2a67",
"bytes": 403244,
"duration": 8.4,
"rms": 0.10000001858461878,
"peak": 0.5618896484375
},
{
"file": "last-apple.wav",
"text": "세 단어 중 마지막을 고르세요. ‘다과’, ‘사고’, ‘사과’.",
"sha256": "4cb2a8579fa3a7b91bb36363826ce8ca0d6d86e96e16a479e226a2802edd82f7",
"bytes": 356012,
"duration": 7.416,
"rms": 0.10000001764132661,
"peak": 0.622528076171875
},
{
"file": "last-sea.wav",
"text": "세 단어 중 마지막을 고르세요. ‘사다’, ‘보다’, ‘바다’.",
"sha256": "f755452e1da44674aa1df7d12edffa988091b89a394e7eb6d4a00eb721f07cbf",
"bytes": 345644,
"duration": 7.2,
"rms": 0.09999998238433916,
"peak": 0.591033935546875
},
{
"file": "last-tree.wav",
"text": "세 단어 중 마지막을 고르세요. ‘나루’, ‘너무’, ‘나무’.",
"sha256": "589e56d940a3c9e80ec02ae0b2dd93463fdc85ef019a753fcd0fded0752055f9",
"bytes": 382508,
"duration": 7.968,
"rms": 0.09999999432249608,
"peak": 0.58074951171875
},
{
"file": "last-hat.wav",
"text": "세 단어 중 마지막을 고르세요. ‘포자’, ‘모조’, ‘모자’.",
"sha256": "bdaf8fbc54df8061e9e58aa8c14b3044a6e863dc54973ee3ee6ae2c5ae1a28f1",
"bytes": 354860,
"duration": 7.392,
"rms": 0.099999998595968,
"peak": 0.550079345703125
},
{
"file": "last-umbrella.wav",
"text": "세 단어 중 마지막을 고르세요. ‘부산’, ‘오산’, ‘우산’.",
"sha256": "c801293a34013a8d93d3289a2cc87cd3eed83f97ba4647f5060efa00b117a9ad",
"bytes": 370988,
"duration": 7.728,
"rms": 0.09999998351512711,
"peak": 0.59765625
},
{
"file": "last-market.wav",
"text": "세 단어 중 마지막을 고르세요. ‘지장’, ‘사장’, ‘시장’.",
"sha256": "7857e87e9dbfe8fe849cc0b18c1d45b60916cb337328099c7a87a42c82e2821e",
"bytes": 359468,
"duration": 7.488,
"rms": 0.09999999842960891,
"peak": 0.600555419921875
},
{
"file": "last-oil.wav",
"text": "세 단어 중 마지막을 고르세요. ‘이름’, ‘거름’, ‘기름’.",
"sha256": "b5ce34950b8b31b1baf6ce55410797f0d8aa5478a670d6eace87cf76d134d6d3",
"bytes": 337580,
"duration": 7.032,
"rms": 0.10000002299391843,
"peak": 0.55706787109375
},
{
"file": "last-sound.wav",
"text": "세 단어 중 마지막을 고르세요. ‘오리’, ‘수리’, ‘소리’.",
"sha256": "ec9c49802aebeb6a8b898a1c0d8ad1daa127d2d64c905c197ed49a8e0c4eb64a",
"bytes": 354860,
"duration": 7.392,
"rms": 0.10000004316064788,
"peak": 0.5640869140625
},
{
"file": "last-meat.wav",
"text": "세 단어 중 마지막을 고르세요. ‘보기’, ‘고개’, ‘고기’.",
"sha256": "10f8ad4259ed8945c9da831e80b3902303c09caef96d400298599168fb1efed4",
"bytes": 346796,
"duration": 7.224,
"rms": 0.10000002519116054,
"peak": 0.537200927734375
},
{
"file": "last-furniture.wav",
"text": "세 단어 중 마지막을 고르세요. ‘하구’, ‘가교’, ‘가구’.",
"sha256": "5ad4f776e35439d408abed0e66567d6b5cdc80fc54d579165472e474f1238776",
"bytes": 357164,
"duration": 7.44,
"rms": 0.10000003394798516,
"peak": 0.583587646484375
},
{
"file": "first-apple.wav",
"text": "세 단어 중 첫 번째를 고르세요. ‘사과’, ‘다과’, ‘사고’.",
"sha256": "7c1dbcb3082055df2b8f087f7e906ec867c92f679de0894c34740c05e61a4bc1",
"bytes": 359468,
"duration": 7.488,
"rms": 0.1000000290826337,
"peak": 0.57977294921875
},
{
"file": "first-sea.wav",
"text": "세 단어 중 첫 번째를 고르세요. ‘바다’, ‘사다’, ‘보다’.",
"sha256": "0f0b39314c5f7d7168d4854003c0c284e7bc3438cdc4d1d1c5adab7cb5ed30e5",
"bytes": 349100,
"duration": 7.272,
"rms": 0.10000001935816175,
"peak": 0.57177734375
},
{
"file": "first-tree.wav",
"text": "세 단어 중 첫 번째를 고르세요. ‘나무’, ‘나루’, ‘너무’.",
"sha256": "3178230fd5850b6277a2153b438ec5289720e3db7ac929914cc213964f004bd5",
"bytes": 379052,
"duration": 7.896,
"rms": 0.09999998692384372,
"peak": 0.583343505859375
},
{
"file": "first-hat.wav",
"text": "세 단어 중 첫 번째를 고르세요. ‘모자’, ‘포자’, ‘모조’.",
"sha256": "17c8cde90567e7574b0c0702663bd70713054089ee920241b5444d9b7869eef5",
"bytes": 357164,
"duration": 7.44,
"rms": 0.1000000080433648,
"peak": 0.53125
},
{
"file": "first-umbrella.wav",
"text": "세 단어 중 첫 번째를 고르세요. ‘우산’, ‘부산’, ‘오산’.",
"sha256": "878e0bd2e6e4105f175aef51a028f6b141f3a2072be20f783193f3ba897a3ee0",
"bytes": 366380,
"duration": 7.632,
"rms": 0.10000000665263714,
"peak": 0.57000732421875
},
{
"file": "first-market.wav",
"text": "세 단어 중 첫 번째를 고르세요. ‘시장’, ‘지장’, ‘사장’.",
"sha256": "1e00b8f70a796cdebb0feb00c605fece7488b06915e6e036f54206f05e201e0c",
"bytes": 359468,
"duration": 7.488,
"rms": 0.10000001450369593,
"peak": 0.639068603515625
},
{
"file": "first-oil.wav",
"text": "세 단어 중 첫 번째를 고르세요. ‘기름’, ‘이름’, ‘거름’.",
"sha256": "f415195e0cfc7ee711d09de7519e88eab62cc8b58d70772c83c3f5c27c267819",
"bytes": 335276,
"duration": 6.984,
"rms": 0.10000000576279051,
"peak": 0.53472900390625
},
{
"file": "first-sound.wav",
"text": "세 단어 중 첫 번째를 고르세요. ‘소리’, ‘오리’, ‘수리’.",
"sha256": "46f6adeed928a16af0700f1e8626cf8049f124632a04a5d10604426fb06f9596",
"bytes": 353708,
"duration": 7.368,
"rms": 0.10000001446744461,
"peak": 0.518951416015625
},
{
"file": "first-meat.wav",
"text": "세 단어 중 첫 번째를 고르세요. ‘고기’, ‘보기’, ‘고개’.",
"sha256": "f51a37c1722fef581f7d642a4dcae7fcb9953b3c318dce971bf616cd1a81fecc",
"bytes": 345644,
"duration": 7.2,
"rms": 0.09999999288327781,
"peak": 0.51312255859375
},
{
"file": "first-furniture.wav",
"text": "세 단어 중 첫 번째를 고르세요. ‘가구’, ‘하구’, ‘가교’.",
"sha256": "29f007b385b7182db1d8aeccad4fc3c260df5e66e14e52a46b0ef0fcd0ff3a0a",
"bytes": 364076,
"duration": 7.584,
"rms": 0.09999997909045008,
"peak": 0.570037841796875
},
{
"file": "repeat-apple.wav",
"text": "두 번 들린 단어를 고르세요. ‘사과’, ‘다과’, ‘사과’, ‘사고’.",
"sha256": "cb7da4e9a1288cac64d168b241f27d7d2bc2dfecace58744f9bbf2792dfad04e",
"bytes": 397484,
"duration": 8.28,
"rms": 0.09999999222276726,
"peak": 0.641448974609375
},
{
"file": "repeat-sea.wav",
"text": "두 번 들린 단어를 고르세요. ‘바다’, ‘사다’, ‘바다’, ‘보다’.",
"sha256": "db2f235bee26ac804b5362e8e013b8f40c8da24fd3a34e0fb3b43c6d264feb36",
"bytes": 382508,
"duration": 7.968,
"rms": 0.10000003134647438,
"peak": 0.684326171875
},
{
"file": "repeat-tree.wav",
"text": "두 번 들린 단어를 고르세요. ‘나무’, ‘나루’, ‘나무’, ‘너무’.",
"sha256": "8735c3d9672561ca237fa87317beec2878492eb9063d6048d5b214423561acc1",
"bytes": 423980,
"duration": 8.832,
"rms": 0.10000000739222943,
"peak": 0.618743896484375
},
{
"file": "repeat-hat.wav",
"text": "두 번 들린 단어를 고르세요. ‘모자’, ‘포자’, ‘모자’, ‘모조’.",
"sha256": "6e089a42fd7e65e82eec7186d369c926fb7fdac794365b2bd7658822fd92437c",
"bytes": 396332,
"duration": 8.256,
"rms": 0.09999999984675931,
"peak": 0.616729736328125
},
{
"file": "repeat-umbrella.wav",
"text": "두 번 들린 단어를 고르세요. ‘우산’, ‘부산’, ‘우산’, ‘오산’.",
"sha256": "5e59ef39113c3d5e106862356d715f4cef2862ef8ee02654a97e532675c1ac6d",
"bytes": 410156,
"duration": 8.544,
"rms": 0.09999995863648034,
"peak": 0.674835205078125
},
{
"file": "repeat-market.wav",
"text": "두 번 들린 단어를 고르세요. ‘시장’, ‘지장’, ‘시장’, ‘사장’.",
"sha256": "68a5b899115a66ab225d610ec47b4de56cc8793657362bc38f533c06f741e4cc",
"bytes": 402092,
"duration": 8.376,
"rms": 0.09999998813966116,
"peak": 0.6822509765625
},
{
"file": "repeat-oil.wav",
"text": "두 번 들린 단어를 고르세요. ‘기름’, ‘이름’, ‘기름’, ‘거름’.",
"sha256": "55b2c7d6aa8bbce04edf8661882c9781da81c57f56217f99b80457a3bb895da0",
"bytes": 369836,
"duration": 7.704,
"rms": 0.0999999804882663,
"peak": 0.62396240234375
},
{
"file": "repeat-sound.wav",
"text": "두 번 들린 단어를 고르세요. ‘소리’, ‘오리’, ‘소리’, ‘수리’.",
"sha256": "e9d636ff7f4777f38b1ff15bebdcec6fbde95b4b4b05625a7415b4cfa0025b59",
"bytes": 395180,
"duration": 8.232,
"rms": 0.1000000073748717,
"peak": 0.6114501953125
},
{
"file": "repeat-meat.wav",
"text": "두 번 들린 단어를 고르세요. ‘고기’, ‘보기’, ‘고기’, ‘고개’.",
"sha256": "6599d2fac73ea616a793151b4ce6f51af673988d630bac6219a77e78ae6cb34e",
"bytes": 380204,
"duration": 7.92,
"rms": 0.10000001571010926,
"peak": 0.59210205078125
},
{
"file": "repeat-furniture.wav",
"text": "두 번 들린 단어를 고르세요. ‘가구’, ‘하구’, ‘가구’, ‘가교’.",
"sha256": "bf84dc6cff1f227924a3a62158d2fc18769fb0ca40b91418fa19e534dbf92f00",
"bytes": 397484,
"duration": 8.28,
"rms": 0.10000003132755503,
"peak": 0.667022705078125
},
{
"file": "correction-apple.wav",
"text": "정답은 ‘다과’입니다. 아니, 잘못 말했어요. 정정한 답은 ‘사과’입니다.",
"sha256": "ccd7327a3fb54d3320d049ffdced3bc17595861cee69429c0ee97182d454195b",
"bytes": 402092,
"duration": 8.376,
"rms": 0.10000001654596266,
"peak": 0.490325927734375
},
{
"file": "correction-sea.wav",
"text": "정답은 ‘사다’입니다. 아니, 잘못 말했어요. 정정한 답은 ‘바다’입니다.",
"sha256": "9233431d78ab4b144e3c33ad0cf0d49fc0fb91b29514343230ba32987b794bb3",
"bytes": 398636,
"duration": 8.304,
"rms": 0.09999997225238083,
"peak": 0.49615478515625
},
{
"file": "correction-tree.wav",
"text": "정답은 ‘나루’입니다. 아니, 잘못 말했어요. 정정한 답은 ‘나무’입니다.",
"sha256": "b8e8bbe6b8b14727efd953fae9d4aed2caeb004055d52f611c6378322847edbe",
"bytes": 400940,
"duration": 8.352,
"rms": 0.10000003932190811,
"peak": 0.470611572265625
},
{
"file": "correction-hat.wav",
"text": "정답은 ‘포자’입니다. 아니, 잘못 말했어요. 정정한 답은 ‘모자’입니다.",
"sha256": "f9f98c91cfbcfcb106eef7d5d3795a9cf3c3aab7e19a60f13d7dffe284d19f86",
"bytes": 398636,
"duration": 8.304,
"rms": 0.10000000019629104,
"peak": 0.470977783203125
},
{
"file": "correction-umbrella.wav",
"text": "정답은 ‘부산’입니다. 아니, 잘못 말했어요. 정정한 답은 ‘우산’입니다.",
"sha256": "92b54f04884ab915783945077efd8f3bd443849a1720f72168b6348cae1f8e85",
"bytes": 406700,
"duration": 8.472,
"rms": 0.10000000137593418,
"peak": 0.479034423828125
},
{
"file": "correction-market.wav",
"text": "정답은 ‘지장’입니다. 아니, 잘못 말했어요. 정정한 답은 ‘시장’입니다.",
"sha256": "b8d25b867497adcd0fe7c8b6a8a8d2e7a52965956738a83e53f58735708773f9",
"bytes": 405548,
"duration": 8.448,
"rms": 0.10000000759335076,
"peak": 0.491485595703125
},
{
"file": "correction-oil.wav",
"text": "정답은 ‘이름’입니다. 아니, 잘못 말했어요. 정정한 답은 ‘기름’입니다.",
"sha256": "f6eff0cdddcad9790351491e60c53cb2a70d222033a583652f2de0b8cd6abcc7",
"bytes": 406700,
"duration": 8.472,
"rms": 0.09999998611167496,
"peak": 0.470794677734375
},
{
"file": "correction-sound.wav",
"text": "정답은 ‘오리’입니다. 아니, 잘못 말했어요. 정정한 답은 ‘소리’입니다.",
"sha256": "5a603bc69979603afddcaeb6edf500a7c540b72405daeb33f5335d746b327da1",
"bytes": 397484,
"duration": 8.28,
"rms": 0.10000004224092506,
"peak": 0.469268798828125
},
{
"file": "correction-meat.wav",
"text": "정답은 ‘보기’입니다. 아니, 잘못 말했어요. 정정한 답은 ‘고기’입니다.",
"sha256": "48e91b3932d3798e852041a854b3ee08c72127e092c62083a47af6b99adff241",
"bytes": 403244,
"duration": 8.4,
"rms": 0.09999999319342226,
"peak": 0.481536865234375
},
{
"file": "correction-furniture.wav",
"text": "정답은 ‘하구’입니다. 아니, 잘못 말했어요. 정정한 답은 ‘가구’입니다.",
"sha256": "5c004a7b2f5a4a918c9f689f1a2dcb219a620ed14313f40a9655b36dbf64948d",
"bytes": 398636,
"duration": 8.304,
"rms": 0.10000003705538822,
"peak": 0.487396240234375
},
{
"file": "middle-apple.wav",
"text": "세 단어 중 가운데를 고르세요. ‘다과’, ‘사과’, ‘사고’.",
"sha256": "8832f1b793ab3eedbe663875ea8dbeabb122c329bd5879437c71230b0418c3c8",
"bytes": 360620,
"duration": 7.512,
"rms": 0.1000000102385111,
"peak": 0.553558349609375
},
{
"file": "middle-sea.wav",
"text": "세 단어 중 가운데를 고르세요. ‘사다’, ‘바다’, ‘보다’.",
"sha256": "b6dbe0af143ea775f05bd59a3d6af348bcc770ab378ac91ea75a56e06c326edf",
"bytes": 346796,
"duration": 7.224,
"rms": 0.1000000185368972,
"peak": 0.56494140625
},
{
"file": "middle-tree.wav",
"text": "세 단어 중 가운데를 고르세요. ‘나루’, ‘나무’, ‘너무’.",
"sha256": "341888c75275c13eb31058f53a1d4276be0daa0a1b5a3a45522036928b83b0c1",
"bytes": 382508,
"duration": 7.968,
"rms": 0.09999997157674806,
"peak": 0.600006103515625
},
{
"file": "middle-hat.wav",
"text": "세 단어 중 가운데를 고르세요. ‘포자’, ‘모자’, ‘모조’.",
"sha256": "b01ef9762ac84e3eb757243bc9286c62f7d45444a821ae35ac36a8b095e1598a",
"bytes": 353708,
"duration": 7.368,
"rms": 0.09999999400343942,
"peak": 0.555206298828125
},
{
"file": "middle-umbrella.wav",
"text": "세 단어 중 가운데를 고르세요. ‘부산’, ‘우산’, ‘오산’.",
"sha256": "399ea2f681f755918f1117c8baba42739ceca64b307b999342f457a9235050b6",
"bytes": 368684,
"duration": 7.68,
"rms": 0.10000004859108667,
"peak": 0.569549560546875
},
{
"file": "middle-market.wav",
"text": "세 단어 중 가운데를 고르세요. ‘지장’, ‘시장’, ‘사장’.",
"sha256": "c855b449e0d4ace74681bfe68e5e7f0b063568827ae872017234dbe8ae119e4c",
"bytes": 356012,
"duration": 7.416,
"rms": 0.10000000455585449,
"peak": 0.594970703125
},
{
"file": "middle-oil.wav",
"text": "세 단어 중 가운데를 고르세요. ‘이름’, ‘기름’, ‘거름’.",
"sha256": "7a6b122b11c07da86c95fb78e2db2a70681b5219c63d6441fe56da1979ac1dc3",
"bytes": 334124,
"duration": 6.96,
"rms": 0.10000001284837577,
"peak": 0.5399169921875
},
{
"file": "middle-sound.wav",
"text": "세 단어 중 가운데를 고르세요. ‘오리’, ‘소리’, ‘수리’.",
"sha256": "4d00aa6114327f450a00dacbc7e7b572ebf1de4ce9dc2fe4b5505766cca71ce9",
"bytes": 353708,
"duration": 7.368,
"rms": 0.09999999876572897,
"peak": 0.534820556640625
},
{
"file": "middle-meat.wav",
"text": "세 단어 중 가운데를 고르세요. ‘보기’, ‘고기’, ‘고개’.",
"sha256": "d416107cc05e7c5b92ca27100a10a8a9689de913346179945d5542de4a6bac0c",
"bytes": 342188,
"duration": 7.128,
"rms": 0.10000002241734321,
"peak": 0.510833740234375
},
{
"file": "middle-furniture.wav",
"text": "세 단어 중 가운데를 고르세요. ‘하구’, ‘가구’, ‘가교’.",
"sha256": "b45b1afc8d9b534ff3e0a2a2ecb99efc1f4e40d41f89f55c4ed8ba94ad6d76d4",
"bytes": 354860,
"duration": 7.392,
"rms": 0.10000000075274348,
"peak": 0.5576171875
},
{
"file": "message-apple.wav",
"text": "초록 불이면 앞 단어, 빨간 불이면 뒤 단어입니다. ‘다과’, ‘사과’. 지금은 빨간 불입니다.",
"sha256": "d85e6f47d871369f00de2274139e5ad6b4b5686b5e20e248df0ed6b9a320d942",
"bytes": 517292,
"duration": 10.776,
"rms": 0.10000001428889653,
"peak": 0.525360107421875
},
{
"file": "message-sea.wav",
"text": "초록 불이면 앞 단어, 빨간 불이면 뒤 단어입니다. ‘사다’, ‘바다’. 지금은 빨간 불입니다.",
"sha256": "28a461fbe03bffe2560030dea8b60715f7c0fe262dcf85b5b7f7daf483836382",
"bytes": 517292,
"duration": 10.776,
"rms": 0.09999998804256775,
"peak": 0.53521728515625
},
{
"file": "message-tree.wav",
"text": "초록 불이면 앞 단어, 빨간 불이면 뒤 단어입니다. ‘나루’, ‘나무’. 지금은 빨간 불입니다.",
"sha256": "5d684aa710a63d36ed8dcc2a8bfbdd5c71b0b1c63dad2a324adecb76591e85b8",
"bytes": 540332,
"duration": 11.256,
"rms": 0.09999996112285715,
"peak": 0.5262451171875
},
{
"file": "message-hat.wav",
"text": "초록 불이면 앞 단어, 빨간 불이면 뒤 단어입니다. ‘포자’, ‘모자’. 지금은 빨간 불입니다.",
"sha256": "5a713a8522b231bb8276805c014b385b9150b79f58ff2618446607e2b442495e",
"bytes": 518444,
"duration": 10.8,
"rms": 0.10000001032745777,
"peak": 0.587005615234375
},
{
"file": "message-umbrella.wav",
"text": "초록 불이면 앞 단어, 빨간 불이면 뒤 단어입니다. ‘부산’, ‘우산’. 지금은 빨간 불입니다.",
"sha256": "41d5866dae66600df4694a8312b531571d44cece6dba0e423e7c43d09d184819",
"bytes": 523052,
"duration": 10.896,
"rms": 0.09999985338851038,
"peak": 0.530364990234375
},
{
"file": "message-market.wav",
"text": "초록 불이면 앞 단어, 빨간 불이면 뒤 단어입니다. ‘지장’, ‘시장’. 지금은 빨간 불입니다.",
"sha256": "9242d4cd6e0030e6b073e4d2360f84aa8a454d1749711cdb2d64c14f28a7ea20",
"bytes": 523052,
"duration": 10.896,
"rms": 0.10000000012409799,
"peak": 0.534820556640625
},
{
"file": "message-oil.wav",
"text": "초록 불이면 앞 단어, 빨간 불이면 뒤 단어입니다. ‘이름’, ‘기름’. 지금은 빨간 불입니다.",
"sha256": "a2a71a7e5e07c81871a25c6cb7540c39aa0b32fc44f78cda66b5f34ace98d805",
"bytes": 509228,
"duration": 10.608,
"rms": 0.09999999520245731,
"peak": 0.51812744140625
},
{
"file": "message-sound.wav",
"text": "초록 불이면 앞 단어, 빨간 불이면 뒤 단어입니다. ‘오리’, ‘소리’. 지금은 빨간 불입니다.",
"sha256": "1e682147dae8026ba78dc8f256c7f24acb3a6743bfd88a0fcc86096930eef078",
"bytes": 521900,
"duration": 10.872,
"rms": 0.09999998164749332,
"peak": 0.51953125
},
{
"file": "message-meat.wav",
"text": "초록 불이면 앞 단어, 빨간 불이면 뒤 단어입니다. ‘보기’, ‘고기’. 지금은 빨간 불입니다.",
"sha256": "ce19735df079b54c171e775b6b365385a80160b9033442abab95b2b9c8505e1a",
"bytes": 512684,
"duration": 10.68,
"rms": 0.10000001752061703,
"peak": 0.5147705078125
},
{
"file": "message-furniture.wav",
"text": "초록 불이면 앞 단어, 빨간 불이면 뒤 단어입니다. ‘하구’, ‘가구’. 지금은 빨간 불입니다.",
"sha256": "26c331b7e12311236f4bb48f88918dfbf53cccd2f50b55741ea6ff4473e71dd8",
"bytes": 521900,
"duration": 10.872,
"rms": 0.09999998693144198,
"peak": 0.529327392578125
},
{
"file": "mission-apple.wav",
"text": "오른쪽 표지는 ‘사과’, 왼쪽 표지는 ‘다과’입니다.",
"sha256": "3ef42e276ff3500c3e197d149f29f79d6a0c1d5516ed1d5a2c57210333fded9c",
"bytes": 246572,
"duration": 5.136,
"rms": 0.10000000281248776,
"peak": 0.47015380859375
},
{
"file": "mission-sea.wav",
"text": "오른쪽 표지는 ‘바다’, 왼쪽 표지는 ‘사다’입니다.",
"sha256": "8838d6a1ee8a790427dc5aa761e70b3d8872af62086efeed743297ff7f8b8a06",
"bytes": 243116,
"duration": 5.064,
"rms": 0.10000001881351578,
"peak": 0.45013427734375
},
{
"file": "mission-tree.wav",
"text": "오른쪽 표지는 ‘나무’, 왼쪽 표지는 ‘나루’입니다.",
"sha256": "00d8e77ec0371971d632724d91f8cf8d947bfb83c582a513b6421be4c457a1da",
"bytes": 241964,
"duration": 5.04,
"rms": 0.09999999375024479,
"peak": 0.458526611328125
},
{
"file": "mission-hat.wav",
"text": "오른쪽 표지는 ‘모자’, 왼쪽 표지는 ‘포자’입니다.",
"sha256": "308278ec2bd27d4224976a55632d1f7fa1edabb0792126d9d858a699c287aee4",
"bytes": 245420,
"duration": 5.112,
"rms": 0.10000000114877691,
"peak": 0.4498291015625
},
{
"file": "mission-umbrella.wav",
"text": "오른쪽 표지는 ‘우산’, 왼쪽 표지는 ‘부산’입니다.",
"sha256": "4b4c858a25659540f9dbc524664496fc6de61ab8c1627f3cfee8c9c744e11d5b",
"bytes": 247724,
"duration": 5.16,
"rms": 0.1000000183428341,
"peak": 0.46533203125
},
{
"file": "mission-market.wav",
"text": "오른쪽 표지는 ‘시장’, 왼쪽 표지는 ‘지장’입니다.",
"sha256": "cefa0e95649ea6bd1df4c8dfccd2b74b4f4c028714420ce1087b61db2f2a8d47",
"bytes": 248876,
"duration": 5.184,
"rms": 0.10000000503014783,
"peak": 0.485687255859375
},
{
"file": "mission-oil.wav",
"text": "오른쪽 표지는 ‘기름’, 왼쪽 표지는 ‘이름’입니다.",
"sha256": "5fb63e04520c312aa6b7b48b70c2f7c140b5ab480e5c6992edbc2ba85b9a06e7",
"bytes": 241964,
"duration": 5.04,
"rms": 0.10000003066640888,
"peak": 0.443572998046875
},
{
"file": "mission-sound.wav",
"text": "오른쪽 표지는 ‘소리’, 왼쪽 표지는 ‘오리’입니다.",
"sha256": "659eb0e2b06e6b165b46744769743e032e2282519f8486c57bc45e0f7d07a069",
"bytes": 240812,
"duration": 5.016,
"rms": 0.10000000508879303,
"peak": 0.454803466796875
},
{
"file": "mission-meat.wav",
"text": "오른쪽 표지는 ‘고기’, 왼쪽 표지는 ‘보기’입니다.",
"sha256": "94f8a4f9e116a787e5ed052661d6de9ecf3ad8629db476661dd59ad03014b0c9",
"bytes": 244268,
"duration": 5.088,
"rms": 0.0999999931549985,
"peak": 0.441864013671875
},
{
"file": "mission-furniture.wav",
"text": "오른쪽 표지는 ‘가구’, 왼쪽 표지는 ‘하구’입니다.",
"sha256": "af82e03b686635c3356e706fe5b05c1231aeaaeab33f275aa5b8714988c65d43",
"bytes": 241964,
"duration": 5.04,
"rms": 0.09999996810995776,
"peak": 0.4852294921875
}
],
"generatedForVersion": "0.1.1",
"releaseNote": "0.2.3 retains all 101 original v0.1.1 neural WAV bytes; only release metadata changed."
}
@@ -0,0 +1,4 @@
{
"status": "passed",
"failedTests": []
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,4 @@
{
"status": "passed",
"failedTests": []
}
@@ -0,0 +1,6 @@
{
"status": "failed",
"failedTests": [
"8b5f6416abeab163a0eb-f77a1fb967b324d0e8f6"
]
}
@@ -0,0 +1,265 @@
# Instructions
- Following Playwright test failed.
- Explain why, be concise, respect Playwright best practices.
- Provide a snippet of code with the fix, if possible.
# Test info
- Name: gains.spec.ts >> 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다
- Location: tests/browser/gains.spec.ts:74:1
# Error details
```
Error: expect(received).toBeCloseTo(expected, precision)
Expected: 0.4198884518664126
Received: 1
Expected precision: 6
Expected difference: < 0.0000005
Received difference: 0.5801115481335875
```
# Page snapshot
```yaml
- generic [ref=e2]:
- link "본문으로 건너뛰기" [ref=e3] [cursor=pointer]:
- /url: "#main"
- banner [ref=e4]:
- generic [ref=e5]:
- heading "단어를 맞춰라" [level=1] [ref=e11]
- generic [ref=e12]: v0.2.5
- generic [ref=e13]:
- button "문제 풀이 종료" [ref=e14] [cursor=pointer]
- text: 소리에 집중하는 시간
- main [ref=e16]:
- region "단어 찾기 게임" [ref=e17]:
- generic [ref=e18]:
- generic [ref=e19]: 나의 소리 탐험
- generic [ref=e20]: 문제 01 / 3
- progressbar "현재 문항 진행률" [ref=e21]
- generic [ref=e22]:
- complementary [ref=e23]:
- paragraph [ref=e24]: 지금 듣고 있는 공간
- heading "길거리" [level=2] [ref=e25]
- paragraph [ref=e26]: 지나가는 차와 도시의 웅성임
- generic [ref=e33]: S
- generic [ref=e70]: 1단계 · SNR -12 dB
- paragraph [ref=e71]: 소리에 익숙해지기
- generic [ref=e72]:
- generic [ref=e73]: 목표 음성 SNR
- slider "목표 음성 SNR" [ref=e74] [cursor=pointer]: "-12"
- status [ref=e75]: SNR -12 dB
- paragraph [ref=e76]: 음성이 기준보다 12 dB 작아요. 범위 −12~+12 dB · 1 dB 간격. 배경 크기는 일정해요. 양수는 음성을 더 크게, 0은 기준 크기로, 음수는 더 작게 들려줘요. 변경은 다음 재생·재청취부터 적용돼요.
- generic [ref=e77]:
- generic [ref=e78]: ◖)) 전체 음량
- slider "전체 음량" [ref=e79] [cursor=pointer]: "100"
- status [ref=e80]: 100%
- generic [ref=e81]:
- generic [ref=e82]:
- text: 점수
- generic [ref=e83]: "0"
- generic [ref=e84]:
- text: 연속 정답
- generic [ref=e85]: "0"
- generic [ref=e86]:
- generic [ref=e87]:
- generic [ref=e88]: 두 번의 힌트
- generic [ref=e89]: 객관식
- generic [ref=e90]:
- generic [aria-hidden] [ref=e91]: ♬
- heading "소리 사이에 집중해 보세요." [level=2] [ref=e92]
- paragraph [ref=e93]: 문장이 끝나면 질문이 나타나요.작은 단어 하나를 기억해 주세요.
- status [ref=e94]: 에스의 목소리를 듣고 있어요…
- generic [ref=e95]:
- button "듣는 중…" [disabled] [ref=e96]
- button "듣기 중단" [ref=e97] [cursor=pointer]
- generic [ref=e98]: 다시 들어도 점수는 줄어들지 않아요.
- contentinfo [ref=e99]:
- paragraph [ref=e100]: Designed by OZ at Heat-T Medical Inc.
- paragraph [ref=e101]: 청각적 주의·식별 게임 · 의료적 진단이나 치료를 제공하지 않습니다.
- generic [ref=e102]: 개인정보 수집 없이, 오직 플레이만.
- link "환경음 출처·라이선스" [ref=e103] [cursor=pointer]:
- /url: /ambience/AMBIENCE_NOTICES.md
```
# Test source
```ts
19 | }[];
20 | };
21 | }
22 | }
23 | test.beforeEach(async ({ page }) => {
24 | await page.addInitScript(() => {
25 | window.mixerProbe = { sources: [] };
26 | const edges = new WeakMap<AudioNode, AudioNode>();
27 | const settings = new WeakMap<AudioParam, number>();
28 | const connect = AudioNode.prototype.connect;
29 | const set = AudioParam.prototype.setValueAtTime;
30 | const start = AudioBufferSourceNode.prototype.start;
31 | AudioNode.prototype.connect = function (
32 | this: AudioNode,
33 | destination: AudioNode,
34 | output?: number,
35 | input?: number,
36 | ) {
37 | const result = Reflect.apply(connect, this, [
38 | destination,
39 | output ?? 0,
40 | input ?? 0,
41 | ]);
42 | edges.set(this, destination);
43 | return result;
44 | } as typeof connect;
45 | AudioParam.prototype.setValueAtTime = function (value, time) {
46 | const result = set.call(this, value, time);
47 | if (value > 0) settings.set(this, value);
48 | return result;
49 | };
50 | AudioBufferSourceNode.prototype.start = function (...args) {
51 | const gain = edges.get(this) as GainNode;
52 | const master = edges.get(gain) as GainNode;
53 | const data = this.buffer!.getChannelData(0);
54 | const record = {
55 | loop: this.loop,
56 | duration: this.buffer!.duration,
57 | rate: this.buffer!.sampleRate,
58 | peak: data.reduce((max, x) => Math.max(max, Math.abs(x)), 0),
59 | rms: Math.sqrt(data.reduce((sum, x) => sum + x * x, 0) / data.length),
60 | scheduled: settings.get(gain.gain)!,
61 | master: master.gain.value,
62 | observed: undefined as number | undefined,
63 | };
64 | window.mixerProbe.sources.push(record);
65 | if (this.loop)
66 | setTimeout(() => {
67 | record.observed = gain.gain.value;
68 | }, 350);
69 | return start.apply(this, args);
70 | };
71 | });
72 | });
73 |
74 | test("실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다", async ({
75 | page,
76 | browser,
77 | }, info) => {
78 | const errors: string[] = [],
79 | failed: string[] = [],
80 | external: string[] = [];
81 | page.on("pageerror", (e) => errors.push(e.message));
82 | page.on("console", (m) => {
83 | if (m.type() === "error") errors.push(m.text());
84 | });
85 | page.on("requestfailed", (r) => failed.push(r.url()));
86 | page.on("request", (r) => {
87 | if (new URL(r.url()).origin !== "http://127.0.0.1:4173")
88 | external.push(r.url());
89 | });
90 | await page.goto("/");
91 | // master=1에서도 같은 안전 상한을 만족하는지 확인한다.
92 | await page.getByRole("slider", { name: "전체 음량" }).fill("100");
93 | const rows = [];
94 | for (const environment of ENVIRONMENTS)
95 | for (const db of [-12, 0, 12]) {
96 | await page.getByLabel("배경 환경").selectOption(environment.id);
97 | await page
98 | .getByRole("slider", { name: "목표 음성 SNR" })
99 | .fill(String(db));
100 | await page.evaluate(() => {
101 | window.mixerProbe.sources = [];
102 | });
103 | await page.getByRole("button", { name: "게임 시작 · 소리 듣기" }).click();
104 | await expect
105 | .poll(() =>
106 | page.evaluate(
107 | () =>
108 | window.mixerProbe.sources.filter((s) => s.observed !== undefined)
109 | .length,
110 | ),
111 | )
112 | .toBe(1);
113 | const sources = await page.evaluate(() => window.mixerProbe.sources);
114 | expect(sources).toHaveLength(3);
115 | const [background, intro, voice] = sources;
116 | expect(background!.loop).toBe(true);
117 | expect(background!.duration).toBe(12);
118 | expect(background!.scheduled).toBe(FIXED_HEADROOM_GAIN);
> 119 | expect(background!.observed).toBeCloseTo(FIXED_HEADROOM_GAIN, 6);
| ^ Error: expect(received).toBeCloseTo(expected, precision)
120 | expect(voice!.scheduled / background!.scheduled).toBeCloseTo(
121 | 10 ** (db / 20),
122 | 10,
123 | );
124 | expect(intro!.scheduled).toBeCloseTo(FIXED_HEADROOM_GAIN * 1.8, 10);
125 | expect(voice!.rms).toBeCloseTo(0.03, 6);
126 | expect(intro!.rms).toBeCloseTo(0.03, 6);
127 | for (const [kind, source] of [
128 | ["background", background],
129 | ["voice", voice],
130 | ["intro", intro],
131 | ] as const) {
132 | expect(source!.peak).toBeLessThanOrEqual(PEAK_BOUNDS[kind]);
133 | expect(source!.master).toBe(1);
134 | }
135 | rows.push({ environment: environment.id, db, sources });
136 | await page.getByRole("button", { name: "문제 풀이 종료" }).click();
137 | await page.getByRole("button", { name: "처음 화면으로" }).click();
138 | }
139 | // 같은 PCM의 RMS도 모든 SNR에서 보존된다. 배경 재정규화나 gain 보상이 없어야 한다.
140 | for (const environment of ENVIRONMENTS) {
141 | const rms = rows
142 | .filter((r) => r.environment === environment.id)
143 | .map((r) => r.sources[0]!.rms);
144 | expect(new Set(rms).size).toBe(1);
145 | }
146 | expect({ errors, failed, external }).toEqual({
147 | errors: [],
148 | failed: [],
149 | external: [],
150 | });
151 | await info.attach("actual-gain-nodes", {
152 | body: JSON.stringify(
153 | {
154 | chrome: browser.version(),
155 | fixedGain: FIXED_HEADROOM_GAIN,
156 | rows,
157 | errors,
158 | failed,
159 | external,
160 | },
161 | null,
162 | 2,
163 | ),
164 | contentType: "application/json",
165 | });
166 | });
167 |
168 | // HTTP 200으로 반환되는 실제 WAV 한 sample만 바꾼다. decoder가 허용하는 손상도 hash가 차단해야 한다.
169 | test("실제 WAV 변조는 소스 시작 전에 거부하고 원본 재시도로 회복한다", async ({
170 | page,
171 | }) => {
172 | await page.route(/\/ambience\/.*\.wav/, async (route) => {
173 | const response = await route.fetch();
174 | const body = await response.body();
175 | body[100] = body[100]! ^ 1;
176 | await route.fulfill({ response, body });
177 | });
178 | await page.goto("/");
179 | await page.getByRole("button", { name: "게임 시작 · 소리 듣기" }).click();
180 | await expect(page.getByRole("alert")).toContainText(
181 | "소리를 재생하지 못했어요",
182 | );
183 | expect(await page.evaluate(() => window.mixerProbe.sources)).toEqual([]);
184 | await page.unroute(/\/ambience\/.*\.wav/);
185 | await page.getByRole("button", { name: "다시 시도" }).click();
186 | await expect(page.getByRole("group", { name: "답 선택" })).toBeVisible({
187 | timeout: 30000,
188 | });
189 | });
190 |
```

Some files were not shown because too many files have changed in this diff Show More