Files
soothe2-re/BITEXACT_PLAN.md
T
Matiq f73724fee7 docs: archive 4024стр NOTES_LEVEL, единый источник TOTAL README, runbook AGENTS, 3-шаг план
- handoff/NOTES_LEVEL.md 4413→397 (голова 24mm5+), хвост → handoff/archive/NOTES_LEVEL_2026-08-18_2026-08-23.md
- handoff/NOTES_LEVEL_INDEX.md NEW навигатор, handoff/archive/ whitelist .gitignore
- SESSION_HANDOFF/summary → archive + редиректы, NOTES_TWIN/NOTES_CAPTURE сжаты
- README.md:13 единственный источник TOTAL 1.594/dual 0.193, AGENTS runbook, BITEXACT_PLAN 9→3 шага (каскад 9-19/k-маппинг/Δ)
2026-08-29 03:15:42 +03:00

9.0 KiB
Raw Blame History

BIT-EXACT PLAN — путь от dB-приближения к побайтовой парности

Статус: НЕ bit-exact. Канон — bridge framed_test 44.1k: TOTAL 1.594 dB (62 случая, trimmed 24-bit, scripts/baseline_bridge.json). Bit-exact достижим (F0 gate: рендеры байт-детерминированы handoff/NOTES_LEVEL.md:1020), но модель — погона. Читать вместе с AGENTS.md и handoff/NOTES_LEVEL_INDEX.md.

2026-08-28 (24mm14): применение декодировано до формул. mask=10^(cut_D/20), cut_D=α·ln1p(lvl/β)+c [+Δ] — три семейства, rms ≤0.016. dual 0.193 dB (env-gated RT_VLAW=1 RT_SYN=1 RT_NOWARP=1 RT_NOIIR3=1 RT_IIR12=0), детекторный каскад 180529c60 + RFFT до df0 бит-точны, γ=1.760561 из цепи. Гейт смены канона = bit-exact (решение 24hh2). Остаток: 3 шага ниже.

Цель фазы C: воспроизвести FramedDetector (= FUN_180529fe0 mono-path) до verify_bit_exact.py побайтового совпадения (t1kq_*, dual_*, comb_*).


0. Текущее состояние — ЕДИНСТВЕННЫЙ ИСТОЧНИК README.md:13

Честная trimmed метрика 62 случая (bridge vs structural 48k/4096 corpus_structural.py):

Группа bridge mean bridge max structural mean VLAW env-gated mean
t1kq (fc-scan) 0.226 0.500 0.768 0.4260.852*
t1k (loud) 1.801 2.227 2.114 0.5770.930*
al (level) 0.638 1.596 0.986 0.0900.804*
res 0.628 1.535 0.437 0.395*
dual (q-sweep) 0.726 2.252 3.264 0.193 (max 0.438) ✓
comb (4-band) 10.149 14.752 6.116 2.6784.335*
TOTAL 1.594 14.752 2.286 0.8701.931*

* зависит от калибровки VLAW α/β/c (семейство dual vs fc-зависимая AGENTS.md больше не хранит таблицу — см. README.md:13 и handoff/NOTES_LEVEL.md:3919).

Канон = bridge 1.594 (эмпирика C=G·LUT(xv)+W·warp^A, gain=(1C)·res^rp). Structural 2.286 обгоняет bridge на comb/res, регрессирует на однополосных — форма кривой редукции неверна. VLAW закрывает dual (0.193) — применённый слой и каскад декодированы.


1. Порядок работ (3 шага, обязательный порядок; каждый валидируется отдельно)

Валидация: cmake --build dsp/build --target framed_test + python3 scripts/corpus.py + python3 scripts/corpus.py --compare scripts/baseline_bridge.json --tol 0.25 (фейлит при регрессе группы >tol). Структурная цепь валидируется scripts/corpus_structural.py --vs-bridge. Каждый под-шаг коммитить отдельно.

Шаг 1 — Каскадный симулятор шагов 9–19 FUN_180529fe0 (ПРИОРИТЕТ №1)

Dataflow декодирован handoff/BLOCKMAP_529fe0.md:22v + handoff/NOTES_LEVEL.md:4400:

bands[i] → LOG#1 (140980) → 52d650 (bidir #1) → vec698*= (1[54087c]) → vec6f8+= [54087c]·0.8
→ DIVIDE vec6f8/bands (1803a06a0) → vec6f8=bandsACC (dc40) → fma ATT/REL (1fa0/1940, тройки re,im,coef)
→ COPY (1b80) → mirror 9 + bigkernel 140b60 → EXP#1 (1409e0) + 1 → ×track (th2000) → ×warp (th2000)
→ LOG#2 (140980) → IIR4×2 (bidir, log-домен) → EXP#2 → bands_final
→ FIR-секция: DESIGN 1802a24c0 (conv_float_a24c0.dis) → copy → RFFT pair th2180/th1a90 (buf548/598)
  → FIR[1..n/2]*=2.0 → EXP 1803831c0 → WINfreq· → FIR[0]=1 → df0 track⊗FIR → mask

Тела bigkernel'ов резолвлены статически handoff/NOTES_LEVEL.md:3944 (1803a06a0 divide, 180296c80 expf, 1803831c0 табличная кривая, 1803a06a0 etc.; 24mm2 таблица). RFFT до df0 бит-точна 24mm11.

Делать: оп-за-оп транскрипция scripts/cascade_sim.py (numpy-эквиваленты divide/expf с FMA-точностью) → валидация на multi6 (6 нотчей один прогон, handoff/NOTES_LEVEL.md:3809) и sc_* дистанционной серии (rms сейчас 0.42 на угаданных формах). После структуры — C++ порт dsp/fn529fe0.cpp с точными полиномами.

Критерий: каскад воспроизводит B=exp(scratch) из multi6 на всех 6 пиках ±0.05 dB (сейчас rms 0.42), затем dual 0.193 сохраняется без per-семейной калибровки.

Шаг 2 — k-маппинг фронтенда (twin/am)

k = lvl_impl / lvl_ours (handoff/NOTES_LEVEL.md:3436): k(q≥2)=0.403 const, k(sens) экспонента (5.37 при s18, 22.0 при s24). При q=1.0 vs q=0.5 k идентичен — q НЕ влияет на закон (24kk), sens линейно через lvl_raw (24kk). Остаток — twin gain пол (res плагина ≥0.153 vs наш 0.0069) и амплитудная нормировка am (wsum/окно в dsp/spectral.cpp vs декомп FUN_180535880 tail-calls).

Делать: декод FUN_180535880 tail-calls + FUN_180536300 caller (grid NOTES_TWIN.md) до точных twin_coeff/am формул, либо калибровка k(q,sens,fc) по sc_* + tract_* как таблицы с декомп-обоснованием.

Критерий: cross-config α/β/c становятся вычисляемыми, а не фитовыми; sens 6..24 перестаёт требовать per-групповой α.

Шаг 3 — Δ-правило вторых пиков (pre-combine)

Второй контент-пик: cut = α·ln1p(g·lvl/β)+c, g@2000≈12.15 vs g@fc=1.0 (handoff/NOTES_LEVEL.md:3890), но g меняется между прогонами (12.15 vs 1.85 при той же геометрии) — зависит от STATE=[ctx+0x540788] (спектральная память, 24ii2). Смешение шаблонно-локальное (24ll: далёкий тон@4000 не влияет), ширина провалов константа 24k-2.

Делать: серия campaign.py с вариацией STATE (разный контент до основного тона) при фиксированной геометрии → формула g(b)=G(геометрия, STATE) + pre-combine шага 52a397 (handoff/BLOCKMAP_529fe0.md:43).

Критерий: d1500 серия 3.43→4.23 монотонна без отрицательных w(d) (24mm).


2. Что НЕ делать

  • НЕ вводить эмпирию где есть декомп (золотое правило AGENTS.md:33). LCP и MULT без источника — помечать EMPIRICAL.
  • НЕ делать combine в bridge-final-gain домене — F2 регресс 4.68/5.22 handoff/archive/NOTES_LEVEL_2026-08-18_2026-08-23.md:1064.
  • НЕ читать WAV наивно — только render_parity.load (bext/junk, 24-bit handoff/NOTES_LEVEL.md:1462).
  • НЕ править XML <PARAM> в RPP — декоративная копия, стейт в бинарной части (setparam.lua/patchparam.py).
  • НЕ свёртка/OLA поверх маски — опровергнуто 24j (A=1.019·V^1.8345 = произведение экспонент, не свёртка).

3. Риски и время

  • Доминирующий риск — каскад 9–19: 5700 строк AVX-512+FMA (1803831c0), 10 ядер. Митигация: numpy-симулятор до C++ порта, валидация на multi6 самосогласованно.
  • Twin/am — multi-week (dispatch ядра 2/4/8, plan-gen FUN_18002f980). Не блокирует Шаг 1.
  • Стерео M8 — отложен (все рендеры mono).
  • Оценка: Шаг 1 — 1–2 недели, Шаг 2 — 1–2 недели, Шаг 3 — дни. До байтов — 1–2 месяца.

4. Точка входа

  1. AGENTS.mdhandoff/NOTES_LEVEL_INDEX.md (живая голова 24mm5+) + handoff/BLOCKMAP_529fe0.md.
  2. touch dsp/framed_model.cpp && cmake --build dsp/build --target render48k framed_test (hazard AGENTS.md:66).
  3. Бейзлайны: python3 scripts/corpus.py --compare scripts/baseline_bridge.json --tol 0.25 (TOTAL 1.594); VLAW dual RT_VLAW=1 RT_SYN=1 RT_NOWARP=1 RT_NOIIR3=1 RT_IIR12=0 → 0.193.
  4. Инструменты: scripts/cascade_sim.py (структурная фаза), scripts/rendersnap2.py, scripts/disasm_func.py, scripts/iat_name.py, scripts/campaign.py.