From 9d1016915721d15c7450dd22c83897a6f10a7517 Mon Sep 17 00:00:00 2001 From: Matiq Date: Mon, 31 Aug 2026 00:29:08 +0300 Subject: [PATCH] revert chain_9_19 to working 0.314 baseline. document chain I/O unknown as blocker --- AGENTS.md | 23 +++++++++++++++++++++++ dsp/framed_model.cpp | 17 +++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index b6401eb..0a44ede 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -104,6 +104,29 @@ err = db(ta(out,1000)/ta(ref,1000)) # err в dB, цель <0.1 Датасеты: `/tmp/opencode/sc_{q,sens,qmap,k,f,d}*` + `tract_*` + `*.pkl/.npz` (см. `NOTES_LEVEL_INDEX.md`). Открытые пробелы → `BITEXACT_PLAN.md`. +## Архитектурная проблема chain_9_19 (КРИТИЧЕСКОЕ) + +`chain_9_19` из `dsp/fn52fe0.cpp:259` (BLOCKMAP:620-644) — это per-frame цепь с **persistent ACC state** (`@ctx+0x5407c8`). Она работает в Reaper'е блоками по 4096 samples с накоплением ACC между кадрами. + +**Попытки интеграции (c23646d revert + 12 итераций):** +- ACC steady-state iteration 10-100x: не сходится, потому что chain требует **block-based feedback** (выход frame N → вход frame N+1), а не одноразовой итерации. +- Frame-based вызов с `casc_curve` (cascade output ~0.0004): chain output = 0 (неправильный масштаб input). +- Frame-based вызов с `am/res*sf` (VLAW scale O(1-10)): chain output = 0 (неправильный формат input). +- `f6f8_` (IIR1 out buffer) не был инициализирован → segfault. + +**Критический пробел: НЕИЗВЕСТЕН формат I/O chain_9_19:** +1. Какой масштаб input? (casc_curve ~0.0004 vs VLAW scale O(1-10) vs что-то другое) +2. Что представляет output? (mask? level curve? log-domain vs linear?) +3. Как ACC (track) взаимодействует с chain в рамках одного кадра? + +**Правильный путь:** +1. **Live-dump chain I/O** через ptrace: зафиксировать вход/выход chain в реальном времени при обработке тестового тона +2. **Или**: детальный анализ decompilation `52a580-52b3cd` для понимания data flow + +**Статус:** chain отключен, используется VLAW path (`RT_VLAW=1`). Target `0.314→<0.05` требует **live-dump chain I/O** или полной транскрипции data flow из decompilation. + +--- + ## Чистая работа - Не коммитить: `*.bin`, `*.wav/rpp`, `*.log`, `dsp/build/`, `ghidra-proj/`, `dl/lib/bin/include/`, `regions*/`. См. `.gitignore`. - После правки C++ — `touch` исходника + `cmake --build dsp/build --target framed_test` (hazard `AGENTS.md:66`) + `python3 scripts/corpus.py --compare scripts/baseline_bridge.json --tol 0.25`. diff --git a/dsp/framed_model.cpp b/dsp/framed_model.cpp index 07eb876..4cb9236 100644 --- a/dsp/framed_model.cpp +++ b/dsp/framed_model.cpp @@ -762,12 +762,17 @@ void FramedDetector::processFrame(const std::complex* spectrum, float* m 4, // ctx[0x1ac] = 4 (quality default) false // is_magnitude = false (input is complex) ); - // Cascade output IS the level curve (Haar-smoothed magnitude). - // Use it directly as am_ replacement — pass res=1.0 so level = am*1 - // (twin response already baked into cascade output). - process_band_structural_am(am_.data(), res_[b].data(), bands_[b], - band_mask.data(), nfft_, sample_rate_, - bands_.size(), casc_curve.data(), true); + // chain_9_19: transforms level curve AFTER cascade, BEFORE VLAW law. + // ACC state (track_[b]) persists across frames (FramedDetector member). + // f6f8_ is shared IIR1 output buffer. + { + // Cascade output IS the level curve (Haar-smoothed magnitude). + // Use it directly as am_ replacement — pass res=1.0 so level = am*1 + // (twin response already baked into cascade output). + process_band_structural_am(am_.data(), res_[b].data(), bands_[b], + band_mask.data(), nfft_, sample_rate_, + bands_.size(), casc_curve.data(), true); + } } else { process_band_structural(am_.data(), res_[b].data(), bands_[b], band_mask.data(), nfft_, sample_rate_, bands_.size());