diff --git a/AGENTS.md b/AGENTS.md index 865ec10..4bbc44d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,11 +4,14 @@ Bit-exact реверс DSP-ядра oeksound soothe2 (VST3) → транскри Полное журналирование — в `handoff/NOTES_LEVEL.md`, `handoff/NOTES_TWIN.md`, `handoff/NOTES_CAPTURE.md`, `roadmap.md`. -> **Текущая фаза: bit-exact НЕ достигнут** — dB-параллель двумя канонами: bridge -> (корпус mean 1.594 dB, comb 10.1) и структурная цепь FUN_180529fe0 на 48k/4096 -> (comb **6.12** — уже лучше bridge; однополосные хуже; разрыв = насыщение кривой -> редукции). Путь к байтам — в `BITEXACT_PLAN.md` (8 шагов, пере-скоуп Шага 2). -> ЭТОТ ФАЙЛ ЧИТАЙ ПЕРВЫМ. Bridge — запасной канон; структурная цепочка — целевая. +> **Текущая фаза (2026-08-23, после 22z):** канон = структурная цепь 48k/4096 с +> RT_LAWAFFINE=7.4,1.85 (TOTAL 1.931; bridge 1.594 — гейт не пройден). ГЛАВНЫЙ +> ОТКРЫТЫЙ ВОПРОС — семантика входов `bands[]` детектора: доказанно НЕ поточечная +> функция от (am,res^α) [22x], не форма-постобработка [22w], не спрединг +> IDFT→окно→DFT [22z]. Живая кривая редукции R=1/mask захвачена (слот 0x5407f8, +> dualtrace.py), но применённый фильтр ≠ её поточечной копии — механизм живёт ДО +> кривой (twin-шаблон/скалярный драйв). Журнал: NOTES_LEVEL 22s–22z; карта метода: +> handoff/BLOCKMAP_529fe0.md. ЭТОТ ФАЙЛ ЧИТАЙ ПЕРВЫМ. ## Золотое правило (обязательно) 1. **Цель — bit-exact реверс кода**, НЕ эмпирическая подгонка кривых. Каждый параметр @@ -102,18 +105,19 @@ scale → LUT level-domain (t^γ·MULT, γ=0.344 decomp / MULT=4.2 placeholder) CMAX) не закрывает тон+шум одновременно → res/dual регресс у любой точки; ищем контент-зависимый механизм. Инструментарий RT_DUMP_BIN / RT_DUMP_ALL в коде (opt-in). -### Открытые bit-exact/структурные пробелы (см. NOTES_LEVEL.md) -1. Насыщение кривой редукции (см. выше) — приоритет №1. -2. `combine/аккумулятор 0x5407c8`: семантика декодирована (21b), но acc/f6f8 НЕ имеют - однополосного консюмера — искать точку потребления (межполосный каскад). ВНИМАНИЕ: - `FUN_1805316e0` = writer коэффициентов, НЕ комбинер масок. -3. ~~BandConfig `ctx+0x188` A/B/γ — противоречие между сессиями~~ **РАЗРЕШЕНО - (22b): live = −24/28/1 у ВСЕХ конфигов, но весь кластер FUN_180563440/563a60 — - GUI-timer only; аудио-путь (FUN_180529fe0) BandConfig не читает. Шаг 7 в исходной - постановке опровергнут; LUT-константы структурной цепи помечены EMPIRICAL.** -4. PRNG-пролог (LCG+LUT → fVar30) — залочен (fVar30=1 при live state 112), dry/wet rnd импорт. -5. Бит-экзактный exp2 (0x26b820); FFT-conv понижен до P3 (окно near-flat, NOTES:18c); - SR-геометрия 48k/4096 сделана (render48k). +### Открытые пробелы (после 22z; детали — NOTES_LEVEL 22s–22z) +1. **Семантика входов `bands[]` в FUN_180529fe0** — главный вопрос. Отвергнуто: + lvl=f(am,res^α) с единым законом [22x, теорема], форма-постобработка маски [22w], + спрединг IDFT→окно→DFT [22z]. Живой захват: кривая редукции R=1/mask @слот + 0x5407f8 (пик следует за fc полосы), acc/f6f8 нули в стационаре. + Пути: (а) декод тел conv 0x1802a24c0 + complex-op шагов с буферами + 0x540548/550/598; (б) синхронная трасса буферов в аудио-колбеке. +2. dual-таблица по q (22x): cut@центра константен при любом q, Δcut скайрта ≈ + линейно по −ln res с b≈2.25 — геометрия twin-шаблона на сетке 0.25 Гц. +3. FFT-conv: последовательность вызовов декодирована (BLOCKMAP/22z), тело + 0x1802a24c0 (AVX2) и complex-op шаги — не расшифрованы. +4. Бит-экзактный exp2 (0x26b820); бит-точная DSP-FFT (P3); стерео M8 (P5) — отложены. +5. Источник констант RT_LAWAFFINE A/S в декомпе не найден (помечено EMPIRICAL). ## Структура ключевых файлов - `dsp/framed_model.{cpp,hpp}` — C++ порт mask-apply цепи: bridge-канон + структурная @@ -128,6 +132,10 @@ scale → LUT level-domain (t^γ·MULT, γ=0.344 decomp / MULT=4.2 placeholder) - `handoff/nls_dasm/` — 134 дизассембла декомпа. - `/tmp/consumers_out.txt` — полный decomp `FUN_180529fe0` (уникален, вне git). - `/tmp/snap_rt.bin` — live-снимок (ctx 0x2370040, SR 48000). +- `handoff/BLOCKMAP_529fe0.md` — полная блок-карта FUN_180529fe0 по raw asm (22v). +- `scripts/lawfit22r.py` — офлайн реплей-сим пайплайна (~2 c корпус), фиты законов. +- `scripts/resalpha.py` — сбор трактов + теорема об отсутствии α (22x). +- `scripts/dualtrace.py` + `play_loop.lua` — живой захват ctx при realtime-playback (22y). ## Чистая работа - Не коммитить: `*.bin`(дампы 112М), `*.wav/rpp`, `*.log`, `dsp/build/`, `ghidra-proj/`, diff --git a/BITEXACT_PLAN.md b/BITEXACT_PLAN.md index 873eeeb..6c0dacf 100644 --- a/BITEXACT_PLAN.md +++ b/BITEXACT_PLAN.md @@ -18,6 +18,13 @@ comb 10 dB). Bit-exact ДОСТИЖИМ (F0 gate: плагин байт-дете > декоративная копия (не источник стейта); depth=±18dB/trim=±24dB; WAV bext/junk > грабли подтверждены живьём. > Новый приоритет №1 — Шаг 9 (ниже). +> +> **ОБНОВЛЕНИЕ 2026-08-23 (сессии 22s–22z):** Шаг 9 закрыт иначе — пол решён +> алгебраически ещё в 22e; фронт сместился. Отвергнуты: скалярные законы A/S +> (насыщение ~1.87–1.93, 22s/t), двухфакторные quad/resrp (22t), точечные +> lvl=f(am,res^α) — «теорема об отсутствии α» (22x), спрединг IDFT→окно→DFT (22z). +> Новый приоритет №1 — семантика входов `bands[]` (см. AGENTS.md и NOTES_LEVEL +> 22s–22z); карта метода — handoff/BLOCKMAP_529fe0.md. Цель фазы C (bit-exact): воспроизвести `FramedDetector` (= fn `FUN_180529fe0` mono-path) настолько точно, что `verify_bit_exact.py` даёт побайтовое совпадение на рендерах @@ -232,18 +239,21 @@ NOTES 22e) ⇒ пол живёт в другом куске аудио-пути. ## 4. Точка входа для следующей сессии -1. Прочитать `AGENTS.md`, этот `BITEXACT_PLAN.md`, `handoff/NOTES_LEVEL.md` - апдейты **20j / 21a-21e / 22a-22e** (цепочка, Phase-B негативы, Шаг 7 опровержение, - параметр-мост, пол blend·ln10/20) и `dsp/rt_mask_tables.hpp` / `dsp/rt_weights.hpp`. -2. Собрать: `cmake --build dsp/build --target render48k framed_test`. -3. Бейзлайны: `python3 scripts/corpus.py` (bridge, 62 случая, §0) и - `python3 scripts/corpus_structural.py --vs-bridge scripts/baseline_bridge.json`. -4. ПРИОРИТЕТ №1 — **Шаг 9** (пол редукции): - a. 9a: полный декод FUN_180529c60 + FUN_1804d56b0 (f_529c60.dis готов). - b. 9b: grep 0x1824c3cd4 по аудио-функциям; hunt клампа маски. - c. 9c: предсказания пола — рендеры mix/sens через `setparam.lua` (мост готов, - XML-правки стейта НЕ работают — NOTES 22c). - d. 9d: порт + корпус с гейтом. -5. Инструменты сессии: `setparam.lua`/`dump_params.lua` (параметр-мост), - `scripts/rpp_setparam.py` (только формат-хирургия!), `RT_LUT_*` env в - framed_model.cpp (солвер констант), `scripts/step7_capture.py` (live BandConfig). +1. Прочитать `AGENTS.md`, затем NOTES_LEVEL **UPDATE 22s–22z** (журнал актуальной + фазы) и `handoff/BLOCKMAP_529fe0.md` (блок-карта FUN_180529fe0 по raw asm). +2. Собрать: `touch dsp/framed_model.cpp && cmake --build dsp/build --target render48k framed_test` + (TOOLING HAZARD: touch перед сборкой обязателен). +3. Бейзлайны: канон = `RT_LUT_OFF=1 RT_IIR12=0 RT_NOWARP=1 RT_NOBLEND=1 RT_NOIIR3=1 + RT_LAWAFFINE=7.4,1.85 python3 scripts/corpus_structural.py` → TOTAL 1.931; + bridge-гейт: `--vs-bridge scripts/baseline_bridge.json` (1.594). +4. **ПРИОРИТЕТ №1 — семантика входов `bands[]`**: + a. Статика: декод тел conv 0x1802a24c0 (float)/0x1802fa420 (double, + резолв ILT-стабов через idx@0x1826159a0, см. BLOCKMAP thunk-таблицу) и + complex-op шагов с буферами ctx+0x540548/550/598. + b. Динамика: синхронная трасса буферов bands[]/f6f8/acc в момент аудио- + колбека (`scripts/dualtrace.py` + `play_loop.lua`; между кадрами acc/f6f8 + нули — снапшот должен попадать В колбек, см. NOTES_CAPTURE 22y). +5. Инструменты: `scripts/lawfit22r.py` (офлайн реплей, 2 c корпус — ЛЮБОЙ закон), + `scripts/resalpha.py` (тракты+теорема α), live-capture `dualtrace.py`. +6. Факт для калибровки интуиции: dual-таблица по q в NOTES 22x (cut@центра + константен; Δскайрта ≈ линейно по −ln res, b≈2.25 дБ/e-fold).