textmachine/eval/dovodka/PLAN-21-08.md

220 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ПЛАН 21.08 — ДОФИКСЫ И ДОСНЯТИЕ. Заказ владельца 21.08
> Заводится по прямому слову владельца: «завести актуальный план, куда ты дампнешь все необходимые
> дофиксы, и мы пойдём доделывать и доснимать проблемные места… заодно получится следовать ровно
> по этому плану и не ошибиться».
> Предыдущие слои: `PLAN-17-08.md` (курс, частью исполнен) · `HANDOFF-21-08.md` ·
> `SESSION2-LOG.md` §16 · отчёт `docs/experiments/23-editor-tier.md` секции Д21Д29.
> Читать ЦЕЛИКОМ, не грепом.
---
## 0. ⛔ ПОРЯДОК РАБОТ. Он важнее содержания и меняется по сравнению с прошлым планом
**Сначала ГЛОБАЛЬНОЕ РЕВЬЮ (шаг 1), потом фиксы (шаги 2+).** Основание — не осторожность, а
арифметика: за 21.08 найдено ПЯТЬ дефектов класса «реализация не то, чем названа», и **ни одного
из них не поймал ни один гейт**. Склейку поймал владелец вопросом; конфигурацию `glm-5` — я
случайно, глядя в счета; ошибку в собственном отчёте — только когда владелец потребовал
расшифровать термины. Значит плотность необнаруженных дефектов этого класса ненулевая, и чинить
до ревью — значит чинить не то и потом пере-ревьюить изменённое.
---
## 1. ШАГ 1 — ГЛОБАЛЬНОЕ АДВЕРСАРИАЛЬНОЕ РЕВЬЮ ВСЕГО ЭКСПЕРИМЕНТА ($0, воркфлоу)
Заказ владельца 21.08: «надо какое-то после плана запланировать воркфлоу ревью всего экспа,
глобальное. На поиск подобных проблем».
**Прецедент, показывающий, что это работает:** адверсариальная приёмка другим модельным семейством
за прошлую сессию нашла 8 дефектов замера и 4 неверных утверждения в моём же отчёте.
### 1.1 Что ревью обязано проверять — по классам найденных дефектов, а не «вообще»
| класс | образец, уже случившийся | что искать |
|---|---|---|
| **промт не то, чем назван** | склейка с мета-фразой «редактора после тебя не будет» подавалась как продуктовая однопроходка | ПРОЧИТАТЬ полный текст системного промта КАЖДОГО арма; искать мета-фразы про наш конвейер, указания про несуществующие тексты, следы измерительного происхождения |
| **конфигурация модели ≠ фон** | ростер гасил размышление `glm-5`; вывод «промт не переносим» был бы ложным наоборот | для каждого арма распечатать `call_kwargs` и сверить с ролью: reasoning, температура, потолок вывода |
| **число в отчёте ≠ число в данных** | опубликовано ×1.05/×1.08 объёма промта, намерено ×1.24/×1.28; вывод «конфаундер не воспроизводится» ложен | пере-считать КАЖДОЕ число отчёта Д17Д29 из сырья; расхождение = находка |
| **арм не отличается от другого арма** | `Z7` побайтно равен `ZP` на 12 главах из 15 | сверить тексты армов ПОПАРНО во всех панелях |
| **клетка негодна, но гейта нет** | `contour.base_a0` читает `content` без проверки `finish`; оборванная клетка попала в панель | пройти ВСЕ источники текстов армов и проверить наличие гейта годности |
| **гейт сертифицирует не то** | гейт покрытия засчитал правило словом из ПРОТИВОПОЛОЖНОГО правила | для каждого гейта: что он ЗАЯВЛЯЕТ и что реально проверяет; уронить на заведомо больном входе |
| **инструмент признан негодным, а ссылки на него живут** | `promptdiff.py`, `canon.py`, `material_ja.py` объявлены негодными внутри ревизии; на `promptdiff` ссылается шапка английского пар-пакета как на гейт | найти все ссылки на негодные инструменты как на основание |
| **обязательство закрыто артефактом, а не действием** | «выпущено/ждёт владельца» вместо исполнения | сверить обязательства сессий против фактов на диске |
### 1.2 Обязательные правила ревью
* **Author ≠ reviewer.** Ревьюит НЕ та сессия, что писала. Модельное семейство — другое.
* **Грунтовать `file:line` или цитатой из сырья.** «Выглядит подозрительно» — не находка.
* **Три исхода, а не два:** подтверждено · опровергнуто · **НЕ ПРОВЕРЕНО** (упал по лимиту,
не хватило доступа). Урок приёмки П7: 55 находок сочли опровергнутыми, а рефутеры просто упали,
и оба блокера были среди них. Сверять `agents_done` против `agent_count`.
* **Ревью читает ТЕКСТЫ, а не хеши.** Все пять дефектов 21.08 невидимы для проверки «файл на
месте, длина сходится, побайтно совпало».
* **Результат — список находок с диспозицией**, вливается в этот план как шаг 2а.
### 1.3 Чего ревью НЕ решает
Оно не судит переводы и не переоценивает вердикты. Его предмет — **реализация и отчётность**,
а не качество перевода.
---
## 2. РЕЕСТР УЖЕ НАЙДЕННЫХ ДЕФЕКТОВ — чинить ПОСЛЕ ревью, порядком ниже
Статусы: `ФИКС` — правка кода/доков · `ЗАМЕР` — надо доснять · `ВОПРОС` — решает владелец.
### 2.1 Ошибки в собственных отчётах (ФИКС, $0)
| № | что | где | почему это важно |
|---|---|---|---|
| Ф-1 | Опубликовано «объём промта ×1.05 zh / ×1.08 en, конфаундер эксп-21 не воспроизводится». **Намерено по 32 главам: ×1.28 и ×1.24.** Вывод ЛОЖЕН | Д23.1 | это ровно тот конфаундер, ради снятия которого строилась склейка; смягчает лишь то, что лишний объём играл ЗА новый промт, и он всё равно не обошёл склейку |
| Ф-2 | Английские армы названы «продакшеном». **В `backend/prompts/` есть только `zh-ru`;** английский пар-пакет живёт ТОЛЬКО в `eval/role_topology/prompts/en-ru/` и в бэкенд не лендился | Д24, Д26, Д28, Д29 | сравнение внутри панели не портится (пакет у всех один), но слово неверное: это кандидатский пакет, а не прод |
| Ф-3 | «`Z7``ZP` на 10 главах» — на самом деле **на 12**: ещё 2 главы фиксер ЗВАЛСЯ, был оплачен и вернул побайтно тот же текст | исправлено 21.08 в Д23.6 | ⚠ уже поправлено, оставлено в реестре как образец класса |
| Ф-4 | «gemini заблокирован материалом, срабатывания массовые» — **неверно**. Как переводчик: 172 клетки, **0 отказов**. Как СУДЬЯ: 318 клеток, 12 отказов (3.8%), все на одной главе, дата 08.08 | сказано владельцу устно 21.08 | поправка внесена в разговоре, в отчёт НЕ внесена — долг |
### 2.2 Дефекты кода (ФИКС/ВОПРОС)
| № | что | статус |
|---|---|---|
| К-1 | `contour.base_a0` читает `content` БЕЗ проверки `finish` (в отличие от соседнего `base_draft`, где гейт есть на обеих ветках). Через щель в китайскую панель прошла клетка `finish=length`. Масштаб: 1 из 22 | **ВОПРОС ВЛАДЕЛЬЦУ.** Функция питает ВСЕ прошлые замеры фазы; тихая правка рассогласует их с уже вынесенными вердиктами. Гейт сборки (`--verify-read`, ловит короткие тексты) уже заведён и закрывает класс на входе в панель |
| К-2 | Ростер шлёт `gpt-5.6-luna` с `reasoning_effort: "low"`. Замер Д28: ослабленное размышление роняет качество РАЗЛИЧИМО | **ФИКС ДО ПОКУПКИ.** Правка того же вида, что сделана для `glm-5` (арм `RGT`): гонять с вендор-дефолтным размышлением. Иначе получим ложное «luna не годится» — второй раз подряд той же ошибкой |
| К-3 | Фильтр замечаний критика выбрасывает **20.7% строк на китайском** (304 из 1469) против **0.6% на английском** (1 из 178). Что выброшенное — действительно согласия, НЕ ПРОВЕРЕНО | **ЗАМЕР $0.** Прочитать выброшенные строки. Асимметрия ×34 между парами подозрительна сама по себе; у фильтра уже была история — прошлая редакция ела отрицательные формы как согласия и выбросила 10 настоящих находок. И это ровно та пара, где «критик → перепис» берёт больше всех первых мест |
| К-4 | `promptdiff.py` признан негодным внутри ревизии (расхождение матчится по префиксу строки; отсутствующий файл пар-пакета гейт не роняет). При этом шапка английского `translator.md` ссылается на него как на гейт, удостоверяющий «расхождение РОВНО одно» | **ФИКС.** Утверждение 21.08 перепроверено НЕЗАВИСИМО и подтвердилось (переводчик: 1 расхождение; редактор: 7, все — парные замены того же правила, ничего не выброшено). Ссылку на негодный гейт заменить на ссылку на эту проверку |
| К-5 | Три инструмента зоны негодны, гейты числят их зелёными: `promptdiff.py` · `canon.py` (снятая ревью классификация всё равно пишется в артефакт) · `material_ja.py` (фильтр AI-меток объявлен механическим, кода не существует) | **ФИКС/ВОПРОС** — вскрывать перед любой опорой |
### 2.3 Незакрытые клетки замера (ЗАМЕР, деньги названы)
| № | что доснять | почему | цена |
|---|---|---|---|
| З-1 | **новый промт + канон-фиксер** | в панели фиксер стоял над СТАРОЙ склейкой; лучший промт с детерминированной страховкой не пробован ни разу | ~$0.10 |
| З-2 | **критик → ТОЧЕЧНАЯ правка над хорошим переводом** | это ядро V6 владельца. Мерился только фиксер над ДЕШЁВЫМ черновиком, и переносить тот отрицательный вывод сюда наш же план ЗАПРЕЩАЕТ: «там фиксер чинил дешёвый черновик, в V6 он чинит перевод хорошей модели — другая работа» | ~$0.35 |
| З-3 | **`gpt-5.6-luna` в роли однопроходки** | выход втрое дешевле dspro; в дорогой роли не мерен ни разу; в черновиках — ничья. Единственная оставшаяся крупная экономия | ~$0.14 |
| З-4 | **`gemini-3.1-flash-lite` в роли однопроходки** | то же; и как переводчик Gemini не отказывал ни разу (172 клетки) | ~$0.18 |
| З-5 | две недостающие клетки `RGT` | гард отказал на потолке ФД-N; панель собрана на 13 главах вместо 15 | $0.11 |
| З-6 | **вторая пятнадцатка читателей на те же пакеты** | разброс ПРИБОРА не мерен ни разу. Все выводы предполагают, что читатель устойчив; проверено только косвенно (близнецов не разводил, 12 тождественных пар связал знаком `=`) | **$0** |
| З-7 | `gemini-3.6-flash` — единственная непроверенная фронтир-модель | опционально; старший `pro-preview` закрыт как «не лучше, ×30 по цене» | ~$0.88 |
**Потолок ФД-N: $2.40 → $3.30** покрывает З-1…З-5. С З-7 — до $4.20. Пакетный резерв $1.96.
⛔ Поднимать потолок решением сессии ЗАПРЕЩЕНО: суммы названы, слово за владельцем.
### 2.4 Долги фазы, не двигающие знание, но без них фаза не сдаётся
Перенесены из `PLAN-17-08.md` §4, статус на 21.08 не изменился:
адъюдикация английской оси (блокирует единственный несущий вывод фазы) · 65 находок ревизии ·
секция Д5 (ручная пере-классификация 24 мест) · синхронизация отчёта (сводка Д9 против Д15Д20,
деньги в Д17 протухли, тела эрраты Э-17.1 нет) · реестр требований (строк на Д17Д20 нет,
16 самореферентных улик, R64 красный) · **пинг в `docs/PROGRESS.md`, последняя запись 15.08** ·
селфтесты `sud.py` красные на трёх осях (⚠ `MIN_FLOOR["d6"]=3` — константа под зелень, НЕ править,
вопрос владельцу) · `E1` побайтно равен черновику на 5 единицах из 16 · эррата zh-канона ·
`chtenie.py --score-calib` не пере-считывает число, ради которого объявлен.
**Долг ЧУЖОЙ ЗОНЕ (пинг оркестратору обязателен):**
английский экстрактор `pair_en.raw_text` сносит из epub все теги, включая `</p>`: в книге 11 447
абзацев, а модели едет один блок. Чинить на месте НЕЛЬЗЯ — `uid = sha1(source.strip())`, правка
пробелов переименует всё и повесит 289 оплаченных клеток на $2.64. Починка сделана НА ПОДАЧЕ
(`podacha.restore_paragraphs`), настоящая — в бэкенде.
**Сюда же Ф-2: английского пар-пакета в бэкенде нет вовсе.**
### 2.5 Открытые нормы и отступления
* **П-1 «два судейских семейства» не исполняется** — решение владельца 20.08 (Sol запаркован).
Объявленное отступление, писать рядом с каждым выводом.
* **P42 снят с повестки, но НЕ решён:** два пре-рег-правила о маржевом гейте противоречат.
* **Пре-рег Д23 разошёлся с панелью** (`RN2`/`RG`/`RK` обещаны, куплены `RC`/`RB`) — объявлено
девиацией Д23.5; **собственного пола замера (`RN`/`RN2`) не существует**, полом служит чужая
пара `Z0`/`ZF`.
---
## 3. ЧТО ЗАВЕСТИ, ЧТОБЫ КЛАСС БОЛЬШЕ НЕ ПРОХОДИЛ (ФИКС, $0)
**Гейт «промт на провод».** Перед КАЖДОЙ покупкой печатать ПОЛНЫЙ ТЕКСТ системного промта каждого
арма и требовать, чтобы его ПРОЧЛИ: сессия вслух в отчёте плюс приёмка другим семейством.
Не хеш, не длину, не «расхождение одно» — сам текст.
Обязательные пункты той же сверки, обе — из ошибок 21.08:
* **что реально уходит по проводу** — `call_kwargs` каждого арма (reasoning, температура, потолок);
* **сколько знаков инструкции** у каждого арма, отношение к базе контраста.
Почему это, а не ещё один структурный гейт: склейка несла прямым текстом «отдельного редактора
после тебя НЕ БУДЕТ». **Никакой механический гейт этого не увидит, а человек видит с первой
строки.** Все пять дефектов 21.08 — этого класса.
---
## 4. ПОРЯДОК ИСПОЛНЕНИЯ
1. **Шаг 1 — глобальное ревью** (§1). $0. Находки вливаются сюда как §2.6.
2. **Шаг 2 — фиксы отчётов** Ф-1, Ф-2, Ф-4 (§2.1). $0. Делать ПОСЛЕ ревью: оно может добавить.
3. **Шаг 3 — фиксы кода** К-2 (обязателен ДО покупок), К-3 (замер $0), К-4. К-1 — ВОПРОС.
4. **Шаг 4 — гейт «промт на провод»** (§3). $0. Ставится ДО покупок шага 5.
5. **Шаг 5 — покупки** З-1…З-5 по санкции владельца и поднятому потолку.
6. **Шаг 6 — второе чтение** З-6. $0. Даёт разброс прибора, которого нет ни у одного вывода фазы.
7. **Шаг 7 — долги фазы** (§2.4), начиная с адъюдикации английской оси и пинга в `PROGRESS.md`.
---
## 5. ЧЕГО НЕ ДЕЛАТЬ
* **Не покупать до шага 4.** Гейт «промт на провод» стоит $0 и ловит класс, стоивший фазе двух
ложных выводов за один день.
* **Не чинить `base_a0` тихо.** Он питает все прошлые замеры; правка без слова владельца
рассогласует их с вынесенными вердиктами.
* **Не поднимать потолки решением сессии.** Суммы названы, слово за владельцем.
* **Не переносить отрицательный вывод по точечным контурам на З-2.** Там фиксер чинил дешёвый
черновик; здесь — перевод хорошей модели. Другая работа, и это записано ещё в прошлом плане.
* **Не называть английские армы продакшеном** до тех пор, пока пар-пакет не залендён в бэкенд.
---
## 6. ИТОГ ШАГА 1 — РЕВЬЮ ИСПОЛНЕНО, И ЧТО УЖЕ ПОЧИНЕНО
**Ревью отработало целиком: 231 агент, 0 отказов, каждая находка через трёх адверсариальных
скептиков. 51 дефект: 11 блокеров, 22 важных, 18 мелочей. Находок «не проверено» — НОЛЬ.**
Полный свод — `REVIEW-21-08.md`. Эррата в отчёте — секция Д30, баннеры на девяти ложных
утверждениях в их родных местах.
### 6.1 Починено в коде (сделано 22.08)
| блокер | что было | что стало |
|---|---|---|
| **Б1** | `contour.a2_mandate` грузила `editor.md` по захардкоженному zh-пути → на en/ja в промт уезжали 时辰, чэнъюй, «китайский паратаксис» | грузит по `PAIR_DIR` своей пары. Проверено: английский промт чист, китайский свои правила сохранил, селфтест контура печатает zh-проводку как no-op (39/66 → 39/66) |
| **Б6/Б7/В22** | ростер кодирует одним режимом `none` вендор-дефолт HIGH у dspro и LOW у grok; `glm-5` гасился нашим кодом молча; luna пинилась на `low` | уровень размышления объявляется ПОАРМНО и ЗНАЧЕНИЕМ (`rol.THINK_LEVEL`), печатается гейтом провода. Заведены армы `RKT` (grok на `high`), `RL` (luna), `RE` (gemini-flash-lite) — все с явным уровнем |
| **Б8** | `base_a0` читал `content` без проверки `finish`; селфтест был слеп по построению | гейт на СБОРКЕ панели (`emit_read` спрашивает `contour.a0_ok`), плюс громкое имя дефекта в `base_a0` |
| **§3 плана** | гейта «промт на провод» не существовало | `rol.py --wire <пара> [--arm=X]` печатает ПОЛНЫЙ текст инструкций, тело вызова и отношение объёмов по каждому арму |
**Урок, купленный внутри самой починки Б8 и записанный в код:** первая редакция гасила текст
в `base_a0`, как это делает `base_draft`. Проверка исполнением показала, что это ХУЖЕ болезни:
негодная единица выпала из `pool()`, а `chosen()` берёт N_UNITS от хеша — **на её место молча
встала другая, и «те же 16 глав» перестали быть теми же.** Гейт годности обязан стоять на сборке
панели, а не на источнике текста.
### 6.2 Починено в отчёте
Секция **Д30** (одиннадцать подпунктов) плюс баннеры `⛔ ЛОЖНО, СМ. ЭРРАТУ Д30` на девяти местах:
объём промта ×1.05/×1.08 · числа банка в Д23.0 · «обогащение вредит» в Д24.3 и Д26.2 ·
«совпадающих армов нет» в Д26 · вердикт по grok в Д28.2 · подпись «один прайс» в Д29.1 ·
главное число фазы · живой ложный вывод про парафраз в Д14.6. Та же ложная строка про банк
вычищена из шапки `rol.py`.
### 6.3 ⛔ ЧТО ОСТАЛОСЬ ПОСЛЕ ПОЧИНОК — по убыванию тяжести
1. **Клетки `dv-b-e2-*` (en) и `dv-c-j2-*` (ja) сделаны заражённым промтом.** Код починен, данные
нет. Несущий контраст Д23 `RN/ZP` сравнивал новый промт со СЛОМАННОЙ базой — базу надо
пере-купить, иначе вывод о промте-роли остаётся условным.
2. **`RKT` не куплен** — пока его нет, вердикт «промт не переносим на grok» читается как свойство
связки «grok + low», и вывод Д28.5 «дешёвого вендора не нашлось» под риском (~$0.250.30).
3. **Вердикт H-4 на английской и японской ногах НЕ УСТАНОВЛЕН** (армы `E6`/`J6` шли с нулём
размышления). На японской конфаундер направлен против напечатанного порядка.
4. **Чувствительность вердиктов Д4/Д1 к выбросу единицы `41599f30df` не замерена никем.**
5. **`promptdiff.py` и `canon.py` негодны, а на них висят живые строки реестра.** Гейты якорить на
полную пару строк; `canon.py` либо не писать классы, либо метить артефакт.
6. **Ценовая таблица Д29.1 не пере-считана** к одной шкале; переворот «критик→перепис против glm-5»
надо печатать полосой, а не числом.
7. Незакрытые клетки замера З-1…З-7 из §2.3 — по ним ничего не менялось.
### 6.4 Порядок дальше
Шаг 2 (фиксы отчётов) и шаг 3 (фиксы кода) ИСПОЛНЕНЫ в объёме блокеров. Следующее по плану —
шаг 4 (гейт провода) ИСПОЛНЕН, значит открыт **шаг 5: покупки**. Перед первой покупкой прогнать
`--wire` и прочесть вслух; санкции владельца и поднятого потолка ФД-N по-прежнему нет.