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,72 @@
$ npx vitest run tests/ambience.test.ts tests/build.test.ts
Started UTC: 2026-10-14T09:08:40.941366+00:00
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.3
❯ tests/ambience.test.ts (3 tests | 1 failed) 484ms
× 선택 구간은 승인 계획의 불변 provenance이며 manifest와 고지에 동일하게 남는다 12ms
❯ tests/build.test.ts (30 tests | 3 failed) 18875ms
× 현장음 manifest 사본을 함께 바꿔도 승인 selectedSegmentStartSeconds 계약 위반을 거부한다 449ms
× 현장음 manifest 사본을 함께 바꿔도 승인 startSeconds 계약 위반을 거부한다 436ms
× 현장음 manifest 사본을 함께 바꿔도 승인 durationSeconds 계약 위반을 거부한다 443ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/ambience.test.ts > 선택 구간은 승인 계획의 불변 provenance이며 manifest와 고지에 동일하게 남는다
AssertionError: expected { street: undefined, …(7) } to deeply equal { street: 35, mall: 36, …(6) }
- Expected
+ Received
{
- "cafe": 180,
- "department": 90,
- "mall": 36,
- "market": 60,
- "rain": 180,
- "street": 35,
- "subway": 65,
- "theater": 45,
+ "cafe": undefined,
+ "department": undefined,
+ "mall": undefined,
+ "market": undefined,
+ "rain": undefined,
+ "street": undefined,
+ "subway": undefined,
+ "theater": undefined,
}
❯ tests/ambience.test.ts:141:65
139| market: 60, subway: 65, cafe: 180, rain: 180 };
140| expect(Object.fromEntries(plan.assets.map((asset: { environmentId: s…
141| [asset.environmentId, asset.selectedSegmentStartSeconds]))).toEqua…
| ^
142| for (const asset of plan.assets) {
143| const start = asset.selectedSegmentStartSeconds;
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯
FAIL tests/build.test.ts > 현장음 manifest 사본을 함께 바꿔도 승인 selectedSegmentStartSeconds 계약 위반을 거부한다
FAIL tests/build.test.ts > 현장음 manifest 사본을 함께 바꿔도 승인 startSeconds 계약 위반을 거부한다
FAIL tests/build.test.ts > 현장음 manifest 사본을 함께 바꿔도 승인 durationSeconds 계약 위반을 거부한다
AssertionError: expected [Function verify] to throw an error
❯ tests/build.test.ts:316:22
314| JSON.stringify(manifest),
315| );
316| expect(verify).toThrow();
| ^
317| } finally {
318| rmSync(temporary, { recursive: true, force: true });
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯
Test Files 2 failed (2)
Tests 4 failed | 29 passed (33)
Start at 09:08:41
Duration 19.25s (tests 98%, setup 2%)
Exit code: 1
Finished UTC: 2026-10-14T09:09:00.972768+00:00
@@ -0,0 +1,29 @@
$ python3 -m unittest discover -s tests/python -p test_ambience_audio.py -v
Started UTC: 2026-10-14T09:10:26.182138+00:00
test_convert_format_fade_normalization_and_reproducibility (test_ambience_audio.AmbienceConversion.test_convert_format_fade_normalization_and_reproducibility)
스테레오 48kHz 입력을 실제로 내려 섞고 길이·양끝·안전 피크를 확인한다. ... 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
----------------------------------------------------------------------
Ran 17 tests in 6.237s
OK
Exit code: 0
Finished UTC: 2026-10-14T09:10:32.496266+00:00
@@ -0,0 +1,317 @@
$ python3 -m unittest discover -s tests/python -p test_ambience_audio.py -v
Started UTC: 2026-10-14T09:08:40.965664+00:00
test_convert_format_fade_normalization_and_reproducibility (test_ambience_audio.AmbienceConversion.test_convert_format_fade_normalization_and_reproducibility)
스테레오 48kHz 입력을 실제로 내려 섞고 길이·양끝·안전 피크를 확인한다. ... 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) ... FAIL
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) ...
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=None) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=-1) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=True) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value='36') ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=nan) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=inf) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=1788.001) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=None) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=0) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=True) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value='1800') ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=nan) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=inf) ... FAIL
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=191.999) ... FAIL
======================================================================
FAIL: 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)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 184, in test_plan_alone_controls_selection_and_is_preserved_in_manifest_and_notice
self.assertEqual(call.args[2], start)
AssertionError: 35 != 1.25
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=None)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=-1)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=True)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value='36')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=nan)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=inf)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='selectedSegmentStartSeconds', value=1788.001)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=None)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=0)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=True)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value='1800')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=nan)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=inf)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
======================================================================
FAIL: test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) (key='directMediaDurationSeconds', value=191.999)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 106, in test_invalid_segment_plan_fails_before_any_conversion_without_mutation
audio.generate(plan, self.sources, self.output, converter=self.converter)
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 205, in generate
info = converter(source_path(source_directory, environment), ready / name, SEGMENTS[environment])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1124, in __call__
return self._mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1128, in _mock_call
return self._execute_mock_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/unittest/mock.py", line 1183, in _execute_mock_call
raise effect
AssertionError: conversion must not begin
----------------------------------------------------------------------
Ran 17 tests in 7.982s
FAILED (failures=15)
Exit code: 1
Finished UTC: 2026-10-14T09:08:49.067756+00:00
@@ -0,0 +1,78 @@
$ env CHROME_PATH=/usr/bin/google-chrome PLAYWRIGHT_NO_SANDBOX=0 npx playwright test tests/browser/audio.spec.ts --reporter=line --output=.agent/evidence-v0.2.3/privacy-screening/browser-red
Started UTC: 2026-10-14T09:09:12.510065+00:00
[WebServer] (node:1044973) 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 2 tests using 2 workers
(node:1044995) 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:1044996) 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/2] [desktop] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
[2/2] [mobile] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
1) [desktop] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
Error: expect(received).toBe(expected) // Object.is equality
Expected: true
Received: false
35 | for (const asset of plan.assets) {
36 | const start = asset.selectedSegmentStartSeconds;
> 37 | expect(Number.isFinite(start)).toBe(true);
| ^
38 | expect(start).toBeGreaterThanOrEqual(0);
39 | expect(start + 12).toBeLessThanOrEqual(asset.directMediaDurationSeconds);
40 | const entry = published.manifest.files.find((e: { environmentId: string }) => e.environmentId === asset.environmentId);
at /home/hermes/worktrees/find-word-v0.2.3/tests/browser/audio.spec.ts:37:36
Error Context: .agent/evidence-v0.2.3/privacy-screening/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/error-context.md
attachment #2: trace (application/zip) ─────────────────────────────────────────────────────────
.agent/evidence-v0.2.3/privacy-screening/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/trace.zip
Usage:
npx playwright show-trace .agent/evidence-v0.2.3/privacy-screening/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-desktop/trace.zip
────────────────────────────────────────────────────────────────────────────────────────────────
2) [mobile] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
Error: expect(received).toBe(expected) // Object.is equality
Expected: true
Received: false
35 | for (const asset of plan.assets) {
36 | const start = asset.selectedSegmentStartSeconds;
> 37 | expect(Number.isFinite(start)).toBe(true);
| ^
38 | expect(start).toBeGreaterThanOrEqual(0);
39 | expect(start + 12).toBeLessThanOrEqual(asset.directMediaDurationSeconds);
40 | const entry = published.manifest.files.find((e: { environmentId: string }) => e.environmentId === asset.environmentId);
at /home/hermes/worktrees/find-word-v0.2.3/tests/browser/audio.spec.ts:37:36
Error Context: .agent/evidence-v0.2.3/privacy-screening/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/error-context.md
attachment #2: trace (application/zip) ─────────────────────────────────────────────────────────
.agent/evidence-v0.2.3/privacy-screening/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/trace.zip
Usage:
npx playwright show-trace .agent/evidence-v0.2.3/privacy-screening/browser-red/audio-음성·현장음-109개-versioned-WAV를-실제-Chrome에서-해시·디코드-검증한다-mobile/trace.zip
────────────────────────────────────────────────────────────────────────────────────────────────
2 failed
[desktop] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
[mobile] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
Exit code: 1
Finished UTC: 2026-10-14T09:09:15.754298+00:00
@@ -0,0 +1,44 @@
$ npx vitest run tests/ambience.test.ts -t '최종 ASR|101개 음성'
Started UTC: 2026-10-14T09:09:47.813802+00:00
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.3
❯ tests/ambience.test.ts (5 tests | 2 failed | 3 skipped) 103ms
× 최종 ASR 증거는 정확한 WAV와 연결되며 청취·법적 인수로 주장하지 않는다 6ms
× 101개 음성·다섯 현장음 및 이전 evidence 바이트를 보존한다 96ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 2 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/ambience.test.ts > 최종 ASR 증거는 정확한 WAV와 연결되며 청취·법적 인수로 주장하지 않는다
Error: ENOENT: no such file or directory, open '.agent/evidence-v0.2.3/privacy-screening/final-asr.json'
❯ tests/ambience.test.ts:158:32
156| it("최종 ASR 증거는 정확한 WAV와 연결되며 청취·법적 인수로 주장하지 않는다", () => {
157| const directory = ".agent/evidence-v0.2.3/privacy-screening";
158| const screening = JSON.parse(readFileSync(`${directory}/final-asr.js…
| ^
159| const manifest = JSON.parse(readFileSync("public/ambience/manifest.j…
160| expect(screening.tool).toMatchObject({ name: "faster-whisper", versi…
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯
FAIL tests/ambience.test.ts > 101개 음성·다섯 현장음 및 이전 evidence 바이트를 보존한다
AssertionError: expected '8db06f3f09bbd8409573ba4874c7ccdd1e7e8…' not to be '8db06f3f09bbd8409573ba4874c7ccdd1e7e8…' // Object.is equality
❯ tests/ambience.test.ts:192:26
190| const actual = createHash("sha256").update(readFileSync(path)).dig…
191| if (/public\/ambience\/(mall|market|cafe)\.wav$/.test(path)) {
192| expect(actual).not.toBe(before);
| ^
193| changedAmbience++;
194| } else {
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯
Test Files 1 failed (1)
Tests 2 failed | 3 skipped (5)
Start at 09:09:48
Duration 400ms (tests 39%, setup 39%, transform 17%, import 4%, worker 2%)
Exit code: 1
Finished UTC: 2026-10-14T09:09:48.821996+00:00
@@ -0,0 +1,16 @@
$ python3 .agent/evidence-v0.2.3/privacy-screening/regenerate.py
Started UTC: 2026-10-14T09:10:56.998337+00:00
All eight source SHA-256, byte counts and direct-media durations match before conversion.
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/.agent/evidence-v0.2.3/privacy-screening/regenerate.py", line 28, in <module>
manifest = audio.generate(plan, source_directory, ROOT / 'public/ambience')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 218, in generate
info = converter(source_path(source_directory, environment), ready / name, asset["selectedSegmentStartSeconds"])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 51, in convert
raise ValueError("원본 구간이 잘렸거나 PCM이 올바르지 않습니다.")
ValueError: 원본 구간이 잘렸거나 PCM이 올바르지 않습니다.
Exit code: 1
Finished UTC: 2026-10-14T09:10:59.192835+00:00
@@ -0,0 +1,11 @@
$ python3 -m unittest discover -s tests/python -p test_ambience_audio.py -k short_input_seek -v
Started UTC: 2026-10-14T09:12:50.105600+00:00
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
----------------------------------------------------------------------
Ran 1 test in 0.870s
OK
Exit code: 0
Finished UTC: 2026-10-14T09:12:51.044884+00:00
@@ -0,0 +1,22 @@
$ python3 -m unittest discover -s tests/python -p test_ambience_audio.py -k short_input_seek -v
Started UTC: 2026-10-14T09:12:09.721189+00:00
test_short_input_seek_retries_full_decode_without_padding_or_truncating (test_ambience_audio.AmbienceConversion.test_short_input_seek_retries_full_decode_without_padding_or_truncating) ... ERROR
======================================================================
ERROR: test_short_input_seek_retries_full_decode_without_padding_or_truncating (test_ambience_audio.AmbienceConversion.test_short_input_seek_retries_full_decode_without_padding_or_truncating)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 69, in test_short_input_seek_retries_full_decode_without_padding_or_truncating
actual = audio.convert(source, target, 1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 51, in convert
raise ValueError("원본 구간이 잘렸거나 PCM이 올바르지 않습니다.")
ValueError: 원본 구간이 잘렸거나 PCM이 올바르지 않습니다.
----------------------------------------------------------------------
Ran 1 test in 0.428s
FAILED (errors=1)
Exit code: 1
Finished UTC: 2026-10-14T09:12:10.217535+00:00
@@ -0,0 +1,22 @@
$ python3 -m unittest discover -s tests/python -p test_ambience_audio.py -k short_input_seek -v
Started UTC: 2026-10-14T09:12:26.719654+00:00
test_short_input_seek_retries_full_decode_without_padding_or_truncating (test_ambience_audio.AmbienceConversion.test_short_input_seek_retries_full_decode_without_padding_or_truncating) ... ERROR
======================================================================
ERROR: test_short_input_seek_retries_full_decode_without_padding_or_truncating (test_ambience_audio.AmbienceConversion.test_short_input_seek_retries_full_decode_without_padding_or_truncating)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 69, in test_short_input_seek_retries_full_decode_without_padding_or_truncating
actual = audio.convert(source, target, 1)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 51, in convert
raise ValueError("원본 구간이 잘렸거나 PCM이 올바르지 않습니다.")
ValueError: 원본 구간이 잘렸거나 PCM이 올바르지 않습니다.
----------------------------------------------------------------------
Ran 1 test in 0.452s
FAILED (errors=1)
Exit code: 1
Finished UTC: 2026-10-14T09:12:27.241604+00:00
@@ -0,0 +1,16 @@
$ python3 .agent/evidence-v0.2.3/privacy-screening/regenerate.py
Started UTC: 2026-10-14T09:13:03.668086+00:00
All eight source SHA-256, byte counts and direct-media durations match before conversion.
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/.agent/evidence-v0.2.3/privacy-screening/regenerate.py", line 28, in <module>
manifest = audio.generate(plan, source_directory, ROOT / 'public/ambience')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 227, in generate
info = converter(source_path(source_directory, environment), ready / name, asset["selectedSegmentStartSeconds"])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/worktrees/find-word-v0.2.3/scripts/ambience_audio.py", line 59, in convert
raise ValueError("원본 구간이 잘렸거나 PCM이 올바르지 않습니다.")
ValueError: 원본 구간이 잘렸거나 PCM이 올바르지 않습니다.
Exit code: 1
Finished UTC: 2026-10-14T09:13:06.976084+00:00
@@ -0,0 +1,11 @@
$ python3 -m unittest discover -s tests/python -p test_ambience_audio.py -k short_input_seek -v
Started UTC: 2026-10-14T09:16:00.065794+00:00
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
----------------------------------------------------------------------
Ran 1 test in 0.813s
OK
Exit code: 0
Finished UTC: 2026-10-14T09:16:00.949585+00:00
@@ -0,0 +1,22 @@
$ python3 -m unittest discover -s tests/python -p test_ambience_audio.py -k short_input_seek -v
Started UTC: 2026-10-14T09:15:41.642570+00:00
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) ... FAIL
======================================================================
FAIL: test_short_input_seek_retries_full_decode_without_padding_or_truncating (test_ambience_audio.AmbienceConversion.test_short_input_seek_retries_full_decode_without_padding_or_truncating)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/tests/python/test_ambience_audio.py", line 71, in test_short_input_seek_retries_full_decode_without_padding_or_truncating
self.assertEqual(actual["conversion"]["seekMethod"], "full decode then sample trim")
AssertionError: 'full decode then output seek' != 'full decode then sample trim'
- full decode then output seek
+ full decode then sample trim
----------------------------------------------------------------------
Ran 1 test in 0.697s
FAILED (failures=1)
Exit code: 1
Finished UTC: 2026-10-14T09:15:42.409368+00:00
@@ -0,0 +1,260 @@
$ python3 .agent/evidence-v0.2.3/privacy-screening/regenerate.py
Started UTC: 2026-10-14T09:16:15.875217+00:00
All eight source SHA-256, byte counts and direct-media durations match before conversion.
{
"completedAtUtc": "2026-10-14T09:16:20.220194+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": 60
},
{
"environmentId": "subway",
"sha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"bytes": 3343901,
"directMediaDurationSeconds": 425.024,
"selectedSegmentStartSeconds": 65
},
{
"environmentId": "cafe",
"sha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"bytes": 19947952,
"directMediaDurationSeconds": 1200.000998,
"selectedSegmentStartSeconds": 180
},
{
"environmentId": "rain",
"sha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"bytes": 91187572,
"directMediaDurationSeconds": 1800.0,
"selectedSegmentStartSeconds": 180
}
],
"manifestSha256": "4f21df1c046e545553319889218c29b3efe0da0d49d45d3e09a36fb7759a617c",
"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": 60,
"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",
"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": 180,
"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",
"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:16:20.228871+00:00
@@ -0,0 +1,14 @@
$ /tmp/findword-asr-venv/bin/python .agent/evidence-v0.2.3/privacy-screening/screen-final.py
Started UTC: 2026-10-14T09:16:47.940443+00:00
{"environmentId": "street", "sha256": "a8bffa201b174618955bc51b860167169125304811aabe2086b0bb35b06c3ae1", "language": "en", "languageProbability": 0.3898167014122009, "segments": [], "text": ""}
{"environmentId": "mall", "sha256": "680a769940c08f0d12c6c954c08366598dd8b5745e276f39c82b10d1a88261a1", "language": "en", "languageProbability": 0.21966177225112915, "segments": [{"id": 1, "seek": 0, "start": 0.0, "end": 12.0, "text": " It's so beautiful, it's so beautiful, it's so beautiful.", "tokens": [50364, 467, 311, 370, 2238, 11, 309, 311, 370, 2238, 11, 309, 311, 370, 2238, 13, 50964], "avg_logprob": -0.93099288476838, "compression_ratio": 1.8064516129032258, "no_speech_prob": 0.33958810567855835, "words": null, "temperature": 0.0}], "text": " It's so beautiful, it's so beautiful, it's so beautiful."}
{"environmentId": "theater", "sha256": "2d6a444fb7874cdf6b2d8a741a69175299b112eb66834912c025437d8277d635", "language": "en", "languageProbability": 0.25658440589904785, "segments": [{"id": 1, "seek": 0, "start": 0.0, "end": 7.0, "text": " Thank you for watching.", "tokens": [50364, 1044, 291, 337, 1976, 13, 50714], "avg_logprob": -1.1992912590503693, "compression_ratio": 0.7419354838709677, "no_speech_prob": 0.30440080165863037, "words": null, "temperature": 1.0}], "text": " Thank you for watching."}
{"environmentId": "department", "sha256": "aa43f3d1d3e7c2b1f8ace24ecbda45d0ea3a031db941c39506dc6c1665b8efa7", "language": "en", "languageProbability": 0.29920145869255066, "segments": [{"id": 1, "seek": 0, "start": 0.0, "end": 12.0, "text": " Thank you for watching!", "tokens": [50364, 1044, 291, 337, 1976, 0, 50964], "avg_logprob": -1.3012538105249405, "compression_ratio": 0.7419354838709677, "no_speech_prob": 0.3079261779785156, "words": null, "temperature": 1.0}], "text": " Thank you for watching!"}
{"environmentId": "market", "sha256": "7a7a980845a4aade2a7e8a108eae746220a4688e92792ee93d3deb76b2a762f6", "language": "ja", "languageProbability": 0.15124011039733887, "segments": [{"id": 1, "seek": 0, "start": 0.0, "end": 12.0, "text": "ご視聴ありがとうございました", "tokens": [50364, 9991, 27333, 8171, 112, 38538, 50964], "avg_logprob": -1.0916412025690079, "compression_ratio": 0.8571428571428571, "no_speech_prob": 0.4130496084690094, "words": null, "temperature": 1.0}], "text": "ご視聴ありがとうございました"}
{"environmentId": "subway", "sha256": "9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f", "language": "en", "languageProbability": 0.28915584087371826, "segments": [{"id": 1, "seek": 0, "start": 0.0, "end": 7.0, "text": " Thank you for watching.", "tokens": [50364, 1044, 291, 337, 1976, 13, 50714], "avg_logprob": -1.1550373882055283, "compression_ratio": 0.7419354838709677, "no_speech_prob": 0.5948910713195801, "words": null, "temperature": 1.0}], "text": " Thank you for watching."}
{"environmentId": "cafe", "sha256": "802a956e91b85a2fdd0e1f161d75bfada7a53499bcb57ba7f578411480ded216", "language": "en", "languageProbability": 0.25277179479599, "segments": [{"id": 1, "seek": 0, "start": 0.0, "end": 12.0, "text": " Thank you for watching.", "tokens": [50364, 1044, 291, 337, 1976, 13, 50964], "avg_logprob": -1.174854263663292, "compression_ratio": 0.7419354838709677, "no_speech_prob": 0.46528390049934387, "words": null, "temperature": 1.0}], "text": " Thank you for watching."}
{"environmentId": "rain", "sha256": "f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9", "language": "nn", "languageProbability": 0.5633389949798584, "segments": [{"id": 1, "seek": 0, "start": 0.0, "end": 2.0, "text": " Let's go!", "tokens": [50364, 961, 311, 352, 0, 50464], "avg_logprob": -1.2815486363002233, "compression_ratio": 0.5294117647058824, "no_speech_prob": 0.4753601849079132, "words": null, "temperature": 1.0}], "text": " Let's go!"}
Required changed excerpts produced ASR segments; screening criterion failed.
Exit code: 1
Finished UTC: 2026-10-14T09:17:06.762347+00:00
@@ -0,0 +1,14 @@
$ npx vitest run tests/ambience.test.ts tests/build.test.ts -t '선택 구간|101개 음성|현장음 manifest|현장음 .* 손상|고지는 각 항목'
Started UTC: 2026-10-14T09:17:53.364228+00:00
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.3
Test Files 2 passed (2)
Tests 24 passed | 11 skipped (35)
Start at 09:17:54
Duration 22.57s (tests 96%, setup 3%, transform 1%)
Exit code: 0
Finished UTC: 2026-10-14T09:18:17.137511+00:00
@@ -0,0 +1,20 @@
$ npm run build
Started UTC: 2026-10-14T09:17:53.387660+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 435ms
빌드 음성 자산 101개 + 현장음 8개 및 런타임/현장음 notice 확인
Exit code: 0
Finished UTC: 2026-10-14T09:18:02.496827+00:00
@@ -0,0 +1,9 @@
$ npm run lint
Started UTC: 2026-10-14T09:17:53.361817+00:00
> find-word@0.2.3 lint
> eslint . && tsc --noEmit
Exit code: 0
Finished UTC: 2026-10-14T09:18:05.370273+00:00
@@ -0,0 +1,457 @@
$ python3 -m unittest discover -s tests/python -v
Started UTC: 2026-10-14T09:17:53.337776+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 15.946s
OK
Exit code: 0
Finished UTC: 2026-10-14T09:18:09.473315+00:00
@@ -0,0 +1,70 @@
$ npx vitest run tests/ambience.test.ts -t '최종 ASR'
Started UTC: 2026-10-14T09:19:17.358762+00:00
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.3
❯ tests/ambience.test.ts (5 tests | 1 failed | 4 skipped) 15ms
× 최종 ASR 증거는 정확한 WAV와 연결되며 청취·법적 인수로 주장하지 않는다 14ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/ambience.test.ts > 최종 ASR 증거는 정확한 WAV와 연결되며 청취·법적 인수로 주장하지 않는다
AssertionError: expected [ Array(1) ] to deeply equal []
- Expected
+ Received
- []
+ [
+ {
+ "avg_logprob": -0.93099288476838,
+ "compression_ratio": 1.8064516129032258,
+ "end": 12,
+ "id": 1,
+ "no_speech_prob": 0.33958810567855835,
+ "seek": 0,
+ "start": 0,
+ "temperature": 0,
+ "text": " It's so beautiful, it's so beautiful, it's so beautiful.",
+ "tokens": [
+ 50364,
+ 467,
+ 311,
+ 370,
+ 2238,
+ 11,
+ 309,
+ 311,
+ 370,
+ 2238,
+ 11,
+ 309,
+ 311,
+ 370,
+ 2238,
+ 13,
+ 50964,
+ ],
+ "words": null,
+ },
+ ]
❯ tests/ambience.test.ts:224:31
222| expect(Array.isArray(result.segments)).toBe(true);
223| if (["mall", "market", "cafe"].includes(entry.environmentId)) {
224| expect(result.segments).toEqual([]);
| ^
225| expect(result.text).toBe("");
226| }
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯
Test Files 1 failed (1)
Tests 1 failed | 4 skipped (5)
Start at 09:19:17
Duration 298ms (setup 60%, transform 24%, tests 9%, import 5%, worker 2%)
Exit code: 1
Finished UTC: 2026-10-14T09:19:18.258550+00:00
@@ -0,0 +1,39 @@
$ /tmp/findword-asr-venv/bin/python .agent/evidence-v0.2.3/privacy-screening/screen-with-vad.py
Started UTC: 2026-10-14T09:19:18.333544+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": "7a7a980845a4aade2a7e8a108eae746220a4688e92792ee93d3deb76b2a762f6", "language": "en", "languageProbability": 0.1462402045726776, "segments": [{"id": 1, "seek": 0, "start": 0.43, "end": 2.43, "text": " I'm going to take a picture of you.", "tokens": [50364, 286, 478, 516, 281, 747, 257, 3036, 295, 291, 13, 50464], "avg_logprob": -0.7898735548998859, "compression_ratio": 2.276595744680851, "no_speech_prob": 0.4569862484931946, "words": null, "temperature": 0.2}, {"id": 2, "seek": 0, "start": 2.43, "end": 4.43, "text": " I'm going to take a picture of you.", "tokens": [50464, 286, 478, 516, 281, 747, 257, 3036, 295, 291, 13, 50564], "avg_logprob": -0.7898735548998859, "compression_ratio": 2.276595744680851, "no_speech_prob": 0.4569862484931946, "words": null, "temperature": 0.2}, {"id": 3, "seek": 0, "start": 4.43, "end": 6.43, "text": " I'm going to take a picture of you.", "tokens": [50564, 286, 478, 516, 281, 747, 257, 3036, 295, 291, 13, 50664], "avg_logprob": -0.7898735548998859, "compression_ratio": 2.276595744680851, "no_speech_prob": 0.4569862484931946, "words": null, "temperature": 0.2}], "text": " I'm going to take a picture of you. I'm going to take a picture of you. I'm going to take a picture of you."}
{"environmentId": "subway", "sha256": "9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "cafe", "sha256": "802a956e91b85a2fdd0e1f161d75bfada7a53499bcb57ba7f578411480ded216", "language": "en", "languageProbability": 0.23059327900409698, "segments": [{"id": 1, "seek": 0, "start": 3.02, "end": 4.02, "text": " Thank you.", "tokens": [50364, 1044, 291, 13, 50414], "avg_logprob": -0.8587487538655599, "compression_ratio": 0.5555555555555556, "no_speech_prob": 0.7639055252075195, "words": null, "temperature": 0.0}], "text": " Thank you."}
{"environmentId": "rain", "sha256": "f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.3/.agent/evidence-v0.2.3/privacy-screening/screen-with-vad.py", line 66, in <module>
stream.write(json.dumps(report, ensure_ascii=False, indent=2, allow_nan=False) + '\n')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/json/__init__.py", line 238, in dumps
**kw).encode(obj)
^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/json/encoder.py", line 202, in encode
chunks = list(chunks)
^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/json/encoder.py", line 432, in _iterencode
yield from _iterencode_dict(o, _current_indent_level)
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/json/encoder.py", line 406, in _iterencode_dict
yield from chunks
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/json/encoder.py", line 326, in _iterencode_list
yield from chunks
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/json/encoder.py", line 406, in _iterencode_dict
yield from chunks
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/json/encoder.py", line 406, in _iterencode_dict
yield from chunks
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/json/encoder.py", line 398, in _iterencode_dict
yield _floatstr(value)
^^^^^^^^^^^^^^^^
File "/home/hermes/.local/share/uv/python/cpython-3.11.16-linux-x86_64-gnu/lib/python3.11/json/encoder.py", line 240, in floatstr
raise ValueError(
ValueError: Out of range float values are not JSON compliant: inf
Exit code: 1
Finished UTC: 2026-10-14T09:19:23.297078+00:00
@@ -0,0 +1,2 @@
$ npm audit --json
Exit code: 0
@@ -0,0 +1,58 @@
$ env CHROME_PATH=/usr/bin/google-chrome PLAYWRIGHT_NO_SANDBOX=0 PLAYWRIGHT_JSON_OUTPUT_FILE=.agent/evidence-v0.2.3/privacy-screening/browser-results.json npx playwright test --reporter=line,json --output=.agent/evidence-v0.2.3/privacy-screening/browser-final
Started UTC: 2026-10-14T09:19:38.005274+00:00
[WebServer] (node:1143638) 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:1143659) 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:1143660) 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:1150374) 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:1150409) 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:23:37.679994+00:00
@@ -0,0 +1,14 @@
$ /tmp/findword-asr-venv/bin/python .agent/evidence-v0.2.3/privacy-screening/screen-with-vad-json.py
Started UTC: 2026-10-14T09:20:07.751963+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": "7a7a980845a4aade2a7e8a108eae746220a4688e92792ee93d3deb76b2a762f6", "language": "en", "languageProbability": 0.1462402045726776, "segments": [{"id": 1, "seek": 0, "start": 0.43, "end": 2.43, "text": " I'm going to take a picture of you.", "tokens": [50364, 286, 478, 516, 281, 747, 257, 3036, 295, 291, 13, 50464], "avg_logprob": -0.7898735548998859, "compression_ratio": 2.276595744680851, "no_speech_prob": 0.4569862484931946, "words": null, "temperature": 0.2}, {"id": 2, "seek": 0, "start": 2.43, "end": 4.43, "text": " I'm going to take a picture of you.", "tokens": [50464, 286, 478, 516, 281, 747, 257, 3036, 295, 291, 13, 50564], "avg_logprob": -0.7898735548998859, "compression_ratio": 2.276595744680851, "no_speech_prob": 0.4569862484931946, "words": null, "temperature": 0.2}, {"id": 3, "seek": 0, "start": 4.43, "end": 6.43, "text": " I'm going to take a picture of you.", "tokens": [50564, 286, 478, 516, 281, 747, 257, 3036, 295, 291, 13, 50664], "avg_logprob": -0.7898735548998859, "compression_ratio": 2.276595744680851, "no_speech_prob": 0.4569862484931946, "words": null, "temperature": 0.2}], "text": " I'm going to take a picture of you. I'm going to take a picture of you. I'm going to take a picture of you."}
{"environmentId": "subway", "sha256": "9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "cafe", "sha256": "802a956e91b85a2fdd0e1f161d75bfada7a53499bcb57ba7f578411480ded216", "language": "en", "languageProbability": 0.23059327900409698, "segments": [{"id": 1, "seek": 0, "start": 3.02, "end": 4.02, "text": " Thank you.", "tokens": [50364, 1044, 291, 13, 50414], "avg_logprob": -0.8587487538655599, "compression_ratio": 0.5555555555555556, "no_speech_prob": 0.7639055252075195, "words": null, "temperature": 0.0}], "text": " Thank you."}
{"environmentId": "rain", "sha256": "f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
Required changed excerpts produced ASR segments; screening criterion failed.
Exit code: 1
Finished UTC: 2026-10-14T09:20:19.115065+00:00
@@ -0,0 +1,124 @@
$ npm test
Started UTC: 2026-10-14T09:21:25.178903+00:00
> find-word@0.2.3 test
> vitest run
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.3
❯ tests/ambience.test.ts (5 tests | 1 failed) 1346ms
× 최종 ASR 증거는 정확한 WAV와 연결되며 청취·법적 인수로 주장하지 않는다 50ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/ambience.test.ts > 최종 ASR 증거는 정확한 WAV와 연결되며 청취·법적 인수로 주장하지 않는다
AssertionError: expected [ { id: 1, seek: +0, …(9) }, …(2) ] to deeply equal []
- Expected
+ Received
- []
+ [
+ {
+ "avg_logprob": -0.7898735548998859,
+ "compression_ratio": 2.276595744680851,
+ "end": 2.43,
+ "id": 1,
+ "no_speech_prob": 0.4569862484931946,
+ "seek": 0,
+ "start": 0.43,
+ "temperature": 0.2,
+ "text": " I'm going to take a picture of you.",
+ "tokens": [
+ 50364,
+ 286,
+ 478,
+ 516,
+ 281,
+ 747,
+ 257,
+ 3036,
+ 295,
+ 291,
+ 13,
+ 50464,
+ ],
+ "words": null,
+ },
+ {
+ "avg_logprob": -0.7898735548998859,
+ "compression_ratio": 2.276595744680851,
+ "end": 4.43,
+ "id": 2,
+ "no_speech_prob": 0.4569862484931946,
+ "seek": 0,
+ "start": 2.43,
+ "temperature": 0.2,
+ "text": " I'm going to take a picture of you.",
+ "tokens": [
+ 50464,
+ 286,
+ 478,
+ 516,
+ 281,
+ 747,
+ 257,
+ 3036,
+ 295,
+ 291,
+ 13,
+ 50564,
+ ],
+ "words": null,
+ },
+ {
+ "avg_logprob": -0.7898735548998859,
+ "compression_ratio": 2.276595744680851,
+ "end": 6.43,
+ "id": 3,
+ "no_speech_prob": 0.4569862484931946,
+ "seek": 0,
+ "start": 4.43,
+ "temperature": 0.2,
+ "text": " I'm going to take a picture of you.",
+ "tokens": [
+ 50564,
+ 286,
+ 478,
+ 516,
+ 281,
+ 747,
+ 257,
+ 3036,
+ 295,
+ 291,
+ 13,
+ 50664,
+ ],
+ "words": null,
+ },
+ ]
❯ tests/ambience.test.ts:224:31
222| expect(Array.isArray(result.segments)).toBe(true);
223| if (["mall", "market", "cafe"].includes(entry.environmentId)) {
224| expect(result.segments).toEqual([]);
| ^
225| expect(result.text).toBe("");
226| }
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯
Test Files 1 failed | 12 passed (13)
Tests 1 failed | 123 passed (124)
Start at 09:21:26
Duration 33.46s (tests 88%, environment 8%, setup 4%)
Isolate 13 workers spawned · ~702ms startup each (spawn + environment, per file)
at least ~2.34s faster with isolate: false — reuses workers across files instead of one per file
Exit code: 1
Finished UTC: 2026-10-14T09:21:59.522503+00:00
@@ -0,0 +1,9 @@
$ npm run lint
Started UTC: 2026-10-14T09:25:04.023632+00:00
> find-word@0.2.3 lint
> eslint . && tsc --noEmit
Exit code: 0
Finished UTC: 2026-10-14T09:25:10.062124+00:00
@@ -0,0 +1,5 @@
$ git diff --check
Started UTC: 2026-10-14T09:26:17.523277+00:00
Exit code: 0
Finished UTC: 2026-10-14T09:26:17.532504+00:00
@@ -0,0 +1,519 @@
{
"capturedAtUtc": "2026-10-14T09:07:00.393096+00:00",
"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": "e4d400b32344a0a45debc807c058e4c8bfa30d3cf947e75ef81dc40beddbbc8b",
".agent/CONTEXT.md": "712bd056cfc8d0254d6c96e7a604d364779d3734d14899111792e7f343e6819b",
".agent/RESULT-v0.1.1.md": "d5d7077d4977d70a89086801dd8e7d5ae04e16a8e8009e41f3216008b743ac5b",
".agent/RESULT-v0.2.3.md": "d186104a6cda2dddd13314e4225c0e4158ab36a85d4d3f16fbc0cfc593171e66",
".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/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"
},
"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": "8db06f3f09bbd8409573ba4874c7ccdd1e7e825c8a61989a4efe66206a66c2d2",
"public/ambience/department.wav": "aa43f3d1d3e7c2b1f8ace24ecbda45d0ea3a031db941c39506dc6c1665b8efa7",
"public/ambience/mall.wav": "6e9171f549cacadfaeedd57a41c8e2a76b0e789f5c9a97af029a8d3558c9f145",
"public/ambience/market.wav": "4287e971a12767f70da714e0c1aff30125268f9c3faf07ebfbcc0d2904f4a312",
"public/ambience/rain.wav": "f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9",
"public/ambience/street.wav": "a8bffa201b174618955bc51b860167169125304811aabe2086b0bb35b06c3ae1",
"public/ambience/subway.wav": "9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f",
"public/ambience/theater.wav": "2d6a444fb7874cdf6b2d8a741a69175299b112eb66834912c025437d8277d635"
},
"mutableAgentFiles": [
".agent/AMBIENCE-SOURCES-v0.2.3.json",
".agent/RESULT-v0.2.3.md"
]
}
@@ -0,0 +1,340 @@
{
"version": "0.2.3",
"generatedAtUtc": "2026-10-14T08:08:06.083521+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.",
"file": "street.wav",
"sourceSha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"sourceBytes": 3414104,
"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,
"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"
},
"expectedSourceSha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"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"
}
},
{
"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.",
"file": "mall.wav",
"sourceSha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"sourceBytes": 1666896,
"outputLicense": "Public domain (PD-author)",
"verificationDateUtc": "2026-10-14",
"sha256": "6e9171f549cacadfaeedd57a41c8e2a76b0e789f5c9a97af029a8d3558c9f145",
"bytes": 576044,
"duration": 12.0,
"rms": 0.07999756961051585,
"peak": 0.5546875,
"conversion": {
"startSeconds": 20,
"durationSeconds": 12,
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.9603596731816801,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
},
"expectedSourceSha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"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"
}
},
{
"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.",
"file": "theater.wav",
"sourceSha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"sourceBytes": 1485015,
"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,
"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"
},
"expectedSourceSha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"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"
}
},
{
"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.",
"file": "department.wav",
"sourceSha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"sourceBytes": 2445024,
"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,
"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"
},
"expectedSourceSha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"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"
}
},
{
"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.",
"file": "market.wav",
"sourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"sourceBytes": 622200,
"outputLicense": "CC BY-SA 4.0",
"verificationDateUtc": "2026-10-14",
"sha256": "4287e971a12767f70da714e0c1aff30125268f9c3faf07ebfbcc0d2904f4a312",
"bytes": 576044,
"duration": 12.0,
"rms": 0.04922207776603238,
"peak": 0.8499755859375,
"conversion": {
"startSeconds": 30,
"durationSeconds": 12,
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.9408509216036823,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
},
"expectedSourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"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"
}
},
{
"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.",
"file": "subway.wav",
"sourceSha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"sourceBytes": 3343901,
"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,
"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"
},
"expectedSourceSha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"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"
}
},
{
"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.",
"file": "cafe.wav",
"sourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"sourceBytes": 19947952,
"outputLicense": "CC0 1.0 Universal",
"verificationDateUtc": "2026-10-14",
"sha256": "8db06f3f09bbd8409573ba4874c7ccdd1e7e825c8a61989a4efe66206a66c2d2",
"bytes": 576044,
"duration": 12.0,
"rms": 0.07999759158182362,
"peak": 0.3970947265625,
"conversion": {
"startSeconds": 120,
"durationSeconds": 12,
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.6543423611954429,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
},
"expectedSourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"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"
}
},
{
"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.",
"file": "rain.wav",
"sourceSha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"sourceBytes": 91187572,
"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,
"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"
},
"expectedSourceSha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"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"
}
}
]
}
@@ -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 20–32.
## 극장 — 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 30–42.
## 지하철 — 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 120–132.
## 비 오는 거리 — 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,275 @@
# 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자 현장음은 각각의 라이선스를 유지한다.
**현재 최종 상태:** 독립 리뷰 수정 완료. lint/build PASS, 단위 118개·Python 32개·sandboxed Chrome 30개 PASS, npm audit 0건.
새 근거와 상세 변경은 문서 하단의 **독립 리뷰 수정**에 있으며 아래 최초 구현 기록과 구분한다.
## 최초 구현 내용 (아래 리뷰 수정 내역으로 보완)
- 정확히 세 개의 서로 다른 문제/단어를 한 단계에서 출제한다. 시작 단계 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 및 배포는 하지 않았다.
@@ -0,0 +1,170 @@
{
"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."
},
"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"
}
},
{
"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"
}
},
{
"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"
}
},
{
"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"
}
},
{
"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"
}
},
{
"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"
}
},
{
"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"
}
},
{
"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"
}
}
],
"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,24 @@
[
{
"project": "mobile",
"chrome": "146.0.7680.80",
"filesMatched": 109,
"externalRequests": 0,
"consoleOrPageErrors": 0,
"failedRequests": 0,
"evidence": "mobile-audio-integrity.json",
"levelTolerance": 3.0517578125e-05,
"levelToleranceReason": "One PCM16 step accommodates browser decoder float scaling versus manifest signed PCM/32768 measurements. Hashes and byte counts must match exactly."
},
{
"project": "desktop",
"chrome": "146.0.7680.80",
"filesMatched": 109,
"externalRequests": 0,
"consoleOrPageErrors": 0,
"failedRequests": 0,
"evidence": "desktop-audio-integrity.json",
"levelTolerance": 3.0517578125e-05,
"levelToleranceReason": "One PCM16 step accommodates browser decoder float scaling versus manifest signed PCM/32768 measurements. Hashes and byte counts must match exactly."
}
]
@@ -0,0 +1,7 @@
{
"status": "failed",
"failedTests": [
"87be2dcdb54c25970a35-d93130048b0c80dc4106",
"87be2dcdb54c25970a35-9f9914a49e88a65e211e"
]
}
@@ -0,0 +1,286 @@
# Instructions
- Following Playwright test failed.
- Explain why, be concise, respect Playwright best practices.
- Provide a snippet of code with the fix, if possible.
# Test info
- Name: audio.spec.ts >> 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
- Location: tests/browser/audio.spec.ts:7:1
# Error details
```
Error: expect(received).toBe(expected) // Object.is equality
Expected: true
Received: false
```
# Page snapshot
```yaml
- generic [ref=e2]:
- link "본문으로 건너뛰기" [ref=e3] [cursor=pointer]:
- /url: "#main"
- banner [ref=e4]:
- generic [ref=e5]:
- heading "단어를 맞춰라" [level=1] [ref=e11]
- generic [ref=e12]: v0.2.3
- generic [ref=e13]:
- link "플레이 방법" [ref=e14] [cursor=pointer]:
- /url: "#howto"
- text: 플레이 방법 ↓
- text: 소리에 집중하는 시간
- main [ref=e16]:
- region [ref=e17]:
- generic [ref=e18]:
- paragraph [ref=e19]: 귀를 기울이면, 발견하는 즐거움
- heading [level=2] [ref=e21]:
- text: 소음 속 작은 단어,
- emphasis [ref=e22]: 들리시나요?
- paragraph [ref=e23]: 도시의 소리 사이에 에스가 숨겨 둔 단어.조금 더 귀 기울여, 오늘의 행운을 찾아보세요.
- generic [ref=e24]:
- generic [ref=e25]: 한 라운드 3개의 질문
- generic [ref=e26]: ·5단계 도전
- generic [ref=e27]: ·나만의 속도로
- generic [ref=e28]:
- generic [ref=e29]:
- generic [ref=e30]: 에스의 사운드 룸
- generic [ref=e32]: 8가지 환경
- generic [aria-hidden] [ref=e35]: ♪
- generic [aria-hidden] [ref=e36]: ✳
- generic [ref=e37]: 행운의 단어를 찾아보거라!
- generic [ref=e44]: S
- generic [ref=e45]: 소음 사이, 숨겨진 한마디
- region [ref=e82]:
- generic [ref=e83]:
- generic [ref=e84]: "01"
- generic [ref=e85]:
- heading "나의 소리 탐험 준비" [level=2] [ref=e86]
- paragraph [ref=e87]: 한 단계에서 세 문제를 풀고, 완료 후 다음 단계에 도전해요.
- generic [ref=e88]: 라운드당 약 1–2분
- generic [ref=e89]:
- group "어떻게 답할까요?" [ref=e90]:
- generic [ref=e92]:
- generic [ref=e93] [cursor=pointer]:
- radio "골고루 풀기" [checked] [ref=e94]
- generic [aria-hidden] [ref=e95]: ◈
- strong [ref=e96]: 골고루 풀기
- generic [ref=e97]: 선택 + 직접 입력
- generic [ref=e98] [cursor=pointer]:
- radio "보기에서 선택" [ref=e99]
- generic [aria-hidden] [ref=e100]: ☷
- strong [ref=e101]: 보기에서 선택
- generic [ref=e102]: 4개 단어 중 하나
- generic [ref=e103] [cursor=pointer]:
- radio "직접 입력" [ref=e104]
- generic [aria-hidden] [ref=e105]: ✎
- strong [ref=e106]: 직접 입력
- generic [ref=e107]: 기억한 단어 쓰기
- generic [ref=e108]:
- generic [ref=e109]: 배경 환경
- combobox "배경 환경" [ref=e110] [cursor=pointer]:
- option "여덟 가지 일상 속으로" [selected]
- option "길거리"
- option "쇼핑몰"
- option "극장"
- option "백화점"
- option "시장"
- option "지하철"
- option "카페"
- option "비 오는 거리"
- paragraph [ref=e111]: 길거리부터 비 오는 거리까지, 매번 다른 공간을 만나요.
- generic [ref=e112]:
- generic [ref=e113]: 길거리
- generic [ref=e114]: 카페
- generic [ref=e115]: 지하철
- generic [ref=e116]: +5개 환경
- generic [ref=e117]:
- generic [ref=e118]: 시작 난이도
- combobox "시작 난이도" [ref=e119] [cursor=pointer]:
- option "1단계 · 소리에 익숙해지기" [selected]
- option "2단계 · 귀 기울이기"
- option "3단계 · 소음 사이로"
- option "4단계 · 작은 단서 찾기"
- option "5단계 · 깊이 집중하기"
- generic [ref=e120]:
- generic [ref=e121]: 목표 음성 SNR
- slider "목표 음성 SNR" [ref=e122] [cursor=pointer]: "6"
- status [ref=e123]: SNR +6 dB
- paragraph [ref=e124]: 음성이 배경보다 6 dB 커요. 범위 −12~+12 dB · 1 dB 간격. 양수는 음성이 더 크게, 0은 같게, 음수는 더 작게 들려요. 변경은 다음 재생·재청취부터 적용돼요.
- generic [ref=e125]:
- generic [ref=e126]: ◖)) 전체 음량
- slider "전체 음량" [ref=e127] [cursor=pointer]: "35"
- status [ref=e128]: 35%
- generic [ref=e129]:
- paragraph [ref=e130]: ♬ 편안한 작은 음량으로 시작해 보세요.
- button "게임 시작 · 소리 듣기" [ref=e131] [cursor=pointer]:
- text: 게임 시작 · 소리 듣기
- generic [aria-hidden] [ref=e132]: →
- region [ref=e133]:
- heading "작은 단어를 발견하는 방법" [level=2] [ref=e134]
- generic [ref=e135]:
- article [ref=e136]:
- generic [ref=e137]: "01"
- heading "먼저, 귀 기울이기" [level=3] [ref=e138]
- paragraph [ref=e139]: 에스의 안내와 소음 속 문장을 들어요.한 라운드 동안 같은 난이도로 들어요.
- article [ref=e140]:
- generic [ref=e141]: "02"
- heading "기억한 단어 찾기" [level=3] [ref=e142]
- paragraph [ref=e143]: 소리가 끝나면 질문이 나타나요.보기에서 고르거나 직접 입력해요.
- article [ref=e144]:
- generic [ref=e145]: "03"
- heading "나의 발견 돌아보기" [level=3] [ref=e146]
- paragraph [ref=e147]: 세 문제 뒤 나의 결과를 확인해요.놓쳤다면 언제든 다시 들어도 좋아요.
- contentinfo [ref=e148]:
- paragraph [ref=e149]: Designed by OZ at Heat-T Medical Inc.
- paragraph [ref=e150]: 청각적 주의·식별 게임 · 의료적 진단이나 치료를 제공하지 않습니다.
- generic [ref=e151]: 개인정보 수집 없이, 오직 플레이만.
- link "환경음 출처·라이선스" [ref=e152] [cursor=pointer]:
- /url: /ambience/AMBIENCE_NOTICES.md
```
# Test source
```ts
1 | import { readFileSync, writeFileSync } from "node:fs";
2 | import { expect, test } from "@playwright/test";
3 | import { createQuestions } from "../../src/game";
4 | import { isAudioRequest } from "./audio-requests";
5 |
6 | // 과거 evidence의 검증 스크립트는 보존하고, query URL 전수 검사를 정규 suite로 옮긴다.
7 | test("음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다", async ({
8 | page,
9 | browser,
10 | }, info) => {
11 | const external: string[] = [];
12 | const errors: string[] = [];
13 | const failed: string[] = [];
14 | const requests: string[] = [];
15 | page.on("request", (request) => {
16 | const url = new URL(request.url());
17 | if (url.origin !== "http://127.0.0.1:4173") external.push(url.href);
18 | if (isAudioRequest(url) || url.pathname.startsWith("/ambience/"))
19 | requests.push(url.href);
20 | });
21 | page.on("console", (message) => {
22 | if (message.type() === "error") errors.push(message.text());
23 | });
24 | page.on("requestfailed", (request) => failed.push(request.url()));
25 | page.on("pageerror", (error) => errors.push(error.message));
26 | await page.goto("/");
27 | await expect(page).toHaveTitle("단어를 맞춰라 · Find-Word v0.2.3");
28 | await expect(page.locator(".version")).toHaveText("v0.2.3");
29 | const plan = JSON.parse(readFileSync(".agent/AMBIENCE-SOURCES-v0.2.3.json", "utf8"));
30 | const published = await page.evaluate(async () => ({
31 | manifest: await (await fetch("/ambience/manifest.json?v=0.2.3")).json(),
32 | notice: await (await fetch("/ambience/AMBIENCE_NOTICES.md?v=0.2.3")).text(),
33 | }));
34 | expect(published.manifest).toEqual(JSON.parse(readFileSync("public/ambience/manifest.json", "utf8")));
35 | for (const asset of plan.assets) {
36 | const start = asset.selectedSegmentStartSeconds;
> 37 | expect(Number.isFinite(start)).toBe(true);
| ^ Error: expect(received).toBe(expected) // Object.is equality
38 | expect(start).toBeGreaterThanOrEqual(0);
39 | expect(start + 12).toBeLessThanOrEqual(asset.directMediaDurationSeconds);
40 | const entry = published.manifest.files.find((e: { environmentId: string }) => e.environmentId === asset.environmentId);
41 | expect(entry.selectedSegmentStartSeconds).toBe(start);
42 | expect(entry.conversion.startSeconds).toBe(start);
43 | expect(entry.conversion.durationSeconds).toBe(12);
44 | const section = published.notice.split("## ").find((s: string) => s.startsWith(`${asset.displayName} — ${asset.environmentId}\n`));
45 | expect(section).toContain(`source seconds ${start}–${start + 12}.`);
46 | }
47 | // intro는 테스트에서 URL을 재조립하지 않고 배포 앱의 실제 요청을 관찰한다.
48 | const introRequest = page.waitForRequest(
49 | (request) => new URL(request.url()).pathname === "/audio/intro.wav",
50 | );
51 | await page.getByRole("button", { name: "게임 시작 · 소리 듣기" }).click();
52 | const introUrl = (await introRequest).url();
53 | await expect(page.getByRole("group", { name: "답 선택" })).toBeVisible({
54 | timeout: 30000,
55 | });
56 | await page.getByRole("button", { name: "문제 풀이 종료" }).click();
57 | await page.getByRole("button", { name: "처음 화면으로" }).click();
58 | const targetUrls = [
59 | ...new Set(
60 | Array.from({ length: 1000 }, (_, seed) =>
61 | createQuestions(seed, "mixed").map((question) => question.audioUrl),
62 | ).flat(),
63 | ),
64 | ];
65 | expect(targetUrls).toHaveLength(100);
66 | const ambience = JSON.parse(
67 | readFileSync("public/ambience/manifest.json", "utf8"),
68 | );
69 | const urls = [
70 | introUrl,
71 | ...ambience.files.map(
72 | (entry: { file: string }) =>
73 | new URL(`/ambience/${entry.file}?v=0.2.3`, page.url()).href,
74 | ),
75 | ...targetUrls.map((url) => new URL(url, page.url()).href),
76 | ];
77 | expect(
78 | new Set(urls.map((url) => new URL(url).searchParams.get("v"))),
79 | ).toEqual(new Set(["0.2.3"]));
80 | expect(
81 | urls.every((url) => new URL(url).origin === new URL(page.url()).origin),
82 | ).toBe(true);
83 | const manifest = JSON.parse(
84 | readFileSync("public/audio/manifest.json", "utf8"),
85 | ) as {
86 | version: string;
87 | files: { file: string; sha256: string; bytes: number; duration: number }[];
88 | };
89 | expect(manifest.version).toBe("0.2.3");
90 | // 두 manifest의 파일명 충돌 없이 경로를 명시해 109개 응답을 독립 대조한다.
91 | const entries = [
92 | ...manifest.files.map((entry) => ({
93 | ...entry,
94 | path: `/audio/${entry.file}`,
95 | })),
96 | ...ambience.files.map(
97 | (entry: {
98 | file: string;
99 | sha256: string;
100 | bytes: number;
101 | duration: number;
102 | }) => ({ ...entry, path: `/ambience/${entry.file}` }),
103 | ),
104 | ];
105 | expect(urls.map((url) => new URL(url).pathname).sort()).toEqual(
106 | entries.map((entry) => entry.path).sort(),
107 | );
108 | requests.length = 0;
109 | const rows = await page.evaluate(
110 | async ({ urls, entries }) => {
111 | const context = new OfflineAudioContext(1, 1, 24000);
112 | const rows = [];
113 | for (const url of urls) {
114 | // query를 파일명으로 취급하지 않는다. 원문 파일과 응답 해시를 독립 대조한다.
115 | const entry = entries.find(
116 | (entry) => entry.path === new URL(url).pathname,
117 | )!;
118 | const response = await fetch(url);
119 | if (!response.ok) throw Error(`${url}: HTTP ${response.status}`);
120 | const bytes = await response.arrayBuffer();
121 | const sha256 = Array.from(
122 | new Uint8Array(await crypto.subtle.digest("SHA-256", bytes)),
123 | (b) => b.toString(16).padStart(2, "0"),
124 | ).join("");
125 | if (sha256 !== entry.sha256 || bytes.byteLength !== entry.bytes)
126 | throw Error(`${url}: integrity mismatch`);
127 | const buffer = await context.decodeAudioData(bytes);
128 | if (
129 | buffer.sampleRate !== 24000 ||
130 | buffer.numberOfChannels !== 1 ||
131 | Math.abs(buffer.duration - entry.duration) > 1e-9
132 | )
133 | throw Error(`${url}: decode format/duration mismatch`);
134 | let power = 0,
135 | peak = 0;
136 | for (const sample of buffer.getChannelData(0)) {
137 | power += sample * sample;
```
@@ -0,0 +1,285 @@
# Instructions
- Following Playwright test failed.
- Explain why, be concise, respect Playwright best practices.
- Provide a snippet of code with the fix, if possible.
# Test info
- Name: audio.spec.ts >> 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
- Location: tests/browser/audio.spec.ts:7:1
# Error details
```
Error: expect(received).toBe(expected) // Object.is equality
Expected: true
Received: false
```
# Page snapshot
```yaml
- generic [ref=e2]:
- link "본문으로 건너뛰기" [ref=e3] [cursor=pointer]:
- /url: "#main"
- banner [ref=e4]:
- generic [ref=e5]:
- heading "단어를 맞춰라" [level=1] [ref=e11]
- generic [ref=e12]: v0.2.3
- generic [ref=e13]:
- link "플레이 방법" [ref=e14] [cursor=pointer]:
- /url: "#howto"
- text: 플레이 방법 ↓
- text: 소리에 집중하는 시간
- main [ref=e15]:
- region [ref=e16]:
- generic [ref=e17]:
- paragraph [ref=e18]: 귀를 기울이면, 발견하는 즐거움
- heading [level=2] [ref=e20]:
- text: 소음 속 작은 단어,
- emphasis [ref=e21]: 들리시나요?
- paragraph [ref=e22]: 도시의 소리 사이에 에스가 숨겨 둔 단어.조금 더 귀 기울여, 오늘의 행운을 찾아보세요.
- generic [ref=e23]:
- generic [ref=e24]: 한 라운드 3개의 질문
- generic [ref=e25]: ·5단계 도전
- generic [ref=e26]: ·나만의 속도로
- generic [ref=e27]:
- generic [ref=e28]:
- generic [ref=e29]: 에스의 사운드 룸
- generic [ref=e31]: 8가지 환경
- generic [aria-hidden] [ref=e34]: ♪
- generic [aria-hidden] [ref=e35]: ✳
- generic [ref=e36]: 행운의 단어를 찾아보거라!
- generic [ref=e43]: S
- generic [ref=e44]: 소음 사이, 숨겨진 한마디
- region [ref=e81]:
- generic [ref=e82]:
- generic [ref=e83]: "01"
- generic [ref=e84]:
- heading "나의 소리 탐험 준비" [level=2] [ref=e85]
- paragraph [ref=e86]: 한 단계에서 세 문제를 풀고, 완료 후 다음 단계에 도전해요.
- generic [ref=e87]:
- group "어떻게 답할까요?" [ref=e88]:
- generic [ref=e90]:
- generic [ref=e91] [cursor=pointer]:
- radio "골고루 풀기" [checked] [ref=e92]
- generic [aria-hidden] [ref=e93]: ◈
- strong [ref=e94]: 골고루 풀기
- generic [ref=e95]: 선택 + 직접 입력
- generic [ref=e96] [cursor=pointer]:
- radio "보기에서 선택" [ref=e97]
- generic [aria-hidden] [ref=e98]: ☷
- strong [ref=e99]: 보기에서 선택
- generic [ref=e100]: 4개 단어 중 하나
- generic [ref=e101] [cursor=pointer]:
- radio "직접 입력" [ref=e102]
- generic [aria-hidden] [ref=e103]: ✎
- strong [ref=e104]: 직접 입력
- generic [ref=e105]: 기억한 단어 쓰기
- generic [ref=e106]:
- generic [ref=e107]: 배경 환경
- combobox "배경 환경" [ref=e108] [cursor=pointer]:
- option "여덟 가지 일상 속으로" [selected]
- option "길거리"
- option "쇼핑몰"
- option "극장"
- option "백화점"
- option "시장"
- option "지하철"
- option "카페"
- option "비 오는 거리"
- paragraph [ref=e109]: 길거리부터 비 오는 거리까지, 매번 다른 공간을 만나요.
- generic [ref=e110]:
- generic [ref=e111]: 길거리
- generic [ref=e112]: 카페
- generic [ref=e113]: 지하철
- generic [ref=e114]: +5개 환경
- generic [ref=e115]:
- generic [ref=e116]: 시작 난이도
- combobox "시작 난이도" [ref=e117] [cursor=pointer]:
- option "1단계 · 소리에 익숙해지기" [selected]
- option "2단계 · 귀 기울이기"
- option "3단계 · 소음 사이로"
- option "4단계 · 작은 단서 찾기"
- option "5단계 · 깊이 집중하기"
- generic [ref=e118]:
- generic [ref=e119]: 목표 음성 SNR
- slider "목표 음성 SNR" [ref=e120] [cursor=pointer]: "6"
- status [ref=e121]: SNR +6 dB
- paragraph [ref=e122]: 음성이 배경보다 6 dB 커요. 범위 −12~+12 dB · 1 dB 간격. 양수는 음성이 더 크게, 0은 같게, 음수는 더 작게 들려요. 변경은 다음 재생·재청취부터 적용돼요.
- generic [ref=e123]:
- generic [ref=e124]: ◖)) 전체 음량
- slider "전체 음량" [ref=e125] [cursor=pointer]: "35"
- status [ref=e126]: 35%
- generic [ref=e127]:
- paragraph [ref=e128]: ♬ 편안한 작은 음량으로 시작해 보세요.
- button "게임 시작 · 소리 듣기" [ref=e129] [cursor=pointer]:
- text: 게임 시작 · 소리 듣기
- generic [aria-hidden] [ref=e130]: →
- region [ref=e131]:
- heading "작은 단어를 발견하는 방법" [level=2] [ref=e132]
- generic [ref=e133]:
- article [ref=e134]:
- generic [ref=e135]: "01"
- heading "먼저, 귀 기울이기" [level=3] [ref=e136]
- paragraph [ref=e137]: 에스의 안내와 소음 속 문장을 들어요. 한 라운드 동안 같은 난이도로 들어요.
- article [ref=e138]:
- generic [ref=e139]: "02"
- heading "기억한 단어 찾기" [level=3] [ref=e140]
- paragraph [ref=e141]: 소리가 끝나면 질문이 나타나요. 보기에서 고르거나 직접 입력해요.
- article [ref=e142]:
- generic [ref=e143]: "03"
- heading "나의 발견 돌아보기" [level=3] [ref=e144]
- paragraph [ref=e145]: 세 문제 뒤 나의 결과를 확인해요. 놓쳤다면 언제든 다시 들어도 좋아요.
- contentinfo [ref=e146]:
- paragraph [ref=e147]: Designed by OZ at Heat-T Medical Inc.
- paragraph [ref=e148]: 청각적 주의·식별 게임 · 의료적 진단이나 치료를 제공하지 않습니다.
- generic [ref=e149]: 개인정보 수집 없이, 오직 플레이만.
- link "환경음 출처·라이선스" [ref=e150] [cursor=pointer]:
- /url: /ambience/AMBIENCE_NOTICES.md
```
# Test source
```ts
1 | import { readFileSync, writeFileSync } from "node:fs";
2 | import { expect, test } from "@playwright/test";
3 | import { createQuestions } from "../../src/game";
4 | import { isAudioRequest } from "./audio-requests";
5 |
6 | // 과거 evidence의 검증 스크립트는 보존하고, query URL 전수 검사를 정규 suite로 옮긴다.
7 | test("음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다", async ({
8 | page,
9 | browser,
10 | }, info) => {
11 | const external: string[] = [];
12 | const errors: string[] = [];
13 | const failed: string[] = [];
14 | const requests: string[] = [];
15 | page.on("request", (request) => {
16 | const url = new URL(request.url());
17 | if (url.origin !== "http://127.0.0.1:4173") external.push(url.href);
18 | if (isAudioRequest(url) || url.pathname.startsWith("/ambience/"))
19 | requests.push(url.href);
20 | });
21 | page.on("console", (message) => {
22 | if (message.type() === "error") errors.push(message.text());
23 | });
24 | page.on("requestfailed", (request) => failed.push(request.url()));
25 | page.on("pageerror", (error) => errors.push(error.message));
26 | await page.goto("/");
27 | await expect(page).toHaveTitle("단어를 맞춰라 · Find-Word v0.2.3");
28 | await expect(page.locator(".version")).toHaveText("v0.2.3");
29 | const plan = JSON.parse(readFileSync(".agent/AMBIENCE-SOURCES-v0.2.3.json", "utf8"));
30 | const published = await page.evaluate(async () => ({
31 | manifest: await (await fetch("/ambience/manifest.json?v=0.2.3")).json(),
32 | notice: await (await fetch("/ambience/AMBIENCE_NOTICES.md?v=0.2.3")).text(),
33 | }));
34 | expect(published.manifest).toEqual(JSON.parse(readFileSync("public/ambience/manifest.json", "utf8")));
35 | for (const asset of plan.assets) {
36 | const start = asset.selectedSegmentStartSeconds;
> 37 | expect(Number.isFinite(start)).toBe(true);
| ^ Error: expect(received).toBe(expected) // Object.is equality
38 | expect(start).toBeGreaterThanOrEqual(0);
39 | expect(start + 12).toBeLessThanOrEqual(asset.directMediaDurationSeconds);
40 | const entry = published.manifest.files.find((e: { environmentId: string }) => e.environmentId === asset.environmentId);
41 | expect(entry.selectedSegmentStartSeconds).toBe(start);
42 | expect(entry.conversion.startSeconds).toBe(start);
43 | expect(entry.conversion.durationSeconds).toBe(12);
44 | const section = published.notice.split("## ").find((s: string) => s.startsWith(`${asset.displayName} — ${asset.environmentId}\n`));
45 | expect(section).toContain(`source seconds ${start}–${start + 12}.`);
46 | }
47 | // intro는 테스트에서 URL을 재조립하지 않고 배포 앱의 실제 요청을 관찰한다.
48 | const introRequest = page.waitForRequest(
49 | (request) => new URL(request.url()).pathname === "/audio/intro.wav",
50 | );
51 | await page.getByRole("button", { name: "게임 시작 · 소리 듣기" }).click();
52 | const introUrl = (await introRequest).url();
53 | await expect(page.getByRole("group", { name: "답 선택" })).toBeVisible({
54 | timeout: 30000,
55 | });
56 | await page.getByRole("button", { name: "문제 풀이 종료" }).click();
57 | await page.getByRole("button", { name: "처음 화면으로" }).click();
58 | const targetUrls = [
59 | ...new Set(
60 | Array.from({ length: 1000 }, (_, seed) =>
61 | createQuestions(seed, "mixed").map((question) => question.audioUrl),
62 | ).flat(),
63 | ),
64 | ];
65 | expect(targetUrls).toHaveLength(100);
66 | const ambience = JSON.parse(
67 | readFileSync("public/ambience/manifest.json", "utf8"),
68 | );
69 | const urls = [
70 | introUrl,
71 | ...ambience.files.map(
72 | (entry: { file: string }) =>
73 | new URL(`/ambience/${entry.file}?v=0.2.3`, page.url()).href,
74 | ),
75 | ...targetUrls.map((url) => new URL(url, page.url()).href),
76 | ];
77 | expect(
78 | new Set(urls.map((url) => new URL(url).searchParams.get("v"))),
79 | ).toEqual(new Set(["0.2.3"]));
80 | expect(
81 | urls.every((url) => new URL(url).origin === new URL(page.url()).origin),
82 | ).toBe(true);
83 | const manifest = JSON.parse(
84 | readFileSync("public/audio/manifest.json", "utf8"),
85 | ) as {
86 | version: string;
87 | files: { file: string; sha256: string; bytes: number; duration: number }[];
88 | };
89 | expect(manifest.version).toBe("0.2.3");
90 | // 두 manifest의 파일명 충돌 없이 경로를 명시해 109개 응답을 독립 대조한다.
91 | const entries = [
92 | ...manifest.files.map((entry) => ({
93 | ...entry,
94 | path: `/audio/${entry.file}`,
95 | })),
96 | ...ambience.files.map(
97 | (entry: {
98 | file: string;
99 | sha256: string;
100 | bytes: number;
101 | duration: number;
102 | }) => ({ ...entry, path: `/ambience/${entry.file}` }),
103 | ),
104 | ];
105 | expect(urls.map((url) => new URL(url).pathname).sort()).toEqual(
106 | entries.map((entry) => entry.path).sort(),
107 | );
108 | requests.length = 0;
109 | const rows = await page.evaluate(
110 | async ({ urls, entries }) => {
111 | const context = new OfflineAudioContext(1, 1, 24000);
112 | const rows = [];
113 | for (const url of urls) {
114 | // query를 파일명으로 취급하지 않는다. 원문 파일과 응답 해시를 독립 대조한다.
115 | const entry = entries.find(
116 | (entry) => entry.path === new URL(url).pathname,
117 | )!;
118 | const response = await fetch(url);
119 | if (!response.ok) throw Error(`${url}: HTTP ${response.status}`);
120 | const bytes = await response.arrayBuffer();
121 | const sha256 = Array.from(
122 | new Uint8Array(await crypto.subtle.digest("SHA-256", bytes)),
123 | (b) => b.toString(16).padStart(2, "0"),
124 | ).join("");
125 | if (sha256 !== entry.sha256 || bytes.byteLength !== entry.bytes)
126 | throw Error(`${url}: integrity mismatch`);
127 | const buffer = await context.decodeAudioData(bytes);
128 | if (
129 | buffer.sampleRate !== 24000 ||
130 | buffer.numberOfChannels !== 1 ||
131 | Math.abs(buffer.duration - entry.duration) > 1e-9
132 | )
133 | throw Error(`${url}: decode format/duration mismatch`);
134 | let power = 0,
135 | peak = 0;
136 | for (const sample of buffer.getChannelData(0)) {
137 | power += sample * sample;
```
@@ -0,0 +1,128 @@
{
"mall": [
{
"start": 0,
"lang": "nn",
"p": 0.136,
"text": "We are going to take a look at this. We are going to take a look at this. We are going to take a look at this."
},
{
"start": 12,
"lang": "en",
"p": 0.41,
"text": "Thank you."
},
{
"start": 24,
"lang": "en",
"p": 0.302,
"text": ""
},
{
"start": 36,
"lang": "en",
"p": 0.302,
"text": ""
},
{
"start": 48,
"lang": "ru",
"p": 0.176,
"text": "ДИНАМИЧНАЯ МУЗЫКА"
}
],
"market": [
{
"start": 0,
"lang": "ja",
"p": 0.275,
"text": "キスチャでに伸ばしてる よろしくかどうしよう ごたさら、かき下でいらっしゃいこう"
},
{
"start": 12,
"lang": "nn",
"p": 0.108,
"text": "Hey, you can't go anywhere but come! Hey, hey, hey, hey, hey!"
},
{
"start": 24,
"lang": "en",
"p": 0.258,
"text": ""
},
{
"start": 36,
"lang": "en",
"p": 0.302,
"text": ""
},
{
"start": 48,
"lang": "ja",
"p": 0.205,
"text": "アナウンスで行ったら、 アナウンスで行ったら、 アナウンスで行ったら、"
},
{
"start": 60,
"lang": "en",
"p": 0.334,
"text": ""
}
],
"cafe": [
{
"start": 0,
"lang": "en",
"p": 0.302,
"text": ""
},
{
"start": 60,
"lang": "en",
"p": 0.225,
"text": "Thank you very much."
},
{
"start": 120,
"lang": "en",
"p": 0.264,
"text": "Thank you."
},
{
"start": 180,
"lang": "en",
"p": 0.302,
"text": ""
},
{
"start": 300,
"lang": "en",
"p": 0.302,
"text": ""
},
{
"start": 480,
"lang": "en",
"p": 0.302,
"text": ""
},
{
"start": 720,
"lang": "en",
"p": 0.302,
"text": ""
},
{
"start": 960,
"lang": "en",
"p": 0.302,
"text": ""
},
{
"start": 1140,
"lang": "en",
"p": 0.302,
"text": ""
}
]
}
@@ -0,0 +1,637 @@
{
"capturedAtUtc": "2026-10-14T09:21:57.933277+00:00",
"runnerPids": [
1143583
],
"method": "Chrome descendants of this suite runner only; chromiumSandbox=true; no --no-sandbox token in actual process command lines",
"processes": [
{
"pid": 1150425,
"ppid": 1150374,
"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-FjSsOM --remote-debugging-pipe --no-startup-window --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl",
"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-FjSsOM",
"--remote-debugging-pipe",
"--no-startup-window",
"--noerrdialogs",
"--ozone-platform=headless",
"--ozone-override-screen-size=800,600",
"--use-angle=swiftshader-webgl"
]
},
{
"pid": 1150447,
"ppid": 1150425,
"commandLine": "/opt/google/chrome/chrome --type=zygote --no-zygote-sandbox --headless --crashpad-handler-pid=1150439 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM --change-stack-guard-on-fork=enable --no-first-run --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl",
"arguments": [
"/opt/google/chrome/chrome",
"--type=zygote",
"--no-zygote-sandbox",
"--headless",
"--crashpad-handler-pid=1150439",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM",
"--change-stack-guard-on-fork=enable",
"--no-first-run",
"--ozone-platform=headless",
"--ozone-override-screen-size=800,600",
"--use-angle=swiftshader-webgl"
]
},
{
"pid": 1150448,
"ppid": 1150425,
"commandLine": "/opt/google/chrome/chrome --type=zygote --headless --crashpad-handler-pid=1150439 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM --change-stack-guard-on-fork=enable --no-first-run --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl",
"arguments": [
"/opt/google/chrome/chrome",
"--type=zygote",
"--headless",
"--crashpad-handler-pid=1150439",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM",
"--change-stack-guard-on-fork=enable",
"--no-first-run",
"--ozone-platform=headless",
"--ozone-override-screen-size=800,600",
"--use-angle=swiftshader-webgl"
]
},
{
"pid": 1150451,
"ppid": 1150448,
"commandLine": "/opt/google/chrome/chrome --type=zygote --headless --crashpad-handler-pid=1150439 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM --change-stack-guard-on-fork=enable --no-first-run --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl",
"arguments": [
"/opt/google/chrome/chrome",
"--type=zygote",
"--headless",
"--crashpad-handler-pid=1150439",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM",
"--change-stack-guard-on-fork=enable",
"--no-first-run",
"--ozone-platform=headless",
"--ozone-override-screen-size=800,600",
"--use-angle=swiftshader-webgl"
]
},
{
"pid": 1150472,
"ppid": 1150447,
"commandLine": "/opt/google/chrome/chrome --type=gpu-process --disable-dev-shm-usage --disable-breakpad --headless --ozone-platform=headless --use-angle=swiftshader-webgl --enable-unsafe-swiftshader --crashpad-handler-pid=1150439 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM --change-stack-guard-on-fork=enable --gpu-preferences=UAAAAAAAAAAgAAAEAAAAAAAAAAAAAGAAAQAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAA --shared-files --field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4 --trace-process-track-uuid=3190708988185955192",
"arguments": [
"/opt/google/chrome/chrome",
"--type=gpu-process",
"--disable-dev-shm-usage",
"--disable-breakpad",
"--headless",
"--ozone-platform=headless",
"--use-angle=swiftshader-webgl",
"--enable-unsafe-swiftshader",
"--crashpad-handler-pid=1150439",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM",
"--change-stack-guard-on-fork=enable",
"--gpu-preferences=UAAAAAAAAAAgAAAEAAAAAAAAAAAAAGAAAQAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAA",
"--shared-files",
"--field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4",
"--trace-process-track-uuid=3190708988185955192"
]
},
{
"pid": 1150474,
"ppid": 1150425,
"commandLine": "/opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --mute-audio --crashpad-handler-pid=1150439 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4 --trace-process-track-uuid=3190708989122997041",
"arguments": [
"/opt/google/chrome/chrome",
"--type=utility",
"--utility-sub-type=network.mojom.NetworkService",
"--lang=en-US",
"--service-sandbox-type=none",
"--disable-dev-shm-usage",
"--use-angle=swiftshader-webgl",
"--mute-audio",
"--crashpad-handler-pid=1150439",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM",
"--change-stack-guard-on-fork=enable",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4",
"--trace-process-track-uuid=3190708989122997041"
]
},
{
"pid": 1150485,
"ppid": 1150451,
"commandLine": "/opt/google/chrome/chrome --type=utility --utility-sub-type=storage.mojom.StorageService --lang=en-US --service-sandbox-type=utility --disable-dev-shm-usage --use-angle=swiftshader-webgl --mute-audio --crashpad-handler-pid=1150439 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4 --trace-process-track-uuid=3190708990060038890",
"arguments": [
"/opt/google/chrome/chrome",
"--type=utility",
"--utility-sub-type=storage.mojom.StorageService",
"--lang=en-US",
"--service-sandbox-type=utility",
"--disable-dev-shm-usage",
"--use-angle=swiftshader-webgl",
"--mute-audio",
"--crashpad-handler-pid=1150439",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM",
"--change-stack-guard-on-fork=enable",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4",
"--trace-process-track-uuid=3190708990060038890"
]
},
{
"pid": 1150515,
"ppid": 1150451,
"commandLine": "/opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=1150439 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM --change-stack-guard-on-fork=enable --disable-dev-shm-usage --disable-back-forward-cache --disable-background-timer-throttling --disable-breakpad --force-color-profile=srgb --remote-debugging-pipe --allow-pre-commit-input --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --ozone-platform=headless --lang=en-US --num-raster-threads=2 --enable-main-frame-before-activation --renderer-client-id=6 --time-ticks-at-unix-epoch=-1790509733151410 --launch-time-ticks=1459966789304 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4 --trace-process-track-uuid=3190708991934122588",
"arguments": [
"/opt/google/chrome/chrome",
"--type=renderer",
"--crashpad-handler-pid=1150439",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM",
"--change-stack-guard-on-fork=enable",
"--disable-dev-shm-usage",
"--disable-back-forward-cache",
"--disable-background-timer-throttling",
"--disable-breakpad",
"--force-color-profile=srgb",
"--remote-debugging-pipe",
"--allow-pre-commit-input",
"--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4",
"--ozone-platform=headless",
"--lang=en-US",
"--num-raster-threads=2",
"--enable-main-frame-before-activation",
"--renderer-client-id=6",
"--time-ticks-at-unix-epoch=-1790509733151410",
"--launch-time-ticks=1459966789304",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4",
"--trace-process-track-uuid=3190708991934122588"
]
},
{
"pid": 1150517,
"ppid": 1150451,
"commandLine": "/opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=1150439 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM --change-stack-guard-on-fork=enable --disable-dev-shm-usage --disable-back-forward-cache --disable-background-timer-throttling --disable-breakpad --force-color-profile=srgb --remote-debugging-pipe --allow-pre-commit-input --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --ozone-platform=headless --lang=en-US --num-raster-threads=2 --enable-main-frame-before-activation --renderer-client-id=5 --time-ticks-at-unix-epoch=-1790509733151410 --launch-time-ticks=1459966794595 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4 --trace-process-track-uuid=3190708990997080739",
"arguments": [
"/opt/google/chrome/chrome",
"--type=renderer",
"--crashpad-handler-pid=1150439",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM",
"--change-stack-guard-on-fork=enable",
"--disable-dev-shm-usage",
"--disable-back-forward-cache",
"--disable-background-timer-throttling",
"--disable-breakpad",
"--force-color-profile=srgb",
"--remote-debugging-pipe",
"--allow-pre-commit-input",
"--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4",
"--ozone-platform=headless",
"--lang=en-US",
"--num-raster-threads=2",
"--enable-main-frame-before-activation",
"--renderer-client-id=5",
"--time-ticks-at-unix-epoch=-1790509733151410",
"--launch-time-ticks=1459966794595",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4",
"--trace-process-track-uuid=3190708990997080739"
]
},
{
"pid": 1150558,
"ppid": 1150409,
"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-xUTkdp --remote-debugging-pipe --no-startup-window --noerrdialogs --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl",
"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-xUTkdp",
"--remote-debugging-pipe",
"--no-startup-window",
"--noerrdialogs",
"--ozone-platform=headless",
"--ozone-override-screen-size=800,600",
"--use-angle=swiftshader-webgl"
]
},
{
"pid": 1150574,
"ppid": 1150558,
"commandLine": "/opt/google/chrome/chrome --type=zygote --no-zygote-sandbox --headless --crashpad-handler-pid=1150566 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp --change-stack-guard-on-fork=enable --no-first-run --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl",
"arguments": [
"/opt/google/chrome/chrome",
"--type=zygote",
"--no-zygote-sandbox",
"--headless",
"--crashpad-handler-pid=1150566",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp",
"--change-stack-guard-on-fork=enable",
"--no-first-run",
"--ozone-platform=headless",
"--ozone-override-screen-size=800,600",
"--use-angle=swiftshader-webgl"
]
},
{
"pid": 1150575,
"ppid": 1150558,
"commandLine": "/opt/google/chrome/chrome --type=zygote --headless --crashpad-handler-pid=1150566 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp --change-stack-guard-on-fork=enable --no-first-run --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl",
"arguments": [
"/opt/google/chrome/chrome",
"--type=zygote",
"--headless",
"--crashpad-handler-pid=1150566",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp",
"--change-stack-guard-on-fork=enable",
"--no-first-run",
"--ozone-platform=headless",
"--ozone-override-screen-size=800,600",
"--use-angle=swiftshader-webgl"
]
},
{
"pid": 1150577,
"ppid": 1150575,
"commandLine": "/opt/google/chrome/chrome --type=zygote --headless --crashpad-handler-pid=1150566 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp --change-stack-guard-on-fork=enable --no-first-run --ozone-platform=headless --ozone-override-screen-size=800,600 --use-angle=swiftshader-webgl",
"arguments": [
"/opt/google/chrome/chrome",
"--type=zygote",
"--headless",
"--crashpad-handler-pid=1150566",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp",
"--change-stack-guard-on-fork=enable",
"--no-first-run",
"--ozone-platform=headless",
"--ozone-override-screen-size=800,600",
"--use-angle=swiftshader-webgl"
]
},
{
"pid": 1150599,
"ppid": 1150574,
"commandLine": "/opt/google/chrome/chrome --type=gpu-process --disable-dev-shm-usage --disable-breakpad --headless --ozone-platform=headless --use-angle=swiftshader-webgl --enable-unsafe-swiftshader --crashpad-handler-pid=1150566 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp --change-stack-guard-on-fork=enable --gpu-preferences=UAAAAAAAAAAgAAAEAAAAAAAAAAAAAGAAAQAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAA --shared-files --field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4 --trace-process-track-uuid=3190708988185955192",
"arguments": [
"/opt/google/chrome/chrome",
"--type=gpu-process",
"--disable-dev-shm-usage",
"--disable-breakpad",
"--headless",
"--ozone-platform=headless",
"--use-angle=swiftshader-webgl",
"--enable-unsafe-swiftshader",
"--crashpad-handler-pid=1150566",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp",
"--change-stack-guard-on-fork=enable",
"--gpu-preferences=UAAAAAAAAAAgAAAEAAAAAAAAAAAAAGAAAQAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAA",
"--shared-files",
"--field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4",
"--trace-process-track-uuid=3190708988185955192"
]
},
{
"pid": 1150601,
"ppid": 1150558,
"commandLine": "/opt/google/chrome/chrome --type=utility --utility-sub-type=network.mojom.NetworkService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --mute-audio --crashpad-handler-pid=1150566 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4 --trace-process-track-uuid=3190708989122997041",
"arguments": [
"/opt/google/chrome/chrome",
"--type=utility",
"--utility-sub-type=network.mojom.NetworkService",
"--lang=en-US",
"--service-sandbox-type=none",
"--disable-dev-shm-usage",
"--use-angle=swiftshader-webgl",
"--mute-audio",
"--crashpad-handler-pid=1150566",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp",
"--change-stack-guard-on-fork=enable",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4",
"--trace-process-track-uuid=3190708989122997041"
]
},
{
"pid": 1150608,
"ppid": 1150577,
"commandLine": "/opt/google/chrome/chrome --type=utility --utility-sub-type=storage.mojom.StorageService --lang=en-US --service-sandbox-type=utility --disable-dev-shm-usage --use-angle=swiftshader-webgl --mute-audio --crashpad-handler-pid=1150566 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4 --trace-process-track-uuid=3190708990060038890",
"arguments": [
"/opt/google/chrome/chrome",
"--type=utility",
"--utility-sub-type=storage.mojom.StorageService",
"--lang=en-US",
"--service-sandbox-type=utility",
"--disable-dev-shm-usage",
"--use-angle=swiftshader-webgl",
"--mute-audio",
"--crashpad-handler-pid=1150566",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp",
"--change-stack-guard-on-fork=enable",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4",
"--trace-process-track-uuid=3190708990060038890"
]
},
{
"pid": 1150645,
"ppid": 1150425,
"commandLine": "/opt/google/chrome/chrome --type=utility --utility-sub-type=audio.mojom.AudioService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --mute-audio --crashpad-handler-pid=1150439 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4 --trace-process-track-uuid=3190708992871164437",
"arguments": [
"/opt/google/chrome/chrome",
"--type=utility",
"--utility-sub-type=audio.mojom.AudioService",
"--lang=en-US",
"--service-sandbox-type=none",
"--disable-dev-shm-usage",
"--use-angle=swiftshader-webgl",
"--mute-audio",
"--crashpad-handler-pid=1150439",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-FjSsOM",
"--change-stack-guard-on-fork=enable",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,16751779656710944080,9574512793703583948,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,5504656500254648753,8553557855284974703,4",
"--trace-process-track-uuid=3190708992871164437"
]
},
{
"pid": 1150648,
"ppid": 1150577,
"commandLine": "/opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=1150566 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp --change-stack-guard-on-fork=enable --disable-dev-shm-usage --disable-back-forward-cache --disable-background-timer-throttling --disable-breakpad --force-color-profile=srgb --remote-debugging-pipe --allow-pre-commit-input --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --ozone-platform=headless --lang=en-US --num-raster-threads=2 --enable-main-frame-before-activation --renderer-client-id=5 --time-ticks-at-unix-epoch=-1790509733151410 --launch-time-ticks=1459967878786 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4 --trace-process-track-uuid=3190708990997080739",
"arguments": [
"/opt/google/chrome/chrome",
"--type=renderer",
"--crashpad-handler-pid=1150566",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp",
"--change-stack-guard-on-fork=enable",
"--disable-dev-shm-usage",
"--disable-back-forward-cache",
"--disable-background-timer-throttling",
"--disable-breakpad",
"--force-color-profile=srgb",
"--remote-debugging-pipe",
"--allow-pre-commit-input",
"--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4",
"--ozone-platform=headless",
"--lang=en-US",
"--num-raster-threads=2",
"--enable-main-frame-before-activation",
"--renderer-client-id=5",
"--time-ticks-at-unix-epoch=-1790509733151410",
"--launch-time-ticks=1459967878786",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4",
"--trace-process-track-uuid=3190708990997080739"
]
},
{
"pid": 1150738,
"ppid": 1150577,
"commandLine": "/opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=1150566 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp --change-stack-guard-on-fork=enable --disable-dev-shm-usage --disable-back-forward-cache --disable-background-timer-throttling --disable-breakpad --force-color-profile=srgb --remote-debugging-pipe --allow-pre-commit-input --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --ozone-platform=headless --disable-gpu-compositing --lang=en-US --num-raster-threads=2 --enable-main-frame-before-activation --renderer-client-id=7 --time-ticks-at-unix-epoch=-1790509733151410 --launch-time-ticks=1459970002387 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4 --trace-process-track-uuid=3190708992871164437",
"arguments": [
"/opt/google/chrome/chrome",
"--type=renderer",
"--crashpad-handler-pid=1150566",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp",
"--change-stack-guard-on-fork=enable",
"--disable-dev-shm-usage",
"--disable-back-forward-cache",
"--disable-background-timer-throttling",
"--disable-breakpad",
"--force-color-profile=srgb",
"--remote-debugging-pipe",
"--allow-pre-commit-input",
"--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4",
"--ozone-platform=headless",
"--disable-gpu-compositing",
"--lang=en-US",
"--num-raster-threads=2",
"--enable-main-frame-before-activation",
"--renderer-client-id=7",
"--time-ticks-at-unix-epoch=-1790509733151410",
"--launch-time-ticks=1459970002387",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4",
"--trace-process-track-uuid=3190708992871164437"
]
},
{
"pid": 1150764,
"ppid": 1150558,
"commandLine": "/opt/google/chrome/chrome --type=utility --utility-sub-type=audio.mojom.AudioService --lang=en-US --service-sandbox-type=none --disable-dev-shm-usage --use-angle=swiftshader-webgl --mute-audio --crashpad-handler-pid=1150566 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp --change-stack-guard-on-fork=enable --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4 --trace-process-track-uuid=3190708993808206286",
"arguments": [
"/opt/google/chrome/chrome",
"--type=utility",
"--utility-sub-type=audio.mojom.AudioService",
"--lang=en-US",
"--service-sandbox-type=none",
"--disable-dev-shm-usage",
"--use-angle=swiftshader-webgl",
"--mute-audio",
"--crashpad-handler-pid=1150566",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp",
"--change-stack-guard-on-fork=enable",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4",
"--trace-process-track-uuid=3190708993808206286"
]
},
{
"pid": 1151282,
"ppid": 1150577,
"commandLine": "/opt/google/chrome/chrome --type=renderer --crashpad-handler-pid=1150566 --enable-crash-reporter=, --noerrdialogs --user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp --change-stack-guard-on-fork=enable --disable-dev-shm-usage --disable-back-forward-cache --disable-background-timer-throttling --disable-breakpad --force-color-profile=srgb --remote-debugging-pipe --allow-pre-commit-input --blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4 --ozone-platform=headless --disable-gpu-compositing --lang=en-US --num-raster-threads=2 --enable-main-frame-before-activation --renderer-client-id=9 --time-ticks-at-unix-epoch=-1790509733151410 --launch-time-ticks=1459984500539 --shared-files=v8_context_snapshot_data:100 --field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144 --enable-features=CDPScreenshotNewSurface --disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn --variations-seed-version --pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4 --trace-process-track-uuid=3190708994745248135",
"arguments": [
"/opt/google/chrome/chrome",
"--type=renderer",
"--crashpad-handler-pid=1150566",
"--enable-crash-reporter=,",
"--noerrdialogs",
"--user-data-dir=/tmp/playwright_chromiumdev_profile-xUTkdp",
"--change-stack-guard-on-fork=enable",
"--disable-dev-shm-usage",
"--disable-back-forward-cache",
"--disable-background-timer-throttling",
"--disable-breakpad",
"--force-color-profile=srgb",
"--remote-debugging-pipe",
"--allow-pre-commit-input",
"--blink-settings=primaryHoverType=2,availableHoverTypes=2,primaryPointerType=4,availablePointerTypes=4",
"--ozone-platform=headless",
"--disable-gpu-compositing",
"--lang=en-US",
"--num-raster-threads=2",
"--enable-main-frame-before-activation",
"--renderer-client-id=9",
"--time-ticks-at-unix-epoch=-1790509733151410",
"--launch-time-ticks=1459984500539",
"--shared-files=v8_context_snapshot_data:100",
"--field-trial-handle=3,i,14772660448816671451,4345369394915051995,262144",
"--enable-features=CDPScreenshotNewSurface",
"--disable-features=AimEnabled,AutoDeElevate,AvoidUnnecessaryBeforeUnloadCheckSync,BlockOriginHeaderModificationOnRedirect,DestroyProfileOnBrowserClose,DialMediaRouteProvider,GlobalMediaControls,HttpsUpgrades,LensOverlay,MediaRouter,NetworkTimeServiceQuerying,OptimizationHints,PaintHolding,ThirdPartyStoragePartitioning,Translate,msEdgeUpdateLaunchServicesPreferredVersion,msForceBrowserSignIn",
"--variations-seed-version",
"--pseudonymization-salt-handle=7,i,12347905022210369448,8211810852701794377,4",
"--trace-process-track-uuid=3190708994745248135"
]
}
]
}
@@ -0,0 +1,262 @@
{
"preservedAtUtc": "2026-10-14T09:14:01.449054+00:00",
"reportedTool": {
"name": "faster-whisper",
"version": "1.2.1",
"model": "tiny multilingual",
"attribution": "Neo, as supplied in the user request; raw JSON has no tool configuration metadata."
},
"records": [
{
"sourcePath": "/tmp/findword-ambience-candidate-asr.json",
"savedFile": "candidate-scan-original.json",
"sha256": "2f89b954b323d2d1da96ce5927d68771f9f7ec82331c04a3bfdefbdb693b4ef6",
"bytes": 2258,
"sourceModifiedAtUtc": "2026-10-14T08:46:59.249935+00:00",
"scope": "Earlier broad source candidate scan; 12-second candidates for mall, market and cafe, as reported by Neo through the user."
},
{
"sourcePath": "/tmp/findword-ambience-asr.json",
"savedFile": "prior-derivatives-asr-original.json",
"sha256": "ab65f3d21655ee1894d16b2836d8976ba6419457aabc67a2f90a66eb8fa8bb88",
"bytes": 1372,
"sourceModifiedAtUtc": "2026-10-14T08:46:03.032951+00:00",
"scope": "Earlier screening of the pre-refinement eight 12-second derivatives, as reported by Neo through the user."
}
],
"provenanceLimits": "Raw records are preserved byte-for-byte. They do not embed input hashes, model revision, decoder settings or full invocation metadata. Source/derivative associations below are the task context and captured pre-refinement plan/manifest, not independently proven by those raw ASR files. Candidate lang/p values are heuristic guesses (p is rounded in the supplied scan), not speaker identification or validated transcription.",
"contextSources": [
{
"environmentId": "street",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/2/24/Sunday_in_the_city_street_noise2.ogg",
"expectedSourceSha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"sourceBytes": 3414104,
"directMediaDurationSeconds": 264.254694
},
{
"environmentId": "mall",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/f/fd/1_minute_at_the_alexa_mall_in_berlin.ogg",
"expectedSourceSha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"sourceBytes": 1666896,
"directMediaDurationSeconds": 60.05551
},
{
"environmentId": "theater",
"directUrl": "https://cdn.freesound.org/previews/853/853576_14269391-lq.mp3",
"expectedSourceSha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"sourceBytes": 1485015,
"directMediaDurationSeconds": 176.901224
},
{
"environmentId": "department",
"directUrl": "https://cdn.freesound.org/previews/268/268941_40107-lq.mp3",
"expectedSourceSha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"sourceBytes": 2445024,
"directMediaDurationSeconds": 292.872
},
{
"environmentId": "market",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/e/e8/Italia_Palermo_mercato-Ballaro_20161225_122421.ogg",
"expectedSourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"sourceBytes": 622200,
"directMediaDurationSeconds": 76.696961
},
{
"environmentId": "subway",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/d/d3/TTC_Subway_Line_1_Ambience_-_Museum_to_Union_%28Freesound%29.ogg",
"expectedSourceSha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"sourceBytes": 3343901,
"directMediaDurationSeconds": 425.024
},
{
"environmentId": "cafe",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/5/54/Cafe_ambiance.ogg",
"expectedSourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"sourceBytes": 19947952,
"directMediaDurationSeconds": 1200.000998
},
{
"environmentId": "rain",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/8/8c/Urban_Street_on_a_Rainy_Afternoon.flac",
"expectedSourceSha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"sourceBytes": 91187572,
"directMediaDurationSeconds": 1800.0
}
],
"contextPriorDerivatives": [
{
"environmentId": "street",
"file": "street.wav",
"sha256": "a8bffa201b174618955bc51b860167169125304811aabe2086b0bb35b06c3ae1",
"bytes": 576044,
"conversion": {
"startSeconds": 35,
"durationSeconds": 12,
"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",
"file": "mall.wav",
"sha256": "6e9171f549cacadfaeedd57a41c8e2a76b0e789f5c9a97af029a8d3558c9f145",
"bytes": 576044,
"conversion": {
"startSeconds": 20,
"durationSeconds": 12,
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.9603596731816801,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
},
{
"environmentId": "theater",
"file": "theater.wav",
"sha256": "2d6a444fb7874cdf6b2d8a741a69175299b112eb66834912c025437d8277d635",
"bytes": 576044,
"conversion": {
"startSeconds": 45,
"durationSeconds": 12,
"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",
"file": "department.wav",
"sha256": "aa43f3d1d3e7c2b1f8ace24ecbda45d0ea3a031db941c39506dc6c1665b8efa7",
"bytes": 576044,
"conversion": {
"startSeconds": 90,
"durationSeconds": 12,
"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",
"file": "market.wav",
"sha256": "4287e971a12767f70da714e0c1aff30125268f9c3faf07ebfbcc0d2904f4a312",
"bytes": 576044,
"conversion": {
"startSeconds": 30,
"durationSeconds": 12,
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.9408509216036823,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
},
{
"environmentId": "subway",
"file": "subway.wav",
"sha256": "9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f",
"bytes": 576044,
"conversion": {
"startSeconds": 65,
"durationSeconds": 12,
"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",
"file": "cafe.wav",
"sha256": "8db06f3f09bbd8409573ba4874c7ccdd1e7e825c8a61989a4efe66206a66c2d2",
"bytes": 576044,
"conversion": {
"startSeconds": 120,
"durationSeconds": 12,
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"linearGain": 0.6543423611954429,
"targetRms": 0.08,
"peakLimit": 0.85,
"maxGain": 4,
"operations": "excerpt, downmix, resample, linear end fades, bounded linear normalization, WAV encoding"
}
},
{
"environmentId": "rain",
"file": "rain.wav",
"sha256": "f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9",
"bytes": 576044,
"conversion": {
"startSeconds": 180,
"durationSeconds": 12,
"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"
}
}
],
"selection": {
"mall": {
"previousStartSeconds": 20,
"selectedStartSeconds": 36,
"durationSeconds": 12
},
"market": {
"previousStartSeconds": 30,
"selectedStartSeconds": 60,
"durationSeconds": 12
},
"cafe": {
"previousStartSeconds": 120,
"selectedStartSeconds": 180,
"durationSeconds": 12
}
},
"screeningOnly": true,
"textIsVerifiedTranscript": false,
"humanListeningAcceptance": false,
"legalPrivacyClearance": false,
"limitations": "Heuristic ASR output can miss speech and hallucinate text. Neither candidate text nor empty text is a faithful transcript or clearance. Final exact derivatives must be screened separately; human listening acceptance remains unperformed."
}
@@ -0,0 +1,9 @@
{
"afterFailedRuns": [
"05-regeneration.log",
"07-regeneration.log"
],
"all109WavsUnchanged": true,
"manifestUnchanged": true,
"noticesUnchanged": true
}
@@ -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,68 @@
{
"cafe.wav": {
"language": "en",
"probability": 0.20470842719078064,
"segments": [
{
"start": 0.46,
"end": 1.46,
"text": "Thank you."
}
],
"text": "Thank you."
},
"department.wav": {
"language": "en",
"probability": 0.3020564913749695,
"segments": [],
"text": ""
},
"mall.wav": {
"language": "en",
"probability": 0.39363399147987366,
"segments": [
{
"start": 1.2,
"end": 3.2,
"text": "Thanks for watching!"
}
],
"text": "Thanks for watching!"
},
"market.wav": {
"language": "es",
"probability": 0.13287761807441711,
"segments": [
{
"start": 0.0,
"end": 6.86,
"text": "¡Van a la chana! ¡Van a la chana! ¡Van a la chana!"
}
],
"text": "¡Van a la chana! ¡Van a la chana! ¡Van a la chana!"
},
"rain.wav": {
"language": "en",
"probability": 0.3020564913749695,
"segments": [],
"text": ""
},
"street.wav": {
"language": "en",
"probability": 0.3020564913749695,
"segments": [],
"text": ""
},
"subway.wav": {
"language": "en",
"probability": 0.3020564913749695,
"segments": [],
"text": ""
},
"theater.wav": {
"language": "en",
"probability": 0.3020564913749695,
"segments": [],
"text": ""
}
}
@@ -0,0 +1,37 @@
"""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[3]
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')
print(json.dumps(record, ensure_ascii=False, indent=2))
@@ -0,0 +1,254 @@
{
"completedAtUtc": "2026-10-14T09:16:20.220194+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": 60
},
{
"environmentId": "subway",
"sha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"bytes": 3343901,
"directMediaDurationSeconds": 425.024,
"selectedSegmentStartSeconds": 65
},
{
"environmentId": "cafe",
"sha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"bytes": 19947952,
"directMediaDurationSeconds": 1200.000998,
"selectedSegmentStartSeconds": 180
},
{
"environmentId": "rain",
"sha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"bytes": 91187572,
"directMediaDurationSeconds": 1800.0,
"selectedSegmentStartSeconds": 180
}
],
"manifestSha256": "4f21df1c046e545553319889218c29b3efe0da0d49d45d3e09a36fb7759a617c",
"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": 60,
"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",
"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": 180,
"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",
"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,68 @@
"""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
from pathlib import Path
import platform
import sys
import ctranslate2
from faster_whisper import WhisperModel
ROOT = Path(__file__).resolve().parents[3]
EVIDENCE = Path(__file__).resolve().parent
REVISION = 'd90ca5fe260221311c53c58e660288d3deb8d356'
SNAPSHOT = Path.home() / '.cache/huggingface/hub/models--Systran--faster-whisper-tiny/snapshots' / REVISION
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, vad_filter=False)
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']
passed = all(result['segments'] == [] for result in results if result['environmentId'] in required)
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; no source scan, VAD, text editing or manual filtering.',
'device': 'cpu', 'computeType': 'int8', 'cpuThreads': 4, 'numWorkers': 1, 'randomSeed': 0,
'offline': True, 'parameters': parameters, 'manifestSha256': manifest_hash,
'scriptSha256': sha(Path(__file__)), 'command': '/tmp/findword-asr-venv/bin/python .agent/evidence-v0.2.3/privacy-screening/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.'},
'requiredEmptyEnvironmentIds': required, 'requiredEmptyPassed': passed, 'files': results}
with (EVIDENCE / 'final-asr.json').open('x') as stream:
stream.write(json.dumps(report, ensure_ascii=False, indent=2, allow_nan=False) + '\n')
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)
@@ -0,0 +1,78 @@
"""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[3]
EVIDENCE = Path(__file__).resolve().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, vad_filter=True)
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']
passed = all(result['segments'] == [] for result in results if result['environmentId'] in required)
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/screen-with-vad-json.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.'},
'supplementaryNoVadRun': {'file': 'no-vad-asr.json', 'sha256': sha(EVIDENCE / 'no-vad-asr.json'), 'requiredEmptyPassed': False, 'explanation': 'The separate unfiltered run emitted candidate segments for all three changed excerpts. The primary VAD-enabled screen does not supersede or invalidate that evidence. Neo original VAD/decoder settings were not recorded, so methodological equivalence is unverified.'}, '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)
@@ -0,0 +1,68 @@
"""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
from pathlib import Path
import platform
import sys
import ctranslate2
from faster_whisper import WhisperModel
ROOT = Path(__file__).resolve().parents[3]
EVIDENCE = Path(__file__).resolve().parent
REVISION = 'd90ca5fe260221311c53c58e660288d3deb8d356'
SNAPSHOT = Path.home() / '.cache/huggingface/hub/models--Systran--faster-whisper-tiny/snapshots' / REVISION
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, vad_filter=True)
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']
passed = all(result['segments'] == [] for result in results if result['environmentId'] in required)
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,
'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/screen-with-vad.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.'},
'supplementaryNoVadRun': {'file': 'no-vad-asr.json', 'sha256': sha(EVIDENCE / 'no-vad-asr.json'), 'requiredEmptyPassed': False, 'explanation': 'The separate unfiltered run emitted candidate segments for all three changed excerpts. The primary VAD-enabled screen does not supersede or invalidate that evidence. Neo original VAD/decoder settings were not recorded, so methodological equivalence is unverified.'}, 'requiredEmptyEnvironmentIds': required, 'requiredEmptyPassed': passed, 'files': results}
with (EVIDENCE / 'final-asr.json').open('x') as stream:
stream.write(json.dumps(report, ensure_ascii=False, indent=2, allow_nan=False) + '\n')
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)
@@ -0,0 +1,48 @@
[
{
"method": "sample_trim_continuous_pts",
"command": [
"ffmpeg",
"-v",
"error",
"-i",
"/tmp/findword-ambience-sources/cafe.ogg",
"-af",
"aresample=24000,atrim=start_sample=4320000:end_sample=4608000,asetpts=N/SR/TB",
"-t",
"12",
"-ar",
"24000",
"-ac",
"1",
"-f",
"f32le",
"pipe:1"
],
"frames": 288000,
"exitCode": 0,
"stderr": ""
},
{
"method": "sample_trim_no_duration_limit",
"command": [
"ffmpeg",
"-v",
"error",
"-i",
"/tmp/findword-ambience-sources/cafe.ogg",
"-af",
"aresample=24000,atrim=start_sample=4320000:end_sample=4608000,asetpts=PTS-STARTPTS",
"-ar",
"24000",
"-ac",
"1",
"-f",
"f32le",
"pipe:1"
],
"frames": 288000,
"exitCode": 0,
"stderr": ""
}
]
@@ -0,0 +1,152 @@
[
{
"environmentId": "market",
"method": "input_seek",
"command": [
"ffmpeg",
"-v",
"error",
"-ss",
"60",
"-i",
"/tmp/findword-ambience-sources/market.ogg",
"-t",
"12",
"-ar",
"24000",
"-ac",
"1",
"-f",
"f32le",
"pipe:1"
],
"exitCode": 0,
"frames": 287958,
"stderr": ""
},
{
"environmentId": "market",
"method": "output_seek",
"command": [
"ffmpeg",
"-v",
"error",
"-i",
"/tmp/findword-ambience-sources/market.ogg",
"-ss",
"60",
"-t",
"12",
"-ar",
"24000",
"-ac",
"1",
"-f",
"f32le",
"pipe:1"
],
"exitCode": 0,
"frames": 288000,
"stderr": ""
},
{
"environmentId": "market",
"method": "sample_trim",
"command": [
"ffmpeg",
"-v",
"error",
"-i",
"/tmp/findword-ambience-sources/market.ogg",
"-af",
"aresample=24000,atrim=start_sample=1440000:end_sample=1728000,asetpts=PTS-STARTPTS",
"-t",
"12",
"-ar",
"24000",
"-ac",
"1",
"-f",
"f32le",
"pipe:1"
],
"exitCode": 0,
"frames": 288000,
"stderr": ""
},
{
"environmentId": "cafe",
"method": "input_seek",
"command": [
"ffmpeg",
"-v",
"error",
"-ss",
"180",
"-i",
"/tmp/findword-ambience-sources/cafe.ogg",
"-t",
"12",
"-ar",
"24000",
"-ac",
"1",
"-f",
"f32le",
"pipe:1"
],
"exitCode": 0,
"frames": 287809,
"stderr": ""
},
{
"environmentId": "cafe",
"method": "output_seek",
"command": [
"ffmpeg",
"-v",
"error",
"-i",
"/tmp/findword-ambience-sources/cafe.ogg",
"-ss",
"180",
"-t",
"12",
"-ar",
"24000",
"-ac",
"1",
"-f",
"f32le",
"pipe:1"
],
"exitCode": 0,
"frames": 287809,
"stderr": ""
},
{
"environmentId": "cafe",
"method": "sample_trim",
"command": [
"ffmpeg",
"-v",
"error",
"-i",
"/tmp/findword-ambience-sources/cafe.ogg",
"-af",
"aresample=24000,atrim=start_sample=4320000:end_sample=4608000,asetpts=PTS-STARTPTS",
"-t",
"12",
"-ar",
"24000",
"-ac",
"1",
"-f",
"f32le",
"pipe:1"
],
"exitCode": 0,
"frames": 287809,
"stderr": ""
}
]
@@ -0,0 +1,78 @@
{
"completedAtUtc": "2026-10-14T09:27:46.598114+00:00",
"implementationAndAtomicRegenerationComplete": true,
"allAcceptanceCriteriaPassed": false,
"blockingCriterion": "market and cafe final WAVs still emit ASR segments; requiredEmptyPassed=false. Exact Neo ASR decoder/VAD settings were not supplied.",
"checks": {
"lint": {
"exitCode": 0,
"log": "18-final-lint.log"
},
"unit": {
"exitCode": 1,
"passed": 123,
"failed": 1,
"skipped": 0,
"log": "17-unit.log",
"failure": "Final ASR zero-segment acceptance"
},
"python": {
"exitCode": 0,
"passed": 36,
"log": "12-python.log"
},
"build": {
"exitCode": 0,
"log": "12-build.log"
},
"audit": {
"exitCode": 0,
"vulnerabilities": 0,
"evidence": "npm-audit.json"
},
"sandboxedChrome": {
"exitCode": 0,
"passed": 30,
"failed": 0,
"skipped": 0,
"flaky": 0,
"evidence": "browser-results.json"
},
"diffCheck": {
"exitCode": 0
}
},
"asr": {
"evidence": "final-asr.json",
"method": "faster-whisper 1.2.1 tiny multilingual CPU int8; built-in VAD and decoding defaults",
"segmentsByEnvironment": {
"street": 0,
"mall": 0,
"theater": 0,
"department": 0,
"market": 3,
"subway": 0,
"cafe": 1,
"rain": 0
},
"requiredEmptyPassed": false,
"ungatedEvidence": "no-vad-asr.json",
"screeningOnly": true,
"humanListeningAcceptance": false,
"legalPrivacyClearance": false
},
"preservation": {
"voiceWavsUnchanged": 101,
"ambienceWavsUnchanged": 5,
"ambienceWavsChanged": [
"public/ambience/cafe.wav",
"public/ambience/mall.wav",
"public/ambience/market.wav"
],
"priorAgentFilesUnchanged": 397,
"gitTrackedHistoricalAgentFilesUnchanged": 180,
"evidence": "preservation.json"
},
"head": "c92660b514f7af8eb556d3fa5c0fc80e4bdd4cf5",
"commitPushMergeTagDeployPerformed": false
}