diff --git a/eval/dovodka/PLAN-01-09.md b/eval/dovodka/PLAN-01-09.md index db36fb64..342e8428 100644 --- a/eval/dovodka/PLAN-01-09.md +++ b/eval/dovodka/PLAN-01-09.md @@ -25,23 +25,43 @@ D39.170) — она в `main`; это следствие расхождения | P₉·E_low | тот же | `"low"` | `low` | Промпты различаются одной строкой; **метка `v3-discourse-reflow` у обоих одна**, поэтому берём по -SHA — снапшот их различает (`snapshot.go:289`). +SHA — снапшот их различает (`snapshot.go:288`=`prompt_sha256`). * **БЛОКИРУЕТСЯ трудность:** каждая рука видит ВСЕ юниты. Реализация: один базовый прогон (черновая - волна + майнинг + терминолог), затем БД копируется ×4; черновики ре-пинятся за $0. + волна + майнинг + терминолог), затем БД копируется ×4. + ⭐ **Черновики выживают за $0 НЕ ре-пином** (`repin.go` — механизм смены БАНКА, при смене + промпта/эффорта он даёт «Nothing is re-pinnable»), **а потому, что снапшот ПЕР-ВОЛНОВЫЙ** + (`snapshot.go:225-231`=`waveDraft`): правка edit-стадии draft-снапшот не двигает, и черновики + идут обычным resume. + ⛔ **Базовый прогон ОБЯЗАН остановиться ДО edit-волны, и это делает только `--verify-bank`.** + Без флага движок авто-продолжает с неподписанным банком и покупает edit-юнит в том же процессе — + тогда каждая копия потребует `--resnapshot` и перекупит базовые edit-юниты ×4. + **Условия копирования:** движок остановлен (WAL закрыт), `book_id` тот же (он входит в + `request_hash`), в `book.yaml` меняются РОВНО два поля — `project_db` и `pipeline`. * **КОНТРОЛИРУЕТСЯ длина входа:** `len(draft)` и `prompt_tokens` — ковариата. ⚠ Честно: чанки движка дают узкий диапазон (4412–6946 токенов), поэтому ось **контролируется, а не измеряется**. * **ФИКСИРУЕТСЯ:** модель и дата вендор-доки · бинарь `tmctl` по sha · `models.yaml` по sha · потолок вывода · `temperature 0.4` · `few_shot: false` · санитайзер ON · - ⭐ **`escalation.budget_usd: 0`** — иначе флагнутый юнит уйдёт хопом в другую модель и загрязнит руку. + `escalation.budget_usd: 0` — ⚠ **обоснование прежней редакции («иначе флагнутый юнит уйдёт хопом») + ЛОЖНО и снято: редактор эскалировать не может по построению** (`pipeline.go:1012`=`escalate_to is + only allowed on a translator role`). Настройка инертна для edit-волны; держим её как гигиену, а не + как защиту. * **РАНДОМИЗИРУЕТСЯ** порядок рук внутри юнита; **интерливинг во времени** — четыре клетки юнита в - окне 10–20 минут, чтобы дрейф сервинга не разошёлся между руками. В цикле `|| break` (урок Д47.6). + окне 10–20 минут, чтобы дрейф сервинга не разошёлся между руками. + ⛔ **Останов цикла НЕ по коду выхода:** штатная остановка по объёму приходит **и как 0, и как 2**, + различает её только строка `VOLUME CEILING:` в выводе. `|| break` (урок Д47.6) здесь либо рвёт + цикл на первом штатном стопе, либо не рвёт никогда ⇒ **цикл разбирает вывод на `VOLUME CEILING:`**. + ⚠ Окно 10–20 мин достижимо не всегда: латентности edit-вызовов 43–216 с, ретрай добавляет ~200 с — + юнит с обрывом в обеих `∅`-руках упирается в верх окна. **Единица наблюдения** — клетка (юнит × рука); **единица анализа** — юнит. -⭐ **Требование §14 «потолок вывода одинаков во всех руках» выполняется само:** `stagerun.go:113-122` +⭐ **Требование §14 «потолок вывода одинаков во всех руках» выполняется само:** `stagerun.go:109-125` даёт `base = max(EstimateTokens(draft)·2.2, min_max_tokens)`; при черновике ~7 тыс. знаков это -≈5.1 тыс. < 16000 ⇒ **16000 у всех юнитов во всех руках по построению**, ретрай 32000 тоже одинаков. +≈4.5 тыс. < 16000 ⇒ **16000 у всех юнитов во всех руках по построению**, ретрай 32000 тоже одинаков. +⚠ Числа прежней редакции были не те: реальные черновики **427–6171 знак** (не «~7 тыс.»), а +«4412–6946» — это `prompt_tokens` трёх edit-вызовов (исходник + черновик + системное), не длина +черновика. Механизм ломается только выше ~21 800 русских знаков или ~7 300 CJK-знаков эха. ## 3. ⛔ ДВЕ ДЫРЫ ПРИБОРА — БЕЗ НИХ ЗАМЕР НЕ ИЗМЕРИТ СВОЙ ПРЕДМЕТ @@ -53,7 +73,13 @@ SHA — снапшот их различает (`snapshot.go:289`). **Лечение без правки Go, с замеренной точностью:** `R̂ = completion_tokens − 0.3644·len(response_text)`. Коэффициент — видимый выход pro-редактора на zh→ru; **пере-снят мной независимо: 0.3644 токена/знак, n=16, sd 0.0069**. Ошибка ≈±2.3% видимого выхода, пренебрежима при размышлении в тысячах и заметна -лишь при `R̂ < ~500`. Коэффициент **пинится в пре-реге**. +лишь при малом размышлении. Коэффициент **пинится в пре-реге**. +⚠ **Границы формулы, названные до покупки** (проверено независимо на 185 клетках рига с отчётным +`reasoning_tokens`: 0.367–0.369, sd 0.007–0.010): (1) **любой CJK в выходе** ломает оценку — иероглиф +≈1 токен, видимая часть недооценивается, `R̂` завышается; направление консервативно для E1, но +раздувает клетки E5; (2) при `R̂ < ~700` относительная ошибка достигает 20–70% — у мелких клеток +`low` вывод о величине не делается; (3) брать сырую строку попытки, **не `sanitized_export`** — та +несёт обрезанный текст и пустой `usage_json`; (4) «±2.3%» занижено: худшая клетка дала **5.3%**. **Дыра 2. У движка нет проводного артефакта** — стадийный лог эффорт не печатает. Лечение: (а) снапшот фолдит `Reasoning` и `PromptSHA256` ⇒ **у четырёх рук четыре разных `snapshot_id`**, это @@ -67,17 +93,33 @@ n=16, sd 0.0069**. Ошибка ≈±2.3% видимого выхода, пре `cost/delivered` · `finish` попытки 0 · `flag_reason`. * **E1 (главный):** по-юнитный контраст `log R̂(low) − log R̂(∅)`; **Вилкоксон знаково-ранговый**, - α=0.05 двусторонне; медиана и 95% ДИ Ходжеса–Лемана. - **Решение:** p<0.05 И ДИ вне [0.8; 1.25] ⇒ эффект есть; ДИ целиком внутри ⇒ эффекта нет - (эквивалентность); иначе ⇒ ⭐ **«НИЖЕ РАЗРЕШЕНИЯ ЗАМЕРА» — и это НЕ «эффекта нет»**. + α=0.05 двусторонне; медиана и 95% ДИ Ходжеса–Лемана печатаются как ВЕЛИЧИНА. + ⛔ **Исходов ДВА, а не три** — прежняя редакция обещала третий и была неправа: ветвь + «эквивалентность» (ДИ целиком внутри полосы) при наших n **недостижима** — полуширина ДИ в + логарифме ≈0.43 при n=32 против полуширины полосы 0.22, для эквивалентности нужно n≈117. + **Решение:** `p<0.05` ⇒ эффект есть, величина = медиана с ДИ. Иначе ⇒ **«НИЖЕ РАЗРЕШЕНИЯ + ЗАМЕРА»**, и это НЕ «эффекта нет». + ⚠ Критерий — **только `p<0.05`**: со-условие «ДИ вне [0.8;1.25]» снято, потому что оно строже + таблицы мощности (требовало бы истинного эффекта ≈×2.3 против заявленных ×1.84) и потому что сама + полоса — заимствованная конвенция биоэквивалентности, к объёму размышления не обоснованная. + Полоса остаётся **описательной**: попадание в неё печатается, решения не несёт. * **E2:** то же для `log(cost/delivered)` — отдельно по попытке 0 (равный потолок) и по итогу юнита - (боевая цена). ⭐ Средний член цены за знак — константа ($1.45 за 1M знаков в пик), поэтому вся - разница рук сидит в **ρ = R̂/delivered**; ρ свободна от прайса и времени суток. + (боевая цена). ⭐ Средний член цены за знак — константа, поэтому разница рук сидит в + **ρ = R̂/delivered**. ⚠ Оговорка: 2–4-я клетки юнита бьют префикс-кэш, вход дешевеет ~$0.006–0.009; + рандомизация порядка это усредняет, но добавляет ~10% шума на клетку. * **E3:** ось промпта — те же тесты. Прогноз, калибрующий удивление: |эффект| < ×1.25. +* **E4 (восстановлен — без него крест не даёт ничего сверх двух пар):** взаимодействие промпт×эффорт, + контраст `(P₉E_low − P₉E∅) − (P₇E_low − P₇E∅)`. sd контраста вдвое больше ⇒ MDE ≈ ×3.3 при n=32: + **эндпойнт описательный, выводов не несёт** — но печатается, иначе крест не отличим от двух пар. * **E5 (безопасность, блокирует любую рекомендацию):** доля клеток с эхом/`cjk_artifact` и с `length` по рукам. Если у `low` эхо-клеток ≥3 сверх `∅` — **«риск эха на low» независимо от цены**. +* **Ковариата длины входа** — требование §14, которое Вилкоксон принять не может. Восстановлено + ОТДЕЛЬНОЙ моделью: `log R̂ ~ effort + prompt + log(len_draft) + (1|unit)`, **как проверка + устойчивости E1/E3**, не как решающий тест. * **Провал прибора:** сигнатура Δ`prompt_tokens` вне полосы у >20% юнитов ⇒ проба аннулируется, - деньги называются. + деньги называются. ⛔ **Полоса НЕ задана заранее и не может быть**: единственное известное число + (−79) снято на en и на риге. ⇒ **Пред-полёт ЗАМЕРЯЕТ сигнатуру и пинит полосу коммитом**, и лишь + после этого она становится гейтом. **Мощность.** В кресте 2×2 контраст главного эффекта на юните имеет sd = σ (не σ√2) — поэтому n вдвое меньше, чем в простой паре. Источник σ: **эррата Д47.7** (`23-editor-tier.md:7201`=`sd одного розыгрыша = 1.02`, 16 пар @@ -108,14 +150,27 @@ n=16, sd 0.0069**. Ошибка ≈±2.3% видимого выхода, пре ## 6. ⚠ ДЕНЬГИ — И ЗДЕСЬ НУЖНО ЧИСЛО ВЛАДЕЛЬЦА -По фактическому леджеру холодного прогона: клетка `∅` ≈ **$0.054**, с учётом 25% обрывов на 16000 и -ретрая — эффективно ≈ **$0.09**; клетка `low` ≈ **$0.04**. Юнит (2+2) ≈ **$0.26**. +⛔ **Все числа ниже — в ПИКОВЫХ терминах, и иначе быть не может:** леджер движка букирует пик всегда +(`models.yaml:180`=`держим пик`). Потолок кассы, `--ceiling-usd` и число владельца — тоже пиковые; +офф-пик — это счёт вендора по факту, а не потолок. -| объём | клеток | расчётно (пик) | фактически в офф-пик | -|---|---|---|---| -| 24 юнита (~17 глав) | 96 | ≈ **$7.5** | ≈ $3.8 | -| 32 юнита (~24 главы) | 128 | ≈ **$9.9** | ≈ $5.0 | -| плюс базовый прогон | — | ≈ $0.6 | ≈ $0.3 | +По леджеру холодного прогона: клетка `∅` ≈ **$0.054** (среднее четырёх ненулевых edit-строк, включая +ретрай на 32000; попытка 0 — $0.048 при n=3); обрыв случился у **1 строки из 4**. +⚠ **Клетка `low` ≈ $0.04 — ИСТОЧНИКА НЕТ:** движковых edit-вызовов на `low` не существует вовсе, а +хопы на `low` — роль переводчика ($0.004–0.040). Это **предположение, а не замер**, и его проверяет +пред-полёт. Юнит (2+2) ≈ **$0.26** при этом предположении. + +| строка | клеток | расчётно, ПИК | +|---|---|---| +| пред-полёт (1 юнит × 4 руки) | 4 | ≈ **$0.25** | +| 24 юнита (~17 глав) | 96 | ≈ **$7.5** (вкл. 20% запаса) | +| 32 юнита (~24 главы) | 128 | ≈ **$9.9** (вкл. 20% запаса) | +| базовый прогон | — | ≈ $0.4–0.6 | + +⚠ **Чувствительность, названная до покупки:** если `low` на zh режет размышление слабо (×1.4, +как внутри блока Д47), клетка `low` дорожает до $0.05–0.065 ⇒ 32 юнита ≈ **$9.5–10.5 до запаса**. +У рекомендации «$11» остаётся зазор 5–15%, и гард с заметной вероятностью остановит раньше 32-го +юнита. Это штатный исход: **стоп и вопрос владельцу, добор после чисел запрещён.** ⛔ **Мои прежние сметы ($1.7 и $2.50) занижены втрое** и снимаются: они считали «выход» как видимый текст, тогда как размышление у DeepSeek сидит ВНУТРИ `completion_tokens`. Это тот же класс, что @@ -148,7 +203,7 @@ n=16, sd 0.0069**. Ошибка ≈±2.3% видимого выхода, пре | 5 | «засеять `first_person`/`speech`» | поля мёртвые: не копируются в рендер, не входят в хеш | | 6 | «движок ручку не шлёт вообще» | `capability.go:236` шлёт `low|medium|high`; доказано на проводе | | 7 | «гейт запретит» | гейт в другом тесте и пинит только шиппинг-конфиги | -| 8 | «риг потерял бы роль редактора» | `tenant_panel/prompts.py:143` грузит боевой `editor.md` | +| 8 | «риг потерял бы роль редактора» | `tenant_panel/prompts.py:141`=`def editor_msgs` грузит боевой `editor.md` | | 9 | «эхо на `pro`@`low` не мерено» | 5 хопов в `coldrun-v16`, эхо 0 — ⚠ но роль переводчика, не редактора | | 10 | сметы $1.7 / $2.50 | занижены втрое: размышление внутри `completion_tokens` |