Compare commits

...

10 commits

Author SHA1 Message Date
Claude (backend session)
174192b1eb Fold exp14 batch-1 trap-judge corroboration: cross-family panel unanimously confirms the T1 comprehension catastrophe on all cheap arms and clears both frontier arms 2026-07-11 23:29:52 +03:00
Claude (backend session)
dc5cf3bb9d Land exp14 batch-1: empirics show claim-1 paragraphs is a cheap prompt/pipeline lever while claim-2 within-chunk comprehension is a frontier-model-capability floor 2026-07-11 22:50:09 +03:00
Claude (backend session)
353bb52676 Freeze exp14 pre-registration: quality-lever empirics on slicing×prompt 2×2 plus ablations, frontier capability-vs-activation, size curve, annotated trap set, pre-registered metrics/gates and per-key budget caps 2026-07-11 22:06:31 +03:00
Claude (backend session)
ee259bd4d0 Archive five spent session prompts, record confirmed key budgets, and keep partially-run POLYGON_PACKAGE4 active as pilot-track residual (D36.1) 2026-07-11 21:33:15 +03:00
Claude (backend session)
bf24d64e53 Ratify D36 accepting research/18 (Claude with fixes, ChatGPT clean) and issue polygon quality-empirics session prompt grafting both recommendation tables 2026-07-11 21:14:00 +03:00
Claude (backend session)
38736b27b5 Land research/18 both quality-lever reports with orchestrator review headers after verifying all cited sources exist and §A freeze reproduces 2026-07-11 21:14:00 +03:00
Claude (backend session)
2606714eb0 Update orchestrator handoff to role №4 post-D35 pivot: quality-first roadmap (research→polygon→backend), immediate tasks incl reviewing research/18, bump contract range to D35 2026-07-11 20:38:02 +03:00
Claude (backend session)
c14e11dd9d Ratify D35 pivot: close run-acceptance cycle (infra ok/readability not = not failure), verify diagnosis is genuine phase-2 underbuild not a bug, issue neutral anti-anchoring researcher prompt, land re-run acceptance report 2026-07-11 19:15:39 +03:00
Claude (backend session)
3c113d72ce Land seed v2 signoff transform script: reproducible provenance for owner-signed glossary v2 term statuses (D34.1) 2026-07-11 15:58:46 +03:00
Claude (backend session)
b49ce2b36a Ratify D34: seed v2 signed with owner term overrides recorded, mandate acceptance-config repoint before re-run to avoid stale-snapshot, fidelity re-gate by independent polygon judge 2026-07-11 15:58:29 +03:00
22 changed files with 2222 additions and 25 deletions

View file

@ -14,7 +14,7 @@ Go-бэкенд издательского художественного пер
## Источники истины (по убыванию) ## Источники истины (по убыванию)
1. **`docs/architecture/05-decisions-log.md` (D1D31)** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded). 1. **`docs/architecture/05-decisions-log.md` (D1D35)** — ратифицированный контракт; при конфликте с любым другим доком побеждает он; сверху файла — карта актуальности (что чем superseded).
2. `docs/architecture/07-strategic-review.md` — стратегический аудит 09.07 (вердикт, риски, курс-коррекции). 2. `docs/architecture/07-strategic-review.md` — стратегический аудит 09.07 (вердикт, риски, курс-коррекции).
3. `docs/experiments/00-provider-quirks.md` — wire-квирки провайдеров (читать ПЕРЕД правкой адаптеров/вызовами провайдеров). 3. `docs/experiments/00-provider-quirks.md` — wire-квирки провайдеров (читать ПЕРЕД правкой адаптеров/вызовами провайдеров).
4. `docs/architecture/01-decisions.md` (Р1Р10), `02-mvp-plan.md` (фазы v3), `04-unhappy-paths.md`, `06-memory-risk-registry.md`. 4. `docs/architecture/01-decisions.md` (Р1Р10), `02-mvp-plan.md` (фазы v3), `04-unhappy-paths.md`, `06-memory-risk-registry.md`.
@ -37,6 +37,6 @@ Go-бэкенд издательского художественного пер
2. `docs/architecture/05-decisions-log.md` целиком (контракт). 2. `docs/architecture/05-decisions-log.md` целиком (контракт).
3. По роли: Бэкенд — `backend/README.md` + `03-implementation-notes.md`; Полигон — `eval/README.md` + `experiments/00` + `09-pilot-protocol.md`; всем — `07-strategic-review.md` §69 (вердикт/риски/курс). 3. По роли: Бэкенд — `backend/README.md` + `03-implementation-notes.md`; Полигон — `eval/README.md` + `experiments/00` + `09-pilot-protocol.md`; всем — `07-strategic-review.md` §69 (вердикт/риски/курс).
## Текущее состояние (2026-07-12, пост-ревизия D31) ## Текущее состояние (2026-07-12, пост-пивот D35)
Фаза 0 ✅; **Ф1-машинерия ✅** (пакеты №15, D20D28; golden-гард = инвариант №8); **приёмка этап A ✅ (D24), этап B заморожен (D26)**. **Качество-первым:** exp12-диагностика принята (D30) — «нечитаемо» = пассивный МОНО-редактор + кривой сид + построчная вёрстка от промптов + нет санитайзера; дефекты смысла — в черновике. **Ратифицировано D30: редактор БИЛИНГВ (флип D1, supersede D17), reflow-вёрстка, output-санитайзер, глоссарий v2 (спорные термины — под подпись владельца), exp13 бейк-офф переводчиков.** **Очередь: бэкенд-пакет D15.2 (`BACKEND_D152_SESSION_PROMPT.md`) ∥ полигон exp13 (`POLYGON_EXP13_SESSION_PROMPT.md`) → единый resnapshot → пере-прогон 25 глав кандидатом (re-gate верности обязателен) → чтение владельца → этап B.** Трек: дешёвые модели сейчас, фронтир потом (конфиг-первая архитектура — D30.7). Ключ xAI: единый, с data-sharing, off перед продом (D27). Решающая точка — пилот Ф2.5 (блокеры: билингв-якорь/аннотаторы ≥3 — D25.9-Q1, корпус, проба судьи-дублёра — D22.6). Книга на стенде `/home/ubuntu/books/gu-zhenren/` (GB18030; текст и ВСЕ производные ВНЕ git). Ключи: DEEPSEEK, ZAI, KIMI, OPENAI, GEMINI, XAI, MISTRAL. Стенд: WSL2, GTX 1070 8GB (прокси-грабли: localhost из-под прокси даёт 403 — no-proxy транспорт для local). Фаза 0 ✅; **Ф1-инфра ✅** (D20D28; golden = инвариант №8); приёмка этап A ✅ (D24). **Путь D26→D35 «качество-первым»:** флип D1 моно→БИЛИНГВ (D30, supersede D17), reflow + output-санитайзер (D30/D33), сид v2 подписан владельцем (D34), переводчик flash сохранён (exp13/D32 — pro отклонён). **Пере-прогон 25 глав связкой ВЫПОЛНЕН; вердикт владельца: «лучше (из-за сида), но крайне слабо художественно» (2 претензии: абзацы/конвенции + понимание связей).** **ПИВОТ D35:** цикл приёмочных прогонов ЗАКРЫТ (инфра ✅ / читаемость ❌ = блок на непостроенной Ф2 — НЕ провал; диагноз «Ф2-недострой + near-term промпт/нарезка-рычаги, не баг» верифицирован). Планка впредь = 2 претензии (ИНТЕРИМ пре-скрин, не пилот). **Очередь «мерить→строить»: ресёрч рычагов качества (`RESEARCHER_QUALITY_SESSION_PROMPT.md` — ГОТОВ; ждёт ревью+лендинга оркестратором: `research/18-quality-levers.md` Claude + `18-quality-levers-chatgpt.md` ChatGPT — UNCOMMITTED) → полигон-эмпирика (нарезка×промпт + диагностик-фронтир-арм + fidelity re-gate) → бэкенд под доказанный ROI.** Стратегический вопрос эмпирики: потолок в дешёвых МОДЕЛЯХ или в нашей НАРЕЗКЕ/ПРОМПТЕ. Трек: дешёвые модели сейчас, фронтир потом (D30.7). Ключ xAI: единый, data-sharing, off перед продом (D27). Решающая точка — пилот Ф2.5 (блокеры: билингв-якорь/аннотаторы ≥3 — D25.9-Q1, корпус, судья-дублёр — D22.6). Книга на стенде `/home/ubuntu/books/gu-zhenren/` (GB18030; текст и ВСЕ производные ВНЕ git). Ключи: DEEPSEEK, ZAI, KIMI, OPENAI, GEMINI, XAI, MISTRAL. Стенд: WSL2, GTX 1070 8GB (localhost из-под прокси = 403 — no-proxy транспорт для local).

View file

@ -1,4 +1,4 @@
# Промт: сессия-ОРКЕСТРАТОР TextMachine (передача роли №3, 2026-07-12, пост-D31) # Промт: сессия-ОРКЕСТРАТОР TextMachine (передача роли №4, 2026-07-12, пост-D35 — пивот «качество-первым»)
--- ---
@ -8,7 +8,7 @@
**Зона записи:** `docs/` + корневые онбординг-доки. Чужие зоны — читать и ревьюить; коммитишь их работу ты после приёмки (сессии не коммитят). **Функции:** (1) внешнее ревью каждого пакета ДО коммита; (2) ратификация решений D-блоками; (3) хендофф-промты; (4) синхронизация доков; (5) ответы владельцу с честной калибровкой. **Зона записи:** `docs/` + корневые онбординг-доки. Чужие зоны — читать и ревьюить; коммитишь их работу ты после приёмки (сессии не коммитят). **Функции:** (1) внешнее ревью каждого пакета ДО коммита; (2) ратификация решений D-блоками; (3) хендофф-промты; (4) синхронизация доков; (5) ответы владельцу с честной калибровкой.
**Твоя миссия — качество-первым (D26/D30).** Машинерия Ф1 построена и приёмка этапа A пройдена, но первое чтение владельцем 25 глав дало «нечитаемо». Диагноз поставлен (exp12/D30): пассивный моно-редактор + кривой сид + построчная вёрстка от промптов + отсутствие санитайзера; дефекты смысла — в черновике. Твоя работа — довести дорожку D30.9 до читаемых 25 глав, затем этап B, затем пилот Ф2.5; переваривать входящую эмпирику, ратифицировать корректировки, выдавать задания. **Твоя миссия — качество-первым (D26→D35).** Ф1-инфра доказана и приёмочный цикл прогонов ЗАКРЫТ (D35: инфра ✅ / читаемость ❌ = не провал). Связка (билингв-редактор D30.1 + reflow + санитайзер + сид v2) построена и пере-прогнана; вердикт владельца — **«лучше (из-за сида), но крайне слабо художественно»** (2 претензии: абзацы/конвенции + понимание связей). Диагноз верифицирован исполнением: **НЕ баг — недострой машинерии качества Ф2 + невыжатые near-term рычаги (промпт/нарезка/глоссарий)**. Твоя работа — вести очередь **«мерить→строить»** (ресёрч рычагов → полигон-эмпирика → бэкенд только под доказанный ROI), НЕ строить Ф2 вслепую. Стратегический вопрос, который решает эмпирика: **потолок в дешёвых МОДЕЛЯХ или в нашей НАРЕЗКЕ/ПРОМПТЕ** — до ответа не объявлять дешёвый трек мёртвым и не коммититься в полный Ф2. Планка приёмки впредь = 2 претензии владельца (ИНТЕРИМ пре-скрин, НЕ вердикт пилота Ф2.5).
## Столпы проекта (не демонтировать без владельца) ## Столпы проекта (не демонтировать без владельца)
@ -16,27 +16,36 @@
2. **Детерминированный банк памяти — главная ставка.** НЕ вектора/НЕ RAG: Aho-Corasick матч → disposition → спойлер-окна → селективная инъекция → детерминированный post-check (D24.4-union; D28.1: precision/recall-трейдофф, hard-gate требует пере-замера; D24.2: alias-слепое пятно ≈99.5%). Уникальность сужена D21.7 (формула целиком, скрининг ≠ FTO). 2. **Детерминированный банк памяти — главная ставка.** НЕ вектора/НЕ RAG: Aho-Corasick матч → disposition → спойлер-окна → селективная инъекция → детерминированный post-check (D24.4-union; D28.1: precision/recall-трейдофф, hard-gate требует пере-замера; D24.2: alias-слепое пятно ≈99.5%). Уникальность сужена D21.7 (формула целиком, скрининг ≠ FTO).
3. **Конфигурируемое ядро C0C3 одного раннера; всё спорное решает человеческий пилот Ф2.5** (BWS, ≥3 аннотаторов; правила панели D13 + D25.3 prefix-анализ). exp12 — пре-скрин (N=1), не подмена пилота; арм D13.1 (моно vs билингв) — теперь подтверждающий (D30.1). 3. **Конфигурируемое ядро C0C3 одного раннера; всё спорное решает человеческий пилот Ф2.5** (BWS, ≥3 аннотаторов; правила панели D13 + D25.3 prefix-анализ). exp12 — пре-скрин (N=1), не подмена пилота; арм D13.1 (моно vs билингв) — теперь подтверждающий (D30.1).
4. **Деньги/durability первый класс:** reserve→call→settle+checkpoint одной транзакцией; `committed==SUM(checkpoints)` переживает kill -9 (доказано приёмкой D24); snapshot-дисциплина: правка wire/вердиктов = `--resnapshot` = переоплата — лечится реализацией D15.2 (идёт, пакет D30.9); **golden-гард = инвариант №8** (D23): обновление capture.golden — только при ратифицированной ТОБОЙ смене поведения. 4. **Деньги/durability первый класс:** reserve→call→settle+checkpoint одной транзакцией; `committed==SUM(checkpoints)` переживает kill -9 (доказано приёмкой D24); snapshot-дисциплина: правка wire/вердиктов = `--resnapshot` = переоплата — лечится реализацией D15.2 (идёт, пакет D30.9); **golden-гард = инвариант №8** (D23): обновление capture.golden — только при ратифицированной ТОБОЙ смене поведения.
5. **Детерминированные гейты вместо доверия модели:** echo-гейт (НАВСЕГДА, вкл. reasoning-ON — D19.2/D22.5), excision/coverage, refusal-blacklist, стиль-флаггеры, floor `min_max_tokens` (D24.3), **output-санитайзер (D30.3 — строится)**. Философия отказов D2/D12: flagged≠failed, всегда reason, skip+flag+continue, три класса отказов. 5. **Детерминированные гейты вместо доверия модели:** echo-гейт (НАВСЕГДА, вкл. reasoning-ON — D19.2/D22.5), excision/coverage, refusal-blacklist, стиль-флаггеры, floor `min_max_tokens` (D24.3 — валидирован в проде D35.1), **output-санитайзер (D30.3/D33.1 — залендён; ⚠ экспорт-баг D35.4a: флагнутый чанк экспортится ПУСТЫМ)**. Философия отказов D2/D12: flagged≠failed, всегда reason, skip+flag+continue, три класса отказов.
6. **Стек (пост-D30):** черновик — интерим deepseek-v4-flash (thinking ВСЕГДА ON — эхо-мина), **переводчика выбирает exp13** (deepseek качеством не мерен — D30.6) → **редактор БИЛИНГВАЛЬНЫЙ (D30.1, supersede D17), кандидат glm-5-билингв** (gemini — премиум-эскалация только за санитайзером: течёт преамбулой 6/6; grok reasoning-off из редакторов СНЯТ — no-op) → судья/апекс gemini-3.1-pro-preview (слаг ТОЛЬКО с `-preview`; mandatory thinking; биллинг `additive_total` — D22.3). **Канал B (18+):** Mistral-переводчик + grok-ON эскалация (⚠ НЕ на архаичном Хане — D22.5) + судьи: эротика — только Grok (Gemini fail-closed — D22.6, дублёр гейтится пробой). 7 ключей; **ключ xAI един, С data-sharing, off перед продом (D27)**. 6. **Стек (пост-D35):** черновик — **deepseek-v4-flash СОХРАНЁН** (exp13/D32 — pro отклонён по данным: сфабрикованная сходимость + катастрофа 蛊→«гусеницы» + верность у flash не хуже; переводчик — припаркованный рычаг D32.4, если виновата верность черновика); thinking ВСЕГДА ON (эхо-мина); escalate_to=deepseek-v4-pro → **редактор БИЛИНГВ glm-5 (D30.1/D33, залендён)** (gemini — премиум-эскалация только за санитайзером: течёт преамбулой 6/6; grok reasoning-off из редакторов СНЯТ — no-op) → судья/апекс gemini-3.1-pro-preview (слаг ТОЛЬКО `-preview`; mandatory thinking; `additive_total` — D22.3). **Канал B (18+):** Mistral + grok-ON эскалация (⚠ НЕ на архаичном Хане — D22.5) + судьи: эротика — только Grok (Gemini fail-closed — D22.6). 7 ключей; **ключ xAI един, С data-sharing, off перед продом (D27)**.
7. **Эхо — центральный технический враг:** механистический аттрактор; стохастично per-fragment; на этапе A: 3.5% (концентрация в архаичном зачине гл.1), прайор книги ~25% — этап B обязан пере-мерить; флор D24.3 починил эскалационные хопы; промпт-митигации гейтятся fidelity-хвостом P4 (висит); ⚠ языковой констрейнт в system может ИНВЕРТИРОВАТЬ эхо (D21.6). Калибровка echo-гейта — задача полигона (D25.7). 7. **Эхо — центральный технический враг:** механистический аттрактор; стохастично per-fragment; на этапе A: 3.5% (концентрация в архаичном зачине гл.1), прайор книги ~25% — этап B обязан пере-мерить; флор D24.3 починил эскалационные хопы; промпт-митигации гейтятся fidelity-хвостом P4 (висит); ⚠ языковой констрейнт в system может ИНВЕРТИРОВАТЬ эхо (D21.6). Калибровка echo-гейта — задача полигона (D25.7).
8. **18+:** уровень 3 — жёсткая линия без исключений; в ревью explicit читаешь только метаданные/счётчики; `eval/data/*corpus*` и `/home/ubuntu/books/` не открывать без прямой задачи. **L3-скрин** (D22.7 + расширения D25.4) обязателен до первой erotica-книги в проде; методика валидации без нарушения гардрейла — вопрос владельцу. 8. **18+:** уровень 3 — жёсткая линия без исключений; в ревью explicit читаешь только метаданные/счётчики; `eval/data/*corpus*` и `/home/ubuntu/books/` не открывать без прямой задачи. **L3-скрин** (D22.7 + расширения D25.4) обязателен до первой erotica-книги в проде; методика валидации без нарушения гардрейла — вопрос владельцу.
9. **Методология:** D-лог (D1D31, с картой актуальности сверху) = контракт; PROGRESS = журнал (закрытая хроника 0410.07 — в `archive/PROGRESS-2026-07-04-10.md`, при онбординге НЕ читать); зоны записи жёсткие; правило двух направлений (клейм → живая проба; аномалия провайдера → вендор-дока); git-дисциплина мультисессий (стейджинг ТОЛЬКО пофайловый — `add -A` уже один раз подметал чужой WIP); коммиты en, ≤30 слов, без Co-Authored-By; эмпирика на претрейн-текстах предварительна (蛊真人 тоже в претрейне — гейт «современный вебновелл-срез ВНЕ претрейна»). 9. **Методология:** D-лог (D1D35, с картой актуальности сверху) = контракт; PROGRESS = журнал (закрытая хроника 0410.07 — в `archive/PROGRESS-2026-07-04-10.md`, при онбординге НЕ читать); зоны записи жёсткие; правило двух направлений (клейм → живая проба; аномалия провайдера → вендор-дока); git-дисциплина мультисессий (стейджинг ТОЛЬКО пофайловый — `add -A` уже подметал чужой WIP; в дереве часто 2 живые сессии); коммиты en, ≤30 слов, без Co-Authored-By; эмпирика на претрейн-текстах предварительна (蛊真人 тоже в претрейне — гейт «современный вебновелл-срез ВНЕ претрейна»).
## Онбординг (порядок чтения, ~40 мин) ## Онбординг (порядок чтения, ~40 мин)
1. `CLAUDE.md``docs/README.md` → CURRENT-STATE в `docs/PROGRESS.md` (теперь короткий — читай целиком). 1. `CLAUDE.md``docs/README.md` → CURRENT-STATE в `docs/PROGRESS.md` (теперь короткий — читай целиком).
2. **`docs/architecture/05-decisions-log.md`**: сначала карту актуальности в шапке, затем D24D31 подробно, D1D23 — по карте. 2. **`docs/architecture/05-decisions-log.md`**: сначала карту актуальности в шапке, затем D24D35 подробно, D1D23 — по карте. Ключевые головы: D30 (флип D1+reflow+санитайзер+exp13), D32 (переводчик flash, pro отклонён), D33 (стейдж-А+санитайзер-фикс), D34 (сид подписан+repoint-гейт), **D35 (пивот — цикл закрыт, планка=2 претензии, мерить→строить)**.
3. `docs/architecture/07-strategic-review.md` §69 с баннером (часть вердиктов развязана — баннер говорит какие). 3. `docs/architecture/07-strategic-review.md` §69 с баннером (часть вердиктов развязана — баннер говорит какие).
4. По надобности: `backend/README.md`, `eval/README.md`, `docs/archive/prompts/` (образцы жанра). 4. По надобности: `backend/README.md`, `eval/README.md`, `docs/archive/prompts/` (образцы жанра).
5. Авто-память проекта — point-in-time: сверяй с доками прежде чем утверждать. 5. Авто-память проекта — point-in-time: сверяй с доками прежде чем утверждать.
## Состояние на передачу (12.07, всё закоммичено) ## Состояние на передачу (12.07 вечер, пост-D35; всё закоммичено ДО research/18)
**Дорожка D30.9 (текущая):** бэкенд-пакет D15.2 (`BACKEND_D152_SESSION_PROMPT.md`; этап А = билингв-промпт + reflow + санитайзер — гейтит пере-прогон, лендится отдельно и раньше; Б = v3.1 + реализация content-addressed resume; В = `tmctl export`/annotations/override — D29.1) ∥ полигон exp13 (`POLYGON_EXP13_SESSION_PROMPT.md`; бейк-офф переводчиков + финализация сида v2) → **единый resnapshot****пере-прогон 25 глав кандидат-конфигом** (обязателен re-gate верности: span-цитирующий судья reasoning-ON + охота на инверсии правки — D30.1) → чтение владельца → этап B (заморожен D26) → пилот Ф2.5. **Что уже сделано (D30→D35, залендено):** флип D1→билингв-редактор, reflow, output-санитайзер (+фикс D33.1), сид v2 подписан владельцем (D34.1); пере-прогон 25 глав связкой выполнен (инфра держится, флор D24.3 валидирован в проде); **пивот D35 ратифицирован** (цикл прогонов закрыт, планка=2 претензии, мерить→строить). exp13 закрыт (переводчик=flash, pro отклонён — D32). Этап B отменён как инструмент качества (инфра-масштаб); итерация качества — на ≤10 главах.
**Очередь ревью на тебе:** пакеты D15.2 (по этапам!) и exp13 — мультиагентный адверсариальный воркфлоу, всё исполнением, в scratchpad-копиях (в дереве живут чужие незакоммиченные правки). Полигон №4 (D22.8-остаток) — второй приоритет. Fix-листы бэкенду влиты в D15.2-промт; полигону — в exp13-промт + read-me правки их зон (backend/README «D1D23»→D1D31 и «D15.2 после правок»; eval/README exp04/exp08 каветки) — передай в их следующие пакеты. > **СТАТУС D36 (оркестратор №4, 12.07):** задачи **12 ВЫПОЛНЕНЫ** — research/18 отревьюирован и залендён (D36; оба отчёта: Claude ACCEPT_WITH_FIXES / ChatGPT ACCEPT; независимо: 57/57 источников реальны, Ван Цуй подтверждён по телу статьи, §A-хеш сверен побайтно MATCH) + промт полигон-эмпирики выдан (`POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`, D36). Бюджеты ключей подтверждены владельцем (OpenAI ~$9, Gemini ~€2.6, DeepSeek/ZAI/Kimi/xAI/Mistral ~$9; других нет — D36.1). Спент-промты заархивированы (D36.1). **Остаётся:** 3 (fidelity re-gate — полигон параллельно), 4 (бэкенд-фикс-лист D35.4 — в следующий бэкенд-пакет), 5 (readme чужих зон). Контракт D24→**D36**. Ниже — исходный список задач хендоффа (12 закрыты).
**Ждём от владельца:** подпись спорных терминов сида v2 (таблицу даст exp13) · флагман-сверка exp13 · DashScope-ключ (опц.) · **планка запуска** (лучше-фана/гибрид/издательский + COGS опции Б — интерим: «лучше фана» на дешёвом миксе) · билингв-якорь пилота (D25.9-Q1) · «да/нет» митигации контаминации пилотного корпуса (D27.4) · publishable/waiver при экспорте (D25.1) · FN-bound L3 при спеке (D25.4) · провенанс 12-*-доков · юр-пакет (+rights manifest). **⚠ ТВОИ НЕПОСРЕДСТВЕННЫЕ ЗАДАЧИ (по приоритету):**
1. **Отревьюить + залендить research/18 — ДВА независимых отчёта, оба UNCOMMITTED, ждут тебя:** `docs/research/18-quality-levers.md` (ресёрчер Claude, анти-анкоринг протокол, §A заморожена sha256) + `docs/research/18-quality-levers-chatgpt.md` (параллельный ChatGPT, запущен владельцем). Дисциплина research/15/16/17: адверсариальная верификация несущих клеймов по ПЕРВОИСТОЧНИКАМ своим воркфлоу (его CONFIRMED ≠ твой), ревью-шапка, лендинг. ⚠ Ресёрчер заявляет «тройную сходимость» (§A ⟂ ChatGPT-§A ⟂ эмпирика команды) — **проверь оговорку D25.10: общая внешне-литературная нога у Claude и ChatGPT ≠ 3 независимых голоса** (оба тянут из той же литературы). Ключевой содержательный вклад для верификации: reflow zh→ru как ОБЯЗАТЕЛЬНАЯ дискурсная переводческая норма (Розенталь/Ван Цуй) — апгрейд research/16 «слияние дискреционно».
2. **Написать промт полигон-эмпирики (D35.6) из §C research/18:** оси — **нарезка×промпт** (глава|чанк × сильный-дискурс|текущий — на ≤5 главах прямыми вызовами, чанк-арм воспроизводит прод-инъекцию как якорь; это ось, которую exp04/12/13 НЕ крутили) + **диагностик-фронтир-арм** (владелец согласовал: Gemini/GPT переводчик+редактор+мета-ревьюер → потолок в моделях vs в машинерии; гарды: эхо-скрин/исключить grok на архаичной ch1 — D22.5, self-family exclusion мета-ревьюера, per-call кап + пре-регистрация) + кривая размер-чанка↔качество↔биллинг↔ретраи. Методика-guard D32.4 (fidelity-first агрегация, leave-one-out, катастроф-скрин — полигон дважды собирал ложную «сходимость», лови третий раз).
3. **Fidelity re-gate (D34.3, `rerun/FIDELITY_REGATE_HANDOFF.md`) — полигон может гнать ПАРАЛЛЕЛЬНО** (независим от ресёрча): квантифицирует претензию 2 + ловит инверсии активного редактора (ch11/0-класс). Пере-прогон без него формально не засчитан.
4. **Бэкенд-фикс-лист (D35.4, в следующий бэкенд-пакет):** экспорт-баг (флагнутый чанк экспортится ПУСТЫМ — ch5/ch20 зачины выпали; фикс: стрип ведущего `###` ИЛИ фолбэк на draft, не дроп); ведущий `###` рождается в ЧЕРНОВИКЕ deepseek (фикс в translator.md/экспорт, не editor); засидить разряды 甲乙丙丁/资质 (raw-китайский в выходе). **Бэкенд-стейдж Б/В D15.2** (`BACKEND_D152_SESSION_PROMPT.md`: content-addressed resume + `tmctl export`/annotations/override) — промт после того, как качественная развязка (research→полигон) уточнит требования к экспорту.
5. Read-me чужих зон устарели (backend/README «D1D23»; eval/README exp04/exp08-каветки) — в fix-листы их сессий, сам не правь.
**Порядок:** research/18 (ты ревьюишь) → полигон-эмпирика (нарезка×промпт + фронтир + re-gate) → **владелец читает результат** → решение «дешёвый трек дотягивает / нужен фронтир / нужен Ф2» → бэкенд под доказанный ROI. Не перепрыгивай в бэкенд-стройку до полигон-доказательства.
**Ждём от владельца:** запуск полигон-эмпирики (после твоего промта) · **стратегическая планка запуска** (лучше-фана/гибрид/издательский — всё ещё открыта; влияет на «дешёвый vs фронтир vs Ф2») · билингв-якорь пилота Ф2.5 (D25.9-Q1) · publishable/waiver при экспорте (D25.1) · FN-bound L3 при спеке (D25.4) · юр-пакет (+rights manifest) · провенанс 12-*-доков. *(Закрыто владельцем: сид v2 подписан, фронтир-арм согласован, этап B отменён.)*
## Методология (продолжай как предшественники) ## Методология (продолжай как предшественники)

View file

@ -1,5 +1,13 @@
# Промт: полигон-сессия, пакет №4 — сид этапа B + fix-лист D22.8 + задачи D25 (2026-07-11) # Промт: полигон-сессия, пакет №4 — сид этапа B + fix-лист D22.8 + задачи D25 (2026-07-11)
> **СТАТУС (оркестратор №4, D36.1, 12.07) — НЕ архивирован, ЧАСТИЧНО отработан, residual ЖИВ.**
> Как отдельная сессия пакет №4 **НЕ запускался**. Отработана только **Задача 1 (сид-мн.ч.)** — влита в сид v2 внутри exp13 (D32, `guzhenren-seed-v2.yaml`). **Открыто (пилот/18+/echo-трек — ОРТОГОНАЛЬНО текущему exp14, НЕ вносить в него):**
> - **Задача 2 (fix-лист D22.8):** (а) content-filter матчер подстрокой + самотест; (б) параметризация языка/жанра `explicit_judges.py`; (в) **миграция судьи `memory_eval.py` с gemini-2.5-flash** (EOL 16.10.2026 — `00-provider-quirks.md:72`); **(ж) проба судьи-дублёра 18+ (D22.6) — НАЗВАННЫЙ БЛОКЕР ПИЛОТА** (`09-pilot-protocol.md`, CURRENT-STATE).
> - **Задача 3 (D25):** echo-калибровка (D25.7); дополнения пре-регистрации пилота (D25.2/25.6/25.8 → `09-pilot-protocol.md`); minimal-pairs shadow fidelity (совместить с корпусом пилота).
> - **Задача 4 (D21.9):** P4 fidelity-хвост (35 пар); wire-аудит темп-свипа; D22.8-минорки (U+FF70 kana, append-only провенанс, judge-raw).
>
> **Порядок:** это ПИЛОТ-трек, downstream от текущей качественной развязки (exp14). При активации пилота — переупакую residual в свежий пилот-преп-промт (или гони отсюда, слаги судей — live-фактчеком `/models`). **exp14 (`POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`) — приоритетнее.** 18+: только существующие артефакты `eval/data`, счётчики/метаданные в отчёт.
--- ---
## Кто ты и что делаешь ## Кто ты и что делаешь

View file

@ -0,0 +1,98 @@
# Промт: полигон-сессия exp14 — эмпирика рычагов качества (нарезка×промпт + фронтир-диагностика + кривая нарезки) (2026-07-12, D36, приоритет №1)
---
## Кто ты и зачем
Ты — **полигон-сессия** TextMachine, exp14. Пере-прогон 25 глав дал вердикт владельца **«лучше, но крайне слабо художественно»** — 2 претензии: (1) нет логической редактуры абзацев / конвенций русского; (2) места, где модель не понимает связей/смысла. Диагноз (D35) верифицирован исполнением: **не баг — недострой Ф2 + невыжатые near-term рычаги (промпт/нарезка/глоссарий)**. Ресёрч research/18 (ДВА отчёта, D36, оба залендены оркестратором после верификации первоисточников — Claude ACCEPT_WITH_FIXES / ChatGPT ACCEPT) дал карту рычагов и §C-таблицы. **Твоя задача — ЭМПИРИЧЕСКИ измерить, а не утверждать:** снимает ли near-term (нарезка×промпт) бо́льшую часть претензий на дешёвом миксе, и где потолок — в дешёвых МОДЕЛЯХ или в нашей НАРЕЗКЕ/ПРОМПТЕ (фронтир-арм = диагностика этого).
**Ключевая ось, которую exp04/12/13 НЕ крутили:** они варьировали только МОДЕЛЬ в фикс-нарезке с уже-вшитым reflow-промптом. Ты крутишь **нарезку × ПРОМПТ**.
Зона: `eval/` + `docs/experiments/14-quality-empirics.md` + секция «Полигон» в `PROGRESS.md` + курация глоссария (вне git). **Бэкенд не трогать** (там могут быть живые правки; `git status` перед любым касанием дерева — часто 2 живые сессии; стейджинг тебе НЕ нужен, ты не коммитишь). Прямые API-вызовы из `eval/`-харнеса (НЕ через прод-пайплайн бэкенда — прод трогаем только чтобы воспроизвести инъекцию глоссария как якорь).
## Онбординг (порядок)
1. `CLAUDE.md` → CURRENT-STATE в `PROGRESS.md`**D35 и D36 целиком** (мандат; D36 = приёмка research/18 + этот промт).
2. **`docs/research/18-quality-levers.md` (ревью-шапка оркестратора СНАЧАЛА — там поправки к цитатам/рамке) + `docs/research/18-quality-levers-chatgpt.md` (ревью-шапка).** Твой рабочий вход — §C обоих. Скелет протокола бери из ChatGPT-§C (P0-baseline → армы с фаза-тегами → пре-рег гейты C4 → дерево решений C5 → ядро reflow-промпта C3); СОДЕРЖАНИЕ дискурс-reflow-промпта (5 техник Ван Цуй) и COGS-модель — из Claude-§C.
3. `docs/experiments/00-provider-quirks.md`: deepseek thinking ON всегда (эхо-мина); gemini слаг ТОЛЬКО `-preview`, `additive_total`, mandatory thinking, `PROHIBITED_CONTENT` неконфигурируем; grok reasoning-ON = аддитивный биллинг; **grok на архаичном хане ch1 — эхо-риск D22.5** (исключить grok из ch1-армов).
4. `rerun/FIDELITY_REGATE_HANDOFF.md` — пакет re-gate верности (гонишь ПАРАЛЛЕЛЬНО, независимо от этого эксперимента).
5. Уроки судейского слоя: шапки `docs/experiments/12-quality-diagnosis.md` + `13-translator-bakeoff.md` (ложная «сходимость» ловилась дважды — мемо `eval-aggregation-no-manufactured-convergence`).
## Пре-регистрация (закоммить §1 exp14-дока ДО первого платного вызова — D30.10; path-scoped только exp14-док)
### 0. Материал (исключить сломанное)
- Срез: те же 25 глав пере-прогона (`rerun/records.json` несёт source/draft/final по 57 чанкам). **ИСКЛЮЧИТЬ ch5.0 и ch20.0** (экспорт-баг D35.4a — финалы пусты; спутают оценку) до бэкенд-фикса; если нужен их текст — бери edit-выход из checkpoints (тело цело, дефект = ведущий `###`).
- **Trap-набор (Ступень I — ЛОВУШКИ, не «средние главы»):** разметь 68 мест ДО генерации, поле `supporting_span` + опустимый_смысл`. Типы (ChatGPT §C1): (a) нарратив-строки, которые ДОЛЖНЫ стать одним русским абзацем; (b) диалог 1:N; (c) связь, разрешимая ВНУТРИ текущего чанка; (d) связь, опора которой — ЗА границей чанка. **Обязательно включить места владельца, воспроизведённые оркестратором фактически:** gl.7 `古月族人没有一个不知道的` (двойное отрицание = «все знали» → финал инвертировал в «никто не знал»); gl.8 `物是人非` (заглавие-ключ → сплющено в «всё изменилось»). Эти два — тип (c)/verность, вход и в fidelity re-gate.
- Главы для Ступени II — 3 чистые главы разной диалого-плотности формулой (как exp12 high/mid/low), **исключая ch1 (архаика), ch5, ch20.**
### 1. Армы — ось НАРЕЗКА × ПРОМПТ (полный 2×2 — мандат D36) + аблации
Прямые вызовы, ручная упаковка; дешёвый прод-микс (draft `deepseek-v4-flash` thinking-ON → editor `glm-5` билингв) как якорь; глоссарий-инъекцию воспроизвести из `retrieval_state.injected_ids` (боевой блок, rig-фиделити как exp12 A1).
| Арм | Нарезка | Промпт | Смысл |
|---|---|---|---|
| **P0 baseline** | чанк 1.5k | ТЕКУЩИЙ прод (`v1-reflow`/`v2-bilingual-reflow`) | Нулевая точка обеих претензий (= пере-прогон, но на trap-наборе) |
| **P1a** | чанк 1.5k | **сильный дискурс-reflow** | Промпт-рычаг при фикс-нарезке |
| **P1b** | **глава целиком** | ТЕКУЩИЙ прод | ⚠ **ячейка, которую НИ ОДИН отчёт не крутил** — изолирует «бо́льшая единица САМА помогает без нового промпта?» |
| **P1c** | глава целиком | сильный дискурс-reflow | Верхняя near-term точка нарезка+промпт |
Плюс аблации (ChatGPT §C2, на базе P1a):
- **Draft-layout ablation:** перед editor заменить пустые строки/построчную разбивку draft на нейтральные сепараторы ИЛИ пронумерованные смысловые атомы (финал удаляет ID) → изолирует ЯКОРЕНИЕ редактора на форме черновика (если резко улучшает абзацы при той же модели/промпте — менять нарезку преждевременно; **это дешёвый ПРОД-МИНОР при победе**).
- **Semantic-first vs combined:** один combined-editor против двух узких пассов (билингв семантика-репэйр → target-only литературный reflow) под ОДНИМ coverage-гейтом → снимает конкуренцию мандатов у слабой модели; замерить реальный output-множитель (≤~2× editor-output).
- **±1 reference-контекст:** дать пред-source+пред-target хвост и след-source-абзац до границы сцены, явно `REFERENCE — НЕ ПЕРЕВОДИТЬ`; **три РАЗДЕЛЬНЫЕ абляции prev / next / both** (не сливать в один «context arm»). Цель — кросс-граница (тип d), нулевые подлежащие, катафора.
### 2. Фронтир-арм — ДИАГНОСТИКА потолка (бюджеты владельцем ПОДТВЕРЖДЕНЫ D36.1 — трата разрешена в рамках ключей)
- **Capability-vs-activation 2×2:** {дешёвая прод-модель | фронтир} × {baseline-промпт | дискурс-промпт} на trap-наборе + 1 главе. Разводит: фронтир верстает, дешёвая нет → **gap способности**; ни та ни другая → недоспецифицированный промпт; краткое правило/пример чинит дешёвую → это была **активация**.
- Фронтир: **GPT-5 — основной** (OpenAI ~$9); **Gemini 3.1 Pro (`-preview`) — ЭКОНОМНО** (остаток ~€2.6, thinking = аддитив-биллинг → быстро сгорит; лучше как кросс-семейный мета-ревьюер, НЕ прогонять им всё); grok (~$9) — доп, но **НЕ на архаичной ch1** (D22.5, эхо-риск); **НЕ Claude/Opus** (нет ключа). Мета-ревьюер — **self-family exclusion** (не ревьюит свой выход).
- **Фронтир кросс-семейный мета-ревьюер** (span-цитаты: где ломается смысл + какой механизм чинит): **self-family exclusion** (модель НЕ ревьюит свой выход — если Gemini переводил, мета-ревьюер GPT, и наоборот).
- Гарды: эхо/refusal-скрин на всех выходах; **per-call predicted-cost кап ДО вызова** (НЕ group-level — урок exp13 +10%); пре-регистрация армов заморожена коммитом.
### 3. Кривая размер-чанка ↔ качество ↔ биллинг ↔ ретраи
- Размеры **0.75k / 1.5k / 3k / глава** × **две политики границ** (жадная упаковка | сцен/дискурс-граница) при сопоставимом бюджете — иначе размер спутается с качеством границ.
- Снимать (пре-рег): in/out/**reasoning**-токены, латентность, **retry-rate ПО ПРИЧИНАМ** (timeout/refusal/length/echo/sanitizer/decode — раздельно), **доля ПОВТОРНО ОПЛАЧЕННЫХ токенов** (не только retry-rate — урон одного крупного сбоя), coverage, слепое предпочтение, KPI-абзацы, trap-теги.
- **Бюджет чанка — в ВЫХОДНЫХ токенах на реальном токенизаторе** (кириллица-фертильность ~22.5× — Petrov NeurIPS 2023, проверено); оптимизировать на **retry-adjusted output-cost**; связность давать кэшированным carryover, НЕ размером единицы. **Cache-ordering:** статику (system+glossary) ПЕРВОЙ, volatile (running summary/reference) ПОСЛЕ — иначе кэш бьётся.
### 4. Сильный дискурс-reflow промпт — ЭТО АРМ ДЛЯ ЗАМЕРА (не «оптимальный промпт»), ядро (Claude §C1#1 + ChatGPT §C3)
СОДЕРЖАНИЕ (zh→ru, из Ван Цуй, Вестник МГУ Сер.22 — прескрипция ТЕХНИКИ, подтверждена оркестратором по телу статьи; НЕ «норма языка» — норму держат Розенталь/Правила-1956):
1. Молча определи смысловые ходы: единый фокал/наблюдатель; действие+непосредственная реакция; одна тема рассуждения; смена говорящего/времени/места/фокала.
2. Один повествовательный ход — обычно один русский абзац, ДАЖЕ если китайский разбит на однофразовые строки (паратаксис→гипотаксис). Инструмент слияния — **причастные/деепричастные обороты + подчинительные союзы/связки** (5 техник Ван Цуй: иерархия → сегментация по смыслу → маркировка вида/времени предиката → варьирование лексики → добавление связок). Не сливать ТОЛЬКО ради длины.
3. Каждая реплика — с нового абзаца через тире; слова автора при той же реплике — в её абзаце (Розенталь).
4. Разрешено объединять/делить русские предложения; ЗАПРЕЩЕНО терять смысловые атомы (число предложений/абзацев совпадать не обязано).
5. `REFERENCE`-блоки — только для разрешения связей; не переводить/не пересказывать в выходе.
Few-shot — минимальные, ортогональные: narrative N:1, dialogue 1:N, focal-shift boundary (target-side русский якорь). **Для DeepSeek-thinking сначала zero-shot против few-shot** (модель-специфика research/15; не переносить результат между моделями); ручной verbose CoT reasoning-модели НЕ добавлять.
### 5. Метрики и гейты — ПРЕ-РЕГИСТРИРОВАТЬ (C4 ChatGPT + §C10 Claude)
| Ось | Первичный показатель | Аварийный гейт |
|---|---|---|
| Претензия 1 (абзацы) | **детерминированный структурный KPI БЕЗ судьи** (распределение предложений/нарратив-абзац vs русский референс) + слепое чтение | нельзя «побеждать» только МЕНЬШИМ числом абзацев |
| Претензия 2 внутри-чанк | билингв span-цитирующая trap-accuracy (обязательный `supporting_span`) | любая инверсия действия/участника = КАТАСТРОФА независимо от среднего ранга |
| Претензия 2 кросс-граница | accuracy РАЗДЕЛЬНО prev-/next-/chapter-supported | **perturbation:** correct-context vs random/shuffled НЕ должен дать тот же результат (иначе контекст не используется — Mohammed&Niculae, проверено) |
| Полнота | покрытие смысловых АТОМОВ (не совпадение числа предложений) | пропуск заголовка/события дисквалифицирует арм на фрагменте |
| Операционность | `$`, in/out/reasoning-токены, латентность, retry-по-причинам, **повторно-оплаченные токены** | per-call predicted-cost кап; НЕ group-level |
| Робастность | leave-one-judge-out + отдельный катастроф-скрин | коррелированные колонки одного судьи ≠ независимые сигналы |
**НИКОГДА не гейтить художественность/связность на BLEU/COMET** — для zh→ru доказана инверсия (WMT24: NMT>LLM по d-BLEU без human-eval). Судьи: span-цитирующие, reasoning-ON, верность/стиль РАЗДЕЛЬНО, кросс-семейно, self-family exclusion, ≥3 повтора со свапом, parse-чек полноты ранжирования.
### 6. Ступень II — слепое чтение владельцем ТОЛЬКО 3 финалистов
После trap-гейта оставить: **baseline + лучший near-term арм + фронтир-диагностик** (НЕ 8 почти-одинаковых, как exp12). Monitor-паттерн (слепые метки, ключ отдельно, вне хостинга — копирайт). Главный исход — бинарное закрытие 2 претензий + ранжирование; вторичный — размеченные ошибки.
### 7. Дерево решений (пре-рег, ChatGPT §C5)
- P1a закрывает абзацы БЕЗ падения fidelity → катить промпт, размер НЕ менять.
- Помогает только draft-layout ablation → строить deformat/atom-rendering, не chapter-editor.
- ±1 reference закрывает большинство смысловых traps → строить малое context-window до Ф2-памяти.
- Нужна chapter-card, но whole-chapter НЕ лучше → Ф2 state-extraction.
- Whole-chapter выигрывает по fidelity И абзацам И retry-adjusted COGS → тогда проектировать per-stage гранулярность (повторить на длинной главе).
- Фронтир выигрывает обе колонки 2×2, организация почти не помогает → **model floor** (не строить сложную память ради слабой модели).
- Организация помогает ОБЕИМ, фронтир+организация даёт доп-лифт → развести near-term context-fix и премиум-тир.
## Fidelity re-gate (ПАРАЛЛЕЛЬНО, D34.3 — `rerun/FIDELITY_REGATE_HANDOFF.md`)
Независим от exp14. Span-цитирующий, reasoning-ON, раздельно стиль/верность, охота на КЛАСС ИНВЕРСИЙ редактуры (ch11/0 аутлайер: editor расширил 3009→4631, sim 0.064), катастроф-скрин терминов у победителя, author≠reviewer (не glm-5/deepseek), leave-one-out. **Пере-прогон НЕ засчитан до пройденного re-gate.**
## Deliverable
`docs/experiments/14-quality-empirics.md`: пре-регистрация (§1, заморожена коммитом) → таблицы армов (KPI-абзацы / trap-accuracy со спанами / perturbation / retry-по-причинам / цена) → кривые размер↔качество↔биллинг↔ретраи → capability-vs-activation вывод (потолок: модели vs организация) → рекомендация near-term конфига + что строить под ROI → 3 финалиста для слепого чтения владельца. Смена дефолта — ратификация оркестратора. **Ничего не коммитить, КРОМЕ пре-рег-раздела** (D30.10-гейт).
## Дисциплина / бюджет
- **Бюджеты ключей (подтверждены владельцем, D36.1 — «делай что нужно в этих рамках»):** OpenAI ~$9, Gemini ~€2.6 (крошечный — беречь), DeepSeek/ZAI(glm)/Kimi/xAI(grok)/Mistral ~$9 каждый; ДРУГИХ ключей нет. Отдельный owner-`ceiling`-запрос НЕ нужен — работай внутри остатков. **Per-call predicted-cost кап ОБЯЗАТЕЛЕН до каждого платного вызова** (НЕ group-level — exp13 переоврал на +10%); в пре-регистрации разложи ожидаемую трату по ключам и держи запас (near-term дешёвые армы — первыми; фронтир GPT-5 — основная фронтир-статья; Gemini — точечно). Заканчивается ключ → останавливайся на нём, не блокируй остальные армы.
- Каждый платный вызов персистит usage/cost; финальная сумма в отчёте (D30.10). Полигонное Python-зеркало ↔ Go: при расхождении верить Go.
- Слепота свята; пре-рег заморожен после коммита; аномалии провайдеров → вендор-дока + `/models` (не гадать); `.env` не читать; тексты книги в git-доки не тащить (≤15 слов); 18+ регистров в раннем срезе нет — перенос на 18+ требует отдельной пробы (D22/exp10-11).
- **Методика-guard (мемо eval-aggregation — ловил ДВАЖДЫ):** fidelity-first агрегация, leave-one-out по судьям, катастроф-скрин к ПОБЕДИТЕЛЮ тоже, независимость сигналов до агрегации, ось решения (near-term-достаточность vs потолок-моделей). Не собирай ложную «сходимость».

View file

@ -1,12 +1,113 @@
# Журнал прогресса # Журнал прогресса
> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (обновляемый блок; на 2026-07-12). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1D31); этот файл — ЖУРНАЛ, не спека.** > **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (обновляемый блок; на 2026-07-12). **Источник истины по РЕШЕНИЯМ — `architecture/05-decisions-log.md` (D1D31); этот файл — ЖУРНАЛ, не спека.**
> - **Фаза:** 0 ✅; Ф1-машинерия ✅ (D21D28); **приёмка этап A ✅ с оговорками (D24); этап B заморожен (D26) до читаемых 25 глав.** **exp12-диагностика ПРИНЯТА (D30): «нечитаемо» = пассивный моно-редактор + кривой сид + построчная вёрстка от промптов + нет санитайзера; дефекты смысла — в черновике.** Ратифицировано D30: **флип D1 моно→билингв** (supersede D17.в; re-gate верности на пере-прогоне обязателен), reflow-вёрстка (промпты чинятся), output-санитайзер (новый гейт-класс), глоссарий v2 условно (спорные → draft до подписи владельца), **exp13 бейк-офф ПЕРЕВОДЧИКОВ** (deepseek качеством не мерен — главный невыжатый рычаг), COGS флипа +1525% (~$0.85/ранобэ; «$1.52» = отдельная опция Б). **exp13 ПРИНЯТ (D32): черновик flash СОХРАНЁН (pro отклонён), сид v2 под подпись владельца. Бэкенд-пакет D15.2 ЭТАП А ПРИНЯТ и залендён (D33, 00f8e36): билингв-редактор+reflow+санитайзер+golden — golden байт-в-байт, конфиг-флип D32 соблюдён; НО 2 обязательных фикса санитайзера до пере-прогона (D33.1: хвостовая утечка + false-positive «около колонны»). Этап Б/В D15.2 осознанно не начаты (Б трогает денежный resume-путь). Очередь: ~~фикс санитайзера~~ ЗАЛЕНДЁН (D33.1, ACCEPT) ∥ сид v2-финализация (полигон проставляет статусы по подписи владельца) → единый resnapshot (промпты+editor+санитайзер+сид v2) → пере-прогон 25 глав (flash+свзяка, budget_usd>0) с re-gate верности → чтение владельца → этап B.** Трек владельца: дешёвые модели сейчас, фронтир потом (архитектура конфиг-первая — D30.7). Решающая точка — пилот Ф2.5 (блокеры: билингв-якорь/аннотаторы ≥3 — D25.9-Q1, корпус, проба судьи-дублёра — D22.6). > - **Фаза:** 0 ✅; Ф1-машинерия ✅ (D21D28); приёмка этап A ✅ (D24). **Путь D26→D35: качество-первым.** Флип D1 моно→билингв (D30, supersede D17), reflow+output-санитайзер (D30/D33), сид v2 подписан владельцем (D34.1), переводчик flash сохранён (exp13/D32 — pro отклонён). **Пере-прогон 25 глав связкой ВЫПОЛНЕН; вердикт владельца: «лучше (из-за сида), но крайне слабо художественно» (2 претензии: абзацы/конвенции + понимание связей). ПИВОТ D35:** цикл приёмочных прогонов ЗАКРЫТ (инфра ✅ подтверждена исполнением / читаемость ❌ = блок на непостроенной Ф2 — НЕ провал; диагноз «Ф2-недострой + near-term промпт/нарезка-рычаги, не баг» верифицирован; флор D24.3 валидирован в проде). Планка впредь = 2 претензии владельца (ИНТЕРИМ пре-скрин, НЕ пилот Ф2.5). **Очередь «мерить→строить»: ресёрч research/18 ЗАЛЕНДЕН (D36, оба отчёта: Claude ACCEPT_WITH_FIXES / ChatGPT ACCEPT; 57/57 источников реальны, Ван Цуй подтверждён по телу) → полигон-эмпирика ВЫДАНА (`POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`, D36: нарезка×промпт + фронтир-арм + кривая-нарезки + fidelity re-gate) → бэкенд (только под доказанный ROI).** Fidelity re-gate (D34.3, `rerun/FIDELITY_REGATE_HANDOFF.md`) — полигон гонит параллельно. Бэкенд-фиксы (D35.4): экспорт-баг (ch5/ch20 пустые), ведущий `###` из draft, глоссарий разрядов 甲乙丙丁. Трек: дешёвые модели сейчас, фронтир потом (D30.7). Решающая точка — пилот Ф2.5 (блокеры: билингв-якорь/аннотаторы ≥3 — D25.9-Q1, корпус, судья-дублёр — D22.6). *(Детальная хроника D30D34 — в записях ниже + D-лог.)*
> - **Стек (пост-D32):** черновик — **deepseek-v4-flash СОХРАНЁН** (exp13/D32: смена на pro отклонена по данным — сфабрикованная сходимость + катастрофа 蛊→«гусеницы» + верность у flash не хуже; thinking ON; escalate_to=pro без изменений) · редактор — **БИЛИНГВ (D30.1), кандидат glm-5-билингв** (gemini — премиум-эскалация за санитайзером; grok reasoning-off из редакторов СНЯТ — no-op) · судья/апекс Gemini 3.1 Pro (**слаг `-preview`**; mandatory thinking; `additive_total` — D22.3) · эскалация A: DeepSeek V4 Pro → GLM-5.1 → Gemini-preview · **канал B (18+): Mistral · эскалация grok-4.3 reasoning-ON (⚠ не на архаичных zh — D22.5) · abliterated-скрининг · судьи: эротика — Grok (дублёр гейтится пробой D22.6), violence/SFW — Grok+Gemini** (DeepSeek в explicit запрещён ToS — D14.1). 7 ключей. > - **Стек (пост-D32):** черновик — **deepseek-v4-flash СОХРАНЁН** (exp13/D32: смена на pro отклонена по данным — сфабрикованная сходимость + катастрофа 蛊→«гусеницы» + верность у flash не хуже; thinking ON; escalate_to=pro без изменений) · редактор — **БИЛИНГВ (D30.1), кандидат glm-5-билингв** (gemini — премиум-эскалация за санитайзером; grok reasoning-off из редакторов СНЯТ — no-op) · судья/апекс Gemini 3.1 Pro (**слаг `-preview`**; mandatory thinking; `additive_total` — D22.3) · эскалация A: DeepSeek V4 Pro → GLM-5.1 → Gemini-preview · **канал B (18+): Mistral · эскалация grok-4.3 reasoning-ON (⚠ не на архаичных zh — D22.5) · abliterated-скрининг · судьи: эротика — Grok (дублёр гейтится пробой D22.6), violence/SFW — Grok+Gemini** (DeepSeek в explicit запрещён ToS — D14.1). 7 ключей.
> - **Экономика:** `experiments/08-cost-model-v2.md` — до-флиповый ~$0.69 ранобэ / ~$10.94 вебновелла-500; **после флипа D1 → ~$0.85/ранобэ (+1525%, D30.4)**; «$1.52» = опция Б (селективный апекс+память, НЕ подписана); пере-съём = exp08 v3 (D21.8/D25.8). ⚠ Resume: любой `--resnapshot` = переоплата книги — онгоинг гейтится реализацией D15.2 (идёт, D30.9). Gemini-недоучёт 146×/вызов закрыт additive_total (D22.3). > - **Экономика:** `experiments/08-cost-model-v2.md` — до-флиповый ~$0.69 ранобэ / ~$10.94 вебновелла-500; **после флипа D1 → ~$0.85/ранобэ (+1525%, D30.4)**; «$1.52» = опция Б (селективный апекс+память, НЕ подписана); пере-съём = exp08 v3 (D21.8/D25.8). ⚠ Resume: любой `--resnapshot` = переоплата книги — онгоинг гейтится реализацией D15.2 (идёт, D30.9). Gemini-недоучёт 146×/вызов закрыт additive_total (D22.3).
> - **Ждём от владельца:** **подпись спорных терминов сида v2** (修炼/культивация · 人祖/Первопредок · род «гу» · 花酒行者 — таблицу даст exp13) · **флагман-сверка exp13** (переводчики, monitor-паттерн) · DashScope-ключ для qwen-арма exp13 (опционально) · **планка запуска** (лучше-фана/гибрид/издательский + готовность к COGS опции Б ~$1.52 — мемо-эскалация exp12; интерим D30.7: «лучше фана» на дешёвом миксе) · решение по билингв-якорю пилота (D25.9-Q1) · «да/нет» митигации контаминации пилотного корпуса (D27.4) · publishable/waiver — при экспорте (D25.1) · FN-bound L3 — при спеке (D25.4) · провенанс 12-*-доков · юр-пакет (+rights manifest, D25.8). > - **Ждём от владельца:** ~~подпись спорных терминов сида v2~~ ✅ ПОДПИСАНО (D34.1; владелец переопределил: Жэнь Цзу, Монах Цветочного Вина, гу Жизни, деревня Гуюэ, первобытный камень; род «гу» муж) · **чтение 25 глав пере-прогона** (арбитр читаемости — после связки+re-gate) · **флагман-сверка exp13** (переводчики, monitor-паттерн) · DashScope-ключ для qwen-арма exp13 (опционально) · **планка запуска** (лучше-фана/гибрид/издательский + готовность к COGS опции Б ~$1.52 — мемо-эскалация exp12; интерим D30.7: «лучше фана» на дешёвом миксе) · решение по билингв-якорю пилота (D25.9-Q1) · «да/нет» митигации контаминации пилотного корпуса (D27.4) · publishable/waiver — при экспорте (D25.1) · FN-bound L3 — при спеке (D25.4) · провенанс 12-*-доков · юр-пакет (+rights manifest, D25.8).
> - Записи ниже — хронология; РАННИЕ (день-0, 04.07) содержат устаревшие цифры/решения (COGS $24, BYOK, Anthropic-Sonnet), переопределённые позже — см. блок выше и 05-decisions-log. > - Записи ниже — хронология; РАННИЕ (день-0, 04.07) содержат устаревшие цифры/решения (COGS $24, BYOK, Anthropic-Sonnet), переопределённые позже — см. блок выше и 05-decisions-log.
## Полигон — exp14 эмпирика рычагов качества (нарезка×промпт + фронтир 2×2), ПАРТИЯ 1, 2026-07-12 (D36)
Сессия по `POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`. **Пре-регистрация ЗАМОРОЖЕНА коммитом ДО первого платного вызова** (D30.10; `docs/experiments/14-quality-empirics.md` §1 — trap-набор 6 трапов вкл. gl.7/gl.8 владельца, армы нарезка×промпт, метрики/гейты, бюджет-по-ключам). Харнес `eval/exp14_*.py` (call+3-режима-cost+per-call-кап+токенайзер+реконструкция инъекции из `retrieval_state.injected_ids`). Все выходы ВНЕ git (`/home/ubuntu/books/gu-zhenren/exp14/`). **Бэкенд не трогал (0 правок).**
**ПАРТИЯ 1 (trap-набор, 9 чанков): 0 ошибок на 64 арм-вызовах; трата ARM $1.77 (ZAI $0.43 + OpenAI $1.34) + trap-судьи $0.50 (gpt-5-mini+kimi, кросс-семейно) ≈ $2.27 (глубоко в остатках).** T1-катастрофа корроборирована независимой панелью (2/2 судьи флагают КАТАСТРОФУ на всех дешёвых армах, чистят фронтир). Фронтир = **gpt-5.4** ($2.5/$15, live-фактчек 2026-07-11; GPT-5-линейка до 5.4/5.5/5.6, взят 5.4 standard).
**ГЛАВНЫЙ ВЫВОД — потолок РАСЩЕПЛЁН по двум претензиям владельца (прямой ответ на «модели vs нарезка/промпт»):**
- **Претензия 1 (абзацы/конвенции) = наш ПРОМПТ/ПАЙПЛАЙН (активация), НЕ модель.** Детерм. KPI предл./нарратив-абзац: P0 1.91 → P1a (дискурс-промпт) 2.61 → **A-2pass (семантика→target-only reflow-пасс) 3.33** (лучший, доля-1-предл. 0.187, БЕЗ коллапса длины/CJK). **Фронтир+СТАРЫЙ промпт (F-base 1.58) ХУЖЕ дешёвого P0** — «сильнее модель» абзацы НЕ чинит. A-layout (deformat черновика) улучшает абзацы (3.13), НО **CJK-утечка ×20** (регресс-гард поймал) — deformat требует CJK-пост-гарда.
- **Претензия 2 внутри-чанк (смысл) = дешёвая МОДЕЛЬ (capability floor).** T1 (gl.7 двойное отрицание «все знали»): glm-5 **инвертирует** в «никто не знал» НЕЗАВИСИМО от промпта (P0 и P1a); **gpt-5.4 чинит** НЕЗАВИСИМО от промпта (F-base и F-disc). T2 (物是人非) — тот же знак. Промпт претензию 2 НЕ закрывает.
- **Претензия 2 кросс-граница = НЕ доминирует в срезе.** T5/T6 локально самодостаточны; ±1-reference (A-ref) дал байт-идентичный выход (чинить нечего); whole-chapter (P1c) единственный явно связал антецедент (1 датапоинт).
**Near-term рекомендация (на ратификацию оркестратора, НЕ смена дефолта):** (1) дискурс-reflow-контент Ван Цуй→editor-промпт + рассмотреть отдельный target-only reflow-пасс (A-2pass) под COGS; (2) претензию 2 — **селективная фронтир-эскалация редактора по смысл-риску** (не тотальный фронтир — он абзацы портит); (3) CJK-гард при deformat; (4) НЕ строить Ф2-кросс-чанк-память под слабый сигнал. **ПАРТИЯ 2 (осталось):** кривая нарезки, слепые пакеты Ступени II (гл.19/17/18, D=0.061/0.246/0.440), полная ранжирующая панель +leave-one-out, fidelity re-gate (D34.3), 3 финалиста, хендофф. Планка = 2 претензии владельца (ИНТЕРИМ пре-скрин, НЕ пилот Ф2.5). Смену дефолта ратифицирует оркестратор.
## Ресёрчер — рычаги качества (`research/18-quality-levers.md`), 2026-07-12 (D35.5, вход полигону)
Сессия по `RESEARCHER_QUALITY_SESSION_PROMPT.md` (нейтральный/анти-анкоринг). **Ничего не коммичено** (лендит оркестратор после верификации первоисточников — как research/15/16/17). Отчёт: `docs/research/18-quality-levers.md` — §A (заморожена, sha256 `44f90364…`, построена ДО чтения стека/ChatGPT-отчёта; хеш байтов между маркерами BEGIN/END §A) · §B дифф · §C таблица-рекомендации полигону · §D вопросы.
- **Протокол соблюдён:** §A из ТОЛЬКО (2 претензии + сырьё rerun/ + механизм chunker.go/translator.md/editor.md + собств. внешний веб-ресёрч 52-агентным фан-аутом с адверсариальной верификацией). НЕ читал в фазе 1: D-лог/хендоффы/rootcause/приёмку. §A заморожена хешем ДО фазы 2.
- **Главный результат — ТРОЙНАЯ независимая сходимость** (моя §A ⟂ ChatGPT-§A ⟂ эмпирика D26→D35) на диагнозе и большинстве рычагов ⇒ высокое доверие карте «строить». Оговорка D25.10/D32.4: общая нога «внешняя MT-лит» у меня и ChatGPT — не 3 независимых голоса там.
- **Замеры на сырье (независимо воспроизвёл):** рубленость 41/51 нарратив-чанков ~1:1 абзац-на-строку; редактор структуро-СОХРАНЯЮЩ (слил 1/49) — reflow-инструкция инертна; **ch5.0 черновик 5425 симв.→финал ПУСТ (`sanitizer_defect`) = экспорт-баг D35.4a**; CJK-глифы в 13 финалах.
- **Несущий вклад СВЕРХ команды И ChatGPT (§B2):** (1) **zh→ru дискурс-транформ как теория** — паратаксис→гипотаксис (意合/形合), 流水句, **прямая zh→ru peer-reviewed прескрипция Ван Цуй (Вестник МГУ Сер.22): 5 техник + причастные/деепричастные обороты** ⇒ апгрейд research/16 «слияние дискреционно» → «обязательная дискурс-операция, и КАК»; прямой ответ владельцу «конвенция языка, не стиль автора»; (2) слой **«пакет конвенций пары»** версионируемый (идея владельца; research/07 держит контент как разбросанные brief-политики — отдельного слоя нет); (3) DocRepair EN→RU числа (монолингв. repair-пасс); (4) фертильность-налог кириллицы + cache-ordering + перевёрнутая-U; (5) метрика-инверсия zh→ru (WMT24 NMT>LLM d-BLEU) — не гейтить художественность на авто-метрике.
- **Само-поправки §A (§B3, честно):** ch5-void = экспорт-баг (не санитайзер); research/16 УЖЕ заземлила русские нормы (Розенталь §52-53/Лопатин/Правила-1956); source-line-strip не нов (exp12:174).
- **§C = армы для D35.6:** СЕЙЧАС (дискурс-reflow-промпт с zh→ru-контентом · discourse-move few-shot target-anchor · source-strip · детерм. reflow-постпроцессор ops b/c/d · guard пост-черновой регрессии · ±1 reference-контекст · кривая нарезки на retry-adjusted-output-cost · **capability-vs-activation 2×2 + фронтир-арм** · **авто-Claude-судья: KPI-структура без судьи для претензии 1, span+comprehension-QA+perturbation для 2, владелец кросс-чек ChatGPT/вручную**) vs Ф2 (running summary+entity-ledger DelTA · chapter-card · ZP-аннотация · монолингв. RU reflow-пасс). Архитектура: слой пары (зона оркестратора/бэкенда).
- **Запросы владельца этой сессии учтены:** (а) конвенция-vs-стиль отвечена источниками (§A/§B2.1); (б) «модель недоактивирована» → capability-vs-activation арм (§C #9); (в) авто-оценка качества → §C #10 + §D; (г) языковые карты в архитектуру → слой пары §C #15.
**12.07 (№4): research/18 (ОБА отчёта) отревьюирован и залендён с ревью-шапками, ратификация D36.** Мультиагентный воркфлоу 26 агентов ($0, refute-by-default, первоисточники + реплика сырья): **§A-заморозка Claude sha256 44f90364… воспроизведена побайтно (MATCH) → не редактировалась; 57/57 несущих цитат СУЩЕСТВУЮТ (0 сфабрикованных — проверены ВСЕ «2026»-препринты)**; эмпирика воспроизведена (ch5.0/ch20.0-void ТОЧНО, CJK 13 финалов, 41/51 в допуске, gl.7-инверсия/gl.8-сплющивание фактически есть → на fidelity re-gate); **Ван Цуй ПОДТВЕРЖДЁН по ТЕЛУ статьи** (скептик декодировал CID/Identity-H шрифт: 5 техник + причастные/деепричастные + подчинение + прескриптивная необходимость — Вестник МГУ Сер.22 2024№3, рецензирован). **Вердикты: Claude — ACCEPT_WITH_FIXES** (5 поправок в ревью-шапке: DocRepair-числа принадлежат D19-1081 не P19-1116 — числа верны; TransAgents двойная-метка; Z5 автор Dingxu Shi не Li&Thompson; Ван Цуй = прескрипция ТЕХНИКИ, не «норма языка»; «пост-черновая регрессия > 2 претензий» пере-возвышена — ch5-void = экспорт-баг); **ChatGPT — ACCEPT** (цитатно-чист, §C — самый исполнимый скелет; оговорки: §A-заморозка НЕ воспроизводима из документа = дисконт на вес сходимости, §C4-гейт не ссылается на D34.3). **Калибровка «тройной сходимости»:** оговорка честна (D25.10 взята), но (а) вторая необъявленная общая нога — оба §A читали одно сырьё/код; (б) цитатные базы почти НЕ пересекаются (~3 общие) → где литература расходится, совпадение сильнее; (в) ChatGPT-заморозку — с дисконтом. **Несущий вклад для «строить» держится:** Ван Цуй-контент → в reflow-промпт полигона; экспорт-баг ch5/ch20 подтверждён двумя репликами (бэкенд-fix D35.4a). Выдан `POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md` (D36: скелет §C ChatGPT + графт Ван Цуй/COGS/D34.3 из Claude; добавлены недостающая ячейка current-промпт×глава и явный P0-baseline; ch5/ch20 исключены из слепых пакетов).
**12.07 (№4): D36.1 — гигиена доков + бюджеты (по запросу владельца).** Заархивированы **5** спент-промтов (`archive/prompts/`, git mv, история не переписана — D23.3): ресёрчер/exp13/санитайзер-фикс/приёмка-v2/D152-этап-А. **`POLYGON_PACKAGE4` НЕ архивирован** (проверка по запросу владельца): как сессия не запускался, отработана лишь task-1 сид-мн.ч. (в exp13/D32); **residual жив** (D22.6 судья-дублёр — блокер пилота, D25.7 echo-кал, миграция memory_eval с 2.5-flash, пилот-пре-рег, P4-хвост) — **пилот/18+/echo-трек, ОРТОГОНАЛЬНО exp14** (не вносить); оставлен активным со статус-баннером как residual-трекер до активации пилота. Активны `ORCHESTRATOR_*` + `POLYGON_QUALITY_EMPIRICS_*` (exp14) + `POLYGON_PACKAGE4_*` (отложен); README-карта + титул D-лога D35→D36 актуализированы. **Бюджеты подтверждены владельцем:** OpenAI ~$9, Gemini ~€2.6, DeepSeek/ZAI/Kimi/xAI/Mistral ~$9; других нет; «полигон делает что нужно в рамках» → блокер фронтир-ceiling снят (exp14: GPT-5 основной фронтир, Gemini точечно/мета-ревьюер, grok не на ch1; per-call кап + пре-рег). D36.1 — в D-логе.
## Приёмка Ф1 — ПЕРЕ-ПРОГОН 25 глав кандидат-конфигом (билингв glm-5 + reflow + сид v2 + санитайзер), 2026-07-12 (D30.9/D34.2)
Пере-прогон по `ACCEPTANCE_SESSION_PROMPT.md`. **Ничего не закоммичено** (лендинг — оркестратору). Все производные — ВНЕ git в `/home/ubuntu/books/gu-zhenren/rerun/` (свежий store `guzhenren-rerun.db`, конфиги, выходы, отчёты, скрипты замеров). **Дерево backend/ чистое — мои правки кода = 0** (throwaway-хелпер `cmd/_dumpsrc` для дампа исходных чанков — `_`-игнор Go-тулчейном, не коммичен, удалён после использования). Предусловия запуска (все 5) сверены: D15.2 этап A+D33.1 залендены; draft=flash сохранён (exp13/D32); сид v2 подписан владельцем (D34.1 — Жэнь Цзу/Монах Цветочного Вина/гу Жизни/деревня Гуюэ/первобытный камень/род «гу» муж — сверено в `guzhenren-seed-v2.yaml`); budget_usd>0; единый resnapshot.
### ШАГ 0 (repoint, D34.2) — ВЫПОЛНЕН и ВЕРИФИЦИРОВАН исполнением
Приёмочный конфиг собран из БОЕВОГО `pipeline-c1.yaml` (HEAD, post-D33) + book-дельты, **СВЕЖИЙ store** (не store этапа A). Снапшот `e754d3a7b321`, сверен из store (`snapshots.payload`):
- draft `deepseek-v4-flash` **`prompt_version:v1-reflow`**, escalate_to `deepseek-v4-pro`, floor max_tokens **8000** (D24.3 — стадия A имела 2048/3291).
- edit `glm-5` **`prompt_version:v2-bilingual-reflow`**, prompt_sha256 байт-в-байт совпал с `backend/prompts/editor.md`.
- `sanitizer.enabled:true` (`sanitizer-v2`, post-D33.1), coverage off, postcheck_gate false (флаггер), glossary_injection selective, **memory_version `002716c2…`** (сид v2, 57 терминов ≠ сид v1).
- `status --json`: **config_drift=false, snapshot_drift=false** — текущий конфиг рендерит ТОТ ЖЕ снапшот, что в store (нет стейл-моно-конфига; repoint airtight).
### A. Инфраструктура держится на НОВОМ снапшоте — таблица (каждое исполнением)
| # | Пункт | Как проверено | Результат |
|---|---|---|---|
| A1 | committed==SUM(checkpoints) | SQL на 4 срезах живого store | ✅ ТОЧНО: honest-stop $0.02163351==$0.02163351 (n=9); kill-9 $0.03187751==$0.03187751 (n=11); финал **$0.47462791==$0.47462791==chunk_status-sum** (n=116) |
| A1 | честный стоп потолка (committed+reserved) | book_usd=0.03 → отказ ch1/4 edit | ✅ committed=$0.021634 reserved=$0 denied estimate=$0.014533, «raise ceilings.book_usd or stop», **exit 1** (стадия A этот код не фиксировала — теперь подтверждён) |
| A1 | **настоящий kill -9** посреди in-flight glm-5 edit (ch1/5) | SIGKILL, инспекция store до resume | ✅ orphan reserved=$0.013373 виден до resume; на resume «recovered 1 stale reservation»; committed==SUM пережил краш; resume ре-атаковал РОВНО ch1/5 edit (≤1 вызов) |
| A1 | resume не переоплачивает | replay после kill-9/honest-stop | ✅ «stage resolved from chunk_status» ($0), первый платный = убитая/отклонённая стадия |
| A2 | **echo-эскалация стреляет и ре-гейтится (LIVE)** | ch16/0 flash draft | ✅ flash → **flagged cjk_artifact** → эскалация **deepseek-v4-pro @ max_tokens=8000****ре-гейт ok** → edit прошёл. **Валидирует фикс D24.3 живьём** (стадия A: хоп наследовал 2048 → finish=length, эскалация-пустышка; теперь флор 8000 → rescue) |
| A2 | flag+skip+continue, мусор не в TM | 2 sanitizer-флага (ch5/0, ch20/0) | ✅ чанк flagged, edit НЕ закоммичен (final пуст), прогон продолжился; FinalText не течёт в TM/экспорт |
| A2 | `tmctl redrive` на реальном флаге | ch5/0 sanitizer_defect: dry-run + real | ✅ dry-run план 1 (ничего не тронул); real сбросил+ре-атаковал+**ре-гейтил** → **re-flagged** (glm-5 детерминированно повторил «### Глава 5»); committed=$0.483486 **≥ SUM=$0.474670** (diff $0.008816 = сброшенная стадия; D15.3) |
| A2 | `tmctl status` живой (OpenReadOnly) | status/--json ПРИ активном translate | ✅ работают без flock; snapshot/деньги/паспорта/config-drift корректны; --json exit 2 при флагах |
| A3 | санитайзер ловит классы exp12 | unit-тесты (исполнением, зелёные) + LIVE | ✅ LIVE 2 TP (markdown «### Глава 5», «# Глава 20»); unit: gemini-преамбула / «Основные правки для справки» / ### / латиница / гомоглиф — firing+non-firing, вкл. D33.1-FP-гварды («около колонны»/«стало талой») |
| A3 | НЕ даёт ложных на чистом тексте | 55 чистых glm-5-чанков | ✅ **0 false-positive** (2 флага — оба реальные markdown-заголовки) |
### B. Качество
- **B4 re-gate ВЕРНОСТИ — НЕ ЗАПУСКАЛА (по контракту author≠reviewer): отдано полигону.** Пакет `rerun/FIDELITY_REGATE_HANDOFF.md` + `rerun-parallel.txt` (выровнено ОРИГ|ПЕРЕВОД, 57 чанков) + `records.json` + store. **⚠ Пере-прогон НЕ ЗАСЧИТАН до пройденного независимого span-цитирующего re-gate** (раздельно стиль/верность, охота на класс инверсий редактуры exp12, катастроф-скрин). Билингв-редактор мог купить гладкость ценой смысла — это ровно то, что не видно на поверхностном чтении.
- **B5 D10 консистентность** (НЕЗАВИСИМЫЙ скрипт `rerun/d10_consistency.py`, приложен — воспроизводимо, author≠native-matcher): presence **91.0%** (647/711), occurrence **95.8%** (3072/3207). По типам (presence): имена 98.6%, клички 100%, места 96.0%, термины 94.9%, **титулы 78.7%** (слабейший класс — как термины на этапе A). Классификация промахов: **decl_gap 0** (фикс D24.4 «базовый dst всегда» держит), **inflection_gap 54** (dst присутствует в НЕперечисленной в сиде форме — читатель видит верный термин; эффективная консистентность = (647+54)/711 = **98.6%**), **genuine_absent 10** (кандидаты дрейфа для span-сверки, НЕ подтверждённый дрейф). Alias-слепое пятно D24.2 **обойдено** (per-term substring, не longest-match): поймал **古月→Гуюэ ×2** (гл.18/0,20/1) — ровно класс, слепой для нативного матчера. Прочие кандидаты: 转→ранг ×6, 南疆→Наньцзян ×1 — отданы полигону (не подтверждаю дрейф сам). Порог 98% достижим на эффективной; строгий presence занижен местоимённой заменой/инфлексией, НЕ терминодрейфом (как на этапе A).
- **B6 вёрстка/reflow** (скрипт `rerun/reflow.py`): диалог→«—» в **49/55 чанков** (404 dash-строки); нарратив местами слит (dst_paras/src_lines mean 0.96). Груборазмерная метрика «скопирована структура 38/55» — **артефакт** (эта вебновелла в ИСХОДНИКЕ ~одно-предложение-на-абзац + диалог легитимно 1:1); **качественное чтение story-глав (гл.6, гл.8) показывает естественные многопредложные русские абзацы, НЕ построчную рубку exp12**. Reflow работает.
### C. Прочее
- **C8 echo-rate**: 1/57 flash-draft (**1.75%**, gl.16/0) — RESCUED эскалацией; финальный cjk_artifact=0. vs прайор книги ~25% (exp10/D18) и 3.5% этапа A. **Резко ниже — v1-reflow-промпт + flash почти не эхают на этом срезе** (front-matter гл.1, эхавшая на этапе A, тут переведена).
- **C8 spine**: 25/25 глав, 57/57 чанков, **0 молчаливых потерь**. 55 чанков с закоммиченным переводом; 2 (гл.5/0, гл.20/0) flagged (см. находку 1).
- **C9 деньги vs D30.4**: committed=**$0.474628**; доля стадий: editor glm-5 **87.1%** ($0.4132), draft flash 11.6% ($0.0550), эскалация pro 1.4% ($0.0065). vs этап A $0.4081 (моно) = **+16.2%** — В КОРИДОРЕ D30.4 (+1525% от флипа билингв; билингв +ток. редактора → editor-доля 83.3%→87.1%). Проекция полной книги (2283 гл.) ~$43 (этап A ~$37); НЕ подгоняю под до-флиповый $0.69.
### Находки для оркестратора (НЕ чинил — вне зоны багфикса / зона пакета/промптов)
1. **[quality, НЕ инфра-баг] glm-5 детерминированно лепит `### Глава N: <title>` на ~2/25 зачинах глав** (гл.5/0, гл.20/0), ХОТЯ editor.md прямо запрещает markdown-заголовки. Санитайзер ловит (flag+skip), но **redrive НЕ спасает** (повторяется). Тело перевода этих чанков КОРРЕКТНО — дефект = только ведущая «### ». **Рекомендация: export-нормализация ведущего `#{1,6} ` с строки-заголовка** (D29 уже отметил 8/54 финалов этапа A с ###; экспорт-контракт должен снимать) ИЛИ усиление промпта. Инфра отработала правильно — это находка о поведении модели.
2. **[glossary, для владельца] B2 dst-коллизия: 修炼/修行 → «культивация»** (сид v2, подписано владельцем) — читатель не различит два разных src. Раннер варнит на materialize. Подтвердить, что намеренно.
3. **[D10] 10 genuine-absent кандидатов дрейфа** отданы полигону на span-сверку (转→ранг, 古月→Гуюэ, 南疆→Наньцзян) — НЕ подтверждаю дрейф сам (author≠reviewer).
### ВЕРДИКТ
- **Инфра-инварианты на новом снапшоте: ДЕРЖАТСЯ** — деньги (committed==SUM/honest-stop-exit1/kill-9-orphan-recovery/resume$0/redrive-D15.3), диспозиции (echo-эскалация+ре-гейт LIVE, flag+skip, live OpenReadOnly-status), санитайзер (2 TP / 0 FP), spine (0 потерь), телеметрия/деньги (+16% в коридоре D30.4). **Плюс: фикс эскалации-флора D24.3 валидирован ЖИВЬЁМ** (то, что на этапе A возвращало эскалацию-пустышку, теперь rescue-ит эхо).
- **Читаемо / не читаемо: АРБИТР — ВЛАДЕЛЕЦ** (сэмплы `rerun/owner-sample.md`). Приёмка даёт честный замер, НЕ приговор. **Честно: на чистых story-главах (гл.8) этап A читался УЖЕ прилично — дельта инкрементальная (термины сида v2, нет эха, нет markdown, чуть плотнее), НЕ «нечитаемо→читаемо».** Крупный рычаг билингва — ВЕРНОСТЬ смысла (сверка с исходником), не видна на поверхностном чтении → **решает span-re-gate полигона.** Не преувеличиваю сходимость сигналов (урок eval-aggregation).
- **Верность: PENDING** (полигон re-gate; без него пере-прогон не засчитан — D1.1/D34.3).
### Вопросы владельцу (отдельный блок — после чтения)
1. **Читаемо ли?** Прочти `rerun/owner-sample.md` (гл.6, гл.8 + контраст этап A↔пере-прогон) и/или полный `rerun/rerun-ru.txt` (25 глав) холистически, как читал этап A. Перешло планку «лучше фана» (D30.7)? Да/нет.
2. **Этап B (срез ~300 глав, ~$56): да / нет / потолок?** При «да» — явный `ceilings.book_usd`/`day_usd` (согласие на трату, Р6). Проекция: ~$0.019/гл × 300 ≈ $5.7; рекомендую book_usd≈8, day_usd по темпу.
3. **markdown-заголовки (находка 1):** ок ли план «export-нормализация ведущего ###» (не трогая промпт/модель), или усилить промпт glm-5? Гейтит чистоту зачинов глав.
4. **B2-коллизия 修炼/修行→«культивация»** (находка 2): оставить (намеренно) или развести (напр. 修行→«совершенствование»)?
### Вердикт владельца (прочитал выхлоп пере-прогона) — СТРАТЕГИЧЕСКАЯ РАЗВИЛКА
**«Лучше, чем было (скорее из-за сида), но всё ещё крайне слабо художественно.»** Две конкретные претензии: **(1)** нет логической редактуры по абзацам, не соблюдаются конвенции русского; **(2)** остаются места, где модель не понимает связей/смысла. Владелец ставит вопрос о жизнеспособности сетапа и о смысле дальнейших тестов/масштаба.
**Диагноз приёмки (сверено с кодом/контрактом — НЕ баг, а недореализация):** обе претензии = машинерия качества, которая ДИЗАЙНЕРСКИ есть, но НЕ ПОСТРОЕНА (Фаза 2): judge (`role=judge` не исполним — `pipeline.go:170`; C2/C3/fanout не реализованы — `pipeline.go:159`), annotator-пре-пасс (speaker-ID/регистр/чэнъюй — 04-unhappy §124), чтение-вперёд, конвенц-гейты (морфо-род/ты-вы/канцелярит-Галь). Текущий пайплайн = голый линейный черновик→редактор + детерминированные гейты, **ноль оценки качества в контуре, ноль per-segment сигнала «где смысл поехал».** Черновик flash как ПЕРЕВОДЧИК на художественность не мерен НИКОГДА (D30.6). Владелец сам назвал обе проблемы в `START_PROMT.MD` (п.4-конвенции, п.33-чтение-вперёд) и предложил «судью над пайплайном» (п.3 разд.2) — реализован лишь разово как флагман (exp12/13).
**Решения к ратификации оркестратором (запрошены владельцем):**
1. **Этап B (~300 глав) ОТМЕНИТЬ** как инструмент оценки качества — это инфра-масштаб-тест, к художественности отношения не имеет, жжёт токены/40-мин ожидания. Итерация качества — на **≤10 главах**, быстро. 25 глав уже переведены (`rerun-ru.txt`), читаемы как есть.
2. **Развилка:** (A) пауза/стоп на дешёвом сетапе; (B) дешёвая фронтир-проба ~5 глав (~$5): фронтир-переводчик+редактор + фронтир-мета-ревьюер → разводит «потолок в моделях vs в архитектуре» ДО решения; (C) строить машинерию Ф2 (annotator+judge+чтение-вперёд+конвенц-гейты) → пилот Ф2.5. Приёмка рекомендует (B) как самый дешёвый вход в (A/C).
3. **Планка приёмки впредь = 2 претензии владельца** (абзац-логика/конвенции + понимание смысла), не только инфра. Инфра-веха Ф1 закрыта; вакуум качества — открыт.
**Guard:** любой фронтир-ревью/проба — на СЫРЬЕ (src+выходы+код), без наших выводов (урок research/17 — анкоринг = сфабрикованная сходимость); пре-регистрация до платных вызовов. **Промт-хендофф оркестратору:** `rerun/ORCHESTRATOR_HANDOFF.md`.
**Архитектурные пробелы — верифицированы независимо (6 адверсариальных агентов по коду, с калибровкой МОИХ интерпретаций):** факты подтверждены, но часть «дефектов» оказалась осознанными компромиссами → в хендофф поданы откалиброванно. **Реальные пробелы:** кросс-чанк дискурс на стыках (~12/глава; редактор не видит главу целиком — гипотеза `draft=чанк/edit=глава`), reference-тома прошлых частей (не построены, Ф2/3), **отсутствие LLM-оценки качества/аннотатора в контуре (главный, Ф2)**. **Откалибровано (НЕ дефекты, требуют эмпирики, не утверждения):** фикс-чанкер 1500/без-ёмкости-модели = quality-first компромисс; промпты lean НО ресёрч промтинга ЕСТЬ (research/15 §Промптинг, exp12/13/10); кэш 20% — присущ по-чанковому переводу, не из-за глоссария. **План владельца (на ратификацию оркестратором):** закрыть цикл приёмочных прогонов (инфра ✅/читаемость ❌ — НЕ «провал»), → ресёрч-сессия по репо → полигон-эмпирика (чанк/биллинг/промт/ретраи/переверстка — последняя тестируется БЕЗ пайплайна) → если подтверждается, доработка бэкенда. Планка впредь = 2 претензии владельца, не только инфра.
**12.07 (ночь): пере-прогон отревьюирован, ПИВОТ ратифицирован — D35.** 3 оси исполнением по копии re-run store/логам/выходам. **Конфиг-корректность подтверждена** (снапшот несёт v1-reflow/v2-bilingual-reflow/сид-v2 — НЕ старая моно-мина D34.2 → вердикт валиден). **Диагноз «Ф2-недострой, не баг» ПОДТВЕРЖДЁН** (все баг-гипотезы опровергнуты: reflow применён но зеркалит рубленость исходника = промпт-рычаг; билингв-редактор активен sim 0.643; сид инъектится 628 хитов; внутри-чанк-фиксимо/кросс-чанк-~1.28-Ф2 эмпирически верно; флор D24.3 валидирован в проде — эхо-эскалация ch16/0→pro@8000→реальный результат). Ратифицированы 3 пункта пивота (закрытие цикла / планка=2 претензии ИНТЕРИМ-пре-скрин-не-пилот / мерить→строить). Найден 1 реальный баг (major): санитайзер-флагнутые ch5/ch20 экспортятся ПУСТЫМИ (~44% зачина глав выпали; текст правки цел) → бэкенд-фикс + полигон исключает ch5/ch20 из слепых пакетов. Промт ресёрчера выдан НЕЙТРАЛЬНЫЙ (ревью поймало анти-анкоринг-дефект §3 хендоффа — урок D25.10). Fidelity re-gate (D34.3) остаётся жёстким гейтом. Дешёвые фиксы: ведущий `###` из draft (не glm-5), глоссарий разрядов 甲乙丙丁. Очередь: ресёрчер (`RESEARCHER_QUALITY_SESSION_PROMPT.md`) → полигон (нарезка×промпт + фронтир-диагностик + re-gate) → бэкенд под ROI.
---
*(Замеры и скрипты — в `/home/ubuntu/books/gu-zhenren/rerun/`: `audit.sh`, `d10_consistency.py`, `reflow.py`, `extract.py`, `records.json`, `rerun-parallel.txt`, `rerun-ru.txt`, `owner-sample.md`, `FIDELITY_REGATE_HANDOFF.md`, `ORCHESTRATOR_HANDOFF.md`. Всё ВНЕ git.)*
## Приёмка Ф1 — 蛊真人 zh→ru, этап A (25 глав), 2026-07-10 ## Приёмка Ф1 — 蛊真人 zh→ru, этап A (25 глав), 2026-07-10
Приёмочная сессия по `ACCEPTANCE_SESSION_PROMPT.md`. Прогон реальной книги end-to-end, вердикт по критериям `02-mvp-plan §Приёмка Фазы 1`. **Ничего не закоммичено** (лендинг — оркестратору). Все производные (store.db, срез, выходы, отчёты) — ВНЕ git (`/home/ubuntu/books/gu-zhenren/acceptance/`). Дерево backend/ чистое (мои правки = 0; `docs/research/17-*` — чужая GPT-сессия, не трогал). Приёмочная сессия по `ACCEPTANCE_SESSION_PROMPT.md`. Прогон реальной книги end-to-end, вердикт по критериям `02-mvp-plan §Приёмка Фазы 1`. **Ничего не закоммичено** (лендинг — оркестратору). Все производные (store.db, срез, выходы, отчёты) — ВНЕ git (`/home/ubuntu/books/gu-zhenren/acceptance/`). Дерево backend/ чистое (мои правки = 0; `docs/research/17-*` — чужая GPT-сессия, не трогал).

View file

@ -11,17 +11,17 @@
## Структура ## Структура
- `architecture/` — синтез. **Источник истины по решениям — [`05-decisions-log.md`](architecture/05-decisions-log.md) (D1D31); при конфликте с любым доком он выше.** - `architecture/` — синтез. **Источник истины по решениям — [`05-decisions-log.md`](architecture/05-decisions-log.md) (D1D35); при конфликте с любым доком он выше.**
- `01-decisions.md` — принципы Р1Р10; `02-mvp-plan.md` — фазы и приёмка (v3, 09.07); `03-implementation-notes.md` — контракты Фазы 0; `04-unhappy-paths.md` — ~70 режимов отказа → механизм; `06-memory-risk-registry.md` — реестр рисков банка памяти; **[`07-strategic-review.md`](architecture/07-strategic-review.md) — стратегический аудит (09.07): вердикт end-to-end, топ-риски, курс-коррекции**; `components.puml`/`pipeline.puml` — диаграммы v3 (владелец смотрит PlantUML-расширением VS Code; вручную НЕ рендерить). - `01-decisions.md` — принципы Р1Р10; `02-mvp-plan.md` — фазы и приёмка (v3, 09.07); `03-implementation-notes.md` — контракты Фазы 0; `04-unhappy-paths.md` — ~70 режимов отказа → механизм; `06-memory-risk-registry.md` — реестр рисков банка памяти; **[`07-strategic-review.md`](architecture/07-strategic-review.md) — стратегический аудит (09.07): вердикт end-to-end, топ-риски, курс-коррекции**; `components.puml`/`pipeline.puml` — диаграммы v3 (владелец смотрит PlantUML-расширением VS Code; вручную НЕ рендерить).
- `experiments/` — эмпирика «Полигона»: `00-provider-quirks` (читать перед любым вызовом провайдера), `01-token-calibration`, `02-refusal-benchmark`, `03-local-stand`, `04-editor-quality`, `06-local-extraction`, `07-coverage-precision`, `08-cost-model-v2` (актуальная денежная модель), `09-pilot-protocol` (пилот Ф2.5 + поправки D13), `10-explicit-benchmark` (18+ violence-рука канала B), `11-erotica-benchmark` (erotica по трём парам/регистрам — закрытие D14.4, D22). - `experiments/` — эмпирика «Полигона»: `00-provider-quirks` (читать перед любым вызовом провайдера), `01-token-calibration`, `02-refusal-benchmark`, `03-local-stand`, `04-editor-quality`, `06-local-extraction`, `07-coverage-precision`, `08-cost-model-v2` (актуальная денежная модель), `09-pilot-protocol` (пилот Ф2.5 + поправки D13), `10-explicit-benchmark` (18+ violence-рука канала B), `11-erotica-benchmark` (erotica по трём парам/регистрам — закрытие D14.4, D22).
- `research/` — фактура исследований 0405.07: `0110` базовые, `11-gap-*` добор критиком, `12-*` режимы отказа/отзывы/таксономии (+ два внешних материала с провенанс-шапками), `13` валидация памяти, `14` адаптивная память, `15` голос и состояние (принят, D21), **`16` ридер-IDE (принят с ревью-шапкой, D29)**, **`17` внешняя критика GPT-5.6 (принят с ревью-шапкой, D25)** — у 16/17 читать шапку прежде тела. ⚠ Часть под superseded-баннерами (01/02/03/04/05/09 и gap-1/2/5) — **читай баннер прежде содержимого**. - `research/` — фактура исследований 0405.07: `0110` базовые, `11-gap-*` добор критиком, `12-*` режимы отказа/отзывы/таксономии (+ два внешних материала с провенанс-шапками), `13` валидация памяти, `14` адаптивная память, `15` голос и состояние (принят, D21), **`16` ридер-IDE (принят с ревью-шапкой, D29)**, **`17` внешняя критика GPT-5.6 (принят с ревью-шапкой, D25)** — у 16/17 читать шапку прежде тела. ⚠ Часть под superseded-баннерами (01/02/03/04/05/09 и gap-1/2/5) — **читай баннер прежде содержимого**.
- `PROGRESS.md`**журнал** (CURRENT-STATE сверху, ниже хронология; НЕ источник решений). - `PROGRESS.md`**журнал** (CURRENT-STATE сверху, ниже хронология; НЕ источник решений).
- **Активные хендофф-промты**: [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (роль оркестратора) · [`BACKEND_SANITIZER_FIX_SESSION_PROMPT.md`](BACKEND_SANITIZER_FIX_SESSION_PROMPT.md) (**2 обязательных фикса санитайзера D33.1 — гейтит пере-прогон**) · [`BACKEND_D152_SESSION_PROMPT.md`](BACKEND_D152_SESSION_PROMPT.md) (пакет D15.2: **этап А ✅ D33; Б реализация v3.1 + В экспорт/override — промт после пере-прогона**) · [`ACCEPTANCE_SESSION_PROMPT.md`](ACCEPTANCE_SESSION_PROMPT.md) (приёмка Ф1: **этап A ✅ D24; этап B заморожен D26**; следующий шаг — пере-прогон 25 глав flash+свзякой D33.6, предусловие из 5 пунктов) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (⚠ до-D30 хвост: сид-часть закрыта exp13, живо только D22.8-остаток — освежить/не запускать как есть). Закрытые (пакеты №35, erotica, «Голос», GPT-восхождение → r/17, ридер-IDE → r/16, exp12 → D30, **exp13 → D32**) — в `archive/prompts/`. - **Активные хендофф-промты** (пивот D35→D36, очередь «мерить→строить»): [`ORCHESTRATOR_SESSION_PROMPT.md`](ORCHESTRATOR_SESSION_PROMPT.md) (роль оркестратора) · [`POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`](POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md) (**СЛЕДУЮЩИЙ: эмпирика рычагов качества exp14 — нарезка×промпт + фронтир-диагностик + кривая нарезки, D36**) · fidelity re-gate `rerun/FIDELITY_REGATE_HANDOFF.md` (полигон, параллельно, D34.3) · [`POLYGON_PACKAGE4_SESSION_PROMPT.md`](POLYGON_PACKAGE4_SESSION_PROMPT.md) (**ОТЛОЖЕН, пилот-residual:** task-1 закрыт exp13/D32; открыты D22.6 судья-дублёр + D25.7 echo-кал + пилот-пре-рег + P4-хвост — НЕ для exp14, для пилота) · далее — бэкенд под доказанный ROI (стейдж Б/В D15.2 — СВЕЖИЙ промт после развязки; дизайн = спека v3.1). Закрытые в `archive/prompts/` (D36.1): research/18-ресёрчер→D36, exp13→D32, санитайзер-фикс→D33.1, приёмка v2-пере-прогон (цикл ЗАКРЫТ D35), D152-этап-А→D33, пакеты №35, erotica, «Голос», r/17, r/16, exp12→D30.
- `archive/` — закрытые сессионные промты (только история, инструкции оттуда не исполнять). - `archive/` — закрытые сессионные промты (только история, инструкции оттуда не исполнять).
## Статус (2026-07-12) ## Статус (2026-07-12, пост-пивот D35)
Фаза 0 ✅; Ф1-машинерия ✅ (пакеты №15 — D20D28); приёмка этап A ✅ (D24), этап B заморожен (D26). **exp12-диагностика принята (D30): «нечитаемо» = пассивный моно-редактор + сид + построчная вёрстка от промптов + нет санитайзера; дефекты смысла — в черновике. Ратифицированы: флип D1 (редактор БИЛИНГВ, supersede D17.в), reflow, output-санитайзер, глоссарий v2 (спорные — под подпись владельца), exp13 бейк-офф переводчиков.** Очередь: **бэкенд D15.2 (этап А гейтит пере-прогон) ∥ полигон exp13 → единый resnapshot → пере-прогон 25 глав кандидатом (re-gate верности обязателен) → чтение владельца → этап B.** Трек: дешёвые модели сейчас, фронтир потом (конфиг-первая архитектура — D30.7). Решающая точка — пилот Ф2.5; блокеры — билингв-якорь/аннотаторы ≥3 (D25.9-Q1), корпус, проба судьи-дублёра 18+ (D22.6). Ключ xAI: единый, data-sharing, off перед продом (D27). Фаза 0 ✅; Ф1-инфра ✅ (D20D28); приёмка этап A ✅ (D24). **Путь D26→D35 «качество-первым»:** флип D1 моно→БИЛИНГВ (D30), reflow + output-санитайзер (D30/D33), сид v2 подписан (D34), переводчик flash сохранён (exp13/D32). **Пере-прогон 25 глав связкой выполнен; вердикт владельца: «лучше, но крайне слабо художественно» (2 претензии: абзацы/конвенции + понимание связей).** **ПИВОТ D35:** цикл прогонов ЗАКРЫТ (инфра ✅/читаемость ❌ = не провал; диагноз «Ф2-недострой + near-term промпт/нарезка-рычаги, не баг» верифицирован). Планка = 2 претензии (интерим). Очередь «мерить→строить»: **ресёрч рычагов качества (research/18 Claude + ChatGPT — ждут ревью оркестратором) → полигон-эмпирика (нарезка×промпт + диагностик-фронтир-арм + fidelity re-gate) → бэкенд под доказанный ROI.** Вопрос эмпирики: потолок в дешёвых моделях или в нашей нарезке/промпте. Трек: дешёвые сейчас, фронтир потом (D30.7). Решающая точка — пилот Ф2.5; блокеры — билингв-якорь/аннотаторы ≥3 (D25.9-Q1), корпус, судья-дублёр 18+ (D22.6). Ключ xAI: единый, data-sharing, off перед продом (D27).
## Доступные ключи от моделей ## Доступные ключи от моделей
DEEPSEEK_API_KEY, ZAI_API_KEY, KIMI_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY, MISTRAL_API_KEY DEEPSEEK_API_KEY, ZAI_API_KEY, KIMI_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY, MISTRAL_API_KEY

View file

@ -1,9 +1,9 @@
# Журнал решений оркестратора — контракт D1D31 (развязки 04.07 · пост-ревью и пакеты 0910.07 · приёмка и качество-первым 1112.07) # Журнал решений оркестратора — контракт D1D36 (развязки 04.07 · пакеты 0910.07 · приёмка/качество-первым/пивот 1112.07)
> **КАРТА АКТУАЛЬНОСТИ (ревизия D31, 12.07; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Читая контракт целиком, держи под рукой, что чем перекрыто: > **КАРТА АКТУАЛЬНОСТИ (ревизия D31, 12.07; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Читая контракт целиком, держи под рукой, что чем перекрыто:
> - **Полностью superseded:** **D1 (моно-редактор) → D17 → D30.1 (редактор БИЛИНГВ)** · D9 (ja-приёмка) → D18 (蛊真人 zh→ru; ja — второй прогон) · D17 → D30.1 · скобка D19.4 «ключ без data-sharing» и D20.3 «чистый ключ = блокер пилота» → **D27** (единый ключ С data-sharing, отключение перед продом) · exp04-дефолт «editor grok-4.3» (D3) → D30.1 (grok reasoning-off из редакторских ролей СНЯТ — no-op; кандидат glm-5-билингв; gemini — премиум-эскалация только за санитайзером D30.3). > - **Полностью superseded:** **D1 (моно-редактор) → D17 → D30.1 (редактор БИЛИНГВ)** · D9 (ja-приёмка) → D18 (蛊真人 zh→ru; ja — второй прогон) · D17 → D30.1 · скобка D19.4 «ключ без data-sharing» и D20.3 «чистый ключ = блокер пилота» → **D27** (единый ключ С data-sharing, отключение перед продом) · exp04-дефолт «editor grok-4.3» (D3) → D30.1 (grok reasoning-off из редакторских ролей СНЯТ — no-op; кандидат glm-5-билингв; gemini — премиум-эскалация только за санитайзером D30.3).
> - **Частично амендировано:** D3 (канал B → D14.1/D19.1 + оговорки D22.5/D22.6; апекс-слаг `-preview` — D22.4; draft под вопросом exp13 — D30.6) · D6 («off/minimal для draft/edit» эродирован: draft thinking-ON принудительно, editor-off снят D30.1; живы per-роль принцип и D6.2-буфер) · D10 (+D24.2 alias-слепое пятно, истинная консистентность ≈99.5%) · D11-числа → exp08 → **D30.4** (флип D1 = +1525%, ~$0.85/ранобэ; «$1.52» = неподписанная опция Б) · D12 (+D24.3 флоры max_tokens; +D29.1в rollup — амендмент вердикт-правила) · D13.1-арм из решающего → ПОДТВЕРЖДАЮЩИЙ (D30.1); +D25.3 prefix-анализ судьи · D14.2 закрыт D19.1/D22.4; D14.4 закрыт D22.1 · D15.3 исполнен; спека D15.2: v2→v3→v3.1 (D22.2), реализация = текущий пакет (D30.9) · D24.4 +D28.1 (precision/recall-трейдофф; hard-gate требует пере-замера) · порядок D24.5 отложен D26.1 (этап B — после читаемых 25 глав). > - **Частично амендировано:** D3 (канал B → D14.1/D19.1 + оговорки D22.5/D22.6; апекс-слаг `-preview` — D22.4; draft под вопросом exp13 — D30.6) · D6 («off/minimal для draft/edit» эродирован: draft thinking-ON принудительно, editor-off снят D30.1; живы per-роль принцип и D6.2-буфер) · D10 (+D24.2 alias-слепое пятно, истинная консистентность ≈99.5%) · D11-числа → exp08 → **D30.4** (флип D1 = +1525%, ~$0.85/ранобэ; «$1.52» = неподписанная опция Б) · D12 (+D24.3 флоры max_tokens; +D29.1в rollup — амендмент вердикт-правила) · D13.1-арм из решающего → ПОДТВЕРЖДАЮЩИЙ (D30.1); +D25.3 prefix-анализ судьи · D14.2 закрыт D19.1/D22.4; D14.4 закрыт D22.1 · D15.3 исполнен; спека D15.2: v2→v3→v3.1 (D22.2), реализация = текущий пакет (D30.9) · D24.4 +D28.1 (precision/recall-трейдофф; hard-gate требует пере-замера) · порядок D24.5 отложен D26.1 (этап B — после читаемых 25 глав).
> - **Живое ядро без изменений:** D2 (+новый гейт-класс D30.3), D4, D5, D7, D8, D10-механизм, D12-таксономия отказов, D16, D18, D19.119.2, D21 (Ф2-механизмы voice/address/reveal), D22.522.7, D23 (golden = инвариант №8), D24D31 — действующая голова контракта. > - **Живое ядро без изменений:** D2 (+новый гейт-класс D30.3), D4, D5, D7, D8, D10-механизм, D12-таксономия отказов, D16, D18, D19.119.2, D21 (Ф2-механизмы voice/address/reveal), D22.522.7, D23 (golden = инвариант №8), D24D36 — действующая голова контракта (D35 = пивот качество-первым; D36 = приёмка research/18 + промт полигон-эмпирики).
Ответ на вопросы бэкенд-сессии (PROGRESS §«Вопросы от бэкенда», §«[НУЖНО РЕШЕНИЕ] перед Фазой 1» — с ревизии D31 в `archive/PROGRESS-2026-07-04-10.md`) и полигона (think-режим). Каждое решение прошло адверсариальную панель из 3 критиков (research / экономика / исполнимость в коде Фазы 0); ни одно не отклонено, все уточнены. Это **контракт Фазы 1** — бэкенд исполняет отсюда; при конфликте с буквой 01-decisions/02-mvp-plan — источник истины здесь (потом сольём в основные доки). Ответ на вопросы бэкенд-сессии (PROGRESS §«Вопросы от бэкенда», §«[НУЖНО РЕШЕНИЕ] перед Фазой 1» — с ревизии D31 в `archive/PROGRESS-2026-07-04-10.md`) и полигона (think-режим). Каждое решение прошло адверсариальную панель из 3 критиков (research / экономика / исполнимость в коде Фазы 0); ни одно не отклонено, все уточнены. Это **контракт Фазы 1** — бэкенд исполняет отсюда; при конфликте с буквой 01-decisions/02-mvp-plan — источник истины здесь (потом сольём в основные доки).
@ -422,6 +422,59 @@ D1 остаётся дефолтом Фазы 1 (менять конфигура
Мини-сессия по `BACKEND_SANITIZER_FIX_SESSION_PROMPT.md`. Верификация исполнением (сфокусированный агент в scratchpad-копии, все 6 осей): **ACCEPT, залендено.** (а) хвостовой класс теперь ловит «Основные правки для справки:» (gemini-утечка A5/5_1) + colon-вариант, НЕ фаерит нарратив «Основные правки внёс редактор» — 2 fire + 1 clean-пин; (б) класс «битые словоформы» СНЯТ целиком (backend-разбор: порог не отделяет «около колонны» от «Первок предок», у реального доля перекрытия даже ниже; канонический дефект и так не ловился → умнее убрать шумный класс, чем подкручивать), оставлены 2 zero-FP сигнатуры (невалид ь/ъ, кир+лат гомоглиф) — 3 clean-пина «около колонны/колодца», «стало талой»; мелочи D33.2 (# # #-разделители, латиница-бренды) сужены. Golden re-capture — дифф-класс РОВНО version-fold (sanitizer-v1→v2; маскированный дифф пуст, 0 дрейфа disposition/flag/final_text/cost/postcheck/injected_ids/term-order, 206=206, регенерация байт-в-байт). build/vet/test-race зелёные, скоуп 3 файла + журнал, stdlib-only, контрабанды нет. **Принятая граница (документируется рядом с recall-gap «Первок предок»):** строка-ОПЕНЕР абзаца «Основные правки … для справки предоставил …» ещё фаерит — редакторский регистр, не проза; неизбежная поверхность «для справки»-гейтящей сигнатуры (снять = потерять целевую gemini-утечку); precision-over-recall → редкий FP деградирует один чанк, не портит выход. **Санитайзер как блокер пере-прогона снят** (D33.6-предусловие №1 закрыто); остаётся сид v2-финализация (полигон) + единый resnapshot. Мини-сессия по `BACKEND_SANITIZER_FIX_SESSION_PROMPT.md`. Верификация исполнением (сфокусированный агент в scratchpad-копии, все 6 осей): **ACCEPT, залендено.** (а) хвостовой класс теперь ловит «Основные правки для справки:» (gemini-утечка A5/5_1) + colon-вариант, НЕ фаерит нарратив «Основные правки внёс редактор» — 2 fire + 1 clean-пин; (б) класс «битые словоформы» СНЯТ целиком (backend-разбор: порог не отделяет «около колонны» от «Первок предок», у реального доля перекрытия даже ниже; канонический дефект и так не ловился → умнее убрать шумный класс, чем подкручивать), оставлены 2 zero-FP сигнатуры (невалид ь/ъ, кир+лат гомоглиф) — 3 clean-пина «около колонны/колодца», «стало талой»; мелочи D33.2 (# # #-разделители, латиница-бренды) сужены. Golden re-capture — дифф-класс РОВНО version-fold (sanitizer-v1→v2; маскированный дифф пуст, 0 дрейфа disposition/flag/final_text/cost/postcheck/injected_ids/term-order, 206=206, регенерация байт-в-байт). build/vet/test-race зелёные, скоуп 3 файла + журнал, stdlib-only, контрабанды нет. **Принятая граница (документируется рядом с recall-gap «Первок предок»):** строка-ОПЕНЕР абзаца «Основные правки … для справки предоставил …» ещё фаерит — редакторский регистр, не проза; неизбежная поверхность «для справки»-гейтящей сигнатуры (снять = потерять целевую gemini-утечку); precision-over-recall → редкий FP деградирует один чанк, не портит выход. **Санитайзер как блокер пере-прогона снят** (D33.6-предусловие №1 закрыто); остаётся сид v2-финализация (полигон) + единый resnapshot.
## D34. Сид v2 ПОДПИСАН владельцем + гейт repoint приёмочного конфига перед пере-прогоном (12.07, оркестратор). ✅
Полигон сдал сид v2 под подписью владельца (закрытие D32.2/D30.5). Сверено прямой проверкой файла (`guzhenren-seed-v2.yaml`): все спорные → approved с ФАКТИЧЕСКИМИ формами владельца (часть переопределена против sign-off-таблицы — решения владельца, в протокол):
1. **Владельческие формы (инвариант — в D-лог как факт):**
- 人祖 → **Жэнь Цзу** (НЕ «Первопредок»; транслит).
- 花酒行者 → **Монах Цветочного Вина** (НЕ «Странник Цветов и Вина»/«Винный Странник»).
- 本命蛊 → **гу Жизни** (возврат к v1; НЕ «жизненный гу»).
- 古月山寨 → **деревня Гуюэ** (+ выровнены 白家寨/熊家寨 → «деревня Бай/Сюн» ради консистентности 寨).
- 元石 → **первобытный камень** (+мн.ч.; НЕ «изначальный»/«первокамень»).
- Подтверждены без изменений: 蛊虫 гу-червь · 修炼/修行 культивация · 空窍 апертура · 元海 море истинной ци.
- Род свободного «гу» (蛊) → **мужской** (владелец принял; документарно — 蛊 инвариантен, НЕ на hot-path A3 → не hard-constraint, согласование мягкое).
Провенанс: `eval/exp13_seed_signoff.py` (воспроизводимый трансформ) + лог `diag/glossary_v2_signoff_applied.md`. 10 оставшихся draft — не-спорные v1-остатки (甲乙丙丁 разряд А–Г, 南疆 Наньцзян, 沈嬷嬷, пара гу-имён) — инъектятся ⟨проверить⟩ (soft), resnapshot не держат; смести отдельным проходом при желании владельца (не блокер).
2. **⚠ ГЕЙТ: приёмочный конфиг РАССИНХРОНЕН — repoint ОБЯЗАТЕЛЕН до пере-прогона** (поймал полигон, подтверждено прямой сверкой). `acceptance/book.yaml``glossary_seed: guzhenren-seed.yaml` (сид **V1**); `pipeline-acceptance.yaml``prompt_version: v0-draft/v1-monolingual` (**моно-редактор, БЕЗ reflow** — до-D30 состояние). Наивный `--resnapshot` на нём тихо заснапшотит СТАРЫЙ сломанный конфиг → весь пере-прогон впустую (класс «тихо неправильный снапшот», F1/D15). **Требование к пере-прогону (в ACCEPTANCE-промт, усилено):** первый шаг сессии — ПЕРЕСОБРАТЬ приёмочный конфиг из БОЕВОГО `pipeline-c1.yaml` @HEAD (post-D33: draft=deepseek-v4-flash `v1-reflow`, editor=glm-5 `v2-bilingual-reflow`, escalate_to=deepseek-v4-pro, sanitizer.enabled=true) + book-side дельты: `book.yaml glossary_seed → guzhenren-seed-v2.yaml`, `escalation.budget_usd>0` (D22.11). **Свежий store** (новая БД — избежать stale-чекпоинтов старого прогона; «единый resnapshot» = все правки в одном новом снапшоте, НЕ --resnapshot старого). Промпты/пороги НЕ трогать — брать из pipeline-c1.
3. **Fidelity re-gate (D30.1, закрытие вакуума D1.1) — НЕЗАВИСИМЫМ судьёй.** Пере-прогон переводит; **fidelity re-gate гонит ПОЛИГОН** (не сессия-переводчик — author≠reviewer): span-цитирующий судья верности reasoning-ON + охота на класс инверсий правки (exp12: билингв-редактор внёс «пожертвуй мной»). Без него пере-прогон НЕ засчитан.
4. **Гейт пере-прогона СНЯТ по всем блокерам:** санитайзер-фикс (D33.1) ✅, сид v2 подписан (D34.1) ✅, переводчик flash (D32) ✅, эскалация не тронута ✅. Осталось: repoint конфига (D34.2, делает сессия пере-прогона первым шагом) → пере-прогон 25 глав связкой с re-gate → **чтение владельца** (арбитр читаемости).
## D35. Пивот после пере-прогона: цикл прогонов закрыт (инфра ✅/читаемость ❌ = не провал), планка = 2 претензии владельца, «мерить→строить» (12.07, оркестратор). ✅
Владелец прочитал пере-прогон 25 глав связкой (flash `v1-reflow` → glm-5 `v2-bilingual-reflow` + сид v2 + reflow + санитайзер): **«лучше (из-за сида), но крайне слабо художественно»** — 2 претензии: (1) нет логической редактуры абзацев / конвенций русского; (2) места, где модель не понимает связей/смысла. Внешнее ревью (3 оси исполнением по копии re-run store + логам/выходам; одна ось упала на форматировании, факты закрыты соседними). **Конфиг-корректность подтверждена (снапшот несёт v1-reflow/v2-bilingual-reflow/сид-v2 — НЕ старая моно-мина D34.2 → вердикт валиден).** Решения:
1. **Диагноз ПОДТВЕРЖДЁН исполнением: «слабо» — настоящий недострой машинерии качества (Ф2) + near-term промпт/нарезка/глоссарий-рычаги, НЕ тихий баг.** Все баг-гипотезы опровергнуты: reflow ПРИМЕНЁН (блочные абзацы 1.6 предл./строка, не построчно этапа A — но ЗЕРКАЛИТ рубленость исходника, не сливает в русские абзацы = промпт-рычаг, фиксимо сейчас); билингв-редактор АКТИВЕН (draft→final sim 0.643, 34/55 сильно правлены — не пассивен как моно exp12); сид v2 инъектится (628 хитов; Монах Цветочного Вина/гу Жизни/первобытный камень в выходе). Различие полигона **внутри-чанк (промпт-фиксимо: чанк пакует ~34 абзаца) / кросс-чанк (~1.28 стыка/глава = Ф2)** — эмпирически верно. **Флор D24.3 валидирован в проде** (эхо-эскалация ch16/0 → pro@max_tokens=8000 → реальный результат 5966 симв., не пустышка/length — прод-подтверждение фикса пакета №5).
2. **РАТИФИЦИРОВАНО (а) закрытие цикла приёмочных прогонов** — инфра ✅ (деньги D15.3-направление, kill-9, echo-эскалация, санитайзер 2TP/0FP, spine 25/25) / читаемость ❌ (блок на непостроенной Ф2) = **НЕ провал** (инфра — переиспользуемая ценность); идентичный пере-прогон = 0 decision-relevant информации (потолок структурный, стохастичный ре-дро не двигает). **(б) планка приёмки впредь = 2 претензии владельца** — но **ЯВНО ИНТЕРИМ пре-скрин** («лучше фана», D30.7), НЕ вердикт пилота Ф2.5 (D25.2-гейт: диагностики не подменяют/не разбавляют пилот; ≥3 аннотатора + билингв-якорь по-прежнему гейтят настоящий вердикт). **(в) последовательность «ты→ресёрчер→полигон→бэкенд» (мерить→строить)** — Р2/эмпирика-первой; бэкенд строит только под доказанный полигоном ROI.
3. **Ключевой невыжатый рычаг подтверждён: ось «нарезка × промпт»** — (глава целиком | чанк) × (сильный дискурс-промпт | текущий) — exp04/12/13 её НЕ крутили (варьировали только МОДЕЛЬ в фикс-нарезке; reflow-промпт уже вшит). Дешёвая высокоценная проба. **Фронтир-арм (владелец согласовал трату)** — ДИАГНОСТИКА потолка (модели vs наша нарезка/промпт), D30.7-совместимо (не прод-обязательство).
4. **РЕАЛЬНЫЕ фиксы до качественной работы:** (а) **[major] экспорт-баг:** санитайзер-флагнутые чанки экспортятся ПУСТЫМИ (ch5/0, ch20/0 — ~44% зачина глав 5/20 молча выпали; текст правки цел, дефектен только ведущий `###`). Фикс: экспорт стрипает ведущий заголовок ИЛИ фолбэк на draft, НЕ дропает (бэкенд-fix-лист; связано с D29.1а export-нормализация). **Полигон ОБЯЗАН исключить/починить ch5/ch20 до слепых пакетов** (дыры спутают художественную оценку). (б) заголовок `###` рождается в ЧЕРНОВИКЕ deepseek (не glm-5 — атрибуция минор-бэклога исправлена) → фикс целить в translator.md/экспорт. (в) дешёвый глоссарий: засидить разряд 甲乙丙丁/资质 (raw-китайский в ch4/1 = видимый худ-дефект; часть претензии 2 глоссарий-адресуема, не Ф2). (г) **fidelity re-gate (D34.3) остаётся ЖЁСТКИМ гейтом** — не waived под «цикл закрыт»; квантифицирует претензию 2 + ловит инверсии активного редактора (ch11/0 аутлайер: редактор расширил 3009→4631 при draft finish=stop, sim 0.064 — вопрос верности).
5. **Промт ресёрчера — НЕЙТРАЛЬНЫЙ (анти-анкоринг D25.10):** ревью поймало, что §3 хендоффа встраивает наши выводы (лестница Ур.3 draft=чанк/edit=глава, рамка «без Ф2») при декларации анти-анкоринга — ровно D25.10-ловушка. Промт (`RESEARCHER_QUALITY_SESSION_PROMPT.md`) даёт только 2 претензии + сырьё/код, спрашивает ОТКРЫТО (на какой гранулярности/промпте работает дискурс-литперевод zh→ru, где потолок, что рекомендует фронтир/академия/MTL-прайор-арт для кросс-чанк переверстки + понимания связей); наши гипотезы (лестница, draft=чанк) — НЕ выдавать, ресёрчер фиксирует свою рамку ПЕРВЫМ.
6. **Промт полигона (после отчёта ресёрчера) — эмпирика:** ось нарезка×промпт (прямыми вызовами, чанк-арм воспроизводит прод-инъекцию как якорь), фронтир-арм (гарды: эхо-скрин/исключить grok на архаичной ch1 — D22.5; self-family exclusion для фронтир-мета-ревьюера; per-call кап + пре-регистрация — exp13 перерасход +10%), кривая размер-чанка↔качество↔биллинг↔ретраи, fidelity re-gate, слепые пакеты владельцу; методика-guard D32.4 (fidelity-first, leave-one-out, катастроф-скрин, per-call кап, независимость сигналов). Fidelity re-gate (`rerun/FIDELITY_REGATE_HANDOFF.md`) — независим от ресёрчера, полигон может гнать параллельно.
7. **Бэкенд (§5 хендоффа) — не сейчас, только под доказанный ROI.** Кандидаты: развязка `draft=чанк/edit=глава` (Ур.3 — **runner-уровень**: per-stage гранулярность + TM/resume-ключ, Р2/Р6), сильный дискурс-промпт, адаптив-к-главе размер, затем Ф2 (аннотатор/судья/reference-тома). Минор-бэклог: экспорт-`###`-нормализация (D29.1а), 修炼/修行→«культивация» (владелец подписал D34.1 — намеренно).
## Сопутствующие правки доков (оркестратор, 09.07) ## Сопутствующие правки доков (оркестратор, 09.07)
`02-mvp-plan.md` → v3 (мёртвые пороги/интерим-18+/фазовые списки синхронизированы с D-логом); обе `*.puml` → v3 (убраны Opus/BYOK/«≤2×», дорисованы ре-гейт эскалации, три класса отказов D12, человек в петле, фазовые пометки); superseded-баннеры на `research/01, 02, 03, 04, 09`; провенанс-шапки на `research/12-architecture-as-antipattern.md` и `12-common-failures.md` (происхождение не зафиксировано — до уточнения владельцем числа оттуда не абсорбировать как факты); закрытые промты → `docs/archive/prompts/`; онбординг: корневой `CLAUDE.md` + `backend/README.md` + `eval/README.md`. `02-mvp-plan.md` → v3 (мёртвые пороги/интерим-18+/фазовые списки синхронизированы с D-логом); обе `*.puml` → v3 (убраны Opus/BYOK/«≤2×», дорисованы ре-гейт эскалации, три класса отказов D12, человек в петле, фазовые пометки); superseded-баннеры на `research/01, 02, 03, 04, 09`; провенанс-шапки на `research/12-architecture-as-antipattern.md` и `12-common-failures.md` (происхождение не зафиксировано — до уточнения владельцем числа оттуда не абсорбировать как факты); закрытые промты → `docs/archive/prompts/`; онбординг: корневой `CLAUDE.md` + `backend/README.md` + `eval/README.md`.
## D36. Приёмка research/18 (два независимых отчёта рычагов качества) + выдача промта полигон-эмпирики (12.07, оркестратор №4). ✅
Оба отчёта (`research/18-quality-levers.md` — сессия-ресёрчер Claude, анти-анкоринг; `research/18-quality-levers-chatgpt.md` — параллельный ChatGPT, запущен владельцем) отревьюированы и залендены с ревью-шапками. Внешнее ревью — мультиагентный воркфлоу 26 агентов ($0, refute-by-default, author≠reviewer; первоисточники через web + реплика сырья `rerun/records.json`+`rerun-ru.txt`; заморозка §A сверена крипто).
1. **ВЕРИФИКАЦИЯ (исполнением/первоисточники):** (а) **§A-заморозка Claude sha256 `44f90364…` воспроизведена побайтно из закоммиченных байтов BEGIN..END → MATCH** → §A доказуемо не редактировалась после заморозки (мой самый сильный анти-ретро-подгон контроль). (б) **57/57 несущих цитат СУЩЕСТВУЮТ — 0 сфабрикованных**, включая ВСЕ «2026»-препринты (2601.08070/2605.31056/2605.29800/2605.13596/2605.13368/2511.09796 — резолвятся к заявленным заголовкам; главный риск галлюцинации фан-аута снят). 50/57 claim-fidelity полная, 7 «частично» (источник реален, атрибуция переисчерпана). (в) **Эмпирика воспроизведена:** ch5.0 (5425→ПУСТ `sanitizer_defect`)+ch20.0 ТОЧНО; CJK-утечка 13 финалов точно (draft-«21» включает U+3000-отступ → настоящих 9); 41/51 ~1:1 в допуске; ChatGPT-«95.3% строк-абзацев» точно (но частично артефакт формата — метрика Claude «медиана 1 предл./абзац» проб́ивнее); gl.7-инверсия/gl.8-сплющивание фактически ЕСТЬ (тяжесть — на fidelity re-gate). (г) **Ван Цуй (несущий вклад) ПОДТВЕРЖДЁН по ТЕЛУ статьи** (скептик-агент декодировал CID/Identity-H шрифт PDF ~42к симв.: 5 техник + причастные/деепричастные обороты + подчинение + прескриптивная необходимость; Вестник МГУ Сер.22 2024№3 с.86105, рецензирован).
2. **ВЕРДИКТЫ. Claude — ACCEPT_WITH_FIXES** (5 поправок в ревью-шапке, §A заморожена → правки в шапке+§E: [цитата] DocRepair-числа принадлежат D19-1081/1909.01383 не P19-1116 — числа ВСЕ верны; TransAgents двойная-метка PP/TACL; Z5 автор Dingxu Shi не Li&Thompson; [рамка] Ван Цуй = прескрипция ТЕХНИКИ zh→ru, не «связующая норма языка» — норму держат Розенталь/Правила-1956; «пост-черновая регрессия > 2 претензий» пере-возвышена — ярчайший кейс ch5-void = экспорт-баг, не порча смысла). **ChatGPT — ACCEPT** (цитатно-чист на всех спот-чеках, хеджирование дисциплинировано, §C — самый прямо-исполнимый скелет полигона; оговорки: §A-заморозка НЕ воспроизводима из документа (плейсхолдер вместо байт-маркеров) = дисконт на вес сходимости; §C4-гейт не ссылается на мандатный re-gate D34.3).
3. **«Тройная сходимость» — калибрована (не разворот, D25.10 взята честно).** Оговорка про общую внешне-лит-ногу присутствует; уточнения оркестратора: (а) вторая необъявленная общая нога — оба §A читали одно сырьё/код (совпадение по «изоляция чанков/инертный reflow» тоже не независимо); (б) цитатные базы двух отчётов почти НЕ пересекаются (~3 общие статьи) → где литература расходится, совпадение вывода сильнее; (в) ChatGPT-заморозку класть с дисконтом. Итог: карта «строить» держится, но не как «3 независимых голоса» — как «2 внешние карты (с общими ногами) ⟂ эмпирика команды».
4. **АБСОРБЦИЯ.** (а) **Ван Цуй-контент (5 техник + причастно-деепричастный инструмент) → в дискурс-reflow-промпт полигона** — прямой zh→ru ответ на вопрос владельца «конвенция языка, не стиль автора» (апгрейд research/16 «слияние дискреционно» → «слияние — требуемая переводческая операция, и КАК»). (б) **Экспорт-баг ch5/ch20 подтверждён двумя независимыми репликами** → усиливает бэкенд-fix D35.4a (не новый). (в) **CJK-утечка в ФИНАЛ (13 строк, вкл. 特产 ch8, 资质乙等-разряды ch4.1)** — часть внесена редактурой → цель детерм. reflow-постпроцессора (§C#4 «CJK-глиф=0») + глоссарий-засид 甲乙丙丁 (D35.4в). (г) слой «пакет конвенций пары» — идея в бэклог архитектуры (зона оркестратора/бэкенда), стройка под ROI.
5. **ВЫДАН промт полигон-эмпирики `POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`** (D36; ратифицирует §C обоих отчётов в исполнимый дизайн): скелет §C ChatGPT (P0-baseline → армы с фаза-тегами → пре-рег метрики/гейты → дерево решений) + графт из Claude (Ван Цуй-контент reflow-промпта, COGS-модель кириллица-фертильность/cache-ordering, привязка мандатного re-gate D34.3); **добавлены** недостающая ячейка `текущий-промпт × глава` (полный 2×2 нарезка×промпт — оба отчёта её не крутили) и явный чистый baseline; **ch5/ch20 исключены/чинятся до слепых пакетов** (дыры спутают худ-оценку). Гарды: fidelity-first, leave-one-out, катастроф-скрин, per-call кап (exp13 +10%), эхо-скрин/grok-off на архаичной ch1 (D22.5), self-family exclusion фронтир-мета-ревьюера, пре-регистрация до платных вызовов. Fidelity re-gate (D34.3) — параллельно, независимо.
6. **Курс не разворачивается.** research/18 — вход эмпирики, НЕ приговор; планка = 2 претензии владельца (ИНТЕРИМ пре-скрин, D35); пилот Ф2.5 остаётся решающей точкой и не разбавляется. Порядок: полигон-эмпирика → владелец читает результат → решение «дешёвый трек дотягивает / нужен фронтир / нужна Ф2» → бэкенд под доказанный ROI.
## D36.1 — Документационная гигиена + подтверждённые бюджеты ключей (12.07, оркестратор №4, по запросу владельца). ✅
1. **Заархивированы 5 спент/superseded промтов** в `docs/archive/prompts/` (git mv, история журнала/D-лога НЕ переписана — D23.3, только карта актуальности): ресёрчер research/18 (→D36), exp13 (→D32), санитайзер-фикс (→D33.1), **приёмка v2-пере-прогон** (цикл прогонов ЗАКРЫТ D35 — идентичный ре-прогон = 0 инфо), **D152-этап-А** (→D33; этап Б/В — СВЕЖИЙ промт после качественной развязки, дизайн-оф-рекорд = спека D15.2 v3.1). **НЕ архивирован `POLYGON_PACKAGE4_SESSION_PROMPT.md`** (проверка по запросу владельца): как сессия НЕ запускался; отработана только task-1 сид-мн.ч. (влита в exp13/D32); **residual ЖИВ и НЕ пуст — пилот/18+/echo-трек, ОРТОГОНАЛЬНО exp14:** D22.6 судья-дублёр (НАЗВАННЫЙ блокер пилота), D25.7 echo-калибровка, миграция `memory_eval` с gemini-2.5-flash (EOL 16.10), пилот-пре-рег (`09-pilot-protocol.md`), D21.9 P4 fidelity-хвост, D22.8-минорки. Оставлен активным как residual-трекер со статус-баннером; НЕ вносить в exp14 (разбавит SFW-пре-рег); переупакуется в пилот-преп-промт при активации пилота. **Активны:** `ORCHESTRATOR_*` + `POLYGON_QUALITY_EMPIRICS_*` (exp14) + `POLYGON_PACKAGE4_*` (пилот-residual, отложен). README-карта актуализирована; титул контракта D35→D36.
2. **Бюджеты ключей подтверждены владельцем (12.07):** OpenAI ~$9, Gemini ~€2.6, DeepSeek/ZAI(glm)/Kimi/xAI(grok)/Mistral ~$9 каждый; ДРУГИХ ключей нет; «полигон делает что нужно в этих рамках» → снимает блокер фронтир-`ceiling` из D36. **Импликация exp14:** Gemini-бюджет крошечный (€2.6, thinking = аддитив-биллинг) → фронтир-переводчик/редактор преим. **GPT-5** ($9); Gemini — экономно, лучше кросс-семейным мета-ревьюером (self-family exclusion); grok ($9) доступен, НЕ на архаичной ch1 (D22.5); Claude/Opus нет. Per-call predicted-cost кап + пре-рег остаются (exp13 +10% урок). Записано в промт полигона.

View file

@ -17,11 +17,18 @@
3. `backend/README.md` (инварианты, golden-гард, как гонять) + `00-provider-quirks.md` (шапка + строки редактора БИЛИНГВ/санитайзер) + `08-cost-model-v2.md` (читать через D30.4: ~$0.85/ранобэ). 3. `backend/README.md` (инварианты, golden-гард, как гонять) + `00-provider-quirks.md` (шапка + строки редактора БИЛИНГВ/санитайзер) + `08-cost-model-v2.md` (читать через D30.4: ~$0.85/ранобэ).
4. Материал: книга `/home/ubuntu/books/gu-zhenren/guzhenren-gb18030.txt`; **сид v2** (финализирован exp13); кандидат-конфиг пере-прогона (собран из пакета D15.2 + переводчик exp13). 4. Материал: книга `/home/ubuntu/books/gu-zhenren/guzhenren-gb18030.txt`; **сид v2** (финализирован exp13); кандидат-конфиг пере-прогона (собран из пакета D15.2 + переводчик exp13).
## ⚠ ШАГ 0 (ОБЯЗАТЕЛЕН — repoint конфига до любого прогона; D34.2)
Приёмочный конфиг этапа A **РАССИНХРОНЕН** с боевым (после D15.2): `acceptance/book.yaml` смотрит на сид **V1**, `pipeline-acceptance.yaml` несёт `v0-draft/v1-monolingual` (**моно-редактор, БЕЗ reflow**). Наивный `--resnapshot` тихо заснапшотит СТАРЫЙ сломанный конфиг → весь пере-прогон впустую. **Пересобери приёмочный конфиг из БОЕВОГО `backend/configs/pipeline-c1.yaml` (HEAD, post-D33) + book-side дельты, СВЕЖИЙ store (новая БД — не переиспользуй store этапа A):**
- `pipeline-acceptance.yaml` = байт-в-байт из `pipeline-c1.yaml`: draft `deepseek-v4-flash` **`prompt_version: v1-reflow`** `escalate_to: deepseek-v4-pro`; editor `glm-5` **`prompt_version: v2-bilingual-reflow`**; `gates.sanitizer.enabled: true`; `escalation.budget_usd > 0` (D22.11 — иначе echo-эскалация не стреляет). Промпты — из `backend/prompts/` (reflow+билингв, уже залёнжены).
- `book.yaml`: `glossary_seed → /home/ubuntu/books/gu-zhenren/guzhenren-seed-v2.yaml`; потолки `book_usd`/`day_usd` из этапности.
- Сверь исполнением: `tmctl status`/snapshot до прогона показывает `v1-reflow`/`v2-bilingual-reflow` + сид v2-хеш, НЕ старые. Только потом translate.
## Конфигурация пере-прогона (по контракту, не по вкусу) ## Конфигурация пере-прогона (по контракту, не по вкусу)
- **Стадии:** draft = **переводчик-победитель exp13** (интерим deepseek-v4-flash, thinking ON) → editor = **БИЛИНГВ (D30.1), кандидат glm-5-билингв** (gemini — премиум-эскалация ТОЛЬКО за санитайзером, течёт преамбулой; grok reasoning-off НЕ ставить — no-op); output-санитайзер включён; reflow-промпты (без «Сохраняй разбивку на абзацы»); сид v2. - **Стадии (= pipeline-c1 post-D33):** draft = **deepseek-v4-flash** (thinking ON; НЕ pro — D32) → editor = **glm-5 БИЛИНГВ** (D30.1; gemini — премиум-эскалация ТОЛЬКО за санитайзером; grok reasoning-off НЕ ставить — no-op); output-санитайзер enabled (вердикт-ось); reflow-промпты; сид v2.
- **Деньги:** `escalation.budget_usd > 0` (echo-эскалация); потолок книги/дня из этапности; ledger-числа сверять с D30.4 (~$0.85/ранобэ — не с до-флиповым exp08 $0.69). - **Деньги:** `escalation.budget_usd > 0`; ledger-числа сверять с D30.4 (~$0.85/ранобэ, билингв-вход +60% токенов редактора — не с до-флиповым exp08 $0.69).
- Гейты — дефолт конфига; санитайзер в вердикт-оси. Промпты/пороги менять НЕЛЬЗЯ (это уже сделано пакетом D15.2 — ты гонишь готовый снапшот). - Промпты/пороги/модели менять НЕЛЬЗЯ — брать из `pipeline-c1` (это уже сделано пакетом D15.2/D33; ты собираешь конфиг из боевого, не изобретаешь).
## Этапность (деньги по нарастающей, с чекпоинтом владельца) ## Этапность (деньги по нарастающей, с чекпоинтом владельца)
@ -36,7 +43,7 @@
3. **Санитайзер (новый, D30.3):** проверь, что он ловит классы exp12 (сервис-преамбула gemini, битые словоформы, латиница-врезки, markdown-`###`) и НЕ даёт ложных на чистом тексте; счётчик срабатываний в паспорт. 3. **Санитайзер (новый, D30.3):** проверь, что он ловит классы exp12 (сервис-преамбула gemini, битые словоформы, латиница-врезки, markdown-`###`) и НЕ даёт ложных на чистом тексте; счётчик срабатываний в паспорт.
**B. Качество стало читаемым (главная цель пере-прогона):** **B. Качество стало читаемым (главная цель пере-прогона):**
4. **Re-gate верности (ОБЯЗАТЕЛЕН — D30.1):** билингв-редактор мог купить гладкость ценой смысла. Span-цитирующий судья reasoning-ON (раздельно стиль/верность) + ручная охота на **класс инверсий правки** (exp12: A2 внёс «пожертвуй мной», «молва считал» — которых в черновике не было). «Гладко-неверное» не должно пройти молча (D1.1). Скаляр-судьи без спанов НЕ использовать (урок exp12). 4. **Re-gate верности (ОБЯЗАТЕЛЕН — D30.1/D34.3): гонит ПОЛИГОН независимым судьёй** (author≠reviewer — не ты-переводчик). Билингв-редактор мог купить гладкость ценой смысла. Span-цитирующий судья reasoning-ON (раздельно стиль/верность) + охота на **класс инверсий правки** (exp12: A2 внёс «пожертвуй мной», «молва считал» — которых в черновике не было). «Гладко-неверное» не должно пройти молча (D1.1). Скаляр-судьи без спанов НЕ использовать (урок exp12). Твоя часть — отдать финальные выходы полигону; **без пройденного re-gate пере-прогон НЕ засчитан**.
5. **Консистентность D10 ≥98%** по процедуре Р7/D10 — **методику приложи СКРИПТОМ** в артефакты (числа этапа A третьей стороной не воспроизводились — D24); учти **alias-слепое пятно** (D24.2: вложенный алиас внутри longest-match полного имени невидим флаггеру — гл.18/0 蛊真人); D10-флаггер теперь осмыслен (сид v2 + post-check union D24.4). 5. **Консистентность D10 ≥98%** по процедуре Р7/D10 — **методику приложи СКРИПТОМ** в артефакты (числа этапа A третьей стороной не воспроизводились — D24); учти **alias-слепое пятно** (D24.2: вложенный алиас внутри longest-match полного имени невидим флаггеру — гл.18/0 蛊真人); D10-флаггер теперь осмыслен (сид v2 + post-check union D24.4).
6. **Вёрстка:** замерь консистентность репараграфизации после reflow (D30.2) — 1:N на диалоге норма (Розенталь), описательное слияние слабее; парность абзацев src↔dst (метод research/16 §0 — пиновать определение абзаца). 6. **Вёрстка:** замерь консистентность репараграфизации после reflow (D30.2) — 1:N на диалоге норма (Розенталь), описательное слияние слабее; парность абзацев src↔dst (метод research/16 §0 — пиновать определение абзаца).
7. **Сэмплы владельцу:** слепые/удобочитаемые пакеты (тот же monitor-паттерн exp12, вне хостинга — копирайт) — оригинал + новый перевод + опционально старый этап A для контраста. 7. **Сэмплы владельцу:** слепые/удобочитаемые пакеты (тот же monitor-паттерн exp12, вне хостинга — копирайт) — оригинал + новый перевод + опционально старый этап A для контраста.

View file

@ -0,0 +1,45 @@
# Промт: сессия-РЕСЁРЧЕР — как дотянуть текущую фазу до минимально-художественного zh→ru (2026-07-12, D35.5)
---
## Кто ты и зачем
Ты — **независимый ресёрчер** TextMachine (Go-пайплайн издательского перевода вебновелл zh→ru дешёвыми LLM). Пере-прогон 25 глав реальной книги (蛊真人) дал владельцу вердикт: **«лучше, но крайне слабо художественно»**, с двумя претензиями:
1. **нет логической редактуры абзацев / конвенций русского** (текст рубленый, не собран в русские литературные абзацы);
2. **места, где модель не понимает связей/смысла** (провалы связности/понимания на дистанции).
Твоя задача — **ресёрч-доклад: как дотянуть ТЕКУЩУЮ фазу до минимально-художественного уровня**. Код не пишешь; отчёт — ВХОД эмпирической сессии полигона. Зона записи: `docs/research/18-quality-levers.md` + секция в `PROGRESS.md`. Ничего не коммитить (лендит оркестратор после ревью первоисточников — как research/15/16/17).
## ⚠ Анти-анкоринг (нарушение обесценивает работу — урок D25.10)
Смысл: если ты сначала прочтёшь ГИПОТЕЗЫ команды о фиксе, ты поедешь по нашей колее и пропустишь развилку. Поэтому свою карту решения строишь ДО знакомства с нашими выводами. Трёхфазный протокол:
### Фаза 1 — «Чистый лист» (§A отчёта, замораживается)
Читаешь ТОЛЬКО: (а) две претензии владельца выше; (б) СЫРЬЁ пере-прогона — исходник `guzhenren-gb18030.txt`, выходы `rerun/` (rerun-ru.txt, records.json) — чтобы видеть саму слабость; (в) МЕХАНИЗМ как есть — `backend/internal/pipeline/chunker.go` (как режем), `backend/prompts/translator.md` + `editor.md` (текущие промпты). **НЕ читаешь** наши решения/гипотезы: НЕ `05-decisions-log.md`, НЕ хендоффы, НЕ выводы приёмки о фиксах.
Построй СВОЮ карту «проблема → механизм» с собственным поиском литературы и индустрии (каждый факт — URL+дата; препринт ≠ peer-review; вендор-клейм ≠ замер). Обязательные оси (реши их СВОИМ путём):
- **Дискурс-уровень литперевода zh→ru:** на какой ГРАНУЛЯРНОСТИ (предложение/абзац/сцена/глава/окно) и с каким ПРОМПТОМ дискурсный литперевод реально работает? Где потолок — в моделях или в организации (нарезка/контекст/промпт)? Прайор-арт: как MTL-пайплайны (фан-стек, коммерческие, академические DelTA/TransAgents-класс) режут и переверстывают.
- **Претензия 1 (абзацы/конвенции):** что фронтир/академия рекомендуют для переверстки в целевые (русские) абзацные нормы — few-shot / CoT / negative-constraints / отдельный layout-пасс / что ещё?
- **Претензия 2 (понимание связей/смысла):** чем лечится провал связности на дистанции — чтение-вперёд / аннотатор / резюме / reference-контекст / более сильная модель? Что даёт максимум при минимуме стройки?
- **Кривые «размер чанка ↔ качество ↔ биллинг ↔ ретраи»:** теоретическая рамка (overhead↓ с размером vs retry-cost↑ и деградация literary-качества у слишком мелкой единицы) — для пре-регистрации полигона.
Плюс оси, которые мы могли не увидеть, — самая ценная часть. **Зафиксируй §A ДО фазы 2 и больше не редактируй** (это сейф от ретро-подгонки; §A хешируется/коммитится оркестратором до фазы 2 — оставь маркер).
### Фаза 2 — «Наш стек»
Теперь читаешь наши доки: `05-decisions-log.md` (карта актуальности + D26/D30D35), `research/15 §Промптинг литперевода` (уже есть — НЕ дублировать, ДОПОЛНИТЬ), `research/07`, exp04/12/13 (что уже мерили), `research/16` (ридер-IDE, парность абзацев). Реализация `backend/` — не аудируешь.
### Фаза 3 — «Дифф и рекомендации»
- **(а) Дифф:** что в твоей карте §A есть, а у нас нет / сделано иначе.
- **(б) Рекомендации таблицей** для полигона: {механизм → как измерить (какой арм/проба) → цена (токены/деньги/стройка) → ожидаемый эффект на какую претензию → фаза (можно-сейчас-без-Ф2 / нужна-Ф2)}. Явно разведи: что промпт/нарезка/глоссарий-адресуемо СЕЙЧАС vs что требует Ф2-машинерии.
- **(в) Где твой §A сошёлся/разошёлся с нашими гипотезами** (после чтения фазы 2) — честно, включая «команда угадала» и «команда упустила».
- **(г) Вопросы, на которые не хватило данных.**
## Deliverable
`docs/research/18-quality-levers.md`: §A (нетронутая карта фазы 1) · §B дифф · §C рекомендации-таблица (вход полигону) · §D вопросы. Каждый несущий клейм — вердикт (CONFIRMED/PLAUSIBLE/REFUTED) + URL/дата. Отчёт пройдёт адверсариальную верификацию оркестратора по первоисточникам.
## Дисциплина
- `.env` не читать; книгу/выходы в git-доки не цитировать длинно (≤15 слов, для иллюстрации). `/home/ubuntu/books/` тексты — read-only, не тащить в отчёт.
- Внешний веб-ресёрч — обязателен (WebSearch/WebFetch); вендор-клейм ≠ замер; препринт помечать.
- Не выдавай инженерную гипотезу за факт; «оптимальны ли промпты» — вопрос к замеру, не приговор.

View file

@ -0,0 +1,254 @@
# Эксперимент 14. Эмпирика рычагов качества zh→ru (нарезка × ПРОМПТ + фронтир-диагностика + кривая нарезки)
> **Статус:** полигон-сессия exp14 (D36, приоритет №1). Мандат — `docs/POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md` + D35/D36. Пре-скрин планки «2 претензии владельца» (ИНТЕРИМ, D35 — НЕ пилот Ф2.5). Смену дефолта ратифицирует ОРКЕСТРАТОР (D-блоком) — не эта сессия.
> **Зона:** `eval/` + этот файл + секция PROGRESS «Полигон» + курация глоссария (вне git). Бэкенд не трогаю (2 живые сессии; `git status` перед касанием дерева; стейджинг не нужен — не коммичу код).
> **Артефакты:** сэмплы/выходы/сырьё судей — `/home/ubuntu/books/gu-zhenren/exp14/` (ВНЕ git; в доке — только числа и цитаты ≤15 слов). Каждый платный скрипт персистит usage/cost (D30.10). Полигонное Python-зеркало ↔ Go: при расхождении верить Go.
---
## 0. Онбординг-факты (контракт, на которых стоит дизайн)
- **Триггер (D35):** пере-прогон 25 глав связкой (draft `deepseek-v4-flash` `v1-reflow` → editor `glm-5` `v2-bilingual-reflow` + сид v2 + reflow + санитайзер) → вердикт владельца **«лучше (из-за сида), но крайне слабо художественно»**: (1) нет логической редактуры абзацев / конвенций РЯ; (2) места, где модель не понимает связей/смысла. Диагноз «Ф2-недострой + near-term рычаги, НЕ баг» верифицирован исполнением.
- **Ключевая невыжатая ось (D35.3):** exp04/12/13 крутили только МОДЕЛЬ в фикс-нарезке с уже-вшитым reflow-промптом. **exp14 крутит нарезку × ПРОМПТ.**
- **Вход-ресёрч (D36):** `research/18-quality-levers.md` (Claude, ACCEPT_WITH_FIXES) + `research/18-quality-levers-chatgpt.md` (ACCEPT). Скелет протокола — из ChatGPT §C; содержание дискурс-reflow-промпта (5 техник Ван Цуй) + COGS-модель — из Claude §C. §A обоих заморожены до чтения стека; вывод «потолок скорее в ОРГАНИЗАЦИИ (нарезка/промпт/контекст), не в сырой дешёвой модели» — гипотеза к ЗАМЕРУ, не факт.
- **Механизм-как-есть** (`backend/prompts/{translator,editor}.md`, `chunker.go`): по-чанково draft → по-чанково bilingual edit; каждый чанк в ИЗОЛЯЦИИ; единственная кросс-чанк-память — глоссарий. Обе reflow-инструкции ПРИСУТСТВУЮТ в промптах и практически ИНЕРТНЫ (замер: медиана 1 предл./нарратив-абзац, ниже §1.3).
- **Провайдер-квирки (`experiments/00-provider-quirks.md`, обязательно):** deepseek thinking ON ВСЕГДА (эхо-мина; `disabled`→эхо на плотном CJK); gemini слаг ТОЛЬКО `gemini-3.1-pro-preview`, mandatory thinking, `additive_total`-биллинг, `PROHIBITED_CONTENT` неконфигурируем; grok reasoning-ON = аддитивный биллинг, **grok на архаичной ch1 — эхо-риск D22.5 (исключён из ch1-армов)**; glm thinking `{type:disabled}`; gpt-5 — `max_completion_tokens`, без `temperature`, `reasoning_effort`.
- **Уроки судейского слоя (exp12/13, мемо `eval-aggregation-no-manufactured-convergence`):** ложная «сходимость» ловилась ДВАЖДЫ. Судьи span-цитирующие, reasoning-ON, стиль/верность РАЗДЕЛЬНО, кросс-семейно (author≠reviewer, self-family exclusion), ≥3 повтора со свапом, leave-one-judge-out, катастроф-скрин к ПОБЕДИТЕЛЮ тоже, per-call кап (НЕ group-level — exp13 переоврал +10%). НИКОГДА не гейтить художественность на BLEU/COMET (zh→ru инверсия WMT24).
- **Fidelity re-gate (D34.3, `rerun/FIDELITY_REGATE_HANDOFF.md`) — гоню ПАРАЛЛЕЛЬНО, независимо** (§3 ниже). Пере-прогон НЕ засчитан до пройденного re-gate.
- **Харнес-факты (реплика eval/):** call-ядро — `refusal_bench.call_provider` (`eval/refusal_bench.py:151`); usage→$ с тремя reasoning-режимами `subset`/`additive`/`additive_total` (`exp13_translate.py:106`, ветвление по `models.yaml reasoning:`); цены — `backend/configs/models.yaml` (единственный источник, `prices_checked 2026-07-10`); токенайзеры — `tokenizers.Tokenizer.from_file` (`glm-4.6`, `deepseek-v3.2` присутствуют; `deepseek-v4`/`kimi-k2` — БЕЗ `tokenizer.json`, использую `deepseek-v3.2` как прокси BPE-семейства); реконструкция инъекции — `retrieval_state.injected_ids` + `exp12_blocks.py` (боевой блок не персистится, детерминированно пересчитывается); блайнд — seeded-shuffle + отдельный ключ-файл (`exp13_monitor.py`).
---
## 1. ПРЕ-РЕГИСТРАЦИЯ (заморожена коммитом ДО первого платного вызова — D30.10)
Всё в §1 зафиксировано до генерации армов и оценки. Промпты армов ЗАМОРОЖЕНЫ — никакого промпт-инжиниринга по ходу (урок exp04: сломанная слепота однажды уже дала дефолт-редактора). Path-scoped коммит: только этот файл.
### 1.0. Материал
**Срез:** те же 25 глав пере-прогона (`rerun/records.json`, 57 чанков; `source`/`draft`/`final`/`disposition`/флаги). Char-длины (замер): `source` min/медиана/max = **8 / 1639 / 1812**; `final` = **0 / 5015 / 6184** (0 = 2 обнулённых чанка).
**Исключено (экспорт-баг D35.4a):** **ch5.0 и ch20.0** — единственные `edit_flag='sanitizer_defect'`, `final`-длина = 0 (финалы пусты, спутают оценку). Если нужен их текст — edit-выход из checkpoints store (тело цело, дефект = ведущий `###`). ch16 — единственный `escalated=1` (эхо-эскалация flash→pro, RESCUED).
**1.0.1. Trap-набор (Ступень I — ЛОВУШКИ, размечены ДО генерации).** Поля `тип`/`chapter.chunk`/`supporting_span`(zh)/опустимый_смысл`/`P0-наблюдение`/`гейт`. Обязательны 2 места владельца (T1/T2, воспроизведены оркестратором фактически; входят и в fidelity re-gate).
| ID | Тип | ch.chunk | supporting_span (zh, ≤15 слов) | допустимый_смысл | P0-наблюдение (пере-прогон) | Гейт-класс |
|---|---|---|---|---|---|---|
| **T1** | (c) внутри-чанк, **КАТАСТРОФА** | 7.0 | `古月族人没有一个不知道的` | все/каждый в роду Гуюэ ЗНАЛИ это предание (двойное отрицание = «нет ни одного, кто не знал») | «не знал в роду Гуюэ **ни один человек**» = НИКТО не знал — **инверсия полярности** (дефект в черновике, редактор НЕ починил) | любая инверсия участника/действия = дисквалиф. независимо от ранга |
| **T2** | (c) внутри-чанк + глава, chengyu | 8.0 (заглавие) + 8.1 | `物是人非` | контраст «вещи/места прежние — люди уже не те» (物是 «вещи те же» + 人非 «люди иные») | заглавие гл.8 и тело → «**Всё изменилось**» — сплющено, потерян контраст 物是 | потеря смыслового атома (половина идиомы) |
| **T3** | (a) абзацы (нарратив-слияние) | 10.0 | прогон подряд идущих однопредложенческих нарратив-строк (один непрерывный ход) | слить в ≤2 многопредложенческих русских абзаца | ~1:1 строка→абзац (43 строки → 43 абзаца; reflow добавил разделители, НЕ слил) | нельзя «побеждать» только МЕНЬШИМ числом абзацев |
| **T4** | (b) диалог-конвенция (**КОНТРОЛЬ/регресс-гард**) | 9.0 | обмен репликами 1:N (слова автора + реплики дядя/тётя/Фан Чжэн) | реплики с «—», слова автора в своём абзаце (Розенталь) | P0 в целом **КОРРЕКТНО** (диалог-тире работает; атрибуция на месте) | арм НЕ должен СЛОМАТЬ то, что P0 сделал верно |
| **T5** | (d) кросс-граница, **prev-supported** | 24.0→24.1 | 24.1 откр.: `这当然不是他的肌肤本色,而是一种铜皮蛊的效果` | «это [бронзовый цвет кожи наставника, описан в 24.0] — не природный, а эффект гу медной кожи» | chunk-изолированный редактор 24.1 не видит антецедент «这/他的» (в 24.0) | perturbation: correct-prev vs shuffled-prev не должен совпасть |
| **T6** | (d) кросс-граница, **prev-supported #2** | 11.0→11.1 | 11.1 откр.: `那隐藏在暗处的人马,见到沈翠这般出来` | «те, кто прятался в засаде [люди舅父/舅母, введены в 11.0], увидев так вышедшую Шэнь Цуй…» | «那…人马» без введения в изолированном 11.1 | perturbation (как T5); prev-support робастность |
**Оговорка (честная):** чистого **next-supported / катафора**-трапа в раннем срезе (гл.225, ранняя арка деревни) не нашлось дёшево — кросс-граница здесь prev-доминирована (T5/T6). Next/chapter-support факторизуется частично: T2 несёт chapter-supported измерение (полный вес 物是人非 раскрывается сменой отношений братьев по главе), gl.7-легенда (T1) полно рассказана в гл.13. Ограничение логирую; ±1-абляция next-плеча всё равно гонится (может не дать лифта на этих трапах — это валидный результат).
**1.0.2. Главы для Ступени II (слепое чтение владельца — 3 чистые главы разной диалого-плотности).** Отбор детерминированной формулой (как exp12 §1.1: `D` = доля символов внутри «“…”» от не-пробельных; high/mid/low), из **чистых** глав (все чанки `disposition=ok`, `postcheck_miss=0`, `style_flags=0`, 0 flagged/escalated), исключая **ch1 (архаика), ch5, ch20**. Заморожены:
| Регистр | Глава | `D` (замер) | реализованный характер | чанков |
|---|---|---|---|---|
| нарратив/низкий диалог | **гл. 19** | 0.061 | почти без прямой речи | 2 |
| смешанный (медиана) | **гл. 17** | 0.246 | нарратив + диалог | 2 |
| диалого-плотный (high) | **гл. 18** | 0.440 | самая чистая высоко-диалоговая глава | 3 |
`D` — детерминированно (`exp14_material.py dialogue_D`, доля символов в «“…”»), $0 до генерации; при равенстве — меньший номер главы. Гл.9/12 плотнее по диалогу, но несут по 1 минорному `postcheck_miss`/`style_flag` → взяты чистые.
**1.0.3. Trap-чанки (Ступень I — все армы гоняются на этом объединении):** {7.0, 8.0, 8.1, 9.0, 10.0, 11.0, 11.1, 24.0, 24.1} = **9 чанков** (T5/T6 требуют обоих чанков главы для кросс-граничной опоры).
**1.0.4. Реконструкция глоссарий-инъекции (rig-фиделити, как exp12 A1).** Боевой блок инъекции НЕ персистится — детерминированная функция (сид v2 + нормализованный чанк). Воспроизвожу из `retrieval_state.injected_ids` (JSON-массив композит-ключей `src\x1fsense\x1fsince\x1funtil`) приёмочного store + `guzhenren-seed-v2.yaml` (57 терминов, 47 approved/10 draft, `status` гейтит):
- **Editor-блок** (`renderEditorConstraintBlock`): заголовок «КАНОНИЧЕСКИЕ ПЕРЕВОДЫ имён и терминов (…приводи к ним любые расхождения, склоняя по контексту…):», далее `- «dst»` (dst-only, CONFIRMED/approved-only, dedup по dst).
- **Translator-блок** (`renderGlossaryBlock`): заголовок «ГЛОССАРИЙ (…):», далее `src → dst`, ambiguous → суффикс `⟨проверить⟩`.
- Layout: `system(стабильный префикс, CacheBoundary) → system(инъекция) → user` (`render.go:174 MessagesWithInjection`). Верификация: реконструированный `injected_ids` побайтно = store per-chunk. Sticky-инерция (n_sticky) — union chunk0chunk1 внутри главы (как exp12).
### 1.1. Армы — ось НАРЕЗКА × ПРОМПТ (полный 2×2 — мандат D36) + аблации
Прямые вызовы, ручная упаковка (НЕ через прод-пайплайн). Дешёвый прод-микс (draft `deepseek-v4-flash` thinking-ON @temp 0.3 → editor `glm-5` билингв @temp 0.4, thinking-disabled) — якорь. Brief-vars из `rerun/book.yaml`: source_lang=zh, target_lang=ru, genre=вебновелла, audience=взрослые читатели вебновелл, title=蛊真人, honorifics=keep, transcription=palladius, **venuti=0.6**, footnotes=minimal. floor `max_tokens`=8000 (D24.3). Черновик держу общим для editor-армов (варьируем editor-стадию), кроме армов, где нарезка/промпт меняет и черновик.
| Арм | Нарезка | Промпт (editor) | Черновик | Смысл | Источник/цена |
|---|---|---|---|---|---|
| **P0 baseline** | чанк (прод 1.5k) | ТЕКУЩИЙ прод `v2-bilingual-reflow` | flash `v1-reflow` | Нулевая точка обеих претензий (= пере-прогон на trap-наборе) | **`records.json` reuse, $0** (rig-фиделити A1) |
| **P1a** | чанк | **сильный дискурс-reflow** (§1.2) | тот же flash-draft | Промпт-рычаг при фикс-нарезке | glm-5 live |
| **P1b** | **глава целиком** | ТЕКУЩИЙ прод | flash-draft главы (склеен) | ⚠ ячейка, которую НИ ОДИН отчёт не крутил — «бо́льшая единица САМА помогает без нового промпта?» | glm-5 live |
| **P1c** | глава целиком | сильный дискурс-reflow | flash-draft главы | Верхняя near-term точка нарезка+промпт | glm-5 live |
Аблации (на базе P1a, чанк-нарезка; ChatGPT §C2):
- **A-layout — draft-layout ablation:** перед editor заменить пустые строки/построчную разбивку draft на нейтральные сепараторы ИЛИ пронумерованные смысловые атомы (финал удаляет ID) → изолирует ЯКОРЕНИЕ редактора на форме черновика. Победа = дешёвый ПРОД-МИНОР (не менять нарезку).
- **A-2pass — semantic-first vs combined:** один combined-editor (=P1a) против двух узких пассов (билингв семантика-репэйр → target-only литературный reflow) под ОДНИМ coverage-гейтом → снимает конкуренцию мандатов; замерить реальный output-множитель (≤~2× editor-output).
- **A-ref-prev / A-ref-next / A-ref-both — ±1 reference-контекст:** пред-source+пред-target хвост / след-source-абзац до границы сцены / оба, явно `REFERENCE — НЕ ПЕРЕВОДИТЬ`. **Три РАЗДЕЛЬНЫЕ абляции** (не сливать). Цель — кросс-граница (T5/T6), нулевые подлежащие, катафора. Только на чанках с кросс-граничными трапами (11.*, 24.*).
### 1.2. Сильный дискурс-reflow промпт — ЭТО АРМ ДЛЯ ЗАМЕРА (не «оптимальный промпт»)
Ядро (Claude §C1#1 + ChatGPT §C3; содержание zh→ru — из Ван Цуй, Вестник МГУ Сер.22, прескрипция ТЕХНИКИ; норму держат Розенталь/Правила-1956). Добавляется к editor.md-мандату (не заменяет сверку смысла/полноту/глоссарий):
1. Молча определи смысловые ходы: единый фокал/наблюдатель; действие + непосредственная реакция; одна тема рассуждения; смена говорящего/времени/места/фокала.
2. Один повествовательный ход — обычно один русский абзац, ДАЖЕ если китайский разбит на однофразовые строки (паратаксис→гипотаксис). Инструмент слияния — **причастные/деепричастные обороты + подчинительные союзы/связки** (5 техник Ван Цуй: иерархия → сегментация по смыслу → маркировка вида/времени предиката → варьирование лексики → добавление связок). Не сливать ТОЛЬКО ради длины.
3. Каждая реплика — с нового абзаца через тире; слова автора при той же реплике — в её абзаце (Розенталь).
4. Разрешено объединять/делить русские предложения; ЗАПРЕЩЕНО терять смысловые атомы (число предложений/абзацев совпадать не обязано).
5. `REFERENCE`-блоки — только для разрешения связей; не переводить/не пересказывать в выходе.
Few-shot — минимальные, ортогональные: narrative N:1, dialogue 1:N, focal-shift boundary (target-side русский якорь, ≤3). **Для DeepSeek-thinking (если гоню его переводчиком/редактором с дискурс-промптом) — сначала zero-shot против few-shot** (модель-специфика research/15; не переносить между моделями); ручной verbose CoT reasoning-модели НЕ добавлять. Точный текст промпта и few-shot — в `eval/exp14_prompts.py`, sha256 фиксируется в §2 при заморозке армов.
### 1.3. Фронтир-арм — ДИАГНОСТИКА потолка (capability-vs-activation)
**2×2 (первичный):** держу ЧЕРНОВИК константным (дешёвый flash-draft, общий), варьирую EDITOR × промпт:
| | baseline-промпт | дискурс-промпт |
|---|---|---|
| **дешёвая** (glm-5) | = P0 (reuse $0) | = P1a |
| **фронтир** (gpt-5.4) | F-base | F-disc |
Разводит: фронтир верстает/чинит, дешёвая нет → **gap способности**; ни та ни другая → недоспецифицированный промпт; краткое правило/пример чинит дешёвую → **активация**. Плюс **спот-чек фронтир-как-ПЕРЕВОДЧИК** на T1/T2 (2 fidelity-трапа): избегает ли сильный ЧЕРНОВИК инверсии gl.7 в принципе (потолок на translate-стадии vs edit-стадии).
**Фронтир (слаги live-фактчекнуты 2026-07-11, /models):** **gpt-5.4** — ОСНОВНОЙ (OpenAI ~$9; standard-тир, не pro); **gemini-3.1-pro-preview** — ЭКОНОМНО, преим. кросс-семейный мета-ревьюер (остаток €2.6, output $12/M+thinking = быстро сгорит); **grok-4.3** — доп, но **НЕ на архаичной ch1** (D22.5, эхо-риск) — в exp14 ch1 и так исключена; **НЕ Claude/Opus** (нет ключа). Мета-ревьюер — **self-family exclusion** (если Gemini переводил/редактировал — мета-ревьюер GPT, и наоборот; span-цитаты: где ломается смысл + какой механизм чинит).
**Гарды:** эхо/refusal-скрин на ВСЕХ выходах; **per-call predicted-cost кап ДО вызова** (НЕ group-level); пре-регистрация армов заморожена коммитом.
### 1.4. Кривая размер-чанка ↔ качество ↔ биллинг ↔ ретраи
- Размеры **0.75k / 1.5k / 3k / глава** × **две политики границ** (жадная упаковка | сцен/дискурс-граница) при сопоставимом бюджете (иначе размер спутается с качеством границ).
- **Бюджет чанка — в ВЫХОДНЫХ токенах на реальном токенизаторе** (кириллица-фертильность ~22.5×, Petrov NeurIPS 2023; `glm-4.6`/`deepseek-v3.2` токенайзеры). Оптимизировать на **retry-adjusted output-cost**; связность давать кэшированным carryover, НЕ размером единицы.
- **Cache-ordering:** статику (system+glossary) ПЕРВОЙ, volatile (running summary/reference) ПОСЛЕ — иначе кэш бьётся.
- Снимать (пре-рег): in/out/**reasoning**-токены, латентность, **retry-rate ПО ПРИЧИНАМ** (timeout/refusal/length/echo/sanitizer/decode — РАЗДЕЛЬНО), **доля ПОВТОРНО ОПЛАЧЕННЫХ токенов** (не только retry-rate — урон одного крупного сбоя), coverage, слепое предпочтение, KPI-абзацы, trap-теги.
### 1.5. Метрики и гейты — ПРЕ-РЕГИСТРИРОВАНЫ (C4 ChatGPT + §C10 Claude)
| Ось | Первичный показатель | Аварийный гейт |
|---|---|---|
| Претензия 1 (абзацы) | **детерминированный структурный KPI БЕЗ судьи**: распределение предложений/нарратив-абзац (P0-baseline замер `exp14_material.py`: **медиана 1.0, среднее 1.701, доля 1-предл. абзацев 0.579**, n=1378 нарратив-абзацев/55 чанков) + слепое чтение | нельзя «побеждать» только МЕНЬШИМ числом абзацев (парно с atom-coverage) |
| Претензия 2 внутри-чанк | билингв span-цитирующая trap-accuracy (обязательный `supporting_span`) на T1/T2 | любая инверсия действия/участника (T1) = КАТАСТРОФА независимо от среднего ранга |
| Претензия 2 кросс-граница | accuracy РАЗДЕЛЬНО prev-/next-/chapter-supported (T5/T6 prev) | **perturbation:** correct-context vs random/shuffled НЕ должен дать тот же результат (иначе контекст не используется — Mohammed&Niculae) |
| Полнота | покрытие смысловых АТОМОВ (не совпадение числа предложений) | пропуск заголовка/события дисквалифицирует арм на фрагменте |
| Операционность | `$`, in/out/reasoning-токены, латентность, retry-по-причинам, **повторно-оплаченные токены** | per-call predicted-cost кап; НЕ group-level |
| Робастность | leave-one-judge-out + отдельный катастроф-скрин | коррелированные колонки одного судьи ≠ независимые сигналы |
**НИКОГДА не гейтить художественность/связность на BLEU/COMET** (zh→ru инверсия WMT24). Судьи: span-цитирующие, reasoning-ON, верность/стиль РАЗДЕЛЬНО, кросс-семейно (self-family exclusion), ≥3 повтора со свапом, parse-чек полноты ранжирования. Судьи-модели: `gemini-3.1-pro-preview`, `gpt-5-mini`, `kimi-k2.6` (кросс-семейно к переводившим glm-5/deepseek/gpt-5.4/mistral — семья судьи ≠ семья арма для каждого трапа).
### 1.6. Заморожённая таблица моделей/цен (единый источник `models.yaml`; фронтир — live-фактчек 2026-07-11)
| модель | in $/1M | out $/1M | cached-in | reasoning-режим | роль в exp14 |
|---|---|---|---|---|---|
| deepseek-v4-flash | 0.14 | 0.28 | 0.0028 | subset (thinking ON) | черновик (общий) |
| deepseek-v4-pro | 0.435 | 0.87 | 0.003625 | subset | эскалация черновика |
| glm-5 | 1.0 | 3.2 | 0.2 | subset (thinking disabled) | editor (дешёвый прод-якорь) |
| grok-4.3 | 1.25 | 2.50 | 1.25 | additive (reasoning-ON) | доп-фронтир (НЕ ch1) |
| gemini-3.1-pro-preview | 2.0 | 12.0 | 0.20 | additive_total (mandatory) | судья / кросс-семейный мета-ревьюер (экономно) |
| gpt-5-mini | 0.25 | 2.0 | 0.025 | subset | судья (second-opinion) |
| **gpt-5.4** | **2.50** | **15.0** | **0.25** | subset (reasoning⊆completion) | **ОСНОВНОЙ фронтир** (live 2026-07-11: `gpt-5.4-2026-03-05`; pricing developers.openai.com — gpt-5.5/5.6=$5/$30, 5.5-pro=$30/$180 → дорого, взят 5.4) |
| kimi-k2.6 | 0.95 | 4.0 | 0.16 | subset (temp=1, floor 16k) | судья |
| mistral-large-2512 | 0.5 | 1.5 | 0.5 | subset (не reasoning) | доп-фронтир/канал-B справка |
usage→$: `(in·pin + (comp + reason)·pout)/1e6`; `reason`= из `completion` (subset), отдельного поля (additive/grok), либо `totalpromptcompletion` (additive_total/gemini). Fallback-якорь неизвестной модели — цена `deepseek-v4-flash` (никогда $0).
### 1.7. Бюджет по ключам + per-call кап (обязателен ДО каждого платного вызова — exp13 +10%)
Бюджеты владельца (D36.1): OpenAI ~$9, Gemini ~€2.6 (крошечный — беречь), DeepSeek/ZAI/Kimi/xAI/Mistral ~$9 каждый. Отдельный owner-`ceiling` не нужен — работаю в остатках. Заканчивается ключ → останавливаюсь на нём, не блокирую остальные армы. Near-term дешёвые армы — ПЕРВЫМИ; фронтир GPT — основная фронтир-статья; Gemini — точечно.
**Оценка трат (замерю точно; предельные, не group-cap):**
- ZAI (glm-5 editor-армы): P1a/P1b/P1c + 5 аблаций + Stage-II + кривая ≈ ~$0.0150.02/чанк-edit; ~$1.52.5 суммарно (кап на вызов **$0.08**).
- DeepSeek (flash re-drafts для нарезки/главы): ~$0.001/чанк; <$0.3 (кап **$0.03**).
- OpenAI (gpt-5.4 фронтир 2×2 + translate-спот-чек): ~11 чанков × 2 cells + 4 спот ≈ ~$2 (кап на вызов **$0.40**).
- Gemini (судья/мета-ревьюер, output $12/M): держать <$1 экв. (кап **$0.30**); ре-джадж на gpt-5-mini/kimi если жжётся.
- Kimi/OpenAI-mini/… (судьи): ~$12 суммарно (кап **$0.20**).
- xAI (grok доп-фронтир, опц.): ≤$1 (кап **$0.40**), НЕ ch1.
- **Итог-цель ≈ $58 суммарно, глубоко в остатках.** Финальная сумма по ключам — в §2.
`predict_cost(model, in_est, max_out)` = `in_est·pin + max_out·pout` (in_est из токенайзера/char-эвристики; max_out = потолок `max_tokens`); отказ ДО вызова, если > кап модели. Каждый вызов персистит usage/cost в append-only JSONL немедленно (не батчить), running `spent` per-key.
### 1.8. Дерево решений (пре-рег, ChatGPT §C5)
- **P1a закрывает абзацы БЕЗ падения fidelity** → катить дискурс-промпт, размер НЕ менять.
- **Помогает только A-layout** → строить deformat/atom-rendering, не chapter-editor.
- **±1 reference (A-ref-*) закрывает большинство кросс-граничных traps** → строить малое context-window до Ф2-памяти.
- **Нужна chapter-card, но whole-chapter НЕ лучше** → Ф2 state-extraction.
- **Whole-chapter (P1b/c) выигрывает по fidelity И абзацам И retry-adjusted COGS** → проектировать per-stage гранулярность (повторить на длинной главе).
- **Фронтир выигрывает ОБЕ ячейки 2×2, организация почти не помогает****model floor** (не строить сложную память ради слабой модели).
- **Организация помогает ОБЕИМ, фронтир+организация даёт доп-лифт** → развести near-term context-fix и премиум-тир.
### 1.9. Гарды сессии
Слепота свята; пре-рег заморожен после коммита (промпты армов — sha256 в §2); аномалии провайдеров → вендор-дока + `/models` (не гадать); `.env` не читать; тексты книги в git-доки не тащить (≤15 слов); 18+ регистров в раннем срезе нет (перенос на 18+ — отдельная проба D22/exp10-11). Методика-guard (мемо `eval-aggregation`): fidelity-first агрегация, leave-one-out по судьям, катастроф-скрин к ПОБЕДИТЕЛЮ тоже, независимость сигналов до агрегации, ось решения (near-term-достаточность vs потолок-моделей). Git-координация: `git status` + опознание чужого перед касанием дерева; чужое не трогать; никаких reset/rebase/checkpoint-перезаписей.
---
## 2. Результаты (пост-freeze; ПАРТИЯ 1 — near-term армы + фронтир 2×2, на trap-наборе)
> **Статус партии 1:** прогнаны P0/P1a/P1b/P1c + аблации (A-layout/A-2pass/A-ref-prev/A-ref-both) + фронтир 2×2 (F-base/F-disc, gpt-5.4) на 9 trap-чанках. **0 ошибок на 64 арм-вызовах.** Трата: ARM ZAI $0.43 + OpenAI $1.34 = **$1.77**; trap-судьи (gpt-5-mini $0.03 + kimi $0.46) = **$0.50**; итого ≈ **$2.27** (глубоко в остатках). Медиана латентности: glm-5 35с, gpt-5.4 37с.
> **ПАРТИЯ 2 (не в этой партии):** кривая нарезки, слепые пакеты Ступени II владельцу, полная ранжирующая панель ≥3 повтора + leave-one-out, fidelity re-gate, 3 финалиста, хендофф оркестратору.
> **Заморожённые промпты армов (sha256[:16]):** editor_baseline `ca03a921df5db728` · editor_discourse `b3b4f6042e8c5673` · discourse_core `ec86a5623e3c6f02` · fewshot `d8f204cc4550ee99` · translator `a8298f725a3b2844`. **Stage-II `D`:** гл.19=0.061 / гл.17=0.246 / гл.18=0.440.
### 2.1. Претензия 1 (абзацы) — детерминированный структурный KPI (trap-набор, 9 чанков)
| Арм | нарезка×промпт | mean предл./нарратив-абзац | доля 1-предл. | CJK-утечка | len/P0 | gloss |
|---|---|---|---|---|---|---|
| **P0** | чанк × прод-baseline (glm-5) | 1.91 | 0.472 | 2 | 1.00 | 0.94 |
| **P1a** | чанк × дискурс (glm-5) | 2.61 | 0.318 | 2 | 0.99 | 0.93 |
| **A-2pass** | чанк × семантика→target-reflow (glm-5) | **3.33** | **0.187** | 2 | 0.99 | 0.93 |
| **A-layout** | чанк × дискурс + deformat-draft (glm-5) | 3.13 | 0.215 | **39 ⚠** | 1.00 | 0.93 |
| **A-ref-prev** | чанк × дискурс + ±1 prev (glm-5, 2 чанка) | 2.75 | 0.196 | 0 | 1.00 | 0.85 |
| **F-base** | чанк × прод-baseline (**gpt-5.4**) | **1.58** | **0.584** | 0 | 1.03 | 0.93 |
| **F-disc** | чанк × дискурс (**gpt-5.4**) | 2.45 | 0.369 | 0 | 1.02 | 0.93 |
**Вывод П1 — абзацы = ПРОМПТ/ПАЙПЛАЙН-рычаг, МОДЕЛЬ-агностичный:**
- Дискурс-промпт двигает распределение к русской норме на ОБЕИХ моделях (P1a 2.61, F-disc 2.45 vs baseline ~1.61.9). **Фронтир с ТЕКУЩИМ промптом (F-base 1.58) — ХУЖЕ дешёвого baseline (P0 1.91):** сильная модель зеркалит построчность черновика ещё вернее — «сильнее модель» само по себе абзацы НЕ чинит.
- **Сильнейший near-term рычаг П1 — A-2pass** (билингв семантика → отдельный target-only литературный reflow-пасс): mean 3.33, доля-1-предл. 0.187, БЕЗ коллапса длины (len/P0 0.99) и БЕЗ CJK-утечки. Подтверждает DocRepair-класс (отдельный монолингв. RU reflow-пасс) на дешёвой модели. Цена — ~2× editor-output (замерено: 18 вызовов на 9 чанков).
- **A-layout (deformat черновика) — НЕ чистая победа:** улучшает абзацы (3.13), но **CJK-утечка 39 симв. (×20 vs baseline)** — снятие построчной формы у glm-5 провоцирует эхо-осколки исходника. Регресс-гард сработал (детерм. KPI поймал). Deformat на дешёвой модели требует CJK-пост-гарда — не катить as-is.
### 2.2. Претензия 2 внутри-чанк (T1/T2) — capability floor
**T1 (gl.7 `古月族人没有一个不知道的`, двойное отрицание = «все знали») — КАТАСТРОФА-класс, детерм. читаемо:**
| Арм | рендер | вердикт |
|---|---|---|
| P0 (glm base) | «не знал в роду Гуюэ ни один человек» | ✗ ИНВЕРСИЯ (никто) |
| P1a (glm disc) | «в роду Гуюэ не знал ни один человек» | ✗ ИНВЕРСИЯ (промпт НЕ починил) |
| F-base (gpt-5.4 base) | «не знал разве что мёртвый» | ✓ ВЕРНО (все знали) |
| F-disc (gpt-5.4 disc) | «не было ни одного, кто бы его не знал» | ✓ ВЕРНО |
**Дешёвая модель инвертирует полярность НЕЗАВИСИМО от промпта; фронтир чинит НЕЗАВИСИМО от промпта → это МОДЕЛЬ-потолок, не активация.** T2 (`物是人非` chengyu): P0/P1a сплющивают («всё изменилось»); F-base улучшает («стало совсем не тем, что прежде» — восстанавливает 人非-контраст). Тот же знак: фронтир-редактор ловит смысловой дефект черновика, дешёвый — нет.
### 2.3. Претензия 2 кросс-граница (T5/T6) — слабые трапы в этом срезе
- **T5 (ch24.1 `这…铜皮蛊`): все армы рендерят локально-когерентно** («это не природный цвет кожи, а эффект гу Медной кожи») — предложение самодостаточно, chunk-изоляция его НЕ ломает. **A-ref-prev дал БАЙТ-идентичный P1a выход** (prev-контекст ничего не изменил — чинить было нечего).
- **P1c (глава целиком) на T5 — единственный, кто ЯВНО связал антецедент:** «Как у этого наставника: вся его кожа бронзового цвета» — склеив 24.0+24.1, редактор соединил «этого наставника» ↔ бронзовую кожу (chunk-изолированные оставляют висячее «его»). Один датапоинт: **whole-chapter даёт кросс-граничный лифт связывания**, но на этом срезе кросс-граница — НЕ доминирующий сбой (в отличие от within-chunk T1).
- Честно (пре-рег-оговорка): next-supported/катафора-трапа в раннем срезе нет; вывод по кросс-границе — предварительный (2 prev-трапа, локально самодостаточные).
### 2.4. Capability-vs-activation — прямой ответ на вопрос владельца
**Потолок РАСЩЕПЛЁН по двум претензиям — не «модели ИЛИ организация», а «каждая претензия — своё»:**
| Претензия владельца | Где потолок | Доказательство (партия 1) | Near-term ход |
|---|---|---|---|
| **(1) абзацы / конвенции РЯ** | **наша ПРОМПТ/ПАЙПЛАЙН** (активация) | дискурс-промпт двигает KPI на обеих моделях; F-base (фронтир+старый промпт) ХУЖЕ P0; A-2pass (дешёвый 2-пасс) — лучший (3.33) | катить дискурс-промпт + отдельный target-only reflow-пасс на ДЕШЁВОЙ модели |
| **(2) понимание связей внутри-чанк** | **дешёвая МОДЕЛЬ** (capability) | T1 инверсия: glm-5 фейлит обе промпт-версии, gpt-5.4 чинит обе; T2 то же | селективная фронтир-эскалация редактора на смысл-риск ИЛИ фронтир-редактор; промпт НЕ закрывает |
| **(2) связи кросс-граница** | не доминирует в срезе; whole-chapter даёт лифт | A-ref null (локально самодостаточно); P1c связал антецедент | НЕ строить сложную Ф2-память под слабый сигнал; whole-chapter/edit=глава — кандидат под ROI |
### 2.5. Судейская корроборация (trap-accuracy, кросс-семейно) — ЗАВЕРШЕНА
Панель **gpt-5-mini + kimi-k2.6**, span-цитаты, self-family exclusion (F-* армы OpenAI → судит только kimi; gpt-5-mini исключён). 50 вызовов, ~$0.50 (OpenAI $0.03 + Kimi $0.46). Свод (✓ correct / ~ partial / ✗ wrong):
| Трап | P0 | P1a | A-2pass | A-layout | F-base | F-disc | Читается |
|---|---|---|---|---|---|---|---|
| **T1** (двойн. отриц., КАТАСТРОФА) | ✗✗ **кат** | ✗✗ **кат** | ✗✗ **кат** | ✗✗ **кат** | ✓ | ✓ | **ОБА судьи флагают КАТАСТРОФУ на ВСЕХ дешёвых армах; ОБА чистят фронтир** → model floor корроборирован независимо |
| **T2** (物是人非 тело) | ~~ | ~~ | — | ~✗ | ~ | ~ | дешёвый = partial, фронтир не хуже; A-layout ✗ у kimi (CJK-порча) |
| **T2b** (物是人非 заглавие) | ~~ | ~~ | — | ~~ | ✓ | ✓ | **фронтир чинит заглавие-chengyu, дешёвый — partial** |
| **T5** (кросс-гр. prev) | ✓✓ | ✓✓ | — | ✓~ | ✓ | ✓ | ✓ у ВСЕХ → трап локально самодостаточен (не дифференцирует) |
| **T6** (кросс-гр. prev #2) | ~✗ | ~~ | — | ~✓ | ✗ | ~ | шумно, без чистого паттерна → кросс-граница неинформативна в срезе |
| **T4** (диалог-КОНТРОЛЬ) | ✓✓ | ✓✓ | — | ✓✓ | ✓ | (ERR) | диалог-оформление сохранено ВЕЗДЕ → армы НЕ ломают контроль |
**Корроборация (методика-guard, НЕ ложная сходимость):** судьи ЕДИНОГЛАСНЫ там, где сигнал резкий (T1-катастрофа на 4 дешёвых армах 2/2 судьи + оба чистят фронтир; T4-контроль сохранён) и ЧЕСТНО РАСХОДЯТСЯ на тонком (T2 partial, T6 шум). Leave-one-judge-out на T1: любой из 2 судей в одиночку держит ✗+катастрофу на дешёвых. **T1-вывод стоит на ДЕТЕРМ. полярности И независимой кросс-семейной панели** — не на среднем ранге. Судейская панель ПОДТВЕРЖДАЕТ §2.4: претензия-2-внутри-чанк = capability floor; кросс-граница (T5/T6) в срезе не дифференцирует.
### 2.6. Дерево решений — резолюция партии 1
- **P1a закрывает абзацы БЕЗ падения длины/атомов** ✓ → **катить дискурс-промпт, размер НЕ менять** (ветка 1 подтверждена). **Сильнее — A-2pass** (target-only reflow-пасс) — рекомендация near-term №1 по П1.
- **A-layout (deformat) улучшает абзацы, НО CJK-утечка** → deformat/atom-rendering строить ТОЛЬКО с CJK-пост-гардом (иначе регресс).
- **±1 reference НЕ дал лифта** (трапы локально самодостаточны) → малое context-window до Ф2 под этот срез НЕ обосновано; пере-проверить, когда/если появятся next-supported/катафора-кейсы.
- **Whole-chapter (P1c) дал кросс-граничный лифт связывания (1 датапоинт) но НЕ выиграл абзацы у A-2pass** → chapter state-extraction — кандидат под ROI, НЕ near-term приоритет.
- **Фронтир чинит within-chunk смысл, организация — нет (T1)****model floor на претензии 2-внутри-чанк**: дешёвый трек её НЕ дотянет промптом; ход — селективная фронтир-эскалация редактора по смысл-риску (не тотальный фронтир — F-base абзацы даже портит).
### 2.7. Предварительная near-term рекомендация (на ратификацию оркестратора — НЕ смена дефолта этой сессией)
1. **Претензия 1 (абзацы):** внедрить **дискурс-reflow-контент (Ван Цуй 5 техник + Розенталь) в editor-промпт** — дёшево, модель-агностично, доказанный лифт (P1a); рассмотреть **отдельный target-only reflow-пасс** (A-2pass, лучший KPI) под COGS-замер (~2× editor-output — оценить на полной книге).
2. **Претензия 2 (смысл внутри-чанк):** промпт НЕ закрывает на дешёвой модели → **селективная фронтир-эскалация редактора по смысл-риску** (двойное отрицание/chengyu/инверсия черновика) — точечно, не тотально (тотальный фронтир портит абзацы и жжёт COGS). Квантификация — fidelity re-gate (§3) + партия 2.
3. **CJK-гард обязателен** при любом deformat-черновике (A-layout урок).
4. **НЕ строить** сложную Ф2-кросс-чанк-память под этот срез (сигнал слабый); whole-chapter/edit=глава — держать кандидатом под доказанный ROI.
**Оговорки (методика-guard):** trap-набор мал (6 трапов, prev-boundary, без катафоры); фронтир = 1 модель (gpt-5.4), Gemini/grok переводчиками не гонялись (бюджет/эхо); T1-вывод — 1 катастроф-датапоинт (но детерм.-чистый); срез — PD-смежная ранняя арка (без 18+); это ИНТЕРИМ пре-скрин (D35), НЕ вердикт пилота Ф2.5.
## 3. Fidelity re-gate (ПАРАЛЛЕЛЬНО, D34.3 — независим от §1-§2)
Span-цитирующий, reasoning-ON, раздельно стиль/верность, охота на КЛАСС ИНВЕРСИЙ редактуры (ch11/0 аутлайер: editor расширил 3009→4631, sim 0.064), катастроф-скрин терминов у победителя, author≠reviewer (не glm-5/deepseek), leave-one-out. Вход — `rerun/rerun-parallel.txt` (57 чанков, выровнено ОРИГ|ПЕРЕВОД) + `records.json`. **Пере-прогон НЕ засчитан до пройденного re-gate.** *(результаты — ниже, после прогона.)*

View file

@ -0,0 +1,288 @@
# Рычаги минимально-художественного zh→ru: независимый доклад ChatGPT
<!-- ─────────────────────────────────────────────────────────────────────────
ОРКЕСТРАТОР — РЕВЬЮ-ШАПКА (лендинг, D36, 12.07 №4). Тело не переписано. Полный разбор —
PROGRESS §лендинг D36 + D-лог D36.
ВЕРДИКТ: **ACCEPT** (одна минорная привязка при графтинге в промт полигона).
НЕЗАВИСИМАЯ ВЕРИФИКАЦИЯ (тот же 26-агентный воркфлоу, первоисточники, $0):
- **Цитатно-чист на всех спот-чеках** — Thai/Par3 (EMNLP 2022, `2022.emnlp-main.672`),
Mohammed & Niculae (Findings EACL 2024, `2024.findings-eacl.113` — perturbation
correct-vs-random), Herold & Ney, Hu & Wan, Jiang/BWB, Jwalapuram, DelTA, TransAgents
(EMNLP-Demo `2024.emnlp-demo.14`) — все существуют, атрибуция аккуратна.
- **Хеджирование дисциплинировано** — внешняя эмпирика последовательно помечена «не zh→ru»;
инженерные клеймы — PLAUSIBLE; 80%-порог ловушек — «предложение для пре-регистрации, не факт».
Ни одного CONFIRMED-который-на-деле-экстраполяция не найдено. Самый скептичный из двух
отчётов к системным клеймам (TransAgents прямо назван «vendor-like»).
- **§C — наиболее прямо-исполнимый скелет полигон-сессии** из двух: явный P0 чистый baseline
→ армы с фаза-тегами P0P4 → C4 пре-регистрированные метрики/гейты → C5 дерево решений →
C3 точное ядро дискурс-reflow-промпта. Покрывает ВСЕ мандатные оси D35.6.
ДВЕ ОГОВОРКИ ПРИ ГРАФТИНГЕ (учтены в промте полигона D36):
1. **§A-заморозка НЕ воспроизводима из документа.** sha256 `b42c6f6e…` заявлен только в прозе
§B0; в файле — плейсхолдер `<!-- A_SHA256_PLACEHOLDER -->` без BEGIN/END байт-маркеров →
пересчитать нельзя. Прогон внешний (владелец) → заморозка **аттестована, но не крипто-
верифицируема** (в отличие от Claude-отчёта, чей хеш сверен MATCH). На вес «двойной заморозки
сходимости» — дисконт; содержательное качество/самосогласованность отчёта этим НЕ затронуты.
2. **Свежий fidelity-гейт §C4 не ссылается на мандатный re-gate D34.3** (`rerun/FIDELITY_REGATE_HANDOFF.md`
+ `rerun-parallel.txt`) — сессия его не читала. При графтинге брать D34.3-пакет как канон
верности, §C4-гейт — как совместимую детализацию.
РЕКОМЕНДАЦИЯ ЛЕНДИНГА (обе стороны сами это предлагают): §C ChatGPT = скелет протокола +
графт zh→ru-контента Ван Цуй в reflow-промпт + COGS-модель + привязка D34.3 из Claude-отчёта.
Реализовано в `POLYGON_QUALITY_EMPIRICS_SESSION_PROMPT.md`.
───────────────────────────────────────────────────────────────────────────── -->
Дата исследования: 2026-07-11. Роль: независимый ресёрчер; код и общие документы репозитория не изменялись.
Статусы доказательности:
- **CONFIRMED** — утверждение прямо поддержано первичным источником или наблюдением над разрешённым сырьём;
- **PLAUSIBLE** — инженерная гипотеза, совместимая с данными, но требующая локального A/B-замера;
- **REFUTED** — локальные данные или первичный источник противоречат утверждению.
## §A. Чистый лист: независимая карта «проблема → механизм»
> **FREEZE MARKER A — 2026-07-11.** Этот раздел составлен до чтения `05-decisions-log.md`, `research/07`, `research/15`, `research/16` и материалов exp04/12/13. После фиксации SHA-256 раздел не редактируется. Все дальнейшие сопоставления находятся только в §B§D.
### A1. Что непосредственно видно в текущем прогоне
**CONFIRMED.** Текущий сегментатор жадно упаковывает целые исходные абзацы примерно до 1 500 оценочных токенов; только сверхдлинный абзац делится по предложениям. Контекст предыдущего/следующего чанка в `Chunk` не переносится. Переводчик получает один `{{text}}`; редактор — тот же исходный чанк и его черновик. Источник: локальные `backend/internal/pipeline/chunker.go`, `backend/prompts/translator.md`, `backend/prompts/editor.md`, прочитаны 2026-07-11.
**CONFIRMED.** Оба промпта уже требуют русской вёрстки, запрещают копировать построчную разбивку и предписывают начинать прямую речь с нового абзаца. Следовательно, версия «достаточно добавить одну инструкцию про абзацы» опровергается текущей конфигурацией: такая инструкция уже есть, а претензия владельца сохранилась. Источник: локальные промпты выше и вердикт владельца в сессионном задании, 2026-07-11.
**CONFIRMED (описательная метрика, не оценка качества).** В `rerun-ru.txt` грубое разбиение по пустым строкам даёт 1 754 блока, из которых 1 671, или около 95,3%, состоят из одной непустой строки. Выборочная проверка начала, середины и конца показывает устойчивую дробность повествования наряду с корректным выделением многих реплик. Метрика намеренно не объявляется нормой художественности: короткий абзац может быть стилистически оправдан. Источники: локальные `/home/ubuntu/books/gu-zhenren/rerun/rerun-ru.txt` и `/home/ubuntu/books/gu-zhenren/rerun/records.json`, только чтение, 2026-07-11.
**PLAUSIBLE.** Основная ошибка организации — не «слишком маленький чанк» как таковой, а смешение трёх разных единиц: (1) единицы покрытия, (2) единицы смыслового контекста, (3) единицы целевой композиции. Нынешний фиксированный бюджет определяет все три сразу. Это объясняет, почему полнота может быть хорошей, а русская макрокомпозиция и дальние связи — слабее. Нужен факторный эксперимент, потому что наблюдение одного прогона причинность не устанавливает.
### A2. На какой гранулярности переводить
**CONFIRMED.** Для литературного LLM-перевода перевод целого исходного абзаца за один вызов превосходил перевод предложение-за-предложением по человеческой разметке на 18 языковых парах: было меньше смысловых, грамматических и стилистических ошибок. Это peer-reviewed WMT 2023, но не zh→ru и не тест текущих дешёвых моделей, поэтому переносимость результата ограничена. Источник: Karpinska & Iyyer, [Large Language Models Effectively Leverage Document-level Context for Literary Translation, but Critical Errors Persist](https://aclanthology.org/2023.wmt-1.41/), опубликовано 2023-12, доступ 2026-07-11.
**CONFIRMED.** В литературном MT абзац является практически значимой единицей данных и оценки: корпус Par3 выровнен по абзацам; эксперты предпочитали человеческие варианты машинным в 84% сравнений, а обученный post-editor — обычному MT в 69%. Автоматические метрики не коррелировали с экспертными предпочтениями. Это аргумент за абзац/микросцену и человеческий blind preference как минимум, но не доказательство конкретной схемы zh→ru. Источник: Thai et al., [Exploring Document-Level Literary Machine Translation with Parallel Paragraphs from World Literature](https://aclanthology.org/2022.emnlp-main.672/), EMNLP 2022, доступ 2026-07-11.
**CONFIRMED.** Простое увеличение контекста до всего документа не является монотонным улучшением: работа по long-context DocMT указывает и рост памяти, и деградацию качества при расширении контекста; типичный локальный контекст — одно-два предыдущих предложения, чего может не хватать для темы и стиля. Источник: Herold & Ney, [Improving Long Context Document-Level Machine Translation](https://aclanthology.org/2023.codi-1.15/), CODI/ACL 2023, доступ 2026-07-11.
**CONFIRMED.** Фиксированная длина плохо отражает дискурсную структуру. Paragraph-to-paragraph режим и явная RST-структура дали улучшения над прежними DocMT-подходами в peer-reviewed исследовании, хотя архитектурные результаты NMT нельзя напрямую переносить на prompting закрытой LLM. Источник: Hu & Wan, [Exploring Discourse Structure in Document-level Machine Translation](https://aclanthology.org/2023.emnlp-main.857/), EMNLP 2023, доступ 2026-07-11.
**Вывод A2 — PLAUSIBLE.** Для текущей фазы минимальная разумная единица генерации — не предложение и не глава, а **дискурсный пакет**: один или несколько смежных исходных абзацев, образующих локальный ход/эпизод, с защищёнными границами сцены. Основной текст пакета переводится целиком; вокруг него подаётся компактный reference-context, который не надо переводить. Глава нужна как область предварительного чтения и извлечения опор, а не обязательно как единый output-вызов. Оптимум размера следует измерять, а не объявлять заранее.
### A3. Претензия 1: русские абзацы и литературные конвенции
**CONFIRMED.** Исходная и целевая дискурсные структуры у человеческих и машинных переводов различаются, а предложение-уровневые метрики не покрывают сущности, терминологию, кореференцию и кавычки. Источник — размеченный корпус китайско-английских романов BWB; это близкий по исходному языку, но не русскому, evidence. Jiang et al., [Discourse-Centric Evaluation of Document-level Machine Translation with a New Densely Annotated Parallel Corpus of Novels](https://aclanthology.org/2023.acl-long.435/), ACL 2023, доступ 2026-07-11.
**PLAUSIBLE.** Нужна не ещё одна абстрактная команда «собери естественные абзацы», а наблюдаемая целевая операция:
1. сначала определить внутри пакета дискурсные ходы (кто воспринимает/говорит, действие, реакция, смена времени/места/фокала);
2. затем сформировать русские абзацы вокруг этих ходов, отдельно соблюдая оформление диалога;
3. только потом провести проверку покрытия по исходным атомам.
Эту операцию можно реализовать одним вызовом через краткий скрытый план и финальный текст либо отдельным layout/polish-проходом. Какой вариант лучше для дешёвой модели — вопрос A/B, а не установленный факт.
**PLAUSIBLE.** Few-shot должен показывать именно требуемое преобразование структуры: 23 коротких zh→ru примера «много однофразовых исходных строк → один естественный повествовательный абзац», «повествование → отдельная реплика → авторская ремарка», «смена фокала → новый абзац». Простой положительный пример проверяется отдельно от длинного списка negative constraints. Причина: текущая словесная инструкция не сработала; демонстрация задаёт форму результата. Прямого peer-reviewed замера именно русской перевёрстки в найденных источниках нет.
**PLAUSIBLE.** Отдельный target-only layout-пасс потенциально дешевле повторного bilingual editor-пасса: он получает только русский текст и задачу укрупнить/разделить абзацы без перефразирования. Но он не исправляет причинную связность и может закрепить смысловую ошибку; поэтому это узкий рычаг для претензии 1, не универсальное лечение.
**PLAUSIBLE.** Одновременный мандат редактора «сверить смысл + исправить реалии + выдержать глоссарий + улучшить стиль + реконструировать абзацы + ничего не добавить/удалить» создаёт конкуренцию критериев у слабой модели. Дешёвый тест — разделить semantic revision и target-language paragraph/style polish; дорогой — оставить один сильный editor. Ни «CoT всегда помогает», ни «negative constraints всегда вредят» без локального замера не утверждается.
### A4. Претензия 2: связи и смысл на дистанции
**CONFIRMED.** Контекстные ошибки требуют специальных измерений: sentence-level BLEU может почти не замечать анафору, связность и лексическую когезию. Литература предлагает отдельные тесты для местоимений/кореференции и документные метрики когезии. Источники: Jwalapuram et al., [Evaluating Pronominal Anaphora in Machine Translation](https://aclanthology.org/D19-1294/), EMNLP 2019; Libovický et al., [Machine Translation Evaluation beyond the Sentence Level](https://aclanthology.org/2018.eamt-main.18/), EAMT 2018; доступ 2026-07-11.
**CONFIRMED.** DelTA использует не «всю книгу в промпте», а четыре специализированные памяти: записи имён, двуязычное резюме, long-term retrieval и short-term контекст. В ICLR 2025 заявлены средние улучшения до 3,16 COMET и до 4,58 процентного пункта consistency; система переводит по предложениям ради полноты. Это peer-reviewed DocMT, но не литературная zh→ru оценка и не доказательство необходимости всех четырёх компонентов. Источник: Wang et al., [DelTA: An Online Document-Level Translation Agent Based on Multi-Level Memory](https://proceedings.iclr.cc/paper_files/paper/2025/hash/285149554f6fbed6e2f9ec72d131bd23-Abstract-Conference.html), ICLR 2025, доступ 2026-07-11.
**CONFIRMED, но vendor-like/системный claim.** TransAgents организует литературный перевод как роли редактора, переводчика, локализатора и корректора с циклом проверки; опубликованный demo-paper сообщает человеческие предпочтения и низкую относительно человека цену. Это prior art организации, но его сильные маркетинговые формулировки нельзя считать независимым доказательством превосходства, а многоагентность сама по себе не изолирована как причина. Источник: Wu et al., [TransAgents: Build Your Translation Company with Language Agents](https://aclanthology.org/2024.emnlp-demo.14/), EMNLP Demo 2024, доступ 2026-07-11.
**PLAUSIBLE.** Максимум эффекта при минимуме стройки даст не полноценная агентная память, а следующий порядок армов:
1. **look-behind:** предыдущий русский абзац + соответствующий китайский хвост как read-only reference;
2. **look-ahead:** следующий китайский абзац/до границы сцены, помеченный «не переводить», чтобы снять катафору и неоднозначность текущей фразы;
3. **chapter card:** краткие сущности, отношения, текущая цель/локация/время и нерешённые референсы, извлечённые одним предварительным чтением главы;
4. только затем retrieval/долгая память и отдельный аннотатор связей.
Порядок — инженерная гипотеза по цене строительства. Look-ahead особенно важен для китайского нулевого подлежащего, но величина эффекта именно zh→ru не подтверждена найденным контролируемым исследованием.
**PLAUSIBLE.** Глоссарий лечит стабильность именования, но не заменяет модель ситуации: одинаково написанное имя не разрешает, кто что сделал, почему персонаж реагирует и к чему относится опущенное подлежащее. Поэтому в полигоне терминологическая consistency и causal/coreference comprehension должны быть разными исходами.
**PLAUSIBLE.** Сильная модель может одновременно улучшить локальный русский и рассуждение, но arm «модель сильнее» без одинакового контекста не отвечает, где потолок — в модели или организации. Нужен 2×2: слабая/сильная модель × текущий/дискурсный контекст. Если контекст помогает обеим, проблема частично организационная; если только сильная проходит смысловые ловушки, есть model floor.
### A5. Кривая «размер чанка ↔ качество ↔ биллинг ↔ ретраи»
**CONFIRMED как бухгалтерская рамка, не как эмпирическая кривая.** Для главы из `S` исходных токенов, чанка полезной длины `c`, фиксированного prompt/reference overhead `h`, коэффициента выходных токенов `r` и цен `p_in`, `p_out` ожидаемая цена без ретраев грубо равна:
`C(c) ≈ ceil(S/c) · h · p_in + S · p_in + rS · p_out`.
Значит, при прочих равных рост `c` уменьшает повторяемый overhead. Это арифметика; она не говорит, что качество растёт.
**PLAUSIBLE.** С ретраями цена становится нелинейной. Если вероятность неуспеха чанка `q(c)` и весь вызов повторяется до успеха, множитель ожидаемых попыток — `1/(1-q(c))`; ожидаемо повторно оплачивается весь `h+c+rc`. Даже если число вызовов падает, большие чанки дороже терять при timeout/refusal/excision. Реальная `q(c)` должна быть измерена по типам отказа, а не подогнана общей долей retry.
**PLAUSIBLE.** Качество вероятно имеет внутренний оптимум: слишком малый `c` режет дискурс и размножает prompt overhead; слишком большой `c` размывает релевантный контекст, затрудняет контроль полноты и повышает ущерб одного сбоя. Исследование long-context DocMT подтверждает возможность деградации при расширении контекста, но форму кривой для этого пайплайна надо пререгистрировать и измерить. Источник: Herold & Ney 2023, ссылка в A2, доступ 2026-07-11.
**Предрегистрация A5 — PLAUSIBLE.** Сравнить не только размеры 0,75k / 1,5k / 3k / «глава», но и две политики границ при сопоставимом бюджете: фиксированная упаковка против scene/discourse-aware упаковки. На каждом арме сохранять: вход/выход токены, latency, долю и причину ретраев, долю повторно оплаченных токенов, полноту, blind reader preference, paragraph score и размеченные coreference/causal traps. Иначе размер будет спутан с качеством границ.
### A6. Оси, которые легко пропустить
**PLAUSIBLE — структурная утечка через черновик.** Редактор видит дробный черновик, который становится сильной формальной подсказкой, тогда как абстрактная инструкция просит его форму разрушить. Arm «редактор видит тот же текст без пустых строк/с ID смысловых атомов» отделит якорение на layout черновика от неспособности модели к русской композиции.
**PLAUSIBLE — конфликт полноты и естественной композиции.** Формула «не выбрасывай и не добавляй предложения» полезна для покрытия, но может восприниматься как требование сохранять предложение-к-предложению и мешать слиянию/членению русских предложений. Следует сохранять **смысловые атомы**, а не число предложений: пронумеровать атомы только для внутренней проверки, разрешив объединять и делить предложения в финале. Это должно пройти отдельный coverage gate.
**PLAUSIBLE — мусор до романа портит style prior.** Первый чанк содержит метаданные, обзор, интернет-ссылку и предисловие, а не однородную художественную сцену. Общий genre prompt не различает front matter, авторское предисловие и роман. Классификация типа блока до перевода может предотвратить перенос регистров и бессмысленную «литературизацию» служебного текста.
**PLAUSIBLE — направление контекста важно.** Только прошлое помогает последовательности, но не всегда пониманию текущей китайской эллиптики; только будущее рискует спойлерным перефразированием. Поэтому previous-target, previous-source и next-source надо факторизовать, а не объединять сразу в один «context arm».
**CONFIRMED.** Правильность контекстного метода нельзя заключать из общего score: perturbation test с корректным против случайного контекста показывает, использует ли система именно опорный контекст. Источник: Mohammed & Niculae, [On Measuring Context Utilization in Document-Level MT Systems](https://aclanthology.org/2024.findings-eacl.113/), Findings of EACL 2024, доступ 2026-07-11.
**PLAUSIBLE — оценщик должен разделять читателя и билингва.** Русскоязычный читатель способен оценить ритм, абзацы и естественность, но не диагностирует тихое искажение; билингв — смысл и связи, но может терпеть translationese. Минимальный полигон требует двух независимых рубрик и запрета показывать arm/model judge-у.
**REFUTED как универсальный тезис.** «Больше агентов автоматически означает лучше» не следует из prior art: TransAgents демонстрирует целую систему, DelTA — специализированную память, а paragraph-level LLM уже улучшал результат без агентного оркестра. Сначала следует покупать информацию (границы, соседний контекст, chapter card), затем роли и циклы.
### A7. Независимая карта причин и минимальных вмешательств
| Наблюдаемая проблема | Вероятный механизм | Самый дешёвый различающий тест | Что не считать доказательством |
|---|---|---|---|
| Почти каждый ход остаётся отдельным абзацем | Якорение на layout исходника/черновика; инструкция без демонстрации; перегруженный editor mandate | layout few-shot; draft без пустых строк; отдельный target-only reflow | Снижение числа абзацев само по себе |
| Связь ломается внутри чанка | Модель не строит локальную ситуацию; противоречивый/перегруженный мандат | semantic-first editor с явными entity/action/reason checks | Более гладкий русский без сверки смысла |
| Связь ломается на границе чанков | Нет previous/next reference; граница не совпадает со сценой | ±1 абзац reference и scene-aware boundary | Увеличение токенов без релевантного контекста |
| Теряются дальние сущности/цели | Нет chapter/book state | краткая chapter card против glossary-only | Единообразное имя при неверной кореференции |
| Сильный стиль ценой пропуска | Свободный polish без атомарного coverage | atom IDs + post-check, разрешив русское split/merge | Совпадение числа предложений |
| Большие чанки нестабильны/дороги | Растёт payload одного сбоя и нерелевантный контекст | size sweep с раздельным учётом retry causes | Средняя цена успешного вызова без ретраев |
| Непонятно, виновата модель или пайплайн | Model/context confounding | 2×2 model strength × discourse context | Сравнение разных моделей на разных промптах |
**Итог §A — PLAUSIBLE.** Наиболее вероятный короткий путь к «минимально художественно» — не перевод всей главы и не многоагентная стройка, а дискурсно ограниченный пакет + небольшой соседний reference-context + few-shot русской перекомпоновки + раздельная смысловая и монолингвальная оценка. Первый полигон должен определить, достаточна ли текущая модель; не предполагать это заранее.
<!-- A_SHA256_PLACEHOLDER -->
## §B. Дифф после чтения внутреннего стека
### B0. Целостность анти-анкоринга
§A был записан отдельным снимком до чтения командных гипотез. SHA-256 этого A-only снимка: `b42c6f6e6dc06ec48f3472714ac2b9ca5eba0135fba204113e2628a36eacee99`. После этого прочитаны карта актуальности и D26/D30D35 в `docs/architecture/05-decisions-log.md`, раздел «Промптинг литперевода» в `docs/research/15-voice-and-state.md`, `docs/research/07-translation-methodology.md`, exp04/12/13 и `docs/research/16-reader-ide-alignment.md`. §A после чтения не изменялся.
### B1. Где независимая карта сошлась с командой
**CONFIRMED — команда угадала корень первого слоя.** §A независимо установил, что словесная reflow-инструкция уже есть, но результата не гарантирует; D35 независимо подтверждает на боевом снимке, что reflow действительно применялся, редактор был активен, а выход всё равно зеркалил рубленость источника. Значит, это не stale-конфиг и не пассивный mono-editor. Источники: локальный `docs/architecture/05-decisions-log.md`, D35.1, и текущие промпты, прочитаны 2026-07-11.
**CONFIRMED — команда уже сделала верный флип mono→bilingual.** Exp12 показал механическую пассивность mono-режима и структурную невозможность исправить 磕头/派/时辰 без исходника; D30 ратифицировал bilingual editor. Это полностью совпало с §A4: target-only polish не лечит смысл. Источники: локальные `docs/experiments/12-quality-diagnosis.md` §2.2/§2.5 и `docs/architecture/05-decisions-log.md` D30.1, прочитаны 2026-07-11.
**CONFIRMED — команда уже развела глоссарий и понимание ситуации.** D30.8/D35.4 различают термины, которые можно засидить сейчас, и «модель не следит за сюжетом», относимое к состоянию/памяти. Это совпадает с §A4. Источники: локальный D-лог, D30.8/D35.4, 2026-07-11.
**CONFIRMED — команда уже не считает жёсткую 1:1 структуру целью.** Research/16 показывает легитимный N:M, русскую норму тире-абзацев и рекомендует детектировать, а не форсировать парность. Это совместимо с §A3/A6: проверять смысловые атомы, не число предложений/абзацев. Источник: локальный `docs/research/16-reader-ide-alignment.md` §2.1§2.5, прочитан 2026-07-11; внешний якорь: Karpinska & Iyyer, [WMT 2023](https://aclanthology.org/2023.wmt-1.41/), доступ 2026-07-11.
**CONFIRMED — команда уже знает, что модель/промпт нельзя оценивать общим скаляром.** Exp12/13 разделили стиль и верность, но ревью D30/D32 вскрыло ложные «единогласия», коррелированные сигналы и катастрофы победителей. Предлагаемый в §A 2×2 и отдельные traps продолжают именно эту исправленную методику. Источники: локальный D-лог D30/D32 и exp12/13, прочитаны 2026-07-11.
**CONFIRMED — prompt-format prior art уже покрыт research/15.** Формат, позиция, сэндвич, few-shot-раскол по моделям, lost-in-middle и опасность ручного CoT уже исследованы. Поэтому данный доклад не рекомендует универсальный XML/CoT-рецепт и не дублирует этот обзор. Источник: локальный `docs/research/15-voice-and-state.md` §3.1§3.3, прочитан 2026-07-11.
### B2. Что в §A есть сверх текущей карты команды
**PLAUSIBLE — независимое разведение трёх единиц.** В D35 главная ось сформулирована как «нарезка × промпт» и кандидаты `draft=чанк/edit=глава`. §A добавляет обязательное различение: coverage atom ≠ generation unit ≠ reference-context span. Глава может быть областью чтения/извлечения опор, не единым completion. Это предотвращает ложный выбор «1,5k или вся глава».
**PLAUSIBLE — якорение редактора на форме draft как отдельная причина.** Командные документы обсуждают исходную построчность и ненадёжность reflow, но не изолируют arm, где редактор получает тот же черновик без пустых строк/с нейтральными атомарными ID. Если такой arm резко улучшит абзацы при той же модели и промпте, менять размер чанка преждевременно.
**PLAUSIBLE — look-ahead как дешёвый самостоятельный arm.** D21/research15 проектируют scene-state/Annotator для Ф2; D35 говорит о cross-chunk. В прочитанных экспериментах не изолирован следующий китайский абзац как read-only reference. Для катафоры, нулевых субъектов и поздно раскрываемого отношения это дешевле полноценной памяти. Доказанного эффекта zh→ru нет — именно поэтому arm нужен.
**PLAUSIBLE — discourse-move reflow вместо общего «русские абзацы».** Текущий reflow-промпт содержит результатное требование, но не операциональную рубрику «фокал/действие/реакция/смена времени/места/говорящего». Few-shot должен показывать структурное преобразование, а не только красивый стиль. Research/15 покрывает общую форму few-shot, но не этот тип примера.
**PLAUSIBLE — факторный model-floor тест.** D35 разрешает фронтир-арм, но без 2×2 сильная модель на ином промпте/размере оставит прежний конфаунд. Нужны одна и та же слабая и сильная модели на текущей и дискурсной организации. Это отвечает именно на вопрос владельца «модель не понимает» против «мы не дали ей опоры».
**PLAUSIBLE — тип блока/front matter.** Сырьё первой главы смешивает метаданные, интернет-обзор, авторское предисловие и роман. Во внутренних качественных экспериментах эта ось не выделена. Она не объясняет все 25 глав, но способна портить локальный style prior и оценку главы 1.
**PLAUSIBLE — retry-cost надо считать повторно оплаченными токенами, а не только retry-rate.** D35 запросил кривую размера, но формула §A5 делает явным ущерб одного крупного сбоя. Это важно при сравнении главы с чанком: одинаковая доля отказов не означает одинаковую цену.
### B3. Где §A разошёлся с командными гипотезами
**Расхождение 1 — глава целиком не должна быть привилегированным кандидатом.** D35 справедливо хочет arm «глава целиком», но prior art поддерживает paragraph/discourse units и предупреждает о деградации длинного контекста. Глава нужна как диагностический потолок и область read-ahead; прод-кандидатом по умолчанию её считать нельзя. Источники: [Hu & Wan 2023](https://aclanthology.org/2023.emnlp-main.857/), [Herold & Ney 2023](https://aclanthology.org/2023.codi-1.15/), доступ 2026-07-11.
**Расхождение 2 — `draft=чанк/edit=глава` слишком рано превращать в архитектурную лестницу.** Она может победить, но смешивает три изменения: больше source context, больше draft context и иной масштаб reflow. Сначала нужны прямые ручные армы, разделяющие эти факторы. Лишь затем runner-изменение.
**Расхождение 3 — «cross-chunk = Ф2» слишком жёсткая граница.** Полноценная долговременная память, Annotator и retrieval действительно Ф2. Но ±1 source paragraph, previous target tail и статичная chapter card можно измерить и даже рендерить без обученной памяти. Это near-term context engineering; продовая автоматизация может потребовать небольшую машинерию, но не весь Ф2-стек.
**Расхождение 4 — отдельный layout-пасс не обязан быть детерминированным.** Exp12 рассматривает «детерминированный reflow-пасс» как вариант, но логическое слияние повествования семантично; чистая пунктуационная эвристика надёжно оформит реплики, но не решит, где кончается мысль. Детерминированным должен быть валидатор/аварийная механика, а сам reflow — LLM или ручная редактура, если нужны смысловые абзацы.
### B4. Что команда сделала лучше независимой карты
**CONFIRMED.** Research/16 дал точные русские нормы диалога и сильное различение legit N:M против структурного дефекта; §A был грубее. Источник: локальный research/16 §2.3, 2026-07-11.
**CONFIRMED.** Exp12/13 и D30/D32 дали локальную причинную эмпирику по конкретным моделям: mono no-op, active bilingual, ошибочные инверсии редактора, flash-vs-pro trade-off и ложная независимость судей. Внешняя литература этого заменить не может. Источники: локальные exp12/13 и D30/D32, 2026-07-11.
**CONFIRMED.** D35 измерил боевой прогон: reflow применён, draft→final similarity 0,643, 34/55 чанков сильно правлены, около 1,28 стыка чанков на главу. Это сдвигает приоритет к внутри-чанковой организации абзацев: cross-chunk нельзя объявлять главным виновником без trap-разметки. Источник: локальный D35.1, 2026-07-11.
## §C. Рекомендации — вход полигону
### C1. Главный дизайн: не один bake-off, а две короткие ступени
**Ступень I — причинная проба на 68 ловушках, а не на «средних главах».** Взять места владельца плюс независимо размеченные случаи четырёх типов: (a) повествовательные предложения, которые должны стать одним русским абзацем; (b) диалог с 1:N; (c) связь, разрешимая внутри текущего чанка; (d) связь, для которой опора находится только за его границей. Разметить до генерации: supporting span и допустимый смысл. Это согласуется с выводом, что общие sentence-level метрики не видят дискурс. Источники: [Jiang et al. 2023](https://aclanthology.org/2023.acl-long.435/), [Mohammed & Niculae 2024](https://aclanthology.org/2024.findings-eacl.113/), доступ 2026-07-11.
**Ступень II — blind chapter reading только трёх финалистов.** Не давать владельцу 8 почти одинаковых вариантов, как в exp12. После trap-гейта оставить baseline, лучший near-term arm и frontier diagnostic. Главный исход — бинарное закрытие двух претензий + ранжирование, вторичный — размеченные ошибки.
### C2. Армы и порядок
Обозначения фазы: **СЕЙЧАС** — прямые вызовы/ручная упаковка, без Ф2; **ПРОД-МИНОР** — после доказанного ROI нужна небольшая правка рендера/сегментации; **Ф2** — долговременное состояние, Annotator, retrieval или новый per-stage runner-контракт.
| Приоритет / механизм | Как измерить: arm и проба | Цена | Ожидаемый эффект | Фаза |
|---|---|---|---|---|
| **P0. Чистый baseline** | Точный текущий prod prompt+инъекция+1,5k chunk на тех же traps; исключить экспорт-пустоты ch5/ch20 по D35.4 | Уже известна | Нулевая точка обеих претензий | СЕЙЧАС |
| **P1. Discourse-reflow prompt** | Тот же source/draft/chunk/model; добавить 23 структурных few-shot и рубрику ходов: фокал/действие/реакция/смена места-времени/говорящего; финал без плана | +кэшируемый префикс; почти $0 относительно generation | Главным образом абзацы; возможно локальная связность | СЕЙЧАС |
| **P1. Draft-layout ablation** | Повтор P1, но перед editor заменить пустые строки draft на нейтральные separators или пронумерованные смысловые атомы; финал должен удалить ID | Токены ≈ те же; ручная подготовка | Проверяет якорение на форме черновика | СЕЙЧАС; ПРОД-МИНОР при победе |
| **P1. Semantic-first vs combined** | На том же P1 сравнить один combined editor с двумя узкими проходами: bilingual semantic repair → target-only literary reflow; одинаковый coverage gate | Примерно +1 output-пасс; потенциально до ~2× editor-output, измерить | Первый проход — смысл, второй — абзацы/русский; снимает конкуренцию мандатов | СЕЙЧАС; ПРОД-МИНОР |
| **P1. Reference ±1** | К P1 дать previous source+target tail и next source paragraph, явно `REFERENCE — НЕ ПЕРЕВОДИТЬ`; три отдельные абляции prev / next / both | +сотни input-токенов, без нового output | Coreference/ellipsis/cataphora около стыков | СЕЙЧАС; ПРОД-МИНОР |
| **P2. Chapter card** | Один раз вручную/LLM извлечь для главы сущности, отношения, локацию, время, цель и unresolved refs; подать только релевантную компактную карточку каждому trap | Один pre-pass/глава + ~100300 input-ток./чанк; точный COGS замерить | Дальние связи без полной главы | СЕЙЧАС как ручной arm; Ф2 для durable auto-state |
| **P2. Whole-chapter editor diagnostic** | Склеить lossless source и drafts главы, один bilingual edit; те же prompt/few-shot; строгий atom coverage и sanitizer | Меньше fixed overhead, но большой input/output и дорогой retry | Верхняя диагностическая граница reflow/связности; не prod-фаворит | СЕЙЧАС диагностика; Ф2 runner при победе |
| **P2. Discourse packet** | Ручные пакеты по сцене/ходу при сопоставимом 1,5k и 3k бюджете; сравнить с fixed packing | Ручная разметка; API цена близка size-matched | Изолирует качество границ от размера | СЕЙЧАС диагностика; ПРОД-МИНОР/Ф2 для сегментатора |
| **P2. Model floor 2×2** | Текущая дешёвая и согласованная frontier-модель × baseline и лучший P1/P2 context. Одинаковые тексты/brief/output cap | 4 клетки; per-call cap; frontier только на traps+1 главе | Отделяет потолок модели от организации | СЕЙЧАС |
| **P3. Size/retry curve** | 0,75k / 1,5k / 3k / глава, но отдельно fixed vs discourse boundary; ≥3 repeats только для операционной стохастики, не для «перерисовать качество» | Сохранять input/output/reasoning/retry токены и $ | Находит внутренний оптимум и цену отказа | СЕЙЧАС диагностика |
| **P3. Proper-noun/genre gap cleanup** | До blind-пакета закрыть известные 甲乙丙丁/资质 и иные однозначные gaps, но не менять спорные формы между arms | Дешёвая курация; один resnapshot только после решения | Локальные смысл/жанр-дефекты, не дискурс | СЕЙЧАС |
| **P4. Auto scene-state / retrieval** | Только если compact manual card даёт лифт: автоматический annotator + long/short memory; отдельная проверка ошибок карточки | Новый pre-pass, хранение, retrieval, versioning | Дальняя связность/последовательность | Ф2 |
| **P4. Voice/address/reveal memory** | Не смешивать с текущим полигоном двух претензий; отдельные заранее размеченные случаи | Уже спроектированный дополнительный слой | Голос, отношения, спойлеры; не основная абзацность | Ф2 |
### C3. Что именно писать в сильном discourse-reflow prompt
Это не готовый «оптимальный промпт», а **арм для замера**. Не добавлять ручной verbose CoT reasoning-модели. Операционное ядро:
1. «Сначала молча определи смысловые ходы: единый фокал/наблюдатель; действие и непосредственная реакция; одна тема рассуждения; смена говорящего, времени, места или фокала».
2. «Один повествовательный ход обычно оформляй одним русским абзацем, даже если китайский исходник разбит на однофразовые строки. Не объединяй только ради длины».
3. «Каждую новую реплику — с нового абзаца через тире; слова автора при той же реплике оставляй в её абзаце».
4. «Разрешено объединять и делить русские предложения; запрещено терять смысловые атомы. Число предложений и абзацев не обязано совпадать».
5. «REFERENCE-блоки нужны только для разрешения связей; не переводи и не пересказывай их в выходе».
Few-shot должны быть минимальными и ортогональными: narrative N:1, dialogue 1:N, focal-shift boundary. Для DeepSeek thinking-arm сначала проверить zero-shot против few-shot из-за уже задокументированной модельной специфики research/15; не переносить результат между моделями.
### C4. Метрики и гейты — пререгистрировать
| Ось | Первичный показатель | Аварийный гейт |
|---|---|---|
| Русская абзацность | Blind preference русскоязычного читателя + доля заранее размеченных paragraph traps, решённых правильно | Нельзя побеждать только меньшим числом абзацев |
| Смысл внутри чанка | Билингвальная trap accuracy с обязательным supporting span | Любая инверсия действия/участника = catastrophe независимо от среднего ранга |
| Смысл через границу | Accuracy отдельно по prev-supported / next-supported / chapter-supported | Random-context perturbation не должен давать тот же результат, иначе context не используется |
| Полнота | Покрытие смысловых атомов, не совпадение числа предложений | Любой пропуск заголовка/события дисквалифицирует arm на этом фрагменте |
| Операционность | `$`, input/output/reasoning tokens, latency, retries по причинам, **повторно оплаченные токены** | Per-call predicted-cost cap до запуска; не group-level cap (урок exp13) |
| Робастность | Leave-one-judge-out + отдельный catastrophe screen | Коррелированные колонки одного судьи не считаются независимыми сигналами |
**CONFIRMED.** Контекстный arm должен иметь correct-context vs shuffled-context perturbation: иначе улучшение нельзя приписать использованию опоры. Источник: [Mohammed & Niculae 2024](https://aclanthology.org/2024.findings-eacl.113/), доступ 2026-07-11.
### C5. Критерии решения после полигона
- Если **P1 discourse prompt** закрывает абзацы без падения fidelity — катить prompt/few-shot; размер не менять.
- Если помогает только **draft-layout ablation** — проблема в формальном якоре, строить deformat/atom rendering, не chapter editor.
- Если **±1 reference** закрывает большинство смысловых traps — строить малое context-window rendering до Ф2-памяти.
- Если нужна **chapter card**, но whole chapter не лучше — строить state extraction/retrieval в Ф2.
- Если **whole chapter** выигрывает и по fidelity, и по абзацам, и по retry-adjusted COGS — только тогда проектировать per-stage granularity; повторить на более длинной главе до решения.
- Если сильная модель выигрывает в обеих колонках 2×2, а организация почти не помогает — зафиксирован model floor; не строить сложную память ради слабой модели.
- Если организация помогает обеим моделям, а сильная+организация даёт дополнительный лифт — разделить near-term context fix и premium model tier.
## §D. Вопросы, на которые не хватило данных
1. **Где именно supporting context у мест владельца?** D35 сообщает около 1,28 стыка чанков на главу, но нет разметки: какой процент смысловых провалов разрешается внутри чанка, предыдущим абзацем, следующим абзацем, всей главой или знанием мира.
2. **Какова реальная длина/токенизация главы в выбранных traps?** Без распределения нельзя заранее оценить whole-chapter retry exposure и lost-in-middle.
3. **Какой frontend/model будет «ChatGPT-arm» полигона?** Эффект prompt format и few-shot модель-специфичен; нельзя честно выдать единый prompt winner без точного model ID/posture.
4. **Сохраняются ли source paragraph IDs до editor rendering?** Это определяет, можно ли сделать atom coverage/deformat без runner-изменения.
5. **Можно ли дать editor соседний source/target как non-output reference текущим renderer-ом?** Если нет, ручной полигон всё равно возможен, но production-оценка стройки меняется с ПРОД-МИНОР на Ф2 runner work.
6. **Каковы retry causes по размеру на боевых моделях?** Нужны отдельно timeout, refusal, length, echo, sanitizer и decode; общий retry-rate скрывает разные зависимости от `c`.
7. **Есть ли канонический человеческий/фанатский zh→ru фрагмент с хорошей русской репараграфизацией?** Он нужен как calibration/few-shot, но не как единственный reference style. В репозиторий книжный текст переносить нельзя.
8. **Как owner оценивает допустимую степень синтаксического split/merge?** Текущий запрет «не выбрасывай и не добавляй предложения» двусмыслен; нужно подтвердить, что сохраняется содержание, а не sentence count.
9. **Насколько front matter должен входить в приёмку художественности?** Его регистр отличается от романа и может искажать итог главы 1.
10. **Какой порог успеха «минимально художественно»?** Предлагается операционализировать: обе претензии закрыты на ≥80% заранее размеченных traps, 0 катастроф смысла, и blind majority предпочитает arm baseline на каждой из трёх регистровых глав. Число 80% — предложение для пререгистрации, не внешний факт.
### Финальный вердикт
**PLAUSIBLE.** Самый дешёвый следующий ход — не ещё один общий model bake-off и не немедленная Ф2-память. Это короткий причинный полигон: текущий baseline → discourse/few-shot reflow → deformatted draft → ±1 reference, затем 2×2 с frontier-моделью. Whole-chapter arm нужен как диагностическая граница, но не как заранее выбранная архитектура. Автоматический scene-state/DelTA-класс оправдан только если компактная ручная chapter card сначала докажет лифт.

View file

@ -0,0 +1,345 @@
# research/18 — Рычаги качества: как дотянуть текущую фазу до минимально-художественного zh→ru
<!-- ─────────────────────────────────────────────────────────────────────────
ОРКЕСТРАТОР — РЕВЬЮ-ШАПКА (лендинг, D36, 12.07 №4). Тело §A НЕ тронуто (заморожено;
sha256 44f90364… СВЕРЕН побайтно из закоммиченных байтов между BEGIN/END → MATCH →
§A доказуемо не редактировалась после заморозки). Поправки — в этой шапке и в §E
(«испр. оркестратором»). Полный разбор — PROGRESS §лендинг D36 + D-лог D36.
ВЕРДИКТ: **ACCEPT_WITH_FIXES.** Более ценный из двух входов: единственный отвечает на
вопрос владельца «конвенция vs стиль» с zh→ru источниками; строгость по COGS; честные
само-поправки; каждый §C-арм привязан к D-номерам и re-gate D34.3. Несущий диагноз и
набор §C-армов подтверждены; дефекты — цитатно-рамочные, ядро не рушат.
НЕЗАВИСИМАЯ ВЕРИФИКАЦИЯ (мультиагентный воркфлоу, 26 агентов, первоисточники + реплика
сырья, $0, refute-by-default; author≠reviewer к отчёту):
- **Источники: 57/57 несущих цитат СУЩЕСТВУЮТ — 0 сфабрикованных.** Проверены ВСЕ «2026»-
препринты (2601.08070 / 2605.31056 / 2605.29800 / 2605.13596 / 2605.13368 / 2511.09796
и др. резолвятся на arXiv к заявленным заголовкам). 50/57 — claim-fidelity полная; 7 —
«частично» (источник реален, атрибуция переисчерпана; поправки 13 ниже).
- **Эмпирика воспроизведена на сырье:** ch5.0 (draft 5425 симв.→финал ПУСТ, `sanitizer_defect`)
и ch20.0 — ТОЧНО; CJK-утечка **13 финалов — точно** (draft-«21» включает U+3000-отступ —
настоящих иероглифов в draft = 9); 41/51 ~1:1 — в допуске (знаменатель точен, числитель
толеранс-чувствителен, вывод устойчив); gl.7-инверсия (没有一个不知道→«никто не знал») и
gl.8-сплющивание (物是人非→«всё изменилось») — фактически ПРИСУТСТВУЮТ (тяжесть — на
fidelity re-gate полигона, не здесь).
- **Ван Цуй (несущий вклад) — ПОДТВЕРЖДЁН по ТЕЛУ статьи:** скептик-агент декодировал
CID/Identity-H шрифт PDF (~42к симв., 7 ToUnicode-CMap) → 5 техник verbatim + причастные/
деепричастные обороты + подчинение как инструмент слияния + прескриптивная необходимость.
Вестник МГУ Сер.22, 2024 №3, с.86105, DOI 10.55959/MSU2074-6636-22-2024-17-3-86-105,
рецензирован — реальный peer-reviewed источник (не экстраполяция).
- **Анти-анкоринг:** гардрейлов не нарушено; ни один D-номер не течёт в §A; книжные цитаты
≤15 слов. Минор-провенанс: «(идея владельца)» на слое конвенций пары (§A4.4) не
прослеживается к разрешённым фазе-1 входам (возможна устная вводная — не задокументирована).
ПОПРАВКИ К ЛЕНДИНГУ (§A заморожена → корректны здесь; §E дополнена ниже):
1. **[цитата] DocRepair-числа** (deixis 50.0→91.8 / когезия 45.9→80.6 / эллипсис 53.0→86.4 /
73% предпочтения; §A4.8, §B2.4) — числа ВСЕ верны, но принадлежат ОТДЕЛЬНОЙ статье DocRepair
«Context-Aware Monolingual Repair for NMT» (EMNLP-IJCNLP 2019, aclanthology **D19-1081** /
arXiv **1909.01383**), НЕ процитированной ACL-2019 **P19-1116** (там CADec 50.0→81.6). Обе
Voita/Sennrich/Titov 2019. Вывод (монолингв. RU repair-пасс работает, EN→RU, с этими
магнитудами) СТОИТ; правка — расщепить две цитаты (сделано в §E).
2. **[цитата] TransAgents** — §A зовёт «TACL-версия» (arXiv 2405.11804, «To appear at TACL» —
подтверждено), §E зовёт «PP 2024-05»: выбрать одно (accepted-but-preprint точнее). Это
ДРУГАЯ статья, чем EMNLP-demo `2024.emnlp-demo.14` в ChatGPT-отчёте — не конфликт, две
реальные статьи об одной системе (см. §E).
3. **[цитата] Z5 «Li & Thompson»** (RG 235852523) — на деле Dingxu Shi, «Topic and Topic-Comment
Constructions in Mandarin» (Language 76(2), 2000); клейм топик-комментария верен, автор-метка
ошибочна. **Z8 «96% чэнъюй»** — числа НЕТ на процитированной Wikipedia (там «most»); суть
(подавляющее большинство четырёхзнаковые) верна, «96%» не источено.
4. **[рамка] Ван Цуй = прескрипция переводческой ТЕХНИКИ zh→ru, не «связующая норма языка».**
Рамка §A4.4/A5 «обязательная дискурс-операция наравне с нормой» слегка пере-возвышена: это
сильнейший маргинальный вклад отчёта (peer-reviewed техника: паратаксис→гипотаксис), но
ответ владельцу «конвенция, не стиль автора» несут в первую очередь Розенталь/Правила-1956
(нормы абзаца/диалога — CONFIRMED), а Ван Цуй — КАК их технически исполнить.
5. **[рамка] «Пост-черновая регрессия > многих качественных проблем»** (§A4.1/A2 headline) —
переоценено: ярчайший кейс (ch5.0-void) сам же исправлен в §B3 как ЭКСПОРТ-баг (не порча
смысла редактором); остаток = реальные, но узкие CJK-утечки + НЕподтверждённые инверсии (§A
помечает PLAUSIBLE). «Класс пост-черновой порчи существует» — честен; ранг «выше 2 претензий
владельца» — нет. Guard §C#5 всё равно дёшев → строить.
6. **[рамка] «Тройная сходимость»** (§B0) — оговорка про общую внешне-лит-ногу ПРИСУТСТВУЕТ и
честна (планка D25.10 взята). Уточнения оркестратора: (а) есть ВТОРАЯ необъявленная общая нога
оба §A читали одно сырьё/код (совпадение по «изоляции чанков / инертному reflow» тоже не
независимо); (б) цитатные базы двух отчётов почти НЕ пересекаются (~3 общие статьи) → там, где
литература всё же расходится, совпадение вывода СИЛЬНЕЕ, чем оговорка допускает; (в)
ChatGPT-заморозку класть в вес сходимости с дисконтом — её sha256 НЕ воспроизводится из
документа (внешний прогон владельца; см. шапку ChatGPT-отчёта).
───────────────────────────────────────────────────────────────────────────── -->
> Ресёрч-доклад независимой сессии-ресёрчера (D35.5). Вход эмпирической сессии полигона.
> Протокол — трёхфазный анти-анкоринг: §A построена ДО чтения наших решений (только две претензии владельца + сырьё пере-прогона + механизм-как-есть + собственный внешний ресёрч). §B/§C/§D — после чтения нашего стека.
> Каждый несущий клейм: вердикт **CONFIRMED / PLAUSIBLE / REFUTED** + источник (тип/дата). Препринт ≠ peer-review; вендор-клейм ≠ независимый замер; результат «в английский» ≠ доказательство «в русский» (помечаю экстраполяцию явно). Отчёт пройдёт адверсариальную верификацию оркестратора по первоисточникам.
---
<!-- BEGIN §A FROZEN — не редактировать после заморозки; sha256 ниже в маркере -->
## §A — «Чистый лист» (заморожено)
### A0. Метод и границы
Прочитано в фазе 1 (разрешённое): две претензии владельца; сырьё пере-прогона — исходник `guzhenren-slice25.gb18030.txt`, `rerun/records.json` (по-чанково: source/draft/final/флаги), `rerun/rerun-ru.txt`; механизм-как-есть — `backend/internal/pipeline/chunker.go`, `backend/prompts/{translator,editor}.md`. Плюс собственный внешний веб-ресёрч (52-агентный фан-аут с адверсариальной верификацией).
НЕ читалось (анти-анкоринг): `05-decisions-log.md`, хендоффы (`ORCHESTRATOR_HANDOFF.md`, `FIDELITY_REGATE_HANDOFF.md`), `rootcause_auto.json`, glossary-signoff, `diag/arms/*`, выводы приёмки. Заголовки последних коммитов присутствовали в среде сессии ambient — на содержание §A не опирался.
### A1. Механизм как есть (из кода и промптов)
- **Нарезка** (`chunker.go`): жадно пакует ЦЕЛЫЕ абзацы до `targetChunkTokens=1500` (код-конст, версионируется `chunkerVersion`, фолдится в снапшот); абзац сверх бюджета спускается к границам ПРЕДЛОЖЕНИЙ (предложение не рвётся). Детерминированно, чисто. Фактически ~2 чанка на главу (57 чанков / 25 глав), медиана исходного чанка ~1639 zh-символов.
- **Пайплайн**: по-чанково ПЕРЕВОД (draft) → по-чанково РЕДАКТУРА (bilingual, source+draft). Каждый чанк — в ИЗОЛЯЦИИ. НЕТ overlap между чанками, НЕТ running-summary, НЕТ контекста прошлых глав. Единственная кросс-чанковая память — термин-ГЛОССАРИЙ, добавляемый редактору.
- **translator.md**: только `{{text}}`; инструкции — «живой литературный русский», верстать по нормам РЯ (НЕ копировать построчную разбивку), прямая речь через тире.
- **editor.md**: bilingual, `{{text}}`(src)+`{{draft}}`; сверять смысл с исходником, убирать кальки, глоссарий СТРОГО; «собирай повествование в естественные русские абзацы (не копируя построчную разбивку)»; полнота — не выбрасывать/не добавлять.
### A2. Замеренная слабость (сырьё)
**Претензия 1 (рубленость) — ПОДТВЕРЖДЕНА замером.** 41/51 нарративных чанков дают ~1:1 отношение «финальных абзацев к строкам исходника»; 58% ненарративных абзацев — одно предложение; медиана предложений/нарративный-абзац = 1.0. Инструкция reflow, присутствующая в ОБОИХ промптах, практически инертна.
**Локализация reflow-провала.** Черновик уже рубленый в 43/49 чанков (переводчик зеркалит построчную разбивку). Редактор СОХРАНЯЕТ структуру черновика в 37/49, СЛИВАЕТ лишь в 1/49 → редактор структуро-сохраняющий, НЕ работает layout-пассом. Вариативность reflow живёт в основном на стадии черновика (гл.11 черновик 25 абз., гл.13 — 14: переводчик там СЛИЛ). Оформление диалогов через тире — работает.
**Претензия 2 (связность/смысл) — ПОДТВЕРЖДЕНА чтением zh↔ru гл.512.** На уровне ПРЕДЛОЖЕНИЯ голос в целом приемлем, редактура часто улучшает (внутренний монолог в кавычках, разбивка атрибуции, лексические апгрейды). «Слабая художественность» идёт не от предложенческой translationese, а от кластера сбоев связности/полноты/терминологии. Конкретика:
- гл.7: инверсия двойного отрицания 没有一个不知道 («все знали») → «никто не знал» (противоречит главе). [дефект в черновике, редактура не починила]
- гл.8: 物是人非 (заглавие-ключ) сплющено до «всё изменилось», теряя контраст «вещи те же — люди иные».
- Терминология grade-системы 甲乙丙丁 — дрейф между разряд А/Б/В/Г, числовым «первого/третьего ранга» (коллизия с 转-рангом гу-мастера) и точечными сырыми глифами.
**Третья ось, НЕ входившая в претензии владельца (самое ценное наблюдение):** значимая доля «слабой художественности» — это РЕГРЕССИЯ ПОСЛЕ ЧЕРНОВИКА, а не качество перевода. Финал местами ХУЖЕ черновика:
- **гл.5.0: полный черновик 5425 симв. → финал ПУСТ, `edit_flag='sanitizer_defect'`** (собственный флаг пайплайна). Санитайзер обнулил целый чанк — миф об основании (Жэнь-цзу и три гу, метафора-ядро книги). Один из 2 пустых финалов на книгу. **[CONFIRMED — проверено мной по records.json.]**
- **Утечка CJK-глифов в вывод**: 13 строк финалов (и 21 строка черновиков) содержат сырые zh/полноширинные глифы; часть внесена редактурой (напр. гл.8 特产, гл.4.1 资质乙等 — в черновике корректно). **[CONFIRMED — проверено мной.]**
- Правки, ломающие смысл: гл.9 (переворот разряда В→Б у Фан Юаня, против всей его сюжетной линии низкого разряда), гл.10 (перекройка процентов восстановления в противоречивые «десятые/сотые») — **[PLAUSIBLE — наблюдение чтения; требует адверсариальной re-проверки оркестратором.]**
Вывод A2: перед постройкой машинерии связности имеет смысл СНАЧАЛА не давать пост-черновым стадиям (edit/sanitizer) разрушать уже годный черновик.
### A3. Карта «проблема → механизм» по осям
#### Ось 1. Дискурс-гранулярность zh→ru: где потолок — в моделях или в организации?
- **Абзац — эмпирически лучшая единица перевода, чем предложение** (меньше mistranslation/грамматики/несогласованности, естественнее верстается). **[CONFIRMED]** — Karpinska & Iyyer, *LLMs Effectively Leverage Document-level Context for Literary Translation* (WMT 2023, peer-reviewed, ACL 2023.wmt-1.41; arXiv 2304.03245). **Экстраполяция для нас:** мишени в статье — англ./польск./яп., zh как ИСТОЧНИК; направление «в русский» напрямую не мерено (польский — славянский прокси). Единственная модель — GPT-3.5.
- **Но у нас единица УЖЕ ~1600 симв. (много абзацев)** — то есть «апсайд от добавления контекста в единицу» в основном ПОТРАЧЕН; дальнейший рост единицы не даёт бесплатного качества. **[PLAUSIBLE]**
- **Потолок связности — в ОРГАНИЗАЦИИ (изоляция чанков), а не в сырой модели.** Кросс-предложенческий контекст даёт большой прирост на именно тех дискурс-феноменах, что суть претензии 2. **[CONFIRMED для направления в русский]** — Voita et al., *When a Good Translation is Wrong in Context* (ACL 2019, peer-reviewed, EN→RU OpenSubtitles): 7% индивидуально-верных пар неверны в контексте; окно 3 предложений поднимает deixis 50.0→81.6, лексич. когезию 45.9→58.1, VP-эллипсис — существенно. Домен — субтитры (разговорный), не проза; магнитуды индикативны.
- **«Потерянное в середине» ограничивает лишь ВЕРХНИЙ конец кривой** (целая глава / много чанков); на нашем ~1500-ток чанке эффект мягкий и НЕ объясняет текущие дефекты — это довод не прыгать к «глава целиком», а не диагноз. **[CONFIRMED]** — Liu et al., *Lost in the Middle* (TACL 2024; arXiv 2307.03172).
- **Ближайший индустриальный аналог нашего пайплайна** — TransAgents (мультиагентная «переводческая компания», zh→en вебновеллы): работает ПО ГЛАВАМ с персистентной Translation Guideline (глоссарий+резюме+тон+стиль), роли Senior/Junior Editor + Proofreader сверх голого translate→edit. **[CONFIRMED]** — TransAgents (TACL; arXiv 2405.11804). Оговорка: под капотом GPT-4-Turbo (фронтир), не дешёвая модель; человеко-предпочтение — монолингвально (слепо к верности).
#### Претензия 1. Абзацы/конвенции — это КОНВЕНЦИЯ ЯЗЫКА, академически кодифицированная, а не авторский стиль
Прямой ответ на вопрос владельца — **ДА, это норма русского языка, а не стиль одного автора:**
- **Русский абзац — логико-смысловая единица**, группирующая несколько предложений вокруг завершённой мысли; новый абзац — при логическом завершении мысли / смене темы-времени-места-говорящего. Построчно-однопредложенческое тело — по определению НЕ русское абзацирование. **[CONFIRMED]** — Текстология.ру, «Абзац как часть текста»; корпус-норма подтверждена независимо.
- **Диалог: каждая реплика — с красной строки через тире; кавычки для бегущего диалога не используются.** Слова автора — строго кодифицированная пунктуация (двоеточие/запятая-тире и т.д.). **[CONFIRMED]** — Розенталь, «Справочник», §47/§50 (Оформление прямой речи); Правила-1956 §195. (Источники — веб-зеркала Розенталя; нумерация разнится по изданиям.)
- **Китайская вебновелльная вёрстка расходится с РЯ по всем осям**: отступ    (U+3000×2, правило Ху Ши 1919), полноширинная пунктуация, диалог в 引号 «“ ”», привычка очень коротких абзацев (часто одно предложение / 自然段 для мобильного ритма). **[CONFIRMED]** — Wikipedia «Chinese punctuation» + история.
**Ключевой синтез:** корректный zh→ru reflow — это структурный трансформ из ЧЕТЫРЁХ операций, а не одна инструкция «не копируй разбивку»: (a) СЛИЯНИЕ подряд идущих коротких нарративных строк в многопредложенческие логические абзацы; (b) КОНВЕРСИЯ 引号-диалога в тире-абзацы по репликам; (c) НОРМАЛИЗАЦИЯ глифов (полн.→полуширинные, “ ”→« », — для речи); (d) СНЯТИЕ   -отступа. Операции (b),(c),(d) — **ДЕТЕРМИНИРОВАННЫЕ (код, без модели)**; операция (a) требует ДИСКУРСНОГО понимания, чем **сцепляет претензию 1 с претензией 2**. **[CONFIRMED как рамка]**
Почему инструкция игнорируется и чем чинить:
- **LLM surface-копирует построчную структуру входа** (переводы строк — высокосалиентные, near-синтаксические признаки; структурная персистенция), поэтому bilingual-редактор зеркалит one-sentence-per-line черновика. **[PLAUSIBLE]** — Sclar et al. (2024, 2310.11324, format-sensitivity) — аналогия, не прямой замер layout.
- **Гипотеза «негативный констрейнт («не копируй») сам по себе — главная причина» — REFUTED**: доказательства backfire негативных констрейнтов — слабые препринты про подавление англ. СЛОВ, не про zh→ru layout. **[PLAUSIBLE→REFUTED]**
- **Самый надёжный рычаг — few-shot экземпляры** (рубленый источник/черновик → слитый многопредложенческий целевой абзац), и особенно **target-side якорь** (реальный русский литературный абзац в контексте), т.к. модель копирует структурные решения из демонстраций. **[PLAUSIBLE]** — FollowBench (2024, 2310.20410) — смежная опора.
- **Отделить «дать верную русскую прозу» от «разложить в абзацы»** (отдельный reflow/layout-пасс или plan-then-write): инлайн-энфорсмент формата конкурирует с контент-целью; прирост измеримый, но скромный, +1 LLM-вызов. **[PLAUSIBLE]** — 2510.03595 (препринт).
- **Осторожно**: слияние предложений и укрупнение контекста ПОВЫШАЮТ риск ОПУЩЕНИЙ и путаницы атрибуции — агрессивный reflow сам может терять/скремблить смысл; нужен guard полноты. **[CONFIRMED]** — Karpinska & Iyyer (WMT 2023).
#### Претензия 2. Понимание связей/смысла на дистанции
- **Корневая причина — кросс-чанковая ИЗОЛЯЦИЯ.** Впрыск даже малого контекста (предыдущий src/tgt-хвост + running bilingual summary + реестр имён/антецедентов) даёт большие замеренные приросты consistency и дискурса — на ТОМ ЖЕ домене (китайские вебновеллы). **[CONFIRMED ядро]** — DelTA (ICLR 2025, peer-reviewed; arXiv 2410.08143): память-тиры (Proper-Noun Records, running summary), GuoFeng zh→en; средний прирост согласованности +4.58 (заголовочный +48.5 — единичный best-case). Оговорка: не →ru; часть опор — препринты.
- **zh-специфика: нулевые/опущенные местоимения и субъекты (zero anaphora)** — доминирующий драйвер провала на дистанции; русский (non-pro-drop, согласование род/число) требует ЭКСПЛИЦИТАЦИИ, а антецедент часто в ПРЕДЫДУЩЕМ предложении → корректное восстановление структурно НЕВОЗМОЖНО при поч-чанковой изоляции. **[CONFIRMED, что это архитектурный, а не только «дешёвая модель», баг]**. Голая инструкция «будь внимателен» почти не помогает; чинит только явный контекст/аннотация. **[PLAUSIBLE]** — препринт 2605.31056 (zh→en: <50% ZP базово, oracle-разметка +40 пт); экстраполяция на ru.
- **Глоссарий — слабейшая кросс-чанковая память**: адресует только лексическую когезию (~14% русских дискурс-ошибок), мимо deixis (~37%) и эллипсиса/морфологии (~29%). **[CONFIRMED]** — производно от Voita et al. (ACL 2019). Значит от глоссария в одиночку прироста связности ждать мало.
**Ранжирование лекарств претензии 2 (эффект / стройка):**
1. **Running bilingual summary + previous-chunk carryover** — лучший НЕистраченный рычаг: замерен прямо на китайских вебновеллах (DelTA), стоит ~1 малый вспом-вызов на ~20 предложений; source-primed контекст предпочтительнее переиспользования прошлого МАШИННОГО перевода (последнее роняет качество из-за накопления ошибок). **[CONFIRMED направление / PLAUSIBLE магнитуда для →ru]**
2. **Document/paragraph-level контекст** — лучший по доказательности, но у нас уже ПОТРАЧЕН (единица крупная).
3. **Аннотатор (MAPS-класс: ключевые слова/тема/демо)** — снижает локальную mistranslation, но SENTENCE-level, требует 3-4 кандидата + QE-выбор (3-4× цена), бьёт по локальной адекватности, не по дальней связности. **[PLAUSIBLE]**
4. **Сильнее модель** — крупнейший одиночный рычаг на дискурс, но лобовой конфликт с дешёвым COGS; контекст+память дают дешёвой модели закрыть бóльшую часть разрыва. **[PLAUSIBLE]**
5. **Self-refine / итеративный пост-эдит — СПОРНО для MT**: полирует fluency/translationese, даёт скромный прирост и лишь при внешнем error/QE-сигнале, смещён «в английский», может деградировать/галлюцинировать на итерациях; связность, к которой модель НЕ имела доступа, не восстановит. **[CONFIRMED, что спорно]** — Chen et al. (EAMT 2024, TEaR) + др.
#### Ось 4. Кривая chunk ↔ качество ↔ биллинг ↔ ретраи (рамка для пре-регистрации)
- **Форма — перевёрнутая U**: снизу ограничена потерей когезии у слишком мелкой единицы (Karpinska), сверху — базово-модельной/позиционной деградацией у слишком крупной (Lost-in-Middle; для НЕ-дообученных инструкт-моделей качество ПАДАЕТ с ростом единицы — 2504.12140, препринт, малые модели). **[PLAUSIBLE]**
- **COGS доминируется ВЫХОДНЫМИ токенами**, + «фертильность» русского/кириллицы на англо-центричных токенизаторах (~22.5× англ.). Значит КАЖДЫЙ добавленный русско-генерящий LLM-пасс множит доминирующую статью; префикс-кэш скидывает лишь дешёвый ВХОД. **[CONFIRMED]** — Petrov et al. (NeurIPS 2023, tokenizer fairness) для фертильности.
- **Префикс-кэш делает пере-слание system+glossary почти бесплатным**НО только если статику класть ПЕРВОЙ, а volatile-контекст (running summary, меняющийся каждый чанк) ПОСЛЕ неё (любой volatile-префикс инвалидирует кэш ниже). Тогда worry «глоссарий шлётся каждый чанк» — почти не-проблема. **[CONFIRMED для наших провайдеров с оговоркой ordering]**
- **Retry blast radius тянет оптимум к МЕНЬШЕЙ единице** (переген всего чанка при мисматче) — центральное напряжение против качественного тяготения к крупной; оптимизировать надо на RETRY-ADJUSTED output-cost, а связность подавать глубиной кэшированного carryover, а НЕ размером единицы. **[PLAUSIBLE]**
- **Вывод оси 4:** ОТВЯЗАТЬ дискурс-единицу от биллинг-единицы: держать чанк небольшим (дёшево, малый blast radius, меньше output-деградации), а когезию давать кэшированным summary/carryover.
### A4. Оси, которые команда могла не увидеть (приоритетно)
1. **Пост-черновая регрессия > многих «качественных» проблем.** Санитайзер/редактура местами уничтожают годный черновик (гл.5 обнулён; CJK-утечки; правки-перевороты смысла). Дешевле всего: гейт «финал не должен быть пустым/короче черновика на X%», «нет сырых CJK-глифов в выводе», «числа/термины из черновика не переворачиваются». Это адресует «слабую художественность» БЕЗ новой машинерии. **[CONFIRMED наблюдение]**
2. **Reflow ЧАСТИЧНО БЕСПЛАТЕН.** Операции (b)/(c)/(d) 4-операционного трансформа — детерминированные (код-нормализация глифов/диалога/отступа); только (a) слияние — дискурсная. Отделить дешёвое-детерминированное от дорогого-модельного. **[CONFIRMED рамка]**
3. **Метрика-инверсия для zh→ru — конкретно, не абстрактно.** На WMT24 zh→ru простой Google-NMT обошёл ВСЕ LLM/мультиагентные системы по d-BLEU (human-eval отсутствовал) — прямая same-pair демонстрация, что гейтинг художественности на авто-метрике ИНВЕРТИРУЕТ ранжирование. Следствие: претензию 1 сложить в дешёвый ДЕТЕРМИНИРОВАННЫЙ структурный KPI; художественность/связность — не на BLEU/COMET. **[PLAUSIBLE — источник WMT24 zh→ru; точный URL — к сверке оркестратором]**
4. **Пара-конвенции как переиспользуемый ВЕРСИОНИРУЕМЫЙ слой** (идея владельца). Отделить (a) конвенции ПАРЫ ±жанр [zh→ru: паратаксис→гипотаксис, красная строка, тире, эксплицитация опущенных местоимений, политика 成语] — глобальный версионируемый ассет, ключ (src→tgt[×регистр]); (b) память КНИГИ (глоссарий/голоса) — как сейчас; (c) ручки прогона (venuti/honorifics). Грузонесущее свойство — версионирование+снапшот-фолд (смена = громкая ре-трансляция, как `chunkerVersion`), а не носитель (config-ассет или таблица БД). Есть **прямая zh→ru (не экстраполяция) peer-reviewed прескрипция**: 5 техник передачи китайских паратактических предложений в русский — (1) построить иерархию в русском, (2) сегментировать по смысловым единицам, (3) промаркировать вид/время предикатов по нормам РЯ, (4) варьировать лексику, (5) добавлять связки по контексту. **[CONFIRMED]** — Ван Цуй, «Анализ китайских паратактических предложений и их перевода на русский язык», Вестник МГУ Сер. 22 (Теория перевода). Русский-специфичный инструментарий слияния — причастные/деепричастные обороты + подчинительные союзы.
- Открытая развилка (к замеру, не приговор): РАЗМЕР/ФОРМА пакета = вопрос «способность vs активация»; большой правилник может жечь токены и размывать внимание, если знание латентно; возможно, короткий указатель или 12 few-shot экземпляра бьют точнее. Ключ может быть пара×жанр. Пакет должен нести ОГРАНИЧИТЕЛИ против коллизии с инвариантом полноты (слияние/эксплицитация — на грани «добавления»).
5. **Способность vs активация — диагностический арм.** Один и тот же reflow-промпт × дешёвая vs фронтир-модель: фронтир верстает, дешёвая нет → gap способности; ни та ни другая → недоспецифицированный промпт; краткое правило/пример чинит дешёвую → это была активация. Разводит «модель не умеет» от «модель недоактивирована».
6. **Бюджет чанка — в ВЫХОДНЫХ токенах на реальном токенизаторе (DeepSeek/GLM), а не в zh-символах**; пере-калибровать под фертильность кириллицы и стабильный output-потолок модели (~34k ток у мелких — раньше). **[CONFIRMED довод]** — Petrov et al. (NeurIPS 2023).
7. **Разметка нулевых местоимений/кореференции исходника** как дешёвый препроцесс перед переводом (zh zero-pronoun → явная маркировка): oracle-разметка стоит +40 пт там, где инструкции ~ничего. **[PLAUSIBLE, zh→en, экстраполяция на →ru]**
8. **DocRepair-класс: монолингвальный РУССКИЙ reflow/repair-пасс**, который НЕ видит китайский, а чинит связность/абзацы уже переведённого + контекст соседей (это шаг Найды «реструктуризация»). EN→RU: deixis 50.0→91.8, лексич. когезия 45.9→80.6, эллипсис-флексия 53.0→86.4; аннотаторы предпочли 73%. **[CONFIRMED для EN→RU]** — Voita et al. (ACL 2019, DocRepair). Это отделяет fluency/layout-работу от fidelity-работы.
### A5. Гипотеза-резюме §A (моя карта до чтения нашего стека)
1. «Слабая художественность» = сумма ТРЁХ, не двух, слоёв: (i) **пост-черновая регрессия** (санитайзер/редактура ломают годный черновик) — вероятно, самый дешёвый и недооценённый; (ii) **рубленость** = source-mirroring + инертная инструкция, чинится дёшево смесью детерминированной нормализации + few-shot/target-anchor + (возможно) отдельного layout-пасса; часть рубленостей (слияние) — дискурсная и сцеплена с (iii); (iii) **связность на дистанции** = архитектурный баг изоляции чанков + zh zero-anaphora; лучший дешёвый рычаг — running bilingual summary + prev-chunk carryover (кэш-дружественно), НЕ глоссарий и НЕ self-refine.
2. Потолок текущей фазы — в ОРГАНИЗАЦИИ (контекст/память/промпт/нарезка/пост-обработка), не в сырой дешёвой модели; переход на фронтир — рычаг, но не первый по эффективности-на-стройку.
3. Измерять: претензию 1 — дешёвым ДЕТЕРМИНИРОВАННЫМ структурным KPI (без судьи); претензию 2 — судья/QA-стиль (TREQA) или дешёвый человеко-протокол (ESA); НИКОГДА не гейтить художественность на BLEU/COMET (для zh→ru доказана инверсия); беречься «сфабрикованной сходимости» судей (устанавливать независимость до агрегации).
<!-- END §A FROZEN -->
<!-- FREEZE-MARKER §A: sha256=44f90364c786e86bf12e977b8a6712e9e2e89e7cd53d92540def624d842cce6f (хеш байтов между маркерами BEGIN..END; оркестратор: сверить перед фазой 2; ресёрчер §A после заморозки не редактировал — §B/§C/§D только ниже) -->
---
## §B — Дифф: §A против нашего стека (и параллельного ChatGPT-отчёта)
### B0. Метод и главный результат диффа
§A заморожена (sha256 `44f90364…`) ДО чтения: `05-decisions-log` (D1D35), `research/07/15/16`, exp04/09/12/13, и параллельного `research/18-quality-levers-chatgpt.md`. Главный результат: **тройная независимая сходимость.** Три пути — (i) моя §A (сырьё+внешняя литература), (ii) ChatGPT-§A (тоже заморожена до стека, sha256 `b42c6f6e…`), (iii) эмпирический стек команды (D26→D35) — сошлись на диагнозе и на большинстве рычагов. Это сильное подтверждение. **Оговорка против сфабрикованной сходимости (D25.10/D32.4):** независимы попарно ПУТИ (я не читал ChatGPT до заморозки; обе §A заморожены до стека; команда пришла эмпирикой), но нога «внешняя MT-литература» ОБЩАЯ у меня и ChatGPT — совпадения там ≠ три независимых голоса. Поэтому ценность §A не в «ещё раз то же», а в остатке: где я расхожусь и что добавляю (B2), плюс честные само-поправки (B3).
### B1. Где §A СОШЛАСЬ с командой (команда угадала — не дублировать, подтвердить)
| §A-ось | У команды уже есть | Статус |
|---|---|---|
| Reflow зеркалит рубленость исходника = промпт-рычаг | D35.1 дословно; D30.2 снял «сохраняй разбивку», мандат репараграфизации | ✅ угадано |
| Within-chunk (промпт-фиксимо) vs cross-chunk (Ф2) | D35.1 (чанк пакует ~34 абз. / ~1.28 стыка на главу) | ✅ угадано |
| Ось «нарезка × промпт» — ключевой невыжатый рычаг | D35.3 (exp04/12/13 крутили только МОДЕЛЬ) | ✅ угадано |
| Source-line strip как рычаг претензии 1 | **exp12:174 уже предлагает** снять построчную разбивку | ✅ угадано (моя §A НЕ первая) |
| Русские нормы абзаца/диалога с первоисточниками | **research/16 §2.3: Розенталь §52-53, Лопатин ПАС §138, Правила-1956 §51**; тире-flagger | ✅ угадано (полнее, чем §A знала — см. B3) |
| Running summary / annotator / межглавные резюме | Ф2: DelTA-обоснован (D21, D30.8); **exp09-M2 = «глоссарий+скользящее резюме» уже арм** | ✅ угадано (как Ф2/пилот-арм) |
| Output-санитайзер / пост-черновые порчи | D30.3/D33/D33.1 (утёкшие преамбулы, латиница, markdown) | ✅ угадано |
| Пустые финалы ch5/ch20 (моя «третья ось») | **D35.4a: известный экспорт-баг** (санитайзер флагает ведущий `###`, экспорт дропает) | ✅ угадано (см. B3) |
| Сырой китайский 甲乙丙丁/资质 в глоссарий | D35.4c (глоссарий-адресуемая часть претензии 2) | ✅ угадано |
| Декаплинг дискурс-единицы от биллинг-единицы | D35.7 (`draft=чанк/edit=глава`, runner-уровень) | ✅ угадано |
| Метрика: детерминированный структурный KPI + judge-дисциплина | D29.1d диалог-flagger; 07:86 translationese-метрики; D13.3 панель; D25.10/D32.4 анти-сходимость; D30.1 span-судья | ✅ угадано (команда МЕТОДИЧЕСКИ впереди) |
| Frontier-арм как диагностика потолка ≈ capability-vs-activation | D35.3 | ✅ угадано |
| Промптинг литперевода (task-framing, few-shot по классам, sandwich, no manual CoT, «plan+translate в одном вызове не армить») | research/15 §1.2/§3 обширно | ✅ угадано (АУГМЕНТИРОВАТЬ, не дублировать) |
Вывод B1: команда угадала правильно почти всю карту. Диагноз D35 = моя §A. Это повышает доверие, что «строить» надо по этой карте — но и снижает новизну §A; реальная ценность — в B2.
### B2. Где §A РАСХОДИТСЯ / команда недостроила (несущий остаток)
1. **zh→ru ДИСКУРС-ТРАНСФОРМ как переводческая теория — самая тонкая ось стека.** research/16 grounds РУССКУЮ сторону (нормы абзаца/диалога) и на уровне ВЫРАВНИВАНИЯ отмечает китайский паратаксис (Xue&Yang ACL 2011, ~16.6% запятых — границы), но **нет переводоведческой рамки zh→ru**: паратаксис→гипотаксис (意合/形合), 流水句, обязательность сращивания. Критично: research/16 §2.3 считает слияние (N:1) «дискреционным стилем, не нормой» — а **прямая zh→ru peer-reviewed прескрипция (Ван Цуй, Вестник МГУ Сер.22) говорит: пересборка паратактической цепи в русскую иерархию ОБЯЗАТЕЛЬНА** (5 техник: иерархия / сегментация по смыслу / вид-время / лексика / добавление связок), а инструмент — причастные/деепричастные обороты + подчинение. **Это апгрейдит «слияние дискреционно» → «слияние — требуемая дискурс-операция, и вот КАК».** Даёт reflow-промпту реальный zh→ru СОДЕРЖАНИЕ, а не «не копируй разбивку». **[CONFIRMED; прямой источник, не экстраполяция]** — самый сильный вклад §A, прямо отвечает на вопрос владельца «это конвенция языка, а не стиль автора».
2. **Слой «пакет конвенций пары» как ВЕРСИОНИРУЕМЫЙ артефакт (идея владельца) — структурный пробел.** research/07 держит конвенции пары как КОНТЕНТ (Палладий/Поливанов, Venuti, Нора Галь), но **«разбросаны как brief/config-политики, отдельного слоя нет»** (вывод фазы-2). Отделить (пара±жанр) от (книга) от (прогон); ключ (src→tgt[×регистр]); снапшот-фолд как `chunkerVersion`. Не носитель, а версионирование — грузонесущее. → §C-архитектура.
3. **Running summary — переоценить для near-term, не только пилот.** Команда СОЗНАТЕЛЬНО не строит LLM-резюме (research/15: «DelTA платит вызовами — мы нет», COGS-козырь); имеет лишь детерминированную инъекцию срезов памяти (Aho-Corasick) + M2-арм в пилоте. Но DelTA даёт бенефит именно бегущим резюме на ТОМ ЖЕ домене (вебновеллы), а COGS-возражение слабеет при кэш-дружественном ordering (резюме — 1 малый вызов на ~20 предложений, вход near-free при префикс-кэше). → предлагаю мерить running summary как near-term рычаг претензии-2-кросс-чанк, не хоронить на COGS до замера.
4. **DocRepair-класс (монолингвальный РУССКИЙ repair-пасс) с числами В РУССКИЙ.** ChatGPT тоже флоатит «отдельный target-only пасс», но без into-ru доказательств; у меня Voita 2019 EN→RU: deixis 50→91.8, когезия 45.9→80.6. Опция для op(a)+связность отдельно от билингв-fidelity-редактуры (editor-mono.md существует, но DORMANT — D33.4a). **[CONFIRMED для EN→RU]**
5. **Стоимостная строгость: фертильность-налог + cache-ordering + перевёрнутая-U.** ChatGPT имеет формулу+retry-множитель; команда — exp08+чанкер-конст+D35.6-арм. Добавляю: COGS output-доминирован + **кириллица-фертильность ~22.5× (Petrov NeurIPS 2023)** → бюджет чанка в ВЫХОДНЫХ токенах на реальном токенизаторе, не zh-символах; **cache-ordering** (статик первым, volatile-summary после — иначе кэш бьётся); перевёрнутая-U (когезия снизу, позиционная деградация сверху).
6. **Метрика-инверсия zh→ru — конкретный датапоинт.** WMT24 zh→ru: Google-NMT обошёл все LLM/мультиагент по d-BLEU без human-eval → не гейтить художественность на авто-метрике (у команды дисциплина есть, конкретного zh→ru датапоинта — нет). **[PLAUSIBLE — URL к сверке]**
### B3. Само-поправки §A после чтения стека (честно)
- **ch5.0 «санитайзер обнулил чанк» → НЕТ: экспорт-баг D35.4a.** Санитайзер ФЛАГАЕТ ведущий `###`, а экспорт дропает флагнутый чанк в пустоту вместо strip/fallback; текст правки ЦЕЛ. Класс тот же (пост-черновая порча), но механизм — экспорт, не санитайзер-void. Команда уже поймала (полигон обязан починить ch5/ch20 до слепых пакетов).
- **«команда не заземлила reflow в Розенталя» → неверно.** research/16 заземлила РУССКУЮ сторону (Розенталь §52-53, Лопатин, Правила-1956). Точный пробел уже — zh→ru ТРАНСФОРМ-сторона (B2.1), не русские нормы.
- **source-line strip как «новый рычаг» → не новый:** exp12:174 уже предлагает. §A-статус «оси, что могли не увидеть» для этого пункта снимаю.
### B4. Дифф против параллельного ChatGPT-отчёта (чтобы не дублировать)
Сходятся (обе независимые §A): source-strip, discourse-move few-shot, look-behind/look-ahead (особ. для zh нулевого подлежащего), chapter-card, декаплинг трёх единиц (coverage-atom ≠ generation-unit ≠ reference-span), perturbation-тест (correct vs random context) как центральная метрика, детерминированный структурный KPI, model-floor 2×2, «whole-chapter только как диагностический потолок», retry-adjusted cost. **Совпадение двух независимо-замороженных §A — корроборация** (с оговоркой общей лит-ноги B0).
Мой маргинальный вклад СВЕРХ ChatGPT: (1) zh→ru академ-грунтинг Ван Цуй/паратаксис-гипотаксис — ChatGPT ЯВНО пишет «zh→ru якорей нет»; (2) версионируемый слой пары; (3) DocRepair into-ru числа; (4) фертильность-налог + cache-ordering; (5) метрика-инверсия zh→ru. ChatGPT сверх меня: развёрнутая two-stage eval-схема (Stage I причинная проба на 68 ловушках / Stage II слепые 3 финалиста), «дискурсный пакет» как generation-unit, трёх-единичная факторизация — ценно, рекомендую взять в §C (не переизобретаю, ссылаюсь).
---
## §C — Рекомендации для полигона (таблица-вход эмпирической сессии D35.6)
Формат: {механизм → как измерить → цена → эффект на претензию → фаза}. Явно разведено: **СЕЙЧАС** (промпт/нарезка/глоссарий/детерминированный код, без Ф2-машинерии) vs **Ф2** (память/аннотатор/reference-тома). Строки согласованы с осями D35.6 (нарезка×промпт, frontier-арм, кривая размер↔качество↔биллинг↔ретраи, fidelity re-gate, слепые пакеты) и с методик-guard D32.4 (fidelity-first, leave-one-out, катастроф-скрин, per-call кап, независимость сигналов).
### C1. СЕЙЧАС — промпт/нарезка/глоссарий/детерминированный код
| # | Механизм | Как измерить (арм/проба) | Цена | Эффект → претензия | Фаза |
|---|---|---|---|---|---|
| 1 | **Дискурс-reflow промпт с zh→ru СОДЕРЖАНИЕМ** (5 техник Ван Цуй: иерархия/сегментация/вид-время/лексика/связки; причастные-деепричастные обороты; Розенталь-диалог) вместо «не копируй разбивку» | Структурный KPI (распределение предложений/нарратив-абзац vs русский референс) + слепое чтение; арм × (чанк\|глава) — ось нарезка×промпт | ~0 (промпт) | Претензия 1 (+сцеплённая часть 2) | Сейчас |
| 2 | **Discourse-move few-shot** (рубленый→слитый; target-side русский якорь; diversity-подбор ≤5 — research/15 few-shot-дисциплина) | Тот же KPI + fidelity re-gate (omission-guard: слияние повышает опущения) | +вход-токены (кэшируемо) | Претензия 1 | Сейчас |
| 3 | **Source-line strip / deformat черновика** до редактора (убрать зеркалящий cue) | A/B тот же KPI — изолирует построчный cue (exp12:174) | ~0 (детерм.) | Претензия 1 | Сейчас |
| 4 | **Детерминированный reflow-постпроцессор** ops (b)+(c)+(d): тире-диалог + нормализация глифов (полн.→полу, “”→«», —) + снятие    + strip markdown-`###` | CJK-глиф=0 гейт; диалог-парность-flagger (D29.1d) | ~0 (код) | Претензия 1 + утечка CJK-глифов | Сейчас |
| 5 | **Guard пост-черновой регрессии**: финал не пуст / не короче черновика на X% / нет сырых CJK / числа-разряды не переворачиваются vs черновик | Детерм. гейт + fidelity re-gate (D34.3) | ~0 (код) | «Третья ось» (вкл. экспорт-баг ch5/ch20 D35.4a) | Сейчас |
| 6 | **Глоссарий: засев сырых 甲乙丙丁/资质** (D35.4c) | Term-coverage post-check | ~0 | Претензия 2 (глоссарий-адресуемый срез) | Сейчас |
| 7 | **±1 reference-контекст** (хвост пред-target + пред-source + след-source до границы сцены, НЕ переводится) | Кросс-граница trap-accuracy + **perturbation** (correct vs random context не должен совпасть); факторить prev-target/prev-source/next-source ОТДЕЛЬНО | +вход-токены (кэш); вопрос рендера (§D-7) | Претензия 2 near-term | Сейчас-ish |
| 8 | **Кривая нарезки**: (0.75k/1.5k/3k/глава) × (жадная упаковка \| сцен-граница) на **retry-adjusted output-token cost**; бюджет в ВЫХОДНЫХ токенах (кириллица-фертильность Petrov) | Пре-регистрация: in/out/reasoning-токены, латентность, retry-rate ПО ПРИЧИНАМ, re-billed доля, coverage, слепое предпочтение, KPI-абзацы, trap-теги | Эксперимент | Обе + стоимость | Сейчас (диагностика) |
| 9 | **Capability-vs-activation / model-floor 2×2** (слабая/сильная × текущий/дискурс-промпт) + **арм краткой инъекции правил** | Trap-closure на 2×2; фронтир-арм = диагностика потолка (модели vs организация); гарды D22.5 (эхо-скрин, self-family exclusion) | Фронтир $ (владелец согласовал) | Диагностика (потолок) | Сейчас |
| 10 | **Автоматическая оценка качества (запрос владельца)**: претензия 1 = детерм. KPI (без судьи); претензия 2 = span-цитирующий билингв-судья + comprehension-QA (TREQA) + perturbation | Guard: leave-one-out, family-exclusion, per-call кап, **НИКОГДА не гейтить художественность на BLEU/COMET** (zh→ru инверсия WMT24); владелец кросс-чек ChatGPT+вручную | Судья-вызовы (кэш) | Инфра замера обеих | Сейчас |
### C2. НУЖНА Ф2-машинерия
| # | Механизм | Как измерить | Цена | Эффект → претензия | Фаза |
|---|---|---|---|---|---|
| 11 | **Running bilingual summary + реестр сущностей/антецедентов** (DelTA-класс) | exp09-memory-eval M2 + кросс-чанк trap; cache-friendly ordering | +1 малый вызов/~20 предл. (вход near-free при кэше) | Претензия 2 кросс-чанк | Ф2 (пере-взвесить vs COGS-депри research/15 — B2.3) |
| 12 | **Chapter card** (сущности/связи/цель/место/время/нерешённые ссылки из 1 пред-чтения главы) | Кросс-чанк trap; сравнить с #11 (компактная ручная карта должна доказать лифт ДО авто-памяти) | 1 пред-чтение/глава | Претензия 2 | Ф2-lite (сходится с ChatGPT) |
| 13 | **Пре-аннотация нулевых местоимений/кореференции** исходника | Trap-accuracy на ZP-кейсах | Аннотатор-пасс | Претензия 2 (zh-специфика) | Ф2 |
| 14 | **Отдельный монолингв. РУССКИЙ reflow/repair-пасс** (DocRepair) vs комбинированный редактор | A/B: один редактор vs (билингв-семантика→target-only-reflow) под coverage-гейтом | +1 пасс (target-only дешевле) | Претензия 1 op(a) + связность | Ф2 / арм сейчас |
### C3. Архитектура (зона оркестратора/бэкенда — предложение, не приговор)
| # | Механизм | Как измерить/решить | Фаза |
|---|---|---|---|
| 15 | **Слой «пакет конвенций пары»** (идея владельца): контент = 5 ops Ван Цуй + русские нормы + Палладий; ключ (src→tgt[×жанр]); снапшот-фолд; **несёт ОГРАНИЧИТЕЛИ против инварианта полноты**; РАЗМЕР/ФОРМА (короткий указатель vs правилник vs few-shot) = исход арма #9/#1-2 | Reflow-промпт-армы #1-2 И ЕСТЬ проба размера/формы пакета; финальное размещение — оркестратор/бэкенд под доказанный ROI (Р2/D30.7) | Дизайн сейчас, стройка под ROI |
Рекомендую взять из ChatGPT-отчёта (не переизобретаю): two-stage eval (Stage I причинная проба на 68 ЛОВУШКАХ вместо «средних глав» / Stage II слепые 3 финалиста), «дискурсный пакет» как generation-unit, факторизацию трёх единиц.
---
## §D — Вопросы, на которые не хватило данных
1. **Где именно живёт опорный контекст провалов связности владельца** — в-чанке / пред / след / вся-глава / мир-знание? D35 даёт ~1.28 стыка/глава, но НЕ размечено. Без размеченного trap-набора нельзя выбрать между #7/#11/#12. (Флагаю и я, и ChatGPT.) — первично для полигона.
2. **Магнитуда в РУССКИЙ.** Вся несущая внешняя эмпирика (Karpinska, DelTA, DocRepair, zero-pronoun) — into-English/EN→RU-экстраполяция; единственный zh→ru замер даст полигон (фронтир+дешёвый армы). Пометка обязательна на каждом клейме.
3. **Размер/форма пакета конвенций (#15) = вопрос «способность vs активация»** — не решён до 2×2 (#9) + инъекц-армов (#1-2).
4. **Коллизия слияния/эксплицитации с инвариантом полноты** на практике — semantic-atom-coverage vs sentence-count; нужен omission-guard-замер (#2/#5).
5. **COGS running-summary при кэше** — стоит ли бенефит DelTA доп-вызова на наших ценах при cache-ordering (пере-взвесить депри research/15).
6. **Retry-rate q(c) по типам провала на размер чанка** на живых дешёвых моделях — не замерено; нужно для retry-adjusted-кривой (#8).
7. **Рендер: может ли runner подать соседний src/tgt как non-output reference** без нового persistent-домена? Определяет, #7 — это PROD-MINOR или Ф2 (вопрос бэкенду).
8. **Владельцу:** допустимая степень синтакс-слияния/дробления; считается ли front-matter в художественную приёмку (из ChatGPT §D — решение владельца).
---
## §E — Источники (URL + дата + тип), несущие клеймы
Тип: **PR** peer-reviewed · **PP** preprint (не peer-review) · **STD** норм.-стандарт · **DOC** офиц./вендор-дока · **BLOG/OTH** блог/вторичное. Дата — публикация/доступ. Верификатор открывал ключевые (WebFetch); часть zh-источников по 403 — сверена сниппетами (помечено в §A/§B).
**Дискурс-гранулярность / doc-level (Ось 1):**
- [PR 2023] Karpinska & Iyyer, *LLMs Effectively Leverage Document-level Context for Literary Translation*, WMT2023 — https://aclanthology.org/2023.wmt-1.41/ · arXiv https://arxiv.org/abs/2304.03245
- [PR 2019] Voita et al., *When a Good Translation is Wrong in Context* (context-aware EN→RU; спутник DocRepair) — https://aclanthology.org/P19-1116/
- [PR 2024] Liu et al., *Lost in the Middle* (TACL) — https://aclanthology.org/2024.tacl-1.9/
- [PR 2021] G-Transformer for Doc-Level MT (ACL) — https://aclanthology.org/2021.acl-long.267/
- [PP 2024-07] *Towards Chapter-to-Chapter Context-Aware Literary Translation* — https://arxiv.org/html/2407.08978
- [PP 2025-04] *Multilingual Contextualization of LLMs for Doc-Level MT* (2504.12140; inverted-U, N=3 контекст) — https://arxiv.org/abs/2504.12140
- [PP 2024-12] *Investigating Length Issues in Doc-Level MT* — https://arxiv.org/abs/2412.17592
- [PP 2025-06] *Beyond the Sentence: Survey on Context-Aware MT with LLMs* — https://arxiv.org/abs/2506.07583
**Мультиагент/прайор-арт + fan/commercial:**
- [PP 2024-05] TransAgents, *(Perhaps) Beyond Human Translation* (TACL-версия) — https://arxiv.org/abs/2405.11804
- [PR 2024-10] DelTA (ICLR 2025; multi-level memory, running summary) — https://arxiv.org/abs/2410.08143 · https://openreview.net/forum?id=hoYFLRNbhc
- [PP 2024-12] DRT, *Deep Reasoning Translation via long CoT* — https://arxiv.org/abs/2412.17498
- [PR 2023] GuoFeng-Webnovel (zh↔ru/de, V2 без sent-align) — https://github.com/longyuewangdcu/GuoFeng-Webnovel
- [DOC 2024] py3TranslateLLM (LLM=paragraph, NMT=line) — https://github.com/gdiaz384/py3TranslateLLM · [DOC 2026-07] DeepL split_sentences — https://developers.deepl.com/api-reference/translate · [VEND 2023] DeepL context param — https://www.deepl.com/en/blog/deepl-api-context-parameter · [VEND 2026] TeaNovel (consistency drift; full-chapter) — https://read.teanovel.com/blog/how-to-translate-chinese-novels-with-ai
**Претензия 1 — русские нормы + reflow-механика:**
- [DOC 2026-07] Розенталь §47 прямая речь — http://old-rozental.ru/punctuatio.php?sid=155 · §52 диалог — http://old-rozental.ru/punctuatio.php?sid=160 · §50 слова автора — https://evartist.narod.ru/text1/52.htm
- [STD 1956] Правила русской орфографии и пунктуации, знаки при прямой речи — https://gramota.ru/biblioteka/spravochniki/pravila-russkoj-orfografii-i-punktuacii/znaki-pri-pryamoj-rechi · [DOC 2026-07] Грамота, оформление диалога — https://gramota.ru/uchebnik/pravila/oformlenie-dilaoga
- [OTH 2026-07] Абзац как логико-смысловая единица — Текстология.ру — https://www.textologia.ru/russkiy/sintaksis/stroenie-texta/abzac-kak-chast-teksta-i-ego-funkcii/646/ · Абзац (по Мильчину) — https://rus-stylistics-dict.slovaronline.com/1-%D0%90%D0%B1%D0%B7%D0%B0%D1%86
- [OTH 2026-07] Chinese punctuation (полн. пунктуация, 引号,   -отступ) — https://en.wikipedia.org/wiki/Chinese_punctuation
- [PR 2022] Structural Persistence in LMs (priming) — https://aclanthology.org/2022.tacl-1.60/ · [PR 2024] Sensitivity to Spurious Prompt Features (Sclar) — https://arxiv.org/abs/2310.11324 · [PR 2024] FollowBench — https://arxiv.org/abs/2310.20410
- [PP 2026-01] *Semantic Gravity Wells: Why Negative Constraints Backfire* (опора гипотезы негатив-констрейнта — REFUTED как главная причина) — https://arxiv.org/abs/2601.08070
- [PP 2025-10] *Decoupling Task-Solving and Output Formatting* — https://arxiv.org/abs/2510.03595
**Претензия 2 — связность/zh-специфика + лекарства:**
- [PP 2026-05] *How Much Do LLMs Know About Chinese Zero Pronouns?* (zh→en, <50% ZP базово, oracle +40) https://arxiv.org/abs/2605.31056 · [PP 2023] Survey on Zero Pronoun Translation https://arxiv.org/abs/2305.10196
- [PR 2024] MAPS, *Exploring Human-Like Translation Strategy* (аннотатор) — https://arxiv.org/abs/2305.04118
- [PR 2025] TEaR self-refine — https://aclanthology.org/2025.findings-naacl.218/ · [PP 2026-05] *What Does LLM Refinement Actually Improve? Doc-Level* (2605.13368; моно 2.2…5.6 MQM) — https://arxiv.org/abs/2605.13368 · [PP 2024-02] *LLM Amplifies Self-Bias in Self-Refinement* — https://arxiv.org/abs/2402.11436
- [PP 2025-03] *Source-primed Multi-turn Conversation Helps LLMs Translate Documents* — https://arxiv.org/abs/2503.10494
**zh↔ru контрастивная лингвистика (прямые/близкие):**
- [PR 2024] **Ван Цуй, «Анализ китайских паратактических предложений и их перевода на русский язык», Вестник (Теория перевода)** — 5 техник — https://vestnik-translation.ru/articles/article/20081/ · [PR 2023] интерференция при переводе кит. лит-ры на русский (De Gruyter, cjss-2023-0017) — https://www.degruyterbrill.com/document/doi/10.1515/cjss-2023-0017/html
- [OTH 2022] Application of Hypotaxis/Parataxis in C-E Translation (意合/形合, Lian Shuneng) — https://www.davidpublisher.com/Public/uploads/Contribute/620da97031d45.pdf · [OTH 2023] English Translation Strategies for Chinese Run-on (流水句) — https://www.davidpublisher.com/Public/uploads/Contribute/654354525d198.pdf · [PR 2011] xinghe/yihe (Perspectives) — https://www.tandfonline.com/doi/abs/10.1080/0907676X.2010.514347
- [PR 2011] Topic-Comment in Mandarin (Li & Thompson) — https://www.researchgate.net/publication/235852523 · [OTH 2005] Курдюмов, теор. грамматика (топик-комментарий) — https://www.studmed.ru/kurdyumov-v-a-kurs-kitayskogo-yazyka-teoreticheskaya-grammatika_1d9fe4a728b.html
- [PP 2025-11] *Predicate-Argument Divergences in Chinese-English* (кит. +24% глаголов) — https://arxiv.org/abs/2511.09796 · [OTH 2026-07] Chengyu (96% четырёхзнак.) — https://en.wikipedia.org/wiki/Chengyu
**Измерение качества:**
- [PP 2025-04] TREQA (comprehension-QA eval) — https://arxiv.org/html/2504.07583v3 · [PR 2025] LITEVAL-CORPUS (MQM плох, BWS/SQ лучше) NAACL — https://aclanthology.org/2025.naacl-long.548/ · [PR 2023] GEMBA-MQM — https://aclanthology.org/2023.wmt-1.64/ · [PR 2024] xCOMET — https://aclanthology.org/2024.tacl-1.54/ · [PR 2024] ESA — https://aclanthology.org/2024.wmt-1.131/
- [PP 2026-05] *Nine Judges, Two Effective Votes* (корр. судьи) — https://arxiv.org/pdf/2605.29800 · [PP 2026-05] *Creativity Bias* (метрики против художественности) — https://arxiv.org/html/2605.13596 · [BLOG 2026-04] LLM-judge length/position/format bias — https://tianpan.co/blog/2026-04-27-llm-judge-bias-audit-length-position-format
**Стоимость / нарезка:**
- [PR 2023] Petrov et al., *LM Tokenizers Introduce Unfairness Between Languages* (кириллица-фертильность) — https://arxiv.org/pdf/2305.15425 · [BLOG 2023] интерактив — https://aleksandarpetrov.github.io/tokenization-fairness/
- [DOC 2024] DeepSeek Context Caching (cache-hit ~2% miss) — https://api-docs.deepseek.com/guides/kv_cache/ · pricing — https://api-docs.deepseek.com/quick_start/pricing
- [PP 2024-09] LongGenBench (output ~34k стабилен) — https://arxiv.org/html/2409.02076v7
**Метрика-инверсия zh→ru (§A4.3 — теперь с URL):**
- [PR 2024-12] *Findings of WMT24 Discourse-Level Literary Translation* — https://arxiv.org/abs/2412.11732 · task page — https://www2.statmt.org/wmt24/literary-translation-task.html · [BLOG 2025] разбор d-BLEU/стоимости — https://gonzoml.substack.com/p/perhaps-beyond-human-translation
*(Полный список 125 верифицированных URL — в артефактах ресёрч-воркфлоу сессии; здесь — несущее подмножество.)*
**Errata источников (испр. оркестратором, D36):**
- **DocRepair — расщепить с P19-1116.** Числа §A4.8/§B2.4 (deixis 50.0→91.8, когезия 45.9→80.6, эллипсис 53.0→86.4, 73% предпочтения) — из [PR 2019] Voita, Sennrich, Titov, *Context-Aware Monolingual Repair for NMT* (DocRepair), EMNLP-IJCNLP 2019 — https://aclanthology.org/D19-1081/ · arXiv https://arxiv.org/abs/1909.01383. Процитированная выше P19-1116 (ACL 2019) — статья-спутник, из неё число CADec 50.0→81.6 (§A3). Обе авторства одного трио; числа верны, атрибуция расщеплена.
- **TransAgents** — arXiv 2405.11804 = *(Perhaps) Beyond Human Translation* (accepted-but-preprint, «To appear at TACL»; §A-метка «TACL-версия» и §E-метка «PP 2024-05» — об одной статье, оставить одну). Это ОТДЕЛЬНАЯ статья от EMNLP-Demo 2024 `2024.emnlp-demo.14` (*Build Your Translation Company…*), процитированной параллельным ChatGPT-отчётом — не конфликт, две реальные статьи об одной системе.
- **Z5** — RG 235852523 = Dingxu Shi, *Topic and Topic-Comment Constructions in Mandarin Chinese* (Language 76(2), 2000), НЕ Li & Thompson (их канон — *Subject and Topic* 1976 / *A Functional Reference Grammar* 1981). Клейм топик-комментария верен; автор-метка исправлена.
- **Z8 / R4 / R5 / P2 / CO5** — источники реальны, атрибуция частична: «96% чэнъюй» на цит. Wikipedia отсутствует (там «most»);   -отступ/«короткие абзацы» — не на цит. Chinese-punctuation-стр. (конвенции реальны, стр. неточна); Structural-Persistence (TACL 2022) изучает СИНТАКСИЧЕСКИй прайминг, не копирование line-структуры (экстраполяция, отчёт помечает PLAUSIBLE); FollowBench (ACL 2024, не просто препринт) документирует ДЕГРАДАЦИю следования при накоплении констрейнтов — не «надёжный рычаг few-shot»; 2504.12140 подтверждает «мелкие инстракт-модели деградируют с ростом чанка», но «перевёрнутая-U / N=3-оптимум» — переформулировка (N=3 — фикс-конфиг, не найденный оптимум). Ни одна не рушит §C-арм — все меряются полигоном эмпирически.
---
<!-- Отчёт готов к адверсариальной верификации оркестратора по первоисточникам. §A заморожена (sha256 44f90364…); §B/§C/§D/§E — пост-дифф. Не коммитить — лендит оркестратор (как research/15/16/17). -->

View file

@ -0,0 +1,90 @@
#!/usr/bin/env python3
"""exp13 — применение ПОДПИСИ владельца к сиду v2 (D30.5/D32). Провенанс подписи.
Владелец подписал спорные + переопределил часть approved-dst (2026-07-12). Спорные approved.
Вход/выход: guzhenren-seed-v2.yaml (in-place). Лог: diag/glossary_v2_signoff_applied.md. ВНЕ git.
"""
from __future__ import annotations
import yaml
from pathlib import Path
BOOK = Path("/home/ubuntu/books/gu-zhenren")
SEED = BOOK / "guzhenren-seed-v2.yaml"
LOG = BOOK / "diag" / "glossary_v2_signoff_applied.md"
# src -> (new_dst, invariant, forms, note_tag)
DECISIONS = {
"花酒行者": ("Монах Цветочного Вина", False,
["Монаха Цветочного Вина", "Монаху Цветочного Вина", "Монаха Цветочного Вина", "Монахом Цветочного Вина", "Монахе Цветочного Вина"],
"подпись: НЕ «Странник Цветов и Вина»/«Винный Странник»; 行者=монах, 花酒=цветочное вино"),
"蛊虫": ("гу-червь", False,
["гу-червя", "гу-червю", "гу-червя", "гу-червём", "гу-черве"],
"подпись: гу-червь (подтверждено)"),
"本命蛊": ("гу Жизни", True, [],
"подпись: «гу Жизни» (возврат к v1-форме; НЕ «жизненный гу»); инвариант как гу+генитив"),
"修炼": ("культивация", False,
["культивации", "культивации", "культивацию", "культивацией", "культивации"],
"подпись: культивация (НЕ «совершенствование»)"),
"修行": ("культивация", False,
["культивации", "культивации", "культивацию", "культивацией", "культивации"],
"подпись: согласовано с 修炼=культивация"),
"人祖": ("Жэнь Цзу", True, [],
"подпись: транслит «Жэнь Цзу» (НЕ «Первопредок», НЕ «Рен Зу»); -у → инвариант"),
"古月山寨": ("деревня Гуюэ", False,
["деревни Гуюэ", "деревне Гуюэ", "деревню Гуюэ", "деревней Гуюэ", "деревне Гуюэ"],
"подпись: «деревня Гуюэ» (НЕ «селение»/«стан»)"),
"白家寨": ("деревня Бай", False,
["деревни Бай", "деревне Бай", "деревню Бай", "деревней Бай", "деревне Бай"],
"консистентно-выровнено под 古月山寨→деревня (диклоуз владельцу)"),
"熊家寨": ("деревня Сюн", False,
["деревни Сюн", "деревне Сюн", "деревню Сюн", "деревней Сюн", "деревне Сюн"],
"консистентно-выровнено под 古月山寨→деревня (диклоуз владельцу)"),
"空窍": ("апертура", False,
["апертуры", "апертуре", "апертуру", "апертурой", "апертуре"],
"подпись: апертура (подтверждено)"),
"元海": ("море истинной ци", False,
["моря истинной ци", "морю истинной ци", "морем истинной ци", "море истинной ци"],
"подпись: море истинной ци (подтверждено)"),
"元石": ("первобытный камень", False,
["первобытного камня", "первобытному камню", "первобытный камень", "первобытным камнем", "первобытном камне",
"первобытные камни", "первобытных камней", "первобытным камням", "первобытными камнями", "первобытных камнях"],
"подпись: «первобытные камни» → канон.ед. «первобытный камень» (НЕ «изначальный»/«первокамень»); +мн.ч. D24.4"),
}
def main():
data = yaml.safe_load(SEED.read_text(encoding="utf-8"))
applied, missing = [], []
for t in data["terms"]:
s = t.get("src")
if s in DECISIONS:
new_dst, inv, forms, tag = DECISIONS[s]
old = t.get("dst")
t["dst"] = new_dst
t["decl"] = {"invariant": inv, "forms": list(forms)}
t["status"] = "approved"
t["note"] = f"[signoff:approved] {tag}. (было: «{old}»). " + (t.get("note") or "")
applied.append((s, old, new_dst))
seen = {t.get("src") for t in data["terms"]}
missing = [s for s in DECISIONS if s not in seen]
SEED.write_text(yaml.dump(data, allow_unicode=True, sort_keys=False, width=200), encoding="utf-8")
lg = ["# Глоссарий v2 — ПОДПИСЬ владельца применена (D30.5/D32, 2026-07-12)", "",
f"Применено решений: {len(applied)}. Все → status:approved. Провенанс: `eval/exp13_seed_signoff.py`.",
"**Остаётся открытым (низкий приоритет, не блокирует resnapshot):** род бесплатного «гу» (蛊) — "
"согласование «этот гу» (муж., как «гу-червь») vs «это гу» (сред.). Рекомендация: мужской. `蛊` инвариантен, "
"single-char (не на горячем пути A3) → влияет только на прозу редактора, не на hard-constraint.", "",
"| src | было | стало (approved) |", "|---|---|---|"]
for s, old, new in applied:
lg.append(f"| {s} | {old} | **{new}** |")
if missing:
lg += ["", "НЕ найдены в сиде (проверить): " + ", ".join(missing)]
LOG.write_text("\n".join(lg), encoding="utf-8")
print(f"применено: {len(applied)}, ненайдено: {missing}")
for s, old, new in applied:
print(f" {s}: «{old}» → «{new}» [approved]")
if __name__ == "__main__":
main()

175
eval/exp14_arms.py Normal file
View file

@ -0,0 +1,175 @@
#!/usr/bin/env python3
"""exp14 — раннер editor-армов (нарезка × промпт + аблации). Прямые вызовы, ручная упаковка.
Per-call predicted-cost кап (НЕ group-level). Персист usage/cost в exp14/costs.jsonl.
P0 = reuse records.json final ($0). Черновик держим общим (flash-draft из records) варьируем
editor-стадию (модель × промпт × нарезка × reference).
Использование: exp14_arms.py --arm P1a [--chapters trap|stage2] [--model glm-5] [--dry]
Армы: P0 P1a P1b P1c A-layout A-2pass A-ref-prev A-ref-next A-ref-both (+ frontier: F-base F-disc)
"""
from __future__ import annotations
import argparse, json, re, sys, time
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
import exp14_common as C
import exp14_prompts as P
MAT = json.load(open(C.DIAG / "material.json"))
ARMSDIR = C.DIAG / "arms"; ARMSDIR.mkdir(exist_ok=True)
CAPS = {"glm-5": 0.08, "glm-5.1": 0.10, "deepseek-v4-flash": 0.03, "deepseek-v4-pro": 0.06,
"gpt-5.4": 0.40, "gemini-3.1-pro-preview": 0.30, "grok-4.3": 0.40,
"gpt-5-mini": 0.20, "kimi-k2.6": 0.20, "mistral-large-2512": 0.10}
SP = C.Spender(C.DIAG / "costs.jsonl", CAPS)
def deformat_draft(draft: str) -> str:
"""A-layout: снять построчную/пустострочную разбивку черновика (нейтральные сепараторы)."""
lines = [l.strip() for l in draft.split("\n") if l.strip()]
return " ".join(lines) # один поток; редактор не якорится на форме черновика
def chunk_units(scope: str):
"""Возвращает список единиц {id, source, draft, final_p0, editor_constraint, chapter, chunk_idx}."""
if scope == "trap":
return [dict(id=f"{u['chapter']}.{u['chunk_idx']}", **u) for u in MAT["trap_chunks"]]
if scope == "stage2":
out = []
for ch, chunks in MAT["stage2"].items():
for u in chunks:
out.append(dict(id=f"{ch}.{u['chunk_idx']}", chapter=int(ch), **u))
return out
raise ValueError(scope)
def chapter_units(scope: str):
"""Whole-chapter единицы: клеим source/draft чанков главы + chapter-level инъекция."""
inj = json.load(open(C.DIAG / "injection_blocks.json"))
units = chunk_units(scope)
by_ch = {}
for u in units:
by_ch.setdefault(u["chapter"], []).append(u)
out = []
for ch, us in by_ch.items():
if len(us) < 2: # whole-chapter тест осмыслен только когда все чанки главы в наборе (ch8/11/24)
continue
us = sorted(us, key=lambda x: x["chunk_idx"])
src = "\n\n".join(x["source"] for x in us)
drf = "\n\n".join(x["draft"] for x in us)
eb = inj.get(f"{ch}/ALL", {}).get("editor_constraint", "")
out.append(dict(id=f"{ch}.ALL", chapter=ch, chunk_idx="ALL",
source=src, draft=drf, editor_constraint=eb))
return out
def run_editor(arm: str, variant: str, units, model: str, reference_by=None,
two_pass=False, deformat=False, dry=False):
outdir = ARMSDIR / arm; outdir.mkdir(exist_ok=True)
sys_disc = P.editor_system(variant)
total_pred = 0.0
for u in units:
outp = outdir / f"{u['id']}.txt"
if outp.exists():
print(f" [skip exists] {arm} {u['id']}"); continue
draft = deformat_draft(u["draft"]) if deformat else u["draft"]
reference = reference_by.get(u["id"], "") if reference_by else ""
user = P.editor_user(u["source"], draft, reference)
msgs = C.messages_with_injection(sys_disc, u.get("editor_constraint", ""), user)
in_est = C.count_tokens(sys_disc + u.get("editor_constraint", "") + user,
"deepseek" if model.startswith("deepseek") else "glm")
s = C.spec(model, temp=0.4)
ok, pred = SP.guard(model, in_est, s["max_tokens"])
total_pred += pred
print(f" {arm} {u['id']}: in≈{in_est}tok predict=${pred:.4f} cap=${CAPS[model]} {'OK' if ok else 'OVER-CAP'}")
if dry:
continue
if not ok:
print(f" !! OVER per-call cap — skipped"); continue
t0 = time.time()
text, err, usage = C.call(s, msgs, timeout=360)
dt = round(time.time() - t0, 1)
rec = {"arm": arm, "model": model, "keyenv": s["keyenv"], "id": u["id"],
"variant": variant, "err": err, "latency_s": dt, "usage": usage}
c = SP.record(rec)
if err:
print(f" ERR {err[:80]} (${c:.4f}, {dt}s)")
continue
if two_pass: # second narrow pass: target-only literary reflow of the just-edited RU
sys2 = P.editor_system("discourse") # target-only reflow uses discourse core
u2 = ("Ниже — русский перевод. Перевёрстай его в естественные русские абзацы по "
"правилам дискурс-перевёрстки; НЕ меняй смысл, НЕ добавляй и НЕ удаляй атомы, "
"НЕ сверяйся с иностранным исходником (его нет):\n\n" + text)
msgs2 = [{"role": "system", "content": sys2}, {"role": "user", "content": u2}]
in2 = C.count_tokens(sys2 + u2, "glm")
ok2, pred2 = SP.guard(model, in2, s["max_tokens"])
if ok2:
text2, err2, usage2 = C.call(s, msgs2, timeout=360)
SP.record({"arm": arm, "model": model, "keyenv": s["keyenv"], "id": u["id"],
"variant": "reflow-pass2", "err": err2, "usage": usage2})
if not err2:
text = text2
outp.write_text(text, encoding="utf-8")
print(f" ok {len(text)}chars ${c:.4f} {dt}s → {outp.name}")
print(f" [{arm}] predicted total ≈ ${total_pred:.4f}; spent-by-key: {SP.by_key}")
def run_p0(scope):
outdir = ARMSDIR / "P0"; outdir.mkdir(exist_ok=True)
for u in chunk_units(scope):
(outdir / f"{u['id']}.txt").write_text(u["final_p0"], encoding="utf-8")
print(f"[P0] reused {len(chunk_units(scope))} finals ($0)")
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--arm", required=True)
ap.add_argument("--scope", default="trap", choices=["trap", "stage2"])
ap.add_argument("--model", default="glm-5")
ap.add_argument("--dry", action="store_true")
a = ap.parse_args()
if a.arm == "P0":
run_p0(a.scope); return
if a.arm == "P1a":
run_editor("P1a", "discourse", chunk_units(a.scope), a.model, dry=a.dry)
elif a.arm == "P1b":
run_editor("P1b", "baseline", chapter_units(a.scope), a.model, dry=a.dry)
elif a.arm == "P1c":
run_editor("P1c", "discourse", chapter_units(a.scope), a.model, dry=a.dry)
elif a.arm == "A-layout":
run_editor("A-layout", "discourse", chunk_units(a.scope), a.model, deformat=True, dry=a.dry)
elif a.arm == "A-2pass":
run_editor("A-2pass", "baseline", chunk_units(a.scope), a.model, two_pass=True, dry=a.dry)
elif a.arm in ("A-ref-prev", "A-ref-next", "A-ref-both"):
ref = build_reference(a.arm)
run_editor(a.arm, "discourse", [u for u in chunk_units(a.scope) if u["id"] in ref],
a.model, reference_by=ref, dry=a.dry)
elif a.arm in ("F-base", "F-disc"):
variant = "baseline" if a.arm == "F-base" else "discourse"
run_editor(a.arm, variant, chunk_units(a.scope), a.model, dry=a.dry)
else:
raise SystemExit(f"unknown arm {a.arm}")
def build_reference(kind: str) -> dict:
"""±1 reference для кросс-граничных трапов (T5 24.1←24.0, T6 11.1←11.0). prev/next/both."""
units = {u["id"]: u for u in chunk_units("trap")}
pairs = [("24.0", "24.1"), ("11.0", "11.1")] # (prev_chunk, target_chunk)
ref = {}
for prev, tgt in pairs:
parts = []
if kind in ("A-ref-prev", "A-ref-both"):
ptail = "\n".join(units[prev]["source"].split("\n")[-6:])
ttail = "\n".join(units[prev]["final_p0"].split("\n")[-6:])
parts.append("[ПРЕД-ИСХОДНИК]\n" + ptail + "\n[ПРЕД-ПЕРЕВОД]\n" + ttail)
if kind in ("A-ref-next", "A-ref-both"):
# next-source: следующий чанк того же trap-набора, если есть (для 24.1/11.1 нет — пропуск)
pass
if parts:
ref[tgt] = "\n\n".join(parts)
return ref
if __name__ == "__main__":
main()

191
eval/exp14_common.py Normal file
View file

@ -0,0 +1,191 @@
#!/usr/bin/env python3
"""exp14 — общий харнес: провайдер-вызов, usage→$ (3 reasoning-режима), per-call
predicted-cost кап (НЕ group-level урок exp13 +10%), append-only персист usage/cost,
токенайзер-счёт выходных токенов (кириллица-фертильность), spec-фабрика.
Зона eval/. Цены ЗАМОРОЖЕННАЯ зеркальная копия backend/configs/models.yaml
(prices_checked 2026-07-10) + фронтир gpt-5.4 live-фактчек 2026-07-11
(developers.openai.com/api/docs/pricing). Единственный источник истины models.yaml;
при расхождении верить Go/models.yaml. Ключи из eval/.env через load_env_file (НЕ читаю .env).
"""
from __future__ import annotations
import json, os, sys, time, urllib.request, urllib.error
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
from refusal_bench import load_env_file # noqa: E402
load_env_file()
DIAG = Path("/home/ubuntu/books/gu-zhenren/exp14")
DIAG.mkdir(parents=True, exist_ok=True)
RERUN = Path("/home/ubuntu/books/gu-zhenren/rerun")
TOKDIR = Path(__file__).resolve().parent / "tokenizers"
# ── Цены $/1M (in, out, cached_in) + reasoning-режим. Зеркало models.yaml. ──────────
PRICES = {
"deepseek-v4-flash": (0.14, 0.28, 0.0028, "subset"),
"deepseek-v4-pro": (0.435, 0.87, 0.003625, "subset"),
"glm-5": (1.0, 3.2, 0.2, "subset"),
"glm-5.1": (1.4, 4.4, 0.26, "subset"),
"kimi-k2.6": (0.95, 4.0, 0.16, "subset"),
"grok-4.3": (1.25, 2.50, 1.25, "additive"),
"gemini-3.1-pro-preview": (2.0, 12.0, 0.20, "additive_total"),
"gpt-5-mini": (0.25, 2.0, 0.025, "subset"),
"gpt-5.4": (2.50, 15.0, 0.25, "subset"), # live 2026-07-11
"mistral-large-2512": (0.5, 1.5, 0.5, "subset"),
}
FALLBACK = "deepseek-v4-flash" # никогда $0
# ── Спеки провайдеров (endpoint/keyenv/wire-квирки из 00-provider-quirks + models.yaml) ─
def spec(model: str, *, temp: float | None = None, max_tokens: int | None = None,
reasoning_effort: str | None = None) -> dict:
"""Собирает per-call spec. temp/max_tokens/reasoning_effort перекрывают дефолты."""
base_by = {
"deepseek-v4-flash": ("https://api.deepseek.com/v1", "DEEPSEEK_API_KEY", {}),
"deepseek-v4-pro": ("https://api.deepseek.com/v1", "DEEPSEEK_API_KEY", {}),
"glm-5": ("https://api.z.ai/api/paas/v4", "ZAI_API_KEY", {"thinking": {"type": "disabled"}}),
"glm-5.1": ("https://api.z.ai/api/paas/v4", "ZAI_API_KEY", {"thinking": {"type": "disabled"}}),
"kimi-k2.6": ("https://api.moonshot.ai/v1", "KIMI_API_KEY", {}),
"grok-4.3": ("https://api.x.ai/v1", "XAI_API_KEY", {}),
"gemini-3.1-pro-preview": ("https://generativelanguage.googleapis.com/v1beta/openai", "GEMINI_API_KEY", {}),
"gpt-5-mini": ("https://api.openai.com/v1", "OPENAI_API_KEY", {}),
"gpt-5.4": ("https://api.openai.com/v1", "OPENAI_API_KEY", {}),
"mistral-large-2512": ("https://api.mistral.ai/v1", "MISTRAL_API_KEY", {"safe_prompt": False}),
}
base, keyenv, extra = base_by[model]
extra = dict(extra)
s = {"model": model, "base": base, "keyenv": keyenv, "extra": extra}
# reasoning wire per family
if model in ("gpt-5-mini", "gpt-5.4"):
s["openai_reasoner"] = True # max_completion_tokens, no temperature
extra["reasoning_effort"] = reasoning_effort or "medium"
elif model == "kimi-k2.6":
s["force_temp"] = 1.0
elif model == "grok-4.3":
if reasoning_effort: # xAI plain reasoning_effort in body (none/low/medium/high)
extra["reasoning_effort"] = reasoning_effort
# temp
if model in ("gpt-5-mini", "gpt-5.4"):
s["temp"] = None
elif model == "kimi-k2.6":
s["temp"] = 1.0
else:
s["temp"] = 0.4 if temp is None else temp
# max_tokens floors (D24.3)
floor = 16000 if model == "kimi-k2.6" else (12000 if model == "gpt-5.4" else 8000)
s["max_tokens"] = max_tokens or floor
return s
def call(s: dict, messages: list[dict], timeout: int = 300) -> tuple[str, str | None, dict]:
"""Один chat/completions. Возврат (text, err|None, usage со стампом finish_reason).
err структурная строка: http|CODE|.. / transport|.. / content_filter|.. / empty|.."""
key = os.environ.get(s["keyenv"], "")
body = {"model": s["model"], "messages": messages, **s.get("extra", {})}
if s.get("openai_reasoner"):
body["max_completion_tokens"] = s["max_tokens"] # gpt-5: max_tokens → 400
else:
body["max_tokens"] = s["max_tokens"]
if s.get("temp") is not None:
body["temperature"] = s["temp"]
data = json.dumps(body).encode()
req = urllib.request.Request(s["base"].rstrip("/") + "/chat/completions", data=data,
headers={"Content-Type": "application/json", "Authorization": f"Bearer {key}"})
try:
with urllib.request.urlopen(req, timeout=timeout) as r:
d = json.loads(r.read())
except urllib.error.HTTPError as e:
return "", f"http|{e.code}|{e.read()[:300].decode('utf-8','replace')}", {}
except Exception as e:
return "", f"transport|{type(e).__name__}|{str(e)[:200]}", {}
ch = (d.get("choices") or [{}])[0]
finish = ch.get("finish_reason", "")
msg = ch.get("message", {}) or {}
text = (msg.get("content") or "").strip()
usage = d.get("usage", {}) or {}
usage["finish_reason"] = finish
if str(finish).lower() in ("content_filter", "prohibited_content", "safety") or "prohibited" in str(finish).lower():
return "", f"content_filter|finish={finish}", usage
if not text:
has_reason = bool((msg.get("reasoning_content") or "").strip())
return "", f"empty|finish={finish}|reasoning={has_reason}", usage
return text, None, usage
def cost_of(model: str, usage: dict) -> float:
"""usage→$ с 3 reasoning-режимами (subset/additive/additive_total)."""
inp = usage.get("prompt_tokens", 0) or 0
comp = usage.get("completion_tokens", 0) or 0
total = usage.get("total_tokens", 0) or 0
pin, pout, _c, regime = PRICES.get(model, (*PRICES[FALLBACK][:3], "subset"))
if regime == "additive": # grok: reasoning_tokens отдельным полем, поверх completion
reason = usage.get("reasoning_tokens", 0) or 0
out = comp + reason
elif regime == "additive_total": # gemini: thinking только в total
out = max(comp, total - inp) if total else comp
else: # subset: reasoning ⊆ completion
out = comp
return (inp * pin + out * pout) / 1_000_000
def predict_cost(model: str, in_tokens_est: int, max_out: int) -> float:
"""Верхняя оценка ДО вызова: in_est·pin + max_out·pout (потолок max_tokens как output)."""
pin, pout, _c, _r = PRICES.get(model, (*PRICES[FALLBACK][:3], "subset"))
return (in_tokens_est * pin + max_out * pout) / 1_000_000
# ── Токенайзеры (кириллица-фертильность; deepseek-v4/kimi отсутствуют → v3.2 прокси) ──
_TOK = {}
def _load_tok(name: str):
from tokenizers import Tokenizer
p = TOKDIR / name / "tokenizer.json"
if name not in _TOK:
_TOK[name] = Tokenizer.from_file(str(p))
return _TOK[name]
def count_tokens(text: str, family: str = "glm") -> int:
name = {"glm": "glm-4.6", "deepseek": "deepseek-v3.2"}.get(family, "glm-4.6")
return len(_load_tok(name).encode(text, add_special_tokens=False).ids)
# ── Per-call кап + персист ────────────────────────────────────────────────────────
class Spender:
"""Per-key running spend + per-call predicted-cost кап (обязателен ДО вызова)."""
def __init__(self, costs_path: Path, caps: dict[str, float]):
self.path = costs_path
self.caps = caps # model → per-call cap $
self.by_key: dict[str, float] = {}
def guard(self, model: str, in_est: int, max_out: int) -> tuple[bool, float]:
pc = predict_cost(model, in_est, max_out)
cap = self.caps.get(model, 0.50)
return (pc <= cap, pc)
def record(self, rec: dict) -> float:
c = cost_of(rec["model"], rec.get("usage", {}))
rec["cost"] = round(c, 6)
keyenv = rec.get("keyenv", rec["model"])
self.by_key[keyenv] = self.by_key.get(keyenv, 0.0) + c
with open(self.path, "a", encoding="utf-8") as f:
f.write(json.dumps(rec, ensure_ascii=False) + "\n")
return c
def messages_with_injection(system_prefix: str, injection: str, user: str) -> list[dict]:
"""Layout render.go MessagesWithInjection: system(prefix,cache) → system(inj) → user."""
m = [{"role": "system", "content": system_prefix}]
if injection.strip():
m.append({"role": "system", "content": injection})
m.append({"role": "user", "content": user})
return m
if __name__ == "__main__":
# смоук: цены/токенайзер/предикт
ru = "Он шёл по тёмной улице, и снег ложился ему на плечи, укрывая следы."
print("glm-4.6 tokens:", count_tokens(ru, "glm"))
print("deepseek(v3.2) tokens:", count_tokens(ru, "deepseek"))
u = {"prompt_tokens": 5000, "completion_tokens": 3000, "total_tokens": 8200}
for m in ("glm-5", "gpt-5.4", "gemini-3.1-pro-preview", "grok-4.3"):
print(f"cost_of {m}: ${cost_of(m, u):.5f} predict(5k in, 8k out): ${predict_cost(m,5000,8000):.4f}")

156
eval/exp14_judges.py Normal file
View file

@ -0,0 +1,156 @@
#!/usr/bin/env python3
"""exp14 — trap-accuracy судьи (Претензия 2): span-цитирующие, кросс-семейно,
self-family exclusion, катастроф-флаг. Бюджет-умно: панель gpt-5-mini + kimi (дёшево);
gemini ТОЧЕЧНО (output $12/M, 2.6 крошечный). Claude-воркфлоу адверсариальный верифай сверху.
Каждый (trap × arm) per-judge {verdict: correct|partial|wrong, catastrophe, evidence15слов, note}.
Blind: армы под нейтральными метками; ключ отдельно. Персист в exp14/trap_verdicts.jsonl.
Использование: exp14_judges.py [--dry]
"""
from __future__ import annotations
import argparse, json, random, re, sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
import exp14_common as C
ARMS = C.DIAG / "arms"
MAT = json.load(open(C.DIAG / "material.json"))
# ── Заморожённые трапы (§1.0.1) — файл-чанк, где живёт рендер трапа ─────────────────
TRAPS = [
dict(id="T1", chunk="7.0", type="c-within", catastrophe=True,
span="古月族人没有一个不知道的",
meaning="В роду Гуюэ ЭТО ПРЕДАНИЕ знали ВСЕ/каждый (двойное отрицание «нет ни одного, кто не знал бы»). Инверсия «никто не знал» = КАТАСТРОФА."),
dict(id="T2", chunk="8.1", type="c-within", catastrophe=False,
span="物是人非",
meaning="Контраст: вещи/места ПРЕЖНИЕ, но люди уже НЕ ТЕ (物是 «вещи те же» + 人非 «люди иные»). Плоское «всё изменилось» ТЕРЯЕТ половину идиомы (物是)."),
dict(id="T2b", chunk="8.0", type="c-title", catastrophe=False,
span="第八节:物是人非 (заглавие)",
meaning="Заглавие главы: тот же контраст «вещи прежние — люди иные». Плоское «Всё изменилось» — потеря атома."),
dict(id="T5", chunk="24.1", type="d-cross-prev", catastrophe=False,
span="这当然不是他的肌肤本色,而是一种铜皮蛊的效果",
meaning="«这/他» отсылает к бронзовому цвету кожи НАСТАВНИКА (описан в конце пред-чанка 24.0). Верно: «это [бронзовый цвет кожи наставника] — не природный, а эффект гу медной кожи». Провал = потеря антецедента (кто/что)."),
dict(id="T6", chunk="11.1", type="d-cross-prev", catastrophe=False,
span="那隐藏在暗处的人马,见到沈翠这般出来",
meaning="«那…人马» = засадный отряд, который舅父/舅母 подготовили (введён в конце 11.0: «внизу тоже расставлены люди»). Верно: понятно, ЧЬИ это люди/засада. Провал = «какие-то люди» без связи."),
dict(id="T4", chunk="9.0", type="b-dialogue-control", catastrophe=False,
span="舅父…开口道:“…” (обмен репликами дядя/тётя/Фан Чжэн)",
meaning="КОНТРОЛЬ-регресс: реплики с «—», слова автора при своей реплике (Розенталь). P0 это делает верно. Арм НЕ должен СЛОМАТЬ диалог-оформление."),
]
JUDGE_POOL = { # judge_model → family (для self-family exclusion)
"gpt-5-mini": "openai", "kimi-k2.6": "moonshot", "gemini-3.1-pro-preview": "google",
}
ARM_FAMILY = { # editor-модель арма → family (author≠reviewer)
"P0": "zai", "P1a": "zai", "P1b": "zai", "P1c": "zai", "A-layout": "zai",
"A-2pass": "zai", "A-ref-prev": "zai", "A-ref-both": "zai",
"F-base": "openai", "F-disc": "openai",
}
# draft общий = deepseek → deepseek не судья (self-family к черновику, где рождается T1)
JUDGE_SYS = ("Ты — билингвальный эксперт zh→ru, оцениваешь ТОЧНОСТЬ передачи одного смыслового "
"фрагмента. Тебе дан китайский span, его допустимый смысл, и русский перевод отрывка "
"(под нейтральной меткой). Ответь СТРОГО JSON без markdown: "
'{"verdict":"correct|partial|wrong","catastrophe":true|false,'
'"evidence":"дословная цитата из перевода ≤15 слов","note":"кратко почему"}. '
"verdict=correct только если смысл span передан без искажения полярности/участника/"
"потери атома. catastrophe=true при инверсии полярности или подмене участника/действия.")
def build_tasks(dry):
tasks = []
for tr in TRAPS:
arms = [a for a in ARM_FAMILY if (ARMS / a / f"{tr['chunk']}.txt").exists()]
# blind labels
order = list(arms); random.Random(f"exp14-trap-{tr['id']}").shuffle(order)
label = {a: f"V{i+1}" for i, a in enumerate(order)}
for a in arms:
txt = (ARMS / a / f"{tr['chunk']}.txt").read_text(encoding="utf-8")
# окно вокруг трапа не вырезаем — даём весь отрывок (судья видит контекст)
for jm in JUDGE_POOL:
if JUDGE_POOL[jm] == ARM_FAMILY[a]:
continue # self-family exclusion
if jm == "gemini-3.1-pro-preview":
continue # gemini — точечно, отдельным проходом (бюджет); тут пропускаем
tasks.append(dict(trap=tr["id"], arm=a, label=label[a], judge=jm,
chunk=tr["chunk"], text=txt, span=tr["span"],
meaning=tr["meaning"]))
return tasks
def run():
ap = argparse.ArgumentParser(); ap.add_argument("--dry", action="store_true"); a = ap.parse_args()
caps = {"gpt-5-mini": 0.05, "kimi-k2.6": 0.08, "gemini-3.1-pro-preview": 0.30}
sp = C.Spender(C.DIAG / "judge_costs.jsonl", caps)
tasks = build_tasks(a.dry)
# resume: пропустить уже отсуженные (trap,arm,judge)
vpath = C.DIAG / "trap_verdicts.jsonl"
out = []
done = set()
if vpath.exists():
for l in vpath.read_text(encoding="utf-8").splitlines():
if not l.strip():
continue
v = json.loads(l); out.append(v); done.add((v["trap"], v["arm"], v["judge"]))
tasks = [t for t in tasks if (t["trap"], t["arm"], t["judge"]) not in done]
print(f"trap-judge tasks: {len(tasks)} new ({len(done)} already done) "
f"({len(set(t['arm'] for t in tasks))} arms × {len(TRAPS)} traps × cross-family judges)")
if a.dry:
from collections import Counter
print("by judge:", Counter(t["judge"] for t in tasks))
return
for t in tasks:
user = (f"КИТАЙСКИЙ SPAN: {t['span']}\nДОПУСТИМЫЙ СМЫСЛ: {t['meaning']}\n\n"
f"РУССКИЙ ПЕРЕВОД ОТРЫВКА (метка {t['label']}):\n{t['text']}\n\n"
f"Оцени ТОЛЬКО передачу указанного span. Ответь JSON.")
s = C.spec(t["judge"], max_tokens=(16000 if t["judge"] == "kimi-k2.6" else 4000))
msgs = [{"role": "system", "content": JUDGE_SYS}, {"role": "user", "content": user}]
in_est = C.count_tokens(JUDGE_SYS + user, "glm")
ok, pred = sp.guard(t["judge"], in_est, s["max_tokens"])
if not ok:
print(f" OVER-CAP {t['judge']} {t['trap']} {t['arm']} pred=${pred:.3f}"); continue
text, err, usage = C.call(s, msgs, timeout=300)
c = sp.record({"model": t["judge"], "judge": t["judge"], "keyenv": s["keyenv"],
"trap": t["trap"], "arm": t["arm"], "err": err, "usage": usage})
v = parse_verdict(text) if not err else {"verdict": "ERR", "catastrophe": False, "note": err[:60]}
v.update(trap=t["trap"], arm=t["arm"], judge=t["judge"], label=t["label"])
out.append(v)
print(f" {t['trap']} {t['arm']:<10} {t['judge']:<18}{v.get('verdict'):<8} cat={v.get('catastrophe')} ${c:.4f}")
(C.DIAG / "trap_verdicts.jsonl").write_text("\n".join(json.dumps(v, ensure_ascii=False) for v in out), encoding="utf-8")
summarize(out)
def parse_verdict(text: str) -> dict:
m = re.search(r"\{.*\}", text, re.S)
if not m:
return {"verdict": "PARSE", "catastrophe": False, "note": text[:60]}
try:
d = json.loads(m.group(0))
return {"verdict": str(d.get("verdict", "?")).lower(), "catastrophe": bool(d.get("catastrophe")),
"evidence": d.get("evidence", "")[:120], "note": d.get("note", "")[:120]}
except Exception:
vv = re.search(r'"verdict"\s*:\s*"(\w+)"', m.group(0))
return {"verdict": vv.group(1).lower() if vv else "PARSE", "catastrophe": "true" in m.group(0).lower(), "note": text[:60]}
def summarize(out):
from collections import defaultdict
agg = defaultdict(lambda: defaultdict(list))
for v in out:
agg[v["trap"]][v["arm"]].append(v)
print("\n=== TRAP-ACCURACY (per arm: majority verdict / catastrophe flags) ===")
for tr in TRAPS:
t = tr["id"]
if t not in agg: continue
print(f"\n{t} ({tr['type']}):")
for arm in ["P0","P1a","P1b","P1c","A-layout","A-2pass","A-ref-prev","A-ref-both","F-base","F-disc"]:
vs = agg[t].get(arm)
if not vs: continue
verds = [v["verdict"] for v in vs]
cat = any(v["catastrophe"] for v in vs)
print(f" {arm:<11} {verds} catastrophe={cat}")
if __name__ == "__main__":
run()

108
eval/exp14_kpi.py Normal file
View file

@ -0,0 +1,108 @@
#!/usr/bin/env python3
"""exp14 — детерминированный структурный KPI (Претензия 1, БЕЗ судьи) + гварды.
$0. Метрика Претензии 1: распределение предложений/нарратив-абзац (baseline P0: медиана 1.0,
среднее 1.70, доля 1-предл. 0.58). Гварды: CJK-утечка=0, length-ratio, glossary-присутствие,
диалог-тире-парность. Аварийный гейт: нельзя «побеждать» только МЕНЬШИМ числом абзацев
KPI парно с atom-coverage-прокси (длина не должна коллапсировать).
Использование: exp14_kpi.py [--scope trap|stage2]
"""
from __future__ import annotations
import argparse, json, re, statistics
from pathlib import Path
import exp14_common as C
ARMS = C.DIAG / "arms"
MAT = json.load(open(C.DIAG / "material.json"))
def paras(t): return [p for p in re.split(r"\n\s*\n", t.strip()) if p.strip()]
def sents(p): return [s for s in re.split(r"(?<=[.!?…])\s+", p.strip()) if s.strip()]
def is_dlg(p): return p.strip().startswith("") or p.strip().startswith("")
def han(t): return sum(1 for c in t if "" <= c <= "鿿" or "" <= c <= "䶿")
def kpi_of(text: str) -> dict:
ps = paras(text)
narr = [p for p in ps if not is_dlg(p)]
dlg = [p for p in ps if is_dlg(p)]
sp = [len(sents(p)) for p in narr] or [0]
return dict(
n_para=len(ps), n_narr=len(narr), n_dlg=len(dlg),
median_spp=statistics.median(sp), mean_spp=round(statistics.mean(sp), 2),
share_1sent=round(sum(1 for x in sp if x == 1) / len(sp), 3),
chars=len(text), han=han(text),
)
def gloss_presence(text: str, editor_constraint: str) -> float:
"""Доля dst-форм из инъекции, чьё СТЕММ (первые 4 симв.) встречается в выходе (прокси)."""
dsts = re.findall(r"«([^»]+)»", editor_constraint)
if not dsts:
return 1.0
hit = 0
for d in dsts:
stem = d.split()[0][:4]
if stem and stem.lower() in text.lower():
hit += 1
return round(hit / len(dsts), 3)
def unit_map(scope):
if scope == "trap":
return {f"{u['chapter']}.{u['chunk_idx']}": u for u in MAT["trap_chunks"]}
m = {}
for ch, chunks in MAT["stage2"].items():
for u in chunks:
m[f"{ch}.{u['chunk_idx']}"] = dict(chapter=int(ch), **u)
return m
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--scope", default="trap")
a = ap.parse_args()
units = unit_map(a.scope)
arms = sorted(d.name for d in ARMS.iterdir() if d.is_dir())
print(f"=== exp14 KPI ({a.scope}, {len(units)} chunks) — Претензия 1 + гварды ===\n")
rows = {}
for arm in arms:
agg = []
han_total, chars_total, chars_p0 = 0, 0, 0
gl = []
for uid, u in units.items():
fp = ARMS / arm / f"{uid}.txt"
if not fp.exists():
continue
t = fp.read_text(encoding="utf-8")
k = kpi_of(t)
agg.append(k); han_total += k["han"]; chars_total += k["chars"]
chars_p0 += len(u["final_p0"])
gl.append(gloss_presence(t, u.get("editor_constraint", "")))
if not agg:
continue
allsp_median = statistics.median([k["median_spp"] for k in agg])
mean_spp = round(statistics.mean([k["mean_spp"] for k in agg]), 2)
share1 = round(statistics.mean([k["share_1sent"] for k in agg]), 3)
lr = round(chars_total / max(1, chars_p0), 3)
rows[arm] = dict(n=len(agg), mean_spp=mean_spp, share_1sent=share1,
han=han_total, len_ratio_vs_p0=lr,
gloss=round(statistics.mean(gl), 3))
hdr = f"{'arm':<12}{'n':>3}{'mean_spp':>10}{'share_1s':>10}{'CJK':>6}{'len/P0':>8}{'gloss':>7}"
print(hdr); print("-" * len(hdr))
# baseline first
order = [a for a in ["P0", "P1a", "P1b", "P1c", "A-layout", "A-2pass",
"A-ref-prev", "A-ref-next", "A-ref-both", "F-base", "F-disc"] if a in rows]
order += [a for a in rows if a not in order]
for arm in order:
r = rows[arm]
print(f"{arm:<12}{r['n']:>3}{r['mean_spp']:>10}{r['share_1sent']:>10}"
f"{r['han']:>6}{r['len_ratio_vs_p0']:>8}{r['gloss']:>7}")
print("\nПретензия-1 сигнал: mean_spp↑ и share_1sent↓ vs P0 = меньше рублености (лучше);")
print("гейт: len/P0 не должен коллапсировать (<~0.9 = подозрение на потерю атомов); CJK=0 обяз.")
(C.DIAG / f"kpi_{a.scope}.json").write_text(json.dumps(rows, ensure_ascii=False, indent=1), encoding="utf-8")
if __name__ == "__main__":
main()

168
eval/exp14_material.py Normal file
View file

@ -0,0 +1,168 @@
#!/usr/bin/env python3
"""exp14 — материал: trap-чанки, Stage-II главы (детерм. D), реконструкция глоссарий-
инъекции из rerun-store (rig-фиделити A1, как exp12_blocks), P0-baseline paragraph-KPI.
$0. Выход: /home/ubuntu/books/gu-zhenren/exp14/material.json (ВНЕ git).
"""
from __future__ import annotations
import json, re, sqlite3, statistics
from pathlib import Path
RERUN = Path("/home/ubuntu/books/gu-zhenren/rerun")
OUT = Path("/home/ubuntu/books/gu-zhenren/exp14"); OUT.mkdir(parents=True, exist_ok=True)
DB = RERUN / "guzhenren-rerun.db"
# ── Заморожённый выбор (§1.0) ──────────────────────────────────────────────────────
TRAP_CHUNKS = [(7, 0), (8, 0), (8, 1), (9, 0), (10, 0), (11, 0), (11, 1), (24, 0), (24, 1)]
STAGE2 = [19, 17, 18]
EXCLUDE = {(5, 0), (20, 0)} # экспорт-баг D35.4a
EDITOR_HEADER = ("КАНОНИЧЕСКИЕ ПЕРЕВОДЫ имён и терминов (в черновике эти сущности должны быть "
"переданы ИМЕННО этими формами — приводи к ним любые расхождения, склоняя по "
"контексту; не вводи иных вариантов и не меняй ничего другого):")
GLOSS_HEADER = ("ГЛОССАРИЙ (используй эти утверждённые переводы имён и терминов последовательно; "
"строки с пометкой ⟨проверить⟩ — неподтверждённые кандидаты):")
def load_records():
d = json.load(open(RERUN / "records.json"))
return {(r["chapter"], r["chunk_idx"]): r for r in d}, d
def paras(t: str):
return [p for p in re.split(r"\n\s*\n", t.strip()) if p.strip()]
def sents(p: str):
return [s for s in re.split(r"(?<=[.!?…])\s+", p.strip()) if s.strip()]
def dialogue_D(source: str) -> float:
"""exp12 §1.1: доля символов внутри «“…”» (U+201C..U+201D) от не-пробельных."""
nonspace = sum(1 for c in source if not c.isspace())
inq, indq = 0, False
for c in source:
if c == "":
indq = True; continue
if c == "":
indq = False; continue
if indq and not c.isspace():
inq += 1
return inq / max(1, nonspace)
def reconstruct_injection():
"""editor_constraint (dst-only, approved, dedup) + bilingual_glossary (src→dst[+⟨проверить⟩])
per chunk из injected_ids + glossary. Sticky union chunk0.. внутри главы (exp12 A5)."""
con = sqlite3.connect(DB); con.row_factory = sqlite3.Row
gl = {(r["src"], r["sense"], r["since_ch"], r["until_ch"]): (r["dst"], r["status"])
for r in con.execute("SELECT src,sense,since_ch,until_ch,dst,status FROM glossary")}
inj = {}
for r in con.execute("SELECT chapter,chunk_idx,injected_ids,n_sticky,n_evicted FROM retrieval_state"):
inj[(r["chapter"], r["chunk_idx"])] = (json.loads(r["injected_ids"] or "[]"),
r["n_sticky"], r["n_evicted"])
con.close()
def keydec(k):
src, sense, since, until = k.split("\x1f")
return (src, sense, int(since), int(until))
def block_for(keys):
recs = []
for k in keys:
src, sense, since, until = keydec(k)
dst, status = gl.get((src, sense, since, until), ("", "auto"))
if dst.strip():
recs.append((src, dst.strip(), status == "approved"))
seen, el = set(), []
for src, dst, conf in recs:
if conf and dst not in seen:
seen.add(dst); el.append(f"- «{dst}»")
eb = (EDITOR_HEADER + "\n" + "\n".join(el)) if el else ""
glines = [f"{src}{dst}" + ("" if conf else " ⟨проверить⟩") for src, dst, conf in recs]
gb = (GLOSS_HEADER + "\n" + "\n".join(glines)) if glines else ""
return eb, gb, len(el), len(glines)
out = {}
chapters = sorted(set(ch for ch, _ in inj))
for ch in chapters:
cidxs = sorted(c for (cc, c) in inj if cc == ch)
chunk0keys = inj.get((ch, 0), ([], 0, 0))[0]
for c in cidxs:
keys, nst, nev = inj[(ch, c)]
active = list(keys)
for k in chunk0keys: # sticky scene-inertia within chapter
if c > 0 and k not in active:
active.append(k)
eb, gb, ne, ng = block_for(active)
out[f"{ch}/{c}"] = {"editor_constraint": eb, "bilingual_glossary": gb,
"n_constraint": ne, "n_gloss": ng, "n_sticky": nst, "n_evicted": nev}
# chapter-level union (для P1b/P1c whole-chapter арма)
allkeys = []
for c in cidxs:
for k in inj[(ch, c)][0]:
if k not in allkeys:
allkeys.append(k)
eb, gb, ne, ng = block_for(allkeys)
out[f"{ch}/ALL"] = {"editor_constraint": eb, "bilingual_glossary": gb,
"n_constraint": ne, "n_gloss": ng}
return out
def p0_kpi(recs):
"""P0 baseline: sentences/narrative-paragraph по 55 committed чанкам (freeze-число)."""
sp = []
for (ch, ck), r in recs.items():
if (ch, ck) in EXCLUDE:
continue
for p in paras(r["final"]):
if p.strip().startswith(""):
continue
sp.append(len(sents(p)))
return {"n_paras": len(sp), "median": statistics.median(sp),
"mean": round(statistics.mean(sp), 3),
"share_1sent": round(sum(1 for x in sp if x == 1) / len(sp), 3)}
def main():
recs, _ = load_records()
inj = reconstruct_injection()
# verify: trap chunks have reconstructed blocks
print("=== Инъекция реконструирована (trap-чанки) ===")
for ch, ck in TRAP_CHUNKS:
b = inj[f"{ch}/{ck}"]
print(f" {ch}.{ck}: {b['n_constraint']} constraint / {b['n_gloss']} gloss "
f"(sticky={b['n_sticky']} evict={b['n_evicted']})")
# Stage-II D
print("\n=== Stage-II главы: детерм. D (диалого-плотность) ===")
d_scores = {}
for ch in STAGE2:
src = "".join(recs[(ch, c)]["source"] for (cc, c) in recs if cc == ch)
d_scores[ch] = round(dialogue_D(src), 3)
print(f" гл.{ch}: D={d_scores[ch]}")
# P0 KPI
kpi = p0_kpi(recs)
print(f"\n=== P0 baseline paragraph-KPI (freeze-сверка) ===\n {kpi}")
# export material for arms
mat = {"trap_chunks": [], "stage2": {}, "kpi_p0": kpi, "stage2_D": d_scores}
for ch, ck in TRAP_CHUNKS:
r = recs[(ch, ck)]
mat["trap_chunks"].append({"chapter": ch, "chunk_idx": ck,
"source": r["source"], "draft": r["draft"], "final_p0": r["final"],
"editor_constraint": inj[f"{ch}/{ck}"]["editor_constraint"],
"bilingual_glossary": inj[f"{ch}/{ck}"]["bilingual_glossary"]})
for ch in STAGE2:
mat["stage2"][ch] = [{"chunk_idx": c, "source": recs[(ch, c)]["source"],
"draft": recs[(ch, c)]["draft"], "final_p0": recs[(ch, c)]["final"],
"editor_constraint": inj[f"{ch}/{c}"]["editor_constraint"],
"bilingual_glossary": inj[f"{ch}/{c}"]["bilingual_glossary"]}
for (cc, c) in sorted(recs) if cc == ch]
(OUT / "material.json").write_text(json.dumps(mat, ensure_ascii=False), encoding="utf-8")
(OUT / "injection_blocks.json").write_text(json.dumps(inj, ensure_ascii=False, indent=1), encoding="utf-8")
print(f"\n{OUT/'material.json'} ({len(mat['trap_chunks'])} trap chunks, {len(STAGE2)} stage-II chapters)")
if __name__ == "__main__":
main()

101
eval/exp14_prompts.py Normal file
View file

@ -0,0 +1,101 @@
#!/usr/bin/env python3
"""exp14 — рендер промптов армов (ЗАМОРОЖЕНЫ; sha256 в §2 дока).
- baseline editor = backend/prompts/editor.md (v2-bilingual-reflow), brief-filled.
- discourse editor = baseline + дискурс-reflow ядро (§1.2: 5 техник Ван Цуй + Розенталь) + few-shot.
- translator (для re-draft глав/нарезки) = backend/prompts/translator.md (v1-reflow).
Few-shot минимальные ортогональные (narrative N:1, dialogue 1:N, focal-shift). НЕ ручной CoT.
"""
from __future__ import annotations
import hashlib
from pathlib import Path
PROMPTS = Path("/home/ubuntu/projects/textmachine/backend/prompts")
BRIEF = dict(source_lang="zh", target_lang="ru", genre="вебновелла",
audience="взрослые читатели вебновелл", title="蛊真人",
honorifics="keep", transcription="palladius", venuti="0.6", footnotes="minimal")
def _fill(t: str) -> str:
for k, v in BRIEF.items():
t = t.replace("{{" + k + "}}", v)
return t
def _split(md_text: str) -> tuple[str, str]:
sysmd, usermd = md_text.split("---USER---", 1)
return _fill(sysmd).strip(), _fill(usermd).strip()
# ── Дискурс-reflow ядро (§1.2; арм для ЗАМЕРА, не «оптимальный промпт») ──────────────
DISCOURSE_CORE = """
ДИСКУРС-ПЕРЕВЁРСТКА (обязательная операция передачи китайского паратаксиса в русскую гипотактическую прозу это КОНВЕНЦИЯ русского языка, а не вольность):
1. Молча определи смысловые ходы фрагмента: единый фокал/наблюдатель; действие и его непосредственная реакция; одна тема рассуждения; границы смена говорящего, времени, места или фокала.
2. Один повествовательный ход оформляй ОДНИМ русским абзацем, ДАЖЕ если китайский исходник разбит на однофразовые строки. Инструмент слияния причастные и деепричастные обороты, подчинительные союзы и связки (построй иерархию, сегментируй по смыслу, промаркируй вид/время предикатов, варьируй лексику, добавляй связки). Не сливай ТОЛЬКО ради длины и не теряй смысловые атомы.
3. Каждую новую реплику начинай с нового абзаца через тире «»; слова автора при той же реплике оставляй в её абзаце.
4. Разрешено объединять и делить русские предложения; число предложений и абзацев совпадать с исходником НЕ обязано. Запрещено терять смысловые атомы (участников, действия, числа, полярность, заголовки).
"""
FEWSHOT = """
Примеры требуемой ПЕРЕВЁРСТКИ (показана структура вывода, не стиль):
[narrative N:1] Исходник построчно «Он вышел за дверь.» / «Небо было серым.» / «Он вздохнул.» / «Дорога уходила вдаль.» становится ОДНИМ абзацем:
Он вышел за дверь. Небо было серым; вздохнув, он смотрел, как дорога уходит вдаль.
[dialogue 1:N] Исходник «Дядя нахмурился и сказал: Время летит. Садись. Племянник ответил: Спасибо.» становится:
Дядя нахмурился.
Время летит. Садись, сказал он.
Спасибо, ответил племянник.
[focal-shift] При смене наблюдателя/места/времени новый абзац, даже если в исходнике это продолжение той же строки.
"""
REFERENCE_NOTE = ("\n\nСПРАВОЧНЫЙ КОНТЕКСТ (соседние фрагменты — ТОЛЬКО для разрешения связей, "
"местоимений и опущенных подлежащих; НЕ переводи и НЕ пересказывай его в выходе):")
def editor_system(variant: str, few_shot: bool = True) -> str:
sysmd, _ = _split((PROMPTS / "editor.md").read_text(encoding="utf-8"))
if variant == "baseline":
return sysmd
if variant == "discourse":
out = sysmd + "\n" + DISCOURSE_CORE
if few_shot:
out += FEWSHOT
return out
raise ValueError(variant)
def editor_user(source: str, draft: str, reference: str = "") -> str:
_, usermd = _split((PROMPTS / "editor.md").read_text(encoding="utf-8"))
u = usermd.replace("{{text}}", source).replace("{{draft}}", draft)
if reference.strip():
u += REFERENCE_NOTE + "\n" + reference.strip()
return u
def translator_system() -> str:
sysmd, _ = _split((PROMPTS / "translator.md").read_text(encoding="utf-8"))
return sysmd
def translator_user(source: str) -> str:
_, usermd = _split((PROMPTS / "translator.md").read_text(encoding="utf-8"))
return usermd.replace("{{text}}", source)
def sha_frozen() -> dict:
return {
"editor_baseline_sys": hashlib.sha256(editor_system("baseline").encode()).hexdigest()[:16],
"editor_discourse_sys": hashlib.sha256(editor_system("discourse").encode()).hexdigest()[:16],
"discourse_core": hashlib.sha256(DISCOURSE_CORE.encode()).hexdigest()[:16],
"fewshot": hashlib.sha256(FEWSHOT.encode()).hexdigest()[:16],
"translator_sys": hashlib.sha256(translator_system().encode()).hexdigest()[:16],
}
if __name__ == "__main__":
import json
print("=== frozen prompt sha256[:16] ===")
print(json.dumps(sha_frozen(), indent=1, ensure_ascii=False))
print("\n=== editor discourse system (first 600) ===")
print(editor_system("discourse")[:600])