docs: sync BITEXACT_PLAN/roadmap/AGENTS to 2026-08-21 state
BITEXACT_PLAN: structural column in S0 table; Step 2 re-scoped (combine thunk semantics, acc has no single-band consumer; FUN_1805316e0 is a coefficient writer NOT a mask combiner — fixed in Steps 2/8); Step 4 FFT-conv downgraded to P3 (window near-flat); Step 6 pipeline done (render48k); entry point = saturation hunt then Step 7 capture. roadmap: status 2026-08-21, P4 row + ~80% estimate with dual-canon results. AGENTS: two-canon model description, render48k/corpus_structural commands, stale-binary sweep hazard warning, updated gaps list.
This commit is contained in:
+62
-27
@@ -13,22 +13,27 @@ comb 10 dB). Bit-exact ДОСТИЖИМ (F0 gate: плагин байт-дете
|
||||
|
||||
## 0. Текущее состояние (честная метрика, 24-bit, trimmed, 62 случая)
|
||||
|
||||
| Группа | mean|err| (dB) | max | Уровень |
|
||||
|--------|----------|-----|---------|
|
||||
| t1kq (fc-scan) | 0.226 | 0.500 | ✓ ближе всего |
|
||||
| t1k (loud 0 dBFS) | 1.801 | 2.227 | ! уровневая |
|
||||
| al (level sweep) | 0.638 | 1.596 | ! уровневая |
|
||||
| res | 0.628 | 1.535 | ! |
|
||||
| dual (q-sweep) | 0.726 | 2.252 | ! |
|
||||
| comb (4-band) | **10.149** | **14.752** | ✗ сломан |
|
||||
| **TOTAL** | **1.594** | **14.752** | |
|
||||
| Группа | bridge mean|err| | bridge max | struct 48k mean|err| | struct max |
|
||||
|--------|----------|-----|----------|---------|
|
||||
| t1kq (fc-scan) | 0.226 | 0.500 | 0.768 | 1.013 |
|
||||
| t1k (loud 0 dBFS) | 1.801 | 2.227 | 2.114 | 2.753 |
|
||||
| al (level sweep) | 0.638 | 1.596 | 0.986 | 1.822 |
|
||||
| res | 0.628 | 1.535 | **0.437** ✓ | 1.252 |
|
||||
| dual (q-sweep) | 0.726 | 2.252 | 3.264 ✗ | 6.455 |
|
||||
| comb (4-band) | **10.149** ✗ | 14.752 | **6.116** ✓ | 9.148 |
|
||||
| **TOTAL** | **1.594** | 14.752 | 2.286 | 9.148 |
|
||||
|
||||
(struct = структурная цепь на внутренней сетке 48000/4096 через `dsp/build/render48k`,
|
||||
прогон `scripts/corpus_structural.py`, NOTES_LEVEL:21c. Bridge = `framed_test` 44.1k.)
|
||||
|
||||
**Корень проблемы**: активный канон — ЭМПИРИЧЕСКАЯ bridge-модель
|
||||
`C = G·LUT(xv) + W·warp(f)^A; gain = (1−C)·res^rp` (xv=log10(am/res)). Это ПОГОНА, не
|
||||
транскрипция. Структурная цепочка FUN_180529fe0 (IIR1/2/3 → exp2 → combine/acc → warp →
|
||||
dry/wet → FFT-conv) расшифрована и live-таблицы извлечены (`dsp/rt_mask_tables`,
|
||||
`dsp/rt_weights`), но при переносе в C++ (Phase B, da63adc) **регрессировала** и откачена
|
||||
на bridge. Дальше надо вернуться к структурной цепочке и закрыть её по-настоящему.
|
||||
транскрипция. Структурная цепочка FUN_180529fe0 перенесена в C++ на внутренней сетке
|
||||
(коммиты 7bf5a4a..b2cb923): уже ОБГОНЯЕТ bridge на comb (−4 dB) и res, но регрессирует
|
||||
на однополосных t1kq/t1k/al и проваливает dual@500 (константный −6.7 dB при всех q —
|
||||
отсутствие НАСЫЩЕНИЯ редукции: реальная кривая упирается в C_max≈0.70, exp2(−lvl) не
|
||||
ограничен). Свип γ×MULT подтвердил: текущий оптимум (0.344/4.2) лучший, слепая
|
||||
подкрутка исчерпана — проблема в ФОРМЕ кривой, см. Шаг 7 / bigkernel-вход.
|
||||
|
||||
---
|
||||
|
||||
@@ -74,12 +79,22 @@ dry/wet → FFT-conv) расшифрована и live-таблицы извле
|
||||
домена (пробовали combine в bridge-финале). Здесь combine/exp2 — в ЕГО собственном
|
||||
домене (reduction/exp2), как в декомпе.
|
||||
|
||||
### Шаг 2 — combine/аккумулятор 0x5407c8 (закрывает comb + negative-sens)
|
||||
Точные веса `kRTAtt`/`kRTRel` (0x5406c8/6e8) уже в `dsp/rt_weights.cpp`. Реализовать
|
||||
combine строго по декомпу: `acc = band − f6f8; += w_att·upper; += w_rel·lower; += band`
|
||||
в exp2/REDUCTION-домене (не в bridge-final-gain). Ожидается: comb перестаёт пережимать,
|
||||
negative-sens (band2 sens=−12) даёт компенсацию. Критерий: comb mean ≤ 2-3 dB (с −15 до
|
||||
нейтрали), и MB-ваимодействие (comb_all ≈ 0) воспроизводится.
|
||||
### Шаг 2 — combine/аккумулятор 0x5407c8 (ПЕРЕ-СКОУП 2026-08-21)
|
||||
Семантика декодирована на уровне thunk'ов (NOTES_LEVEL:21b, consumers_out.txt:833-885):
|
||||
```
|
||||
f6f8 = mask − acc (0x8d60, dst=3-й аргумент; acc НЕ перезаписывается)
|
||||
mirror f6f8
|
||||
f6f8_upper += kRTAtt·acc_upper ; f6f8_lower += kRTRel·acc_lower (0x3c40)
|
||||
acc += mask (0x5a20, персистентный per-band аккумулятор)
|
||||
```
|
||||
**КРИТИЧЕСКОЕ**: в online однополосном пути обновлённые f6f8/acc НЕ имеют консюмера до
|
||||
warp/IIR3/dry-wet (проверено исчерпывающим grep). Combine НЕ может влиять на single-band
|
||||
вывод сам по себе. Ожидалось, что combine закроет comb — частично закрыл уже сам
|
||||
структурный каркас (comb 6.1 vs bridge 10.1 без wiring). ДАЛЬНЕЙШИЙ ШАГ: найти точку
|
||||
потребления acc/f6f8 (межполосный уровень или FFT-conv каскад) и только потом wire.
|
||||
НЕ изобретать track→mask feedback (эмпирика, запрещено золотым правилом).
|
||||
ВНИМАНИЕ: `FUN_1805316e0` — это WRITER КОЭФФИЦИЕНТОВ полос (17 case), НЕ масковый
|
||||
комбинер (ошибка в старой редакции этого плана и в Шаге 8).
|
||||
|
||||
### Шаг 3 — Bit-exact exp2 (F5b)
|
||||
Заменить `std::exp2`/`exp2d::exp2_dsp` на точную табличную реализацию `0x26b820`:
|
||||
@@ -88,11 +103,15 @@ negative-sens (band2 sens=−12) даёт компенсацию. Критери
|
||||
overflow). Пока не bit-exact — оставить `exp2d::exp2_dsp` (численно = std::exp2).
|
||||
Критерий: `exp2_check` сравнивает протв захваченных пар точка-в-точку.
|
||||
|
||||
### Шаг 4 — FFT-conv 0x535a70 + FIR
|
||||
### Шаг 4 — FFT-conv 0x535a70 + FIR (ПРИОРИТЕТ ПОНИЖЕН 2026-08-21)
|
||||
FFT-conv сглаживает маску перед FIR (0x540658 window / freqaxis). Это последний этап
|
||||
mono-цепи. `dsp/fftconv.cpp` есть, но нужна точная блоковая обработка (overlap-save как
|
||||
в декомпе 0x52b550-0x52b8b5), не текущий stand-in. Критерий: маска-гейн после conv
|
||||
совпадает по форме с реальным ref (сглаживание нотча, двусторонний хвост).
|
||||
**ПОНИЖЕНО до P3**: NOTES_LEVEL:18c — окно 0x540658 near-flat (0.8→1.0 plateau при
|
||||
N/2≥2048), эффект построения FIR на форму маски минимален при N=4096. Последовательность
|
||||
уже размечена (fwd → kill mirror → fill xmm13/xmm9 → inv → complex op → fwd → window
|
||||
copy → inv → FIR[0]=1.0); остались неизвестные скаляры xmm13/xmm9 и complex-op шага 4.
|
||||
|
||||
### Шаг 5 — Bit-exact DSP-FFT 0x140a70 (multi-week, P3)
|
||||
Заменить `dsp/fft.cpp` (std::cos radix-2) на точный split-radix 2/4/8 по плану из
|
||||
@@ -103,12 +122,17 @@ NOTES_LEVEL:1107-1116:
|
||||
Это НЕ блокирует Шаги 1-4 (bridge/структурная цепь рендерят и с численным FFT), нужен
|
||||
только для побайтовой парности FFT-conv-пути.
|
||||
|
||||
### Шаг 6 — Внутренняя геометрия 48000/4096 vs 44100/2048
|
||||
### Шаг 6 — Внутренняя геометрия 48000/4096 vs 44100/2048 — ✅ ПАЙПЛАЙН СДЕЛАН (2026-08-21)
|
||||
Внутренний DSP SR=48000/N=4096 (freqaxis spacing 11.713 Hz). Хост рендера 44100/2048.
|
||||
F4-тест показал, что простая resample_poly НЕ закрывает (даже хуже). Нужно: детектор
|
||||
гнать на 48000/4096 (IIR-таблицы индексированы 0..2048 = N/2+1 при N=4096), затем
|
||||
свести к 44100. Ожидается закрытие хвостов t1k_b1f/al (+2.2/−1.6) — именно уровневой
|
||||
зависимости. Критерий: корректное выравнивание бина и окна между двумя сетками.
|
||||
**Статус**: пайплайн `dsp/render48k.cpp` (resample 44.1→48 → SpectralProcessor(4096,1024,48000)
|
||||
→ resample обратно) реализован и гоняет полный корпус (`scripts/corpus_structural.py`,
|
||||
коммиты 7659eb0/6924e53). Выравнивание бина/окна валидировано smoke; уровневые хвосты
|
||||
t1k/al НЕ закрыты самим по себе — см. §0 и Шаг 7. Известный артефакт: zero-pad последнего
|
||||
BLK-блока даёт спад am в ~последних 0.06s (косметика, на метрику почти не влияет).
|
||||
|
||||
### Шаг 7 — BandConfig A/B/γ (level-path ctx+0x188) live-захват под конкретные конфиги
|
||||
Структурная LUT-кривая `FUN_180563a60` (A/B/γ). Снято для render_long (A=−24/B=28/γ=1)
|
||||
@@ -118,8 +142,10 @@ F4-тест показал, что простая resample_poly НЕ закры
|
||||
mean кап-нагрузки al/t1k ≤ 0.3 dB.
|
||||
|
||||
### Шаг 8 — Стерео M8 + полный pipeline (P4/P5)
|
||||
Финальный рендер stereo (link/balance/LR-vs-MS) по M8 и multiband combine 0x5316e0.
|
||||
Все текущие рендеры mono. Для bit-exact графа нужны стерео-рендеры как мишены.
|
||||
Финальный рендер stereo (link/balance/LR-vs-MS) по M8 и межполосное суммирование.
|
||||
Все текущие рендеры mono. Для bit-exact графа нужны стерео-рендеры как мишени.
|
||||
ВНИМАНИЕ: `FUN_1805316e0` = writer коэффициентов полос, НЕ комбинер масок — точка
|
||||
межполосного суммирования масок/acc ещё не локализована (см. пере-скоуп Шага 2).
|
||||
Критерий: `verify_bit_exact.py` — побайтовое совпадение данных-чанка WAV.
|
||||
|
||||
---
|
||||
@@ -148,7 +174,16 @@ mean кап-нагрузки al/t1k ≤ 0.3 dB.
|
||||
## 4. Точка входа для следующей сессии
|
||||
|
||||
1. Прочитать `AGENTS.md`, этот `BITEXACT_PLAN.md`, `handoff/NOTES_LEVEL.md:820-840`
|
||||
(точная цепочка) и `dsp/rt_mask_tables.hpp` / `dsp/rt_weights.hpp` (live-таблицы).
|
||||
2. Собрать: `cd dsp && cmake --build build --target framed_test`.
|
||||
3. Бейзлайн: `TAG=base python3 /tmp/full_corpus.py` (62 случая, см. таблицу §0).
|
||||
4. Шаг 1: вынести структурную цепочку в `dsp/fn529fe0.cpp`, валидировать IIR1-шаг на t1kq.
|
||||
(точная цепочка) + апдейты 20j/21a/21b/21c (IIR3 bidi, combine-семантика,
|
||||
структурный корпус) и `dsp/rt_mask_tables.hpp` / `dsp/rt_weights.hpp` (live-таблицы).
|
||||
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. ПРИОРИТЕТ (закрытие разрыва формы кривой редукции):
|
||||
a. СТАТИКА: hunt clamp/насыщения в level-пути — `vminpd/vmaxpd/minsd/maxsd` в
|
||||
FUN_18052d650 (IIR1), инлайн IIR2, scale-шаг; семантика FUN_180323f20 и
|
||||
depth-скаляра 0x540888. Если clamp найден — транскрибировать, smoke + корпус.
|
||||
b. Если статика исчерпана — Шаг 7: live-захват BandConfig ctx+0x188 по
|
||||
NOTES_CAPTURE.md; сначала разрешить противоречие A/B/γ между сессиями
|
||||
(render_long/t1kq: −24/28/1 vs fit по точкам рефов: −13.78/68.29/0.344).
|
||||
|
||||
Reference in New Issue
Block a user