Let the field the engine writes itself decide the split: three of four failures produced no text at all, and the discriminator that needed a paid retry is gone

This commit is contained in:
heaven 2026-09-11 16:57:06 +03:00
parent 30617f2a17
commit 75eb421892

View file

@ -17,27 +17,50 @@
медицинская. **Не выключай его.** Первая редакция этого промта утверждала обратное, и сессия, исполнившая
её буквально, отключила бы восстановление трёх чанков из четырёх.
**Настоящая находка — в том, что двойных оплат ДВЕ РАЗНЫХ, а движок применяет к ним одно лекарство.**
Пере-снято мною по базе прогона (`bk_ROEHZBD46ALFI43E/project.db`, стадии `draft`/`edit`, `tm_hit=0`):
⛔⛔ **РЕЛЕЙ 11.09, РЕДАКЦИЯ 3 — ЭХО СЕССИИ ОПРОВЕРГЛО РАСКЛАДКУ РЕДАКЦИИ 2, И Я СОГЛАСИЛСЯ. Читай ЭТО, а
таблицу ниже — через эту поправку.**
| единица | 1-я попытка | 2-я попытка | что это значит |
|---|---|---|---|
| `draft` ch1u0 | comp **8496** · `length` · пусто · $0.012044 | **15869** · `stop` ✓ | потолка не хватило |
| `draft` ch2u1 | comp **8496** · `length` · обрезок · $0.011637 | **13004** · `stop` ✓ | потолка не хватило |
| `draft` ch3u0 | comp **8496** · `length` · пусто · $0.011782 | **14034** · `stop` ✓ | потолка не хватило |
| `edit` ch2u0 | comp **16000** · `length` · пусто · **$0.071009** | **11717** · `stop` ✓ | потолка ХВАТАЛО |
Редакция 2 делила четыре двойные оплаты 3:1 — «трижды потолка не хватило, один раз съело размышление».
**Это неверно, и опровергается полем, которое движок пишет САМ.** Пере-снято мною по той же базе:
**Контроль, и он режет популяцию без единого исключения.** Успешных черновых вызовов в прогоне ШЕСТЬ,
их размеры: `6468 · 7932 · 8243 · 13004 · 14034 · 15869`. **Все три, что уложились в 8496, прошли с первого
раза. Все три, что не уложились, с первого раза упали и прошли на удвоенном потолке. 6 из 6, исключений
ноль.** ⇒ на черновике это НЕ болезнь размышления и не случайность: **первый потолок просто меньше того,
что эта стадия реально производит на половине единиц**, и удвоение делает работу, которую должна была
сделать оценка бюджета.
| id | стадия | comp 1-й | `finish` | `degraded` | цена |
|---|---|---|---|---|---|
| 1 | `draft` ch1u0 | 8496 | `length` | **`empty`** | $0.012044 |
| 5 | `draft` ch2u1 | 8496 | `length` | **`length`** | $0.011637 |
| 7 | `draft` ch3u0 | 8496 | `length` | **`empty`** | $0.011782 |
| 31 | `edit` ch2u0 | 16000 | `length` | **`empty`** | $0.071009 |
**А четвёртый случай — противоположный, и он стоит ДВУХ ТРЕТЕЙ всей потери в ОДНОМ вызове.** У `edit`
потолок 16000 был заведомо достаточен: вторая попытка уложилась в 11717. Значит первый вызов выкупил 16000
токенов чего-то, что не было текстом. Это размышление — у DeepSeek оно считается ВНУТРИ выходных токенов
(`reasoning ⊆ completion`), и здесь удвоение потолка действительно даёт ему вдвое больше места.
**`empty` ×3 = $0.094835 = 89 % всей потери; `length` ×1 = $0.011637.** Раскладка ОБРАТНАЯ моей.
И порядок решения в коде это подтверждает: `disposition.go` проверяет пустоту ДО обрезания
(`if out == "" → FlagEmpty`, и только потом `finish == FinishLength → FlagLength`), то есть
`degraded='empty'` значит РОВНО НОЛЬ знаков — весь потолок ушёл до того, как начался текст.
**Почему мой довод был неверен, дословно из эхо сессии:** у DeepSeek `reasoning ⊆ completion`, значит
`completion_tokens` ВТОРОЙ попытки тоже содержит размышление. ⇒ из «вторая дала 15869 > потолка 8496» НЕ
следует «потолка не хватило ТЕКСТУ»: 15869 — это текст ПЛЮС неизвестное размышление.
**И мой «контроль 6 из 6 без исключений» — ТАВТОЛОГИЯ, а не улика.** «Кто уложился в потолок — прошёл,
кто не уложился — упал» верно ПО ПОСТРОЕНИЮ (`comp ≤ cap ⇒ stop`, иначе `length`). Он говорит, что потолок
бьётся с `comp`, и ничего — про то, чем `comp` занят. Из акта и заказа снят.
**И вот что делает пак ИСПОЛНИМЫМ, а мою редакцию делало неисполнимой.** Мой дискриминатор
(«2-я больше/меньше потолка 1-й») **РЕТРОСПЕКТИВЕН**: он известен только после того, как вторая попытка
ОПЛАЧЕНА, и лекарство им выбрать нельзя. А различение, которое нужно, **уже есть в дереве и снимается ДО
ретрая**: `FlagEmpty` против `FlagLength`. ⇒ **слепо именно ЛЕКАРСТВО**, а не классификация:
`maxTokensForAttempt(base, escalations)` принимает счётчик удвоений и больше ничего. Это и есть «дать
существующему лекарству прочитать существующий класс», буквально.
**ЧЕТВЁРТАЯ ПОПРАВКА: «шаг вниз по нейтральному словарю вырожден» — НЕВЕРНО, и снимается.** Словарь
упорядочен лексически (`"" · off · low · medium · high`), но ЭФФЕКТИВНЫЙ порядок размышления у
`ReasoningNone` другой: **`low < medium < high = off = ""`** — `off` не эмитит ничего и едет
вендор-дефолт `high`. ⇒ **`off` есть ВЕРХ шкалы, и шаг вниз с него на `low` существует**, а носитель
самого дорогого случая (`edit`, $0.071009 = две трети потери) стоит именно на `off`. Строй ступень
ПАРАМЕТРОМ; боевое значение по-прежнему не трогай (§4.2).
**ЧИТАЙ ТАБЛИЦУ §4.1 ТАК:** строка «потолок мал» применима к ОДНОМУ случаю (`degraded='length'`,
обрезок с текстом), строка «размышление съело потолок» — к ТРЁМ, и класс берётся из `degraded`, а не из
сравнения потолков. Коллизия, которую я вводил поправкой (б) в §4.1, **исчезает вместе с моим
дискриминатором**: `degraded` относит каждую единицу ровно к одному классу.
**Что решит твой результат.** Движок научится отличать «не хватило потолка» от «потолок съело размышление»
и перестанет платить за первое по цене второго. Плюс причина станет ВИДНА: сегодня спросить «что