docs: full documentation refresh post-24kk2 — README status (application decoded to formulas, dual 0.193), AGENTS phase header + env-flags/tools tables, NEXT_PROMPT rewrite (cascade simulator + campaign recipes), PLAN/roadmap gate=BIT EXACT decision recorded

This commit is contained in:
2026-08-25 12:18:32 +03:00
parent 0fee9238dc
commit f365fa8451
5 changed files with 175 additions and 95 deletions
+66 -50
View File
@@ -1,58 +1,74 @@
# PROMPT FOR NEXT SESSION (2026-08-24, после 24d)
# PROMPT FOR NEXT SESSION (2026-08-25, после 24kk2)
Продолжаем bit-exact реверс soothe2 в /home/m/re-tools (ветка main, HEAD 135f0e9).
Продолжаем bit-exact реверс soothe2 в /home/m/re-tools (ветка main).
ГЕЙТ СМЕНЫ КАНОНА = BIT EXACT (решение пользователя): все параметры
прослежены до декомпа + корпус в шумовом пол. До тех пор канон не трогаем.
ПРОЧИТАТЬ ПЕРВЫМ: AGENTS.md → handoff/NOTES_LEVEL.md обновления 23d–24d
(прорыв и смена парадигмы) → BLOCKMAP_529fe0.md + приложение 23b.
Не опираться на roadmap-разделы про Шаги 7/9 и на вывод 23k «build-once» —
он ОТЗЫВАН в 24c.
ПРОЧИТАТЬ ПЕРВЫМ: AGENTS.md (фаза-заголовок 24kk2 + env-флаги + инструменты)
→ handoff/NOTES_LEVEL.md обновления 24j24kk2 → BLOCKMAP_529fe0.md
(дополнения 23b/24l/24hh/24ii).
СОСТОЯНИЕ КАНОНА: не тронут — голая цепь 48k/4096 + RT_LAWAFFINE=7.4,1.85,
TOTAL 1.931 (bridge-гейт 1.594 не пройден).
Отвергнуто и НЕ возвращаться: скалярные законы A/S, двухфакторные quad/resrp,
точечные lvl=f(am,res^α) [22x теорема], спрединг IDFT→окно→DFT как
постобработка [22z], плоский IIR [22u], симметричная log-свёртка [23c].
## СОСТОЯНИЕ
ГЛАВНЫЙ ПРОРЫВ СЕРИИ (23d–23e, живые снапы rendersnap.py):
bands[] = сырой спектр кадра → log(DESIGN 0x1802a24c0) → ops → scratch@540628
→ FIR@540668 = exp(0.984·scratch) поточечно; окно = падающая половина
периодического Hann(4096) на [n/2..n); применение = свёртка ×1.805 (EMPIRICAL,
константа по всем 4 точкам ±0.5%). Центр не зависит от q живьём;
Δскайрт сходится в 3%. q-серия снята (NOTES 23f).
ПРИМЕНЕНИЕ ДЕКОДИРОВАНО ДО ФОРМУЛ:
```
mask(b) = 10^(cut_D(b)/20) вещественная, per-bin multiply кадра
cut_D(b) = α·ln1p(lvl_raw(b)/β)+c [+Δ вторые пики]
lvl_raw = am/res·scale наш фронтенд, float-parity ✓
слой = STFT БЕЗ синтез-окна RT_SYN=1
```
Калибровки (rms ≤0.016 дБ):
```
dual fc500 q0.5 s12 ДВА тона : α=3.2193 β=0.4927 c=+0.54
fc1000 q0.5 s12 ОДИН тон : α=1.6151 β=0.3645 c=+0.48
fc500 q0.5 s12 ОДИН тон : α=1.1530 β=0.4038 c=+0.33
```
Корпус: dual **0.193 max 0.438** с флагами `RT_VLAW=1 RT_SYN=1 RT_NOWARP=1
RT_NOIIR3=1 RT_IIR12=0`. Канон TOTAL 2.286 нетронут.
ПРИОРИТЕТ №1 — потребитель кернела и источник ×1.805:
Conv-движок опознан: объект ctx+0x540530 (inline-cfg {2,4096},{16384,8192},
{2,257}; векторы +0xb8..+0x130; методы dc30 cfg / fe00 resize / dd30 dtor —
прямые вызовы из init 52e9b0). Его PROCESS-метод не найден: все 390 disp32-
ссылок на таблицу слотов учтены, скрытых нет (23h).
Пути: (а) отладить scan2.py (лежит в /tmp/opencode, НЕ закоммичен; баг:
тот же алгоритм что rendersnap.py даёт пусто — сравнить пошагово);
(б) декод аудио-клея 52exx–52fxx + поиск caller'ов vtbl+6 у соседнего
экземпляра (гипотеза GUI/DSP-пары, 24c);
(в) INT3-ловушка на тела дизайна в param-окно (~1.401.45 c жизни хоста)
при ГАРАНТИРОВАННО свежем рендере (render_fresh в логе обязателен!).
ОТЗЫВАНО И НЕ ВОЗВРАЩАТЬСЯ: ×1.805-свёртка [23e], OLA-нормировка [24i],
двухстадийный γ₀ как множитель закона [24m — это артефакт двух тонов],
клампы параметров [24dd], B∝am [24bb], axpy-семантика th2000 [24ii — это
array-multiply], «acc_i += bands[i]» шага 12 [24gg — это COPY].
ИНСТРУМЕНТЫ: scripts/rendersnap.py (рабочий канал наблюдения — STOP-семпл
офлайн-рендера), qseries.py, amseries.py (нужен фикс стабильности фаз),
ilt_resolve.py, fnexec.py (early-arm HW exec-bp), perfbp.py (только native),
fnwatch4.py (дисциплина армирования: INTERRUPT→wait→arm→CONT каждому треду).
Сборка: touch dsp/framed_model.cpp && cmake --build dsp/build --target render48k
framed_test (TOOLING HAZARD — touch обязателен). Метрика только честная:
render_parity.load (24-bit!), Гёрцель по последним 0.75 c.
## ЗАДАЧА №1: каскадный симулятор шагов 9–19 (оп-за-опом)
СРЕДА (грабли, всё проверено болью):
- HW-ловушки внутри wine НЕВОЗМОЖНЫ: wine держит BP-слоты (perf ENOSPC),
ptrace-DR пишется в task_struct но не программируется в кремний [24a];
- yabridge: сотни мёртвых сокет-директорий /run/user/1000/yabridge-* ломают
спавн хоста — rm -rf перед серией; pkill -f самоубийственно для шелла;
- kill reaper во время рендера оставляет ЧАСТИЧНЫЙ wav с полной шапкой
(источник «флака»); realtime-playback мёртв (нет аудио-девайса);
- выход рендера длиннее входа из-за LOOP=1 (выравнивание сегментов обязательно).
Dataflow декодирован (BLOCKMAP 24hh/24ii):
```
vec698 *= (xmm12[54087c]) ; обнуление при дефолтах
vec6f8 += 0.8 ; базовая линия
bigkernel(vec6f8, bands_i, vec6f8)
vec6f8 = bands_curve ACC_i ; COMBINE (dc40: out=rdxr10)
f6f8_верх += ATT[k]·ACC[k]; низ += REL[k]·ACC[k] ; тройки re/im/coef
COPY(...) ; шаг 12 = memcpy!
bands += (1.0); bigkernel in-place ; центрирование+нелинейность
bands *= track_i; bands *= kWarp ; th2000 = array-multiply
IIR4 ×2; финальные scale/op
→ bands[i] → design log → scratch → FIR → audio multiply exp(scratch)
```
Тела bigkernel'ов по рантайм-адресам: 1803a06a0/180296c80/180323f20/1802dc0e0
(x87 exp-семейство). Коэффициенты IIR-генератора 533340 исправлены
(насыщающая форма arg=|c|·g/n; p=[54087c]=1, mult=360, C=1000).
КОНТРОЛЬНЫЕ ЧИСЛА dual_b1q_0.5: cut@500=10.32 дБ (константен ∀q),
cut@2000=11.82; Δcut скайрта ≈ линейно по −ln res (b≈2.25 дБ/e-fold).
Цель раунда: опознать потребителя кернела → декодировать ×1.805 → начать
RT_FIRCONV=1 (обработка покадровая — 24c; кернел перестраивается каждый кадр,
ловушки на цепь молчат из-за wine-слотов, см. 24a). Корпус с гейтом
--vs-bridge после любого изменения C++. Коммитить по подшагам; факты в
NOTES_LEVEL (следующий номер UPDATE 24e+).
Метод проверки: собрать симулятор в Python (numpy), прогнать lvl_raw из
tract_* через каскад, сравнить с deepest-scratch кривыми sc_* — rms < 0.05 дБ
= замкнулось. Затем перенос в C++.
## ЗАДАЧА №2: параметризация α(контент)/fc
α удваивается с числом тонов (частотное смешение шаблонно-локальное —
далёкий тон не влияет, 24ll). Инструмент: scripts/campaign.py (ячейка ≈8 мин).
Двухтональная дистанционная серия уже снята (sc_d*, инверсия не сошлась —
нужен каскад из Задачи №1 сначала!).
## СРЕДА (грабли, всё проверено болью)
- rendersnap2.py: RENDER_FILE брать ИЗ rpp (клоны наследуют путь — однажды
перезаписали реф); каталоги снапов задавать уникальные (argv[3]).
- touch+mtime перед каждым замером (same-second cmake hazard).
- tone1k.wav громче dual.wav в 2.28× — при сравнении серий учитывать.
- Свип НЕ годится для Y/X-отношения; только мультитон/мультиуровень.
- Динамика V(t)↔g(t) на рампе не сходится — пары только из стационара.
- HW-ловушки под wine невозможны (wine держит слоты); INT3 требует
дисциплины fnwatch4 и ГАРАНТИРОВАННО свежего рендера.
- Метрика только честная: render_parity.load / Гёрцель последних 0.75 c.
- Коммитить подшагами; факты → NOTES_LEVEL (очередной номер 24ll+).