fix: normalize ambience loudness for v0.2.5

This commit is contained in:
oz
2026-10-14 12:12:13 +00:00
parent 812540c743
commit 91aff66445
390 changed files with 97709 additions and 257 deletions
@@ -0,0 +1,152 @@
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) ... {
"measurementFilter": "ebur128=peak=true",
"targetLUFS": -32.5,
"truePeakCeilingDBTP": -6.0,
"spreadLU": 2.0,
"files": {
"cafe": {
"integratedLUFS": -31.9,
"truePeakDBTP": -17.6,
"loudnessRangeLU": 0.5,
"thresholdLUFS": -41.9
},
"department": {
"integratedLUFS": -32.1,
"truePeakDBTP": -16.2,
"loudnessRangeLU": 4.2,
"thresholdLUFS": -42.1
},
"mall": {
"integratedLUFS": -32.0,
"truePeakDBTP": -11.7,
"loudnessRangeLU": 1.4,
"thresholdLUFS": -42.0
},
"market": {
"integratedLUFS": -32.8,
"truePeakDBTP": -6.6,
"loudnessRangeLU": 6.5,
"thresholdLUFS": -42.8
},
"rain": {
"integratedLUFS": -33.5,
"truePeakDBTP": -13.1,
"loudnessRangeLU": 8.4,
"thresholdLUFS": -43.5
},
"street": {
"integratedLUFS": -31.8,
"truePeakDBTP": -9.5,
"loudnessRangeLU": 4.6,
"thresholdLUFS": -41.8
},
"subway": {
"integratedLUFS": -31.5,
"truePeakDBTP": -15.3,
"loudnessRangeLU": 4.9,
"thresholdLUFS": -41.5
},
"theater": {
"integratedLUFS": -31.9,
"truePeakDBTP": -15.4,
"loudnessRangeLU": 1.0,
"thresholdLUFS": -41.9
}
}
}
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='cafe') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='department') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='mall') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='market') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='rain') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='street') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='subway') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='theater') ... FAIL
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) ... FAIL
test_manifest_records_linear_gain_and_exact_ebur128_measurements (test_loudness_audio.FinalLoudness.test_manifest_records_linear_gain_and_exact_ebur128_measurements) ... FAIL
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='cafe')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 47, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["integratedLUFS"] - TARGET), 0.2 + 1e-9)
AssertionError: 0.6000000000000014 not less than or equal to 0.200000001
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='department')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 47, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["integratedLUFS"] - TARGET), 0.2 + 1e-9)
AssertionError: 0.3999999999999986 not less than or equal to 0.200000001
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='mall')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 47, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["integratedLUFS"] - TARGET), 0.2 + 1e-9)
AssertionError: 0.5 not less than or equal to 0.200000001
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='market')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 47, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["integratedLUFS"] - TARGET), 0.2 + 1e-9)
AssertionError: 0.29999999999999716 not less than or equal to 0.200000001
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='rain')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 47, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["integratedLUFS"] - TARGET), 0.2 + 1e-9)
AssertionError: 1.0 not less than or equal to 0.200000001
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='street')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 47, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["integratedLUFS"] - TARGET), 0.2 + 1e-9)
AssertionError: 0.6999999999999993 not less than or equal to 0.200000001
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='subway')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 47, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["integratedLUFS"] - TARGET), 0.2 + 1e-9)
AssertionError: 1.0 not less than or equal to 0.200000001
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) (environment='theater')
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 47, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(abs(row["integratedLUFS"] - TARGET), 0.2 + 1e-9)
AssertionError: 0.6000000000000014 not less than or equal to 0.200000001
======================================================================
FAIL: test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 50, in test_final_wavs_meet_fixed_loudness_and_true_peak
self.assertLessEqual(spread, 0.4 + 1e-9)
AssertionError: 2.0 not less than or equal to 0.40000000100000005
======================================================================
FAIL: test_manifest_records_linear_gain_and_exact_ebur128_measurements (test_loudness_audio.FinalLoudness.test_manifest_records_linear_gain_and_exact_ebur128_measurements)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_loudness_audio.py", line 59, in test_manifest_records_linear_gain_and_exact_ebur128_measurements
self.assertEqual(settings[key], value)
AssertionError: -32.0 != -32.5
----------------------------------------------------------------------
Ran 2 tests in 0.837s
FAILED (failures=10)
@@ -0,0 +1,87 @@
test_correction_restarts_from_identical_source_and_records_both_passes (test_linear_normalization.LinearNormalization.test_correction_restarts_from_identical_source_and_records_both_passes) ... ERROR
test_each_corrective_gain_is_peak_checked_before_conversion (test_linear_normalization.LinearNormalization.test_each_corrective_gain_is_peak_checked_before_conversion) ... ERROR
test_final_peak_and_nonfinite_measurement_are_rejected (test_linear_normalization.LinearNormalization.test_final_peak_and_nonfinite_measurement_are_rejected) ...
test_final_peak_and_nonfinite_measurement_are_rejected (test_linear_normalization.LinearNormalization.test_final_peak_and_nonfinite_measurement_are_rejected) (invalid={'integratedLUFS': -32.5, 'truePeakDBTP': -6.1, 'loudnessRangeLU': 1.0, 'thresholdLUFS': -42.5}) ... ERROR
test_final_peak_and_nonfinite_measurement_are_rejected (test_linear_normalization.LinearNormalization.test_final_peak_and_nonfinite_measurement_are_rejected) (invalid={'integratedLUFS': nan, 'truePeakDBTP': -15, 'loudnessRangeLU': 1.0, 'thresholdLUFS': nan}) ... ERROR
test_final_peak_and_nonfinite_measurement_are_rejected (test_linear_normalization.LinearNormalization.test_final_peak_and_nonfinite_measurement_are_rejected) (invalid={'integratedLUFS': -32.5, 'truePeakDBTP': inf, 'loudnessRangeLU': 1.0, 'thresholdLUFS': -42.5}) ... ERROR
test_nonconvergence_is_bounded_and_fails (test_linear_normalization.LinearNormalization.test_nonconvergence_is_bounded_and_fails) ... ERROR
test_parser_rejects_missing_nonfinite_or_partial_summary (test_linear_normalization.LinearNormalization.test_parser_rejects_missing_nonfinite_or_partial_summary) ... ok
test_real_output_is_only_scalar_gain_with_pcm16_rounding (test_linear_normalization.LinearNormalization.test_real_output_is_only_scalar_gain_with_pcm16_rounding) ... ERROR
test_unsafe_predicted_peak_is_rejected_before_volume_conversion (test_linear_normalization.LinearNormalization.test_unsafe_predicted_peak_is_rejected_before_volume_conversion) ... ERROR
======================================================================
ERROR: test_correction_restarts_from_identical_source_and_records_both_passes (test_linear_normalization.LinearNormalization.test_correction_restarts_from_identical_source_and_records_both_passes)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_linear_normalization.py", line 52, in test_correction_restarts_from_identical_source_and_records_both_passes
result = audio.normalize_pcm(self.pcm, self.target)
^^^^^^^^^^^^^^^^^^^
AttributeError: module 'ambience_audio' has no attribute 'normalize_pcm'
======================================================================
ERROR: test_each_corrective_gain_is_peak_checked_before_conversion (test_linear_normalization.LinearNormalization.test_each_corrective_gain_is_peak_checked_before_conversion)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_linear_normalization.py", line 68, in test_each_corrective_gain_is_peak_checked_before_conversion
audio.normalize_pcm(self.pcm, self.target)
^^^^^^^^^^^^^^^^^^^
AttributeError: module 'ambience_audio' has no attribute 'normalize_pcm'
======================================================================
ERROR: test_final_peak_and_nonfinite_measurement_are_rejected (test_linear_normalization.LinearNormalization.test_final_peak_and_nonfinite_measurement_are_rejected) (invalid={'integratedLUFS': -32.5, 'truePeakDBTP': -6.1, 'loudnessRangeLU': 1.0, 'thresholdLUFS': -42.5})
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_linear_normalization.py", line 74, in test_final_peak_and_nonfinite_measurement_are_rejected
with self.assertRaises(ValueError): audio.normalize_pcm(self.pcm, self.target)
^^^^^^^^^^^^^^^^^^^
AttributeError: module 'ambience_audio' has no attribute 'normalize_pcm'
======================================================================
ERROR: test_final_peak_and_nonfinite_measurement_are_rejected (test_linear_normalization.LinearNormalization.test_final_peak_and_nonfinite_measurement_are_rejected) (invalid={'integratedLUFS': nan, 'truePeakDBTP': -15, 'loudnessRangeLU': 1.0, 'thresholdLUFS': nan})
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_linear_normalization.py", line 74, in test_final_peak_and_nonfinite_measurement_are_rejected
with self.assertRaises(ValueError): audio.normalize_pcm(self.pcm, self.target)
^^^^^^^^^^^^^^^^^^^
AttributeError: module 'ambience_audio' has no attribute 'normalize_pcm'
======================================================================
ERROR: test_final_peak_and_nonfinite_measurement_are_rejected (test_linear_normalization.LinearNormalization.test_final_peak_and_nonfinite_measurement_are_rejected) (invalid={'integratedLUFS': -32.5, 'truePeakDBTP': inf, 'loudnessRangeLU': 1.0, 'thresholdLUFS': -42.5})
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_linear_normalization.py", line 74, in test_final_peak_and_nonfinite_measurement_are_rejected
with self.assertRaises(ValueError): audio.normalize_pcm(self.pcm, self.target)
^^^^^^^^^^^^^^^^^^^
AttributeError: module 'ambience_audio' has no attribute 'normalize_pcm'
======================================================================
ERROR: test_nonconvergence_is_bounded_and_fails (test_linear_normalization.LinearNormalization.test_nonconvergence_is_bounded_and_fails)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_linear_normalization.py", line 62, in test_nonconvergence_is_bounded_and_fails
audio.normalize_pcm(self.pcm, self.target)
^^^^^^^^^^^^^^^^^^^
AttributeError: module 'ambience_audio' has no attribute 'normalize_pcm'
======================================================================
ERROR: test_real_output_is_only_scalar_gain_with_pcm16_rounding (test_linear_normalization.LinearNormalization.test_real_output_is_only_scalar_gain_with_pcm16_rounding)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_linear_normalization.py", line 31, in test_real_output_is_only_scalar_gain_with_pcm16_rounding
result = audio.normalize_pcm(self.pcm, self.target)
^^^^^^^^^^^^^^^^^^^
AttributeError: module 'ambience_audio' has no attribute 'normalize_pcm'
======================================================================
ERROR: test_unsafe_predicted_peak_is_rejected_before_volume_conversion (test_linear_normalization.LinearNormalization.test_unsafe_predicted_peak_is_rejected_before_volume_conversion)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/hermes/worktrees/find-word-v0.2.5/tests/python/test_linear_normalization.py", line 45, in test_unsafe_predicted_peak_is_rejected_before_volume_conversion
audio.normalize_pcm(self.pcm, self.target)
^^^^^^^^^^^^^^^^^^^
AttributeError: module 'ambience_audio' has no attribute 'normalize_pcm'
----------------------------------------------------------------------
Ran 7 tests in 0.277s
FAILED (errors=8)
@@ -0,0 +1,26 @@
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
❯ tests/ambience.test.ts (9 tests | 1 failed) 911ms
× v0.2.5 최종 WAV의 동일 ASR VAD gate는 requiredEmptyPassed=true여야 한다 5ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/ambience.test.ts > v0.2.5 최종 WAV의 동일 ASR VAD gate는 requiredEmptyPassed=true여야 한다
Error: ENOENT: no such file or directory, open '.agent/evidence-v0.2.5/review-fixes/final-asr.json'
❯ tests/ambience.test.ts:450:32
448| // 수정본은 정확한 새 WAV로 같은 VAD gate를 통과해야 하며 과거 결과를 승계하지 않는다.
449| it("v0.2.5 최종 WAV의 동일 ASR VAD gate는 requiredEmptyPassed=true여야 한다", ()…
450| const screening = JSON.parse(readFileSync(".agent/evidence-v0.2.5/re…
| ^
451| const prior = JSON.parse(readFileSync(".agent/evidence-v0.2.5/final-…
452| const bytes = readFileSync("public/ambience/manifest.json");
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯
Test Files 1 failed (1)
Tests 1 failed | 8 passed (9)
Start at 11:02:07
Duration 1.21s (tests 84%, setup 9%, transform 5%, import 1%)
@@ -0,0 +1,12 @@
test_correction_restarts_from_identical_source_and_records_both_passes (test_linear_normalization.LinearNormalization.test_correction_restarts_from_identical_source_and_records_both_passes) ... ok
test_each_corrective_gain_is_peak_checked_before_conversion (test_linear_normalization.LinearNormalization.test_each_corrective_gain_is_peak_checked_before_conversion) ... ok
test_final_peak_and_nonfinite_measurement_are_rejected (test_linear_normalization.LinearNormalization.test_final_peak_and_nonfinite_measurement_are_rejected) ... ok
test_nonconvergence_is_bounded_and_fails (test_linear_normalization.LinearNormalization.test_nonconvergence_is_bounded_and_fails) ... ok
test_parser_rejects_missing_nonfinite_or_partial_summary (test_linear_normalization.LinearNormalization.test_parser_rejects_missing_nonfinite_or_partial_summary) ... ok
test_real_output_is_only_scalar_gain_with_pcm16_rounding (test_linear_normalization.LinearNormalization.test_real_output_is_only_scalar_gain_with_pcm16_rounding) ... ok
test_unsafe_predicted_peak_is_rejected_before_volume_conversion (test_linear_normalization.LinearNormalization.test_unsafe_predicted_peak_is_rejected_before_volume_conversion) ... ok
----------------------------------------------------------------------
Ran 7 tests in 1.092s
OK
@@ -0,0 +1,4 @@
{
"files": 8,
"bytes": 4608352
}
@@ -0,0 +1,63 @@
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) ... {
"measurementFilter": "ebur128=peak=true",
"targetLUFS": -32.5,
"truePeakCeilingDBTP": -6.0,
"spreadLU": 0.0,
"files": {
"cafe": {
"integratedLUFS": -32.5,
"truePeakDBTP": -18.2,
"loudnessRangeLU": 0.5,
"thresholdLUFS": -42.5
},
"department": {
"integratedLUFS": -32.5,
"truePeakDBTP": -16.6,
"loudnessRangeLU": 4.2,
"thresholdLUFS": -42.5
},
"mall": {
"integratedLUFS": -32.5,
"truePeakDBTP": -12.2,
"loudnessRangeLU": 1.4,
"thresholdLUFS": -42.5
},
"market": {
"integratedLUFS": -32.5,
"truePeakDBTP": -6.2,
"loudnessRangeLU": 6.5,
"thresholdLUFS": -42.4
},
"rain": {
"integratedLUFS": -32.5,
"truePeakDBTP": -12.1,
"loudnessRangeLU": 8.4,
"thresholdLUFS": -42.5
},
"street": {
"integratedLUFS": -32.5,
"truePeakDBTP": -10.2,
"loudnessRangeLU": 4.6,
"thresholdLUFS": -42.5
},
"subway": {
"integratedLUFS": -32.5,
"truePeakDBTP": -16.2,
"loudnessRangeLU": 4.9,
"thresholdLUFS": -42.5
},
"theater": {
"integratedLUFS": -32.5,
"truePeakDBTP": -16.1,
"loudnessRangeLU": 1.0,
"thresholdLUFS": -42.5
}
}
}
ok
test_manifest_records_linear_gain_and_exact_ebur128_measurements (test_loudness_audio.FinalLoudness.test_manifest_records_linear_gain_and_exact_ebur128_measurements) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.806s
OK
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,9 @@
{"environmentId": "street", "sha256": "dace0969087539e5b67fb6fac11b759e81626574230ca7f8d2feb484753656a8", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "mall", "sha256": "a0a135e319ed70f55b03c6e266fb047e53db8008277a6ba8b855a05a1b82662f", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "theater", "sha256": "634fc25e8c4e9dcbab97688bc4c0ef9b0299cc7c4c921781a70740aabe46b900", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "department", "sha256": "93e5c23bff2b19716dd21111746837a4df8c52d4b88c6874e57828d09ca5507e", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "market", "sha256": "7178307c48c192ac396dcd3c880c377bf56b45e829b459b1feca9f986437e632", "language": "nn", "languageProbability": 0.09340465068817139, "segments": [{"id": 1, "seek": 0, "start": 10.45, "end": 12.45, "text": " Let's go, let's go, let's go.", "tokens": [50364, 961, 311, 352, 11, 718, 311, 352, 11, 718, 311, 352, 13, 50464], "avg_logprob": -0.7624037981033325, "compression_ratio": 1.3181818181818181, "no_speech_prob": 0.492189884185791, "words": null, "temperature": 0.0}], "text": " Let's go, let's go, let's go."}
{"environmentId": "subway", "sha256": "e85cf77a9baa7560fb09966c4eda3b128b92647bc4c54c417a29b4e0f4ac129f", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "cafe", "sha256": "864a81571a2e25a99d6408aa282570e7996c7ace432cf4f4f294677ea5bcad63", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
{"environmentId": "rain", "sha256": "1842a717e6c77811cb6d6cb09d364e8ef644d50e6beb97d3d187c96e95d85784", "language": "en", "languageProbability": 0.3020564913749695, "segments": [], "text": ""}
Required changed excerpts produced ASR segments; screening criterion failed.
@@ -0,0 +1,34 @@
Collecting pyloudnorm==0.2.0
Using cached pyloudnorm-0.2.0-py3-none-any.whl.metadata (6.6 kB)
Collecting soundfile==0.13.1
Downloading soundfile-0.13.1-py2.py3-none-manylinux_2_28_x86_64.whl.metadata (16 kB)
Collecting numpy==2.2.6
Downloading numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (62 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.0/62.0 kB 1.9 MB/s eta 0:00:00
Collecting scipy==1.15.3
Downloading scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.0/62.0 kB 4.3 MB/s eta 0:00:00
Collecting cffi==1.17.1
Downloading cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.5 kB)
Collecting pycparser==2.22
Downloading pycparser-2.22-py3-none-any.whl.metadata (943 bytes)
Collecting future==1.0.0
Downloading future-1.0.0-py3-none-any.whl.metadata (4.0 kB)
Using cached pyloudnorm-0.2.0-py3-none-any.whl (10 kB)
Downloading soundfile-0.13.1-py2.py3-none-manylinux_2_28_x86_64.whl (1.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3/1.3 MB 34.8 MB/s eta 0:00:00
Downloading numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.8 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.8/16.8 MB 52.1 MB/s eta 0:00:00
Downloading scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (37.7 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 37.7/37.7 MB 43.6 MB/s eta 0:00:00
Downloading cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (467 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 467.2/467.2 kB 25.2 MB/s eta 0:00:00
Downloading pycparser-2.22-py3-none-any.whl (117 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 117.6/117.6 kB 8.7 MB/s eta 0:00:00
Downloading future-1.0.0-py3-none-any.whl (491 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 491.3/491.3 kB 25.4 MB/s eta 0:00:00
Installing collected packages: pycparser, numpy, future, scipy, cffi, soundfile, pyloudnorm
Successfully installed cffi-1.17.1 future-1.0.0 numpy-2.2.6 pycparser-2.22 pyloudnorm-0.2.0 scipy-1.15.3 soundfile-0.13.1
[notice] A new release of pip is available: 24.0 -> 26.2.1
[notice] To update, run: python3.11 -m pip install --upgrade pip
@@ -0,0 +1,3 @@
scripts/check-build.mjs 102ms
tests/ambience.test.ts 154ms
tests/build.test.ts 46ms
@@ -0,0 +1,521 @@
test_convert_format_fade_normalization_and_reproducibility (test_ambience_audio.AmbienceConversion.test_convert_format_fade_normalization_and_reproducibility)
스테레오 48kHz 입력을 실제로 내려 섞고 길이·양끝·안전 피크를 확인한다. ... ok
test_short_input_seek_retries_full_decode_without_padding_or_truncating (test_ambience_audio.AmbienceConversion.test_short_input_seek_retries_full_decode_without_padding_or_truncating) ... ok
test_silence_fails_before_publishing (test_ambience_audio.AmbienceConversion.test_silence_fails_before_publishing)
무음을 정상 현장 녹음으로 포장하지 않는다. ... ok
test_actual_target_or_true_peak_violation_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_actual_target_or_true_peak_violation_preserves_prior_directory)
manifest가 정상이라고 주장해도 별도 실측 위반은 공개하지 않는다. ... ok
test_all_eight_assets_validated_before_publication (test_ambience_audio.AtomicPublication.test_all_eight_assets_validated_before_publication) ... ok
test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem (test_ambience_audio.AtomicPublication.test_atomic_success_removes_stale_files_and_stages_notice_on_same_filesystem) ... ok
test_conversion_cannot_override_approved_segment (test_ambience_audio.AtomicPublication.test_conversion_cannot_override_approved_segment) ... ok
test_conversion_failure_and_keyboard_interrupt_preserve_prior_directory (test_ambience_audio.AtomicPublication.test_conversion_failure_and_keyboard_interrupt_preserve_prior_directory) ... ok
test_exchange_failure_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_exchange_failure_preserves_prior_directory) ... ok
test_first_publication_and_real_exchange (test_ambience_audio.AtomicPublication.test_first_publication_and_real_exchange) ... ok
test_manifest_and_notice_write_failures_preserve_prior_directory (test_ambience_audio.AtomicPublication.test_manifest_and_notice_write_failures_preserve_prior_directory) ... ok
test_plan_alone_controls_selection_and_is_preserved_in_manifest_and_notice (test_ambience_audio.AtomicPublication.test_plan_alone_controls_selection_and_is_preserved_in_manifest_and_notice) ... ok
test_readers_observe_whole_directory_during_real_exchange (test_ambience_audio.AtomicPublication.test_readers_observe_whole_directory_during_real_exchange) ... ok
test_real_loudness_measurement_failure_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_real_loudness_measurement_failure_preserves_prior_directory)
최종 실측 FFmpeg만 실패시켜 원자 교환 전 실패 전파를 확인한다. ... ok
test_sigterm_before_commit_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_sigterm_before_commit_preserves_prior_directory) ... ok
test_staged_manifest_notice_and_inventory_tampering_are_rejected (test_ambience_audio.AtomicPublication.test_staged_manifest_notice_and_inventory_tampering_are_rejected) ... ok
test_symlink_output_is_rejected_before_conversion (test_ambience_audio.AtomicPublication.test_symlink_output_is_rejected_before_conversion) ... ok
test_unsupported_atomic_exchange_preserves_prior_directory (test_ambience_audio.AtomicPublication.test_unsupported_atomic_exchange_preserves_prior_directory) ... ok
test_all_sources_checked_before_first_conversion (test_ambience_audio.SourceGuard.test_all_sources_checked_before_first_conversion) ... ok
test_invalid_segment_plan_fails_before_any_conversion_without_mutation (test_ambience_audio.SourceGuard.test_invalid_segment_plan_fails_before_any_conversion_without_mutation) ... ok
test_correction_restarts_from_identical_source_and_records_both_passes (test_linear_normalization.LinearNormalization.test_correction_restarts_from_identical_source_and_records_both_passes) ... ok
test_each_corrective_gain_is_peak_checked_before_conversion (test_linear_normalization.LinearNormalization.test_each_corrective_gain_is_peak_checked_before_conversion) ... ok
test_final_peak_and_nonfinite_measurement_are_rejected (test_linear_normalization.LinearNormalization.test_final_peak_and_nonfinite_measurement_are_rejected) ... ok
test_nonconvergence_is_bounded_and_fails (test_linear_normalization.LinearNormalization.test_nonconvergence_is_bounded_and_fails) ... ok
test_parser_rejects_missing_nonfinite_or_partial_summary (test_linear_normalization.LinearNormalization.test_parser_rejects_missing_nonfinite_or_partial_summary) ... ok
test_real_output_is_only_scalar_gain_with_pcm16_rounding (test_linear_normalization.LinearNormalization.test_real_output_is_only_scalar_gain_with_pcm16_rounding) ... ok
test_unsafe_predicted_peak_is_rejected_before_volume_conversion (test_linear_normalization.LinearNormalization.test_unsafe_predicted_peak_is_rejected_before_volume_conversion) ... ok
test_final_wavs_meet_fixed_loudness_and_true_peak (test_loudness_audio.FinalLoudness.test_final_wavs_meet_fixed_loudness_and_true_peak) ... {
"measurementFilter": "ebur128=peak=true",
"targetLUFS": -32.5,
"truePeakCeilingDBTP": -6.0,
"spreadLU": 0.0,
"files": {
"cafe": {
"integratedLUFS": -32.5,
"truePeakDBTP": -18.2,
"loudnessRangeLU": 0.5,
"thresholdLUFS": -42.5
},
"department": {
"integratedLUFS": -32.5,
"truePeakDBTP": -16.6,
"loudnessRangeLU": 4.2,
"thresholdLUFS": -42.5
},
"mall": {
"integratedLUFS": -32.5,
"truePeakDBTP": -12.2,
"loudnessRangeLU": 1.4,
"thresholdLUFS": -42.5
},
"market": {
"integratedLUFS": -32.5,
"truePeakDBTP": -6.2,
"loudnessRangeLU": 6.5,
"thresholdLUFS": -42.4
},
"rain": {
"integratedLUFS": -32.5,
"truePeakDBTP": -12.1,
"loudnessRangeLU": 8.4,
"thresholdLUFS": -42.5
},
"street": {
"integratedLUFS": -32.5,
"truePeakDBTP": -10.2,
"loudnessRangeLU": 4.6,
"thresholdLUFS": -42.5
},
"subway": {
"integratedLUFS": -32.5,
"truePeakDBTP": -16.2,
"loudnessRangeLU": 4.9,
"thresholdLUFS": -42.5
},
"theater": {
"integratedLUFS": -32.5,
"truePeakDBTP": -16.1,
"loudnessRangeLU": 1.0,
"thresholdLUFS": -42.5
}
}
}
ok
test_manifest_records_linear_gain_and_exact_ebur128_measurements (test_loudness_audio.FinalLoudness.test_manifest_records_linear_gain_and_exact_ebur128_measurements) ... 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 47 tests in 22.048s
OK
@@ -0,0 +1,95 @@
{
"method": "Independent pyloudnorm BS.1770 K-weighting, 400ms blocks, mono exact PCM16 decoded by soundfile",
"python": "3.11.16",
"versions": {
"pyloudnorm": "0.2.0",
"soundfile": "0.13.1",
"numpy": "2.2.6",
"scipy": "1.15.3",
"cffi": "1.17.1",
"pycparser": "2.22",
"future": "1.0.0"
},
"libsndfileVersion": "1.2.2",
"scriptSha256": "b87ec3ab26ea0775f7a8fe6d1baf1aad50e429632705d6e3bf06268ed7b9a4cc",
"manifestSha256": "6433bf23af35f24031c6bbe784dd0abf9330f276da6b8705e47c7a1144a285b7",
"targetIntegratedLUFS": -32.5,
"toleranceLU": 0.2,
"maximumSpreadLU": 0.4,
"spreadLU": 0.07715477923686365,
"passed": true,
"files": [
{
"file": "public/ambience/cafe.wav",
"sha256": "864a81571a2e25a99d6408aa282570e7996c7ace432cf4f4f294677ea5bcad63",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.60621761696535,
"targetErrorLU": -0.10621761696535259
},
{
"file": "public/ambience/department.wav",
"sha256": "93e5c23bff2b19716dd21111746837a4df8c52d4b88c6874e57828d09ca5507e",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.55798042645585,
"targetErrorLU": -0.057980426455849
},
{
"file": "public/ambience/mall.wav",
"sha256": "a0a135e319ed70f55b03c6e266fb047e53db8008277a6ba8b855a05a1b82662f",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.575453741417206,
"targetErrorLU": -0.07545374141720629
},
{
"file": "public/ambience/market.wav",
"sha256": "7178307c48c192ac396dcd3c880c377bf56b45e829b459b1feca9f986437e632",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.52906283772849,
"targetErrorLU": -0.029062837728488944
},
{
"file": "public/ambience/rain.wav",
"sha256": "1842a717e6c77811cb6d6cb09d364e8ef644d50e6beb97d3d187c96e95d85784",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.56530955673126,
"targetErrorLU": -0.0653095567312576
},
{
"file": "public/ambience/street.wav",
"sha256": "dace0969087539e5b67fb6fac11b759e81626574230ca7f8d2feb484753656a8",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.54629472521665,
"targetErrorLU": -0.04629472521664724
},
{
"file": "public/ambience/subway.wav",
"sha256": "e85cf77a9baa7560fb09966c4eda3b128b92647bc4c54c417a29b4e0f4ac129f",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.5601852061342,
"targetErrorLU": -0.06018520613420009
},
{
"file": "public/ambience/theater.wav",
"sha256": "634fc25e8c4e9dcbab97688bc4c0ef9b0299cc7c4c921781a70740aabe46b900",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.59002557282089,
"targetErrorLU": -0.09002557282089185
}
]
}
@@ -0,0 +1,32 @@
Collecting cffi==1.17.1 (from -r .agent/evidence-v0.2.5/review-fixes/pyloudnorm-requirements.txt (line 1))
Using cached cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.5 kB)
Collecting future==1.0.0 (from -r .agent/evidence-v0.2.5/review-fixes/pyloudnorm-requirements.txt (line 2))
Using cached future-1.0.0-py3-none-any.whl.metadata (4.0 kB)
Collecting numpy==2.2.6 (from -r .agent/evidence-v0.2.5/review-fixes/pyloudnorm-requirements.txt (line 3))
Using cached numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (62 kB)
Collecting pycparser==2.22 (from -r .agent/evidence-v0.2.5/review-fixes/pyloudnorm-requirements.txt (line 4))
Using cached pycparser-2.22-py3-none-any.whl.metadata (943 bytes)
Collecting pyloudnorm==0.2.0 (from -r .agent/evidence-v0.2.5/review-fixes/pyloudnorm-requirements.txt (line 5))
Using cached pyloudnorm-0.2.0-py3-none-any.whl.metadata (6.6 kB)
Collecting scipy==1.15.3 (from -r .agent/evidence-v0.2.5/review-fixes/pyloudnorm-requirements.txt (line 6))
Using cached scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)
Collecting soundfile==0.13.1 (from -r .agent/evidence-v0.2.5/review-fixes/pyloudnorm-requirements.txt (line 7))
Using cached soundfile-0.13.1-py2.py3-none-manylinux_2_28_x86_64.whl.metadata (16 kB)
Using cached cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (467 kB)
Using cached future-1.0.0-py3-none-any.whl (491 kB)
Using cached numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.8 MB)
Using cached pycparser-2.22-py3-none-any.whl (117 kB)
Using cached pyloudnorm-0.2.0-py3-none-any.whl (10 kB)
Using cached scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (37.7 MB)
Using cached soundfile-0.13.1-py2.py3-none-manylinux_2_28_x86_64.whl (1.3 MB)
Saved /tmp/findword-review-fixes-wheels/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Saved /tmp/findword-review-fixes-wheels/future-1.0.0-py3-none-any.whl
Saved /tmp/findword-review-fixes-wheels/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Saved /tmp/findword-review-fixes-wheels/pycparser-2.22-py3-none-any.whl
Saved /tmp/findword-review-fixes-wheels/pyloudnorm-0.2.0-py3-none-any.whl
Saved /tmp/findword-review-fixes-wheels/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Saved /tmp/findword-review-fixes-wheels/soundfile-0.13.1-py2.py3-none-manylinux_2_28_x86_64.whl
Successfully downloaded cffi future numpy pycparser pyloudnorm scipy soundfile
[notice] A new release of pip is available: 24.0 -> 26.2.1
[notice] To update, run: python3.11 -m pip install --upgrade pip
@@ -0,0 +1,4 @@
> find-word@0.2.5 lint
> eslint . && tsc --noEmit
@@ -0,0 +1,40 @@
> find-word@0.2.5 test
> vitest run
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
❯ tests/ambience.test.ts (9 tests | 1 failed) 2083ms
× v0.2.5 최종 WAV의 동일 ASR VAD gate는 requiredEmptyPassed=true여야 한다 21ms
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯
FAIL tests/ambience.test.ts > v0.2.5 최종 WAV의 동일 ASR VAD gate는 requiredEmptyPassed=true여야 한다
AssertionError: expected false to be true // Object.is equality
- Expected
+ Received
- true
+ false
❯ tests/ambience.test.ts:480:41
478| "cafe",
479| ]);
480| expect(screening.requiredEmptyPassed).toBe(true);
| ^
481| expect(screening.limitations).toMatchObject({
482| humanListeningAcceptance: false,
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯
Test Files 1 failed | 14 passed (15)
Tests 1 failed | 143 passed (144)
Start at 11:05:03
Duration 52.82s (tests 88%, environment 8%, setup 3%, transform 1%)
Isolate 15 workers spawned · ~1.08s startup each (spawn + environment, per file)
at least ~4.30s faster with isolate: false — reuses workers across files instead of one per file
@@ -0,0 +1,15 @@
> find-word@0.2.5 build
> tsc --noEmit && vite build && node scripts/check-build.mjs
vite v8.3.4 building client environment for production...
transforming...
✓ 24 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html 1.31 kB │ gzip: 0.91 kB
dist/assets/index-CgXbHuMU.css 16.11 kB │ gzip: 4.53 kB
dist/assets/index-Cz3LYZX-.js 293.21 kB │ gzip: 91.89 kB
✓ built in 548ms
빌드 음성 자산 101개 + 현장음 8개 및 런타임/현장음 notice 확인
@@ -0,0 +1,59 @@
[WebServer] (node:1568844) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)
Running 36 tests using 2 workers
(node:1568899) 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:1568901) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[1/36] [desktop] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
[2/36] [desktop] › tests/browser/gains.spec.ts:87:1 › 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다
[3/36] [desktop] › tests/browser/gains.spec.ts:185:1 › 실제 WAV 변조는 소스 시작 전에 거부하고 원본 재시도로 회복한다
[4/36] [desktop] › tests/browser/game.spec.ts:8:1 › 실제 오디오로 혼합 모드 완주·레이아웃·접근성·외부 요청 없음
[5/36] [desktop] › tests/browser/game.spec.ts:130:3 › intro WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[6/36] [desktop] › tests/browser/game.spec.ts:130:3 › target WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[7/36] [desktop] › tests/browser/release.spec.ts:6:1 › 릴리스는 사용자 크레딧과 런타임 MIT notice 전문을 제공한다
[8/36] [desktop] › tests/browser/release.spec.ts:24:1 › 누락 음성·환경음은 query와 HTML accept에도 404이고 출처 고지는 번들된다
[9/36] [desktop] › tests/browser/resampling.spec.ts:7:1 › 109 WAV의 24·44.1·48·96kHz 디코드는 고정 peak 상한 안에 있다
[10/36] [desktop] › tests/browser/review-fixes.spec.ts:27:1 › 리뷰: 한국어 모드·결과 어절은 320px와 360px에서도 갈라지거나 넘치지 않는다
[11/36] [desktop] › tests/browser/review-fixes.spec.ts:62:1 › 리뷰: 실제 진행 막대는 현재 문항의 1/3·2/3·3/3을 채운다
[12/36] [desktop] › tests/browser/rounds.spec.ts:35:1 › 시작 단계·SNR·3문항 완료→다음 단계·재생 중 종료·응답 후 종료·홈 초기화
[13/36] [desktop] › tests/browser/rounds.spec.ts:135:1 › 여덟 환경의 실제 WAV를 각각 디코드하고 루프 재생한 뒤 즉시 정지한다
[14/36] [desktop] › tests/browser/rounds.spec.ts:178:1 › 환경음 404는 한국어 오류와 재시도 후 정상 답변으로 복구한다
[15/36] [desktop] › tests/browser/ui.spec.ts:4:1 › 전체 음량은 설정 흐름 안에 들어가며 키보드로 조절된다
[16/36] [desktop] › tests/browser/ui.spec.ts:52:1 › 난이도 설명은 모바일에서도 보인다
[17/36] [desktop] › tests/browser/ui.spec.ts:68:1 › 한국어 제목은 단어 중간에서 줄바꿈하지 않는다
[18/36] [desktop] › tests/browser/ui.spec.ts:121:1 › 시작 단계와 SNR 설정은 카드 안에 들어가고 터치 영역을 확보한다
(node:1570802) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[19/36] [mobile] › tests/browser/audio.spec.ts:7:1 › 음성·현장음 109개 versioned WAV를 실제 Chrome에서 해시·디코드 검증한다
(node:1570940) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
(Use `node --trace-warnings ...` to show where the warning was created)
[20/36] [mobile] › tests/browser/gains.spec.ts:87:1 › 실제 GainNode의 배경 배율은 8환경 × SNR 경계·0에서 동일하다
[21/36] [mobile] › tests/browser/gains.spec.ts:185:1 › 실제 WAV 변조는 소스 시작 전에 거부하고 원본 재시도로 회복한다
[22/36] [mobile] › tests/browser/game.spec.ts:8:1 › 실제 오디오로 혼합 모드 완주·레이아웃·접근성·외부 요청 없음
[23/36] [mobile] › tests/browser/game.spec.ts:130:3 › intro WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[24/36] [mobile] › tests/browser/game.spec.ts:130:3 › target WAV query URL의 404를 표시하고 같은 URL로 재시도·정답 mapping한다
[25/36] [mobile] › tests/browser/release.spec.ts:6:1 › 릴리스는 사용자 크레딧과 런타임 MIT notice 전문을 제공한다
[26/36] [mobile] › tests/browser/release.spec.ts:24:1 › 누락 음성·환경음은 query와 HTML accept에도 404이고 출처 고지는 번들된다
[27/36] [mobile] › tests/browser/resampling.spec.ts:7:1 › 109 WAV의 24·44.1·48·96kHz 디코드는 고정 peak 상한 안에 있다
[28/36] [mobile] › tests/browser/review-fixes.spec.ts:27:1 › 리뷰: 한국어 모드·결과 어절은 320px와 360px에서도 갈라지거나 넘치지 않는다
[29/36] [mobile] › tests/browser/review-fixes.spec.ts:62:1 › 리뷰: 실제 진행 막대는 현재 문항의 1/3·2/3·3/3을 채운다
[30/36] [mobile] › tests/browser/rounds.spec.ts:35:1 › 시작 단계·SNR·3문항 완료→다음 단계·재생 중 종료·응답 후 종료·홈 초기화
[31/36] [mobile] › tests/browser/rounds.spec.ts:135:1 › 여덟 환경의 실제 WAV를 각각 디코드하고 루프 재생한 뒤 즉시 정지한다
[32/36] [mobile] › tests/browser/rounds.spec.ts:178:1 › 환경음 404는 한국어 오류와 재시도 후 정상 답변으로 복구한다
[33/36] [mobile] › tests/browser/ui.spec.ts:4:1 › 전체 음량은 설정 흐름 안에 들어가며 키보드로 조절된다
[34/36] [mobile] › tests/browser/ui.spec.ts:52:1 › 난이도 설명은 모바일에서도 보인다
[35/36] [mobile] › tests/browser/ui.spec.ts:68:1 › 한국어 제목은 단어 중간에서 줄바꿈하지 않는다
[36/36] [mobile] › tests/browser/ui.spec.ts:121:1 › 시작 단계와 SNR 설정은 카드 안에 들어가고 터치 영역을 확보한다
36 passed (4.8m)
@@ -0,0 +1 @@
PASS: all eight source hashes verified, two independent generations and published WAVs/pass metrics/notices match.
@@ -0,0 +1,77 @@
{
"measurementFilter": "ebur128=peak=true",
"targetIntegratedLUFS": -32.5,
"toleranceLU": 0.2,
"maximumSpreadLU": 0.4,
"truePeakCeilingDBTP": -6,
"ffmpegVersion": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers",
"scriptSha256": "4dcfd19fcc43379489e4720e02b61ee245f4a33e30260ba6d70e896b76ca48ac",
"spreadLU": 0.0,
"passed": true,
"files": [
{
"file": "public/ambience/cafe.wav",
"sha256": "864a81571a2e25a99d6408aa282570e7996c7ace432cf4f4f294677ea5bcad63",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -18.2,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 0.5 LU\n Threshold: -52.6 LUFS\n LRA low: -32.8 LUFS\n LRA high: -32.3 LUFS\n\n True peak:\n Peak: -18.2 dBFS\n"
},
{
"file": "public/ambience/department.wav",
"sha256": "93e5c23bff2b19716dd21111746837a4df8c52d4b88c6874e57828d09ca5507e",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -16.6,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 4.2 LU\n Threshold: -52.5 LUFS\n LRA low: -35.1 LUFS\n LRA high: -30.9 LUFS\n\n True peak:\n Peak: -16.6 dBFS\n"
},
{
"file": "public/ambience/mall.wav",
"sha256": "a0a135e319ed70f55b03c6e266fb047e53db8008277a6ba8b855a05a1b82662f",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -12.2,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 1.4 LU\n Threshold: -52.4 LUFS\n LRA low: -33.1 LUFS\n LRA high: -31.7 LUFS\n\n True peak:\n Peak: -12.2 dBFS\n"
},
{
"file": "public/ambience/market.wav",
"sha256": "7178307c48c192ac396dcd3c880c377bf56b45e829b459b1feca9f986437e632",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -6.2,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.4 LUFS\n\n Loudness range:\n LRA: 6.5 LU\n Threshold: -52.6 LUFS\n LRA low: -36.4 LUFS\n LRA high: -29.9 LUFS\n\n True peak:\n Peak: -6.2 dBFS\n"
},
{
"file": "public/ambience/rain.wav",
"sha256": "1842a717e6c77811cb6d6cb09d364e8ef644d50e6beb97d3d187c96e95d85784",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -12.1,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 8.4 LU\n Threshold: -54.2 LUFS\n LRA low: -37.7 LUFS\n LRA high: -29.3 LUFS\n\n True peak:\n Peak: -12.1 dBFS\n"
},
{
"file": "public/ambience/street.wav",
"sha256": "dace0969087539e5b67fb6fac11b759e81626574230ca7f8d2feb484753656a8",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -10.2,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 4.6 LU\n Threshold: -52.4 LUFS\n LRA low: -34.6 LUFS\n LRA high: -29.9 LUFS\n\n True peak:\n Peak: -10.2 dBFS\n"
},
{
"file": "public/ambience/subway.wav",
"sha256": "e85cf77a9baa7560fb09966c4eda3b128b92647bc4c54c417a29b4e0f4ac129f",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -16.2,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 4.9 LU\n Threshold: -52.2 LUFS\n LRA low: -35.0 LUFS\n LRA high: -30.1 LUFS\n\n True peak:\n Peak: -16.2 dBFS\n"
},
{
"file": "public/ambience/theater.wav",
"sha256": "634fc25e8c4e9dcbab97688bc4c0ef9b0299cc7c4c921781a70740aabe46b900",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -16.1,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 1.0 LU\n Threshold: -52.3 LUFS\n LRA low: -32.8 LUFS\n LRA high: -31.8 LUFS\n\n True peak:\n Peak: -16.1 dBFS\n"
}
]
}
@@ -0,0 +1,58 @@
{
"historicalV025FilesPreserved": 150,
"earlierImmutableFilesPreserved": 660,
"voiceWavsPreserved": 101,
"sourcePlanSha256": "3529c8534be204208ac504a0f4c1a69b312131f9bbff92aa9a3135d61d24db65",
"sourceAndSegmentsPreserved": [
{
"environmentId": "street",
"sourceSha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"sourceBytes": 3414104,
"startSeconds": 35
},
{
"environmentId": "mall",
"sourceSha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"sourceBytes": 1666896,
"startSeconds": 36
},
{
"environmentId": "theater",
"sourceSha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"sourceBytes": 1485015,
"startSeconds": 45
},
{
"environmentId": "department",
"sourceSha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"sourceBytes": 2445024,
"startSeconds": 90
},
{
"environmentId": "market",
"sourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"sourceBytes": 622200,
"startSeconds": 24
},
{
"environmentId": "subway",
"sourceSha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"sourceBytes": 3343901,
"startSeconds": 65
},
{
"environmentId": "cafe",
"sourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"sourceBytes": 19947952,
"startSeconds": 0
},
{
"environmentId": "rain",
"sourceSha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"sourceBytes": 91187572,
"startSeconds": 180
}
],
"newAmbienceCount": 8,
"allPublicFilesMatchDist": true
}
@@ -0,0 +1,68 @@
RUN v5.0.4 /home/hermes/worktrees/find-word-v0.2.5
✓ tests/neural-release.test.ts > 0.2.5 버전을 package·lock·UI·index·문서에 일치시킨다 11ms
✓ tests/neural-release.test.ts > 고정 venv 생성 명령과 provider·도구·출력물 권리의 경계를 문서화한다 3ms
✓ tests/neural-release.test.ts > 현재 문서·manifest·CHANGELOG는 0.2.5 동작과 역사 보존을 설명한다 2ms
✓ tests/neural-release.test.ts > README는 현재 리뷰 증거 경로와 정확한 라운드 보너스를 안내한다 1ms
✓ tests/release.test.ts > 릴리스 문서 계약 > Node 최소 버전은 잠긴 의존성이 요구하는 22.22.2와 일치한다 5ms
✓ tests/release.test.ts > 릴리스 문서 계약 > 프로젝트는 비공개 권리 유보이며 저장소 주소를 명시한다 4ms
✓ tests/release.test.ts > 릴리스 문서 계약 > 잠금 파일의 모든 런타임 의존성 notice 전문을 배포용 사본에 보존한다 3ms
✓ tests/release.test.ts > 릴리스 문서 계약 > 브랜드 문구를 사용자 원문 그대로 문서에도 보존한다 4ms
✓ tests/release.test.ts > HTML은 같은 문서의 내장 아이콘을 제공해 누락 favicon 요청을 막는다 1ms
stdout | tests/mixing-loudness.test.ts > 같은 +6dB에서 여덟 배경의 gain은 파일 피크와 무관하다
[
{
"file": "cafe.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.010111753518983174
},
{
"file": "department.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.010411671423001338
},
{
"file": "mall.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.01075304005447213
},
{
"file": "market.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.010048399249045416
},
{
"file": "rain.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.011545361716977154
},
{
"file": "street.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.02625176349609887
},
{
"file": "subway.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.012189577020264694
},
{
"file": "theater.wav",
"backgroundGain": 0.4198884518664126,
"finalRms": 0.0106773463288438
}
]
stdout | tests/mixing-loudness.test.ts > 101 voice × 8 배경 × 모든 SNR 눈금은 동일 배경 gain과 안전 피크를 가진다
{"combinations":20200,"maximum":0.6546804814413929,"voicePeak":0.2052977830171585,"backgroundPeak":0.471954345703125,"introPeak":0.14995422959327698,"bounds":{"background":0.55,"voice":0.25,"intro":0.2},"fixedGain":0.4198884518664126,"backgroundGains":[0.4198884518664126]}
✓ tests/mixing-loudness.test.ts > 같은 +6dB에서 여덟 배경의 gain은 파일 피크와 무관하다 428ms
✓ tests/mixing-loudness.test.ts > 101 voice × 8 배경 × 모든 SNR 눈금은 동일 배경 gain과 안전 피크를 가진다 4534ms
✓ tests/mixing-loudness.test.ts > SNR과 모든 경로의 peak 상한 위반은 fail closed한다 2ms
Test Files 3 passed (3)
Tests 12 passed (12)
Start at 11:09:19
Duration 5.49s (tests 85%, setup 13%, transform 1%)
@@ -0,0 +1,58 @@
{
"stats": {
"startTime": "2026-10-14T11:05:34.681Z",
"duration": 285196.423,
"expected": 36,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"projects": {
"desktop": {
"passed": 18,
"attachments": {
"109-versioned-WAV-integrity": "final-desktop-109-versioned-WAV-integrity.json",
"actual-gain-nodes": "final-desktop-actual-gain-nodes.json",
"all-voices-resampled-bounds": "final-desktop-all-voices-resampled-bounds.json",
"runtime-audit": "final-desktop-runtime-audit.json"
},
"gainCases": 24,
"observedBackgroundGainValues": [
0.4198884665966034
],
"scheduledBackgroundGainValues": [
0.4198884518664126
],
"normalFlowAudit": {
"errors": 0,
"failed": 0,
"external": 0
},
"axeViolations": 0
},
"mobile": {
"passed": 18,
"attachments": {
"109-versioned-WAV-integrity": "final-mobile-109-versioned-WAV-integrity.json",
"actual-gain-nodes": "final-mobile-actual-gain-nodes.json",
"all-voices-resampled-bounds": "final-mobile-all-voices-resampled-bounds.json",
"runtime-audit": "final-mobile-runtime-audit.json"
},
"gainCases": 24,
"observedBackgroundGainValues": [
0.4198884665966034
],
"scheduledBackgroundGainValues": [
0.4198884518664126
],
"normalFlowAudit": {
"errors": 0,
"failed": 0,
"external": 0
},
"axeViolations": 0
}
},
"scope": "System Chrome desktop/mobile emulation; native Web Audio; local built app; intentional fault injections excluded from normal-flow error totals.",
"sandboxEvidence": "chrome-sandbox-final.json"
}
@@ -0,0 +1,7 @@
{
"method": "High-confidence credential signatures in git-tracked and unignored new text files; no environment/secret access",
"textFilesScanned": 668,
"findings": [],
"passed": true,
"limitation": "Pattern scan is not a proof that every possible secret format is absent."
}
@@ -0,0 +1,2 @@
PASS: 150 historical v0.2.5 evidence files unchanged; three meter/ASR reports match current WAV hashes; scripts match recorded hashes; git diff --check clean; HEAD unchanged.
RELEASE BLOCKED: final-asr requiredEmptyPassed=false; npm test 143 passed / 1 ASR gate failed.
@@ -0,0 +1,61 @@
# v0.2.5 독립 리뷰 수정 증거
**릴리스 차단.** ebur128/pyloudnorm loudness 조건은 통과했지만 동일 faster-whisper VAD gate가
새 market WAV에서 1개 segment를 반환했다. `requiredEmptyPassed=false`이며 이를 `true`로 요구하는
단위 테스트는 실패 상태다. 승인/commit/push/merge/tag/deploy는 하지 않았다.
기존 상위 `.agent/evidence-v0.2.5`의 150개 파일은 [history-sha256.json](history-sha256.json)으로 고정했다.
수정 전 bundle과 RESULT/정규화 계획은 `rejected-*` 사본으로 보존한다. 기존 loudnorm input_i의
0.01 LU spread 주장은 전용 ebur128 2.0 LU / 독립 리뷰의 pyloudnorm 0.2.0 1.925 LU와 모순되어
**거부된 역사 증거**다. 상위 GREEN 표시는 당시 테스트 결과이며 현재 릴리스 통과가 아니다.
## TDD와 결과
| 검사 | 증거 | 결과 |
| --- | --- | --- |
| 복원한 전용 ebur128 목표/동등성 | [01 RED](01-ebur128-RED.log), [06 GREEN](06-ebur128-GREEN.log) | 2.0 LU 실패 → 0.0 LU 통과 |
| 순수 scalar/사전 peak/보정/비수렴 | [02 RED](02-linear-RED.log), [04 GREEN](04-linear-GREEN.log) | 7개 통과 |
| exact 새 WAV ASR gate | [03 RED](03-asr-gate-RED.log), [08 실제 실행](08-asr.log), [결과](final-asr.json) | 실패 보존 |
| 새 manifest의 빌드 계약 | [07 RED](07-build-contract-RED.log), [15 unit](15-unit.log) | 해당 39개 통과 |
| 새 원자 생성 | [05](05-regenerate.log) | 8개 전체 교환 |
| 전용 ebur128 독립 측정 | [스크립트](measure-ebur128.py), [결과](ebur128-results.json) | 전수 −32.5 LUFS, spread 0.0 LU, 최대 −6.2 dBTP |
| 별도 pyloudnorm 독립 측정 | [스크립트](measure-pyloudnorm.py), [결과](pyloudnorm-results.json) | −32.6062~−32.5291 LUFS, spread 0.0771547792 LU |
| Python 전체 | [11](11-python.log) | 47개 통과 |
| lint/typecheck | [14](14-lint.log) | 통과 |
| npm test | [15](15-unit.log) | 143 통과 / 1 실패 (ASR) |
| build | [16](16-build.log) | 통과 |
| audit | [JSON](npm-audit.json) | 취약점 0개 |
| Chrome desktop/mobile | [17](17-browser.log), [summary](browser-summary.json) | 36 PASS, skipped/flaky/unexpected=0 |
| 같은 원본에서 두 번 재생성 | [18](18-reproducibility.log), [JSON](reproducibility.json) | PCM/통계/notice 동일, generatedAtUtc만 제외 |
| 역사/원본/음성/dist 보존 | [20](20-preservation.log), [JSON](preservation.json) | 통과 |
현재 manifest의 hash는 ASR와 pyloudnorm 결과에 연결되어 있고 각 WAV hash도 기록되어 있다.
ASR 모델 revision/모델 파일 hash/VAD hash/전체 기본 옵션/seed/의존성/스크립트 hash는
[final-asr.json](final-asr.json)에 있다. 기존 실패·no-VAD는 수정하지 않았다.
market의 exact SHA-256은 `7178307c48c192ac396dcd3c880c377bf56b45e829b459b1feca9f986437e632`이며,
반환 구간 10.45–12.45초, 후보 텍스트 ` Let's go, let's go, let's go.`를 그대로 남겼다.
이 텍스트는 검증된 전사가 아니다. humanListeningAcceptance/legalPrivacyClearance는 모두 false다.
## 독립 pyloudnorm 재현
일반 npm test는 이 가상 환경이나 네트워크를 사용하지 않는다. 아래 절차는 별도의 독립 증거 재현용이다.
Python 3.11/Linux x86_64 wheel을 고정했다. [의존성 lock](pyloudnorm-requirements.lock)의 모든 버전과
SHA-256을 사용한다. [wheel inventory](pyloudnorm-wheels.json), [설치 로그](09-pyloudnorm-install.log),
[freeze](pyloudnorm-requirements.txt)를 함께 보존했다. pyloudnorm=0.2.0, soundfile=0.13.1,
libsndfile=1.2.2; 나머지 패키지 버전과 Python 버전은 결과 JSON에 있다.
기존 증거를 덮어쓰지 않도록 새 임시 디렉터리에 같은 상대 경로를 구성한다. 설치에는 네트워크가
필요할 수 있지만 WAV 측정은 로컬 파일만 읽는다. `open('x')`가 기존 결과 덮어쓰기를 거부한다.
```bash
review_run=$(mktemp -d /tmp/findword-independent-XXXXXX)
python3 -m venv "$review_run/venv"
"$review_run/venv/bin/pip" install --require-hashes -r .agent/evidence-v0.2.5/review-fixes/pyloudnorm-requirements.lock
mkdir -p "$review_run/public" "$review_run/.agent/evidence-v0.2.5/review-fixes"
cp -a public/ambience "$review_run/public/ambience"
cp .agent/evidence-v0.2.5/review-fixes/measure-pyloudnorm.py "$review_run/.agent/evidence-v0.2.5/review-fixes/"
"$review_run/venv/bin/python" "$review_run/.agent/evidence-v0.2.5/review-fixes/measure-pyloudnorm.py"
```
동일한 임시 경로에 `measure-ebur128.py`도 복사해 `python3`로 실행하면 전용 FFmpeg 계기를 별도 재현할 수 있다.
FFmpeg 6.1.1-3ubuntu5와 정확한 input bytes 범위에서 재현성을 검증했으며 다른 빌드의 byte 동일성을 보장하지 않는다.
@@ -0,0 +1,4 @@
{
"status": "passed",
"failedTests": []
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,68 @@
{
"stats": {
"startTime": "2026-10-14T11:05:34.681Z",
"duration": 285196.423,
"expected": 36,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"projects": {
"desktop": {
"passed": 18,
"attachments": {
"109-versioned-WAV-integrity": "final-desktop-109-versioned-WAV-integrity.json",
"actual-gain-nodes": "final-desktop-actual-gain-nodes.json",
"all-voices-resampled-bounds": "final-desktop-all-voices-resampled-bounds.json",
"runtime-audit": "final-desktop-runtime-audit.json"
},
"gainCases": 24,
"observedBackgroundGainValues": [
0.4198884665966034
],
"scheduledBackgroundGainValues": [
0.4198884518664126
],
"normalFlowAudit": {
"errors": 0,
"failed": 0,
"external": 0
},
"axeViolations": 0,
"resampledPeakMaxima": {
"background": 0.4879775941371918,
"voice": 0.20585650454525403,
"intro": 0.14999594059820148
}
},
"mobile": {
"passed": 18,
"attachments": {
"109-versioned-WAV-integrity": "final-mobile-109-versioned-WAV-integrity.json",
"actual-gain-nodes": "final-mobile-actual-gain-nodes.json",
"all-voices-resampled-bounds": "final-mobile-all-voices-resampled-bounds.json",
"runtime-audit": "final-mobile-runtime-audit.json"
},
"gainCases": 24,
"observedBackgroundGainValues": [
0.4198884665966034
],
"scheduledBackgroundGainValues": [
0.4198884518664126
],
"normalFlowAudit": {
"errors": 0,
"failed": 0,
"external": 0
},
"axeViolations": 0,
"resampledPeakMaxima": {
"background": 0.4879775941371918,
"voice": 0.20585650454525403,
"intro": 0.14999594059820148
}
}
},
"scope": "System Chrome desktop/mobile emulation; native Web Audio; local built app; intentional fault injections excluded from normal-flow error totals.",
"sandboxEvidence": "chrome-sandbox-final.json"
}
@@ -0,0 +1,33 @@
"""이전 모든 증거·voice·source·구간의 불변성과 새 dist 바이트를 검증한다."""
import hashlib
import json
from pathlib import Path
ROOT=Path(__file__).resolve().parents[3]
EVIDENCE=Path(__file__).resolve().parent
def sha(path): return hashlib.sha256(path.read_bytes()).hexdigest()
history=json.loads((EVIDENCE/'history-sha256.json').read_text())
baseline=json.loads((ROOT/'.agent/evidence-v0.2.5/baseline.json').read_text())
for path,expected in {**history,**baseline['immutable'],**baseline['voiceWavs']}.items():
assert sha(ROOT/path)==expected,path
plan=json.loads((ROOT/'.agent/AMBIENCE-SOURCES-v0.2.3.json').read_text())
current=json.loads((ROOT/'public/ambience/manifest.json').read_text())
rejected=json.loads((EVIDENCE/'rejected-loudnorm-bundle/manifest.json').read_text())
sources=[]
for asset,entry,old in zip(plan['assets'],current['files'],rejected['files']):
assert all(entry[key]==value for key,value in asset.items())
assert entry['sha256']!=old['sha256']
assert entry['conversion']['startSeconds']==asset['selectedSegmentStartSeconds']
environment=asset['environmentId']
ext='.mp3' if environment in ('theater','department') else '.flac' if environment=='rain' else '.ogg'
path=Path('/tmp/findword-ambience-sources')/(environment+ext)
assert path.stat().st_size==asset['sourceBytes'] and sha(path)==asset['expectedSourceSha256']
sources.append({'environmentId':environment,'sourceSha256':sha(path),'sourceBytes':path.stat().st_size,'startSeconds':asset['selectedSegmentStartSeconds']})
public=list((ROOT/'public').rglob('*'))
for path in public:
if path.is_file(): assert path.read_bytes()==(ROOT/'dist'/path.relative_to(ROOT/'public')).read_bytes(),path
report={'historicalV025FilesPreserved':len(history),'earlierImmutableFilesPreserved':len(baseline['immutable']),
'voiceWavsPreserved':len(baseline['voiceWavs']),'sourcePlanSha256':sha(ROOT/'.agent/AMBIENCE-SOURCES-v0.2.3.json'),
'sourceAndSegmentsPreserved':sources,'newAmbienceCount':8,'allPublicFilesMatchDist':True}
with (EVIDENCE/'preservation.json').open('x') as stream: stream.write(json.dumps(report,indent=2)+'\n')
print(json.dumps(report,indent=2))
@@ -0,0 +1,74 @@
{
"cwd": "/home/hermes/worktrees/find-word-v0.2.5",
"noSandboxFlagAbsent": true,
"processes": [
{
"pid": 1569019,
"argv": [
"/opt/google/chrome/chrome_crashpad_handler",
"--monitor-self",
"--monitor-self-annotation=ptype=crashpad-handler",
"--database=/home/hermes/.config/google-chrome/Crash Reports",
"--url=https://clients2.google.com/cr/report",
"--annotation=channel=",
"--annotation=lsb-release=Ubuntu 24.04.3 LTS",
"--annotation=plat=Linux",
"--annotation=prod=Chrome_Linux",
"--annotation=ver=146.0.7680.80",
"--initial-client-fd=7",
"--shared-client-connection"
]
},
{
"pid": 1569024,
"argv": [
"/opt/google/chrome/chrome_crashpad_handler",
"--no-periodic-tasks",
"--monitor-self-annotation=ptype=crashpad-handler",
"--database=/home/hermes/.config/google-chrome/Crash Reports",
"--url=https://clients2.google.com/cr/report",
"--annotation=channel=",
"--annotation=lsb-release=Ubuntu 24.04.3 LTS",
"--annotation=plat=Linux",
"--annotation=prod=Chrome_Linux",
"--annotation=ver=146.0.7680.80",
"--initial-client-fd=4",
"--shared-client-connection"
]
},
{
"pid": 1569034,
"argv": [
"/opt/google/chrome/chrome_crashpad_handler",
"--monitor-self",
"--monitor-self-annotation=ptype=crashpad-handler",
"--database=/home/hermes/.config/google-chrome/Crash Reports",
"--url=https://clients2.google.com/cr/report",
"--annotation=channel=",
"--annotation=lsb-release=Ubuntu 24.04.3 LTS",
"--annotation=plat=Linux",
"--annotation=prod=Chrome_Linux",
"--annotation=ver=146.0.7680.80",
"--initial-client-fd=7",
"--shared-client-connection"
]
},
{
"pid": 1569036,
"argv": [
"/opt/google/chrome/chrome_crashpad_handler",
"--no-periodic-tasks",
"--monitor-self-annotation=ptype=crashpad-handler",
"--database=/home/hermes/.config/google-chrome/Crash Reports",
"--url=https://clients2.google.com/cr/report",
"--annotation=channel=",
"--annotation=lsb-release=Ubuntu 24.04.3 LTS",
"--annotation=plat=Linux",
"--annotation=prod=Chrome_Linux",
"--annotation=ver=146.0.7680.80",
"--initial-client-fd=4",
"--shared-client-connection"
]
}
]
}
@@ -0,0 +1,77 @@
{
"measurementFilter": "ebur128=peak=true",
"targetIntegratedLUFS": -32.5,
"toleranceLU": 0.2,
"maximumSpreadLU": 0.4,
"truePeakCeilingDBTP": -6,
"ffmpegVersion": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers",
"scriptSha256": "4dcfd19fcc43379489e4720e02b61ee245f4a33e30260ba6d70e896b76ca48ac",
"spreadLU": 0.0,
"passed": true,
"files": [
{
"file": "public/ambience/cafe.wav",
"sha256": "864a81571a2e25a99d6408aa282570e7996c7ace432cf4f4f294677ea5bcad63",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -18.2,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 0.5 LU\n Threshold: -52.6 LUFS\n LRA low: -32.8 LUFS\n LRA high: -32.3 LUFS\n\n True peak:\n Peak: -18.2 dBFS\n"
},
{
"file": "public/ambience/department.wav",
"sha256": "93e5c23bff2b19716dd21111746837a4df8c52d4b88c6874e57828d09ca5507e",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -16.6,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 4.2 LU\n Threshold: -52.5 LUFS\n LRA low: -35.1 LUFS\n LRA high: -30.9 LUFS\n\n True peak:\n Peak: -16.6 dBFS\n"
},
{
"file": "public/ambience/mall.wav",
"sha256": "a0a135e319ed70f55b03c6e266fb047e53db8008277a6ba8b855a05a1b82662f",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -12.2,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 1.4 LU\n Threshold: -52.4 LUFS\n LRA low: -33.1 LUFS\n LRA high: -31.7 LUFS\n\n True peak:\n Peak: -12.2 dBFS\n"
},
{
"file": "public/ambience/market.wav",
"sha256": "7178307c48c192ac396dcd3c880c377bf56b45e829b459b1feca9f986437e632",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -6.2,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.4 LUFS\n\n Loudness range:\n LRA: 6.5 LU\n Threshold: -52.6 LUFS\n LRA low: -36.4 LUFS\n LRA high: -29.9 LUFS\n\n True peak:\n Peak: -6.2 dBFS\n"
},
{
"file": "public/ambience/rain.wav",
"sha256": "1842a717e6c77811cb6d6cb09d364e8ef644d50e6beb97d3d187c96e95d85784",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -12.1,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 8.4 LU\n Threshold: -54.2 LUFS\n LRA low: -37.7 LUFS\n LRA high: -29.3 LUFS\n\n True peak:\n Peak: -12.1 dBFS\n"
},
{
"file": "public/ambience/street.wav",
"sha256": "dace0969087539e5b67fb6fac11b759e81626574230ca7f8d2feb484753656a8",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -10.2,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 4.6 LU\n Threshold: -52.4 LUFS\n LRA low: -34.6 LUFS\n LRA high: -29.9 LUFS\n\n True peak:\n Peak: -10.2 dBFS\n"
},
{
"file": "public/ambience/subway.wav",
"sha256": "e85cf77a9baa7560fb09966c4eda3b128b92647bc4c54c417a29b4e0f4ac129f",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -16.2,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 4.9 LU\n Threshold: -52.2 LUFS\n LRA low: -35.0 LUFS\n LRA high: -30.1 LUFS\n\n True peak:\n Peak: -16.2 dBFS\n"
},
{
"file": "public/ambience/theater.wav",
"sha256": "634fc25e8c4e9dcbab97688bc4c0ef9b0299cc7c4c921781a70740aabe46b900",
"bytes": 576044,
"integratedLUFS": -32.5,
"truePeakDBTP": -16.1,
"rawSummary": "\n\n Integrated loudness:\n I: -32.5 LUFS\n Threshold: -42.5 LUFS\n\n Loudness range:\n LRA: 1.0 LU\n Threshold: -52.3 LUFS\n LRA low: -32.8 LUFS\n LRA high: -31.8 LUFS\n\n True peak:\n Peak: -16.1 dBFS\n"
}
]
}
@@ -0,0 +1,8 @@
{
"node": "v26.7.0",
"npm": "11.19.0",
"python": "Python 3.11.16",
"ffmpeg": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers",
"chrome": "Google Chrome 146.0.7680.80 ",
"gitHead": "812540c7438639f25b886cfd620201d92de15362"
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,921 @@
{
"chrome": "146.0.7680.80",
"fixedGain": 0.4198884518664126,
"rows": [
{
"environment": "street",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.3102891147136688,
"rms": 0.06252206625772674,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 0.06160997732426304,
"observedAt": 0.26702947845804986
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 0.06160997732426304
},
{
"loop": false,
"duration": 7.967981859410431,
"rate": 44100,
"peak": 0.17974460124969482,
"rms": 0.02999999999326921,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 7.4675963718820855
}
]
},
{
"environment": "street",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.3102891147136688,
"rms": 0.06252206625772674,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 3.0105442176870745,
"observedAt": 3.239183673469388
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 3.0105442176870745
},
{
"loop": false,
"duration": 8.519977324263039,
"rate": 44100,
"peak": 0.16514445841312408,
"rms": 0.02999999999978318,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 10.416530612244896
}
]
},
{
"environment": "street",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.3102891147136688,
"rms": 0.06252206625772674,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 4.496621315192743,
"observedAt": 4.713650793650793
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 4.496621315192743
},
{
"loop": false,
"duration": 8.375986394557824,
"rate": 44100,
"peak": 0.20497125387191772,
"rms": 0.029999999997565467,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 11.902607709750566
}
]
},
{
"environment": "mall",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.2380896806716919,
"rms": 0.025604196806659114,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 6.052358276643991,
"observedAt": 6.257777777777778
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 6.052358276643991
},
{
"loop": false,
"duration": 5.135986394557823,
"rate": 44100,
"peak": 0.1409970372915268,
"rms": 0.02999999999867479,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 13.458344671201814
}
]
},
{
"environment": "mall",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.2380896806716919,
"rms": 0.025604196806659114,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 7.526825396825397,
"observedAt": 7.743854875283446
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 7.526825396825397
},
{
"loop": false,
"duration": 7.223990929705216,
"rate": 44100,
"peak": 0.16981855034828186,
"rms": 0.02999999999876478,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 14.93281179138322
}
]
},
{
"environment": "mall",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.2380896806716919,
"rms": 0.025604196806659114,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 8.966462585034014,
"observedAt": 9.1718820861678
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 8.966462585034014
},
{
"loop": false,
"duration": 3.9599773242630385,
"rate": 44100,
"peak": 0.11458951234817505,
"rms": 0.03000000000961819,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 16.372448979591837
}
]
},
{
"environment": "theater",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15725064277648926,
"rms": 0.025421192976724967,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 10.406099773242632,
"observedAt": 10.611519274376418
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 10.406099773242632
},
{
"loop": false,
"duration": 3.9839909297052154,
"rate": 44100,
"peak": 0.1256658285856247,
"rms": 0.029999999997168104,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 17.812086167800455
}
]
},
{
"environment": "theater",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15725064277648926,
"rms": 0.025421192976724967,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 11.929909297052156,
"observedAt": 12.1556462585034
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 11.929909297052156
},
{
"loop": false,
"duration": 7.415986394557823,
"rate": 44100,
"peak": 0.17899024486541748,
"rms": 0.029999999996525216,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 19.335895691609977
}
]
},
{
"environment": "theater",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15725064277648926,
"rms": 0.025421192976724967,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 13.331814058956917,
"observedAt": 13.548843537414966
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 13.331814058956917
},
{
"loop": false,
"duration": 7.487981859410431,
"rate": 44100,
"peak": 0.17440009117126465,
"rms": 0.030000000001456025,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 20.73780045351474
}
]
},
{
"environment": "department",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.14809074997901917,
"rms": 0.024795763769841984,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 14.817891156462586,
"observedAt": 15.034920634920635
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 14.817891156462586
},
{
"loop": false,
"duration": 7.127981859410431,
"rate": 44100,
"peak": 0.15355078876018524,
"rms": 0.029999999998472637,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 22.223877551020408
}
]
},
{
"environment": "department",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.14809074997901917,
"rms": 0.024795763769841984,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 16.048548752834467,
"observedAt": 16.265578231292515
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 16.048548752834467
},
{
"loop": false,
"duration": 4.007981859410431,
"rate": 44100,
"peak": 0.11648130416870117,
"rms": 0.02999999999713933,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 23.45453514739229
}
]
},
{
"environment": "department",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.14809074997901917,
"rms": 0.024795763769841984,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 17.186326530612245,
"observedAt": 17.403356009070293
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 17.186326530612245
},
{
"loop": false,
"duration": 7.2,
"rate": 44100,
"peak": 0.17750407755374908,
"rms": 0.030000000004431423,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 24.592312925170067
}
]
},
{
"environment": "market",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.48508501052856445,
"rms": 0.023929933473605676,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 18.3008843537415,
"observedAt": 18.517913832199547
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 18.3008843537415
},
{
"loop": false,
"duration": 7.223990929705216,
"rate": 44100,
"peak": 0.16981855034828186,
"rms": 0.02999999999876478,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 25.70687074829932
}
]
},
{
"environment": "market",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.48508501052856445,
"rms": 0.023929933473605676,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 19.438662131519276,
"observedAt": 19.655691609977325
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 19.438662131519276
},
{
"loop": false,
"duration": 5.159977324263038,
"rate": 44100,
"peak": 0.13959355652332306,
"rms": 0.02999999999427438,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 26.844648526077098
}
]
},
{
"environment": "market",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.48508501052856445,
"rms": 0.023929933473605676,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 20.83185941043084,
"observedAt": 21.04888888888889
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 20.83185941043084
},
{
"loop": false,
"duration": 10.799977324263038,
"rate": 44100,
"peak": 0.17593282461166382,
"rms": 0.030000000001118382,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 28.237845804988662
}
]
},
{
"environment": "subway",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15436159074306488,
"rms": 0.02903130670200797,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 22.039297052154197,
"observedAt": 22.244716553287983
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 22.039297052154197
},
{
"loop": false,
"duration": 5.015986394557823,
"rate": 44100,
"peak": 0.14938956499099731,
"rms": 0.03000000000302188,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 29.44528344671202
}
]
},
{
"environment": "subway",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15436159074306488,
"rms": 0.02903130670200797,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 23.2002947845805,
"observedAt": 23.42893424036281
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 23.2002947845805
},
{
"loop": false,
"duration": 4.919977324263039,
"rate": 44100,
"peak": 0.13944819569587708,
"rms": 0.030000000000117072,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 30.60628117913832
}
]
},
{
"environment": "subway",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15436159074306488,
"rms": 0.02903130670200797,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 24.221972789115647,
"observedAt": 24.427392290249433
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 24.221972789115647
},
{
"loop": false,
"duration": 7.127981859410431,
"rate": 44100,
"peak": 0.15355078876018524,
"rms": 0.029999999998472637,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 31.627959183673468
}
]
},
{
"environment": "cafe",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.12247952073812485,
"rms": 0.02407895222985429,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 25.359750566893425,
"observedAt": 25.576780045351473
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 25.359750566893425
},
{
"loop": false,
"duration": 11.255986394557823,
"rate": 44100,
"peak": 0.1578369140625,
"rms": 0.029999999993818475,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 32.765736961451246
}
]
},
{
"environment": "cafe",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.12247952073812485,
"rms": 0.02407895222985429,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 26.416258503401362,
"observedAt": 26.644897959183673
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 26.416258503401362
},
{
"loop": false,
"duration": 7.415986394557823,
"rate": 44100,
"peak": 0.18703582882881165,
"rms": 0.02999999999685852,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 33.82224489795919
}
]
},
{
"environment": "cafe",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.12247952073812485,
"rms": 0.02407895222985429,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 27.379886621315194,
"observedAt": 27.58530612244898
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 27.379886621315194
},
{
"loop": false,
"duration": 7.415986394557823,
"rate": 44100,
"peak": 0.18703582882881165,
"rms": 0.02999999999685852,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 34.785873015873015
}
]
},
{
"environment": "rain",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.24721868336200714,
"rms": 0.027485239070310512,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 28.30868480725624,
"observedAt": 28.525714285714287
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 28.30868480725624
},
{
"loop": false,
"duration": 7.391995464852608,
"rate": 44100,
"peak": 0.16964103281497955,
"rms": 0.02999999999711925,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 35.71467120181406
}
]
},
{
"environment": "rain",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.24721868336200714,
"rms": 0.027485239070310512,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 29.35358276643991,
"observedAt": 29.57061224489796
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 29.35358276643991
},
{
"loop": false,
"duration": 10.871995464852608,
"rate": 44100,
"peak": 0.15582337975502014,
"rms": 0.030000000001875603,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 36.759569160997735
}
]
},
{
"environment": "rain",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.24721868336200714,
"rms": 0.027485239070310512,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 30.375260770975057,
"observedAt": 30.592290249433105
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 30.375260770975057
},
{
"loop": false,
"duration": 8.39997732426304,
"rate": 44100,
"peak": 0.16848142445087433,
"rms": 0.03000000000149854,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 37.78124716553288
}
]
}
],
"errors": [],
"failed": [],
"external": []
}
@@ -0,0 +1,70 @@
{
"errors": [],
"failed": [],
"external": [],
"audio": {
"starts": [
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 7.4399773242630385
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.391995464852608
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 5.0639909297052155
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 4.871995464852608
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 7.4399773242630385
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.4399773242630385
}
],
"stops": 15
}
}
@@ -0,0 +1,921 @@
{
"chrome": "146.0.7680.80",
"fixedGain": 0.4198884518664126,
"rows": [
{
"environment": "street",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.3102891147136688,
"rms": 0.06252206625772674,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 0.30541950113378685,
"observedAt": 0.5108390022675737
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 0.30541950113378685
},
{
"loop": false,
"duration": 7.919977324263039,
"rate": 44100,
"peak": 0.1778830587863922,
"rms": 0.030000000000867052,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 7.711405895691609
}
]
},
{
"environment": "street",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.3102891147136688,
"rms": 0.06252206625772674,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 1.245827664399093,
"observedAt": 1.4512471655328798
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 1.245827664399093
},
{
"loop": false,
"duration": 8.32798185941043,
"rate": 44100,
"peak": 0.16461747884750366,
"rms": 0.03000000000252798,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 8.651814058956916
}
]
},
{
"environment": "street",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.3102891147136688,
"rms": 0.06252206625772674,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 2.139795918367347,
"observedAt": 2.3568253968253967
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 2.139795918367347
},
{
"loop": false,
"duration": 7.2719954648526075,
"rate": 44100,
"peak": 0.17151515185832977,
"rms": 0.029999999997388373,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 9.54578231292517
}
]
},
{
"environment": "mall",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.2380896806716919,
"rms": 0.025604196806659114,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 2.9524943310657594,
"observedAt": 3.1695238095238096
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 2.9524943310657594
},
{
"loop": false,
"duration": 8.231995464852607,
"rate": 44100,
"peak": 0.1556241363286972,
"rms": 0.029999999999420414,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 10.358480725623583
}
]
},
{
"environment": "mall",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.2380896806716919,
"rms": 0.025604196806659114,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 3.730362811791383,
"observedAt": 3.947392290249433
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 3.730362811791383
},
{
"loop": false,
"duration": 7.367981859410431,
"rate": 44100,
"peak": 0.1556730568408966,
"rms": 0.030000000004112758,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 11.136349206349205
}
]
},
{
"environment": "mall",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.2380896806716919,
"rms": 0.025604196806659114,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 4.601111111111111,
"observedAt": 4.818140589569161
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 4.601111111111111
},
{
"loop": false,
"duration": 7.8959863945578235,
"rate": 44100,
"peak": 0.17480117082595825,
"rms": 0.03000000000458932,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 12.007097505668934
}
]
},
{
"environment": "theater",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15725064277648926,
"rms": 0.025421192976724967,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 5.483469387755102,
"observedAt": 5.688888888888889
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 5.483469387755102
},
{
"loop": false,
"duration": 3.9839909297052154,
"rate": 44100,
"peak": 0.11659345775842667,
"rms": 0.030000000001530757,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 12.889455782312925
}
]
},
{
"environment": "theater",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15725064277648926,
"rms": 0.025421192976724967,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 6.35421768707483,
"observedAt": 6.559637188208617
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 6.35421768707483
},
{
"loop": false,
"duration": 5.159977324263038,
"rate": 44100,
"peak": 0.13959355652332306,
"rms": 0.02999999999427438,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 13.760204081632653
}
]
},
{
"environment": "theater",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15725064277648926,
"rms": 0.025421192976724967,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 7.213356009070295,
"observedAt": 7.430385487528345
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 7.213356009070295
},
{
"loop": false,
"duration": 8.231995464852607,
"rate": 44100,
"peak": 0.16913661360740662,
"rms": 0.030000000002294008,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 14.619342403628117
}
]
},
{
"environment": "department",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.14809074997901917,
"rms": 0.024795763769841984,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 8.037664399092971,
"observedAt": 8.25469387755102
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 8.037664399092971
},
{
"loop": false,
"duration": 4.799977324263039,
"rate": 44100,
"peak": 0.14491155743598938,
"rms": 0.02999999999441348,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 15.443650793650793
}
]
},
{
"environment": "department",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.14809074997901917,
"rms": 0.024795763769841984,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 8.966462585034014,
"observedAt": 9.183492063492064
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 8.966462585034014
},
{
"loop": false,
"duration": 10.871995464852608,
"rate": 44100,
"peak": 0.1587616354227066,
"rms": 0.029999999997777124,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 16.372448979591837
}
]
},
{
"environment": "department",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.14809074997901917,
"rms": 0.024795763769841984,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 9.697891156462585,
"observedAt": 9.914920634920636
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 9.697891156462585
},
{
"loop": false,
"duration": 3.9839909297052154,
"rate": 44100,
"peak": 0.1256658285856247,
"rms": 0.029999999997168104,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 17.103877551020407
}
]
},
{
"environment": "market",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.48508501052856445,
"rms": 0.023929933473605676,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 10.406099773242632,
"observedAt": 10.62312925170068
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 10.406099773242632
},
{
"loop": false,
"duration": 5.039977324263038,
"rate": 44100,
"peak": 0.1459202766418457,
"rms": 0.029999999996415495,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 17.812086167800455
}
]
},
{
"environment": "market",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.48508501052856445,
"rms": 0.023929933473605676,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 11.125918367346939,
"observedAt": 11.34294784580499
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 11.125918367346939
},
{
"loop": false,
"duration": 8.231995464852607,
"rate": 44100,
"peak": 0.1556241363286972,
"rms": 0.029999999999420414,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 18.531904761904762
}
]
},
{
"environment": "market",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.48508501052856445,
"rms": 0.023929933473605676,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 11.85734693877551,
"observedAt": 12.07437641723356
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 11.85734693877551
},
{
"loop": false,
"duration": 5.039977324263038,
"rate": 44100,
"peak": 0.1330045908689499,
"rms": 0.02999999999781341,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 19.263333333333332
}
]
},
{
"environment": "subway",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15436159074306488,
"rms": 0.02903130670200797,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 12.681655328798186,
"observedAt": 12.887074829931972
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 12.681655328798186
},
{
"loop": false,
"duration": 7.127981859410431,
"rate": 44100,
"peak": 0.15355078876018524,
"rms": 0.029999999998472637,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 20.087641723356008
}
]
},
{
"environment": "subway",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15436159074306488,
"rms": 0.02903130670200797,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 13.45952380952381,
"observedAt": 13.664943310657597
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 13.45952380952381
},
{
"loop": false,
"duration": 7.583990929705215,
"rate": 44100,
"peak": 0.17186026275157928,
"rms": 0.029999999998832856,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 20.865510204081634
}
]
},
{
"environment": "subway",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.15436159074306488,
"rms": 0.02903130670200797,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 14.22578231292517,
"observedAt": 14.44281179138322
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 14.22578231292517
},
{
"loop": false,
"duration": 8.447981859410431,
"rate": 44100,
"peak": 0.14815036952495575,
"rms": 0.0300000000042685,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 21.631768707482994
}
]
},
{
"environment": "cafe",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.12247952073812485,
"rms": 0.02407895222985429,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 14.852721088435375,
"observedAt": 15.069750566893424
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 14.852721088435375
},
{
"loop": false,
"duration": 5.015986394557823,
"rate": 44100,
"peak": 0.1483888179063797,
"rms": 0.029999999998264474,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 22.2587074829932
}
]
},
{
"environment": "cafe",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.12247952073812485,
"rms": 0.02407895222985429,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 15.537709750566894,
"observedAt": 15.754739229024944
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 15.537709750566894
},
{
"loop": false,
"duration": 4.799977324263039,
"rate": 44100,
"peak": 0.14491155743598938,
"rms": 0.02999999999441348,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 22.943696145124715
}
]
},
{
"environment": "cafe",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.12247952073812485,
"rms": 0.02407895222985429,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 16.269138321995467,
"observedAt": 16.474557823129253
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 16.269138321995467
},
{
"loop": false,
"duration": 10.775986394557822,
"rate": 44100,
"peak": 0.16052959859371185,
"rms": 0.030000000002635092,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 23.675124716553288
}
]
},
{
"environment": "rain",
"db": -12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.24721868336200714,
"rms": 0.027485239070310512,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 17.151496598639458,
"observedAt": 17.38013605442177
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 17.151496598639458
},
{
"loop": false,
"duration": 8.231995464852607,
"rate": 44100,
"peak": 0.1556241363286972,
"rms": 0.029999999999420414,
"scheduled": 0.10547121049908052,
"master": 1,
"scheduledAt": 24.55748299319728
}
]
},
{
"environment": "rain",
"db": 0,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.24721868336200714,
"rms": 0.027485239070310512,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 17.89453514739229,
"observedAt": 18.11156462585034
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 17.89453514739229
},
{
"loop": false,
"duration": 3.9119954648526076,
"rate": 44100,
"peak": 0.11137215793132782,
"rms": 0.02999999999685517,
"scheduled": 0.4198884518664126,
"master": 1,
"scheduledAt": 25.30052154195011
}
]
},
{
"environment": "rain",
"db": 12,
"sources": [
{
"loop": true,
"duration": 12,
"rate": 44100,
"peak": 0.24721868336200714,
"rms": 0.027485239070310512,
"scheduled": 0.4198884518664126,
"master": 1,
"observed": 0.4198884665966034,
"scheduledAt": 18.567913832199547,
"observedAt": 18.796553287981858
},
{
"loop": false,
"duration": 7.055986394557823,
"rate": 44100,
"peak": 0.1499929130077362,
"rms": 0.03000000000537984,
"scheduled": 0.7557992133595427,
"master": 1,
"scheduledAt": 18.567913832199547
},
{
"loop": false,
"duration": 8.279977324263038,
"rate": 44100,
"peak": 0.14110307395458221,
"rms": 0.029999999996657437,
"scheduled": 1.6716060352062583,
"master": 1,
"scheduledAt": 25.97390022675737
}
]
}
],
"errors": [],
"failed": [],
"external": []
}
@@ -0,0 +1,70 @@
{
"errors": [],
"failed": [],
"external": [],
"audio": {
"starts": [
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 8.351995464852608
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 8.207981859410431
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 4.799977324263039
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 7.4399773242630385
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.055986394557823
},
{
"loop": false,
"duration": 7.583990929705215
},
{
"loop": true,
"duration": 12
},
{
"loop": false,
"duration": 7.583990929705215
}
],
"stops": 15
}
}
@@ -0,0 +1,27 @@
{
"combinations": 20200,
"maximum": 0.6546804814413929,
"voicePeak": 0.2052977830171585,
"backgroundPeak": 0.471954345703125,
"introPeak": 0.14995422959327698,
"bounds": {
"background": 0.55,
"voice": 0.25,
"intro": 0.2
},
"fixedGain": 0.4198884518664126,
"backgroundGains": [
0.4198884518664126
],
"allSignalBoundsVerifiedAtRatesHz": [
24000,
44100,
48000,
96000
],
"browserResampledPeakMaxima": {
"background": 0.4879775941371918,
"voice": 0.20585650454525403,
"intro": 0.14999594059820148
}
}
@@ -0,0 +1,152 @@
{
".agent/evidence-v0.2.5/14-format.log": "4d070d2c56619a8695ee61ce414cc7702fd2ecb7f8489e419f79a9c0996df4cb",
".agent/evidence-v0.2.5/secret-scan.json": "47b71a0fcd639b6de378eec360457ec1b71bd98954288accfe49d566d77fe94b",
".agent/evidence-v0.2.5/environment.json": "e235f5f53f933af7218715561d2b716d5b1a8ac3da482259d9438ef40afde079",
".agent/evidence-v0.2.5/chrome-sandbox.json": "f663dcdd2479fa0ca088416f70c15ccf1336c7016b2edbc7ae11c1e9d7424ae4",
".agent/evidence-v0.2.5/01-loudness-RED.log": "8449091158041b0020e79fb9590014b8c80e8b783d9f1b5f52f91e47a9621d92",
".agent/evidence-v0.2.5/10-generation.log": "ce2e395db0bfce47953cd7c9ff3311a733376d8109941f7f04a919659f0d95f8",
".agent/evidence-v0.2.5/20-asr.log": "9ea57c5166edb70e1af180d95725bc92e04eafa6d0f0a4085eaa2029167f4e41",
".agent/evidence-v0.2.5/final-desktop-all-voices-resampled-bounds.json": "decd928988fef95050f033228748869af2eee2c47397228fbe96f4e9994ea3c4",
".agent/evidence-v0.2.5/12-integrity-RED.log": "e8bd622078a72b3becf1158bcae3855c234fa4d7633e9d58e45452548fb2806d",
".agent/evidence-v0.2.5/30-unit.log": "5e3608e3b43626bee73f654c677a796d1de54ad3f90263606a43219c5b0c2dd2",
".agent/evidence-v0.2.5/28-lint.log": "f20f641f58b253e0c54d7c0b64369353a373488b03211d7a10725f576ce508ed",
".agent/evidence-v0.2.5/39-secret-scan.log": "f0ce65220214f9bc2a44cbcfb419cf73fa5e920f854d4f82131e165d57489da4",
".agent/evidence-v0.2.5/29-python.log": "63d16f9e8b3d570f706cb7145ca310db570b43cf5a36cc533fc378c4e83cebe3",
".agent/evidence-v0.2.5/05-generation.log": "ce2e395db0bfce47953cd7c9ff3311a733376d8109941f7f04a919659f0d95f8",
".agent/evidence-v0.2.5/final-mobile-runtime-audit.json": "05629298db1bdc2fd28b370259f7d9f5b71710f8051e23e31cc21cff91a0f22e",
".agent/evidence-v0.2.5/07-loudness-GREEN.log": "b551cc4c44c90eaa787f90a045cecd8c63816af308fdc4b5e4d38378337dc25b",
".agent/evidence-v0.2.5/38-preservation.log": "920ce87ea86209ae040177a3d80c0b6bb9347cf2e4635aa28e9032fb797c27aa",
".agent/evidence-v0.2.5/16-converter-GREEN.log": "284e0b9efdfbb5462b093b211f92596607b16a7775d5cd3ef6e996202adfb1b8",
".agent/evidence-v0.2.5/02-loudness-RED.log": "ab3c089fff304f11204e474c797911c385e6a1ff615272fe69af09d25f8c46b9",
".agent/evidence-v0.2.5/27-format.log": "db2564a50753e4d7163ceaf4720e57a09386f02912ded00ad53ad0a978fcc634",
".agent/evidence-v0.2.5/25-reproducibility.log": "d5d99d942eb0067fe77caf9be6500d3270efd575c19dfbbdfa629c69e1e8b180",
".agent/evidence-v0.2.5/06-generator-GREEN.log": "18694e1a89c17a81103d7ac0cc08624cc087d579544c0ab86e24a779bdb1e7a7",
".agent/evidence-v0.2.5/baseline.json": "c6f659754007e69a739f37018f4477a6a639af10b63304d9d553f3ddc11894d0",
".agent/evidence-v0.2.5/final-desktop-109-versioned-WAV-integrity.json": "1820e385c5bb9e60f09e0a6ec77e6b16f047a21a7e4d9497553d94bf75a525a7",
".agent/evidence-v0.2.5/final-asr.json": "03c8ad5025a0a62ab195c3425df8741cbd74785a215000a981ccdcf725213cff",
".agent/evidence-v0.2.5/preservation.json": "57ca4e858a7a569840dd05e64a78086e9874beff167b181d0b827e50723b97a4",
".agent/evidence-v0.2.5/40-final-checks.log": "968c54f574d37b1852b65f9c17ebd4bcebd9834336329479b86730d48a180acd",
".agent/evidence-v0.2.5/final-mobile-all-voices-resampled-bounds.json": "decd928988fef95050f033228748869af2eee2c47397228fbe96f4e9994ea3c4",
".agent/evidence-v0.2.5/09-runtime-GREEN.log": "3734c3bf8472f1de50a9555c2fecf9181bc0b4fe0681790b9d8f75037df5d5c2",
".agent/evidence-v0.2.5/03-generator-RED.log": "4594b04ed7f7c8aaebb54cd8f82787f22281b2d1296c308687a6fc41e0538ad0",
".agent/evidence-v0.2.5/18-format.log": "3e363eb237562415dfda246642827234e725fd712f10d4f6f3e0960417cccaa6",
".agent/evidence-v0.2.5/22-build-contract-RED.log": "f764c42a1f5d39b0a98fb9231a35520b16c078fb36177553c0f3ffbdc4b2fe9d",
".agent/evidence-v0.2.5/independent-loudness.json": "90634d6b43183dff73823c9432f6f3f5624c5a0d16279a2f1cf24fcb7e20debc",
".agent/evidence-v0.2.5/gain-math.json": "961fa37836f6367984060259082ab5bceb4675f3bd35f2a2c336336cfd4155b3",
".agent/evidence-v0.2.5/final-mobile-actual-gain-nodes.json": "56dc26260891a330f056e4d4a7d5357f6f0db45f4693c86ace475440ab971422",
".agent/evidence-v0.2.5/24-release-GREEN.log": "f270a822067256c36e5afa879de654be483e532d1cd4059f0175a697ae1ad814",
".agent/evidence-v0.2.5/summarize-browser.py": "9f141c68de8fc64074fcfa3246ce4f38dea67cf7d6787c1d7ec17b40a8a1e5a4",
".agent/evidence-v0.2.5/desktop-all-voices-resampled-bounds.json": "8f31aa6406c9a19369e85c04ee165b2b96975c4f0d28b139c21ff0a724e8485e",
".agent/evidence-v0.2.5/35-independent-measurement.log": "857db285f460b874e9c7c909f89a798f6dba7bffb18f873209b97066efea4b47",
".agent/evidence-v0.2.5/32-lint.log": "f20f641f58b253e0c54d7c0b64369353a373488b03211d7a10725f576ce508ed",
".agent/evidence-v0.2.5/secret-scan.py": "cbb65f8025db01046ff3d96b719e4235e7a95be7f53ef83290c5f71fbc9c0009",
".agent/evidence-v0.2.5/19-build-initial.log": "20eea57d6803b0dc1a439323633dedb339b0794806896d8004e45694e4f8bbde",
".agent/evidence-v0.2.5/34-unit.log": "0f33732c9a3dfcc9018ce4098299ba4d3793fb466f05d856f7c14c53b65e9f9b",
".agent/evidence-v0.2.5/browser-summary.json": "4c3d3bad2794b07b2f80d4e2c3c6703bbe0b8487f1c0afa5c72b5d654249f216",
".agent/evidence-v0.2.5/15-lint-initial.log": "4de1ea190cf7195c905192a2a84fffb29ff1730dc4afdb27d034cfcc40c761bd",
".agent/evidence-v0.2.5/browser-results.json": "d734d9dc79592425ae70ce8dd2afbc08add324f224d6f781491f826b7659cfe3",
".agent/evidence-v0.2.5/final-mobile-109-versioned-WAV-integrity.json": "1820e385c5bb9e60f09e0a6ec77e6b16f047a21a7e4d9497553d94bf75a525a7",
".agent/evidence-v0.2.5/measure.py": "4cae1bdb8dcc6b6032463f4b662b0ebc3d221032a4b6599909b999ff24822370",
".agent/evidence-v0.2.5/chrome-sandbox-final.json": "ea71ff8c49a8fa317e677cb75af9fd76ac08d3948bd793dfc5906788effadbdc",
".agent/evidence-v0.2.5/08-loader-RED.log": "22223c4c25d8754c8740abecb530bb0aabfcd4b55b8ea29e9ba3a19804fac53b",
".agent/evidence-v0.2.5/23-format.log": "81c22719f2974a287f21a096a11ed3fe713a155b07c9dcffcea062c6ecd14700",
".agent/evidence-v0.2.5/17-snr-copy-RED.log": "3d04eeef604ae295038fce1faf413f38cc24ec84149699e30f2f9ac4bae7e16f",
".agent/evidence-v0.2.5/browser-results-initial.json": "ffd0155b0201615cd8923eb6f9d3a545e23b65e42f3be35423574cf9ebf7e56c",
".agent/evidence-v0.2.5/11-version-RED.log": "5a15c20504b4e4cfb07c6b3c9b023cb190fde3b5cd7f0dd39329ae3922527a95",
".agent/evidence-v0.2.5/36-build.log": "f7f11c4f59160688b71704b5ce4f9802947ccc90f67451943cd24c9fd786aa14",
".agent/evidence-v0.2.5/final-desktop-actual-gain-nodes.json": "9248583af4ef13c687ede9074dd485e48b5e46eed0d729cbb202dd50d72fa561",
".agent/evidence-v0.2.5/mobile-actual-gain-nodes.json": "e64054c04b505a008341a898f7d55c32e8f1f3be6169349134ad35a5fe6584ad",
".agent/evidence-v0.2.5/screen-final.py": "43ab0d05bf710506e57eab3ce0ff2b9a6a9fa4a49ceed1c81ff150d79f31cd96",
".agent/evidence-v0.2.5/final-desktop-runtime-audit.json": "cb176b905205c4d02f8a100865d7271375e49e68a4e2614ccfe4b20006ec0ae0",
".agent/evidence-v0.2.5/37-browser.log": "0bfd54b2836b6e5efdc3a2f6fbdb4123a2c7ca9f8726bb36a3483a4cddee987b",
".agent/evidence-v0.2.5/13-integrity-runtime-GREEN.log": "4215726eefb17446cc1fb8b8e881548826be887b3636ee03a1021fa0ef9d0a8d",
".agent/evidence-v0.2.5/check-preservation.py": "23d9257347b8c18a17f824c69c096b9f71ad0027812f20144ea9d42c1ac1f249",
".agent/evidence-v0.2.5/26-exhaustive-gains-GREEN.log": "2e20cacc919bbb89e28b0527973ebbe30cb190008cd4dafdce8a201c51077213",
".agent/evidence-v0.2.5/31-format.log": "332077c47ea1afad47da6df4f00643af5ef4409f809a7ff69ecd640f2f176961",
".agent/evidence-v0.2.5/mobile-all-voices-resampled-bounds.json": "8f31aa6406c9a19369e85c04ee165b2b96975c4f0d28b139c21ff0a724e8485e",
".agent/evidence-v0.2.5/reproduce.py": "1a29068cf252f89481883a73de4badd99da027824616eee6e2d9d9470fffe314",
".agent/evidence-v0.2.5/reproducibility.json": "91b7b2167562d49f15e6e08cc2452a584af09c39d1e99037021c051d0943df06",
".agent/evidence-v0.2.5/validation-summary.json": "f04654ca29d2ee8facad01b9c5de63e9e305ba36f4a7fa5be21a615b893d8a9d",
".agent/evidence-v0.2.5/npm-audit.json": "ea7bab3cc606a95eecdf538b0d02d3cf928bf0f3a1cfb1d2c8ddbe02846d5658",
".agent/evidence-v0.2.5/33-browser-gains-resample.log": "12686f364f5c8b7371275b90127544370426b1bd8a5cdfb4c45e214cfaa70854",
".agent/evidence-v0.2.5/21-browser-initial.log": "1f19842084fcd070004791ce30c2496c1f94ee0eb38eab7ae61b25739fff1140",
".agent/evidence-v0.2.5/browser-gains-resample.json": "136f226b92ac8cd9acd6f18998ef6715a1b9e344c4e1aac9a104dbabe4eb36d0",
".agent/evidence-v0.2.5/04-runtime-RED.log": "150024b5c7c1123f3212edbffa3beee884868f944c08088a086bbe45c7b61615",
".agent/evidence-v0.2.5/desktop-actual-gain-nodes.json": "f2e639c00e13225c5a7aac513a5d57e0f71939d92eabf6af7f046cae047b1322",
".agent/evidence-v0.2.5/browser-initial/.last-run.json": "ef75815d5afd367b9acf58e3b0792842b3de509bb0ff17568a77868d6afd8dd2",
".agent/evidence-v0.2.5/browser-initial/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": "1820e385c5bb9e60f09e0a6ec77e6b16f047a21a7e4d9497553d94bf75a525a7",
".agent/evidence-v0.2.5/browser-initial/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-47652f8135e279b30469bbc5f8cd0a404cdad0d4.json": "1820e385c5bb9e60f09e0a6ec77e6b16f047a21a7e4d9497553d94bf75a525a7",
".agent/evidence-v0.2.5/browser-initial/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": "430ac0bb214269d5dceb0f99856672c4d3f886461bb8a74766ad71fa5f3a559b",
".agent/evidence-v0.2.5/browser-initial/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": "68cc25b4ddc677d36ee838a75d2fd0b1115464c5f943020ce0d695f7ac7a53e9",
".agent/evidence-v0.2.5/browser-initial/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": "8e6b990198a5ba88ab2e0a21c0c9d987ae1598fffd2c1fe5bb549638c59401ae",
".agent/evidence-v0.2.5/browser-initial/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": "02b4aabb8c1001c04d35849718f75f645f3439d77cf98d3d93e9ab7909b46465",
".agent/evidence-v0.2.5/browser-initial/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": "4af9fe33d732661a497e30d2d08a5517679e22f04d7043a5621a14b2e1a83ecd",
".agent/evidence-v0.2.5/browser-initial/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.5/browser-initial/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.5/browser-initial/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.5/browser-initial/ui-\ud55c\uad6d\uc5b4-\uc81c\ubaa9\uc740-\ub2e8\uc5b4-\uc911\uac04\uc5d0\uc11c-\uc904\ubc14\uafc8\ud558\uc9c0-\uc54a\ub294\ub2e4-mobile/heading.png": "b233fbd851313746ed983e74172e02864a15e57ae08d5f44f785a33690774534",
".agent/evidence-v0.2.5/browser-initial/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": "a65bfd9c6c97786c945f3e20d0237defac753f64d2ca9d4536eaa0c603cfbcc6",
".agent/evidence-v0.2.5/browser-initial/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": "31e0a758832f3813e09261601b66553b3dc472c1d35c2317a691426d8c69fb2c",
".agent/evidence-v0.2.5/browser-initial/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": "06026c54567551ea4c4cf78c4321e5bba44d4edd5fb26e163cec26641286f522",
".agent/evidence-v0.2.5/browser-initial/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": "430ac0bb214269d5dceb0f99856672c4d3f886461bb8a74766ad71fa5f3a559b",
".agent/evidence-v0.2.5/browser-initial/gains-\uc2e4\uc81c-GainNode\uc758-\ubc30\uacbd-\ubc30\uc728\uc740-8\ud658\uacbd-\u00d7-SNR-\uacbd\uacc4\u00b70\uc5d0\uc11c-\ub3d9\uc77c\ud558\ub2e4-desktop/trace.zip": "e9679abbc80af0b1191602c159cafe8322923f3efb4e2d74a8418ab64ac0855e",
".agent/evidence-v0.2.5/browser-initial/gains-\uc2e4\uc81c-GainNode\uc758-\ubc30\uacbd-\ubc30\uc728\uc740-8\ud658\uacbd-\u00d7-SNR-\uacbd\uacc4\u00b70\uc5d0\uc11c-\ub3d9\uc77c\ud558\ub2e4-desktop/error-context.md": "af74553e8877262cc784c46410964be4e4b936f7ecd921cc34d40c7f8b599c57",
".agent/evidence-v0.2.5/browser-initial/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": "02b4aabb8c1001c04d35849718f75f645f3439d77cf98d3d93e9ab7909b46465",
".agent/evidence-v0.2.5/browser-initial/ui-\ud55c\uad6d\uc5b4-\uc81c\ubaa9\uc740-\ub2e8\uc5b4-\uc911\uac04\uc5d0\uc11c-\uc904\ubc14\uafc8\ud558\uc9c0-\uc54a\ub294\ub2e4-desktop/heading.png": "18afdc08c2576708a2278e522fd893181c2f15d82ef187aee387cea4a5d0b3fc",
".agent/evidence-v0.2.5/browser-initial/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": "1820e385c5bb9e60f09e0a6ec77e6b16f047a21a7e4d9497553d94bf75a525a7",
".agent/evidence-v0.2.5/browser-initial/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-d3de0117a2809aa5d133d16f92abb0fe37036d79.json": "1820e385c5bb9e60f09e0a6ec77e6b16f047a21a7e4d9497553d94bf75a525a7",
".agent/evidence-v0.2.5/browser-initial/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": "430ac0bb214269d5dceb0f99856672c4d3f886461bb8a74766ad71fa5f3a559b",
".agent/evidence-v0.2.5/browser-initial/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": "68cc25b4ddc677d36ee838a75d2fd0b1115464c5f943020ce0d695f7ac7a53e9",
".agent/evidence-v0.2.5/browser-initial/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": "8e6b990198a5ba88ab2e0a21c0c9d987ae1598fffd2c1fe5bb549638c59401ae",
".agent/evidence-v0.2.5/browser-initial/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": "02b4aabb8c1001c04d35849718f75f645f3439d77cf98d3d93e9ab7909b46465",
".agent/evidence-v0.2.5/browser-initial/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": "371f9dd2629bad933c83c76dfc465fd9fa0223597d481f8c16b52ca3c821b2d2",
".agent/evidence-v0.2.5/browser-initial/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": "e7ac91e88029418c4e44ad0187640b8d5d41caf6897b3d648d173eeadfa51551",
".agent/evidence-v0.2.5/browser-initial/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": "97185ca1d91c894d7d86a9a638644db3645564dac62ba1567807d5d536869f0a",
".agent/evidence-v0.2.5/browser-initial/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": "06026c54567551ea4c4cf78c4321e5bba44d4edd5fb26e163cec26641286f522",
".agent/evidence-v0.2.5/browser-initial/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.5/browser-initial/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.5/browser-initial/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.5/browser-final/.last-run.json": "91d1c43004802cd49950d78eb11c8fa7d05da8ffffe219a8b13b2f561bc00903",
".agent/evidence-v0.2.5/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": "1820e385c5bb9e60f09e0a6ec77e6b16f047a21a7e4d9497553d94bf75a525a7",
".agent/evidence-v0.2.5/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-54f96a91afa1c581d7be72f2dbdd94ea23a87d23.json": "1820e385c5bb9e60f09e0a6ec77e6b16f047a21a7e4d9497553d94bf75a525a7",
".agent/evidence-v0.2.5/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": "430ac0bb214269d5dceb0f99856672c4d3f886461bb8a74766ad71fa5f3a559b",
".agent/evidence-v0.2.5/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": "68cc25b4ddc677d36ee838a75d2fd0b1115464c5f943020ce0d695f7ac7a53e9",
".agent/evidence-v0.2.5/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": "8e6b990198a5ba88ab2e0a21c0c9d987ae1598fffd2c1fe5bb549638c59401ae",
".agent/evidence-v0.2.5/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": "02b4aabb8c1001c04d35849718f75f645f3439d77cf98d3d93e9ab7909b46465",
".agent/evidence-v0.2.5/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": "4af9fe33d732661a497e30d2d08a5517679e22f04d7043a5621a14b2e1a83ecd",
".agent/evidence-v0.2.5/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.5/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.5/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.5/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": "b233fbd851313746ed983e74172e02864a15e57ae08d5f44f785a33690774534",
".agent/evidence-v0.2.5/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": "a65bfd9c6c97786c945f3e20d0237defac753f64d2ca9d4536eaa0c603cfbcc6",
".agent/evidence-v0.2.5/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": "81cf03610b038667128d028d1b494887a48ea259d228de9003ea10f9c84c7fc7",
".agent/evidence-v0.2.5/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": "06026c54567551ea4c4cf78c4321e5bba44d4edd5fb26e163cec26641286f522",
".agent/evidence-v0.2.5/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": "430ac0bb214269d5dceb0f99856672c4d3f886461bb8a74766ad71fa5f3a559b",
".agent/evidence-v0.2.5/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": "02b4aabb8c1001c04d35849718f75f645f3439d77cf98d3d93e9ab7909b46465",
".agent/evidence-v0.2.5/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": "18afdc08c2576708a2278e522fd893181c2f15d82ef187aee387cea4a5d0b3fc",
".agent/evidence-v0.2.5/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": "1820e385c5bb9e60f09e0a6ec77e6b16f047a21a7e4d9497553d94bf75a525a7",
".agent/evidence-v0.2.5/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-28c1b4d2683d66c6192313dc941bdb855519117d.json": "1820e385c5bb9e60f09e0a6ec77e6b16f047a21a7e4d9497553d94bf75a525a7",
".agent/evidence-v0.2.5/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": "430ac0bb214269d5dceb0f99856672c4d3f886461bb8a74766ad71fa5f3a559b",
".agent/evidence-v0.2.5/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": "68cc25b4ddc677d36ee838a75d2fd0b1115464c5f943020ce0d695f7ac7a53e9",
".agent/evidence-v0.2.5/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": "8e6b990198a5ba88ab2e0a21c0c9d987ae1598fffd2c1fe5bb549638c59401ae",
".agent/evidence-v0.2.5/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": "02b4aabb8c1001c04d35849718f75f645f3439d77cf98d3d93e9ab7909b46465",
".agent/evidence-v0.2.5/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": "87aa486ce206737f2468d88cd64ab98e2891aecfc3e888932046f76ba574823e",
".agent/evidence-v0.2.5/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": "e7ac91e88029418c4e44ad0187640b8d5d41caf6897b3d648d173eeadfa51551",
".agent/evidence-v0.2.5/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": "97185ca1d91c894d7d86a9a638644db3645564dac62ba1567807d5d536869f0a",
".agent/evidence-v0.2.5/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": "06026c54567551ea4c4cf78c4321e5bba44d4edd5fb26e163cec26641286f522",
".agent/evidence-v0.2.5/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.5/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.5/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.5/browser-gains-resample/.last-run.json": "91d1c43004802cd49950d78eb11c8fa7d05da8ffffe219a8b13b2f561bc00903",
".agent/evidence-v0.2.5/baseline/voice-manifest.json": "ad2a24d75da19888b724cfb025025f9aa78a49883c610be93082b83edf8f471a",
".agent/evidence-v0.2.5/baseline/ambience/subway.wav": "9faf70b68617d267b367a0f3692ed90015458543ab4b0844f6c704e6a724728f",
".agent/evidence-v0.2.5/baseline/ambience/street.wav": "a8bffa201b174618955bc51b860167169125304811aabe2086b0bb35b06c3ae1",
".agent/evidence-v0.2.5/baseline/ambience/AMBIENCE_NOTICES.md": "dc3b61da7d2829e9025573cde5d23a8b3d9b44da6154a620463adfc1f5455040",
".agent/evidence-v0.2.5/baseline/ambience/market.wav": "d6f73d86aea98b83e2995e61baaa7315a0ea7adeebc093769d76e1569b207658",
".agent/evidence-v0.2.5/baseline/ambience/cafe.wav": "6853c121104940041c268a2891eadae032c17aa22b4c3b3ddfbc025262434995",
".agent/evidence-v0.2.5/baseline/ambience/mall.wav": "680a769940c08f0d12c6c954c08366598dd8b5745e276f39c82b10d1a88261a1",
".agent/evidence-v0.2.5/baseline/ambience/manifest.json": "2aeae8bb7a1f6e12543ba7e32a233b47b1ebcfdd65c7e55f67fc8f22f8d0f8c1",
".agent/evidence-v0.2.5/baseline/ambience/department.wav": "aa43f3d1d3e7c2b1f8ace24ecbda45d0ea3a031db941c39506dc6c1665b8efa7",
".agent/evidence-v0.2.5/baseline/ambience/theater.wav": "2d6a444fb7874cdf6b2d8a741a69175299b112eb66834912c025437d8277d635",
".agent/evidence-v0.2.5/baseline/ambience/rain.wav": "f4315084e820f742b0709de5bb0d1abd3d5af1730620e08c2948b70347356dd9"
}
@@ -0,0 +1,28 @@
"""생성기/manifest 통계를 사용하지 않는 전용 ebur128 릴리스 측정 증거."""
import hashlib
import json
from pathlib import Path
import re
import subprocess
ROOT = Path(__file__).resolve().parents[3]
EVIDENCE = Path(__file__).resolve().parent
rows = []
for path in sorted((ROOT/'public/ambience').glob('*.wav')):
command = ['ffmpeg','-nostdin','-hide_banner','-i',str(path),'-af','ebur128=peak=true','-f','null','-']
digest = hashlib.sha256(path.read_bytes()).hexdigest()
result = subprocess.run(command, check=True, capture_output=True, text=True, timeout=30)
summary = result.stderr.rsplit('Summary:',1)[1]
integrated = float(re.search(r'I:\s+([-\d.]+) LUFS',summary)[1])
peak = float(re.search(r'Peak:\s+([-\d.]+) dBFS',summary)[1])
assert hashlib.sha256(path.read_bytes()).hexdigest() == digest
rows.append({'file':str(path.relative_to(ROOT)), 'sha256':digest, 'bytes':path.stat().st_size,
'integratedLUFS':integrated, 'truePeakDBTP':peak, 'rawSummary':summary})
spread=max(r['integratedLUFS'] for r in rows)-min(r['integratedLUFS'] for r in rows)
passed=len(rows)==8 and spread<=0.4 and all(abs(r['integratedLUFS']+32.5)<=0.2 and r['truePeakDBTP']<=-6 for r in rows)
report={'measurementFilter':'ebur128=peak=true','targetIntegratedLUFS':-32.5,'toleranceLU':0.2,'maximumSpreadLU':0.4,
'truePeakCeilingDBTP':-6,'ffmpegVersion':subprocess.check_output(['ffmpeg','-version'],text=True).splitlines()[0],
'scriptSha256':hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), 'spreadLU':spread,'passed':passed,'files':rows}
with (EVIDENCE/'ebur128-results.json').open('x') as stream: stream.write(json.dumps(report,indent=2)+'\n')
print(json.dumps(report,indent=2))
assert passed
@@ -0,0 +1,39 @@
"""독립 BS.1770 구현으로 exact WAV를 검사한다. 일반 npm test에서는 실행하지 않는다."""
import hashlib
from importlib.metadata import version
import json
from pathlib import Path
import platform
import sys
import pyloudnorm as pyln
import soundfile as sf
ROOT = Path(__file__).resolve().parents[3]
EVIDENCE = Path(__file__).resolve().parent
assert version('pyloudnorm') == '0.2.0'
assert version('soundfile') == '0.13.1'
def sha(path):
return hashlib.sha256(path.read_bytes()).hexdigest()
rows = []
# manifest의 loudness나 생성기 함수를 읽지 않고 실제 파일을 독립 구현으로 측정한다.
for path in sorted((ROOT / 'public/ambience').glob('*.wav')):
before = sha(path)
data, rate = sf.read(path, dtype='float64', always_2d=False)
assert rate == 24000 and data.shape == (288000,)
meter = pyln.Meter(rate, filter_class='K-weighting', block_size=0.400)
value = float(meter.integrated_loudness(data))
assert sha(path) == before
rows.append({'file': str(path.relative_to(ROOT)), 'sha256': before, 'bytes': path.stat().st_size,
'frames': len(data), 'sampleRate': rate, 'integratedLUFS': value,
'targetErrorLU': value + 32.5})
spread = max(r['integratedLUFS'] for r in rows) - min(r['integratedLUFS'] for r in rows)
passed = len(rows) == 8 and all(abs(r['targetErrorLU']) <= 0.2 for r in rows) and spread <= 0.4
report = {'method': 'Independent pyloudnorm BS.1770 K-weighting, 400ms blocks, mono exact PCM16 decoded by soundfile',
'python': platform.python_version(), 'versions': {name: version(name) for name in ('pyloudnorm','soundfile','numpy','scipy','cffi','pycparser','future')},
'libsndfileVersion': sf.__libsndfile_version__, 'scriptSha256': sha(Path(__file__)),
'manifestSha256': sha(ROOT/'public/ambience/manifest.json'), 'targetIntegratedLUFS': -32.5,
'toleranceLU': 0.2, 'maximumSpreadLU': 0.4, 'spreadLU': spread, 'passed': passed, 'files': rows}
with (EVIDENCE/'pyloudnorm-results.json').open('x') as stream:
stream.write(json.dumps(report, indent=2, allow_nan=False)+'\n')
print(json.dumps(report, indent=2, allow_nan=False))
if not passed: sys.exit('Independent loudness release criterion failed')
@@ -0,0 +1,22 @@
{
"auditReportVersion": 2,
"vulnerabilities": {},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 0,
"high": 0,
"critical": 0,
"total": 0
},
"dependencies": {
"prod": 4,
"dev": 260,
"optional": 27,
"peer": 8,
"peerOptional": 0,
"total": 263
}
}
}
@@ -0,0 +1,58 @@
{
"historicalV025FilesPreserved": 150,
"earlierImmutableFilesPreserved": 660,
"voiceWavsPreserved": 101,
"sourcePlanSha256": "3529c8534be204208ac504a0f4c1a69b312131f9bbff92aa9a3135d61d24db65",
"sourceAndSegmentsPreserved": [
{
"environmentId": "street",
"sourceSha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"sourceBytes": 3414104,
"startSeconds": 35
},
{
"environmentId": "mall",
"sourceSha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"sourceBytes": 1666896,
"startSeconds": 36
},
{
"environmentId": "theater",
"sourceSha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"sourceBytes": 1485015,
"startSeconds": 45
},
{
"environmentId": "department",
"sourceSha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"sourceBytes": 2445024,
"startSeconds": 90
},
{
"environmentId": "market",
"sourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"sourceBytes": 622200,
"startSeconds": 24
},
{
"environmentId": "subway",
"sourceSha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"sourceBytes": 3343901,
"startSeconds": 65
},
{
"environmentId": "cafe",
"sourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"sourceBytes": 19947952,
"startSeconds": 0
},
{
"environmentId": "rain",
"sourceSha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"sourceBytes": 91187572,
"startSeconds": 180
}
],
"newAmbienceCount": 8,
"allPublicFilesMatchDist": true
}
@@ -0,0 +1,7 @@
cffi==1.17.1 --hash=sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d
future==1.0.0 --hash=sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216
numpy==2.2.6 --hash=sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf
pycparser==2.22 --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc
pyloudnorm==0.2.0 --hash=sha256:9bb69afb904f59d007a7f9ba3d75d16fb8aeef35c44d6df822a9f192d69cf13f
scipy==1.15.3 --hash=sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982
soundfile==0.13.1 --hash=sha256:03267c4e493315294834a0870f31dbb3b28a95561b80b134f0bd3cf2d5f0e618
@@ -0,0 +1,7 @@
cffi==1.17.1
future==1.0.0
numpy==2.2.6
pycparser==2.22
pyloudnorm==0.2.0
scipy==1.15.3
soundfile==0.13.1
@@ -0,0 +1,95 @@
{
"method": "Independent pyloudnorm BS.1770 K-weighting, 400ms blocks, mono exact PCM16 decoded by soundfile",
"python": "3.11.16",
"versions": {
"pyloudnorm": "0.2.0",
"soundfile": "0.13.1",
"numpy": "2.2.6",
"scipy": "1.15.3",
"cffi": "1.17.1",
"pycparser": "2.22",
"future": "1.0.0"
},
"libsndfileVersion": "1.2.2",
"scriptSha256": "b87ec3ab26ea0775f7a8fe6d1baf1aad50e429632705d6e3bf06268ed7b9a4cc",
"manifestSha256": "6433bf23af35f24031c6bbe784dd0abf9330f276da6b8705e47c7a1144a285b7",
"targetIntegratedLUFS": -32.5,
"toleranceLU": 0.2,
"maximumSpreadLU": 0.4,
"spreadLU": 0.07715477923686365,
"passed": true,
"files": [
{
"file": "public/ambience/cafe.wav",
"sha256": "864a81571a2e25a99d6408aa282570e7996c7ace432cf4f4f294677ea5bcad63",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.60621761696535,
"targetErrorLU": -0.10621761696535259
},
{
"file": "public/ambience/department.wav",
"sha256": "93e5c23bff2b19716dd21111746837a4df8c52d4b88c6874e57828d09ca5507e",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.55798042645585,
"targetErrorLU": -0.057980426455849
},
{
"file": "public/ambience/mall.wav",
"sha256": "a0a135e319ed70f55b03c6e266fb047e53db8008277a6ba8b855a05a1b82662f",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.575453741417206,
"targetErrorLU": -0.07545374141720629
},
{
"file": "public/ambience/market.wav",
"sha256": "7178307c48c192ac396dcd3c880c377bf56b45e829b459b1feca9f986437e632",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.52906283772849,
"targetErrorLU": -0.029062837728488944
},
{
"file": "public/ambience/rain.wav",
"sha256": "1842a717e6c77811cb6d6cb09d364e8ef644d50e6beb97d3d187c96e95d85784",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.56530955673126,
"targetErrorLU": -0.0653095567312576
},
{
"file": "public/ambience/street.wav",
"sha256": "dace0969087539e5b67fb6fac11b759e81626574230ca7f8d2feb484753656a8",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.54629472521665,
"targetErrorLU": -0.04629472521664724
},
{
"file": "public/ambience/subway.wav",
"sha256": "e85cf77a9baa7560fb09966c4eda3b128b92647bc4c54c417a29b4e0f4ac129f",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.5601852061342,
"targetErrorLU": -0.06018520613420009
},
{
"file": "public/ambience/theater.wav",
"sha256": "634fc25e8c4e9dcbab97688bc4c0ef9b0299cc7c4c921781a70740aabe46b900",
"bytes": 576044,
"frames": 288000,
"sampleRate": 24000,
"integratedLUFS": -32.59002557282089,
"targetErrorLU": -0.09002557282089185
}
]
}
@@ -0,0 +1,37 @@
[
{
"file": "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"bytes": 467242,
"sha256": "610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"
},
{
"file": "future-1.0.0-py3-none-any.whl",
"bytes": 491326,
"sha256": "929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"
},
{
"file": "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"bytes": 16821570,
"sha256": "ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"
},
{
"file": "pycparser-2.22-py3-none-any.whl",
"bytes": 117552,
"sha256": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"
},
{
"file": "pyloudnorm-0.2.0-py3-none-any.whl",
"bytes": 10879,
"sha256": "9bb69afb904f59d007a7f9ba3d75d16fb8aeef35c44d6df822a9f192d69cf13f"
},
{
"file": "scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"bytes": 37652622,
"sha256": "39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982"
},
{
"file": "soundfile-0.13.1-py2.py3-none-manylinux_2_28_x86_64.whl",
"bytes": 1313646,
"sha256": "03267c4e493315294834a0870f31dbb3b28a95561b80b134f0bd3cf2d5f0e618"
}
]
@@ -0,0 +1,42 @@
{
"version": "0.2.5",
"sourcePlan": ".agent/AMBIENCE-SOURCES-v0.2.3.json",
"sourcePlanSha256": "3529c8534be204208ac504a0f4c1a69b312131f9bbff92aa9a3135d61d24db65",
"sourcePolicy": "Preserve all eight source hashes, bytes, segments, creators, licenses and attribution exactly. Offline input cache only.",
"normalization": {
"algorithm": "FFmpeg loudnorm EBU R128 two-pass linear; independent final PCM input measurement",
"targetIntegratedLUFS": -32.0,
"truePeakCeilingDBTP": -6.0,
"filterTruePeakDBTP": -6.1,
"targetLRA": 50,
"dualMono": false,
"toleranceLU": 0.2,
"maximumSpreadLU": 0.4,
"measurementFilter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json"
},
"ffmpegVersion": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers",
"pcm": {
"durationSeconds": 12,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"fadeSeconds": 0.05
},
"runtime": {
"peakBounds": {
"background": 0.55,
"voice": 0.25,
"intro": 0.2
},
"snrMax": 12,
"introRelativeGain": 1.8,
"mixCeiling": 0.8,
"fixedHeadroomGain": 0.4198884518664126
},
"privacy": {
"priorScreening": ".agent/evidence-v0.2.3/privacy-screening/final-asr.json",
"priorOwnerApprovalScope": "Exact v0.2.3 derivative WAVs only; no inferred approval of changed v0.2.5 WAVs.",
"humanListeningAcceptance": false,
"legalPrivacyClearance": false
}
}
@@ -0,0 +1,228 @@
# Find-Word v0.2.5 구현·검증 결과
작성일: 2026-10-14 UTC. 작업 경로: `/home/hermes/worktrees/find-word-v0.2.5`.
브랜치: `fix/v0.2.5-ambience-loudness`. 기준/현재 HEAD:
`812540c7438639f25b886cfd620201d92de15362` (변경 없음).
## 결과와 인수 경계
요청한 로컬 구현을 완료했다. 선언한 **FFmpeg 6.1.1 loudnorm 입력 측정** 기준으로 실제 8 WAV의
integrated loudness는 **−38.69~−22.20 LUFS, spread 16.49 LU → −32.01~−32.00 LUFS,
spread 0.01 LU**다. 고정 목표 **−32 LUFS**, 허용오차 ±0.2 LU, spread≤0.4 LU를 통과한다.
최대 true peak는 **−6.62 dBTP**, 선언 ceiling **−6 dBTP** 이하다.
런타임 배경 gain은 환경·현재 SNR·intro 유무에 무관한 **0.4198884518664126**이다.
lint/typecheck, 139 unit/component/release tests, 40 Python tests, build, npm audit,
sandboxed system Chrome desktop/mobile 36 tests를 통과했다. 이전 증거 660개와 voice WAV
101개, 원본 8개·구간·creator·license·attribution을 보존했다. **commit/push/merge/tag/deploy는 하지 않았다.**
인수 시 다음 두 제한을 반드시 함께 읽어야 한다.
1. 별도 FFmpeg `ebur128=peak=true` 진단 계기는 최종 **−33.5~−31.5 LUFS, spread 2.0 LU**를 보고한다.
이 계기에서는 ±0.2/0.4 LU 조건을 통과하지 않는다. 계약 계기는 사용자 baseline 16.49 LU와 같은
`loudnorm input_i`로 명시했다. 독립 검증은 생성기/manifest 수치를 재사용하지 않고 실제 파일을
별도 프로세스로 분석한다는 뜻이며, 서로 다른 EBU 계기의 상호 일치를 뜻하지 않는다.
2. 새 exact WAV의 추가 ASR 재검사는 **market 1 segment, requiredEmptyPassed=false**다.
이를 성공으로 바꾸거나 원본 구간/ASR 설정을 변경하지 않았다. 이전 Oz 승인은 exact v0.2.3 WAV에
한정되며 새 바이트의 승인으로 확대하지 않았다. **humanListeningAcceptance=false,
legalPrivacyClearance=false**이며 새 자산의 privacy/청취 인수와 릴리스 결정은 남아 있다.
## 입력·출처·버전 보존
- [.agent/TASK-v0.2.5.md](TASK-v0.2.5.md), [ACCEPTANCE-v0.2.5.md](ACCEPTANCE-v0.2.5.md)를
읽고 현재 코드/테스트/문서와 v0.2.3 결과·privacy/원자 발행 증거를 확인했다. 원본 task/checklist는 수정하지 않았다.
- 원본은 `/tmp/findword-ambience-sources`의 8개 파일만 사용했다. 불변 선정 계획
[AMBIENCE-SOURCES-v0.2.3.json](AMBIENCE-SOURCES-v0.2.3.json)의 SHA-256은
`3529c8534be204208ac504a0f4c1a69b312131f9bbff92aa9a3135d61d24db65`다.
- 새 [정규화 계획](AMBIENCE-NORMALIZATION-v0.2.5.json)을 분리했다. 기존 계획의 모든 항목을 새 manifest와
비교하고, source SHA-256/bytes를 실제 원본과 대조했다. 원본 다운로드나 외부 TTS 호출은 없었다.
- 기존 8 WAV/manifest/notice는 [baseline snapshot](evidence-v0.2.5/baseline/ambience/)에 보존했다.
기존 `.agent/evidence*`/RESULT와 다른 추적 `.agent` 파일 660개의 SHA-256이 모두 동일하다.
- 101개 voice WAV는 바이트 동일하며 voice manifest의 제품 버전만 0.2.5로 갱신했다.
- package/lock/HTML/UI/README/LICENSE/문서/두 manifest 및 voice·ambience query가 0.2.5다.
정확한 `Designed by OZ at Heat-T Medical Inc.`와 MIT 제3자 notice, 시장 CC BY-SA 4.0 등
기존 creator·권리·출처·변경 고지를 유지했다. 이전 CHANGELOG 본문은 그대로다.
- 보존 결과: [preservation.json](evidence-v0.2.5/preservation.json),
[기준 해시 목록](evidence-v0.2.5/baseline.json). public 전체와 dist의 대응 파일도 바이트 동일하다.
## 오프라인 생성과 최종 파일 독립 측정
`scripts/ambience_audio.py`는 해시 검증 → 승인 구간 추출/mono/24kHz → 기존 50ms 양끝 선형 fade →
2-pass loudnorm → PCM16 인코딩 → 최종 파일 재측정 → 전체 staging 검증 → 원자 발행 순서다.
Ogg seek가 짧은 PCM을 반환하면 기존 full decode/sample trim fallback을 사용하며,
padding이나 구간 변경으로 길이를 맞추지 않는다.
공통 필터는 `loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json`이다.
목표 −32는 crest factor가 큰 market까지 선형 gain만으로 −6 dBTP ceiling을 지킬 수 있도록 정했다.
필터 ceiling −6.1은 최종 ceiling −6보다 여유를 둔다. LRA=50은 원본 다이내믹을 압축하지 않기 위한
허용 상한이며 최종 LRA를 50으로 만드는 목표가 아니다.
pass1과 pass2에는 동일한 fade 적용 float PCM을 입력한다. pass2는 pass1의 measured_I/TP/LRA/thresh,
`offset=0:linear=true`를 사용한다. 동적 1-pass 출력 예측의 `target_offset`은 선형 입력 gain 보정에
사용하지 않는다. FFmpeg의 0 LRA sentinel은 전달 인자만 0.01로 올리고 원래 통계를 보존한다.
실제 8개 입력은 모두 LRA>0이다. pass2가 dynamic으로 fallback하면 생성 실패로 처리한다.
round(sample×32767)로 PCM16을 만들고 clipping clamp/dither 없이 범위를 검증한다. 각 파일은
**288,000 frames, 정확히 12초, 24,000Hz, mono, PCM16, 576,044 bytes**, non-silent이고 고유 hash다.
시작/마지막 sample은 0이며 50ms fade를 유지한다. 생성기는 최종 WAV를 새 FFmpeg 프로세스로
읽고 `input_i/input_lra/input_tp`를 검사한다. 측정 필터의 `output_*`는 가상 재정규화 결과라서
번들 측정값으로 사용하지 않는다. pass1/pass2/final 전체 JSON과 필터는 manifest에 보존한다.
| 환경 | 보존 구간(초) | 이전 LUFS | 최종 LUFS | 최종 LRA LU | 최종 dBTP | 최종 sample peak |
| --- | --- | --- | --- | --- | --- | --- |
| street | 35–47 | −30.54 | −32.00 | 4.00 | −9.49 | 0.3353271484375 |
| mall | 36–48 | −22.65 | −32.01 | 1.30 | −11.68 | 0.2449951171875 |
| theater | 45–57 | −22.66 | −32.00 | 0.90 | −15.44 | 0.16900634765625 |
| department | 90–102 | −22.22 | −32.00 | 3.70 | −16.18 | 0.15399169921875 |
| market | 24–36 | −26.51 | −32.01 | 7.10 | −6.62 | 0.45123291015625 |
| subway | 65–77 | −24.14 | −32.00 | 4.90 | −15.29 | 0.171966552734375 |
| cafe | 0–12 | −22.20 | −32.00 | 0.30 | −17.59 | 0.131317138671875 |
| rain | 180–192 | −38.69 | −32.01 | 10.10 | −13.09 | 0.220947265625 |
`tests/python/test_loudness_audio.py`는 생성기 함수를 import하지 않고 실제 WAV를 FFmpeg로 독립 분석한다.
같은 계기 기준 최대 목표 오차 0.01 LU, spread 0.01 LU, 최대 true peak −6.62 dBTP다.
별도 ebur128의 true peak도 모두 ceiling을 통과한다. 초기 독립 테스트의 추가 ebur128 integrated
동등성 assertion은 계기 간 불일치를 확인한 뒤 제거했고, 해당 값/로그와 제한은 그대로 공개했다.
계약 계기의 target/spread assertion은 유지한다. 이 차이의 내부 원인을 확정했다고 주장하지 않는다.
- [독립 before/after 전체 측정·hash](evidence-v0.2.5/independent-loudness.json)
- [독립 측정 실행 로그](evidence-v0.2.5/35-independent-measurement.log)
- [public manifest 전체 pass 통계](../public/ambience/manifest.json)
- [재현성 결과](evidence-v0.2.5/reproducibility.json): 원본에서 별도 디렉터리로 두 번 생성해
현재 public WAV/notice와 바이트 동일, manifest는 실행 시각 `generatedAtUtc`만 제외하고 완전 동일.
- [재현 스크립트](evidence-v0.2.5/reproduce.py), [실행 로그](evidence-v0.2.5/25-reproducibility.log).
재현성 범위는 기록된 FFmpeg 버전/입력/플랫폼이다. 다른 FFmpeg 빌드의 바이트 동일성을 보장하지 않는다.
실제 FFmpeg 측정 프로세스 실패, NaN, 목표 이탈, peak 초과, 원본 mismatch, 잘못된 출처/notice,
쓰기 실패, 검증 실패, KeyboardInterrupt, renameat2 실패에서 이전 공개 디렉터리를 보존한다.
원자 교환을 지원하지 않으면 실패하며 비원자 교체로 우회하지 않는다. 전원 손실 내구성 보장은 별도다.
## 런타임 고정 gain과 fail-closed 경계
이전 +6dB/luck-apple/intro 조건의 market 배경 gain은 **0.7259647911927253**,
최종 RMS는 **0.021778943734156713**이었으며 다른 환경은 gain=1/RMS=.03이었다.
기존 peak 의존 gain은 전체 비교에서도 1,084개 서로 다른 값을 만들어 문제를 재현했다.
새 런타임은 배경 PCM을 그대로 복사하고, voice/intro만 기존 RMS **.03**으로 정규화한다.
검증된 보수적 peak 상한은 **B=.55, V=.25, I=.20**, intro 최대 상대 gain은 **1.8**,
허용 SNR_MAX는 **12dB**, master≤1에서 합성 ceiling은 **.8**이다.
```text
r_max = 10^(12/20) = 3.9810717055349722
D = B + V*r_max + I*1.8 = 1.905267926383743
G = min(1, 0.8/D) = 0.4198884518664126
backgroundGain(db, environment, introPresent) = G
voiceGain(db) = G*10^(db/20)
introGain = G*1.8
|mixedSample| ≤ master*G*(B + V*r_max + I*1.8) ≤ 0.8
```
삼각부등식으로 모든 위상/동시 overlap의 최악값까지 포함한다. 현재 파일의 실측 peak,
환경, 현재 SNR, intro 유무는 G 계산에 들어가지 않는다. 배경 fade envelope는 기존과 같으며
그 최대 gain만 G다. SNR은 voice의 기준 대비 gain 차이이지 실제 음성/배경 RMS 동등성을 뜻하지 않는다.
UI 설명도 이에 맞게 수정했다. master와 intro fade, 3문항/단계/정답/점수/재청취 동작은 유지한다.
실제 101 voice × 8 ambience × −12~+12의 모든 정수 25 SNR = **20,200개**를 검사했다.
실측 최대 voice peak=.2052977830171585, intro=.14995422959327698, background=.45123291015625.
이를 사용한 최악 합성 peak 상계는 **.6459797899491659 < .8**이며 배경 gain 집합의 크기는 1이다.
[gain-math.json](evidence-v0.2.5/gain-math.json), [전수 GREEN](evidence-v0.2.5/26-exhaustive-gains-GREEN.log).
Chrome에서 109 WAV를 24k/44.1k/48k/96kHz로 모두 디코드했다(프로젝트별 436개 측정).
리샘플 후 최대 background=.466545045375824, voice=.20585650454525403, intro=.14999594059820148로
모든 보수적 상한 이하다. 실제 장치 rate에서 상한을 넘는 파일은 gain을 낮추지 않고 재생을 거부한다.
URL/bytes/SHA-256은 앱에 번들한 manifest를 기준으로 디코드 전에 확인한다. 외부/알 수 없는/이전 query,
변조·축약 응답, 잘못된 채널/길이, nonfinite/무음/과도 peak는 fail closed한다. HTTP 200 WAV 한 sample
변조도 실제 Chrome에서 소스 시작 전에 차단하고, 원본 재시도는 성공한다.
실제 native Web Audio 메서드를 실행하면서 8환경 × SNR −12/0/+12의 GainNode를 프로젝트별 24회
관찰했다. 예약 값은 모두 **.4198884518664126**, `AudioParam.value` 실측은 모두
**.4198884665966034**(float32 반올림)다. 값에 맞춰 기다리지 않고 실제 AudioContext 시계가
fade 종료 뒤에 도달했을 때 한 번 읽는다. master=1, voice/intro RMS .03, 같은 환경의 배경 RMS가
SNR별로 동일함도 확인했다. [최종 browser summary](evidence-v0.2.5/browser-summary.json)에 원문 첨부 경로가 있다.
## Strict vertical-slice TDD 기록
기대 실패를 먼저 실행하고 원문을 보존한 뒤 해당 구현을 진행했다. 실패 로그를 덮어쓰지 않았다.
| Slice | 실제 RED 증거 | 변경 후 GREEN 증거 |
| --- | --- | --- |
| 실제 WAV loudness/spread/metadata | [02-loudness-RED](evidence-v0.2.5/02-loudness-RED.log): 16.49 LU 및 metadata 누락 | [07-loudness-GREEN](evidence-v0.2.5/07-loudness-GREEN.log), [35 독립 재측정](evidence-v0.2.5/35-independent-measurement.log) |
| 측정 실패/목표·TP·NaN 원자 발행 차단 | [03-generator-RED](evidence-v0.2.5/03-generator-RED.log): 4 실패 | [29-python](evidence-v0.2.5/29-python.log): 40 통과 |
| 고정 gain/실제 전수 peak | [04-runtime-RED](evidence-v0.2.5/04-runtime-RED.log): market 추가 감쇠·gain 불일치 | [09-runtime-GREEN](evidence-v0.2.5/09-runtime-GREEN.log), [26 전수](evidence-v0.2.5/26-exhaustive-gains-GREEN.log) |
| loader 배경 원본 PCM/peak 차단 | [08-loader-RED](evidence-v0.2.5/08-loader-RED.log) | [13-integrity-runtime-GREEN](evidence-v0.2.5/13-integrity-runtime-GREEN.log) |
| 제품/자산 0.2.5 정렬 | [11-version-RED](evidence-v0.2.5/11-version-RED.log): 8 실패 | [24-release-GREEN](evidence-v0.2.5/24-release-GREEN.log) |
| 실제 응답 bytes/hash 무결성 | [12-integrity-RED](evidence-v0.2.5/12-integrity-RED.log): 새 경계 모듈 없음 | [13-integrity-runtime-GREEN](evidence-v0.2.5/13-integrity-runtime-GREEN.log), [37 Chrome](evidence-v0.2.5/37-browser.log) |
| 기준 대비 SNR UI 설명 | [17-snr-copy-RED](evidence-v0.2.5/17-snr-copy-RED.log) | [24-release-GREEN](evidence-v0.2.5/24-release-GREEN.log) |
| 빌드 manifest 계약 위조 거부 | [22-build-contract-RED](evidence-v0.2.5/22-build-contract-RED.log): 5 실패 | [24-release-GREEN](evidence-v0.2.5/24-release-GREEN.log), [36-build](evidence-v0.2.5/36-build.log) |
중간 실행의 실수/실패도 남겼다. `01-loudness-RED.log`는 harness 경로 오류여서 유효한 제품 RED로
세지 않는다. `06-generator-GREEN.log`는 이름과 달리 **실패**한 중간 실행이다(0 LRA fixture의
FFmpeg sentinel); 수정 후 `16-converter-GREEN.log`와 최종 Python이 통과했다.
`15-lint.log`의 관측 코드 타입 오류를 수정했다. `21-browser-initial.log`는 33 통과/1 실패이며
wall clock과 audio clock의 차이 때문에 너무 일찍 GainNode를 읽었다. clock 기반 관측으로 수정한
focused 6 tests(`33-browser-gains-resample.log`)와 최종 36 tests가 통과했다.
`30-unit.log`는 138 통과/1 실패였으며, 늘어난 실제 Python 계약 검사가 기존 subprocess 60초
제한을 넘었다. 180초로 조정 후 동일 테스트를 포함한 `34-unit.log`가 전부 통과했다.
`20-asr.log`는 현재도 **실패 기록**이며 GREEN으로 분류하지 않는다.
## 최종 실행 결과와 재검증 명령
환경: Node v26.7.0, npm 11.19.0, Python 3.11.16, FFmpeg 6.1.1-3ubuntu5,
Google Chrome 146.0.7680.80. [environment.json](evidence-v0.2.5/environment.json).
| 검사 | 결과 | 증거 |
| --- | --- | --- |
| `npm run lint` (ESLint + tsc) | PASS | [32-lint.log](evidence-v0.2.5/32-lint.log) |
| `npm test` | 15 files / **139 tests PASS** | [34-unit.log](evidence-v0.2.5/34-unit.log) |
| `python3 -m unittest discover -s tests/python -v` | **40 tests PASS**, 64.954초 | [29-python.log](evidence-v0.2.5/29-python.log) |
| `npm run build` | PASS, 109 WAV와 notice/manifest 검증 | [36-build.log](evidence-v0.2.5/36-build.log) |
| `npm audit --json` | **0 vulnerabilities** | [npm-audit.json](evidence-v0.2.5/npm-audit.json) |
| system Chrome desktop/mobile 전체 | **36 PASS**, skipped/flaky/unexpected=0, 296.138초 | [37-browser.log](evidence-v0.2.5/37-browser.log), [JSON](evidence-v0.2.5/browser-results.json) |
| 정상 실제 오디오 흐름 | console/page errors=0, failed requests=0, external runtime requests=0, axe violations=0 | [browser-summary.json](evidence-v0.2.5/browser-summary.json) |
| 보존/원본/배포물 byte 대조 | PASS | [38-preservation.log](evidence-v0.2.5/38-preservation.log), [preservation.json](evidence-v0.2.5/preservation.json) |
| secret scan | PASS, 저장소/새 증거의 텍스트 검사 | [40-final-checks.log](evidence-v0.2.5/40-final-checks.log) |
| `git diff --check` | PASS | [40-final-checks.log](evidence-v0.2.5/40-final-checks.log) |
```bash
npm run lint
npm test
python3 -m unittest discover -s tests/python -v
npm run build
npm audit --json
CHROME_PATH=/usr/bin/google-chrome PLAYWRIGHT_NO_SANDBOX=0 \
PLAYWRIGHT_JSON_OUTPUT_FILE=.agent/evidence-v0.2.5/browser-results.json \
npx playwright test --reporter=line,json --output=.agent/evidence-v0.2.5/browser-final
python3 .agent/evidence-v0.2.5/measure.py
python3 .agent/evidence-v0.2.5/reproduce.py
python3 .agent/evidence-v0.2.5/check-preservation.py
python3 .agent/evidence-v0.2.5/secret-scan.py
git diff --check
```
Chrome은 sandbox를 켠 system executable로 실행했다. 작업 디렉터리로 범위를 제한한 실제 Chrome
프로세스 인자에 `--no-sandbox`가 없음을 [chrome-sandbox-final.json](evidence-v0.2.5/chrome-sandbox-final.json)에
보존했다. 109 WAV의 해시/24kHz decode, 모든 환경 실제 loop/start/stop, 3문항 고정 단계·다음 단계·
시작 단계·SNR·중도 종료·무응답·재청취·음량·404 재시도·layout/axe를 검사했다.
의도적으로 주입한 404/변조 시나리오의 오류는 정상 흐름 0건 통계에서 제외한다.
desktop/mobile은 같은 system Chrome의 viewport/touch emulation이며 물리 모바일/Safari 인증이 아니다.
## Privacy, 문서와 릴리스 인계
추가 ASR은 로컬 캐시의 동일 tiny multilingual 모델, faster-whisper 1.2.1 CPU int8,
beam_size=5, best_of=5, 기본 VAD, condition_on_previous_text=true로 새 정확한 해시를 검사했다.
시장 1개 segment와 나머지 7개 0개 결과를 원문 그대로
[final-asr.json](evidence-v0.2.5/final-asr.json)에 보존했다. ASR text는 검증된 전사가 아니며
환각일 수 있고, 성공/실패 모두 실제 대화·음악의 유무나 법적 허용 여부를 확정하지 않는다.
이전 실패/no-VAD/최종 결과/승인은 원본 파일 그대로다. 원문 ASR의 prior/supplementary 경로는
기존 v0.2.3 privacy-screening 증거 기준이다. 새 privacy gate 실패를 숨기기 위해 segment를
삭제하거나 모델/VAD/threshold/원본 구간을 바꾸지 않았다.
README, ARCHITECTURE, AUDIO_PROVENANCE, DEPLOYMENT, WORDS, CHANGELOG, license notice를 갱신했다.
변경한 DSP/loader/무결성/생성기/빌드 검증과 테스트에는 핵심 매개변수·상한·공식·실패 경계의
한국어 설계 주석을 추가했다. 과거 문서의 v0.2.3 출처/측정/승인은 역사 기록으로 표시했다.
수용 기준 중 로컬 구현/검증은 위 선언한 loudnorm 측정 범위에서 완료했다. 별도 ebur128 계기
불일치와 새 ASR 실패는 인수 제한으로 남는다. ACCEPTANCE의 릴리스 3항(Neo 독립 검증 후
commit-addressed 원자 배포, 공개 WAV LUFS/true peak/hash/MIME·production Chrome,
feature push/main fast-forward/annotated tag/fresh clone)은 사용자 지시에 따라 **미실행**이다.
secrets를 읽거나 사용하지 않았고 외부 메시지·원격 Git 변경·배포를 하지 않았다.
@@ -0,0 +1,93 @@
# Find-Word v0.2.5 — 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, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement; 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, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement; source seconds 36–48.
## 극장 — theater
Suggested: Crowd Ambience - Theater, by ElevatorFan2020, from Freesound, CC0 1.0.
Creator: ElevatorFan2020
Source: https://freesound.org/people/ElevatorFan2020/sounds/853576/
Download: https://cdn.freesound.org/previews/853/853576_14269391-lq.mp3
License: CC0 1.0 Universal — https://creativecommons.org/publicdomain/zero/1.0/
Output license: CC0 1.0 Universal
Changes: excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement; 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, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement; 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, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement; source seconds 24–36.
## 지하철 — subway
TTC Subway Line 1 Ambience - Museum to Union, by PascalHD, CC BY 4.0, via Wikimedia Commons/Freesound. Modified by excerpting, trimming, fades, normalization, downmixing, resampling and PCM WAV conversion.
Creator: PascalHD
Source: https://commons.wikimedia.org/wiki/File:TTC_Subway_Line_1_Ambience_-_Museum_to_Union_(Freesound).ogg
Download: https://upload.wikimedia.org/wikipedia/commons/d/d3/TTC_Subway_Line_1_Ambience_-_Museum_to_Union_%28Freesound%29.ogg
License: CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/
Output license: CC BY 4.0
Changes: excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement; 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, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement; source seconds 0–12.
## 비 오는 거리 — rain
Suggested: Urban Street on a Rainy Afternoon, by Extemporalist, via Wikimedia Commons, CC0 1.0.
Creator: Extemporalist
Source: https://commons.wikimedia.org/wiki/File:Urban_Street_on_a_Rainy_Afternoon.flac
Download: https://upload.wikimedia.org/wikipedia/commons/8/8c/Urban_Street_on_a_Rainy_Afternoon.flac
License: CC0 1.0 Universal — https://creativecommons.org/publicdomain/zero/1.0/
Output license: CC0 1.0 Universal
Changes: excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement; source seconds 180–192.
@@ -0,0 +1,655 @@
{
"version": "0.2.5",
"normalization": {
"algorithm": "FFmpeg loudnorm EBU R128 two-pass linear; independent final PCM input measurement",
"targetIntegratedLUFS": -32.0,
"truePeakCeilingDBTP": -6.0,
"filterTruePeakDBTP": -6.1,
"targetLRA": 50,
"dualMono": false,
"toleranceLU": 0.2,
"maximumSpreadLU": 0.4,
"measurementFilter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json"
},
"generatedAtUtc": "2026-10-14T10:23:04.620836+00:00",
"toolVersions": {
"ffmpeg": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers"
},
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16",
"files": [
{
"environmentId": "street",
"displayName": "길거리",
"pageUrl": "https://commons.wikimedia.org/wiki/File:Sunday_in_the_city_street_noise2.ogg",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/2/24/Sunday_in_the_city_street_noise2.ogg",
"creator": "cori (Cori Samuel)",
"license": "Public domain (PD-author)",
"licenseUrl": "https://commons.wikimedia.org/wiki/Template:PD-author",
"attribution": "Suggested: Sunday, 4th May 2008 5.05pm - sounds outside my window, by cori (Cori Samuel), via Wikimedia Commons; public domain.",
"expectedSourceSha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"sourceBytes": 3414104,
"directMediaDurationSeconds": 264.254694,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 35,
"file": "street.wav",
"sourceSha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"outputLicense": "Public domain (PD-author)",
"verificationDateUtc": "2026-10-14",
"sha256": "1e12ed82c07550e22905b912a8f862ce10dfe884b5d36a928f7a04628665529d",
"bytes": 576044,
"duration": 12.0,
"rms": 0.06761004836258645,
"peak": 0.3353271484375,
"conversion": {
"startSeconds": 35,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"loudness": {
"pass1Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json",
"pass2Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json:measured_I=-35.88:measured_TP=-13.37:measured_LRA=4.0:measured_thresh=-45.88:offset=0:linear=true",
"pass1": {
"input_i": "-35.88",
"input_tp": "-13.37",
"input_lra": "4.00",
"input_thresh": "-45.88",
"output_i": "-33.21",
"output_tp": "-10.31",
"output_lra": "3.40",
"output_thresh": "-43.21",
"normalization_type": "dynamic",
"target_offset": "1.21"
},
"pass2": {
"input_i": "-35.68",
"input_tp": "-13.37",
"input_lra": "4.80",
"input_thresh": "-45.68",
"output_i": "-31.80",
"output_tp": "-9.49",
"output_lra": "4.80",
"output_thresh": "-41.80",
"normalization_type": "linear",
"target_offset": "-0.20"
},
"final": {
"input_i": "-32.00",
"input_tp": "-9.49",
"input_lra": "4.00",
"input_thresh": "-42.00",
"output_i": "-33.21",
"output_tp": "-10.30",
"output_lra": "3.40",
"output_thresh": "-43.21",
"normalization_type": "dynamic",
"target_offset": "1.21"
}
},
"operations": "excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement"
}
},
{
"environmentId": "mall",
"displayName": "쇼핑몰",
"pageUrl": "https://commons.wikimedia.org/wiki/File:1_minute_at_the_alexa_mall_in_berlin.ogg",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/f/fd/1_minute_at_the_alexa_mall_in_berlin.ogg",
"creator": "thore (Thore)",
"license": "Public domain (PD-author)",
"licenseUrl": "https://commons.wikimedia.org/wiki/Template:PD-author",
"attribution": "Suggested: 1 minute at the Alexa mall in Berlin, by thore, via Wikimedia Commons; public domain.",
"expectedSourceSha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"sourceBytes": 1666896,
"directMediaDurationSeconds": 60.05551,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 36,
"file": "mall.wav",
"sourceSha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"outputLicense": "Public domain (PD-author)",
"verificationDateUtc": "2026-10-14",
"sha256": "c1100129d5e05b5fa7a7545b44ebe5cff455576543a27f3c7cbb937fde6a7c69",
"bytes": 576044,
"duration": 12.0,
"rms": 0.027251114844723298,
"peak": 0.2449951171875,
"conversion": {
"startSeconds": 36,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"loudness": {
"pass1Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json",
"pass2Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json:measured_I=-22.14:measured_TP=-1.82:measured_LRA=1.4:measured_thresh=-32.14:offset=0:linear=true",
"pass1": {
"input_i": "-22.14",
"input_tp": "-1.82",
"input_lra": "1.40",
"input_thresh": "-32.14",
"output_i": "-31.73",
"output_tp": "-11.54",
"output_lra": "0.90",
"output_thresh": "-41.73",
"normalization_type": "dynamic",
"target_offset": "-0.27"
},
"pass2": {
"input_i": "-22.09",
"input_tp": "-2.36",
"input_lra": "1.40",
"input_thresh": "-32.09",
"output_i": "-31.95",
"output_tp": "-12.22",
"output_lra": "1.50",
"output_thresh": "-41.95",
"normalization_type": "linear",
"target_offset": "-0.05"
},
"final": {
"input_i": "-32.01",
"input_tp": "-11.68",
"input_lra": "1.30",
"input_thresh": "-42.01",
"output_i": "-31.73",
"output_tp": "-11.54",
"output_lra": "0.90",
"output_thresh": "-41.73",
"normalization_type": "dynamic",
"target_offset": "-0.27"
}
},
"operations": "excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement"
}
},
{
"environmentId": "theater",
"displayName": "극장",
"pageUrl": "https://freesound.org/people/ElevatorFan2020/sounds/853576/",
"directUrl": "https://cdn.freesound.org/previews/853/853576_14269391-lq.mp3",
"creator": "ElevatorFan2020",
"license": "CC0 1.0 Universal",
"licenseUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
"attribution": "Suggested: Crowd Ambience - Theater, by ElevatorFan2020, from Freesound, CC0 1.0.",
"expectedSourceSha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"sourceBytes": 1485015,
"directMediaDurationSeconds": 176.901224,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 45,
"file": "theater.wav",
"sourceSha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"outputLicense": "CC0 1.0 Universal",
"verificationDateUtc": "2026-10-14",
"sha256": "1fa8c57ce39013ff6bc4c0c4e8aff42f295781d27ba763b2990efe4727b4bd27",
"bytes": 576044,
"duration": 12.0,
"rms": 0.027309642076388547,
"peak": 0.16900634765625,
"conversion": {
"startSeconds": 45,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"loudness": {
"pass1Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json",
"pass2Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json:measured_I=-25.82:measured_TP=-9.26:measured_LRA=0.9:measured_thresh=-35.82:offset=0:linear=true",
"pass1": {
"input_i": "-25.82",
"input_tp": "-9.26",
"input_lra": "0.90",
"input_thresh": "-35.82",
"output_i": "-31.85",
"output_tp": "-15.56",
"output_lra": "0.80",
"output_thresh": "-41.85",
"normalization_type": "dynamic",
"target_offset": "-0.15"
},
"pass2": {
"input_i": "-25.70",
"input_tp": "-9.26",
"input_lra": "1.10",
"input_thresh": "-35.70",
"output_i": "-31.89",
"output_tp": "-15.44",
"output_lra": "1.10",
"output_thresh": "-41.89",
"normalization_type": "linear",
"target_offset": "-0.11"
},
"final": {
"input_i": "-32.00",
"input_tp": "-15.44",
"input_lra": "0.90",
"input_thresh": "-42.00",
"output_i": "-31.85",
"output_tp": "-15.56",
"output_lra": "0.80",
"output_thresh": "-41.85",
"normalization_type": "dynamic",
"target_offset": "-0.15"
}
},
"operations": "excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement"
}
},
{
"environmentId": "department",
"displayName": "백화점",
"pageUrl": "https://freesound.org/people/icmusic/sounds/268941/",
"directUrl": "https://cdn.freesound.org/previews/268/268941_40107-lq.mp3",
"creator": "icmusic",
"license": "CC0 1.0 Universal",
"licenseUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
"attribution": "Suggested: US Department store - checkouts, by icmusic, from Freesound, CC0 1.0.",
"expectedSourceSha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"sourceBytes": 2445024,
"directMediaDurationSeconds": 292.872,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 90,
"file": "department.wav",
"sourceSha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"outputLicense": "CC0 1.0 Universal",
"verificationDateUtc": "2026-10-14",
"sha256": "101683ffb99c666a36b42b92661fdc404f1e2eb114f52ad03dc971734fcab375",
"bytes": 576044,
"duration": 12.0,
"rms": 0.025934230237752497,
"peak": 0.15399169921875,
"conversion": {
"startSeconds": 90,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"loudness": {
"pass1Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json",
"pass2Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json:measured_I=-23.99:measured_TP=-8.17:measured_LRA=3.7:measured_thresh=-33.99:offset=0:linear=true",
"pass1": {
"input_i": "-23.99",
"input_tp": "-8.17",
"input_lra": "3.70",
"input_thresh": "-33.99",
"output_i": "-31.23",
"output_tp": "-15.60",
"output_lra": "2.40",
"output_thresh": "-41.23",
"normalization_type": "dynamic",
"target_offset": "-0.77"
},
"pass2": {
"input_i": "-24.08",
"input_tp": "-8.24",
"input_lra": "3.90",
"input_thresh": "-34.08",
"output_i": "-32.09",
"output_tp": "-16.25",
"output_lra": "3.90",
"output_thresh": "-42.09",
"normalization_type": "linear",
"target_offset": "0.09"
},
"final": {
"input_i": "-32.00",
"input_tp": "-16.18",
"input_lra": "3.70",
"input_thresh": "-42.00",
"output_i": "-31.23",
"output_tp": "-15.59",
"output_lra": "2.40",
"output_thresh": "-41.23",
"normalization_type": "dynamic",
"target_offset": "-0.77"
}
},
"operations": "excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement"
}
},
{
"environmentId": "market",
"displayName": "시장",
"pageUrl": "https://commons.wikimedia.org/wiki/File:Italia_Palermo_mercato-Ballaro_20161225_122421.ogg",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/e/e8/Italia_Palermo_mercato-Ballaro_20161225_122421.ogg",
"creator": "Marie Flutre (Wikimedia user Timflutre)",
"license": "CC BY-SA 4.0",
"licenseUrl": "https://creativecommons.org/licenses/by-sa/4.0/",
"attribution": "Italia Palermo mercato-Ballaro 20161225 122421, by Marie Flutre, CC BY-SA 4.0, via Wikimedia Commons. Modified by excerpting, trimming, fades, normalization, downmixing, resampling and PCM WAV conversion. The derivative audio remains CC BY-SA 4.0.",
"expectedSourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"sourceBytes": 622200,
"directMediaDurationSeconds": 76.696961,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 24,
"file": "market.wav",
"sourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"outputLicense": "CC BY-SA 4.0",
"verificationDateUtc": "2026-10-14",
"sha256": "b85044f3f0a9717f8bc86152ccacaf9752d63f156e9044a6ab955b33caeebad8",
"bytes": 576044,
"duration": 12.0,
"rms": 0.022879647581302516,
"peak": 0.45123291015625,
"conversion": {
"startSeconds": 24,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"loudness": {
"pass1Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json",
"pass2Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json:measured_I=-25.51:measured_TP=-0.13:measured_LRA=7.1:measured_thresh=-35.54:offset=0:linear=true",
"pass1": {
"input_i": "-25.51",
"input_tp": "-0.13",
"input_lra": "7.10",
"input_thresh": "-35.54",
"output_i": "-30.46",
"output_tp": "-6.10",
"output_lra": "3.90",
"output_thresh": "-40.46",
"normalization_type": "dynamic",
"target_offset": "-1.54"
},
"pass2": {
"input_i": "-26.35",
"input_tp": "-0.42",
"input_lra": "7.10",
"input_thresh": "-36.35",
"output_i": "-32.84",
"output_tp": "-6.91",
"output_lra": "7.10",
"output_thresh": "-42.84",
"normalization_type": "linear",
"target_offset": "0.84"
},
"final": {
"input_i": "-32.01",
"input_tp": "-6.62",
"input_lra": "7.10",
"input_thresh": "-42.03",
"output_i": "-30.46",
"output_tp": "-6.10",
"output_lra": "3.90",
"output_thresh": "-40.46",
"normalization_type": "dynamic",
"target_offset": "-1.54"
}
},
"operations": "excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement"
}
},
{
"environmentId": "subway",
"displayName": "지하철",
"pageUrl": "https://commons.wikimedia.org/wiki/File:TTC_Subway_Line_1_Ambience_-_Museum_to_Union_(Freesound).ogg",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/d/d3/TTC_Subway_Line_1_Ambience_-_Museum_to_Union_%28Freesound%29.ogg",
"creator": "PascalHD",
"license": "CC BY 4.0",
"licenseUrl": "https://creativecommons.org/licenses/by/4.0/",
"attribution": "TTC Subway Line 1 Ambience - Museum to Union, by PascalHD, CC BY 4.0, via Wikimedia Commons/Freesound. Modified by excerpting, trimming, fades, normalization, downmixing, resampling and PCM WAV conversion.",
"expectedSourceSha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"sourceBytes": 3343901,
"directMediaDurationSeconds": 425.024,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 65,
"file": "subway.wav",
"sourceSha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"outputLicense": "CC BY 4.0",
"verificationDateUtc": "2026-10-14",
"sha256": "c613d36d303194a2768da0a93156b2e5a4073460fe899bb2f42ba330521443fd",
"bytes": 576044,
"duration": 12.0,
"rms": 0.03234758164589298,
"peak": 0.171966552734375,
"conversion": {
"startSeconds": 65,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"loudness": {
"pass1Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json",
"pass2Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json:measured_I=-16.94:measured_TP=-0.23:measured_LRA=4.8:measured_thresh=-26.94:offset=0:linear=true",
"pass1": {
"input_i": "-16.94",
"input_tp": "-0.23",
"input_lra": "4.80",
"input_thresh": "-26.94",
"output_i": "-32.84",
"output_tp": "-16.64",
"output_lra": "4.10",
"output_thresh": "-42.84",
"normalization_type": "dynamic",
"target_offset": "0.84"
},
"pass2": {
"input_i": "-16.48",
"input_tp": "-0.23",
"input_lra": "4.70",
"input_thresh": "-26.48",
"output_i": "-31.54",
"output_tp": "-15.29",
"output_lra": "4.80",
"output_thresh": "-41.54",
"normalization_type": "linear",
"target_offset": "-0.46"
},
"final": {
"input_i": "-32.00",
"input_tp": "-15.29",
"input_lra": "4.90",
"input_thresh": "-42.00",
"output_i": "-32.84",
"output_tp": "-16.64",
"output_lra": "4.10",
"output_thresh": "-42.84",
"normalization_type": "dynamic",
"target_offset": "0.84"
}
},
"operations": "excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement"
}
},
{
"environmentId": "cafe",
"displayName": "카페",
"pageUrl": "https://commons.wikimedia.org/wiki/File:Cafe_ambiance.ogg",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/5/54/Cafe_ambiance.ogg",
"creator": "Marble Toast",
"license": "CC0 1.0 Universal",
"licenseUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
"attribution": "Suggested: Cafe ambiance, by Marble Toast, via Wikimedia Commons, CC0 1.0.",
"expectedSourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"sourceBytes": 19947952,
"directMediaDurationSeconds": 1200.000998,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 0,
"file": "cafe.wav",
"sourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"outputLicense": "CC0 1.0 Universal",
"verificationDateUtc": "2026-10-14",
"sha256": "6a86d722d23c47d6f3512cf364de18287335b050ad72e639f9a83ba40b669016",
"bytes": 576044,
"duration": 12.0,
"rms": 0.02589284072747213,
"peak": 0.131317138671875,
"conversion": {
"startSeconds": 0,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"loudness": {
"pass1Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json",
"pass2Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json:measured_I=-19.63:measured_TP=-5.22:measured_LRA=0.3:measured_thresh=-29.63:offset=0:linear=true",
"pass1": {
"input_i": "-19.63",
"input_tp": "-5.22",
"input_lra": "0.30",
"input_thresh": "-29.63",
"output_i": "-32.00",
"output_tp": "-17.64",
"output_lra": "0.30",
"output_thresh": "-42.00",
"normalization_type": "dynamic",
"target_offset": "-0.00"
},
"pass2": {
"input_i": "-19.52",
"input_tp": "-5.26",
"input_lra": "0.30",
"input_thresh": "-29.52",
"output_i": "-31.89",
"output_tp": "-17.63",
"output_lra": "0.30",
"output_thresh": "-41.89",
"normalization_type": "linear",
"target_offset": "-0.11"
},
"final": {
"input_i": "-32.00",
"input_tp": "-17.59",
"input_lra": "0.30",
"input_thresh": "-42.00",
"output_i": "-32.00",
"output_tp": "-17.64",
"output_lra": "0.30",
"output_thresh": "-42.00",
"normalization_type": "dynamic",
"target_offset": "-0.00"
}
},
"operations": "excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement"
}
},
{
"environmentId": "rain",
"displayName": "비 오는 거리",
"pageUrl": "https://commons.wikimedia.org/wiki/File:Urban_Street_on_a_Rainy_Afternoon.flac",
"directUrl": "https://upload.wikimedia.org/wikipedia/commons/8/8c/Urban_Street_on_a_Rainy_Afternoon.flac",
"creator": "Extemporalist",
"license": "CC0 1.0 Universal",
"licenseUrl": "https://creativecommons.org/publicdomain/zero/1.0/",
"attribution": "Suggested: Urban Street on a Rainy Afternoon, by Extemporalist, via Wikimedia Commons, CC0 1.0.",
"expectedSourceSha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"sourceBytes": 91187572,
"directMediaDurationSeconds": 1800.0,
"sourceVerification": {
"status": "verified",
"dateUtc": "2026-10-14",
"method": "SHA-256, byte count, ffprobe format.duration, full FFmpeg decode",
"evidence": ".agent/evidence-v0.2.3/source-integrity.json"
},
"selectedSegmentStartSeconds": 180,
"file": "rain.wav",
"sourceSha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"outputLicense": "CC0 1.0 Universal",
"verificationDateUtc": "2026-10-14",
"sha256": "06d59315d23343fab9c5bd8fbbec044f797d7384480b7f70454b11b1676355ae",
"bytes": 576044,
"duration": 12.0,
"rms": 0.024561801864354006,
"peak": 0.220947265625,
"conversion": {
"startSeconds": 180,
"durationSeconds": 12,
"seekMethod": "input seek",
"fadeSeconds": 0.05,
"sampleRate": 24000,
"channels": 1,
"encoding": "PCM16 little-endian",
"loudness": {
"pass1Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json",
"pass2Filter": "loudnorm=I=-32:TP=-6.1:LRA=50:dual_mono=false:print_format=json:measured_I=-50.72:measured_TP=-31.81:measured_LRA=10.1:measured_thresh=-60.72:offset=0:linear=true",
"pass1": {
"input_i": "-50.72",
"input_tp": "-31.81",
"input_lra": "10.10",
"input_thresh": "-60.72",
"output_i": "-28.22",
"output_tp": "-8.24",
"output_lra": "8.10",
"output_thresh": "-38.22",
"normalization_type": "dynamic",
"target_offset": "-3.78"
},
"pass2": {
"input_i": "-52.18",
"input_tp": "-31.83",
"input_lra": "10.00",
"input_thresh": "-62.18",
"output_i": "-33.46",
"output_tp": "-13.11",
"output_lra": "10.10",
"output_thresh": "-43.46",
"normalization_type": "linear",
"target_offset": "1.46"
},
"final": {
"input_i": "-32.01",
"input_tp": "-13.09",
"input_lra": "10.10",
"input_thresh": "-42.01",
"output_i": "-28.22",
"output_tp": "-8.24",
"output_lra": "8.10",
"output_thresh": "-38.22",
"normalization_type": "dynamic",
"target_offset": "-3.78"
}
},
"operations": "excerpt, downmix, resample, linear end fades, FFmpeg EBU R128 two-pass linear loudnorm, PCM16 WAV encoding, final loudness/true-peak measurement"
}
}
]
}
@@ -0,0 +1,28 @@
"""승인 원본으로 두 번 재생성하고 public과 비교한다. 기존 공개 폴더는 수정하지 않는다."""
import hashlib
import json
from pathlib import Path
import sys
import tempfile
ROOT = Path(__file__).resolve().parents[3]
sys.path.insert(0, str(ROOT / 'scripts'))
import ambience_audio as audio
plan = json.loads((ROOT / '.agent/AMBIENCE-SOURCES-v0.2.3.json').read_text())
current = json.loads((ROOT / 'public/ambience/manifest.json').read_text())
with tempfile.TemporaryDirectory(prefix='findword-reproduce-') as directory:
output = Path(directory) / 'ambience'
first = audio.generate(plan, '/tmp/findword-ambience-sources', output)
second = audio.generate(plan, '/tmp/findword-ambience-sources', output)
# 생성 시각만 달라질 수 있다. gain/iteration 통계·필터·PCM·notice의 재현성을 별도로 검사한다.
assert first['files'] == second['files'] == current['files']
assert (output / 'AMBIENCE_NOTICES.md').read_bytes() == (ROOT / 'public/ambience/AMBIENCE_NOTICES.md').read_bytes()
report = {'twoGenerationsMatchPublished': True, 'ignoredField': 'generatedAtUtc',
'toolVersions': first['toolVersions'], 'normalization': first['normalization'],
'files': [{'environmentId': f['environmentId'], 'sourceSha256': f['sourceSha256'],
'sourceBytes': f['sourceBytes'], 'selectedSegmentStartSeconds': f['selectedSegmentStartSeconds'],
'sha256': f['sha256'], 'bytes': f['bytes'], 'final': f['conversion']['loudness']['final']}
for f in first['files']]}
(Path(__file__).parent / 'reproducibility.json').write_text(json.dumps(report, indent=2)+'\n')
print('PASS: all eight source hashes verified, two independent generations and published WAVs/pass metrics/notices match.')
@@ -0,0 +1,131 @@
{
"twoGenerationsMatchPublished": true,
"ignoredField": "generatedAtUtc",
"toolVersions": {
"ffmpeg": "ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers"
},
"normalization": {
"algorithm": "FFmpeg ebur128 measurement; scalar volume in double precision; PCM16; fresh ebur128 verification",
"targetIntegratedLUFS": -32.5,
"truePeakCeilingDBTP": -6.0,
"internalTruePeakCeilingDBTP": -6.2,
"toleranceLU": 0.2,
"maximumSpreadLU": 0.4,
"measurementFilter": "ebur128=peak=true",
"maximumIterations": 3
},
"files": [
{
"environmentId": "street",
"sourceSha256": "0ddb0be7eb3427f781c8268bcbc74b8ad7e1fbf75b9f6966e65274dbe85f3d9d",
"sourceBytes": 3414104,
"selectedSegmentStartSeconds": 35,
"sha256": "dace0969087539e5b67fb6fac11b759e81626574230ca7f8d2feb484753656a8",
"bytes": 576044,
"final": {
"integratedLUFS": -32.5,
"truePeakDBTP": -10.2,
"loudnessRangeLU": 4.6,
"thresholdLUFS": -42.5
}
},
{
"environmentId": "mall",
"sourceSha256": "bb066e130e5d665db57cb5f88e820d053c724d8f777b275213998d2074c6529a",
"sourceBytes": 1666896,
"selectedSegmentStartSeconds": 36,
"sha256": "a0a135e319ed70f55b03c6e266fb047e53db8008277a6ba8b855a05a1b82662f",
"bytes": 576044,
"final": {
"integratedLUFS": -32.5,
"truePeakDBTP": -12.2,
"loudnessRangeLU": 1.4,
"thresholdLUFS": -42.5
}
},
{
"environmentId": "theater",
"sourceSha256": "05c3ece7c088f34700b7610f791c0ad848a24c77be2c32fd1503a78356739a43",
"sourceBytes": 1485015,
"selectedSegmentStartSeconds": 45,
"sha256": "634fc25e8c4e9dcbab97688bc4c0ef9b0299cc7c4c921781a70740aabe46b900",
"bytes": 576044,
"final": {
"integratedLUFS": -32.5,
"truePeakDBTP": -16.1,
"loudnessRangeLU": 1.0,
"thresholdLUFS": -42.5
}
},
{
"environmentId": "department",
"sourceSha256": "261fda28722fba623483a90b32e7a2ec388c59887f56a5247156b53f1ffb6ccd",
"sourceBytes": 2445024,
"selectedSegmentStartSeconds": 90,
"sha256": "93e5c23bff2b19716dd21111746837a4df8c52d4b88c6874e57828d09ca5507e",
"bytes": 576044,
"final": {
"integratedLUFS": -32.5,
"truePeakDBTP": -16.6,
"loudnessRangeLU": 4.2,
"thresholdLUFS": -42.5
}
},
{
"environmentId": "market",
"sourceSha256": "fc0075dce8ad05b56460c9f18754c27b2021f21f1c780a595ccda648d33c941d",
"sourceBytes": 622200,
"selectedSegmentStartSeconds": 24,
"sha256": "7178307c48c192ac396dcd3c880c377bf56b45e829b459b1feca9f986437e632",
"bytes": 576044,
"final": {
"integratedLUFS": -32.5,
"truePeakDBTP": -6.2,
"loudnessRangeLU": 6.5,
"thresholdLUFS": -42.4
}
},
{
"environmentId": "subway",
"sourceSha256": "41fcf064cde53cef1528fe98721347851e60c070d8ff9f213f354025cf272d4c",
"sourceBytes": 3343901,
"selectedSegmentStartSeconds": 65,
"sha256": "e85cf77a9baa7560fb09966c4eda3b128b92647bc4c54c417a29b4e0f4ac129f",
"bytes": 576044,
"final": {
"integratedLUFS": -32.5,
"truePeakDBTP": -16.2,
"loudnessRangeLU": 4.9,
"thresholdLUFS": -42.5
}
},
{
"environmentId": "cafe",
"sourceSha256": "6360791fdcee1f64638f0fc9abd6d2c7a1aa75fd3d2b80033170a02d025099dc",
"sourceBytes": 19947952,
"selectedSegmentStartSeconds": 0,
"sha256": "864a81571a2e25a99d6408aa282570e7996c7ace432cf4f4f294677ea5bcad63",
"bytes": 576044,
"final": {
"integratedLUFS": -32.5,
"truePeakDBTP": -18.2,
"loudnessRangeLU": 0.5,
"thresholdLUFS": -42.5
}
},
{
"environmentId": "rain",
"sourceSha256": "ef0511593b1bb0ba47d5c5dafd83eb07ba854b5a65fd5d41b8c76a1b3ff2c22a",
"sourceBytes": 91187572,
"selectedSegmentStartSeconds": 180,
"sha256": "1842a717e6c77811cb6d6cb09d364e8ef644d50e6beb97d3d187c96e95d85784",
"bytes": 576044,
"final": {
"integratedLUFS": -32.5,
"truePeakDBTP": -12.1,
"loudnessRangeLU": 8.4,
"thresholdLUFS": -42.5
}
}
]
}
@@ -0,0 +1,89 @@
"""새 v0.2.5 WAV만 오프라인 ASR로 검사한다. 과거 승인이나 법적 인수를 승계하지 않는다."""
from dataclasses import asdict
from datetime import datetime, timezone
import hashlib
from importlib.metadata import version
import inspect
import json
import math
from pathlib import Path
import platform
import sys
import ctranslate2
from faster_whisper import WhisperModel
ROOT = Path(__file__).resolve().parents[3]
EVIDENCE = Path(__file__).resolve().parent
# 과거 실패·no-VAD 증거는 읽기만 하고 현재 결과를 독립 파일에 기록한다.
PRIOR_EVIDENCE = ROOT / ".agent/evidence-v0.2.3/privacy-screening"
REVISION = 'd90ca5fe260221311c53c58e660288d3deb8d356'
SNAPSHOT = Path.home() / '.cache/huggingface/hub/models--Systran--faster-whisper-tiny/snapshots' / REVISION
def json_safe(value):
"""JSON의 비유한 수는 명시적 객체로 보존하며 반환 segment를 삭제하거나 고치지 않는다."""
if isinstance(value, float) and not math.isfinite(value):
return {'nonFiniteFloat': 'NaN' if math.isnan(value) else 'Infinity' if value > 0 else '-Infinity'}
if isinstance(value, dict): return {key: json_safe(item) for key, item in value.items()}
if isinstance(value, (list, tuple)): return [json_safe(item) for item in value]
return value
def sha(path):
"""원본/모델/실행 스크립트의 연결은 전체 바이트 SHA-256으로 검증한다."""
with path.open('rb') as stream: return hashlib.file_digest(stream, 'sha256').hexdigest()
assert version('faster-whisper') == '1.2.1'
started = datetime.now(timezone.utc).isoformat()
manifest_path = ROOT / 'public/ambience/manifest.json'
manifest_hash = sha(manifest_path)
manifest = json.loads(manifest_path.read_text())
# Preserve all effective API defaults rather than relying on undocumented invocation settings.
parameters = {name: parameter.default for name, parameter in inspect.signature(WhisperModel.transcribe).parameters.items()
if name not in ('self', 'audio')}
parameters.update(language=None, task='transcribe', beam_size=5, best_of=5, vad_filter=True, vad_parameters=None, condition_on_previous_text=True)
prior_path = PRIOR_EVIDENCE / 'prior-attempt-market60-cafe180/final-asr.json'
prior = json.loads(prior_path.read_text())
assert prior['requiredEmptyPassed'] is False
assert json_safe(parameters) == prior['method']['parameters'], 'Decoder/VAD settings must remain identical'
ctranslate2.set_random_seed(0)
model = WhisperModel(str(SNAPSHOT), device='cpu', compute_type='int8', cpu_threads=4, num_workers=1, local_files_only=True)
assert model.model.is_multilingual
results = []
for entry in manifest['files']:
path = ROOT / 'public/ambience' / entry['file']
before = sha(path)
assert before == entry['sha256'] and path.stat().st_size == entry['bytes']
segments, info = model.transcribe(str(path), **parameters)
segments = [asdict(segment) for segment in segments] # Exhaust lazy inference; retain exact unedited results.
assert sha(path) == before
record = {'environmentId': entry['environmentId'], 'file': str(path.relative_to(ROOT)), 'sha256': before,
'bytes': path.stat().st_size, 'durationSeconds': entry['duration'],
'selectedSegmentStartSeconds': entry['selectedSegmentStartSeconds'], 'sourceSha256': entry['sourceSha256'],
'language': info.language, 'languageProbability': info.language_probability,
'segments': segments, 'text': ''.join(segment['text'] for segment in segments), 'info': asdict(info)}
results.append(record)
print(json.dumps({k: record[k] for k in ('environmentId','sha256','language','languageProbability','segments','text')}, ensure_ascii=False), flush=True)
assert sha(manifest_path) == manifest_hash
required = ['mall', 'market', 'cafe']
selected = {result['environmentId']: result for result in results if result['environmentId'] in required}
assert set(selected) == set(required)
assert {key: result['selectedSegmentStartSeconds'] for key, result in selected.items()} == {'mall': 36, 'market': 24, 'cafe': 0}
passed = all(result['segments'] == [] and result['text'] == '' for result in selected.values())
report = {'schemaVersion': 1, 'startedAtUtc': started, 'completedAtUtc': datetime.now(timezone.utc).isoformat(),
'tool': {'name': 'faster-whisper', 'version': version('faster-whisper'), 'python': platform.python_version(),
'dependencies': {name: version(name) for name in ('ctranslate2', 'av', 'numpy', 'tokenizers', 'huggingface-hub')}},
'model': {'name': 'tiny', 'multilingual': True, 'repository': 'Systran/faster-whisper-tiny', 'revision': REVISION,
'files': {path.name: sha(path) for path in sorted(SNAPSHOT.iterdir()) if path.is_file()}},
'method': {'input': 'Exact final 12-second public/ambience WAV files, hash verified before and after inference; built-in Silero VAD with package defaults, no text editing or manual filtering.',
'device': 'cpu', 'computeType': 'int8', 'cpuThreads': 4, 'numWorkers': 1, 'randomSeed': 0,
'nonFiniteNumberEncoding': 'Non-finite default options use {nonFiniteFloat: Infinity|-Infinity|NaN} tagged objects; no ASR segments or text are discarded.', 'offline': True, 'parameters': parameters, 'manifestSha256': manifest_hash,
'vadModelSha256': sha(Path(__import__('faster_whisper').__file__).parent / 'assets/silero_vad_v6.onnx'), 'scriptSha256': sha(Path(__file__)), 'command': '/tmp/findword-asr-venv/bin/python .agent/evidence-v0.2.5/review-fixes/screen-final.py'},
'limitations': {'screeningOnly': True, 'humanListeningAcceptance': False, 'legalPrivacyClearance': False,
'textIsVerifiedTranscript': False,
'explanation': 'Tiny-model ASR is only a screening signal. Empty segments do not prove absence of speech, music or private conversation. Candidate text and language guesses may be hallucinated and are not faithful transcripts. This is NOT human listening acceptance or legal/privacy clearance.'},
'priorFailedAttempt': {'file': 'prior-attempt-market60-cafe180/final-asr.json', 'sha256': sha(prior_path), 'requiredEmptyPassed': False},
'supplementaryNoVadRun': {'file': 'no-vad-asr.json', 'sha256': sha(PRIOR_EVIDENCE / 'no-vad-asr.json'), 'requiredEmptyPassed': False, 'explanation': 'Historical no-VAD run on mall 36s, market 60s and cafe 180s emitted candidate text that may be hallucinated. It is retained unchanged, is not a screen of the replacement market/cafe WAVs, and does not override the specified VAD gate. Neither empty VAD results nor no-VAD text proves absence or presence of speech/music or provides human listening acceptance or legal/privacy clearance.'}, 'requiredEmptyEnvironmentIds': required, 'requiredEmptyPassed': passed, 'files': results}
serialized = json.dumps(json_safe(report), ensure_ascii=False, indent=2, allow_nan=False) + '\n'
with (EVIDENCE / 'final-asr.json').open('x') as stream:
stream.write(serialized)
if not passed: sys.exit('Required changed excerpts produced ASR segments; screening criterion failed.')
print('All three changed excerpts have zero emitted segments. Screening signal only; no listening acceptance or legal/privacy clearance.', flush=True)
@@ -0,0 +1,7 @@
{
"method": "High-confidence credential signatures in git-tracked and unignored new text files; no environment/secret access",
"textFilesScanned": 668,
"findings": [],
"passed": true,
"limitation": "Pattern scan is not a proof that every possible secret format is absent."
}
@@ -0,0 +1,35 @@
"""워크트리의 추적/신규 텍스트에서 명확한 credential 서명만 검사하고 값은 출력하지 않는다."""
import json
from pathlib import Path
import re
import subprocess
ROOT = Path(__file__).resolve().parents[3]
# gitignore된 의존성/캐시는 제외한다. 소스·문서·새 evidence는 포함하고 비밀 저장소/환경변수는 읽지 않는다.
paths = subprocess.check_output(['git', 'ls-files', '-z', '--cached', '--others', '--exclude-standard'], cwd=ROOT).decode().split('\0')
patterns = {
'private-key': re.compile(r'-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----'),
'aws-access-key': re.compile(r'\b(?:AKIA|ASIA)[A-Z0-9]{16}\b'),
'github-token': re.compile(r'\bgh[pousr]_[A-Za-z0-9]{36,}\b'),
'openai-token': re.compile(r'\bsk-(?:proj-)?[A-Za-z0-9_-]{35,}\b'),
'slack-token': re.compile(r'\bxox[baprs]-[A-Za-z0-9-]{20,}\b'),
}
findings = []
checked = 0
for name in sorted(set(paths)):
path = ROOT / name
if not name or not path.is_file(): continue
raw = path.read_bytes()
if b'\0' in raw: continue
try: content = raw.decode('utf-8')
except UnicodeDecodeError: continue
checked += 1
for kind, pattern in patterns.items():
for match in pattern.finditer(content):
findings.append({'file': name, 'line': content[:match.start()].count('\n')+1, 'kind': kind})
report = {'method':'High-confidence credential signatures in git-tracked and unignored new text files; no environment/secret access',
'textFilesScanned':checked,'findings':findings,'passed':not findings,
'limitation':'Pattern scan is not a proof that every possible secret format is absent.'}
(Path(__file__).parent/'secret-scan.json').write_text(json.dumps(report,indent=2)+'\n')
print(json.dumps(report,indent=2))
if findings: raise SystemExit(1)
@@ -0,0 +1,53 @@
"""최종 Playwright 원문을 보존하며 첨부 실측값과 검증 요약만 별도 파일로 추출한다."""
import base64
import json
from pathlib import Path
EVIDENCE = Path(__file__).resolve().parent
report = json.loads((EVIDENCE / 'browser-results.json').read_text())
projects = {}
def walk(suite):
"""중첩 suite를 순회한다. 실제 result가 실패하면 성공 요약을 만들지 않는다."""
for spec in suite.get('specs', []):
for test in spec['tests']:
project = projects.setdefault(test['projectName'], {'passed': 0, 'attachments': {}})
assert len(test['results']) == 1, '재시도 없는 최종 실행만 성공으로 요약한다.'
result = test['results'][0]
assert result['status'] == 'passed', spec['title']
project['passed'] += 1
for attachment in result.get('attachments', []):
if attachment['contentType'] != 'application/json':
continue
# 파일 첨부와 base64 본문 첨부의 원문을 같은 방식으로 재사용한다.
raw = (Path(attachment['path']).read_bytes() if 'path' in attachment
else base64.b64decode(attachment['body']))
name = attachment['name'].replace(' ', '-')
output = EVIDENCE / f"final-{test['projectName']}-{name}.json"
output.write_bytes(raw)
project['attachments'][name] = output.name
for child in suite.get('suites', []):
walk(child)
walk(report)
for project in projects.values():
gains = json.loads((EVIDENCE / project['attachments']['actual-gain-nodes']).read_text())
audit = json.loads((EVIDENCE / project['attachments']['runtime-audit']).read_text())
resampled = json.loads((EVIDENCE / project['attachments']['all-voices-resampled-bounds']).read_text())
project['resampledPeakMaxima'] = {kind: max(row['normalizedPeak'] for row in resampled['rows'] if row['kind'] == kind)
for kind in ('background', 'voice', 'intro')}
project['gainCases'] = len(gains['rows'])
project['observedBackgroundGainValues'] = sorted({r['sources'][0]['observed'] for r in gains['rows']})
project['scheduledBackgroundGainValues'] = sorted({r['sources'][0]['scheduled'] for r in gains['rows']})
project['normalFlowAudit'] = {key: len(audit[key]) + len(gains[key])
for key in ('errors', 'failed', 'external')}
assert project['normalFlowAudit'] == {'errors': 0, 'failed': 0, 'external': 0}
project['axeViolations'] = 0 # game/rounds의 실제 axe assertion 통과를 위 status에서 확인했다.
summary = {'stats': report['stats'], 'projects': projects,
'scope': 'System Chrome desktop/mobile emulation; native Web Audio; local built app; intentional fault injections excluded from normal-flow error totals.',
'sandboxEvidence': 'chrome-sandbox-final.json'}
(EVIDENCE / 'browser-summary.json').write_text(json.dumps(summary, indent=2) + '\n')
print(json.dumps(summary, indent=2))