textmachine/docs/experiments/19-editor-contract-q4b.md

129 lines
11 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.

# 19. Контракт редактора: ДИФФ против FULL-REGEN (арм Q4b) + покрытие инъекции
**Полигон-сессия 0405.08.2026.** Расширение зоны по слову владельца 05.08: «довести до конца
найденный пиздец, доказать на конкретике, как пользоваться редакторами правильно».
Носитель — **строка 106 бэклога**: «Слой 3 НЕ достроен: контракт редактора = full-regen, а целевой —
узкие мандаты + ДИФФЫ». Арм **Q4b** пре-регистрирован в `15-segmentation-empirics.md:108` и
**не прогонялся НИ РАЗУ**. Зона: `eval/editor_contract/` + этот файл + пинг в PROGRESS «Полигон».
Потолок пробы **$0.40**. Не коммичу, кроме пре-рег-фриза.
## §0. Что уже установлено — и почему это не закрывает вопрос
Проба 18 (`18-editor-wire-probe.md`) на боевом проводе `deepseek-v4-pro`:
единый закон-блок исполняется 21/21 клеток; неверная строка банка принимается 6/6 и вытесняет
верную 5/6; редактор без блока ломает 512 из 20 канонических клеток черновика (два розыгрыша);
и он же вносит собственные дефекты (тихий обрыв при `finish=stop`, 五百年→«полувекового»).
**Чего проба 18 не могла сказать:** является ли это свойством МОДЕЛИ или свойством КОНТРАКТА
роли. Действующий контракт — full-regen с обязательной ДИСКУРС-ПЕРЕВЁРСТКОЙ и прямым мандатом
«варьируй лексику» (`editor.md`), то есть модель просят переписать текст целиком. Целевой контракт
(`09-target-architecture.md` §Слой 3, спека `research/19` §C1C2) — узкие правки диффом. Разницу
никто не мерил.
### §0.1 $0-находка ДО пробы: дыра пайплайновая, а не редакторская
Инъекция селективна и ограничена бюджетом 800 токенов (`pipeline-c1.yaml`), поэтому блок несёт
только сработавшее в чанке. Замер по уже оплаченному сырью пробы 18 (`editor_contract/offblock.py`;
знаменатель — 41 клетка: ПОДПИСАННЫЕ строки голда, встречающиеся в исходнике окна и отсутствующие
в блоке; 18 уникальных сущностей; `转`/`炼化` не скорятся — нет устойчивого стема):
| | канон подписанных ВНЕ блока |
|---|---|
| **черновик** (вход редактора) | **18/41 (44%)** |
| редактор full-regen БЕЗ блока (A0 · A5) | 16/41 · 17/41 |
| редактор full-regen + закон-блок (A1) | 24/41 |
**Разброс армов 16…24 лежит ВНУТРИ дисперсии одиночного розыгрыша, измеренной той же пробой
(7 клеток из 21) ⇒ утверждать «редактор ломает подписанные сущности вне блока» эти данные НЕ
позволяют.** Что они позволяют утверждать твёрдо: **канон по подписанным строкам вне
инъецированного подмножества = 44% уже в ЧЕРНОВИКЕ.** `花酒行者` («Монах Цветочного Вина») пришёл
неканоническим из транслятора — редактор его не ломал. Дыра общая для обеих ролей, потому что
инъекция селективна у обеих.
⇒ Осей две: **контракт правки** (эта проба) и **покрытие инъекции** (шире пробы; вход для владельца).
---
## §1. ПРЕ-РЕГИСТРАЦИЯ (записано ДО первого платного вызова)
Дата фиксации: 2026-08-05, до любых платных вызовов этой пробы.
### 1.1 Материал (переиспользован из пробы 18, $0)
Те же 6 окон `pick_windows()`; те же черновики арма B транслятора (`inj-w{k}-B.json`); те же 12
посаженных дефектов (`DEFECTS`, дословный список — §0.5 пробы 18). Прямая сравнимость с уже
оплаченными армами A1/A5 — по построению.
### 1.2 Армы (60 вызовов `deepseek-v4-pro`, провод = edit-стадия c1)
| Арм | Вызовов | Контракт | Блок | Черновик |
|---|---|---|---|---|
| **D1** | 18 (6×3) | ДИФФ | закон-блок §B | чистый |
| **D2** | 18 (6×3) | ДИФФ | нет | с посадками |
| **F1** | 12 (6×2) | full-regen | закон-блок §B | чистый |
| **F5** | 12 (6×2) | full-regen | нет | с посадками |
F1/F5 — ДОБОР реплик до N=3: у пробы 18 по одному розыгрышу (A1, A5), а её собственная находка —
одиночный розыгрыш нельзя цитировать как величину. Реплики различаются только недетерминизмом
провайдера (`temperature` в thinking-режиме DeepSeek игнорируется, quirks 00).
### 1.3 Дифф-контракт (спека `research/19` §C2, реализация `editor_contract/`)
Промпт `prompts/editor-diff.md`: мандаты верности/терминов/стиля из `editor.md` СОХРАНЕНЫ,
**переверстка ИСКЛЮЧЕНА** (по §C1/§C3 reflow — отдельный проход, арм Q4c), «пустой список правок —
полноценный ответ» (`NO_CHANGE`) — дисциплина do-nothing из §C3.
Формат — anchored search/replace, без номеров строк. Apply (`apply.py`, детерминированный,
самопроверен 9/9 юнит-кейсами до первого платного вызова): нормализация пробелов и классов
пунктуации («»""„ · —–- · … · '); якорь не найден → REJECT; **якорь неоднозначен (≥2 совпадений)
→ REJECT, а не тихое применение первого**; пересечение спанов → REJECT; малформед → операции нет.
Отброшенная операция оставляет черновик как есть — blast-radius одной правки, а не чанка.
### 1.4 Метрики (все детерминированные, $0; судейского рига НЕТ и он вне скоупа)
1. **Формат-комплаенс** = applied / ops_total по всем дифф-вызовам. Плюс доли reject по причинам и
доля `NO_CHANGE`/малформед.
2. **Канон В блоке** — 21 клетка, метод пробы 18 (с развязкой конфаунда 真元/元海).
3. **Канон ВНЕ блока** — 41 клетка, §0.1.
4. **Фикс-рейт посадок** — 12 дефектов, метод пробы 18 (regex + обязательный глаз).
5. **Атом-omission** ($0, детерминированно): по каждому предложению исходника — присутствие
многозначных ЧИСЕЛ и отрицательной полярности где угодно в выходе. Не длино-зависимо.
6. **Внесённые дефекты**: обвал непробельной длины >40% против черновика и числовой дрейф
(форма regression_guard); плюс глазная вычитка.
7. **Деньги и выходные токены** — COGS-ось (выход редактора ≈ 90% COGS, `research/15`).
### 1.5 Критерии (стоп-гейт Q4b дословно из `exp15:147`, пороги не мои)
> «Q4b: формат-комплаенс <90% ИЛИ fidelity-first trap хуже full-regen → диффы откладываются
> (закрыть D21.4/D21.10 явно); ≥90% и атом-omission=0 → дифф-редактор в прод-кандидаты.»
Операционализация, фиксируется здесь:
- **комплаенс** — п.1 ≥ 0.90;
- **fidelity-first trap** — п.4 (фикс-рейт посадок) дифф-арма НЕ ХУЖЕ full-regen-арма на тех же
посадках; знаменатель 12, оба арма усредняются по репликам;
- **атом-omission = 0** — п.5 на дифф-армах;
- канон (пп.23) и COGS (п.7) — **сопутствующие**, порогов не имеют, печатаются числом.
- Средние исходы на N=6×3 печатаются как «неопределённо», не абсорбируются.
### 1.6 Смета (напечатана ДО первого платного вызова)
`probe.py --plan`: 60 вызовов (36 дифф + 24 full-regen), вход ≈114 265 ток. → $0.0497.
Выход: ожидаемо 105 600 ток. → **ИТОГО $0.1416**; пессимистично 336 000 ток. → $0.3420;
абсолютный потолок (все 60 в cap 16000) $0.8849 — недостижим: перед КАЖДЫМ вызовом стоит
**проекционный гард** (не вызываем, если накопленное + худший исход вызова пробьёт $0.40),
плюс живой стоп $0.35.
### 1.7 Границы вывода, объявленные заранее
- Проза и переверстка НЕ сравниваются: дифф-арм по спеке их не делает. Вывод «дифф лучше/хуже»
относится к верности, терминам и деньгам, не к художественности.
- Судейского рига нет — никаких клеймов о качестве, которые требуют судьи.
- Одна книга, одна пара, 6 окон, единица ~500 ру-токенов выхода (боевой потолок 3200).
- Модель одна — `deepseek-v4-pro`. `research/19` предупреждает: слабые модели на edit-форматах
РАБОТАЮТ ХУЖЕ, чем отдавая текст целиком (aider: GPT-3.5 46% whole против 30% diff), и вся
эмпирика форматов правок снята на КОДЕ, на прозе не мерена. Отрицательный исход ожидаем и легитимен.
---
## §2. Результаты
*(заполняется после прогона)*