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,27 @@
# Privacy screening evidence — current run and immutable history
The current report is [final-asr.json](final-asr.json): mall 36–48s, market 24–36s,
cafe 0–12s. All three return zero segments with default VAD and
`requiredEmptyPassed=true`. `humanListeningAcceptance=false` and
`legalPrivacyClearance=false` remain explicit.
Current generation, TDD RED/GREEN, verification logs, browser artifacts and preservation
checks are under [retry-market24-cafe0/](retry-market24-cafe0/).
[validation-summary.json](validation-summary.json) summarizes the latest completed checks.
The previous attempt at mall 36s, market 60s and cafe 180s failed the release screen.
All 89 screening files from that attempt were copied byte-for-byte into
[prior-attempt-market60-cafe180/](prior-attempt-market60-cafe180/), made read-only,
and pinned in the retry baseline. Its [final-asr.json](prior-attempt-market60-cafe180/final-asr.json)
still says `requiredEmptyPassed=false` with market 3 / cafe 1 segments.
The old logs and supporting reports also remain at their original paths; except for the
current `final-asr.json` and `validation-summary.json`, existing root-level files describe
that historical attempt, not the current result. A historical `GREEN` filename is not
proof of success; its actual exit code and recorded scope determine its meaning.
[no-vad-asr.json](no-vad-asr.json) is unchanged historical evidence from mall 36s,
market 60s and cafe 180s. It emitted text that may be hallucinated, does not screen the
replacement market/cafe WAVs, and does not override the specified VAD gate. Neither
no-VAD text nor empty VAD results proves absence of speech/music or constitutes human
listening acceptance or legal/privacy clearance. The earlier candidate and derivative
ASR files and their provenance are also unchanged.
@@ -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;
```
File diff suppressed because it is too large Load Diff
@@ -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"
]
}
]
}
File diff suppressed because it is too large Load Diff
@@ -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
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -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
}
}
}
File diff suppressed because it is too large Load Diff
@@ -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

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