diff --git a/BITEXACT_PLAN.md b/BITEXACT_PLAN.md
index 2ae7c42..873eeeb 100644
--- a/BITEXACT_PLAN.md
+++ b/BITEXACT_PLAN.md
@@ -5,6 +5,20 @@ comb 10 dB). Bit-exact ДОСТИЖИМ (F0 gate: плагин байт-дете
воспроизводит реальный DSP-путь. Этот документ — план, как туда дойти, и точка отсчёта
для любой будущей сессии. **Читать вместе с `AGENTS.md` и `handoff/NOTES_LEVEL.md`.**
+> **ОБНОВЛЕНИЕ 2026-08-22 (сессии 22a–22e):**
+> 1. Phase-B оффлайн-гипотезы (pooling/temporal/scalar-ρ) — все ОПРОВЕРГНУТЫ (22a).
+> 2. Шаг 7 выполнен → премиса опровергнута: BandConfig A/B/γ = −24/28/1 у ВСЕХ конфигов,
+> но это GUI-timer кривые; аудио их не читает (22b). LUT-константы структурной цепи
+> помечены EMPIRICAL.
+> 3. Насыщение редукции НАЙДЕНО ЖИВЬЁМ и РЕШЕНО АЛГЕБРАИЧЕСКИ (22d/e):
+> hot-тон упирается в ЖЁСТКИЙ пол gain=**−20.72 dB**, pin ≥24 dB драйва;
+> `gain_floor = 20·log10(blend·ln10/20)` — совпадение 0.0055 dB!
+> Константа ln10/20=0.11513 @0x1824c3cd4, аудио-юзеры FUN_180529c60/52baa0/bad0/bba0.
+> 4. Инфраструктура: официальный параметр-мост (`setparam.lua`), XML `` в RPP =
+> декоративная копия (не источник стейта); depth=±18dB/trim=±24dB; WAV bext/junk
+> грабли подтверждены живьём.
+> Новый приоритет №1 — Шаг 9 (ниже).
+
Цель фазы C (bit-exact): воспроизвести `FramedDetector` (= fn `FUN_180529fe0` mono-path)
настолько точно, что `verify_bit_exact.py` даёт побайтовое совпадение на рендерах
(`t1kq_*`, `dual_*`, `comb_*`). Ниже — конкретный порядок, что и зачем.
@@ -43,7 +57,14 @@ comb 10 dB). Bit-exact ДОСТИЖИМ (F0 gate: плагин байт-дете
на однополосных t1kq/t1k/al и проваливает dual@500 (константный −6.7 dB при всех q —
отсутствие НАСЫЩЕНИЯ редукции: реальная кривая упирается в C_max≈0.70, exp2(−lvl) не
ограничен). Свип γ×MULT подтвердил: текущий оптимум (0.344/4.2) лучший, слепая
-подкрутка исчерпана — проблема в ФОРМЕ кривой, см. Шаг 7 / bigkernel-вход.
+подкрутка исчерпана — проблема в ФОРМЕ кривой.
+
+> **КОРРЕКЦИЯ 22d/e**: «насыщение C_max≈0.70» старой модели = артефакт placeholder
+> MULT=4.2 / Pchip cap 0.667, НЕ свойство плагина: живой плагин на ±24 dB trim
+> редуцирует БЕЗ потолка (R 1.4→15.7 dB), а на горячем тоне (+6 dBFS) упирается в
+> ЖЁСТКИЙ пол gain=−20.72 dB = **blend·ln10/20 точно** (Δ0.0055 dB). Механизм пола —
+> в нетранскрибированном куске аудио-пути (след: FUN_180529c60, ln10/20-фактор),
+> см. Шаг 9.
---
@@ -162,6 +183,25 @@ mean кап-нагрузки al/t1k ≤ 0.3 dB.
межполосного суммирования масок/acc ещё не локализована (см. пере-скоуп Шага 2).
Критерий: `verify_bit_exact.py` — побайтовое совпадение данных-чанка WAV.
+### Шаг 9 — Механизм пола редукции blend·ln10/20 (НОВЫЙ ПРИОРИТЕТ №1, 2026-08-22)
+Живой факт (22d): hot-тон упирается в ЖЁСТКИЙ пол gain=−20.72 dB = `20·log10(0.8·ln10/20)`
+с точностью 0.0055 dB; колено между L=−6..0 (trim-шкала); холодный тон на ±24 trim
+пола НЕ достигает. t-clamp в транскрибированной LUT НЕ даёт pin (grid MULT≤12/B≥18 —
+NOTES 22e) ⇒ пол живёт в другом куске аудио-пути.
+
+9a. Декодировать `FUN_180529c60` полностью: фактор
+ `expf((p87c·30 − 90)·ln10/20)` на band-буферы 0x540678[band] через
+ `FUN_1804d56b0` (f_529c60.dis:94-101) — что именно считает 1804d56b0 и куда
+ идёт произведение (это vtbl-метод рядом с аудио-entry).
+9b. Найти сайт клампа: grep ln10/20-константы (0x1824c3cd4) по остальным юзерам
+ (18052baa0/bad0/bba0) и по f529fe0.dis/f_52d650.dis на предмет floor/clamp маски.
+9c. Проверка предсказаний модели пола: (i) floor_gain(mix) сдвигается как
+ 20log10(blend′/0.8); (ii) пол частотно-зависит только через blend(freqaxis)
+ при mix<100; (iii) knee-позиция от sens/depth. Рендеры через setparam.lua.
+9d. Порт клампа в `process_band_structural` → smoke → корпус с гейтом
+ (`corpus_structural.py --vs-bridge`; цель: dual@500 уходит с −6.7, res/dual/comb ≥ bridge).
+Критерий: воспроизвести pin −20.72 dB в рендере модели + отсутствие регресса групп.
+
---
## 2. Что НЕ делать (подводные камни из дока)
@@ -174,6 +214,11 @@ mean кап-нагрузки al/t1k ≤ 0.3 dB.
Bridge — только запасной вариант, пока структурная цепочка не пройдёт Шаг 1-2.
- **НЕ использовать битые 24-bit загрузчики** — метрика `render_parity.py:43` правильная
(x>=0x800000 => x−0x1000000). В тестовых скриптах использовать тот же код.
+- **НЕ редактировать XML `` в RPP ради изменения звука** — это декоративная
+ UI-копия, плагин берёт стейт из бинарной части чанка (NOTES 22c). Только мост
+ `setparam.lua`.
+- **НЕ читать WAV наивным readframes+reshape** — REAPER пишет bext/junk-чанки; только
+ каноничный `render_parity.load` (иначе фантомный шум/клиппинг, NOTES 22c).
## 3. Риски и время
@@ -187,17 +232,18 @@ mean кап-нагрузки al/t1k ≤ 0.3 dB.
## 4. Точка входа для следующей сессии
-1. Прочитать `AGENTS.md`, этот `BITEXACT_PLAN.md`, `handoff/NOTES_LEVEL.md:820-840`
- (точная цепочка) + апдейты 20j/21a/21b/21c (IIR3 bidi, combine-семантика,
- структурный корпус) и `dsp/rt_mask_tables.hpp` / `dsp/rt_weights.hpp` (live-таблицы).
+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. ПРИОРИТЕТ (закрытие разрыва формы кривой редукции):
- 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).
+ `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).