feat: release Find-Word v0.2.3

This commit is contained in:
oz
2026-10-14 10:01:46 +00:00
parent c92660b514
commit 812540c743
531 changed files with 103693 additions and 325 deletions
@@ -0,0 +1,81 @@
$ npx vitest run tests/ambience.test.ts
Started UTC: 2026-10-14T09:32:28.005336+00:00
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.3
❯ tests/ambience.test.ts (6 tests | 3 failed) 658ms
× 선택 구간은 승인 계획의 불변 provenance이며 manifest와 고지에 동일하게 남는다 8ms
× 최종 ASR 증거는 정확한 WAV와 연결되며 청취·법적 인수로 주장하지 않는다 2ms
× 재시도는 market/cafe만 바꾸고 mall 및 실패·no-VAD 증거를 바이트 그대로 보존한다 198ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 3 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/ambience.test.ts > 선택 구간은 승인 계획의 불변 provenance이며 manifest와 고지에 동일하게 남는다
AssertionError: expected { street: 35, mall: 36, …(6) } to deeply equal { street: 35, mall: 36, …(6) }
- Expected
+ Received
{
- "cafe": 0,
+ "cafe": 180,
"department": 90,
"mall": 36,
- "market": 24,
+ "market": 60,
"rain": 180,
"street": 35,
"subway": 65,
"theater": 45,
}
❯ tests/ambience.test.ts:159:5
157| ),
158| ),
159| ).toEqual(starts);
| ^
160| for (const asset of plan.assets) {
161| const start = asset.selectedSegmentStartSeconds;
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/3]⎯
FAIL tests/ambience.test.ts > 최종 ASR 증거는 정확한 WAV와 연결되며 청취·법적 인수로 주장하지 않는다
AssertionError: expected false to be true // Object.is equality
- Expected
+ Received
- true
+ false
❯ tests/ambience.test.ts:194:41
192| expect(screening.model).toMatchObject({ name: "tiny", multilingual: …
193| expect(screening.model.revision).toMatch(/^[a-f0-9]{40}$/);
194| expect(screening.requiredEmptyPassed).toBe(true);
| ^
195| expect(screening.requiredEmptyEnvironmentIds).toEqual(["mall", "mark…
196| expect(screening.method).toMatchObject({ device: "cpu", computeType:…
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/3]⎯
FAIL tests/ambience.test.ts > 재시도는 market/cafe만 바꾸고 mall 및 실패·no-VAD 증거를 바이트 그대로 보존한다
AssertionError: public/ambience/cafe.wav: expected '802a956e91b85a2fdd0e1f161d75bfada7a53…' not to be '802a956e91b85a2fdd0e1f161d75bfada7a53…' // Object.is equality
❯ tests/ambience.test.ts:320:36
318| for (const [path, before] of Object.entries(baseline.wavSha256)) {
319| if (/public\/ambience\/(market|cafe)\.wav$/.test(path)) {
320| expect(hash(path), path).not.toBe(before);
| ^
321| changed.push(path);
322| } else {
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/3]⎯
Test Files 1 failed (1)
Tests 3 failed | 3 passed (6)
Start at 09:32:28
Duration 937ms (tests 80%, setup 12%, transform 6%, import 1%, worker 1%)
Exit code: 1
Finished UTC: 2026-10-14T09:32:29.548064+00:00
@@ -0,0 +1,261 @@
$ python3 .agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/regenerate.py
Started UTC: 2026-10-14T09:33:20.842199+00:00
All eight source SHA-256, byte counts and direct-media durations match before conversion.
Preserved 101 voice WAVs and six ambience WAVs including mall; changed only market and cafe.
{
"completedAtUtc": "2026-10-14T09:33:24.596833+00:00",
"method": "ambience_audio.generate: source preflight, full staged bundle validation, atomic directory exchange",
"allSourcesMatchedBeforeConversion": true,
"planUnmodified": true,
"sources": [
{
"environmentId": "street",
"sha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"bytes": 3414104,
"directMediaDurationSeconds": 264.254694,
"selectedSegmentStartSeconds": 35
},
{
"environmentId": "mall",
"sha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"bytes": 1666896,
"directMediaDurationSeconds": 60.05551,
"selectedSegmentStartSeconds": 36
},
{
"environmentId": "theater",
"sha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"bytes": 1485015,
"directMediaDurationSeconds": 176.901224,
"selectedSegmentStartSeconds": 45
},
{
"environmentId": "department",
"sha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"bytes": 2445024,
"directMediaDurationSeconds": 292.872,
"selectedSegmentStartSeconds": 90
},
{
"environmentId": "market",
"sha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"bytes": 622200,
"directMediaDurationSeconds": 76.696961,
"selectedSegmentStartSeconds": 24
},
{
"environmentId": "subway",
"sha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"bytes": 3343901,
"directMediaDurationSeconds": 425.024,
"selectedSegmentStartSeconds": 65
},
{
"environmentId": "cafe",
"sha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"bytes": 19947952,
"directMediaDurationSeconds": 1200.000998,
"selectedSegmentStartSeconds": 0
},
{
"environmentId": "rain",
"sha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"bytes": 91187572,
"directMediaDurationSeconds": 1800.0,
"selectedSegmentStartSeconds": 180
}
],
"manifestSha256": "2aeae8bb7a1f6e12543ba7e32a233b47b1ebcfdd65c7e55f67fc8f22f8d0f8c1",
"toolVersions": {
"ffmpeg": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers"
},
"outputs": [
{
"environmentId": "street",
"selectedSegmentStartSeconds": 35,
"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",
"selectedSegmentStartSeconds": 36,
"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",
"selectedSegmentStartSeconds": 45,
"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",
"selectedSegmentStartSeconds": 90,
"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",
"selectedSegmentStartSeconds": 24,
"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",
"selectedSegmentStartSeconds": 65,
"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",
"selectedSegmentStartSeconds": 0,
"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",
"selectedSegmentStartSeconds": 180,
"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"
}
}
]
}
Exit code: 0
Finished UTC: 2026-10-14T09:33:24.694686+00:00
@@ -0,0 +1,14 @@
$ /tmp/findword-asr-venv/bin/python .agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screen-final.py
Started UTC: 2026-10-14T09:33:40.489425+00:00
{"environmentId": "street", "sha256": "a8bffa201b174618955bc51b860167169125304811aabe2086b0bb35b06c3ae1", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "mall", "sha256": "680a769940c08f0d12c6c954c08366598dd8b5745e276f39c82b10d1a88261a1", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "theater", "sha256": "2d6a444fb7874cdf6b2d8a741a69175299b112eb66834912c025437d8277d635", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "department", "sha256": "aa43f3d1d3e7c2b1f8ace24ecbda45d0ea3a031db941c39506dc6c1665b8efa7", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "market", "sha256": "d6f73d86aea98b83e2995e61baaa7315a0ea7adeebc093769d76e1569b207658", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "subway", "sha256": "9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "cafe", "sha256": "6853c121104940041c268a2891eadae032c17aa22b4c3b3ddfbc025262434995", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "rain", "sha256": "f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
All three changed excerpts have zero emitted segments. Screening signal only; no listening acceptance or legal/privacy clearance.
Exit code: 0
Finished UTC: 2026-10-14T09:33:44.452090+00:00
@@ -0,0 +1,14 @@
$ npx vitest run tests/ambience.test.ts
Started UTC: 2026-10-14T09:33:52.340507+00:00
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.3
Test Files 1 passed (1)
Tests 6 passed (6)
Start at 09:33:52
Duration 953ms (tests 79%, setup 12%, transform 6%, import 2%)
Exit code: 0
Finished UTC: 2026-10-14T09:33:53.892715+00:00
@@ -0,0 +1,15 @@
{
"command": "npm audit --json",
"startedAtUtc": "2026-10-14T09:36:05.550144+00:00",
"completedAtUtc": "2026-10-14T09:36:06.551382+00:00",
"exitCode": 0,
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 0,
"high": 0,
"critical": 0,
"total": 0
},
"stderr": ""
}
@@ -0,0 +1,20 @@
$ npm run build
Started UTC: 2026-10-14T09:36:04.326956+00:00
> find-word@0.2.3 build
> tsc --noEmit && vite build && node scripts/check-build.mjs
vite v8.3.4 building client environment for production...
transforming...
✓ 21 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-BChkBncw.js 247.95 kB │ gzip: 78.07 kB
✓ built in 271ms
빌드 음성 자산 101개 + 현장음 8개 및 런타임/현장음 notice 확인
Exit code: 0
Finished UTC: 2026-10-14T09:36:11.577511+00:00
@@ -0,0 +1,9 @@
$ npm run lint
Started UTC: 2026-10-14T09:36:04.304745+00:00
> find-word@0.2.3 lint
> eslint . && tsc --noEmit
Exit code: 0
Finished UTC: 2026-10-14T09:36:13.671100+00:00
@@ -0,0 +1,457 @@
$ python3 -m unittest discover -s tests/python -v
Started UTC: 2026-10-14T09:36:04.316973+00:00
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_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_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_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 36 tests in 13.687s
OK
Exit code: 0
Finished UTC: 2026-10-14T09:36:18.151721+00:00
@@ -0,0 +1,21 @@
$ npm test
Started UTC: 2026-10-14T09:36:42.755878+00:00
> find-word@0.2.3 test
> vitest run
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.3
Test Files 13 passed (13)
Tests 125 passed (125)
Start at 09:36:43
Duration 36.06s (tests 87%, environment 9%, setup 3%)
Isolate 13 workers spawned · ~885ms startup each (spawn + environment, per file)
at least ~2.95s faster with isolate: false — reuses workers across files instead of one per file
Exit code: 0
Finished UTC: 2026-10-14T09:37:19.332599+00:00
@@ -0,0 +1,59 @@
$ npx playwright test --reporter=line,json --output /home/hermes/worktrees/find-word-v0.2.3/.agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final
Started UTC: 2026-10-14T09:36:42.758794+00:00
CHROME_PATH=/usr/bin/google-chrome; PLAYWRIGHT_NO_SANDBOX unset; chromiumSandbox=true
[WebServer] (node:1521622) 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 30 tests using 2 workers
(node:1521680) 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:1521686) 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/30] [desktop] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
[2/30] [desktop] › tests/browser/game.spec.ts:8:1 › 실제 오디오로 혼합 모드 완주·레이아웃·접근성·외부 요청 없음
[3/30] [desktop] › tests/browser/game.spec.ts:130:3 › intro WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[4/30] [desktop] › tests/browser/game.spec.ts:130:3 › target WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[5/30] [desktop] › tests/browser/release.spec.ts:6:1 › 릴리스는 사용자 크레딧과 런타임 MIT notice 전문을 제공한다
[6/30] [desktop] › tests/browser/release.spec.ts:24:1 › 누락 음성·환경음은 query와 HTML accept에도 404이고 출처 고지는 번들된다
[7/30] [desktop] › tests/browser/review-fixes.spec.ts:27:1 › 리뷰: 한국어 모드·결과 어절은 320px와 360px에서도 갈라지거나 넘치지 않는다
[8/30] [desktop] › tests/browser/review-fixes.spec.ts:62:1 › 리뷰: 실제 진행 막대는 현재 문항의 1/3·2/3·3/3을 채운다
[9/30] [desktop] › tests/browser/rounds.spec.ts:35:1 › 시작 단계·SNR·3문항 완료→다음 단계·재생 중 종료·응답 후 종료·홈 초기화
[10/30] [desktop] › tests/browser/rounds.spec.ts:135:1 › 여덟 환경의 실제 WAV를 각각 디코드하고 루프 재생한 뒤 즉시 정지한다
[11/30] [desktop] › tests/browser/rounds.spec.ts:178:1 › 환경음 404는 한국어 오류와 재시도 후 정상 답변으로 복구한다
[12/30] [desktop] › tests/browser/ui.spec.ts:4:1 › 전체 음량은 설정 흐름 안에 들어가며 키보드로 조절된다
[13/30] [desktop] › tests/browser/ui.spec.ts:52:1 › 난이도 설명은 모바일에서도 보인다
[14/30] [desktop] › tests/browser/ui.spec.ts:68:1 › 한국어 제목은 단어 중간에서 줄바꿈하지 않는다
[15/30] [desktop] › tests/browser/ui.spec.ts:121:1 › 시작 단계와 SNR 설정은 카드 안에 들어가고 터치 영역을 확보한다
(node:1523631) 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)
[16/30] [mobile] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
(node:1523782) 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)
[17/30] [mobile] › tests/browser/game.spec.ts:8:1 › 실제 오디오로 혼합 모드 완주·레이아웃·접근성·외부 요청 없음
[18/30] [mobile] › tests/browser/game.spec.ts:130:3 › intro WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[19/30] [mobile] › tests/browser/game.spec.ts:130:3 › target WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[20/30] [mobile] › tests/browser/release.spec.ts:6:1 › 릴리스는 사용자 크레딧과 런타임 MIT notice 전문을 제공한다
[21/30] [mobile] › tests/browser/release.spec.ts:24:1 › 누락 음성·환경음은 query와 HTML accept에도 404이고 출처 고지는 번들된다
[22/30] [mobile] › tests/browser/review-fixes.spec.ts:27:1 › 리뷰: 한국어 모드·결과 어절은 320px와 360px에서도 갈라지거나 넘치지 않는다
[23/30] [mobile] › tests/browser/review-fixes.spec.ts:62:1 › 리뷰: 실제 진행 막대는 현재 문항의 1/3·2/3·3/3을 채운다
[24/30] [mobile] › tests/browser/rounds.spec.ts:35:1 › 시작 단계·SNR·3문항 완료→다음 단계·재생 중 종료·응답 후 종료·홈 초기화
[25/30] [mobile] › tests/browser/rounds.spec.ts:135:1 › 여덟 환경의 실제 WAV를 각각 디코드하고 루프 재생한 뒤 즉시 정지한다
[26/30] [mobile] › tests/browser/rounds.spec.ts:178:1 › 환경음 404는 한국어 오류와 재시도 후 정상 답변으로 복구한다
[27/30] [mobile] › tests/browser/ui.spec.ts:4:1 › 전체 음량은 설정 흐름 안에 들어가며 키보드로 조절된다
[28/30] [mobile] › tests/browser/ui.spec.ts:52:1 › 난이도 설명은 모바일에서도 보인다
[29/30] [mobile] › tests/browser/ui.spec.ts:68:1 › 한국어 제목은 단어 중간에서 줄바꿈하지 않는다
[30/30] [mobile] › tests/browser/ui.spec.ts:121:1 › 시작 단계와 SNR 설정은 카드 안에 들어가고 터치 영역을 확보한다
30 passed (4.0m)
Exit code: 0
Finished UTC: 2026-10-14T09:40:45.154633+00:00
@@ -0,0 +1,40 @@
$ python3 .agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/verify-preservation.py
Started UTC: 2026-10-14T09:37:29.675313+00:00
{
"completedAtUtc": "2026-10-14T09:37:31.286690+00:00",
"voiceWavsUnchanged": 101,
"unaffectedAmbienceWavsUnchanged": 5,
"mallWavUnchanged": true,
"allAmbienceWavsUnchangedInRetry": [
"public/ambience/department.wav",
"public/ambience/mall.wav",
"public/ambience/rain.wav",
"public/ambience/street.wav",
"public/ambience/subway.wav",
"public/ambience/theater.wav"
],
"changedWavs": [
{
"file": "public/ambience/cafe.wav",
"beforeSha256": "802a956e91b85a2fdd0e1f161d75bfada7a53499bcb57ba7f578411480ded216",
"afterSha256": "6853c121104940041c268a2891eadae032c17aa22b4c3b3ddfbc025262434995"
},
{
"file": "public/ambience/market.wav",
"beforeSha256": "7a7a980845a4aade2a7e8a108eae746220a4688e92792ee93d3deb76b2a762f6",
"afterSha256": "d6f73d86aea98b83e2995e61baaa7315a0ea7adeebc093769d76e1569b207658"
}
],
"priorAgentFilesUnchanged": 484,
"archivedPriorAttemptFilesUnchanged": 89,
"archiveFilesReadOnly": true,
"gitTrackedHistoricalAgentFilesUnchanged": 180,
"sourceProvenanceUnchangedExceptAuthorizedStarts": true,
"distMatchesCurrentAmbienceBundle": true,
"finalScreenMatchesCurrentFilesAndScript": true,
"finalAsrSha256": "82df338d83f7b6c8b6b04ecf43c7218b6787cc1b72d73d5c898197ec957a7070",
"head": "c92660b514f7af8eb556d3fa5c0fc80e4bdd4cf5"
}
Exit code: 0
Finished UTC: 2026-10-14T09:37:31.302490+00:00
@@ -0,0 +1,10 @@
$ python3 .agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/collect-browser-evidence.py
Started UTC: 2026-10-14T09:40:59.115807+00:00
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/.agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/collect-browser-evidence.py", line 49, in <module>
assert len(matches) == 1
^^^^^^^^^^^^^^^^^
AssertionError
Exit code: 1
Finished UTC: 2026-10-14T09:40:59.150626+00:00
@@ -0,0 +1,43 @@
$ python3 .agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/collect-browser-evidence-v2.py
Started UTC: 2026-10-14T09:41:28.261717+00:00
{
"browserStats": {
"startTime": "2026-10-14T09:36:44.096Z",
"duration": 240675.669,
"expected": 30,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"integrity": [
{
"project": "desktop",
"chrome": "146.0.7680.80",
"filesMatched": 109,
"externalRequests": 0,
"consoleOrPageErrors": 0,
"failedRequests": 0,
"evidence": "desktop-audio-integrity.json",
"levelTolerance": 3.0517578125e-05,
"maximumRmsDifference": 1.6421807213090611e-06,
"maximumPeakDifference": 2.5928020477294922e-05,
"levelToleranceReason": "One PCM16 step allows browser float decode scaling; SHA-256 and bytes must match exactly."
},
{
"project": "mobile",
"chrome": "146.0.7680.80",
"filesMatched": 109,
"externalRequests": 0,
"consoleOrPageErrors": 0,
"failedRequests": 0,
"evidence": "mobile-audio-integrity.json",
"levelTolerance": 3.0517578125e-05,
"maximumRmsDifference": 1.6421807213090611e-06,
"maximumPeakDifference": 2.5928020477294922e-05,
"levelToleranceReason": "One PCM16 step allows browser float decode scaling; SHA-256 and bytes must match exactly."
}
]
}
Exit code: 0
Finished UTC: 2026-10-14T09:41:28.299132+00:00
@@ -0,0 +1,11 @@
{
"completedAtUtc": "2026-10-14T09:42:14.468807+00:00",
"diffCheckExitCode": 0,
"currentLocalDocumentLinksValid": true,
"priorEvidenceUnchanged": true,
"archivedFilesUnchanged": 89,
"currentMetadataConsistent": true,
"historicalFailureStillFalse": true,
"verifiedFiles": 159,
"commitPushMergeTagDeployPerformed": false
}
@@ -0,0 +1,702 @@
{
"createdAtUtc": "2026-10-14T09:32:09.210738+00:00",
"wavSha256": {
"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",
"public/ambience/cafe.wav": "802a956e91b85a2fdd0e1f161d75bfada7a53499bcb57ba7f578411480ded216",
"public/ambience/department.wav": "aa43f3d1d3e7c2b1f8ace24ecbda45d0ea3a031db941c39506dc6c1665b8efa7",
"public/ambience/mall.wav": "680a769940c08f0d12c6c954c08366598dd8b5745e276f39c82b10d1a88261a1",
"public/ambience/market.wav": "7a7a980845a4aade2a7e8a108eae746220a4688e92792ee93d3deb76b2a762f6",
"public/ambience/rain.wav": "f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9",
"public/ambience/street.wav": "a8bffa201b174618955bc51b860167169125304811aabe2086b0bb35b06c3ae1",
"public/ambience/subway.wav": "9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f",
"public/ambience/theater.wav": "2d6a444fb7874cdf6b2d8a741a69175299b112eb66834912c025437d8277d635"
},
"priorAgentFiles": {
".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": "428185e3d58f60c9de1efbeb57dd59e4a308d9901a5b8f0d045456a51ec09672",
".agent/CONTEXT.md": "712bd056cfc8d0254d6c96e7a604d364779d3734d14899111792e7f343e6819b",
".agent/RESULT-v0.1.1.md": "d5d7077d4977d70a89086801dd8e7d5ae04e16a8e8009e41f3216008b743ac5b",
".agent/RESULT-v0.2.3.md": "6baf60ed6fa1c94c08f0c427946c552af9f605d42af07f1734edd8528451eda3",
".agent/RESULT.md": "eef6d73a67a8a7e90cd7b4747debc5976cc51571bc268328634413f698d0e311",
".agent/TASK-v0.1.1.md": "4e4a81c02cf16ae8a2a6b53da8501de512b6a6387d7d4eaf932833c63ada4aa7",
".agent/TASK-v0.2.3.md": "46ae8118506c756b97e29424e580843d0557c2f663f069e9ae71c04904fafb18",
".agent/TASK.md": "7e52739d5de3161aa60004ca8e65b5a5041d62c1b6a0e50c6c72ad8f6b183d61",
".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",
".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/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/browser-favicon-RED.json": "036a734efcdff9481b3d10f1b07159ef6ca056d9245cffa469c5b1c8fe87f2bb",
".agent/evidence-v0.2.3/browser-results.json": "060d18bd74f7179884205117c6c853dc783ec7a818bdfcc8a490ef1a679c77f6",
".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/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-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-desktop/attachments/109-versioned-WAV-integrity-bcde2a64dc46084caae2c89272a63e0ce1b6dc06.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-desktop/browser-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-mobile/attachments/109-versioned-WAV-integrity-c90c562b8cfd985ad0d76e1c0d918e5063cd2fba.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-mobile/browser-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-desktop/game.png": "a96e59237e3869125eb6099b15dc55fb5d7bd08af0f10c4d7e1b3d2d1eb2b8e3",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-desktop/home.png": "911b923e3a68e8deb0063efd88ed43eb1ed6c597c14bd5b9ee71f6b5161b6d7b",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-desktop/results.png": "51d34a4717075e8b516b2f334d6a30affecea776568052cc9ccb9d7518ecbebf",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-mobile/game.png": "a3c49b633277b3cd05e607f2bfe851b1b24a82cd16d7c5dcdbf6a75ecdf228d3",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-mobile/home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-mobile/results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/normal-results.png": "85e8b066ac128239de765f001c3542e6905018f5deaec7abac4a985006fb03b5",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-1.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-2.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-3.png": "fde834aa2f803612ef9cc7a68cea0c8d5a225289a82321ba0a59063d151e66a0",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-1.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-2.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-3.png": "9d198c8b07ea84e9f3d9ebad03831ffd61b98672a9e637e7ee9e9eead959cf28",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/browser-final/rounds-\uc2dc\uc791-\ub2e8\uacc4\u00b7SNR\u00b73\ubb38\ud56d-\uc644\ub8cc\u2192\ub2e4\uc74c-\ub2e8\uacc4\u00b7\uc7ac\uc0dd-\uc911-\uc885\ub8cc\u00b7\uc751\ub2f5-\ud6c4-\uc885\ub8cc\u00b7\ud648-\ucd08\uae30\ud654-desktop/early-exit.png": "47cf4429695d65ddad8d353aaa14dd5edcea3ef4c09c16b537d6a72c3e256533",
".agent/evidence-v0.2.3/privacy-screening/browser-final/rounds-\uc2dc\uc791-\ub2e8\uacc4\u00b7SNR\u00b73\ubb38\ud56d-\uc644\ub8cc\u2192\ub2e4\uc74c-\ub2e8\uacc4\u00b7\uc7ac\uc0dd-\uc911-\uc885\ub8cc\u00b7\uc751\ub2f5-\ud6c4-\uc885\ub8cc\u00b7\ud648-\ucd08\uae30\ud654-mobile/early-exit.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/browser-final/ui-\ud55c\uad6d\uc5b4-\uc81c\ubaa9\uc740-\ub2e8\uc5b4-\uc911\uac04\uc5d0\uc11c-\uc904\ubc14\uafc8\ud558\uc9c0-\uc54a\ub294\ub2e4-desktop/heading.png": "56fa16aa968018bcc3252168a0c9e7fd3b30d352cb831b29caed75329c96dac7",
".agent/evidence-v0.2.3/privacy-screening/browser-final/ui-\ud55c\uad6d\uc5b4-\uc81c\ubaa9\uc740-\ub2e8\uc5b4-\uc911\uac04\uc5d0\uc11c-\uc904\ubc14\uafc8\ud558\uc9c0-\uc54a\ub294\ub2e4-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-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-desktop/error-context.md": "958700898c966a2ab19189862cc6bc40bb168b0131c90c381220df9f05426f5f",
".agent/evidence-v0.2.3/privacy-screening/browser-red/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-desktop/trace.zip": "a4d9f4a9cfb1be6becad762bd6b5da9610e023ec1a5f675abe188320603aaae7",
".agent/evidence-v0.2.3/privacy-screening/browser-red/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-mobile/error-context.md": "caa0871351f61738f3a139ab12945f8255c826e0b0c34417c93167eb5b5fb41a",
".agent/evidence-v0.2.3/privacy-screening/browser-red/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-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": "01c8a92fab9f8df7a5f778c5f7e478ce96bcedc33e11a1055bd29154a08b706b",
".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-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/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": "a1ddbeff130d719d5f0f0fe046ad1f751b3963c3bdc30c2303bb14894c602d34",
".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-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-desktop/attachments/109-versioned-WAV-integrity-7406877c173ee35afff758c9c5f1645f0dc02fa5.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/review-fixes/browser-final/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-desktop/browser-audio-integrity.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/review-fixes/browser-final/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-mobile/attachments/109-versioned-WAV-integrity-9b9f8223b6524087ac395eb7a96ac0d386fbcb95.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/review-fixes/browser-final/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-mobile/browser-audio-integrity.json": "3d6defdb7ad3b8d4d7949ffe476f4ebf685e5dcc1ad0868b98bb4e639b6dcadb",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-desktop/game.png": "17c22581f74ddcd78770ebfbb75f0041298baab336c17cd5b37ff5e29b8b6a7d",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-desktop/home.png": "911b923e3a68e8deb0063efd88ed43eb1ed6c597c14bd5b9ee71f6b5161b6d7b",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-desktop/results.png": "51d34a4717075e8b516b2f334d6a30affecea776568052cc9ccb9d7518ecbebf",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-mobile/game.png": "13291f8ba632d1962611e25c99f73fa3d7732f7b8ef3a9222a5ddd5082576353",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-mobile/home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-mobile/results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/normal-results.png": "85e8b066ac128239de765f001c3542e6905018f5deaec7abac4a985006fb03b5",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-1.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-2.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-3.png": "fde834aa2f803612ef9cc7a68cea0c8d5a225289a82321ba0a59063d151e66a0",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-1.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-2.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-3.png": "9d198c8b07ea84e9f3d9ebad03831ffd61b98672a9e637e7ee9e9eead959cf28",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/review-fixes/browser-final/rounds-\uc2dc\uc791-\ub2e8\uacc4\u00b7SNR\u00b73\ubb38\ud56d-\uc644\ub8cc\u2192\ub2e4\uc74c-\ub2e8\uacc4\u00b7\uc7ac\uc0dd-\uc911-\uc885\ub8cc\u00b7\uc751\ub2f5-\ud6c4-\uc885\ub8cc\u00b7\ud648-\ucd08\uae30\ud654-desktop/early-exit.png": "47cf4429695d65ddad8d353aaa14dd5edcea3ef4c09c16b537d6a72c3e256533",
".agent/evidence-v0.2.3/review-fixes/browser-final/rounds-\uc2dc\uc791-\ub2e8\uacc4\u00b7SNR\u00b73\ubb38\ud56d-\uc644\ub8cc\u2192\ub2e4\uc74c-\ub2e8\uacc4\u00b7\uc7ac\uc0dd-\uc911-\uc885\ub8cc\u00b7\uc751\ub2f5-\ud6c4-\uc885\ub8cc\u00b7\ud648-\ucd08\uae30\ud654-mobile/early-exit.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/review-fixes/browser-final/ui-\ud55c\uad6d\uc5b4-\uc81c\ubaa9\uc740-\ub2e8\uc5b4-\uc911\uac04\uc5d0\uc11c-\uc904\ubc14\uafc8\ud558\uc9c0-\uc54a\ub294\ub2e4-desktop/heading.png": "56fa16aa968018bcc3252168a0c9e7fd3b30d352cb831b29caed75329c96dac7",
".agent/evidence-v0.2.3/review-fixes/browser-final/ui-\ud55c\uad6d\uc5b4-\uc81c\ubaa9\uc740-\ub2e8\uc5b4-\uc911\uac04\uc5d0\uc11c-\uc904\ubc14\uafc8\ud558\uc9c0-\uc54a\ub294\ub2e4-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-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/normal-results.png": "85e8b066ac128239de765f001c3542e6905018f5deaec7abac4a985006fb03b5",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-1.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-2.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-3.png": "fde834aa2f803612ef9cc7a68cea0c8d5a225289a82321ba0a59063d151e66a0",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-1.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-2.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-3.png": "9d198c8b07ea84e9f3d9ebad03831ffd61b98672a9e637e7ee9e9eead959cf28",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/review-fixes/browser-green/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-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-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/error-context.md": "fa4b05c6fb8ec98c57ff96e2f0d568aeb7ed027d8763712e767e50e13b25b31c",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/normal-results.png": "d3caf1e2d8625d6020e1e9061143b38843fa5698e7316b65a73569cce6026b73",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-1.png": "e4f413e3dd1379a913a1d94ec5f084f607a80fe375382eb74cee2ac515aa8590",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-2.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-3.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/trace.zip": "f415eaae383b21d1fd059b3f99b2a1ec962a34facd2959406985e08710bf7a54",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/error-context.md": "1a289b42d134b84701446f0bfe2f1e462121412930595617023c1cf93e2e0c40",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/normal-results.png": "5eccd53853c27a7c1385f1219b0a9bb7af60070fbdd1469ef3265e40377f3eaa",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-1.png": "3597007bfc13a2a9dcb9477ce836b68cccb78f55957f1f460431b67fe90e0f13",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-2.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-3.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/trace.zip": "022a0078453d25254bb6bb4af59fbd3696abd5acaaee750343adea3cd9b8aa0d",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-320-results.png": "b1dae69c908b9911d536d3e41553447bc71908a035f28bbc1f885d1def337b92",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-360-home.png": "c04abd43e93e46fde7e1591bde24a3073d584226e93ba5661bac1b5cd78a4695",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-360-results.png": "5e2ef07c6c3b7672e0aa82f248a5a245d60a10f86633fab2b2dd45ecff81d7fa",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/error-context.md": "d186519b7904a6ef3096e49c18e5e410528df127a7de409e237e7571d8a89f1b",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/trace.zip": "6d2abede66a4b0784accca9a0fea36ea71cabb138855e84343a2cb7f64cdab71",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-320-results.png": "b1dae69c908b9911d536d3e41553447bc71908a035f28bbc1f885d1def337b92",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-360-home.png": "c04abd43e93e46fde7e1591bde24a3073d584226e93ba5661bac1b5cd78a4695",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-360-results.png": "5e2ef07c6c3b7672e0aa82f248a5a245d60a10f86633fab2b2dd45ecff81d7fa",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/error-context.md": "d186519b7904a6ef3096e49c18e5e410528df127a7de409e237e7571d8a89f1b",
".agent/evidence-v0.2.3/review-fixes/browser-red/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-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"
},
"mutableAgentFiles": [
".agent/AMBIENCE-SOURCES-v0.2.3.json",
".agent/RESULT-v0.2.3.md",
".agent/evidence-v0.2.3/privacy-screening/final-asr.json",
".agent/evidence-v0.2.3/privacy-screening/validation-summary.json"
],
"immutablePriorAttemptFiles": {
".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-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-desktop/attachments/109-versioned-WAV-integrity-bcde2a64dc46084caae2c89272a63e0ce1b6dc06.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-desktop/browser-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-mobile/attachments/109-versioned-WAV-integrity-c90c562b8cfd985ad0d76e1c0d918e5063cd2fba.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-mobile/browser-audio-integrity.json": "cca2cda8988d4f33706bbeee3c7927a691937fffe3e9481f6d9ecdbe90af148a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-desktop/game.png": "a96e59237e3869125eb6099b15dc55fb5d7bd08af0f10c4d7e1b3d2d1eb2b8e3",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-desktop/home.png": "911b923e3a68e8deb0063efd88ed43eb1ed6c597c14bd5b9ee71f6b5161b6d7b",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-desktop/results.png": "51d34a4717075e8b516b2f334d6a30affecea776568052cc9ccb9d7518ecbebf",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-mobile/game.png": "a3c49b633277b3cd05e607f2bfe851b1b24a82cd16d7c5dcdbf6a75ecdf228d3",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-mobile/home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/game-\uc2e4\uc81c-\uc624\ub514\uc624\ub85c-\ud63c\ud569-\ubaa8\ub4dc-\uc644\uc8fc\u00b7\ub808\uc774\uc544\uc6c3\u00b7\uc811\uadfc\uc131\u00b7\uc678\ubd80-\uc694\uccad-\uc5c6\uc74c-mobile/results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/normal-results.png": "85e8b066ac128239de765f001c3542e6905018f5deaec7abac4a985006fb03b5",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-1.png": "4d130e9ea43bdfcd7b35e300224d1b54f2875aa8c24d5551c6627b7abd8ce1fc",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-2.png": "4508a9c9e5c7533e9bf8afe6653fb4e1cd111de71141f0fb5404ab4c4b168ac9",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-desktop/progress-3.png": "fde834aa2f803612ef9cc7a68cea0c8d5a225289a82321ba0a59063d151e66a0",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/normal-results.png": "2f973a00b336f2373cac53c79ae56eb7760cf4eeaff019bde949a86b7e92665a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-1.png": "f46672f555b73c705f838e6d1e1c3d25fe2f9ff29ad629903b85c9b129b83b3b",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-2.png": "c39155a3c4d4ae096cb73a892e8e86b40a2d4129c670a7b44d4b24daf8030983",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\uc2e4\uc81c-\uc9c4\ud589-\ub9c9\ub300\ub294-\ud604\uc7ac-\ubb38\ud56d\uc758-1-3\u00b72-3\u00b73-3\uc744-\ucc44\uc6b4\ub2e4-mobile/progress-3.png": "9d198c8b07ea84e9f3d9ebad03831ffd61b98672a9e637e7ee9e9eead959cf28",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-desktop/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-320-home.png": "872c362713d2013c7021770e3c222458f56ba0ee2ea2d21cf28bd28df8a6d613",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-320-results.png": "fdf263c2c84c64beab026e2899b4b93a7b71b4fcf28b796e5782bb5bc17c2c78",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-360-home.png": "a17b7cad00be132583d28f91a938a83f69663365575e1a91d17013e6d7369002",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/review-fixes-\ub9ac\ubdf0-\ud55c\uad6d\uc5b4-\ubaa8\ub4dc\u00b7\uacb0\uacfc-\uc5b4\uc808\uc740-320px\uc640-360px\uc5d0\uc11c\ub3c4-\uac08\ub77c\uc9c0\uac70\ub098-\ub118\uce58\uc9c0-\uc54a\ub294\ub2e4-mobile/copy-360-results.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/rounds-\uc2dc\uc791-\ub2e8\uacc4\u00b7SNR\u00b73\ubb38\ud56d-\uc644\ub8cc\u2192\ub2e4\uc74c-\ub2e8\uacc4\u00b7\uc7ac\uc0dd-\uc911-\uc885\ub8cc\u00b7\uc751\ub2f5-\ud6c4-\uc885\ub8cc\u00b7\ud648-\ucd08\uae30\ud654-desktop/early-exit.png": "47cf4429695d65ddad8d353aaa14dd5edcea3ef4c09c16b537d6a72c3e256533",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/rounds-\uc2dc\uc791-\ub2e8\uacc4\u00b7SNR\u00b73\ubb38\ud56d-\uc644\ub8cc\u2192\ub2e4\uc74c-\ub2e8\uacc4\u00b7\uc7ac\uc0dd-\uc911-\uc885\ub8cc\u00b7\uc751\ub2f5-\ud6c4-\uc885\ub8cc\u00b7\ud648-\ucd08\uae30\ud654-mobile/early-exit.png": "b838f6bbb4392ef8aa941c66dec5bef6bb27f06acada06b67272be926db9d576",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/ui-\ud55c\uad6d\uc5b4-\uc81c\ubaa9\uc740-\ub2e8\uc5b4-\uc911\uac04\uc5d0\uc11c-\uc904\ubc14\uafc8\ud558\uc9c0-\uc54a\ub294\ub2e4-desktop/heading.png": "56fa16aa968018bcc3252168a0c9e7fd3b30d352cb831b29caed75329c96dac7",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-final/ui-\ud55c\uad6d\uc5b4-\uc81c\ubaa9\uc740-\ub2e8\uc5b4-\uc911\uac04\uc5d0\uc11c-\uc904\ubc14\uafc8\ud558\uc9c0-\uc54a\ub294\ub2e4-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-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-desktop/error-context.md": "958700898c966a2ab19189862cc6bc40bb168b0131c90c381220df9f05426f5f",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-red/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-desktop/trace.zip": "a4d9f4a9cfb1be6becad762bd6b5da9610e023ec1a5f675abe188320603aaae7",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-red/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-mobile/error-context.md": "caa0871351f61738f3a139ab12945f8255c826e0b0c34417c93167eb5b5fb41a",
".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180/browser-red/audio-\uc74c\uc131\u00b7\ud604\uc7a5\uc74c-109\uac1c-versioned-WAV\ub97c-\uc2e4\uc81c-Chrome\uc5d0\uc11c-\ud574\uc2dc\u00b7\ub514\ucf54\ub4dc-\uac80\uc99d\ud55c\ub2e4-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"
},
"priorAttemptDirectory": ".agent/evidence-v0.2.3/privacy-screening/prior-attempt-market60-cafe180"
}
@@ -0,0 +1,212 @@
# Find-Word v0.2.3 오디오 출처와 재현
## 포함 자산과 생성 설정
| 대상 | 생성 방식 | 원문/설정 | 배포 방식 |
| --- | --- | --- | --- |
| `public/audio/intro.wav` | Microsoft Edge online TTS neural 음성 | `src/content.ts`의 INTRO | 24kHz mono PCM16 WAV |
| 목표 음성 100개 | 같은 provider·voice | 10 패턴 × 10 단어, `renderSentence` | 같은 WAV |
| 8개 배경 환경 | 공개 라이선스 실제 현장 녹음 | `public/ambience/manifest.json` | 12초·24kHz mono PCM16 WAV |
| 화면 파형·S 캐릭터 | 직접 작성한 CSS | `App.tsx`, `styles.css` | CSS |
voice는 **`ko-KR-HyunsuMultilingualNeural`**, rate는 **`-6%`**, pitch는
**`-4Hz`**, 생성 클라이언트는 **edge-tts 7.3.1**이다. 직접 작성한 한국어
문장을 온라인 provider에 보내 MP3 응답을 받은 뒤 FFmpeg로 PCM을 만든다.
음성 복제나 사람의 녹음 샘플을 사용하지 않는다. 웃음은 INTRO의 ‘으하하하~~’를
같은 voice로 합성한다. 앱은 저장한 WAV만 같은 출처에서 가져오며 런타임 외부
TTS/API, speechSynthesis, 인증정보가 필요하지 않다.
청취용 샘플은 [intro.wav](../public/audio/intro.wav)와
[luck-apple.wav](../public/audio/luck-apple.wav)이다. 101개 전체 생성 결과의
크기·길이 범위와 독립 검증은 [v0.1.1 RESULT](../.agent/RESULT-v0.1.1.md)에 기록한다.
`public/audio/manifest.json`은 version, provider, voice, rate, pitch, sampleRate,
생성 시각, 실측 edge-tts/FFmpeg 버전, 파일별 원문·SHA-256·bytes·duration·RMS·peak를 담는다.
## 설치와 생성
생성 환경은 Linux (기존 디렉터리 교체에 `renameat2(RENAME_EXCHANGE)` 필요),
Python 3.11 이상, FFmpeg, Node.js 22.22.2 이상이다. **이미 포함된 WAV를
빌드·실행할 때는 Python/FFmpeg/provider 연결이 필요 없다.** 생성기 계약 테스트는
Python과 FFmpeg를 사용하되 네트워크 없이 동작한다.
```bash
python3 -m venv .venv-audio
.venv-audio/bin/python -m pip install -r requirements-audio.txt
.venv-audio/bin/python -m pip check
npm run audio:generate
npm test
npm run build
```
`audio:generate`는 `.venv-audio/bin/python scripts/generate_audio.py`로 고정되어
전역 Python으로 대체되지 않는다. `requirements-audio.txt`는 edge-tts==7.3.1과
전이 의존성 버전을 고정한다. 생성기는 실제 설치 버전을 조회하고 7.3.1이 아니면
외부 요청 전에 실패한다. `.venv-audio/`는 Git과 배포물에서 제외한다.
원문을 Node type stripping으로 앱 데이터에서 읽고, 101개 모두 같은 파일시스템의
`public/.audio-stage-*/`에 순차 생성한다. 각 provider 요청은 최대 60초, 최대
3회 시도이며 실패 사이 1초/2초를 기다린다. FFmpeg도 60초 제한이 있다.
재시도 전 불완전 MP3를 삭제하고 변환·검증 실패는 즉시 중단한다. 로그에는
파일명·시도 횟수만 남기고 provider stderr/응답·쿠키·인증 헤더를 저장하지 않는다.
전체 WAV와 manifest를 검증한 뒤 기존 `public/audio`와 완성 디렉터리를 단일
원자 교환으로 바꾼다. 실패·Ctrl-C는 기존 디렉터리의 바이트를 그대로 보존한다.
원자 교환을 지원하지 않는 파일시스템에서는 실패하며 비원자 방식으로 우회하지 않는다.
성공 후 이전 자산과 임시 MP3를 정리한다. 강제 종료(SIGKILL)·전원 손실 때는
숨김 staging 폴더가 남을 수 있으나 공개 디렉터리는 교환 전 또는 후의 전체 집합이다.
이는 전원 손실 시 저장장치 내구성 보장을 뜻하지 않는다.
고정 클라이언트와 설정으로 **생성 절차**를 재현할 수 있다. 원격 모델·서비스 버전은
고정할 수 없어 재생성 WAV의 바이트 동일성은 보장하지 않는다. 새 실행의 manifest를
검토해야 한다. 빌드는 이미 생성한 WAV의 해시를 보존하고 101개 모두 포함됐는지 확인한다.
## 레벨 처리와 검증
MP3를 24kHz mono signed 16-bit little-endian PCM으로 디코드한다. 파일 전체에
동일한 선형 gain을 적용해 RMS 0.10을 목표로 하며 증폭은 최대 2배, peak는
0.89로 제한한다. 동적 압축·노이즈 게이트·침묵 제거·시간 변형은 하지 않는다.
원래 신호의 자음과 억양을 보존하면서 파일 간 레벨 차이와 피크를 완화한다.
생성기와 독립 자산 테스트는 101개 파일의 원문·집합·SHA-256·bytes·duration,
24kHz mono PCM16, 1–20초 길이, RMS > 100/32768, full-scale 미도달,
총 48MiB 미만을 검사한다. 기존 음성 단독 검사는 RMS 0.03과 +6dB에서 peak < 0.8을
요구한다. 0.2.3의 사용자 최대 +12dB 혼합은 세 경로 공통 감쇠로 별도 검증한다. 앱은 Web Audio에서 배경·음성을 RMS 정규화한 뒤 상대 SNR을 적용한다.
물리적 음압이나 주파수별 청감을 보정한 값은 아니다.
## 도구 라이선스와 서비스 조건
- [edge-tts 7.3.1 LICENSE](https://github.com/rany2/edge-tts/blob/7.3.1/LICENSE):
대부분의 코드에 LGPLv3, `srt_composer.py`에만 MIT가 적용된다.
[공식 프로젝트](https://github.com/rany2/edge-tts)는 Microsoft Edge의 온라인
TTS를 이용하는 클라이언트다. 클라이언트 라이선스가 provider 사용·음성 출력의
재배포 권한을 대신 부여하지 않는다. 이 프로젝트는 클라이언트/모델을 번들하지 않는다.
- [FFmpeg 공식 라이선스](https://ffmpeg.org/legal.html): 빌드 옵션에 따라 LGPL/GPL이
적용된다. 실제 사용 버전은 manifest에 남기며 실행 파일은 배포하지 않는다.
- [Microsoft Services Agreement](https://www.microsoft.com/en-us/servicesagreement)의
AI Services 등 해당 서비스 조건은 도구의 오픈소스 라이선스와 별개다.
위 문서 §13(s)(vi)는 출력의 권리·사용 가능성을 이용자가 판단하도록 설명한다.
API 키 없이 호출된다는 사실이 상업 사용·재배포의 포괄적 허락이나 SLA를 뜻하지 않는다.
배포자는 자신의 이용 상황에 적용되는 최신 조건을 확인해야 한다.
- 프로젝트는 생성 음성 자체에 **독점 권리를 주장하지 않는다**. [LICENSE](../LICENSE)의
소스·문서 권리 유보와 provider 및 제3자의 권리는 구분한다. 런타임 React,
ReactDOM, scheduler의 MIT 전문은 [THIRD_PARTY_NOTICES.md](../THIRD_PARTY_NOTICES.md)에 있다.
문서 확인일: 2026-10-14 UTC. provider의 음성 목록, rate/pitch 지원, 가용성,
접근 제한, 조건은 바뀔 수 있다. 온라인 생성이 중단되어도 포함된 WAV의 빌드·재생에는
영향이 없다. 실패 시 다른 voice로 자동 대체하지 않는다.
## 청감과 평가의 한계
자동 검증은 PCM 신호·무결성·재생 흐름을 확인한다. 한국어 발음, 유사 자모의
구분, 웃음의 자연스러움과 실제 사용자의 난이도는 청취 평가가 필요하다.
대표 샘플과 게임 내 소음 혼합 상태를 직접 들어 인수 판단한다. 배경은 실제 현장 녹음의 짧은 구간이다. 이 게임의 수치는 임상 검증·치료·청력 판정용이 아니다.
## v0.2.3 현장 녹음 파생본
원본 선정 계약은 [.agent/AMBIENCE-SOURCES-v0.2.3.json](../.agent/AMBIENCE-SOURCES-v0.2.3.json),
배포 바이트의 출처·직접 URL·저작자·라이선스·변환·SHA-256·bytes·duration·RMS·peak는
[manifest](../public/ambience/manifest.json), 정확한 attribution과 변경 고지는
[AMBIENCE_NOTICES](../public/ambience/AMBIENCE_NOTICES.md)에 있다. 이 고지는 dist에도 포함되고 UI에서 링크한다.
여덟 원본 모두 서로 다른 현장 녹음이며 NC/ND 자산을 사용하지 않는다. 원본은 저장소/빌드에 포함하지 않는다.
| 환경 | 저작자 | 라이선스 | 원본 구간(초) |
| --- | --- | --- | --- |
| 길거리 | cori (Cori Samuel) | PD-author | 35–47 |
| 쇼핑몰 | thore (Thore) | PD-author | 36–48 |
| 극장 | ElevatorFan2020 | CC0 1.0 | 45–57 |
| 백화점 | icmusic | CC0 1.0 | 90–102 |
| 시장 | Marie Flutre | CC BY-SA 4.0 | 60–72 |
| 지하철 | PascalHD | CC BY 4.0 | 65–77 |
| 카페 | Marble Toast | CC0 1.0 | 180–192 |
| 비 오는 거리 | Extemporalist | CC0 1.0 | 180–192 |
Commons primary 페이지/API와 Freesound primary 페이지의 라이선스 근거를 evidence에 보존한다.
Freesound 두 원본은 지정된 preview MP3이다. 프로젝트의 비공개 라이선스를 제3자 녹음에
적용하지 않으며, 시장 파생 WAV는 **CC BY-SA 4.0**으로 계속 공개·수정·재배포할 수 있다.
지하철은 **CC BY 4.0**의 PascalHD credit·변경 고지·라이선스 링크를 유지한다.
재현: 검증한 원본 8개를 `/tmp/findword-ambience-sources`에 놓고
`python3 scripts/ambience_audio.py`를 실행한다. 계획의 파일별 `selectedSegmentStartSeconds`에서 12초를 선택하고,
FFmpeg로 mono 24kHz float PCM 디코드 후 양끝 50ms 선형 fade, RMS 목표 .08,
최대 증폭 4배/peak .85 중 가장 작은 선형 gain을 적용한다. 마지막은 표준 44-byte
WAV 헤더의 PCM16이다. 시간 변형·절차적 합성·원본 음성 대체는 없다.
원본 SHA-256과 실측 FFmpeg 버전을 함께 기록하므로 같은 원본/도구로 재현 가능하다.
런타임은 음성/배경 각각 RMS .03 후 상대 gain `10^(dB/20)`을 적용한다. −12~+12 dB
범위에서도 세 경로의 최악 피크 합을 공통 감쇠하여 최대 .8로 제한한다. 양끝 fade가
있는 배경을 loop하고 목표 끝에서 정리한다. 전체 버퍼 RMS 기준이며 짧은 시간창별
SNR이나 실제 음압을 보증하지 않는다. 원본 녹음의 우연한 사람 말소리는 환경의 일부다.
자동 검사로 음악·개인 대화의 완전한 부재를 인증할 수 없으므로 사람의 최종 청취 검토가 필요하다.
기존 neural WAV 101개의 원문·해시는 v0.1.1 그대로다. 음성 manifest의 version은
배포 버전 0.2.3, `generatedForVersion`은 0.1.1이며 원래 생성 시각·도구 정보는 보존한다.
### 리뷰 후 출처 고정과 원자 발행
승인 계획의 `expectedSourceSha256`와 `sourceBytes`는 불변 입력이다. 생성기는 로컬 경로나
현재 파일에서 이 승인값을 새로 기록하지 않으며, 여덟 원본의 해시·크기를 **첫 변환 전**에 모두 검사한다.
한 원본이라도 다르거나 누락되면 실패한다. `sourceVerification`은 검증 상태·일자·방법·보존된 증거를 가리킨다.
임시 경로를 담던 `verifiedLocalSource` 필드는 제거했다.
`directMediaDurationSeconds`는 **directUrl에서 받은 바로 그 바이트**의 ffprobe `format.duration`이다.
Freesound 항목은 preview MP3의 길이이며 primary 페이지 원본 길이 또는 반올림한 표시 길이가 아니다.
배포 manifest의 `duration`과 `conversion.durationSeconds`는 파생 WAV의 길이(12초),
`selectedSegmentStartSeconds`는 파일별 불변 승인 시작점이며 생성기는 별도 hardcoded map 없이 이 값을 읽는다.
`conversion.startSeconds`는 같은 값이어야 한다. 시작점은 유한한 0 이상 수이고, 시작점+12초가
`directMediaDurationSeconds` 이하여야 한다. 누락·음수·NaN·Infinity·문자열·bool·범위 초과는 첫 변환 전에 거부한다. 원본 전체 디코드와 실제 수치는
[보존된 source-integrity.json](../.agent/evidence-v0.2.3/source-integrity.json)에 있다.
생성기는 출력 폴더와 같은 부모의 `.ambience-stage-*/ready`에서 8 WAV·manifest·`AMBIENCE_NOTICES.md`를
완성한다. 정확한 파일 집합, 고유 해시, 원본 계획, PCM 형식·길이·fade·RMS·peak,
항목별 저작자/primary URL/direct URL/라이선스 링크/outputLicense/변경 설명을 다시 검사한다.
존재하는 symlink 및 dangling symlink 출력을 모두 거부한다. Linux `renameat2(RENAME_EXCHANGE)` 한 번이 교체의
commit 지점이며, 최초 생성은 같은 파일시스템의 rename 한 번이다. 지원하지 않는 환경에서는 실패한다.
파일별 overlay를 하지 않으므로 오래된 파일이 남지 않고 고지도 음원과 같은 디렉터리로 교체된다.
commit 전 변환·쓰기·검증·교환 실패 또는 중단은 이전 디렉터리를 보존한다. syscall 이후에는 완성된 새 디렉터리가
공개된 상태다. SIGKILL 등 강제 종료는 숨은 임시 디렉터리를 남길 수 있지만 부분 배포는 만들지 않는다.
전원 손실에 대한 디스크 내구성이나 여러 HTTP 요청에 걸친 snapshot 격리를 주장하지 않는다.
앞선 독립 리뷰에서는 기존 109 WAV를 재생성하지 않았다. 이후 아래 privacy refinement에서
전체 현장음 bundle을 원자 재생성했으며 mall/market/cafe 3개만 바이트가 바뀌었다.
**사람의 현장음 청취 인수는 미실행**이다.
### 최종 privacy excerpt refinement
mall 20–32 → **36–48초**, market 30–42 → **60–72초**, cafe 120–132 → **180–192초**로
선택을 바꾸고 다른 다섯 시작점은 유지했다. 승인 원본 해시·bytes·직접 미디어 길이가 모두 일치한 뒤
하드닝된 생성기로 8 WAV·manifest·notice 전체를 staging/검증/원자 교환했다.
101개 voice와 다섯 unchanged ambience WAV는 이전 SHA-256 그대로다.
[생성 실측 기록](../.agent/evidence-v0.2.3/privacy-screening/regeneration.json)에 최종 해시·RMS·peak·변환이 있다.
일부 Ogg 구간은 FFmpeg timestamp/seek 때문에 12초보다 몇 프레임 짧게 출력된다.
짧은 결과일 때만 처음부터 디코드한 24kHz PCM의 `round(start × 24000)`부터 정확한 288,000개
sample을 선택하고 출력 PTS를 sample 수로 재설정한다. silent padding이나 time stretching은 없다.
정말 원본이 짧으면 여전히 실패한다. `conversion.seekMethod`가 실제 경로를 기록하며
나머지 다섯 WAV는 기존 경로로 재현된다. 두 실패 시도와 RED/GREEN도 새 evidence에 보존했다.
Neo가 제공한 [이전 후보 scan 원문](../.agent/evidence-v0.2.3/privacy-screening/candidate-scan-original.json)과
[이전 파생본 ASR 원문](../.agent/evidence-v0.2.3/privacy-screening/prior-derivatives-asr-original.json)을 바이트 그대로 보존했다.
[별도 provenance](../.agent/evidence-v0.2.3/privacy-screening/earlier-asr-provenance.json)는 입력 경로·SHA-256·출처 맥락과
raw JSON에 도구 설정/입력 해시가 없다는 한계를 설명한다. 후보 text와 language는 휴리스틱 추정으로,
**충실한 대화 전사나 화자 식별이라고 주장하지 않는다.**
최종 8 WAV는 로컬 faster-whisper **1.2.1 / tiny multilingual**로 다시 검사했다.
[final-asr.json](../.agent/evidence-v0.2.3/privacy-screening/final-asr.json)은 정확한 입력 WAV 해시,
모델 revision/파일 해시, 라이브러리 버전, 전체 방법/설정, 모든 반환 segment와 언어 확률을 기록한다.
**Tiny-model ASR은 screening signal일 뿐, 사람의 청취 인수 또는 법적/개인정보 clearance가 아니다.**
빈 결과는 말소리·음악·개인 대화가 없음을 증명하지 않으며, 출력된 text도 환각일 수 있다.
사람이 최종 구간을 직접 듣고 적절성을 판단하는 인수는 수행하지 않았다.
이번 실행에서 **zero-segment acceptance는 미달**이다. 최종 기록은 CPU int8, beam size 5,
자동 언어 탐지, 기본 Silero VAD 활성화 및 기본 decoding threshold를 사용했다.
mall은 0개, market은 3개, cafe는 1개 segment를 반환했고 나머지 다섯 WAV는 0개다.
Neo의 원래 decoder/VAD 설정이 raw JSON에 없어 같은 방법의 재현이라고 주장하지 않는다.
별도의 [VAD 미사용 결과](../.agent/evidence-v0.2.3/privacy-screening/no-vad-asr.json)에서는
세 변경 구간 모두 candidate text가 나왔다. 두 방법의 결과를 그대로 보존하며,
ASR이 비어 있도록 threshold를 조절하거나 반환 segment를 삭제하지 않았다.
따라서 새 zero-segment unit acceptance는 실패 상태로 유지한다. 정확한 이전 ASR 설정 확인과
최종 파생 WAV의 추가 검토가 필요하다. 이 상태를 privacy approval이나 완료로 표시하지 않는다.
@@ -0,0 +1,76 @@
# Find-Word 변경 이력
## 0.2.3 — 2026-10-14 (로컬 구현, 배포 미실행)
- 라운드를 정확히 3문항으로 변경하고 한 단계의 난이도를 유지한다. 시작 단계 1~5 선택,
정상 완료 후 다음 단계 새 라운드, 5단계 재도전을 제공한다. 혼합 모드는 선택/입력을 모두 포함한다.
- SNR 직접 제어: −12~+12 dB, 1 dB 간격, 범위/NaN 정규화. 재생 중 변경은 다음 청취부터 적용,
이후 문항/라운드에 유지하고 홈 복귀 시 단계 기본값으로 초기화한다. 양/0/음수의 의미를 설명한다.
- 중도 종료는 fetch·Web Audio·타이머를 즉시 취소하고 응답/정답 수를 보여 준 뒤 홈으로 연결한다.
무응답을 오답으로 세지 않고 지연 콜백·중복 답변을 차단한다.
- 절차적 배경 합성을 제거하고 실제 현장 녹음 8개를 same-origin WAV로 번들한다.
각 12초·24kHz mono PCM16·50ms fade·안전 선형 정규화·고유 SHA-256, 원본은 번들하지 않는다.
- PD/CC0/CC BY 4.0/CC BY-SA 4.0 원본을 추적하는 machine-readable manifest와 브라우저 배포 고지.
시장 파생본의 ShareAlike와 지하철 credit/변경 고지 유지. 원본/다운로드 URL·저작자·변환·해시·실측값 기록.
- 녹음을 fetch/decode/loop하며 RMS .03 정규화 후 상대 gain을 적용한다. 공통 peak 감쇠로 SNR을
유지하면서 clipping headroom을 확보한다. 404/decode/timeout/abort는 재시도 가능한 한국어 안내를 제공한다.
- 회귀 수정: 세 문항 표본에 맞게 전체 콘텐츠 도달성 검사 확대; 콘텐츠의 Node 직접 import 경로 보존;
재생 중 SNR 변경이 실제 청취 이력을 덮어쓰지 않도록 결과에 청취 시작값 기록.
- 추가 회귀 수정: 3문항에서도 순환 환경이 여덟 장소에 도달하도록 섞고, 결과의 잘못된 플레이 방법 앵커를 제거한다.
세 문항의 문항별 보너스 상한(20점)과 라운드 합계 상한(30점)을 안내하고 새 단계/SNR 컨트롤의 44px 터치 영역을 보장한다.
개발/preview에서 HTML Accept가 있는 누락 WAV도 SPA fallback 대신 404로 응답한다.
모바일 시작 단계 선택값의 잘림을 막도록 중복 SNR을 별도 제어에 모았다.
내장 SVG favicon으로 Chrome의 기본 favicon.ico 404 콘솔 오류를 제거한다.
- 기존 10 mechanic·100문장·101 neural WAV, 채점·점수·IME·재청취·음량·접근성·개인정보 미수집을 보존한다.
- package/lock/HTML/UI/manifest/문서를 0.2.3으로 정렬하고 음원 query 버전을 갱신한다.
`Designed by OZ at Heat-T Medical Inc.`와 v0.1/v0.1.1 역사 evidence는 보존한다.
- strict vertical-slice TDD RED/GREEN, Python 변환 계약, 빌드 자산/notice 검증,
sandboxed system Chrome desktop/mobile의 실제 WAV decode/playback·스크린샷·axe·네트워크 검사를 수행한다.
정확한 실행 결과와 추가 회귀는 `.agent/RESULT-v0.2.3.md`에 기록한다.
- Nginx 현장음 404와 원자 배포/rollback 인계 문서를 갱신한다. commit/push/merge/tag/배포는 Neo 인수 이후 별도 작업이다.
### v0.2.3 독립 리뷰 수정
- 진행 막대를 현재 문항 1/3·2/3·3/3으로 정정하고 접근성 값 및 Chrome 실제 채움 픽셀을 검사한다.
- 보너스 문구를 문항별 최대 20점 / 라운드 합계 0+10+20=30점으로 정정한다. 1단계 만점 330점과 함께 검증한다.
- 무응답 정답률은 `— / 응답 없음`, 응답 없는 단계는 `미진행`; 중도 종료와 현재 단계 완료 제목을 구분한다.
- 320px·360px에서 모드 설명과 결과의 한국어 어절 분리·넘침을 방지한다. README 현재 증거 경로를 고치고 일본어 테스트 제목을 한국어로 바꾼다.
- 음성 manifest/폴더를 함께 축약해도 실패하도록 콘텐츠 기반 정확한 101개 목록, 개수 및 dist 추가/누락 파일을 검사한다.
- 현장음 승인 계획/manifest의 임시 경로를 불변 원본 해시·bytes·검증 상태 및 정확한 직접 미디어 길이로 교체한다.
- 현장음 생성 전 여덟 원본의 승인 해시·bytes를 전수 확인한다. 잘못된 원본은 첫 변환 전에 실패한다.
- 같은 파일시스템 staging에서 8 WAV·manifest·notice 전부 검증 후 Linux 원자 디렉터리 교환. stale 파일 제거,
symlink 출력 거부, 변환·쓰기·검증·교환 실패/중단 시 이전 디렉터리 보존을 테스트한다.
- 고지를 `/ambience/AMBIENCE_NOTICES.md`로 옮겨 함께 발행하고 각 항목의 creator/primary URL/direct URL/
license URL/outputLicense/변경 설명을 빌드에서도 강제한다. UI 링크와 권리·배포·재현 문서를 갱신한다.
- 101 voice + 8 ambience WAV 바이트와 모든 이전 evidence를 보존한다. 이번 리뷰의 RED/GREEN과 전체 실행 결과는
`.agent/evidence-v0.2.3/review-fixes/` 및 `.agent/RESULT-v0.2.3.md`를 참조한다. 사람의 청취 인수는 미실행이다.
### v0.2.3 최종 privacy excerpt refinement
- 모든 현장음의 `selectedSegmentStartSeconds`를 승인 계획의 불변 provenance로 고정한다.
생성기의 별도 시작점 map을 제거하고 manifest/notice/build/browser에서 계획과 구간 범위를 대조한다.
- mall 36–48초, market 60–72초, cafe 180–192초로 변경하고 다른 다섯 구간은 유지한다.
원본 8개 해시 확인 후 전체 ambience 디렉터리를 원자 재생성한다. 101 voice와 다섯 ambience WAV는 바이트 동일하다.
- Ogg seek/timestamp로 짧아진 PCM은 전체 디코드 후 sample 기준으로 정확한 12초를 선택한다.
패딩/시간 변형 없이 실제 seek 경로를 기록하고 부족한 원본은 거부한다. 실패 시 이전 bundle 보존을 재확인했다.
- Neo의 이전 후보 scan과 파생본 ASR을 원문 그대로 보존하고 출처·설정 누락·휴리스틱 text의 한계를 기록한다.
최종 8 WAV의 faster-whisper 1.2.1 tiny multilingual 검사와 모든 추가 실패/성공 근거는
`.agent/evidence-v0.2.3/privacy-screening/`에 보존한다. **ASR은 screening signal이며 사람의 청취 인수나 법적/개인정보 clearance가 아니다.**
- 최종 VAD-enabled ASR은 mall 0 / market 3 / cafe 1 segment를 반환하여 요청한 zero-segment 기준은 **미달**이다.
VAD 미사용 결과도 별도로 보존하고 새 acceptance test는 실패 상태를 유지한다.
- 이전 evidence는 변경하지 않는다. 최종 검증/상세 결과는 `.agent/RESULT-v0.2.3.md`의 마지막 절을 참조한다.
## 0.1.1 — 2026-10-14
- Microsoft Edge online TTS `ko-KR-HyunsuMultilingualNeural`, edge-tts 7.3.1,
rate −6%, pitch −4Hz로 안내 1개·목표 100개를 새로 생성하고 24kHz mono PCM16으로 변환했다.
- pinned venv, bounded retry/timeout, 원자 자산 교환, provider/도구/출력물의 권리 구분과 provenance를 추가했다.
- query cache-busting, 시스템 Chrome sandbox 기본 활성화, 화면·음량·한국어 제목과 SNR 설명의 검증을 보강했다.
- 원본 기록: [.agent/RESULT-v0.1.1.md](.agent/RESULT-v0.1.1.md), `.agent/evidence-v0.1.1/`.
## 0.1.0 — 2026-10-14 (당시 UI 표기 v0.1)
- 반응형 시작/게임/결과, 열 문항·다섯 단계, 객관식/주관식/혼합, 10 mechanic·100문장.
- 점수·연속 정답·재청취·IME 보호·접근성·동시 재생/취소/실패 복구, 여덟 합성 배경.
- 정적 SPA, 개인정보 저장·외부 런타임 요청 없음, 정확한 credit 및 private 프로젝트 권리 고지.
- 원본 기록: [.agent/RESULT.md](.agent/RESULT.md), `.agent/evidence/`.
@@ -0,0 +1,356 @@
{
"version": "0.2.3",
"generatedAtUtc": "2026-10-14T09:16:19.690083+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": 60,
"file": "market.wav",
"sourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"outputLicense": "CC BY-SA 4.0",
"verificationDateUtc": "2026-10-14",
"sha256": "7a7a980845a4aade2a7e8a108eae746220a4688e92792ee93d3deb76b2a762f6",
"bytes": 576044,
"duration": 12.0,
"rms": 0.07999755668792045,
"peak": 0.507232666015625,
"conversion": {
"startSeconds": 60,
"durationSeconds": 12,
"seekMethod": "full decode then sample trim",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 1.6103277706340973,
"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": 180,
"file": "cafe.wav",
"sourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"outputLicense": "CC0 1.0 Universal",
"verificationDateUtc": "2026-10-14",
"sha256": "802a956e91b85a2fdd0e1f161d75bfada7a53499bcb57ba7f578411480ded216",
"bytes": 576044,
"duration": 12.0,
"rms": 0.07999756802463229,
"peak": 0.44708251953125,
"conversion": {
"startSeconds": 180,
"durationSeconds": 12,
"seekMethod": "full decode then sample trim",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.6696615304282213,
"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"
}
}
]
}
@@ -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 60–72.
## 지하철 — 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 180–192.
## 비 오는 거리 — 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.
@@ -0,0 +1,135 @@
# 단어를 맞춰라 · Find-Word v0.2.3
소음 속에 숨은 한국어 단어를 듣고 찾는 반응형 웹 게임입니다.
**Designed by OZ at Heat-T Medical Inc.**
Canonical repository: [OZ-Group/Find-Word](https://source.ibit.kr/OZ-Group/Find-Word).
프로젝트 자체는 **private / all-rights-reserved**이며 `package.json`의
`license`는 `UNLICENSED`입니다. [LICENSE](LICENSE)를 참고하세요.
런타임 의존성 React, ReactDOM, scheduler의 MIT 전문은
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)에 보존하며,
`public/THIRD_PARTY_NOTICES.md`가 빌드 시 `dist/THIRD_PARTY_NOTICES.md`로 복사됩니다.
빌드 검증기는 설치된 의존성의 라이선스 전문·버전과 세 사본을 대조합니다.
React + TypeScript strict + Vite로 만든 정적 SPA입니다. 로그인, 개인정보 저장,
분석 도구, 외부 CDN, 런타임 TTS/API 요청이 없습니다. 청각적 주의·식별 게임이며
의료적 진단·치료나 효과를 주장하지 않습니다.
## 실행
Node.js 최소 버전은 **22.22.2** (`>=22.22.2`)입니다. 잠긴 jsdom 계열 의존성이
요구하는 지원 범위는 22.x의 22.22.2 이상, 24.x의 24.15.0 이상 또는 26.0.0 이상입니다.
이 중 지원되는 LTS 버전을 사용하세요. `package-lock.json`을
포함하므로 새 환경에서는 `npm ci`를 사용합니다. 이번 검증 환경은 Node 26.7.0입니다.
```bash
npm ci
npm run dev
```
표시되는 `http://127.0.0.1:5173`에서 사용합니다. 소리는 사용자가 **게임 시작 · 소리 듣기**를
누른 뒤에만 재생합니다. 낮은 음량부터 조절하고 헤드폰이나 스피커를 사용할 수 있습니다.
## 플레이
- 골고루 풀기, 보기에서 선택, 직접 입력 중 선택합니다.
- 8개 실제 현장 녹음 환경 중 하나를 지정하거나 라운드마다 섞어 세 곳을 방문합니다.
- 에스의 안내가 배경에 묻힌 뒤 목표 문장이 나옵니다. 재생 후 질문에 답합니다.
- 시작 난이도 1~5를 고르고 정확히 **3문항**을 같은 단계에서 풉니다. 단계 기본값은 **SNR +6, +3, 0, −3, −6 dB**입니다.
- 목표 음성 SNR을 **−12~+12 dB, 1 dB 간격**으로 직접 조절할 수 있습니다. 재생 중 변경은 다음 재생·재청취와 남은 문제부터 적용합니다.
양수는 음성이 배경보다 크고, 0은 같고, 음수는 더 작다는 뜻입니다.
- 다시 듣기는 감점하지 않습니다. 정답은 `단계 × 100점`, 연속 정답 보너스는 문항별 최대 20점, 라운드 합계 최대 30점입니다 (0 + 10 + 20점, 1단계 만점 330점).
- 정상 결과에서 다음 단계의 새 3문항을 바로 시작합니다. 5단계에서는 같은 단계 재도전과 홈 복귀를 제공합니다. 수동 SNR은 다음 라운드에도 유지되고, 홈 복귀 시 선택한 시작 단계의 기본값으로 돌아갑니다.
- 언제든 **문제 풀이 종료**를 누르면 즉시 오디오를 취소하고 **응답 수·정답 수**를 보여 줍니다. 무응답은 오답으로 세지 않고 정답률은 `— / 응답 없음`, 답하지 않은 단계는 `미진행`으로 표시합니다. 결과에서 **처음 화면으로** 돌아갑니다.
- 결과의 SNR은 실제 마지막 청취값을 기록합니다. 점수·정답률·최고 연속 정답·단계별 결과를 확인합니다.
- 새로고침하면 기록이 사라집니다. 결과를 브라우저나 서버에 저장하지 않습니다.
10개 유형 × 10개 단어의 100개 목표 문장을 저장했습니다. 각 세션은 유형과
단어를 섞어 출제하며 정답 위치도 섞습니다. 사전 표제어와 변형 규칙은
[WORDS.md](docs/WORDS.md)에 설명했습니다.
청취 과제는 직접 목표 식별, 연습 암호와 진짜 암호 구별, 앞 단어를 잊고 다음
단어 기억, 첫째·마지막·가운데 선택, 반복 찾기, 정정 반영, 신호 조건 적용,
오른쪽 표지 선택의 10가지입니다. 문장에 실제 보기의 오답도 포함됩니다.
## 검증과 정적 빌드
```bash
npm run lint
npm test
python3 -m unittest discover -s tests/python -v
npm run build
npm audit
npm run preview
```
`lint`는 ESLint와 TypeScript 검사, `test`는 unit/component/자산/빌드 검증기
테스트를 실행합니다. `build`는 `dist/`를 만들고 음성 101개와 현장음 8개가 manifest 해시 그대로
포함되었는지 확인합니다. 앱 콘텐츠의 예상 101개 목록과 실제 파일 집합을 독립 비교해
manifest와 폴더를 함께 줄이거나 파일을 추가한 경우도 거부합니다. 빌드에는 음성 합성 도구가 필요하지 않습니다.
런타임 MIT notice와 현장음 attribution/license notice가 `dist/`에 전문 그대로 포함되는지도 검증합니다.
실제 오디오·360px/1280px 화면·키보드·접근성·오류 재시도 검증:
```bash
# Chromium이 없는 개발 환경에서 한 번만 실행합니다.
npx playwright install chromium
npm run test:browser
# 이미 설치된 Chrome을 사용할 때의 대안입니다.
CHROME_PATH=/usr/bin/google-chrome npm run test:browser
```
Chromium sandbox는 기본으로 켭니다. sandbox를 지원하지 않는 격리된 개발
환경에서만 `PLAYWRIGHT_NO_SANDBOX=1`을 명시해 끌 수 있습니다. `0`, `false`,
빈 값이나 미설정은 sandbox를 유지합니다. `CHROME_PATH` 지정은 sandbox를 끄지 않습니다.
브라우저 테스트는 기존 `dist/`를 사용하므로 소스 변경 후 먼저 빌드하세요.
실제 음성 재생이 끝나기를 기다려 몇 분이 걸립니다. 로컬 4173 포트를
테스트 중에만 열고 종료합니다. 스크린샷과 109개 WAV의 query URL·해시·디코드
결과는 `test-results/`에 저장합니다. 현재 리뷰 인수 기록은
`.agent/evidence-v0.2.3/review-fixes/`에 보존합니다. 기존 v0.1/v0.1.1 및 v0.2.3 증거는 덮어쓰지 않습니다.
## 음성과 문서
한국어 WAV 101개는 직접 쓴 문장을 Microsoft Edge online TTS의
`ko-KR-HyunsuMultilingualNeural`로 v0.1.1에서 생성했으며 WAV 바이트는 그대로 보존했습니다. edge-tts **7.3.1**,
rate `-6%`, pitch `-4Hz`이며 FFmpeg로 **24kHz mono PCM16**으로 변환합니다.
생성 시 네트워크가 필요하며 앱은 저장된 WAV만 재생합니다. 환경음은 공개 라이선스의 실제 현장 녹음 8개를 각 12초로 변환해 번들합니다. 생성 음성의 독점 권리를 주장하지 않습니다.
intro와 목표 WAV는 모두 `/audio/파일명.wav?v=0.2.3`로 요청합니다.
`src/audio/assets.ts`의 자산 버전 한 곳을 사용하며, 같은 파일명으로 음성을
교체할 때 이 값을 갱신해 기존 7일 캐시와 구분합니다. 배경은 `/ambience/환경.wav?v=0.2.3`입니다. 제품 버전은 0.2.3입니다.
Linux에서 Python 3.11 이상과 FFmpeg를 준비한 뒤 다음 명령을 사용합니다.
클라이언트 버전을 고정해도 원격 모델 변경으로 동일 바이트 재생성은 보장하지 않습니다.
```bash
python3 -m venv .venv-audio
.venv-audio/bin/python -m pip install -r requirements-audio.txt
.venv-audio/bin/python -m pip check
npm run audio:generate
```
고정 venv의 Python이 101개 모두 임시 생성·검증하고 디렉터리를 원자 교체합니다.
요청별 60초 제한과 최대 3회 시도를 적용하며, 실패 시 기존 자산을 보존합니다.
청취 샘플: [안내](public/audio/intro.wav), [행운의 사과](public/audio/luck-apple.wav).
생성 방법, 도구 라이선스, 합성 음질의 한계는 [AUDIO_PROVENANCE.md](docs/AUDIO_PROVENANCE.md)를
참고하세요. 실제 음량은 출력 장치에 따라 달라지며 표기 dB는 디지털 상대값입니다.
현장음 원본은 `/tmp/findword-ambience-sources`에서만 보관하고 배포하지 않습니다.
`python3 scripts/ambience_audio.py`는 승인 계획의 `expectedSourceSha256`·`sourceBytes`를 전수 확인한 뒤에만 변환합니다.
직접 미디어 길이는 `directMediaDurationSeconds`, 검증 상태는 `sourceVerification`에 보존합니다.
8 WAV·manifest·고지를 같은 파일시스템에서 staging/검증한 뒤 Linux `renameat2(RENAME_EXCHANGE)`로
폴더 전체를 교체합니다. symlink 출력은 거부하며 commit 전 실패/중단은 이전 폴더를 보존합니다.
PD·CC0·CC BY 4.0·CC BY-SA 4.0의 정확한 출처·저작자·변환·해시는
[현장음 manifest](public/ambience/manifest.json), [배포 고지](public/ambience/AMBIENCE_NOTICES.md)에 있습니다.
시장 파생본은 CC BY-SA 4.0을 유지합니다. 외부 링크는 출처 확인용이며 앱은 이를 요청하지 않습니다.
- [변경 이력](CHANGELOG.md)
- [v0.2.3 구현·검증 결과](.agent/RESULT-v0.2.3.md)
- [설계와 상태 전이](docs/ARCHITECTURE.md)
- [Neo를 위한 정적 배포 안내](docs/DEPLOYMENT.md)
- [v0.1.1 RED/GREEN 및 실제 검증 결과](.agent/RESULT-v0.1.1.md)
- [v0.1 역사 기록](.agent/RESULT.md)
이번 작업에서는 서버 배포와 Git commit/push를 실행하지 않습니다.
@@ -0,0 +1,408 @@
# Find-Word v0.2.3 구현·검증 결과
작성일: 2026-10-14 UTC. worktree `/home/hermes/worktrees/find-word-v0.2.3`, branch `feat/v0.2.3`.
기준 HEAD `c92660b514f7af8eb556d3fa5c0fc80e4bdd4cf5`. 지정된 TASK/ACCEPTANCE/AMBIENCE-SOURCES를 먼저 읽고 기존 코드·테스트·문서를 확인했다.
**Git commit/push/merge/tag, 외부 배포, secrets 사용은 하지 않았다.** 로컬 production preview만 사용했다.
정확한 credit **Designed by OZ at Heat-T Medical Inc.**와 private/UNLICENSED 프로젝트 권리를 보존했다.
제3자 현장음은 각각의 라이선스를 유지한다.
**현재 최종 상태:** privacy excerpt 구현/재생성 완료, **ASR zero-segment acceptance 미달**. 단위 123 통과 / 1 실패이며 실패는 새 ASR acceptance다.
lint/build·Python 36개·sandboxed Chrome 30개 PASS, npm audit 0건. 최종 Chrome 결과와 상세 근거는 맨 아래 **최종 privacy excerpt refinement** 절에 있다.
앞선 구현/독립 리뷰의 기록은 당시 결과로 보존하며 최신 acceptance 성공으로 오인하지 않는다.
## 최초 구현 내용 (아래 리뷰 수정 내역으로 보완)
- 정확히 세 개의 서로 다른 문제/단어를 한 단계에서 출제한다. 시작 단계 1~5 선택, mixed 선택/입력/선택,
진행률/안내/분모 3문항, 정상 완료→다음 단계의 새 3문항, 5단계 재도전과 홈 복귀를 구현했다.
- SNR을 −12~+12 dB, 1 dB 눈금으로 직접 설정한다. 범위 밖 값은 clamp, NaN/Infinity는 단계 기본값으로 복구한다.
변경은 현재 재청취·미응답 문항·이후 라운드에 적용한다. 재생 중 gain을 바꾸지 않는다.
다음 단계도 수동 값은 유지하고 홈 복귀 시 수동 override를 지운다. 시작 단계/모드/환경/전체 음량은 홈 설정으로 유지한다.
- ready/loading/playing/answer/feedback에서 `문제 풀이 종료`가 가능하다. token 무효화→엔진 정지→결과 전환으로
지연 콜백을 차단한다. 응답 수·정답 수·실제 응답 분모를 표시하고 무응답을 오답으로 세지 않는다.
- 여덟 고유 실제 현장 녹음을 fetch/decode/loop한다. 절차적 잡음 합성 코드는 제거했다.
101개 음성 및 여덟 배경은 모두 same-origin `?v=0.2.3` 정적 요청이다. 런타임 외부 API/TTS/추적은 없다.
- 음성과 배경을 각각 RMS .03으로 정규화하고 상대 gain `10^(dB/20)`을 적용한다.
안내/목표/배경의 피크 합에 공통 gain을 적용해 최악 합계 peak ≤ .8을 유지한다.
master 음량은 그 뒤 공통 적용되므로 SNR을 보존한다. 배경은 목표 ended에서 함께 정리한다.
- HTTP/decode/준비 15초 timeout/재생 길이+5초 timeout/abort 후 한국어 안내와 재시도를 유지한다.
- CHANGELOG 생성, package/lock/HTML/UI/자산 버전/README/설계/배포/오디오/단어/권리 문서를 0.2.3에 맞췄다.
상세 한국어 설계 주석을 수정 코드의 모듈·함수·클래스·상태/매개변수·경합/수치 계산에 추가했다.
## RED → GREEN 원문
각 동작/회귀는 테스트를 먼저 작성·실행한 뒤 구현했다. 아래 RED의 종료 코드는 1, GREEN은 0이다.
`-t`로 좁힌 실행의 skipped는 필터 제외이며 최종 전체 실행은 skip 0이다. 실패 원문을 성공 로그로 대체하지 않았다.
| 계약/회귀 | RED → GREEN | 원문 |
| --- | --- | --- |
| 세 문항/같은 시작 단계/혼합/점수 | 기존 10문항·자동 단계에서 3 실패 → 9 통과 | [01 RED](evidence-v0.2.3/01-round-RED.log), [01 GREEN](evidence-v0.2.3/01-round-GREEN.log) |
| SNR 정규화/미응답 전파/전 단계 종료/지연 이벤트 | 누락 reducer action 등 7 실패 → 15 통과 | [02 RED](evidence-v0.2.3/02-snr-exit-RED.log), [02 GREEN](evidence-v0.2.3/02-snr-exit-GREEN.log) |
| 시작 단계/수동 SNR/다음 라운드/5단계 경계/중도 결과/UI 초기화 | 10 실패 → 18 통과 | [03 RED](evidence-v0.2.3/03-screen-RED.log), [03 GREEN](evidence-v0.2.3/03-screen-GREEN.log) |
| 고유 녹음 URL/절차적 매개변수 제거/peak/SNR 수학 | 2 실패 → 콘텐츠 포함 19 통과 | [04 RED](evidence-v0.2.3/04-recorded-mix-RED.log), [04 GREEN](evidence-v0.2.3/04-recorded-mix-GREEN.log) |
| 실제 배경 fetch/decode/loop/abort/timeout/재시도 | 전환 중 남은 합성 호출 및 누락 녹음 경로로 9 실패 → 11 통과 | [05 RED](evidence-v0.2.3/05-playback-RED.log), [05 GREEN](evidence-v0.2.3/05-playback-GREEN.log) |
| Node 직접 import 회귀 | ERR_MODULE_NOT_FOUND → 101문장 import 통과 | [06 RED](evidence-v0.2.3/06-node-import-RED.log), [06 GREEN](evidence-v0.2.3/06-node-import-GREEN.log) |
| 8개 배포 PCM/해시/출처/고지/루프 경계 | manifest ENOENT → 전수 통과 | [07 RED](evidence-v0.2.3/07-assets-RED.log), [07 GREEN](evidence-v0.2.3/07-assets-GREEN.log) |
| 실제 FFmpeg 변환/재현/무음 거부/길이 제한 | 변환 모듈 없음 → Python 2 통과 | [변환 RED](evidence-v0.2.3/07-converter-RED.log), [변환 GREEN](evidence-v0.2.3/07-converter-GREEN.log) |
| 재생 중 SNR 변경의 실제 청취 이력 | −10을 들었다고 잘못 기록 → 34 통과 | [08 RED](evidence-v0.2.3/08-heard-snr-RED.log), [08 GREEN](evidence-v0.2.3/08-heard-snr-GREEN.log) |
| 버전/문서/변경 이력/기존 voice metadata | 이전 버전·누락 CHANGELOG → 50 통과 | [09 RED](evidence-v0.2.3/09-version-docs-RED.log), [09 GREEN](evidence-v0.2.3/09-version-docs-GREEN.log) |
| 3문항의 환경 순환 회귀 | 3개 환경만 도달 → 8개 도달, 35 통과 | [10 RED](evidence-v0.2.3/10-environment-rotation-RED.log), [10 GREEN](evidence-v0.2.3/10-environment-rotation-GREEN.log) |
| dist 현장음/manifest/notice 변조·누락·원본 혼입/고지 링크 | 5 실패 → 26 통과 | [11 RED](evidence-v0.2.3/11-bundle-notice-RED.log), [11 GREEN](evidence-v0.2.3/11-bundle-notice-GREEN.log) |
| 누락 WAV의 SPA fallback | desktop/mobile 200 HTML → 양쪽 404, 4 통과 | [13 RED](evidence-v0.2.3/13-static-404-RED.log), [13 GREEN](evidence-v0.2.3/13-static-404-GREEN.log) |
| 결과 화면의 잘못된 도움말 anchor | 없는 #howto 링크 노출 → 제거 | [15 RED](evidence-v0.2.3/15-results-anchor-RED.log), [15 GREEN](evidence-v0.2.3/15-results-anchor-GREEN.log) |
| 새 설정의 터치 크기/카드 경계 | 양쪽 23px 높이 → 44px 이상, 2 통과 | [16 RED](evidence-v0.2.3/16-controls-layout-RED.log), [16 GREEN](evidence-v0.2.3/16-controls-layout-GREEN.log) |
| 3문항의 보너스 안내 | 당시 40점 → 20점 안내; 리뷰에서 문항별 20점/합계 30점으로 재정정 | [17 RED](evidence-v0.2.3/17-bonus-copy-RED.log), [17 GREEN](evidence-v0.2.3/17-bonus-copy-GREEN.log) |
| 모바일 select 선택값 잘림 | 360px에서 글자 폭 초과 → 중복 SNR을 아래 제어에 모음 | [21 RED](evidence-v0.2.3/21-select-label-RED.log), [21 GREEN](evidence-v0.2.3/21-select-label-GREEN.log) |
| Chrome favicon 기본 404 | 내장 icon 없음/실제 콘솔 오류 → 내장 SVG | [19 RED](evidence-v0.2.3/19-favicon-RED.log), [19 GREEN](evidence-v0.2.3/19-favicon-GREEN.log) |
추가 진단 기록도 보존했다. `01-round-sampling-regression.log`의 96/100은 세 문항으로 줄인 뒤
기존 200 seed 표본이 작아진 테스트 회귀여서 1000 seed로 전체 100조합 도달성을 검사했다.
`03-screen-duplicate-description-RED.log`는 같은 SNR 설명을 중복 배치한 회귀를 잡았다.
`05-playback-fixture-regression.log` 뒤 mock AudioBuffer의 copyToChannel을 실제 복사처럼 보완했고
부동소수점 0.12000000000000001 비교를 근사 비교로 바꿨다. 실제 재생은 별도의 Chrome으로 검증한다.
`12-lint-initial.log`의 축소된 union 비교/fixture 타입 오류도 수정했다.
## 현장음 원본과 변환
지정된 원본 8개를 모두 사용했다. **대체 원본은 0개**다. 여섯 기존 원본을 재사용했고 café는
HTTP 429의 **Retry-After 600초** backoff 뒤 지정 직접 URL로 다운로드했다. rain도 지정 URL에서 받았다.
[다운로드 기록](evidence-v0.2.3/source-downloads.log), [rain 기록](evidence-v0.2.3/rain-download.log).
[원본 전수 검사](evidence-v0.2.3/source-integrity.json)는 전체 원본 SHA-256/bytes/ffprobe 정보와
FFmpeg **전체 디코드 8/8 성공, stderr 0**을 기록한다. café 19,947,952 bytes, rain 91,187,572 bytes는
Commons primary 메타데이터의 크기와 일치한다. [Commons API 근거](evidence-v0.2.3/commons-license-audit.json),
[primary 페이지/권리 재확인](evidence-v0.2.3/primary-page-verification.json).
`python3 scripts/ambience_audio.py`로 원본의 명시적 중간 구간을 선택해 전부 **12초 / 24,000Hz / mono / PCM16**으로 만들었다.
양끝 **50ms 선형 fade**, RMS 목표 **.08**, 최대 증폭 **4배**, peak ceiling **.85** 중 안전한 선형 gain을 적용했다.
저레벨 rain과 순간 peak가 큰 market은 제한 때문에 RMS 목표보다 낮다. 엔진은 재생 시 각각 다시 RMS 정규화한다.
양끝 PCM은 0, non-silent 8/8, 고유 출력 해시 8/8, 각 576,044 bytes, 합계 **4,608,352 bytes**다.
대형 OGG/MP3/FLAC 원본은 `/tmp/findword-ambience-sources`에만 있으며 Git/public/dist에 번들하지 않았다.
| 배포 자산 (`public/ambience/`) | 원본 구간 | RMS | peak | 출력 SHA-256 |
| --- | --- | --- | --- | --- |
| street.wav | 35–47s | 0.07999756 | 0.39675903 | `a8bffa201b174618955bc51b860167169125304811aabe2086b0bb35b06c3ae1` |
| mall.wav | 20–32s | 0.07999757 | 0.55468750 | `6e9171f549cacadfaeedd57a41c8e2a76b0e789f5c9a97af029a8d3558c9f145` |
| theater.wav | 45–57s | 0.07999757 | 0.49508667 | `2d6a444fb7874cdf6b2d8a741a69175299b112eb66834912c025437d8277d635` |
| department.wav | 90–102s | 0.07999758 | 0.47497559 | `aa43f3d1d3e7c2b1f8ace24ecbda45d0ea3a031db941c39506dc6c1665b8efa7` |
| market.wav | 30–42s | 0.04922208 | 0.84997559 | `4287e971a12767f70da714e0c1aff30125268f9c3faf07ebfbcc0d2904f4a312` |
| subway.wav | 65–77s | 0.07999755 | 0.42529297 | `9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f` |
| cafe.wav | 120–132s | 0.07999759 | 0.39709473 | `8db06f3f09bbd8409573ba4874c7ccdd1e7e825c8a61989a4efe66206a66c2d2` |
| rain.wav | 180–192s | 0.01138463 | 0.10241699 | `f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9` |
[배포 manifest](../public/ambience/manifest.json)에 environment id/표시 이름, source page/direct URL, creator,
license/license URL, attribution, 원본/출력 SHA-256, bytes/duration/RMS/peak, 실제 FFmpeg 버전과 변환 설정을 기록했다.
[AMBIENCE_NOTICES](../public/ambience/AMBIENCE_NOTICES.md)를 dist에 포함하고 UI에서 접근할 수 있다.
시장 파생 WAV는 **CC BY-SA 4.0**, 지하철은 **CC BY 4.0**, 나머지는 CC0/PD이며 출처·변경 고지를 보존했다.
프로젝트의 UNLICENSED를 이 녹음에 적용하지 않는다. 런타임 React/ReactDOM/scheduler의 기존 MIT 전문도 그대로 배포한다.
## 보존과 구체적 회귀 수정
- **101개 neural WAV 바이트/원문/해시 변경 0**. voice manifest는 배포 version만 0.2.3으로 올리고
`generatedForVersion: 0.1.1`을 추가했으며 생성 시각·provider·voice·prosody·도구/실측값은 보존했다.
- 기존 10 mechanic/100문장, 정답·오답 규칙·점수 공식·재청취·객관식/주관식/mixed·IME 보호를 유지했다.
- **과거 .agent 추적 파일 180개 모두 Git blob hash 동일**. v0.1/v0.1.1 RESULT와 evidence 수정 0.
[보존 검사](evidence-v0.2.3/preservation.json).
- 짧아진 라운드 때문에 순환 환경이 street/mall/theater에만 갇히는 회귀를 seed 기반 환경 셔플로 수정했다.
- 환경 URL 모듈 추가로 Python 생성기의 Node 직접 import가 깨지는 회귀를 명시적 `.ts` 경로로 수정했다.
- `heardDb`를 PLAY 시점에 기록해 재생 중 조절값이 과거 청취 이력/결과를 덮어쓰지 않게 했다.
- 중복 SNR 설명, 결과 화면의 없는 도움말 anchor, 실제 라운드 보너스 상한 안내를 바로잡았다.
- Vite dev/preview의 누락 WAV HTML fallback을 차단하고 Nginx 인계에도 `/ambience/` 404 규칙을 추가했다.
- 모바일 최종 이미지에서 시작 단계 select의 긴 선택값 잘림을 찾아 글자 폭 검사로 재현하고, 중복 SNR 표기를 전용 제어로 모았다.
- 실제 Chrome의 기본 `/favicon.ico` 404 콘솔 오류를 내장 SVG로 제거했다.
## 리뷰 전 검증 기록 (리뷰 수정 후 결과는 문서 하단)
환경: Node **26.7.0**, npm **11.19.0**, Python **3.11.16**, FFmpeg **6.1.1-3ubuntu5**, system Chrome **146.0.7680.80**.
[환경](evidence-v0.2.3/environment.json). Chrome sandbox 활성화, `--no-sandbox` 0개를 실행 중 process argv로 확인했다.
[실행 sandbox 기록](evidence-v0.2.3/chrome-sandbox.json); 설정 계약 테스트도 통과했다.
| 검증 | 결과 | 원문 |
| --- | --- | --- |
| `npm run lint` | PASS, ESLint + TypeScript strict, exit 0 | [22-lint](evidence-v0.2.3/22-lint.log) |
| `npm test` | **13 files / 94 passed**, skip 0, exit 0; Python runner 포함 | [22-full-test](evidence-v0.2.3/22-full-test.log) |
| `python3 -m unittest discover -s tests/python -v` | **20 passed**, exit 0 (기존 neural 18 + 새 변환 2) | [18-python](evidence-v0.2.3/18-python.log) |
| `npm run build` | PASS, 101 voice + 8 ambience + 두 notice 검증, exit 0 | [22-build](evidence-v0.2.3/22-build.log) |
| `npm audit --json` | **취약점 0** (info/low/moderate/high/critical 모두 0), exit 0 | [audit JSON](evidence-v0.2.3/14-npm-audit.json) |
| 최종 sandboxed system Chrome desktop/mobile | **26 passed / 0 failed / 0 skipped**, exit 0; 실제 재생·접근성·무외부 요청 검증 | [22-browser](evidence-v0.2.3/22-browser.log), [machine-readable 결과](evidence-v0.2.3/browser-results.json) |
| 원본/배포 녹음 및 101개 voice 보존 | PASS | [원본](evidence-v0.2.3/source-integrity.json), [보존](evidence-v0.2.3/preservation.json) |
| 비밀정보 형식 검사 | **0 findings**, 값 노출 없이 경로/개수만 기록 | [scan](evidence-v0.2.3/secret-scan.json) |
| `git diff --check` | PASS | [최종 worktree 점검](evidence-v0.2.3/final-review.log) |
브라우저는 1280×1000 desktop / 360×800 mobile에서 같은 production build를 사용한다.
실제 디코드한 109 WAV의 response hash/bytes/24kHz/mono/duration/RMS/peak를 전수 대조하고,
앱에서 여덟 환경을 실제 loop로 재생 후 정지했다. 혼합 모드 세 문항 완주/재청취/키보드,
4단계 시작→5단계 새 라운드, 수동 SNR 유지/재청취/홈 초기화, 재생 중 종료/응답 뒤 종료,
intro/target/ambience 404 재시도, 누락 WAV의 HTML Accept 404, notice 원문 제공을 검사한다.
정상 흐름의 console/page errors·failed requests·외부 요청·axe violations가 모두 0이어야 통과한다.
브라우저 native audio 메서드를 관찰할 때 원래 메서드를 실행하며 가짜 decode/ended를 주입하지 않는다.
최종 캡처 8개와 실제 검사 JSON을 새 evidence에 보존했다. 모바일 게임/시작과 desktop 시작/결과의
레이아웃을 이미지로 확인했고, 결과 분모/현재 SNR/종료 버튼/고지 링크가 잘리지 않는다.
| 화면 | Desktop | Mobile |
| --- | --- | --- |
| 시작 | [PNG](evidence-v0.2.3/browser/desktop-start.png) | [PNG](evidence-v0.2.3/browser/mobile-start.png) |
| 게임 | [PNG](evidence-v0.2.3/browser/desktop-game.png) | [PNG](evidence-v0.2.3/browser/mobile-game.png) |
| 정상 결과 | [PNG](evidence-v0.2.3/browser/desktop-normal-results.png) | [PNG](evidence-v0.2.3/browser/mobile-normal-results.png) |
| 중도 종료 | [PNG](evidence-v0.2.3/browser/desktop-early-exit.png) | [PNG](evidence-v0.2.3/browser/mobile-early-exit.png) |
실제 109 WAV 해시/디코드/레벨 및 오류 0 집계:
[desktop JSON](evidence-v0.2.3/browser/desktop-audio-integrity.json),
[mobile JSON](evidence-v0.2.3/browser/mobile-audio-integrity.json).
세 문항→다음 단계→중도 종료→홈·재청취의 실제 소스 시작/정지 및 네트워크 집계:
[desktop runtime](evidence-v0.2.3/browser/desktop-runtime-audit.json),
[mobile runtime](evidence-v0.2.3/browser/mobile-runtime-audit.json).
초기 browser suite 24/24 통과 후 console/requestfailed 검사를 강화해 missing favicon을 찾았다.
그 실패는 `18-browser.log`에 남기고, 최종 검증은 별도 로그로 구분했다. 오류를 숨기거나 예외 목록으로 제외하지 않았다.
404/잘못된 WAV 주입 테스트의 의도적 실패 응답은 정상 흐름의 오류 0 집계와 구분한다.
## 실제 검증의 한계와 인계
- Chrome은 실제 WAV를 디코드하고 실제 AudioContext/BufferSource를 실행했다. 헤드리스 자동 검증은
스피커/헤드폰의 물리 음압, 한국어 청감, 개인의 난이도나 임상 효과를 보증하지 않는다.
- 녹음 장면은 primary 출처 설명으로 확인했고 짧은 연속 구간의 포맷/신호/해시/루프를 검증했다.
**사람이 여덟 구간을 직접 청취하여 음악·불필요하게 명료한 우연 대화가 없는지 판단하는 인수는 수행하지 않았다.**
자동 검사를 인간 청취 인증으로 주장하지 않는다. [샘플과 provenance](../docs/AUDIO_PROVENANCE.md)를 Neo가 검토할 수 있다.
- mobile은 system Chrome 360×800 viewport/touch emulation이다. 실제 Android/iOS 기기 및 Safari 검증은 별도다.
- SNR은 전체 버퍼 RMS에 대한 디지털 상대값이다. 현장음의 시간 변화 때문에 순간/주파수별 SNR은 다르다.
- 로컬 `dist`만 검증했다. production HTTPS/MIME/cache/서버 설정은 배포 후 Neo의 독립 검증 대상이다.
- 사용자 지시대로 commit/push/merge/tag/deploy는 미실행이다. acceptance의 Neo 릴리스 항목은 완료로 표시하지 않았다.
[DEPLOYMENT](../docs/DEPLOYMENT.md)에 feature push→main FF→annotated tag→fresh clone→commit-addressed 원자 배포/rollback 절차를 인계했다.
## 독립 리뷰 수정 — 2026-10-14
사용자가 요약한 두 독립 리뷰와 본 결과 문서를 읽고 release-hardening을 수행했다.
기존 uncommitted v0.2.3 작업을 이어서 수정했으며 commit/push/merge/tag/deploy는 하지 않았다.
새 실패 테스트를 먼저 실행하고 생산 코드/검증기를 수정했다. 이전 evidence 로그는 수정하지 않았다.
신규 기록은 모두 [review-fixes/](evidence-v0.2.3/review-fixes/) 아래에 있다.
### 수정 내용과 동작
1. 진행 막대는 답변 수가 아닌 **현재 문항 1/3 → 2/3 → 3/3**이다. 첫 재생·답변 전·피드백과
다음 라운드에서도 일관된다. 접근성 이름/값, native progress 위치, 실제 PNG 채움 픽셀까지 검사한다.
2. 결과/README/설계/CHANGELOG의 점수 설명은 **정답마다 단계×100점 + 연속 정답 보너스**,
**문항별 최대 20점, 라운드 합계 0+10+20=30점**이다. 1단계 세 정답의 **330점**을 실제 UI 흐름으로 검증했다.
3. 응답이 없으면 정답률은 **— / 응답 없음**이며 0%나 0/0을 보여 주지 않는다. 응답 없는 단계는 **미진행**이다.
중도 종료 제목은 **문제 풀이를 중간에 종료했어요.**, 정상 결과는 **N단계 문제 풀이를 마쳤어요.**로 구분한다.
4. 실제 Chrome RED에서 `입력`, 결과의 `만나요`/`최대` 등 어절 분리를 검출했다.
모드 설명과 결과 영역에 keep-all을 적용하고 줄바꿈을 허용했다. 320px/360px에서 어절 내부 Range 줄 분리와
요소/문서 overflow를 검사하며 시작·정상 결과·중도 결과 캡처를 남겼다.
5. README 현재 증거 경로를 `.agent/evidence-v0.2.3/review-fixes/`로 바로잡고 일본어 reducer 테스트 제목을 한국어로 바꿨다.
6. build verifier는 앱 콘텐츠의 10 patterns×10 words+intro로 **정확한 101개 이름**을 독립 구성한다.
manifest 정확히 101개, 중복 없는 예상 inventory, dist/audio의 추가/누락 파일을 모두 검사한다.
양쪽 manifest와 디렉터리를 함께 비우기/축약/중복/이름 변경해도 실패하며 정상 사본은 통과한다.
7. 승인 계획과 배포 manifest의 `verifiedLocalSource` 및 모호한 `sourceDurationSeconds`를 제거했다.
`expectedSourceSha256`, `sourceBytes`, `sourceVerification`과 **directUrl 바이트의 ffprobe format.duration**인
`directMediaDurationSeconds`를 보존한다. Freesound preview MP3의 길이와 primary 페이지 표시 길이를 혼동하지 않는다.
파생 WAV의 `duration`/`conversion.durationSeconds`는 별도로 12초다. 기존 source-integrity 증거와 대조했다.
8. 생성기는 **첫 변환 전에 여덟 원본 전부**의 승인 해시/bytes를 확인한다. 불일치/누락/중복/잘못된 목록은 실패하고,
현재 파일 값으로 승인 계획을 덮어쓰지 않는다. 실제 원본 8개도 새 승인 필드로 재검증했다.
9. 현장음 notice를 **public/ambience/AMBIENCE_NOTICES.md**로 옮겼다. 같은 파일시스템의 staging에서
8 WAV·manifest·notice와 실측 PCM을 전수 검사한 다음 Linux **renameat2(RENAME_EXCHANGE)** 한 번으로 교체한다.
최초 생성은 rename 한 번이다. overlay를 없애 stale 파일을 제거하고 정상/dangling symlink 출력을 거부한다.
모든 변환 위치의 실패/KeyboardInterrupt, manifest/notice 쓰기 실패, staged 변조, 교환 실패/미지원,
commit 전 SIGTERM에서 이전 디렉터리를 보존한다. 실제 교환 도중 디렉터리 fd로 읽은 세 파일이
같은 세대인 것도 확인했다. UI 링크·build verifier·권리·배포·재현 문서를 함께 수정했다.
10. 모든 배포 notice 항목에 **creator, primary page URL, direct download URL, license URL,
outputLicense, 명시적 Changes**가 있어야 한다. 다른 항목에 공통 URL이 남아도 누락을 감추지 못한다.
8개 항목×6개 필드 제거와 public/dist 동시 metadata 변조를 build verifier에서 거부한다.
11. CHANGELOG와 본 문서에 실제 수정/검증을 반영했다. **109 WAV 재생성 0 / 바이트 변경 0**이다.
### 새 RED → GREEN 원문
| 계약 | RED | GREEN |
| --- | --- | --- |
| 진행률·330점·보너스·무응답·종료/완료 문구·README | [01 RED](evidence-v0.2.3/review-fixes/01-ui-RED.log) | [01 GREEN-02: 27 통과](evidence-v0.2.3/review-fixes/01-ui-GREEN-02.log) |
| 실제 desktop/mobile 진행률·320/360px 어절·overflow | [02 RED: 4 실패](evidence-v0.2.3/review-fixes/02-browser-RED.log) | [02 GREEN: 4 통과](evidence-v0.2.3/review-fixes/02-browser-GREEN.log) |
| manifest/폴더 동시 축약·추가/누락 | [03 RED](evidence-v0.2.3/review-fixes/03-voice-inventory-RED.log) | [03 GREEN](evidence-v0.2.3/review-fixes/03-voice-inventory-GREEN.log) |
| durable 승인 원본 메타데이터 | [04 RED](evidence-v0.2.3/review-fixes/04-source-plan-RED.log) | [04 GREEN](evidence-v0.2.3/review-fixes/04-source-plan-GREEN.log) |
| 첫 변환 전 전수 원본 검사 | [05 RED](evidence-v0.2.3/review-fixes/05-source-guard-RED.log) | [05 GREEN](evidence-v0.2.3/review-fixes/05-source-guard-GREEN.log) |
| staging·notice·symlink·검증·원자 교환·실패/중단 보존 | [06 RED](evidence-v0.2.3/review-fixes/06-atomic-RED.log) | [06 GREEN](evidence-v0.2.3/review-fixes/06-atomic-GREEN.log) |
| notice 동시 발행 경로/UI 링크/항목 내용 | [07 RED](evidence-v0.2.3/review-fixes/07-notice-path-RED.log) | [07 GREEN](evidence-v0.2.3/review-fixes/07-notice-path-GREEN.log) |
| 항목별 필수 notice 강제 | [08 RED](evidence-v0.2.3/review-fixes/08-notice-verifier-RED.log) | [08–09 GREEN: 27 통과](evidence-v0.2.3/review-fixes/08-09-build-GREEN.log) |
| manifest 사본 동시 출처/라이선스/변경 변조 | [09 RED](evidence-v0.2.3/review-fixes/09-build-plan-RED.log) | [08–09 GREEN](evidence-v0.2.3/review-fixes/08-09-build-GREEN.log) |
RED 로그는 exit 1, 표에 연결한 GREEN은 exit 0이다. 필터 실행의 skipped는 최종 전체 실행과 구분한다.
`01-ui-GREEN.log`는 이름과 달리 **exit 1**인 중간 실행이다. 새 계약은 통과했지만 기존 통합 테스트의
이전 제목 regex가 남아 실패했고, 그것을 고친 `01-ui-GREEN-02.log`가 실제 GREEN이다. 실패 로그도 보존했다.
초기 RED/GREEN browser PNG를 사후 픽셀 분석한 [RED](evidence-v0.2.3/review-fixes/02-progress-pixels-RED.log) /
[GREEN](evidence-v0.2.3/review-fixes/02-progress-pixels-GREEN.log)도 보존했다. desktop 1096px 막대는
365→731→1096px, mobile 320px 막대는 107→213→320px 채워졌다. 같은 픽셀 검사를 최종 브라우저 테스트에도 넣었다.
추가 동시 읽기/미지원 교환 검증은 [10-atomic-additional](evidence-v0.2.3/review-fixes/10-atomic-additional.log)에 있다.
### 리뷰 수정 후 전체 검증
| 실행 | 실제 결과 | 원문 |
| --- | --- | --- |
| npm run lint | PASS, exit 0 | [lint](evidence-v0.2.3/review-fixes/11-lint.log) |
| npm test | 13 files / **118 passed**, skip 0, exit 0 | [unit](evidence-v0.2.3/review-fixes/11-unit.log) |
| python3 -m unittest discover -s tests/python -v | **32 passed** (neural 18 + ambience 14), exit 0 | [Python](evidence-v0.2.3/review-fixes/11-python.log) |
| npm run build | PASS, 101 voice + 8 ambience + runtime/ambience notices, exit 0 | [build](evidence-v0.2.3/review-fixes/11-build.log) |
| npm audit --json | **취약점 0**, exit 0 | [audit](evidence-v0.2.3/review-fixes/npm-audit.json) |
| sandboxed system Chrome desktop/mobile | **30 passed / 0 failed / 0 skipped / 0 flaky**, 4.0분, exit 0 | [browser log](evidence-v0.2.3/review-fixes/12-browser.log), [JSON](evidence-v0.2.3/review-fixes/browser-results.json) |
[보존 검사](evidence-v0.2.3/review-fixes/preservation.json): 리뷰 시작 시점의 WAV 109개와 이전 `.agent` 파일
268개 모두 해시 동일하다. Git 추적된 v0.1/v0.1.1 `.agent` 파일 180개도 HEAD와 동일하다.
[원본 재확인](evidence-v0.2.3/review-fixes/source-reverification.json): 승인 원본 8개와 배포 bundle을 검증했고 변환은 호출하지 않았다.
Chrome **146.0.7680.80**, desktop 1280×1000/mobile 360×800에 추가 320px/360px copy 검사를 수행했다.
실행 중인 이 테스트의 Chrome 프로세스 20개에 `--no-sandbox`가 없음을 [실제 process 기록](evidence-v0.2.3/review-fixes/chrome-sandbox.json)으로 확인했다.
원래 AudioContext/BufferSource를 실행한 109 WAV 해시·decode 검사와 8개 실제 ambience loop, 오류 재시도,
키보드/axe/외부 요청/콘솔 검사에 새 진행률 픽셀·한국어 어절 검사를 더했다.
[desktop 오디오](evidence-v0.2.3/review-fixes/desktop-audio-integrity.json),
[mobile 오디오](evidence-v0.2.3/review-fixes/mobile-audio-integrity.json),
[desktop runtime](evidence-v0.2.3/review-fixes/desktop-runtime-audit.json),
[mobile runtime](evidence-v0.2.3/review-fixes/mobile-runtime-audit.json).
| 최종 화면 | Desktop | Mobile |
| --- | --- | --- |
| 시작 | [PNG](evidence-v0.2.3/review-fixes/screenshots/desktop-start.png) | [PNG](evidence-v0.2.3/review-fixes/screenshots/mobile-start.png) |
| 게임 | [PNG](evidence-v0.2.3/review-fixes/screenshots/desktop-game.png) | [PNG](evidence-v0.2.3/review-fixes/screenshots/mobile-game.png) |
| 330점 정상 결과 | [PNG](evidence-v0.2.3/review-fixes/screenshots/desktop-normal-results.png) | [PNG](evidence-v0.2.3/review-fixes/screenshots/mobile-normal-results.png) |
| 무응답 중도 종료 | [PNG](evidence-v0.2.3/review-fixes/screenshots/desktop-early-exit.png) | [PNG](evidence-v0.2.3/review-fixes/screenshots/mobile-early-exit.png) |
### 리뷰 후에도 남는 한계
**사람이 여덟 현장음 구간을 청취하여 음악/우연 대화와 적절성을 판단하는 인수는 수행하지 않았다.**
자동 PCM/Chrome 재생 검증을 인간 청취 승인으로 주장하지 않는다. mobile은 Chrome viewport/touch emulation이며
실제 Android/iOS/Safari, 물리적 음압 또는 임상 효과 검증은 아니다.
원자 commit 전 실패/중단은 이전 디렉터리를 보존하며 commit 뒤에는 완성된 새 트리가 공개된다.
강제 kill은 숨은 stage를 남길 수 있다. 전원 손실 내구성이나 여러 HTTP 요청에 걸친 snapshot 격리는 검증하지 않았다.
로컬 build/preview만 확인했으며 사용자 지시대로 Git commit/push/merge/tag 및 배포는 하지 않았다.
## 최종 privacy excerpt refinement — 2026-10-14
**요청한 ASR-empty 조건은 아직 충족하지 못했다.** 지정된 새 구간과 provenance, generator,
전체 원자 재생성은 반영했지만 최종 normalized WAV의 ASR에 market/cafe candidate segments가 남았다.
해당 acceptance test를 완화하거나 skip하지 않았으며 현재 `npm test`는 **123 통과 / 1 실패**다.
정확한 이전 ASR 설정이 제공되지 않아 Neo의 scan과 동등한 방법을 재현했다고 주장하지 않는다.
commit/push/merge/tag/deploy는 하지 않았다.
### 변경과 원자 재생성
- `.agent/AMBIENCE-SOURCES-v0.2.3.json`의 8개 항목에 `selectedSegmentStartSeconds`를 추가했다.
street=35, mall=36, theater=45, department=90, market=60, subway=65, cafe=180, rain=180.
원본 hash/bytes/직접 미디어 길이/권리 정보는 바꾸지 않았다. generator는 별도 시작점 map을 제거하고
계획 값을 읽는다. 누락/비수치/bool/비유한값/음수/12초 범위 초과는 첫 변환 전에 실패한다.
- 임의의 fractional start와 정확한 source 끝 경계를 주는 테스트로 hidden hardcoded map이 없음을 확인한다.
성공/실패 시 계획을 변경하지 않고 manifest의 선택값/실제 conversion 시작점/notice 구간이 일치해야 한다.
build verifier는 public/dist manifest와 notice를 함께 변조한 시작점·길이도 거부한다.
- 첫 변환 전에 8개 원본 SHA-256·bytes·ffprobe duration을 전수 대조했고 generator의 preflight도 다시 수행했다.
같은 파일시스템 staging에서 전체 8 WAV·manifest·notice를 검증한 뒤 원자 디렉터리 교환했다.
[재생성 실측](evidence-v0.2.3/privacy-screening/regeneration.json), [성공 로그](evidence-v0.2.3/privacy-screening/09-regeneration.log).
- 실제 Ogg 입력 seek에서 market은 287,958, cafe는 287,809 frame으로 짧아져 최초 생성이 중단됐다.
output-side seek 재시도만으로 cafe는 해결되지 않았다. 각 실패와 [기존 bundle 보존](evidence-v0.2.3/privacy-screening/failed-regeneration-preservation.json)을 남겼다.
최종 fallback은 처음부터 디코드한 24kHz PCM에서 승인 시작 sample부터 288,000개를 선택하고
sample 수로 output PTS를 재설정한다. 패딩/시간 변형 없이 실제 `seekMethod`를 manifest에 기록한다.
진짜 원본 부족은 여전히 거부한다. [진단](evidence-v0.2.3/privacy-screening/seek-diagnostics.json),
[추가 진단](evidence-v0.2.3/privacy-screening/seek-diagnostics-followup.json).
- 기존 입력 seek가 완전한 다섯 WAV는 기존 byte를 재현했다. 모든 최종 WAV는 12초/24kHz/mono/PCM16,
576,044 bytes이며 양끝 50ms fade와 동일 bounded normalization을 유지한다.
| 최종 자산 | 원본 구간 | RMS | peak | SHA-256 |
| --- | --- | --- | --- | --- |
| street.wav | 35–47s | 0.07999756 | 0.39675903 | `a8bffa201b174618955bc51b860167169125304811aabe2086b0bb35b06c3ae1` |
| mall.wav | 36–48s | 0.07999755 | 0.71917725 | `680a769940c08f0d12c6c954c08366598dd8b5745e276f39c82b10d1a88261a1` |
| theater.wav | 45–57s | 0.07999757 | 0.49508667 | `2d6a444fb7874cdf6b2d8a741a69175299b112eb66834912c025437d8277d635` |
| department.wav | 90–102s | 0.07999758 | 0.47497559 | `aa43f3d1d3e7c2b1f8ace24ecbda45d0ea3a031db941c39506dc6c1665b8efa7` |
| market.wav | 60–72s | 0.07999756 | 0.50723267 | `7a7a980845a4aade2a7e8a108eae746220a4688e92792ee93d3deb76b2a762f6` |
| subway.wav | 65–77s | 0.07999755 | 0.42529297 | `9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f` |
| cafe.wav | 180–192s | 0.07999757 | 0.44708252 | `802a956e91b85a2fdd0e1f161d75bfada7a53499bcb57ba7f578411480ded216` |
| rain.wav | 180–192s | 0.01138463 | 0.10241699 | `f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9` |
위 표가 최신 바이트다. 문서 상단의 최초 구현 표와 앞선 리뷰 기록은 당시 값으로 그대로 보존했다.
### ASR 증거와 미충족 조건
[final-asr.json](evidence-v0.2.3/privacy-screening/final-asr.json)은 **정확한 최종 8 WAV 전수 검사**다.
faster-whisper 1.2.1, Systran faster-whisper-tiny multilingual revision
`d90ca5fe260221311c53c58e660288d3deb8d356`, CPU int8/4 threads, beam 5, random seed 0,
자동 language detection, package 기본 Silero VAD/decoding threshold를 사용했다.
모델/VAD 파일 해시·의존성 버전·전체 설정·변환 옵션·각 WAV/source hash와 반환 segment/info를 보존했다.
VAD의 무한대 기본 옵션은 JSON 호환 `{"nonFiniteFloat":"Infinity"}`로 의미를 명시해 저장했다.
| 환경 | VAD 활성 최종 segment 수 | 별도 VAD 미사용 segment 수 |
| --- | --- | --- |
| street | 0 | 0 |
| mall | 0 | 1 |
| theater | 0 | 1 |
| department | 0 | 1 |
| market | 3 | 1 |
| subway | 0 | 1 |
| cafe | 1 | 1 |
| rain | 0 | 1 |
mall은 비었지만 **market 3개, cafe 1개가 남아 `requiredEmptyPassed: false`**다.
[별도 VAD 미사용 결과](evidence-v0.2.3/privacy-screening/no-vad-asr.json)는 세 변경 구간 모두에서 text가 나왔다.
VAD 비교는 방법의 영향을 확인하기 위한 추가 검사이며 이전 설정과 같다는 증거는 없다.
threshold 튜닝이나 반환 segment 삭제로 조건을 충족시키지 않았다. 원본 구간을 검사한 scan의 빈 결과를
정규화된 최종 WAV의 빈 결과로 치환하지 않는다. 정확한 Neo 명령/설정 확인을 요청했으며 최종 파생본 재검토가 필요하다.
**Tiny-model ASR은 screening signal일 뿐, 사람의 청취 인수나 법적/개인정보 clearance가 아니다.**
빈 segment도 말소리/음악/개인 대화의 부재를 증명하지 않으며 출력 text/language도 환각일 수 있다.
충실한 transcript나 실제 화자의 발언이라고 주장하지 않는다. 사람의 최종 청취 인수는 미실행이다.
[기존 후보 scan](evidence-v0.2.3/privacy-screening/candidate-scan-original.json)과
[기존 파생본 ASR](evidence-v0.2.3/privacy-screening/prior-derivatives-asr-original.json)을 `/tmp` 원문 그대로 보존했다.
[provenance](evidence-v0.2.3/privacy-screening/earlier-asr-provenance.json)는 원래 경로·크기·hash·수정 시각,
Neo 제공이라는 맥락, 당시 계획/manifest와의 연관을 기록한다. raw JSON 자체에는 모델 revision/decoding 설정/
입력 hash가 없어 독립적으로 검증한 연결이라고 주장하지 않는다. 휴리스틱 text를 편집하거나 전사로 확정하지 않았다.
### 새 RED/GREEN과 실패 기록
모든 새 기록은 `evidence-v0.2.3/privacy-screening/`에 있다. 이전 로그를 덮어쓰지 않았다.
| 계약/실행 | RED/실패 | GREEN/현재 결과 |
| --- | --- | --- |
| 계획 provenance·manifest·notice·build 변조 | [01 RED](evidence-v0.2.3/privacy-screening/01-provenance-RED.log): 4 실패 | [11 GREEN](evidence-v0.2.3/privacy-screening/11-provenance-GREEN.log): 관련 24 통과 |
| plan 직접 사용·immutability·범위 검사 | [02 RED](evidence-v0.2.3/privacy-screening/02-generator-RED.log) | [02 GREEN](evidence-v0.2.3/privacy-screening/02-generator-GREEN.log): 17 통과 |
| served manifest·notice·plan 일치 | [03 browser RED](evidence-v0.2.3/privacy-screening/03-browser-RED.log): desktop/mobile 실패 | 아래 전체 Chrome 결과 |
| ASR/바이트 보존 evidence 계약 | [04 RED](evidence-v0.2.3/privacy-screening/04-screening-RED.log) | 보존 PASS; ASR-empty는 여전히 FAIL |
| 짧은 seek와 full decode fallback | [06 RED](evidence-v0.2.3/privacy-screening/06-seek-RED.log), [08 RED](evidence-v0.2.3/privacy-screening/08-sample-trim-RED.log) | [08 GREEN](evidence-v0.2.3/privacy-screening/08-sample-trim-GREEN.log) |
| 실제 변환의 짧은 PCM | [05 실패](evidence-v0.2.3/privacy-screening/05-regeneration.log), [07 실패](evidence-v0.2.3/privacy-screening/07-regeneration.log) | [09 성공](evidence-v0.2.3/privacy-screening/09-regeneration.log) |
| ASR exact results·zero-segment 조건 | [10 ungated 실패](evidence-v0.2.3/privacy-screening/10-final-asr.log), [13 criterion RED](evidence-v0.2.3/privacy-screening/13-screening-criterion-RED.log) | [16 VAD 결과](evidence-v0.2.3/privacy-screening/16-final-asr-vad-json.log): criterion FAIL |
`14-final-asr-vad.log`는 ASR을 완료했지만 VAD 기본 Infinity를 strict JSON으로 저장하다 실패한 중간 실행이다.
그 로그·초기 스크립트·빈 출력 artifact도 보존하고, tagged value 직렬화로 다시 실행한 16번 결과가 최종 JSON이다.
ASR가 실패한 사실과 JSON 기록 문제를 분리한다.
### 최종 검증과 보존
| 검사 | 실제 결과 | 근거 |
| --- | --- | --- |
| lint | PASS | [18-final-lint](evidence-v0.2.3/privacy-screening/18-final-lint.log) |
| 모든 unit tests | **123 PASS / 1 FAIL**, skip 0; 유일한 실패는 ASR-empty acceptance | [17-unit](evidence-v0.2.3/privacy-screening/17-unit.log) |
| 모든 Python tests | **36 PASS**, skip 0 | [12-python](evidence-v0.2.3/privacy-screening/12-python.log) |
| build | PASS, 101 voice + 8 ambience 및 notices | [12-build](evidence-v0.2.3/privacy-screening/12-build.log) |
| npm audit | **취약점 0**, exit 0 | [audit JSON](evidence-v0.2.3/privacy-screening/npm-audit.json) |
[보존 전수 검사](evidence-v0.2.3/privacy-screening/preservation.json): **101 voice + 다섯 ambience WAV 바이트 동일**,
변경 WAV는 mall/market/cafe뿐이다. 시작 당시 399 `.agent` 파일 중 요청으로 갱신한 plan/RESULT를 제외한
**397개는 SHA-256 동일**하다. HEAD에 추적된 과거 `.agent` 180개도 Git blob hash가 같다.
계획/manifest/notice/RESULT의 변경 전 사본과 모든 새 실패/성공 로그를 별도로 보존했다.
최종 sandboxed system Chrome **30 PASS / 0 FAIL / 0 SKIP / 0 FLAKY**, 4.0분:
[실행 로그](evidence-v0.2.3/privacy-screening/15-browser.log),
[JSON 결과](evidence-v0.2.3/privacy-screening/browser-results.json).
Chrome 146.0.7680.80, desktop 1280×1000 / mobile 360×800 touch emulation에서
최종 served manifest/notice의 승인 구간을 대조하고 109개 WAV response hash·실제 decode·RMS·peak를 확인했다.
[desktop 무결성](evidence-v0.2.3/privacy-screening/desktop-audio-integrity.json),
[mobile 무결성](evidence-v0.2.3/privacy-screening/mobile-audio-integrity.json).
SHA-256/bytes는 정확히 일치하며 Chrome float decode와 PCM/32768 실측 RMS·peak의 차이는
[독립 대조](evidence-v0.2.3/privacy-screening/browser-integrity-summary.json)에서 PCM16 한 step 이내다.
두 기기의 정상 요청에서 외부 요청/console/page 오류/failed request는 모두 0이다.
실제 8 ambience loop·재시도·UI·axe 검증과 PNG는 새 `browser-final/` 아래 보존했다.
이 suite runner의 Chrome 자손 process 21개에서 `--no-sandbox` token이 없음을
[process 근거](evidence-v0.2.3/privacy-screening/chrome-sandbox.json)로 확인했다.
**인계:** 요청한 세 시작점은 구현했으나 market/cafe의 ASR-empty 요구가 미충족이므로 최종 인수 완료가 아니다.
정확한 이전 ASR 설정/명령을 확보해 방법 차이를 확인하고 최종 WAV를 검토해야 한다.
기본 threshold와 반환 결과를 조작하지 않았다. 사람의 청취 인수·법적/privacy clearance는 수행하지 않았고,
원격 전송·Git commit/push/merge/tag/deploy도 하지 않았다. 역사 evidence와 보호 WAV는 그대로다.
@@ -0,0 +1,180 @@
{
"version": "0.2.3",
"policy": {
"runtime": "All ambience files are bundled same-origin static assets; no runtime requests to source sites.",
"conversion": "Select a representative segment, remove unsuitable intelligible/incidental content where practical, trim, fade for loop safety, downmix, resample and normalize to 24000 Hz mono PCM16 WAV.",
"rights": "CC0/public-domain assets retain suggested credits; CC BY and CC BY-SA derivatives retain exact attribution, modification notice and license. The proprietary project does not claim exclusive rights over third-party recordings.",
"verified": "All eight approved direct-media files were verified on 2026-10-14 by SHA-256, byte count, ffprobe and full FFmpeg decode. The expected hashes/bytes are immutable release inputs, never learned or updated by the converter.",
"durationFields": "directMediaDurationSeconds is ffprobe format.duration of the exact directUrl bytes (including Freesound preview MP3s), not a rounded primary-page recording duration. Output duration and conversion.durationSeconds describe the 12-second WAV excerpt.",
"segmentSelection": "selectedSegmentStartSeconds is immutable per-asset release provenance: the start in exact direct-media seconds of the 12-second derivative. The generator reads it without a separate start map, inference or mutation and rejects segments outside directMediaDurationSeconds before conversion.",
"privacyScreening": "The mall 36–48s, market 60–72s and cafe 180–192s selections follow Neo's tiny multilingual ASR candidate scan. ASR is only a screening signal, not a faithful transcript, human listening acceptance or legal/privacy clearance. Exact final-WAV screening is recorded in .agent/evidence-v0.2.3/privacy-screening/final-asr.json."
},
"assets": [
{
"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
},
{
"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
},
{
"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
},
{
"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
},
{
"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": 60
},
{
"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
},
{
"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": 180
},
{
"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
}
],
"releaseRisks": [
"Audition chosen excerpts to avoid music and unnecessarily intelligible bystander speech.",
"The market derivative must stay CC BY-SA 4.0 with source, creator, change notice and license link.",
"The subway derivative needs CC BY 4.0 attribution and change notice.",
"Freesound direct URLs are preview MP3 files; preserve local source hashes and page/license evidence."
]
}
@@ -0,0 +1,4 @@
{
"status": "passed",
"failedTests": []
}
@@ -0,0 +1,28 @@
[
{
"project": "desktop",
"chrome": "146.0.7680.80",
"filesMatched": 109,
"externalRequests": 0,
"consoleOrPageErrors": 0,
"failedRequests": 0,
"evidence": "desktop-audio-integrity.json",
"levelTolerance": 3.0517578125e-05,
"maximumRmsDifference": 1.6421807213090611e-06,
"maximumPeakDifference": 2.5928020477294922e-05,
"levelToleranceReason": "One PCM16 step allows browser float decode scaling; SHA-256 and bytes must match exactly."
},
{
"project": "mobile",
"chrome": "146.0.7680.80",
"filesMatched": 109,
"externalRequests": 0,
"consoleOrPageErrors": 0,
"failedRequests": 0,
"evidence": "mobile-audio-integrity.json",
"levelTolerance": 3.0517578125e-05,
"maximumRmsDifference": 1.6421807213090611e-06,
"maximumPeakDifference": 2.5928020477294922e-05,
"levelToleranceReason": "One PCM16 step allows browser float decode scaling; SHA-256 and bytes must match exactly."
}
]
@@ -0,0 +1,75 @@
{
"startedAtUtc": "2026-10-14T09:36:42.758794+00:00",
"completedAtUtc": "2026-10-14T09:40:45.154764+00:00",
"runnerPid": 1521509,
"command": [
"npx",
"playwright",
"test",
"--reporter=line,json",
"--output",
"/home/hermes/worktrees/find-word-v0.2.3/.agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/browser-final"
],
"chrome": "Google Chrome 146.0.7680.80",
"method": "Actual Chrome descendants of this suite runner; Playwright chromiumSandbox=true and opt-out unset.",
"noSandboxFlagPresent": false,
"exitCode": 0,
"processes": [
{
"pid": 1521728,
"ppid": 1521680,
"arguments": [
"/opt/google/chrome/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-edgeupdater --disable-extensions --disable-features=AvoidUnnecessaryBeforeUnloadCheckSync,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,PaintHolding,ThirdPartyStoragePartitioning,BlockOriginHeaderModificationOnRedirect,Translate,AutoDeElevate,OptimizationHints,NetworkTimeServiceQuerying,AimEnabled,msForceBrowserSignIn,msEdgeUpdateLaunchServicesPreferredVersion --enable-features=CDPScreenshotNewSurface --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-updater-scheduler --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --edge-skip-compat-layer-relaunch --disable-infobars --disable-search-engine-choice-screen --disable-sync --enable-unsafe-swiftshader --headless --hide-scrollbars --mute-audio --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --user-data-dir=/tmp/playwright_chromiumdev_profile-6zpyQe --remote-debugging-pipe --no-startup-window --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl"
],
"commandLine": "'/opt/google/chrome/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-edgeupdater --disable-extensions --disable-features=AvoidUnnecessaryBeforeUnloadCheckSync,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,PaintHolding,ThirdPartyStoragePartitioning,BlockOriginHeaderModificationOnRedirect,Translate,AutoDeElevate,OptimizationHints,NetworkTimeServiceQuerying,AimEnabled,msForceBrowserSignIn,msEdgeUpdateLaunchServicesPreferredVersion --enable-features=CDPScreenshotNewSurface --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-updater-scheduler --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --edge-skip-compat-layer-relaunch --disable-infobars --disable-search-engine-choice-screen --disable-sync --enable-unsafe-swiftshader --headless --hide-scrollbars --mute-audio --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --user-data-dir=/tmp/playwright_chromiumdev_profile-6zpyQe --remote-debugging-pipe --no-startup-window --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl'",
"sandboxStatus": [
"NSpid:\t1521728",
"NoNewPrivs:\t0",
"Seccomp:\t0",
"Seccomp_filters:\t0"
]
},
{
"pid": 1521822,
"ppid": 1521686,
"arguments": [
"/opt/google/chrome/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-edgeupdater --disable-extensions --disable-features=AvoidUnnecessaryBeforeUnloadCheckSync,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,PaintHolding,ThirdPartyStoragePartitioning,BlockOriginHeaderModificationOnRedirect,Translate,AutoDeElevate,OptimizationHints,NetworkTimeServiceQuerying,AimEnabled,msForceBrowserSignIn,msEdgeUpdateLaunchServicesPreferredVersion --enable-features=CDPScreenshotNewSurface --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-updater-scheduler --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --edge-skip-compat-layer-relaunch --disable-infobars --disable-search-engine-choice-screen --disable-sync --enable-unsafe-swiftshader --headless --hide-scrollbars --mute-audio --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --user-data-dir=/tmp/playwright_chromiumdev_profile-d551qg --remote-debugging-pipe --no-startup-window --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl"
],
"commandLine": "'/opt/google/chrome/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-edgeupdater --disable-extensions --disable-features=AvoidUnnecessaryBeforeUnloadCheckSync,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,PaintHolding,ThirdPartyStoragePartitioning,BlockOriginHeaderModificationOnRedirect,Translate,AutoDeElevate,OptimizationHints,NetworkTimeServiceQuerying,AimEnabled,msForceBrowserSignIn,msEdgeUpdateLaunchServicesPreferredVersion --enable-features=CDPScreenshotNewSurface --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-updater-scheduler --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --edge-skip-compat-layer-relaunch --disable-infobars --disable-search-engine-choice-screen --disable-sync --enable-unsafe-swiftshader --headless --hide-scrollbars --mute-audio --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --user-data-dir=/tmp/playwright_chromiumdev_profile-d551qg --remote-debugging-pipe --no-startup-window --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl'",
"sandboxStatus": [
"NSpid:\t1521822",
"NoNewPrivs:\t0",
"Seccomp:\t0",
"Seccomp_filters:\t0"
]
},
{
"pid": 1523644,
"ppid": 1523631,
"arguments": [
"/opt/google/chrome/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-edgeupdater --disable-extensions --disable-features=AvoidUnnecessaryBeforeUnloadCheckSync,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,PaintHolding,ThirdPartyStoragePartitioning,BlockOriginHeaderModificationOnRedirect,Translate,AutoDeElevate,OptimizationHints,NetworkTimeServiceQuerying,AimEnabled,msForceBrowserSignIn,msEdgeUpdateLaunchServicesPreferredVersion --enable-features=CDPScreenshotNewSurface --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-updater-scheduler --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --edge-skip-compat-layer-relaunch --disable-infobars --disable-search-engine-choice-screen --disable-sync --enable-unsafe-swiftshader --headless --hide-scrollbars --mute-audio --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --user-data-dir=/tmp/playwright_chromiumdev_profile-uE2NXe --remote-debugging-pipe --no-startup-window --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl"
],
"commandLine": "'/opt/google/chrome/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-edgeupdater --disable-extensions --disable-features=AvoidUnnecessaryBeforeUnloadCheckSync,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,PaintHolding,ThirdPartyStoragePartitioning,BlockOriginHeaderModificationOnRedirect,Translate,AutoDeElevate,OptimizationHints,NetworkTimeServiceQuerying,AimEnabled,msForceBrowserSignIn,msEdgeUpdateLaunchServicesPreferredVersion --enable-features=CDPScreenshotNewSurface --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-updater-scheduler --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --edge-skip-compat-layer-relaunch --disable-infobars --disable-search-engine-choice-screen --disable-sync --enable-unsafe-swiftshader --headless --hide-scrollbars --mute-audio --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --user-data-dir=/tmp/playwright_chromiumdev_profile-uE2NXe --remote-debugging-pipe --no-startup-window --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl'",
"sandboxStatus": [
"NSpid:\t1523644",
"NoNewPrivs:\t0",
"Seccomp:\t0",
"Seccomp_filters:\t0"
]
},
{
"pid": 1523794,
"ppid": 1523782,
"arguments": [
"/opt/google/chrome/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-edgeupdater --disable-extensions --disable-features=AvoidUnnecessaryBeforeUnloadCheckSync,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,PaintHolding,ThirdPartyStoragePartitioning,BlockOriginHeaderModificationOnRedirect,Translate,AutoDeElevate,OptimizationHints,NetworkTimeServiceQuerying,AimEnabled,msForceBrowserSignIn,msEdgeUpdateLaunchServicesPreferredVersion --enable-features=CDPScreenshotNewSurface --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-updater-scheduler --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --edge-skip-compat-layer-relaunch --disable-infobars --disable-search-engine-choice-screen --disable-sync --enable-unsafe-swiftshader --headless --hide-scrollbars --mute-audio --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --user-data-dir=/tmp/playwright_chromiumdev_profile-UiW664 --remote-debugging-pipe --no-startup-window --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl"
],
"commandLine": "'/opt/google/chrome/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-edgeupdater --disable-extensions --disable-features=AvoidUnnecessaryBeforeUnloadCheckSync,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,PaintHolding,ThirdPartyStoragePartitioning,BlockOriginHeaderModificationOnRedirect,Translate,AutoDeElevate,OptimizationHints,NetworkTimeServiceQuerying,AimEnabled,msForceBrowserSignIn,msEdgeUpdateLaunchServicesPreferredVersion --enable-features=CDPScreenshotNewSurface --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-updater-scheduler --force-color-profile=srgb --metrics-recording-only --no-first-run --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --edge-skip-compat-layer-relaunch --disable-infobars --disable-search-engine-choice-screen --disable-sync --enable-unsafe-swiftshader --headless --hide-scrollbars --mute-audio --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --user-data-dir=/tmp/playwright_chromiumdev_profile-UiW664 --remote-debugging-pipe --no-startup-window --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl'",
"sandboxStatus": [
"NSpid:\t1523794",
"NoNewPrivs:\t0",
"Seccomp:\t0",
"Seccomp_filters:\t0"
]
}
]
}
@@ -0,0 +1,68 @@
"""Independently compare browser responses/decode measurements to the current manifests."""
import base64
import json
from pathlib import Path
import shutil
from urllib.parse import urlparse
ROOT = Path(__file__).resolve().parents[4]
EVIDENCE = Path(__file__).resolve().parent
OUTPUT = EVIDENCE / 'browser-final'
report = json.loads((EVIDENCE / 'browser-results.json').read_text())
assert report['stats']['expected'] == 30
assert all(report['stats'][key] == 0 for key in ('unexpected', 'flaky', 'skipped'))
assert report.get('errors', []) == []
expected = {}
for directory in ('audio', 'ambience'):
manifest = json.loads((ROOT / 'public' / directory / 'manifest.json').read_text())
for entry in manifest['files']:
expected[f'/{directory}/{entry["file"]}'] = entry
summary = []
(EVIDENCE / 'screenshots').mkdir(exist_ok=True)
runtime_attachments = {}
def visit(suites):
for suite in suites:
for spec in suite.get('specs', []):
for test in spec['tests']:
for result in test['results']:
for attachment in result.get('attachments', []):
if attachment['name'] == 'runtime-audit':
project = test['projectName']
assert project not in runtime_attachments
runtime_attachments[project] = base64.b64decode(attachment['body'], validate=True)
visit(suite.get('suites', []))
visit(report['suites'])
assert set(runtime_attachments) == {'desktop', 'mobile'}
for project in ('desktop', 'mobile'):
paths = list(OUTPUT.glob(f'*-{project}/browser-audio-integrity.json'))
assert len(paths) == 1
data = json.loads(paths[0].read_text())
assert len(data['files']) == 109
assert data['external'] == data['errors'] == data['failed'] == []
assert {urlparse(row['url']).path for row in data['files']} == set(expected)
max_rms_difference = max_peak_difference = 0
for row in data['files']:
entry = expected[urlparse(row['url']).path]
assert row['sha256'] == entry['sha256'] and row['bytes'] == entry['bytes']
assert row['duration'] == entry['duration'] and row['sampleRate'] == 24000 and row['channels'] == 1
rms_difference = abs(row['rms'] - entry['rms'])
peak_difference = abs(row['peak'] - entry['peak'])
assert max(rms_difference, peak_difference) <= 1 / 32768
max_rms_difference = max(max_rms_difference, rms_difference)
max_peak_difference = max(max_peak_difference, peak_difference)
name = f'{project}-audio-integrity.json'
shutil.copy2(paths[0], EVIDENCE / name)
summary.append({'project':project, 'chrome':data['chrome'], 'filesMatched':109,
'externalRequests':0, 'consoleOrPageErrors':0, 'failedRequests':0, 'evidence':name,
'levelTolerance':1 / 32768, 'maximumRmsDifference':max_rms_difference, 'maximumPeakDifference':max_peak_difference,
'levelToleranceReason':'One PCM16 step allows browser float decode scaling; SHA-256 and bytes must match exactly.'})
for source, target in [('home.png','start.png'), ('game.png','game.png'), ('results.png','normal-results.png'), ('early-exit.png','early-exit.png')]:
matches = list(OUTPUT.glob(f'*-{project}/{source}'))
assert len(matches) == 1, (project, source, matches)
shutil.copy2(matches[0], EVIDENCE / 'screenshots' / f'{project}-{target}')
raw = runtime_attachments[project]
audit = json.loads(raw)
assert audit['errors'] == audit['failed'] == audit['external'] == []
with (EVIDENCE / f'{project}-runtime-audit.json').open('xb') as out: out.write(raw)
with (EVIDENCE / 'browser-integrity-summary.json').open('x') as out: out.write(json.dumps(summary, indent=2) + '\n')
print(json.dumps({'browserStats':report['stats'], 'integrity':summary}, indent=2))
@@ -0,0 +1,54 @@
"""Independently compare browser responses/decode measurements to the current manifests."""
import json
from pathlib import Path
import shutil
from urllib.parse import urlparse
ROOT = Path(__file__).resolve().parents[4]
EVIDENCE = Path(__file__).resolve().parent
OUTPUT = EVIDENCE / 'browser-final'
report = json.loads((EVIDENCE / 'browser-results.json').read_text())
assert report['stats']['expected'] == 30
assert all(report['stats'][key] == 0 for key in ('unexpected', 'flaky', 'skipped'))
assert report.get('errors', []) == []
expected = {}
for directory in ('audio', 'ambience'):
manifest = json.loads((ROOT / 'public' / directory / 'manifest.json').read_text())
for entry in manifest['files']:
expected[f'/{directory}/{entry["file"]}'] = entry
summary = []
(EVIDENCE / 'screenshots').mkdir()
for project in ('desktop', 'mobile'):
paths = list(OUTPUT.glob(f'*-{project}/browser-audio-integrity.json'))
assert len(paths) == 1
data = json.loads(paths[0].read_text())
assert len(data['files']) == 109
assert data['external'] == data['errors'] == data['failed'] == []
assert {urlparse(row['url']).path for row in data['files']} == set(expected)
max_rms_difference = max_peak_difference = 0
for row in data['files']:
entry = expected[urlparse(row['url']).path]
assert row['sha256'] == entry['sha256'] and row['bytes'] == entry['bytes']
assert row['duration'] == entry['duration'] and row['sampleRate'] == 24000 and row['channels'] == 1
rms_difference = abs(row['rms'] - entry['rms'])
peak_difference = abs(row['peak'] - entry['peak'])
assert max(rms_difference, peak_difference) <= 1 / 32768
max_rms_difference = max(max_rms_difference, rms_difference)
max_peak_difference = max(max_peak_difference, peak_difference)
name = f'{project}-audio-integrity.json'
shutil.copy2(paths[0], EVIDENCE / name)
summary.append({'project':project, 'chrome':data['chrome'], 'filesMatched':109,
'externalRequests':0, 'consoleOrPageErrors':0, 'failedRequests':0, 'evidence':name,
'levelTolerance':1 / 32768, 'maximumRmsDifference':max_rms_difference, 'maximumPeakDifference':max_peak_difference,
'levelToleranceReason':'One PCM16 step allows browser float decode scaling; SHA-256 and bytes must match exactly.'})
for source, target in [('home.png','start.png'), ('game.png','game.png'), ('results.png','normal-results.png'), ('early-exit.png','early-exit.png')]:
matches = list(OUTPUT.glob(f'*-{project}/{source}'))
assert len(matches) == 1, (project, source, matches)
shutil.copy2(matches[0], EVIDENCE / 'screenshots' / f'{project}-{target}')
matches = list(OUTPUT.glob(f'*-{project}/attachments/runtime-audit-*.json'))
assert len(matches) == 1
audit = json.loads(matches[0].read_text())
assert audit['errors'] == audit['failed'] == audit['external'] == []
shutil.copy2(matches[0], EVIDENCE / f'{project}-runtime-audit.json')
with (EVIDENCE / 'browser-integrity-summary.json').open('x') as out: out.write(json.dumps(summary, indent=2) + '\n')
print(json.dumps({'browserStats':report['stats'], 'integrity':summary}, indent=2))
@@ -0,0 +1,70 @@
{
"errors": [],
"failed": [],
"external": [],
"audio": {
"starts": [
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 7.487981859410431
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 8.279977324263038
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.631995464852608
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 8.279977324263038
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 7.967981859410431
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.967981859410431
}
],
"stops": 15
}
}
@@ -0,0 +1,9 @@
{
"node": "v26.7.0",
"npm": "11.19.0",
"python": "Python 3.11.16",
"ffmpeg": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers",
"chrome": "Google Chrome 146.0.7680.80 ",
"head": "c92660b514f7af8eb556d3fa5c0fc80e4bdd4cf5",
"capturedAtUtc": "2026-10-14T09:39:34.284910+00:00"
}
@@ -0,0 +1,107 @@
"""Publish a current automation summary only after every required run succeeds."""
from datetime import datetime, timezone
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parents[4]
EVIDENCE = Path(__file__).resolve().parent
for name in ('lint', 'unit', 'python', 'build'):
assert 'Exit code: 0' in (EVIDENCE / f'05-{name}.log').read_text(), name
assert '125 passed (125)' in (EVIDENCE / '05-unit.log').read_text()
assert 'Ran 36 tests' in (EVIDENCE / '05-python.log').read_text()
audit = json.loads((EVIDENCE / 'npm-audit.json').read_text())
assert audit['metadata']['vulnerabilities']['total'] == 0
browser = json.loads((EVIDENCE / 'browser-results.json').read_text())
assert browser['stats']['expected'] == 30
assert all(browser['stats'][name] == 0 for name in ('unexpected', 'flaky', 'skipped'))
assert browser.get('errors', []) == []
sandbox = json.loads((EVIDENCE / 'chrome-sandbox.json').read_text())
assert sandbox['exitCode'] == 0 and sandbox['noSandboxFlagPresent'] is False and sandbox['processes']
integrity = json.loads((EVIDENCE / 'browser-integrity-summary.json').read_text())
assert len(integrity) == 2 and all(e['filesMatched'] == 109 for e in integrity)
screen = json.loads((EVIDENCE.parent / 'final-asr.json').read_text())
assert screen['requiredEmptyPassed'] is True
assert screen['limitations']['humanListeningAcceptance'] is False
assert screen['limitations']['legalPrivacyClearance'] is False
preservation = json.loads((EVIDENCE / 'preservation.json').read_text())
summary = {'completedAtUtc':datetime.now(timezone.utc).isoformat(),
'scope':'Requested automated release/screening checks only. Human listening acceptance and legal/privacy clearance were not performed.',
'implementationAndAtomicRegenerationComplete':True,
'allRequestedAutomatedAcceptanceChecksPassed':True,
'requiredEmptyPassed':True, 'humanListeningAcceptance':False, 'legalPrivacyClearance':False,
'blockingAutomatedCriterion':None,
'checks':{
'lint':{'exitCode':0,'log':'05-lint.log'},
'unit':{'exitCode':0,'files':13,'passed':125,'failed':0,'skipped':0,'log':'05-unit.log'},
'python':{'exitCode':0,'passed':36,'failed':0,'skipped':0,'log':'05-python.log'},
'build':{'exitCode':0,'voiceFiles':101,'ambienceFiles':8,'log':'05-build.log'},
'audit':{'exitCode':0,'vulnerabilities':0,'evidence':'npm-audit.json'},
'sandboxedChrome':{'exitCode':0,'passed':30,'failed':0,'skipped':0,'flaky':0,
'durationMs':browser['stats']['duration'],'projects':['desktop','mobile'],
'evidence':'browser-results.json','sandboxEvidence':'chrome-sandbox.json'}},
'asr':{'evidence':'../final-asr.json','sha256':preservation['finalAsrSha256'],
'method':'faster-whisper 1.2.1 tiny multilingual CPU int8; beam_size=5, best_of=5, default VAD, condition_on_previous_text=true',
'selectedRequiredStarts':{'mall':36,'market':24,'cafe':0},
'segmentsByEnvironment':{e['environmentId']:len(e['segments']) for e in screen['files']},
'requiredEmptyPassed':True,'screeningOnly':True,'humanListeningAcceptance':False,'legalPrivacyClearance':False,
'priorFailedAttempt':'../prior-attempt-market60-cafe180/final-asr.json',
'historicalNoVadEvidence':'../no-vad-asr.json',
'noVadLimitation':'Historical candidate text may be hallucinated, does not screen new market/cafe files and does not override the VAD gate. Neither method proves absence of speech/music.'},
'preservation':preservation,'head':preservation['head'], 'commitPushMergeTagDeployPerformed':False}
with (EVIDENCE / 'validation-summary.json').open('x') as out:out.write(json.dumps(summary,indent=2)+'\n')
current = EVIDENCE.parent / 'validation-summary.json'
assert current.read_bytes() == (EVIDENCE.parent / 'prior-attempt-market60-cafe180/validation-summary.json').read_bytes()
root_summary = dict(summary)
root_summary['evidenceBaseDirectory']='retry-market24-cafe0'
current.write_text(json.dumps(root_summary,indent=2)+'\n')
p = ROOT / '.agent/RESULT-v0.2.3.md'
s = p.read_text()
s = s.replace('이번 재시도의 전체 검증 결과는 맨 아래 **최종 privacy screening 재시도** 절에 기록한다.',
'전체 unit 125개·Python 36개·sandboxed Chrome 30개 및 lint/build가 통과했고 audit 취약점은 0개다.\n실행 원문은 맨 아래 **최종 privacy screening 재시도** 절에 있다.')
start = s.index('### 재시도 전체 검증')
base='evidence-v0.2.3/privacy-screening/retry-market24-cafe0'
s = s[:start]+f'''### 재시도 전체 검증
| 검사 | 실제 결과 | 근거 |
| --- | --- | --- |
| lint / typecheck | PASS, exit 0 | [05-lint]({base}/05-lint.log) |
| 전체 unit | 13 files / **125 passed, 0 failed, 0 skipped**, exit 0 | [05-unit]({base}/05-unit.log) |
| 전체 Python | **36 passed**, exit 0 | [05-python]({base}/05-python.log) |
| build | PASS, 101 voice + 8 ambience 및 notices, exit 0 | [05-build]({base}/05-build.log) |
| npm audit | **취약점 0**, exit 0 | [audit]({base}/npm-audit.json) |
| sandboxed Chrome desktop/mobile | **30 passed / 0 failed / 0 skipped / 0 flaky**, exit 0 | [06-browser]({base}/06-browser.log), [JSON]({base}/browser-results.json) |
현재 자동 검증은 모두 통과했다. [validation-summary]({base}/validation-summary.json)는 위 실행들의
실제 exit code·결과를 확인한 뒤 작성했으며 사람의 인수/법적 clearance를 포함한 전체 승인으로 해석하지 않는다.
현재 ASR gate 통과를 이전 실패의 통과로 바꾸어 기록하지 않았다.
Chrome 146.0.7680.80, desktop 1280×1000 / mobile 360×800 touch emulation의 전체 suite는
{browser['stats']['duration']/1000:.1f}초 걸렸다. 이 runner의 Chrome 자손 process {len(sandbox['processes'])}개에서
`--no-sandbox`가 없음을 [실제 process 기록]({base}/chrome-sandbox.json)으로 확인했다.
설정은 `chromiumSandbox=true`이고 opt-out 환경변수는 제거했다.
양쪽에서 현재 **109 WAV response SHA-256/bytes·실제 decode·길이·채널·sample rate**를 전수 확인했다.
[desktop 오디오]({base}/desktop-audio-integrity.json), [mobile 오디오]({base}/mobile-audio-integrity.json),
[독립 실측 대조]({base}/browser-integrity-summary.json): hash/bytes 정확히 일치,
RMS/peak 차이는 브라우저 float scaling을 고려한 PCM16 한 step 이내다.
정상 요청에서 외부 요청·console/page 오류·failed request는 모두 0이며,
실제 여덟 ambience loop, 오류 재시도, UI·키보드·axe, 320/360px 어절·진행률 픽셀 검사도 통과했다.
[desktop runtime]({base}/desktop-runtime-audit.json), [mobile runtime]({base}/mobile-runtime-audit.json).
| 현재 화면 | Desktop | Mobile |
| --- | --- | --- |
| 시작 | [PNG]({base}/screenshots/desktop-start.png) | [PNG]({base}/screenshots/mobile-start.png) |
| 게임 | [PNG]({base}/screenshots/desktop-game.png) | [PNG]({base}/screenshots/mobile-game.png) |
| 정상 결과 | [PNG]({base}/screenshots/desktop-normal-results.png) | [PNG]({base}/screenshots/mobile-normal-results.png) |
| 중도 종료 | [PNG]({base}/screenshots/desktop-early-exit.png) | [PNG]({base}/screenshots/mobile-early-exit.png) |
[보존 검사]({base}/preservation.json): 101 voice·다섯 unaffected ambience·mall 바이트 동일,
이전 `.agent` 파일 484개·읽기 전용 prior-attempt 사본 89개·HEAD 추적 역사 파일 180개 해시 동일.
갱신 허용된 plan/RESULT/current ASR/current summary 4개는 이전 상태를 별도 보존했다.
원본 provenance는 지정 market/cafe 시작점 외에 변경이 없고 dist는 현재 bundle과 바이트 동일하다.
**한계와 인계:** 지정된 자동 VAD acceptance를 충족했다. 사람의 청취 인수와 법적/privacy clearance는
여전히 수행하지 않았으며 empty ASR은 말소리/음악의 부재 증거가 아니다.
mobile은 Chrome viewport/touch emulation이다. Git commit/push/merge/tag/deploy는 하지 않았다.
'''
p.write_text(s)
print(json.dumps({'automatedChecksPassed':True,'unitPassed':125,'pythonPassed':36,'browserPassed':30,'requiredEmptyPassed':True,'humanListeningAcceptance':False,'legalPrivacyClearance':False},indent=2))
@@ -0,0 +1,70 @@
{
"errors": [],
"failed": [],
"external": [],
"audio": {
"starts": [
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 8.375986394557824
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 5.039977324263038
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 10.895986394557823
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 8.279977324263038
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 7.4399773242630385
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.4399773242630385
}
],
"stops": 15
}
}
@@ -0,0 +1,22 @@
{
"auditReportVersion": 2,
"vulnerabilities": {},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 0,
"high": 0,
"critical": 0,
"total": 0
},
"dependencies": {
"prod": 4,
"dev": 260,
"optional": 27,
"peer": 8,
"peerOptional": 0,
"total": 263
}
}
}
@@ -0,0 +1,35 @@
{
"completedAtUtc": "2026-10-14T09:37:31.286690+00:00",
"voiceWavsUnchanged": 101,
"unaffectedAmbienceWavsUnchanged": 5,
"mallWavUnchanged": true,
"allAmbienceWavsUnchangedInRetry": [
"public/ambience/department.wav",
"public/ambience/mall.wav",
"public/ambience/rain.wav",
"public/ambience/street.wav",
"public/ambience/subway.wav",
"public/ambience/theater.wav"
],
"changedWavs": [
{
"file": "public/ambience/cafe.wav",
"beforeSha256": "802a956e91b85a2fdd0e1f161d75bfada7a53499bcb57ba7f578411480ded216",
"afterSha256": "6853c121104940041c268a2891eadae032c17aa22b4c3b3ddfbc025262434995"
},
{
"file": "public/ambience/market.wav",
"beforeSha256": "7a7a980845a4aade2a7e8a108eae746220a4688e92792ee93d3deb76b2a762f6",
"afterSha256": "d6f73d86aea98b83e2995e61baaa7315a0ea7adeebc093769d76e1569b207658"
}
],
"priorAgentFilesUnchanged": 484,
"archivedPriorAttemptFilesUnchanged": 89,
"archiveFilesReadOnly": true,
"gitTrackedHistoricalAgentFilesUnchanged": 180,
"sourceProvenanceUnchangedExceptAuthorizedStarts": true,
"distMatchesCurrentAmbienceBundle": true,
"finalScreenMatchesCurrentFilesAndScript": true,
"finalAsrSha256": "82df338d83f7b6c8b6b04ecf43c7218b6787cc1b72d73d5c898197ec957a7070",
"head": "c92660b514f7af8eb556d3fa5c0fc80e4bdd4cf5"
}
@@ -0,0 +1,47 @@
"""Rebuild through the hardened generator; keep this run's source/output audit."""
import json
from datetime import datetime, timezone
from pathlib import Path
import subprocess
import sys
ROOT = Path(__file__).resolve().parents[4]
sys.path.insert(0, str(ROOT / 'scripts'))
import ambience_audio as audio
EVIDENCE = Path(__file__).resolve().parent
plan_path = ROOT / '.agent/AMBIENCE-SOURCES-v0.2.3.json'
plan_bytes = plan_path.read_bytes()
plan = json.loads(plan_bytes)
source_directory = Path('/tmp/findword-ambience-sources')
records = []
for asset in plan['assets']:
path = audio.source_path(source_directory, asset['environmentId'])
probe = json.loads(subprocess.check_output(['ffprobe', '-v', 'error', '-show_entries', 'format=duration', '-of', 'json', str(path)], text=True))
record = {'environmentId': asset['environmentId'], 'sha256': audio.digest(path), 'bytes': path.stat().st_size,
'directMediaDurationSeconds': float(probe['format']['duration']), 'selectedSegmentStartSeconds': asset['selectedSegmentStartSeconds']}
assert record['sha256'] == asset['expectedSourceSha256']
assert record['bytes'] == asset['sourceBytes']
assert record['directMediaDurationSeconds'] == asset['directMediaDurationSeconds']
records.append(record)
print('All eight source SHA-256, byte counts and direct-media durations match before conversion.', flush=True)
manifest = audio.generate(plan, source_directory, ROOT / 'public/ambience')
assert plan_path.read_bytes() == plan_bytes
assert plan == json.loads(plan_bytes)
audio.validate_bundle(ROOT / 'public/ambience', plan)
record = {'completedAtUtc': datetime.now(timezone.utc).isoformat(), 'method': 'ambience_audio.generate: source preflight, full staged bundle validation, atomic directory exchange',
'allSourcesMatchedBeforeConversion': True, 'planUnmodified': True, 'sources': records, 'manifestSha256': audio.digest(ROOT / 'public/ambience/manifest.json'),
'toolVersions': manifest['toolVersions'], 'outputs': [{k: e[k] for k in ('environmentId', 'selectedSegmentStartSeconds', 'sha256', 'bytes', 'duration', 'rms', 'peak', 'conversion')} for e in manifest['files']]}
with (EVIDENCE / 'regeneration.json').open('x') as stream:
stream.write(json.dumps(record, ensure_ascii=False, indent=2) + '\n')
baseline = json.loads((EVIDENCE / 'baseline.json').read_text())
changed = []
for name, before in baseline['wavSha256'].items():
after = audio.digest(ROOT / name)
if name in ('public/ambience/market.wav', 'public/ambience/cafe.wav'):
assert after != before
changed.append(name)
else:
assert after == before, name
print('Preserved 101 voice WAVs and six ambience WAVs including mall; changed only market and cafe.', flush=True)
print(json.dumps(record, ensure_ascii=False, indent=2))
@@ -0,0 +1,254 @@
{
"completedAtUtc": "2026-10-14T09:33:24.596833+00:00",
"method": "ambience_audio.generate: source preflight, full staged bundle validation, atomic directory exchange",
"allSourcesMatchedBeforeConversion": true,
"planUnmodified": true,
"sources": [
{
"environmentId": "street",
"sha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"bytes": 3414104,
"directMediaDurationSeconds": 264.254694,
"selectedSegmentStartSeconds": 35
},
{
"environmentId": "mall",
"sha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"bytes": 1666896,
"directMediaDurationSeconds": 60.05551,
"selectedSegmentStartSeconds": 36
},
{
"environmentId": "theater",
"sha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"bytes": 1485015,
"directMediaDurationSeconds": 176.901224,
"selectedSegmentStartSeconds": 45
},
{
"environmentId": "department",
"sha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"bytes": 2445024,
"directMediaDurationSeconds": 292.872,
"selectedSegmentStartSeconds": 90
},
{
"environmentId": "market",
"sha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"bytes": 622200,
"directMediaDurationSeconds": 76.696961,
"selectedSegmentStartSeconds": 24
},
{
"environmentId": "subway",
"sha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"bytes": 3343901,
"directMediaDurationSeconds": 425.024,
"selectedSegmentStartSeconds": 65
},
{
"environmentId": "cafe",
"sha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"bytes": 19947952,
"directMediaDurationSeconds": 1200.000998,
"selectedSegmentStartSeconds": 0
},
{
"environmentId": "rain",
"sha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"bytes": 91187572,
"directMediaDurationSeconds": 1800.0,
"selectedSegmentStartSeconds": 180
}
],
"manifestSha256": "2aeae8bb7a1f6e12543ba7e32a233b47b1ebcfdd65c7e55f67fc8f22f8d0f8c1",
"toolVersions": {
"ffmpeg": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers"
},
"outputs": [
{
"environmentId": "street",
"selectedSegmentStartSeconds": 35,
"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",
"selectedSegmentStartSeconds": 36,
"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",
"selectedSegmentStartSeconds": 45,
"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",
"selectedSegmentStartSeconds": 90,
"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",
"selectedSegmentStartSeconds": 24,
"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",
"selectedSegmentStartSeconds": 65,
"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",
"selectedSegmentStartSeconds": 0,
"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",
"selectedSegmentStartSeconds": 180,
"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"
}
}
]
}
@@ -0,0 +1,63 @@
"""Run the complete Chrome suite and preserve its own descendant sandbox evidence."""
from datetime import datetime, timezone
import json
import os
from pathlib import Path
import shlex
import subprocess
import sys
import time
ROOT = Path(__file__).resolve().parents[4]
EVIDENCE = Path(__file__).resolve().parent
def now(): return datetime.now(timezone.utc).isoformat()
def descendants(runner_pid):
processes = {}
for directory in Path('/proc').iterdir():
if not directory.name.isdigit(): continue
try:
stat = (directory / 'stat').read_text().rsplit(')', 1)[1].split()
arguments = (directory / 'cmdline').read_bytes().decode(errors='replace').rstrip('\0').split('\0')
status = (directory / 'status').read_text().splitlines()
processes[int(directory.name)] = {'pid': int(directory.name), 'ppid': int(stat[1]),
'arguments': arguments, 'commandLine': shlex.join(arguments),
'sandboxStatus': [line for line in status if line.startswith(('NoNewPrivs:', 'Seccomp:', 'Seccomp_filters:', 'NSpid:'))]}
except (OSError, ValueError): continue
family = {runner_pid}
while True:
children = {pid for pid, record in processes.items() if record['ppid'] in family}
if children <= family: break
family |= children
return [record for pid, record in processes.items() if pid in family and record['arguments']
and record['arguments'][0].startswith('/opt/google/chrome/')
and 'crashpad' not in record['arguments'][0]]
env = os.environ.copy()
env.pop('PLAYWRIGHT_NO_SANDBOX', None)
env['CHROME_PATH'] = '/usr/bin/google-chrome'
env['PLAYWRIGHT_JSON_OUTPUT_FILE'] = str(EVIDENCE / 'browser-results.json')
command = ['npx', 'playwright', 'test', '--reporter=line,json', '--output', str(EVIDENCE / 'browser-final')]
started = now()
observed = {}
with (EVIDENCE / '06-browser.log').open('x') as log:
log.write('$ ' + shlex.join(command) + '\nStarted UTC: ' + started + '\nCHROME_PATH=/usr/bin/google-chrome; PLAYWRIGHT_NO_SANDBOX unset; chromiumSandbox=true\n')
log.flush()
process = subprocess.Popen(command, cwd=ROOT, env=env, stdout=log, stderr=subprocess.STDOUT)
while process.poll() is None:
for record in descendants(process.pid):
observed[record['pid']] = record
time.sleep(2)
log.write('\nExit code: ' + str(process.returncode) + '\nFinished UTC: ' + now() + '\n')
assert observed, 'No suite Chrome processes observed'
assert all('--no-sandbox' not in row['arguments'] for row in observed.values())
report = {'startedAtUtc': started, 'completedAtUtc': now(), 'runnerPid': process.pid,
'command': command, 'chrome': subprocess.check_output(['/usr/bin/google-chrome', '--version'], text=True).strip(),
'method': 'Actual Chrome descendants of this suite runner; Playwright chromiumSandbox=true and opt-out unset.',
'noSandboxFlagPresent': False, 'exitCode': process.returncode,
'processes': list(observed.values())}
with (EVIDENCE / 'chrome-sandbox.json').open('x') as out: out.write(json.dumps(report, indent=2) + '\n')
print(json.dumps({'exitCode': process.returncode, 'observedChromeProcesses': len(observed), 'noSandboxFlagPresent': False}))
print('\n'.join((EVIDENCE / '06-browser.log').read_text().splitlines()[-16:]))
sys.exit(process.returncode)
@@ -0,0 +1,86 @@
"""Offline tiny-model heuristic screening of the exact final WAV bytes; never clearance."""
from dataclasses import asdict
from datetime import datetime, timezone
import hashlib
from importlib.metadata import version
import inspect
import json
import math
from pathlib import Path
import platform
import sys
import ctranslate2
from faster_whisper import WhisperModel
ROOT = Path(__file__).resolve().parents[4]
EVIDENCE = Path(__file__).resolve().parent.parent
REVISION = 'd90ca5fe260221311c53c58e660288d3deb8d356'
SNAPSHOT = Path.home() / '.cache/huggingface/hub/models--Systran--faster-whisper-tiny/snapshots' / REVISION
def json_safe(value):
# JSON has no infinity; retain its exact semantic value as an explicit tagged object.
if isinstance(value, float) and not math.isfinite(value):
return {'nonFiniteFloat': 'NaN' if math.isnan(value) else 'Infinity' if value > 0 else '-Infinity'}
if isinstance(value, dict): return {key: json_safe(item) for key, item in value.items()}
if isinstance(value, (list, tuple)): return [json_safe(item) for item in value]
return value
def sha(path):
with path.open('rb') as stream: return hashlib.file_digest(stream, 'sha256').hexdigest()
assert version('faster-whisper') == '1.2.1'
started = datetime.now(timezone.utc).isoformat()
manifest_path = ROOT / 'public/ambience/manifest.json'
manifest_hash = sha(manifest_path)
manifest = json.loads(manifest_path.read_text())
# Preserve all effective API defaults rather than relying on undocumented invocation settings.
parameters = {name: parameter.default for name, parameter in inspect.signature(WhisperModel.transcribe).parameters.items()
if name not in ('self', 'audio')}
parameters.update(language=None, task='transcribe', beam_size=5, best_of=5, vad_filter=True, vad_parameters=None, condition_on_previous_text=True)
prior_path = EVIDENCE / 'prior-attempt-market60-cafe180/final-asr.json'
prior = json.loads(prior_path.read_text())
assert prior['requiredEmptyPassed'] is False
assert json_safe(parameters) == prior['method']['parameters'], 'Decoder/VAD settings must remain identical'
ctranslate2.set_random_seed(0)
model = WhisperModel(str(SNAPSHOT), device='cpu', compute_type='int8', cpu_threads=4, num_workers=1, local_files_only=True)
assert model.model.is_multilingual
results = []
for entry in manifest['files']:
path = ROOT / 'public/ambience' / entry['file']
before = sha(path)
assert before == entry['sha256'] and path.stat().st_size == entry['bytes']
segments, info = model.transcribe(str(path), **parameters)
segments = [asdict(segment) for segment in segments] # Exhaust lazy inference; retain exact unedited results.
assert sha(path) == before
record = {'environmentId': entry['environmentId'], 'file': str(path.relative_to(ROOT)), 'sha256': before,
'bytes': path.stat().st_size, 'durationSeconds': entry['duration'],
'selectedSegmentStartSeconds': entry['selectedSegmentStartSeconds'], 'sourceSha256': entry['sourceSha256'],
'language': info.language, 'languageProbability': info.language_probability,
'segments': segments, 'text': ''.join(segment['text'] for segment in segments), 'info': asdict(info)}
results.append(record)
print(json.dumps({k: record[k] for k in ('environmentId','sha256','language','languageProbability','segments','text')}, ensure_ascii=False), flush=True)
assert sha(manifest_path) == manifest_hash
required = ['mall', 'market', 'cafe']
selected = {result['environmentId']: result for result in results if result['environmentId'] in required}
assert set(selected) == set(required)
assert {key: result['selectedSegmentStartSeconds'] for key, result in selected.items()} == {'mall': 36, 'market': 24, 'cafe': 0}
passed = all(result['segments'] == [] and result['text'] == '' for result in selected.values())
report = {'schemaVersion': 1, 'startedAtUtc': started, 'completedAtUtc': datetime.now(timezone.utc).isoformat(),
'tool': {'name': 'faster-whisper', 'version': version('faster-whisper'), 'python': platform.python_version(),
'dependencies': {name: version(name) for name in ('ctranslate2', 'av', 'numpy', 'tokenizers', 'huggingface-hub')}},
'model': {'name': 'tiny', 'multilingual': True, 'repository': 'Systran/faster-whisper-tiny', 'revision': REVISION,
'files': {path.name: sha(path) for path in sorted(SNAPSHOT.iterdir()) if path.is_file()}},
'method': {'input': 'Exact final 12-second public/ambience WAV files, hash verified before and after inference; built-in Silero VAD with package defaults, no text editing or manual filtering.',
'device': 'cpu', 'computeType': 'int8', 'cpuThreads': 4, 'numWorkers': 1, 'randomSeed': 0,
'nonFiniteNumberEncoding': 'Non-finite default options use {nonFiniteFloat: Infinity|-Infinity|NaN} tagged objects; no ASR segments or text are discarded.', 'offline': True, 'parameters': parameters, 'manifestSha256': manifest_hash,
'vadModelSha256': sha(Path(__import__('faster_whisper').__file__).parent / 'assets/silero_vad_v6.onnx'), 'scriptSha256': sha(Path(__file__)), 'command': '/tmp/findword-asr-venv/bin/python .agent/evidence-v0.2.3/privacy-screening/retry-market24-cafe0/screen-final.py'},
'limitations': {'screeningOnly': True, 'humanListeningAcceptance': False, 'legalPrivacyClearance': False,
'textIsVerifiedTranscript': False,
'explanation': 'Tiny-model ASR is only a screening signal. Empty segments do not prove absence of speech, music or private conversation. Candidate text and language guesses may be hallucinated and are not faithful transcripts. This is NOT human listening acceptance or legal/privacy clearance.'},
'priorFailedAttempt': {'file': 'prior-attempt-market60-cafe180/final-asr.json', 'sha256': sha(prior_path), 'requiredEmptyPassed': False},
'supplementaryNoVadRun': {'file': 'no-vad-asr.json', 'sha256': sha(EVIDENCE / 'no-vad-asr.json'), 'requiredEmptyPassed': False, 'explanation': 'Historical no-VAD run on mall 36s, market 60s and cafe 180s emitted candidate text that may be hallucinated. It is retained unchanged, is not a screen of the replacement market/cafe WAVs, and does not override the specified VAD gate. Neither empty VAD results nor no-VAD text proves absence or presence of speech/music or provides human listening acceptance or legal/privacy clearance.'}, 'requiredEmptyEnvironmentIds': required, 'requiredEmptyPassed': passed, 'files': results}
serialized = json.dumps(json_safe(report), ensure_ascii=False, indent=2, allow_nan=False) + '\n'
with (EVIDENCE / 'final-asr.json').open('x') as stream:
stream.write(serialized)
if not passed: sys.exit('Required changed excerpts produced ASR segments; screening criterion failed.')
print('All three changed excerpts have zero emitted segments. Screening signal only; no listening acceptance or legal/privacy clearance.', flush=True)
Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

@@ -0,0 +1,29 @@
{
"source": "User-provided Neo rescan findings; no new raw rescan file was supplied. Final WAV inference is independently rerun and recorded.",
"converter": "scripts/ambience_audio.convert",
"model": "faster-whisper 1.2.1 tiny multilingual CPU int8",
"parameters": {
"beam_size": 5,
"best_of": 5,
"vad_filter": true,
"vad_parameters": null,
"condition_on_previous_text": true
},
"reportedCandidates": [
{
"environmentId": "market",
"startSeconds": 24,
"endSeconds": 36,
"duration_after_vad": 0.0
},
{
"environmentId": "cafe",
"startSeconds": 0,
"endSeconds": 12,
"duration_after_vad": 0.0
}
],
"unchangedMallStartSeconds": 36,
"humanListeningAcceptance": false,
"legalPrivacyClearance": false
}
@@ -0,0 +1,120 @@
{
"completedAtUtc": "2026-10-14T09:41:28.406402+00:00",
"scope": "Requested automated release/screening checks only. Human listening acceptance and legal/privacy clearance were not performed.",
"implementationAndAtomicRegenerationComplete": true,
"allRequestedAutomatedAcceptanceChecksPassed": true,
"requiredEmptyPassed": true,
"humanListeningAcceptance": false,
"legalPrivacyClearance": false,
"blockingAutomatedCriterion": null,
"checks": {
"lint": {
"exitCode": 0,
"log": "05-lint.log"
},
"unit": {
"exitCode": 0,
"files": 13,
"passed": 125,
"failed": 0,
"skipped": 0,
"log": "05-unit.log"
},
"python": {
"exitCode": 0,
"passed": 36,
"failed": 0,
"skipped": 0,
"log": "05-python.log"
},
"build": {
"exitCode": 0,
"voiceFiles": 101,
"ambienceFiles": 8,
"log": "05-build.log"
},
"audit": {
"exitCode": 0,
"vulnerabilities": 0,
"evidence": "npm-audit.json"
},
"sandboxedChrome": {
"exitCode": 0,
"passed": 30,
"failed": 0,
"skipped": 0,
"flaky": 0,
"durationMs": 240675.669,
"projects": [
"desktop",
"mobile"
],
"evidence": "browser-results.json",
"sandboxEvidence": "chrome-sandbox.json"
}
},
"asr": {
"evidence": "../final-asr.json",
"sha256": "82df338d83f7b6c8b6b04ecf43c7218b6787cc1b72d73d5c898197ec957a7070",
"method": "faster-whisper 1.2.1 tiny multilingual CPU int8; beam_size=5, best_of=5, default VAD, condition_on_previous_text=true",
"selectedRequiredStarts": {
"mall": 36,
"market": 24,
"cafe": 0
},
"segmentsByEnvironment": {
"street": 0,
"mall": 0,
"theater": 0,
"department": 0,
"market": 0,
"subway": 0,
"cafe": 0,
"rain": 0
},
"requiredEmptyPassed": true,
"screeningOnly": true,
"humanListeningAcceptance": false,
"legalPrivacyClearance": false,
"priorFailedAttempt": "../prior-attempt-market60-cafe180/final-asr.json",
"historicalNoVadEvidence": "../no-vad-asr.json",
"noVadLimitation": "Historical candidate text may be hallucinated, does not screen new market/cafe files and does not override the VAD gate. Neither method proves absence of speech/music."
},
"preservation": {
"completedAtUtc": "2026-10-14T09:37:31.286690+00:00",
"voiceWavsUnchanged": 101,
"unaffectedAmbienceWavsUnchanged": 5,
"mallWavUnchanged": true,
"allAmbienceWavsUnchangedInRetry": [
"public/ambience/department.wav",
"public/ambience/mall.wav",
"public/ambience/rain.wav",
"public/ambience/street.wav",
"public/ambience/subway.wav",
"public/ambience/theater.wav"
],
"changedWavs": [
{
"file": "public/ambience/cafe.wav",
"beforeSha256": "802a956e91b85a2fdd0e1f161d75bfada7a53499bcb57ba7f578411480ded216",
"afterSha256": "6853c121104940041c268a2891eadae032c17aa22b4c3b3ddfbc025262434995"
},
{
"file": "public/ambience/market.wav",
"beforeSha256": "7a7a980845a4aade2a7e8a108eae746220a4688e92792ee93d3deb76b2a762f6",
"afterSha256": "d6f73d86aea98b83e2995e61baaa7315a0ea7adeebc093769d76e1569b207658"
}
],
"priorAgentFilesUnchanged": 484,
"archivedPriorAttemptFilesUnchanged": 89,
"archiveFilesReadOnly": true,
"gitTrackedHistoricalAgentFilesUnchanged": 180,
"sourceProvenanceUnchangedExceptAuthorizedStarts": true,
"distMatchesCurrentAmbienceBundle": true,
"finalScreenMatchesCurrentFilesAndScript": true,
"finalAsrSha256": "82df338d83f7b6c8b6b04ecf43c7218b6787cc1b72d73d5c898197ec957a7070",
"head": "c92660b514f7af8eb556d3fa5c0fc80e4bdd4cf5"
},
"head": "c92660b514f7af8eb556d3fa5c0fc80e4bdd4cf5",
"commitPushMergeTagDeployPerformed": false
}
@@ -0,0 +1,161 @@
{
".agent/AMBIENCE-SOURCES-v0.2.3.json": "3529c8534be204208ac504a0f4c1a69b312131f9bbff92aa9a3135d61d24db65",
".agent/RESULT-v0.2.3.md": "dc50f09f1e8a2cabfcdd4c7249b1c7274686a72adbfdf4a06e0cb799c518cdef",
"CHANGELOG.md": "22ed457c02a4da2ecef757646813afdc9151b6405860c0ec7ba18ba3fa84ebf2",
"README.md": "eca51fbb0061f8d3f391eeaf9840d977356d2e22ed52b67abf3dc58287859848",
"docs/ARCHITECTURE.md": "b3064b90e85ab8acca2b94ab1a692c2dc90cd45f32eff5c35b25d98cd9303357",
"docs/AUDIO_PROVENANCE.md": "34f9aac413aeae7223b6212034e6adb3a5be13e53bc5b7e84004183f42d6dc9f",
"docs/DEPLOYMENT.md": "cd74fc986a819ea02cc962cc84e18abb292395dc51c802a030a5d6f497aca9b3",
"docs/WORDS.md": "f415558b2fcb9b4b6a69f30d5ce36a69f4d3cfef486a5fe29cafad3b3908162a",
"package-lock.json": "ed6a8708221076b3bfe9128c911e500ed0c6367eb1f34c9b89479f0e828410cb",
"package.json": "48faf460c99bf186d4b583bfc94ca6cfdd6893d14685220fcdd0e6e7ef59a788",
"playwright.config.ts": "e175b4905ff5b3e33fb62766617e469aaca3a3bc8065637c528d5490dc6a6d34",
"public/THIRD_PARTY_NOTICES.md": "d39cf239c24ea5b83cc2ee2496fb880914624c68d74757b4d08e06bfa92b5f7e",
"public/ambience/AMBIENCE_NOTICES.md": "dc3b61da7d2829e9025573cde5d23a8b3d9b44da6154a620463adfc1f5455040",
"public/ambience/cafe.wav": "6853c121104940041c268a2891eadae032c17aa22b4c3b3ddfbc025262434995",
"public/ambience/department.wav": "aa43f3d1d3e7c2b1f8ace24ecbda45d0ea3a031db941c39506dc6c1665b8efa7",
"public/ambience/mall.wav": "680a769940c08f0d12c6c954c08366598dd8b5745e276f39c82b10d1a88261a1",
"public/ambience/manifest.json": "2aeae8bb7a1f6e12543ba7e32a233b47b1ebcfdd65c7e55f67fc8f22f8d0f8c1",
"public/ambience/market.wav": "d6f73d86aea98b83e2995e61baaa7315a0ea7adeebc093769d76e1569b207658",
"public/ambience/rain.wav": "f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9",
"public/ambience/street.wav": "a8bffa201b174618955bc51b860167169125304811aabe2086b0bb35b06c3ae1",
"public/ambience/subway.wav": "9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f",
"public/ambience/theater.wav": "2d6a444fb7874cdf6b2d8a741a69175299b112eb66834912c025437d8277d635",
"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/manifest.json": "ad2a24d75da19888b724cfb025025f9aa78a49883c610be93082b83edf8f471a",
"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",
"scripts/ambience_audio.py": "bcf3d633056add68b3c894f360584a54f9830d898ae79d2d4ba7db222b1302f3",
"scripts/check-build.mjs": "3b3588392c8c6ec893eb82e9b4a9cf61e9a55d7f85a626ac7040f80dbcc4daf8",
"scripts/generate_audio.py": "7f4a74c1baab3ec2f02ea6c298d19c266bc4bb98123a7fe11659a3afdbc1e2b9",
"scripts/neural_audio.py": "a8b2fa8d4296fd5ccebc09cf4d01d5552a6eba3631e7d8f2214de34790f0501b",
"src/App.tsx": "d05fbcf62b6a6ef3d923e858ccee6234bacc9733f24beee025fc493bf6430587",
"src/audio/assets.ts": "d67cbf8b8a824078187bd5c1bb9a5c70867b77127b8744b4799087fdac176d73",
"src/audio/dsp.ts": "f02f6ebf20b9fe3ca21763fa0c2a00969338750758e93c4468db860a28bfec94",
"src/audio/engine.ts": "80670c8c970b1191889449676b50d8f003d0394d7c520d8677cf00e48d618359",
"src/content.ts": "d5c526bbc95fa27cf74263c83930ac19a39564b7770b0efea29625b4ac30a14c",
"src/game.ts": "9d738fd0935ff899c4da717b5b0dc2b87db3bc7e5f36e96a3c990ba463ea33a0",
"src/main.tsx": "eeab7184c76db4d03f45af69697f19affaaf318de056e36c8782000807d5e88e",
"src/styles.css": "bd1eb826fc167c31580174153d1d8658cfc1c1a9285b236d05aa414a145b535a",
"tests/App.test.tsx": "06ae088c98b6b85d7b7cafdbe80c7d70c437044e47905c21428073928b05d4ce",
"tests/ambience.test.ts": "aa95bc6b2bf20d18460fa7bb25e323f8239e263d0499ebf370017de330d0e25d",
"tests/assets.test.ts": "c99bdfd30209312d8780d3410df4016862342d04d33e54fb6b338d05f4503817",
"tests/audio-requests.test.ts": "07df9eb0df743b020637610660b806de31cbb557a66ccbc65c004e2b9a0998f5",
"tests/audio.test.ts": "5015c95875e737e29d5451ed5683ca7ab37a0669cb087182801015331094c4c2",
"tests/browser/audio-requests.ts": "3dff162cbc5a9b735fb8f911ed83ca04d646ba011511c4f922faf712f8094295",
"tests/browser/audio.spec.ts": "b23d8977ad08391849d8ea2d444796ab5f181ee4f53102f8ce4be9b5b3dd8a2a",
"tests/browser/game.spec.ts": "173fad16b0b2ae1afb04e75b424ccc1fe0677e0ff48a6d4562e8b5dcaf3bdea6",
"tests/browser/release.spec.ts": "53a925dfb0effa689bfd32dab179fcd7f4d037e66d7f85b63740f9e4f1f8b8c6",
"tests/browser/review-fixes.spec.ts": "683daaca67f6186b066a0d27f1e7d8bab99a290b93a70679e9baf1c567c1efae",
"tests/browser/rounds.spec.ts": "5ee8bbedc090c6ce31b9c484631c7ad70f0bc01fe1774ff7a1c3afa8a27cfdee",
"tests/browser/ui.spec.ts": "f544fb3c08e04342c7c2a89d445527c924cd9ea3f6571403700a7ebda674bb64",
"tests/build.test.ts": "7dfc48795f4d18c51f1e84256ed0d7bc89c1ce8ef4e0e8d05ba5a28ca2292818",
"tests/content.test.ts": "3e24eb95e6948a60569d9f428cad224b6fb891388356ba4e54b42a9b6f997a95",
"tests/dsp.test.ts": "52e8685d46045e435052b85c050e2247e23845dfd69b68f1d2c0f25042c2d8af",
"tests/game.test.ts": "5080a0d30fd6530d81536c98aef63652ce8b44e3e6291a7e29323a7ab4aa9f85",
"tests/generator.test.ts": "4832bba7f055b8df52663a860a99e47def86d19ebc8a0ee941ff676e7e3fc1cb",
"tests/neural-release.test.ts": "d0799e51f37c4f97466a954fc5a64331c34c6b359564423ba171585e307675e7",
"tests/playwright-config.test.ts": "896fdec70784b581df9518c7c6fb954000f0df1a4e320308a5db9d8e8aab1ef8",
"tests/python/test_ambience_audio.py": "8c31abdb43752a8b7108dcff30709268a84599bcad4c975d3923893fd930fa2f",
"tests/python/test_neural_audio.py": "969dcd5af9feb658ec5023f9e960e524ece9eaae50f1f3f304558414919b8d1f",
"tests/release.test.ts": "d0eca1d495905517a401f460a7bd487f3e6968b6562096afcd19ef31ca7c4a34",
"tests/setup.ts": "5e018534ee646b800286bcf4a94e5f33a0b8d0759f96fcccf5436f07b2e2a80c"
}
@@ -0,0 +1,74 @@
"""Check saved baselines against current files without rewriting historical evidence."""
from datetime import datetime, timezone
import hashlib
import json
from pathlib import Path
import subprocess
ROOT = Path(__file__).resolve().parents[4]
EVIDENCE = Path(__file__).resolve().parent
def sha(path):
with path.open('rb') as stream: return hashlib.file_digest(stream, 'sha256').hexdigest()
baseline = json.loads((EVIDENCE / 'baseline.json').read_text())
changed, voices, ambience = [], [], []
for name, before in baseline['wavSha256'].items():
after = sha(ROOT / name)
if after != before:
assert name in ('public/ambience/market.wav', 'public/ambience/cafe.wav'), name
changed.append({'file': name, 'beforeSha256': before, 'afterSha256': after})
elif name.startswith('public/audio/'):
voices.append(name)
else:
ambience.append(name)
assert len(voices) == 101 and len(ambience) == 6 and len(changed) == 2
assert 'public/ambience/mall.wav' in ambience
for name, before in baseline['immutablePriorAttemptFiles'].items():
assert sha(ROOT / name) == before, name
assert (ROOT / name).stat().st_mode & 0o222 == 0, name
preserved = []
for name, before in baseline['priorAgentFiles'].items():
if name in baseline['mutableAgentFiles']: continue
assert sha(ROOT / name) == before, name
preserved.append(name)
older = json.loads((EVIDENCE.parent / 'baseline.json').read_text())
assert all(sha(ROOT / name) == before for name, before in older['priorAgentFiles'].items() if name not in older['mutableAgentFiles'])
assert all(sha(ROOT / name) == before for name, before in older['wavSha256'].items()
if name not in ('public/ambience/mall.wav', 'public/ambience/market.wav', 'public/ambience/cafe.wav'))
tracked = subprocess.check_output(['git', 'ls-files', '.agent'], cwd=ROOT, text=True).splitlines()
for name in tracked:
saved = subprocess.check_output(['git', 'rev-parse', 'HEAD:' + name], cwd=ROOT, text=True).strip()
actual = subprocess.check_output(['git', 'hash-object', name], cwd=ROOT, text=True).strip()
assert actual == saved, name
before_plan = json.loads((EVIDENCE / 'before-source-plan.json').read_text())
plan = json.loads((ROOT / '.agent/AMBIENCE-SOURCES-v0.2.3.json').read_text())
assert [a['environmentId'] for a in before_plan['assets']] == [a['environmentId'] for a in plan['assets']]
for before, after in zip(before_plan['assets'], plan['assets']):
expected = dict(before)
if before['environmentId'] in ('market', 'cafe'):
expected['selectedSegmentStartSeconds'] = {'market':24, 'cafe':0}[before['environmentId']]
assert after == expected, after['environmentId']
for name in ['manifest.json', 'AMBIENCE_NOTICES.md', *[p.name for p in (ROOT / 'public/ambience').glob('*.wav')]]:
assert (ROOT / 'public/ambience' / name).read_bytes() == (ROOT / 'dist/ambience' / name).read_bytes(), name
screen_path = EVIDENCE.parent / 'final-asr.json'
screen = json.loads(screen_path.read_text())
assert screen['requiredEmptyPassed'] is True
assert screen['limitations']['humanListeningAcceptance'] is False
assert screen['limitations']['legalPrivacyClearance'] is False
assert sha(ROOT / 'public/ambience/manifest.json') == screen['method']['manifestSha256']
assert sha(EVIDENCE / 'screen-final.py') == screen['method']['scriptSha256']
assert sha(EVIDENCE.parent / screen['priorFailedAttempt']['file']) == screen['priorFailedAttempt']['sha256']
assert sha(EVIDENCE.parent / screen['supplementaryNoVadRun']['file']) == screen['supplementaryNoVadRun']['sha256']
for entry in screen['files']:
assert sha(ROOT / entry['file']) == entry['sha256']
report = {'completedAtUtc': datetime.now(timezone.utc).isoformat(), 'voiceWavsUnchanged': len(voices),
'unaffectedAmbienceWavsUnchanged': 5, 'mallWavUnchanged': True, 'allAmbienceWavsUnchangedInRetry': ambience,
'changedWavs': changed, 'priorAgentFilesUnchanged': len(preserved),
'archivedPriorAttemptFilesUnchanged': len(baseline['immutablePriorAttemptFiles']),
'archiveFilesReadOnly': True, 'gitTrackedHistoricalAgentFilesUnchanged': len(tracked),
'sourceProvenanceUnchangedExceptAuthorizedStarts': True, 'distMatchesCurrentAmbienceBundle': True,
'finalScreenMatchesCurrentFilesAndScript': True, 'finalAsrSha256': sha(screen_path),
'head': subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=ROOT, text=True).strip()}
with (EVIDENCE / 'preservation.json').open('x') as out: out.write(json.dumps(report, indent=2) + '\n')
print(json.dumps(report, indent=2))