30 KiB
ПЛАН ФАЗЫ Д — РЕДАКЦИЯ 4: ПРЕ-РЕГ РАТИФИЦИРОВАННОЙ ПРОБЫ
Редакции 1–3 отвергнуты консилиумом; их разбор — §8, сохранён как класс ошибок фазы. Редакция 4 собрана с постоянным консилиумом (архитектор замера · скептик · казначей) и несёт ПРЕ-РЕГИСТРАЦИЮ, а не намерения. Платные замеры санкционированы владельцем 01.09 — ⚠ без числа, и число нужно до фриза (§6).
1. ЧТО ЭТО ЗА ЗАМЕР И ПОЧЕМУ ИМЕННО ОН
Носитель: D39.184 п.5 — «Следующий платный замер — контролируемая проба редактора по ЧЕТЫРЁМ
осям (§14 отчёта холодного прогона): трудность чанка БЛОКИРОВАТЬ, длину входа КОНТРОЛИРОВАТЬ,
промпт по SHA, эффорт off против low». ⚠ Ноты нет в ветке polygon (реестр обрывается на
D39.170) — она в main; это следствие расхождения веток, а не отсутствия решения.
Вопрос: ПОЧЕМУ редактор дорог. Не «кто лучше» (мерено) и не «сколько продавать» (гейчено отдельно, §7).
2. ДИЗАЙН — КРЕСТ 2×2 ВНУТРИ ЮНИТА
| рука | промпт | stages[edit].reasoning |
что уходит на провод |
|---|---|---|---|
| P₇·E∅ | editor.md из e89874b^ |
"off" |
ключа reasoning_effort НЕТ ⇒ вендор-дефолт high |
| P₇·E_low | тот же | "low" |
reasoning_effort:"low" |
| P₉·E∅ | editor.md HEAD |
"off" |
ключа нет |
| P₉·E_low | тот же | "low" |
low |
Промпты различаются одной строкой; метка v3-discourse-reflow у обоих одна, поэтому берём по
SHA — снапшот их различает (snapshot.go:288=prompt_sha256).
- БЛОКИРУЕТСЯ трудность: каждая рука видит ВСЕ юниты. Реализация: один базовый прогон (черновая
волна + майнинг + терминолог), затем БД копируется ×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иceilings(последнее — потому что касса наследует базовый расход, §5.4). - КОНТРОЛИРУЕТСЯ длина входа:
len(draft)иprompt_tokens— ковариата. ⚠ Честно: чанки движка узки поprompt_tokens(4412–6946: там доминируют исходник и системное), но сама длина черновика широка — 427–6171 знак, разброс ×14, и она входит в модель ковариатой (§4). Прежняя формулировка «контролируется, а не измеряется» снята как противоречащая §4. - ФИКСИРУЕТСЯ: модель и дата вендор-доки · бинарь
tmctlпо sha ·models.yamlпо sha · потолок вывода ·temperature 0.4·few_shot: false· санитайзер ON ·escalation.budget_usd: 0ТОЛЬКО в четырёх конфигах рук. ⛔ **В БАЗОВОМ прогоне он обязан быть0**, иначе эхо-черновики останутся флагнутыми: в холодном прогоне 5 хопов на 25 вызовов, $0.103 на 10 глав ⇒ ≈$0.25 на 24 главы, и это отдельная строка сметы. ⚠ обоснование прежней редакции («иначе флагнутый юнит уйдёт хопом») ЛОЖНО и снято: редактор эскалировать не может по построению (
pipeline.go:1012=escalate_to is only allowed on a translator role). Настройка инертна для edit-волны; держим её как гигиену, а не как защиту. - РАНДОМИЗИРУЕТСЯ порядок рук внутри юнита; интерливинг во времени — четыре клетки юнита в
окне 10–20 минут, чтобы дрейф сервинга не разошёлся между руками.
⛔ Останов цикла НЕ по коду выхода: штатная остановка по объёму приходит и как 0, и как 2,
различает её только строка
VOLUME CEILING:в выводе.|| break(урок Д47.6) здесь либо рвёт цикл на первом штатном стопе, либо не рвёт никогда ⇒ цикл разбирает вывод наVOLUME CEILING:. ⚠ Окно 10–20 мин достижимо не всегда: латентности edit-вызовов 43–216 с, ретрай добавляет ~200 с — юнит с обрывом в обеих∅-руках упирается в верх окна.
Единица наблюдения — клетка (юнит × рука); единица анализа — юнит.
⭐ Требование §14 «потолок вывода одинаков во всех руках» выполняется само: stagerun.go:109-125
даёт base = max(EstimateTokens(draft)·2.2, min_max_tokens); при МАКСИМАЛЬНОМ черновике 6171 знак это
≈4.5 тыс. < 16000 ⇒ 16000 у всех юнитов во всех руках по построению, ретрай 32000 тоже одинаков.
⚠ Числа прежней редакции были не те: реальные черновики 427–6171 знак (не «~7 тыс.»), а
«4412–6946» — это prompt_tokens трёх edit-вызовов (исходник + черновик + системное), не длина
черновика. Механизм ломается только выше ~21 800 русских знаков или ~7 300 CJK-знаков эха.
3. ⛔ ДВЕ ДЫРЫ ПРИБОРА — БЕЗ НИХ ЗАМЕР НЕ ИЗМЕРИТ СВОЙ ПРЕДМЕТ
Дыра 1. Движок НЕ ВИДИТ размышление DeepSeek по построению. provider_openai.go:23
=ReasoningTokens stays 0 to avoid double-billing: у subset-провайдеров размышление считается
ВНУТРИ completion_tokens, и поле остаётся нулём. Проверено: во всех движковых базах
sum(reasoning_tokens>0) = 0. А предмет замера — именно размышление (95–96% цены).
Лечение без правки Go, с замеренной точностью: R̂ = completion_tokens − 0.3644·len(response_text).
Коэффициент — видимый выход pro-редактора на zh→ru; пере-снят мной независимо: 0.3644 токена/знак,
n=16, sd 0.0069. Ошибка типично ~3% видимого выхода, худшая клетка 5.3%; пренебрежима при размышлении в тысячах и заметна
лишь при малом размышлении. Коэффициент пинится в пре-реге.
⚠ Границы формулы, названные до покупки (проверено независимо на 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) типичная ошибка ~3%, худшая клетка — 5.3%.
Дыра 2. У движка нет проводного артефакта — стадийный лог эффорт не печатает. Лечение:
(а) снапшот фолдит Reasoning и PromptSHA256 ⇒ у четырёх рук четыре разных snapshot_id, это
запись в БД, что конфиг был в силе; (б) сигнатура prompt_tokens(∅) − prompt_tokens(low) по юнитам
(на en дважды ровно 79). ⚠ Оба — косвенные; побайтной улики у движка нет.
4. ПРАВИЛО РЕШЕНИЯ — ЗАПИСАНО ДО ЧИСЕЛ
Метрики клетки: R̂ · completion_tokens · cost_usd (сумма ВСЕХ строк юнита в руке, ретраи
включены) · delivered = знаки отгружаемого текста при годной диспозиции, иначе 0 ·
cost/delivered · finish попытки 0 · flag_reason.
- E1 (главный): по-юнитный контраст
log R̂(low) − log R̂(∅); Вилкоксон знаково-ранговый, α=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) и потому что сама полоса — заимствованная конвенция биоэквивалентности, к объёму размышления не обоснованная. Полоса остаётся описательной: попадание в неё печатается, решения не несёт. ⛔ Цензура на потолке — правило записано до чисел, СИММЕТРИЧНО. В холодном прогоне 1 из 4∅-строк вернулаlengthровно на 16000 при непустом тексте: тамR̂— нижняя граница, а ретрай на 32000 есть ДРУГОЙ розыгрыш. ⇒ E1 считается по попытке 0; клетка сlengthвходит правой цензурой (R̂ ≥наблюдённого). Знак пары определяется так:- цензурирована
∅— знак достоверен, пока цензурированная∅≥low; иначе ничья; - цензурирована
low— знак достоверен, только если∅≤ наблюдённой границыlow; иначе ничья; - цензурированы обе — ничья.
⚠ «Ничья» ≠ «выброшено», и это надо задать в коде явно: стандартный знаково-ранговый Вилкоксон
нули по умолчанию ВЫБРАСЫВАЕТ; сохраняет их вариант Пратта. Скрипт эндпойнта обязан назвать
метод обработки нулей, иначе правило плана и тест разойдутся молча. ✅ Проверено на машине
01.09:
scipy 1.18.0, уwilcoxonумолчаниеzero_method='wilcox'(нули ВЫБРАСЫВАЮТСЯ), вариант Пратта поддержан ⇒ в скрипте пинитсяzero_method='pratt'. ⚠ Величина под цензурой — НИЖНЯЯ ГРАНИЦА: медиана и ДИ Ходжеса–Лемана при цензурированных клетках занижают эффект, поэтому величина печатается со знаком «≥». Иначеp<0.05при малой медиане прочтётся как «эффект мал», когда он может быть велик.
- цензурирована
- E2: то же для
log(cost/delivered)— отдельно по попытке 0 (равный потолок) и по итогу юнита (боевая цена). ⭐ Средний член цены за знак — константа, поэтому разница рук сидит в ρ = 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 и на риге. ⇒ Пред-полёт ЗАМЕРЯЕТ сигнатуру и пинит её коммитом, и лишь после этого она становится гейтом. ⚠ Но «полосу» из пред-полёта не вывести: один юнит даёт две сигнатуры (P₇ и P₉), разброса в них нет. Поэтому правило допуска объявляется ЗДЕСЬ, до замера, и опирается на контроль 05.08: при побайтно одинаковыхmessagesпровайдер повторяетprompt_tokensв точности ⇒ сигнатура ожидается КОНСТАНТОЙ. Допуск: ±2 токена от значения, снятого пред-полётом (запас на неучтённую серверную вставку, не на шум). Клетка вне допуска — «сигнатура не воспроизвелась»; >20% таких юнитов ⇒ проба аннулируется.
Мощность. В кресте 2×2 контраст главного эффекта на юните имеет sd = σ (не σ√2) — поэтому n
вдвое меньше, чем в простой паре. Источник σ: эррата Д47.7 (23-editor-tier.md:7201=sd одного розыгрыша = 1.02, 16 пар
e0/zf, побайтно один вход) — ⚠ на английской паре и роли редактора; на zh не переносится,
поэтому планируем σ=1.2 с чувствительностью 1.0/1.4.
| σ | ×2.5 | ×2.0 | ×1.5 | MDE при n=24 | MDE при n=32 |
|---|---|---|---|---|---|
| 1.02 | 11 | 18 | 51 | ×1.82 | ×1.68 |
| 1.2 | 15 | 25 | 70 | ×2.02 | ×1.84 |
| 1.4 | 20 | 34 | 95 | ×2.27 | ×2.03 |
⛔ Эффект ×1.40 (наблюдённый внутри блока в Д47) при любом n ≤ 32 ниже разрешения — записано ДО покупки.
5. ГАРДЫ
-
⛔ РАМКА ВЫБОРКИ — пинится ДО всего остального, иначе «24 юнита» читаются как ОТБОР. В пре-рег заносится: срез исходника (диапазон глав, файл, его sha256) · новый каталог книги — ⚠ не
coldrun-v16, где три оплаченных edit-юнита заставят--resnapshotна каждой из четырёх копий · все юниты этих глав в порядке движка, без выбора ·n= сколько их получится (ориентир холодного прогона: 14 юнитов на 10 глав) · и входит ли юнит пред-полёта вn(решение: входит — это первый юнит в порядке движка, прогоняемый во всех четырёх руках). -
Пред-полёт: один юнит × 4 руки (~$0.25) → сигнатура Δ
prompt_tokensСНЯТА и запинена коммитом (по одной на P₇ и P₉; полосой она станет только после этого) · четыре разныхsnapshot_id· кириллица ≥0.99 · эхо 0. Только потом пачка. -
Зелень на пустоте:
delivered = 0⇒ клетка идёт в E5 и исключается из E2; если таких >20% в руке — прибор ОТКАЗЫВАЕТ, а не печатает «в пределах». -
Эхо-гейт включён во всех руках. ⚠
low≠ выключение: мина вооружается ТУМБЛЕРОМ, а уровни эффорта едут с размышлением включённым. Гейт всё равно остаётся. -
Касса — и здесь ловушка, которую видно только в коде.
ledger.go:58=FROM spend WHERE book_idсчитает потолок поbook_id, а копия БД несёт базовый расход под тем жеbook_id(в холодном прогоне это $0.4361). ⇒ceilings.book_usdкаждой копии = база + доля руки + запас, то есть вbook.yamlменяются ТРИ поля (project_db,pipeline,ceilings), либо потолок задаётся--ceiling-usdна каждый запуск. И число владельцу подаётся ОДНОЙ суммой: база + пред-полёт + N юнитов × 4 руки — иначе базовый расход посчитается четырежды или не посчитается вовсе. Отказ леджера = СТОП и вопрос владельцу; добор после чисел запрещён; потолок сессия не поднимает. -
Фриз — и он обязан лежать в зоне полигона. Пре-рег и скрипт эндпойнта коммитятся в
eval/dovodka/. ⚠ Четыреpipeline.yamlи дваeditor.mdфизически живут в каталоге книги — это ОТДЕЛЬНЫЙ репозиторий с открытым вопросом «кто коммитит книги», поэтому в зону полигона кладутся их замороженные копии вместе с sha256; иначе «коммитами ДО первой клетки» не исполнимо по канону. Всё — ДО первой платной клетки.
6. ⚠ ДЕНЬГИ — И ЗДЕСЬ НУЖНО ЧИСЛО ВЛАДЕЛЬЦА
⛔ Все числа ниже — в ПИКОВЫХ терминах, и иначе быть не может: леджер движка букирует пик всегда
(models.yaml:180=держим пик). Потолок кассы, --ceiling-usd и число владельца — тоже пиковые;
офф-пик — это счёт вендора по факту, а не потолок.
По леджеру холодного прогона: клетка ∅ ≈ $0.054 (среднее четырёх ненулевых edit-строк, включая
ретрай на 32000; попытка 0 — $0.048 при n=3); обрыв случился у 1 строки из 4.
⚠ Клетка low ≈ $0.04 — ИСТОЧНИКА НЕТ: движковых edit-вызовов на low не существует вовсе, а
хопы на low — роль переводчика ($0.004–0.040). Это предположение, а не замер, и его проверяет
пред-полёт.
Арифметика юнита, по шагам (её пропуск в прошлой редакции ломал все производные): попытка 0
у ∅ = $0.048; обрыв на 16000 случается у ~25% и добавляет ретрай на 32000 (+$0.070) ⇒
эффективная ∅ ≈ $0.048 + 0.25·0.070 ≈ $0.066, с запасом на разброс — $0.09.
Юнит (2 × ∅ + 2 × low) ≈ 2·0.09 + 2·0.04 = $0.26.
| строка сметы | клеток | расчётно, ПИК |
|---|---|---|
| базовый прогон (черновая волна + майнинг + терминолог) | — | ≈ $0.6 |
эскалация эхо-черновиков в базовом прогоне (budget_usd > 0) |
~12 хопов | ≈ $0.25 |
| пред-полёт (1 юнит × 4 руки) | 4 | ≈ $0.25 |
| вариант A: 24 юнита × 4 руки (+20% запаса) | 96 | ≈ $7.5 |
| вариант B: 32 юнита × 4 руки (+20% запаса) | 128 | ≈ $10.0 |
⭐ ОДНОЙ СУММОЙ, как и надо просить у владельца (иначе база посчитается четырежды или ни разу —
леджер считает потолок по book_id, а его несут все четыре копии):
- вариант A (~17 глав, ожидаемо ~24 юнита): $8.6 — разрешающая способность ×2.02;
- вариант B (~24 главы, ожидаемо ~32 юнита): $11.1 — разрешающая способность ×1.84.
⚠ Вариант задаётся ДИАПАЗОНОМ ГЛАВ, а не числом юнитов. «24» и «32» — ожидание по пропорции холодного прогона (14 юнитов на 10 глав), а не цель: юниты не добираются и не обрезаются. Прогон идёт до конца диапазона либо до срабатывания денежного гарда — что наступит раньше.
⚠ Чувствительность, названная до покупки и выведенная из своих же клеток: если low на zh режет
размышление слабо (×1.4, как внутри блока Д47), клетка low дорожает до $0.05–0.065 ⇒ юнит
2·0.09 + 2·(0.05…0.065) = $0.28–0.31 ⇒ 32 юнита = $8.96–9.92 до запаса. Сравнивать это надо
со строкой ЮНИТОВ ($10.0), а не с полной суммой: база, эскалация и пред-полёт ($1.1) тратятся при
любом срезе. Зазор 0.8–10.4% ⇒ гард с заметной вероятностью остановит раньше 32-го юнита.
Это штатный исход: стоп и вопрос владельцу, добор после чисел запрещён.
⛔ Мои прежние сметы ($1.7 и $2.50) занижены втрое и снимаются: они считали «выход» как видимый
текст, тогда как размышление у DeepSeek сидит ВНУТРИ completion_tokens. Это тот же класс, что
«смета ×10» редакции 1.
⭐ Вопрос владельцу, единственный блокирующий: потолок — вариант A $8.6 (24 юнита, MDE ×2.02) или вариант B $11.1 (32 юнита, MDE ×1.84). Обе суммы — из таблицы выше и больше нигде в этом файле не повторяются. Санкция «платные замеры разрешаю» числа не содержит, а по канону потолок сессия не поднимает.
7. ЧЕГО В ЗАМЕРЕ НЕТ НАМЕРЕННО
Калибровки ставки платформы (гейчено, §14 прямо) · судейства качества — качество low вне скоупа,
только $0-гейты и E5 · правок models.yaml, capabilities, Go · смены модели, черновика,
дифф-контракта · креста «размышление вкл/выкл» пилота · сравнения с июльским базлайном как
каузального: между июлем и сегодня сменились веса модели, дефолт, маппинг и потолок — проба
разделяет рычаги СЕГОДНЯ.
⛔ И отдельно: из этой пробы НЕ следует рекомендация менять боевой pipeline-c1.yaml. Флип там
пинит тест (echo_mine_test.go:217, TestBoevoyConfigEditorDsproAndGrokReasoning) и двигает
снапшот edit-волны ⇒ --resnapshot и перекупка волны.
8. РЕЕСТР ОШИБОК ЧЕТЫРЁХ РЕДАКЦИЙ — сохранено, потому что класс один
| # | что утверждал | чем опровергнуто |
|---|---|---|
| 1 | «прибор верности нужен первым» | вопрос закрыт замером: редакторы не дописывают (рост знаков −0.4% и −0.6%) |
| 2 | «проба единицы выдачи» | гипотезу опровергают наши же данные; арм запрещён; смета ×10 |
| 3 | «контур ни разу не ездил целиком» | coldrun-v16 прошёл НАКАНУНЕ |
| 4 | «канон мерен на 1–2 главах» | я сам намерил на 25 главах подряд сутками ранее |
| 5 | «засеять first_person/speech» |
поля мёртвые: не копируются в рендер, не входят в хеш |
| 6 | «движок ручку не шлёт вообще» | capability.go:236 шлёт `low |
| 7 | «гейт запретит» | гейт в другом тесте и пинит только шиппинг-конфиги |
| 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 |
Сквозной класс — один: показания инструмента, собственной памяти или своей ветки приняты за факт о мире. Лечение, выведенное из десяти случаев: отрицательный результат предъявляется с положительным контролем, а прежде «этого нет» — смотреть каталог артефактов, а не только доки своей ветки.