textmachine/docs/experiments/15-segmentation-empirics.md

313 lines
40 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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

# exp15 — эмпирика сегментации/когезии/контракта t-e (research/19 §D, трек B)
> Полигон-сессия, 2026-07-17. Промт: `docs/POLYGON_SEGMENTATION_EMPIRICS_SESSION_PROMPT.md`.
> Дизайн-оф-рекорд: `docs/research/19-chunking-cohesion.md` §D (Q0Q5). Зона: `eval/` + `docs/experiments/`.
> Скрипты — семья `eval/exp15/`. Выходы/сырьё — ВНЕ git (`/home/ubuntu/books/gu-zhenren/exp15/`).
>
> **СТАТУС: §1 ПРЕ-РЕГ ФРИЗ — ЗАПОЛНЕН, ждёт (а) подписи владельца на 3 гейтах §1.13 и (б) коммита
> ДО первого платного вызова.** §2§6 заполняются по ходу прогона. НИ ОДНОГО платного вызова ещё НЕ было.
---
## §1 — ПРЕ-РЕГИСТРАЦИОННЫЙ ФРИЗ
### §1.0 Дисциплина и провенанс
- Пре-рег = единственный коммит этой сессии; всё после первого платного вызова НЕ меняется (иначе новый
experiment-ID). Мандат самопроверки (CLAUDE.md): ревью ИСПОЛНЕНИЕМ кода + сформированных запросов +
результатов — в каждый скрипт; каждый платный скрипт персистит usage/cost (D30.10).
- **Правило двух направлений соблюдено**: все слаги подтверждены И живым `/models` (`eval/exp15/preflight_models.py`
`exp15/preflight_models.json`), И официальной вендор-докой (12-агентный веб-workflow → `exp15/freeze_facts.json`,
5/6 тем CONFIRMED, 1 PARTIAL с явным caveat). Даты/URL — в `freeze_facts.json`.
- Анти-сходимость (D32.4): все контрасты делят один якорь A0 → их «победы» коррелированы и НЕ суммируются
в «N сигналов сходятся»; повторы судей давят судейский шум, НЕ шум генерации якоря (двойной якорь A0↔A0).
### §1.1 Пины (хеши — состояние на момент фриза)
| Что | Значение | Примечание |
|---|---|---|
| Бэкенд HEAD | `68032f7` | ≥ `d3f6b34` (пак-1: trust-gated suppressor, memmatch-v4, sanitizer-v5, pair-сеам). Дерево ЧИСТОЕ (трек A залендён). |
| Сид (снапшот-основа) | `guzhenren-seed-v2.yaml` sha256 `175a67ad2f05caeaec8fc5b8c8d304334e8dc73eebd3caf5fc3b4b8be0c408f4` | gender-полон (12/13 person; `古月`=n-a клан). `人祖`=male ДОБАВЛЕН (подпись владельца, канон D19.3) — байт-стабильно (diff=1 строка, идемпотент). Пол в memory-хеше (`memory.go:273`) → resnapshot. |
| translator.md | sha256 `35d3ad6e0656a7d1116fb8b034a4cea087d5c11ac6e043804185f94f15af5829` | prod prompt (`v1-reflow`); несёт инертный reflow-однострочник (L10) — §C1 предлагает снять, но A0 = ТЕКУЩИЙ prompt как есть. |
| editor.md | sha256 `878b0da397eda5392950a5fa43a87e575b09cf6aa352d8e58ea2da26b55d8290` | prod prompt (`v3-discourse-reflow`). |
| editor-mono.md | sha256 `a8aaa38ea529e7344c4ce08f000f862cfa7a3fe4c5b3a6bba08a1a22cfeb189c` | моно-редактор (не в A0-стеке; пин для полноты). |
| A0 pipeline | `backend/configs/pipeline-c1.yaml` + `gates.regression_guard.enabled: true` | §1.2. |
| chunkerVersion | `chunker-v4-utf8-quotedepth` (const) | greedy-1500 = CODE-const (`chunker.go:47`), НЕ config-кноб. |
### §1.2 Якорь A0 и реконструкция инъекции (по ТЕКУЩЕМУ Go)
**A0 = прод-кандидат пост-D38.5:** draft `deepseek-v4-flash` (`v1-reflow`, temp 0.3, **thinking ON**
конфиг-строка `reasoning:"off"` для deepseek — NO-OP, echoMineViolation-гейт принуждает thinking; при
расхождении верить Go) → editor `glm-5` (`v3-discourse-reflow`, temp 0.4, thinking OFF), **greedy-1500**,
**без когезии** (`stm_depth:2`/`overlap_tokens:200` — МЁРТВЫЕ кнобы, реального carryover в prod НЕТ),
**RegressionGuard ON** (наблюдаемость, не диспозиция), `glossary_token_budget:800`, сид reseed-промоутнутый.
**Реконструкция инъекции — КРИТИЧНО (порт exp14b СТАЛ, не использовать):**
- $0-пути к `retrieval_state.injected_ids` НЕТ (persist только ПОСЛЕ платной стадии в `translateChunk`;
единственный бинарь `tmctl`, ingest вплавлен в платный `translate`).
- Python-порт `exp14b_reseed_promote.py` (find/suppress/render) **поведенчески устарел**: он кодирует
ДО-trust-gate longest-match (spoiler-only `valid_suppressor`), а текущий Go `suppressContained`
(`memory.go:684-726` + `matchTrust`/`trustRank` `640-668`) — disposition/trust-gated. Порт разойдётся с
A0 ровно на draft-nests-over-approved (суть пак-1). **НЕ реюзать порт для инъекции.**
- **Метод (принят):** A0/A0 генерятся РЕАЛЬНЫМ бэкендом `tmctl translate` (аутентичный trust-gated
matcher), из его `retrieval_state.injected_ids` (SQLite `retrieval_state`) читаются авторитетные
инъекционные id; контраст-армы (eval-риги) ПОТРЕБЛЯЮТ эти же id (общий знаменатель). Дамп:
`sqlite3 <book>.db "SELECT chapter,chunk_idx,injected_ids,n_trust_gated_suppress,trust_gate_detail FROM retrieval_state ..."`.
- **Архитектурное следствие (несущее):** бэкенд НЕ умеет производить арм-механизмы (logical-chunker,
carryover/lookahead, diff-editor, edit=глава, wide-read — все ОТСУТСТВУЮТ в prod: greedy-1500 const,
кнобы мёртвые, diff-парковка D21.4). Значит **только A0/A0 — из реального бэкенда; ВСЕ механизм-армы
(Q1/Q2a/Q2c/Q3a-b/Q4a-c) — eval-риги** (Python, паттерн exp14/arms), реализующие §B1.4-B1.5/§B3/§C2
ДИЗАЙН и потребляющие аутентичную A0-инъекцию. Риги — «порт-зеркала в своей зоне, при расхождении верить Go».
### §1.3 Корпус S1S4 (структурные профили — ДО прогона; `eval/exp15/structural_profile.py`)
| Срез | Материал | Профиль (замерен) | Роль | Статус |
|---|---|---|---|---|
| **S1** плоский zh | 蛊真人 поздние 节 (высокий `--sec`, низкая violence-плотность), вне slice25 | median 29 cjk/строка, term 4.46/100c, **0 орнамент-разделителей во ВСЕЙ книге** (2308 节), flat_line_per_sentence=True | точка фоллбек-режима | ✅ материал есть; ⚠ IN-претрейн (принято §D0: S1 валиден для нарезки/внутрипарных, «вне претрейна» несёт S2) |
| **S2** синтетич. сцен-маркир. zh (склейка) | конкатенация ПЕРВЫХ последоват. 节 蛊真人 (решение владельца); швы = ground-truth сцен-границы | по построению: швы-границы | **несущий**: где Q1 дифференцирует (выравнивание разрезов на швы) | ✅ материал есть (§1.14). ⚠ IN-претрейн + синтетика → ПРЕДВАРИТЕЛЬНО; свежая новелла = чистовое подтверждение (НЕ гейт) |
| **S3** ja-ранобэ | `isekai_majutsushi_jp.txt` | median 46, dialogue-opener 0.45 (line-per-utterance), 86 разделит.-строк (``), 43 話, scene_marked=True | нагрузка carryover/пол | ✅ $0 чанкер-профиль (без платных арм) |
| **S4** длинно-абзацный en | `fifty_shades_1_en.txt` | mean 107 cjk/строка (длинные абзацы), blank-run 0.99, 52 Chapter, cjk 0 | контроль общности §0.1 | ✅ $0 чанкер-профиль; caveat: US/UK совр., не европ.классик (альт. PD — `samples/en/*` без билдера) |
Платные армы перевода — ТОЛЬКО S1/S2 (zh→ru, единственные прод-промты). S3/S4 — $0 детерм. валидация
общности чанкера. **Пре-ран проверка «срез задействует рычаг»**: S1 подтверждён flat (проверяет фоллбек-лестницу
B3/B4/DP); S2 обязан нести орнамент/сцен-сдвиги (проверяется профилем ДО платного прогона, когда материал будет).
### §1.4 Трап-набор (§D1)
- **Типы и min-N (общий знаменатель, определяется как пересекающий границу В ЯКОРЕ A0):** T-ana ≥20,
T-ent ≥20, T-tense ≥20 (несущие); T-cat ≥10, T-ell ≥10, T-gen ≥10, T-reg ≥10, T-inv ≥10 (контроль/реюз exp14b).
- **Майнер трапов = `kimi-k2.6`** (Moonshot) — ИСКЛЮЧЁН из судейского пула, семья ≠ арм-моделям (DeepSeek/GLM)
и ≠ судьям (xAI/Mistral). Кандидаты добываются майнингом + ручной отбор.
- **Стратификация по дистанции антецедента** (публикуется per-трап): квота в пределах K=3 предложений
(зона carryover) vs дальше K (зона окна/Ф2) — иначе Q3a «выиграет» по построению.
- **Общий знаменатель контраста:** трапы определяются в A0; в ОБОИХ армах скорится ОДИН набор; пересёк/не
пересёк границу в арме — записываемая КОВАРИАТА, НЕ фильтр. Исключаются только не-пересекающие НИ в одном арме.
- **Ожидаемое поведение каждого трапа записано ДО прогона**; недобор → домайнить до квоты ДО платных вызовов,
иначе тип помечается «Q недоказуем a priori» (не после).
- **T-gen** использует поле `gender` сида (§1.11); если подпись не успевает до Q3a — арм честно «стейт без пола».
### §1.5 Армы — 2-арм контрасты к общему якорю (§D2, дословно + конкретизации)
Якорь A0 на несущем S2 генерится ДВАЖДЫ (A0↔A0, temp>0) = floor шума генерации; Q-эффект < floor не интерпретируется.
| Q | Контраст (одна переменная) | Первичная метрика (ОДНА) | Реализация |
|---|---|---|---|
| **Q1** | greedy vs **logical-граница** B1.4/B1.5-DP) на **S2**, оба на size-matched бюджете **~34k ток** (различие ТОЛЬКО в выравнивании разрезов на швы; размер-эффект Q2) | T-tense+T-ana точность на S2 (общ.знам.); вторично: доля разрезов на scene-shift-швы (выше=лучше) vs continuation-швы (ниже=лучше) | eval-риг: Python-DP чанкер (порт §B1.5) армы через его границы |
| **Q2a** | A0 vs edit=глава (draft приколочен к greedy-1500, крупнеет ТОЛЬКО эмиссия редактора) | retry-adj cost-of-pass при reflow-инвар. omission не хуже A0 | eval-риг: editor glm-5 на объединённом чанке |
| **Q2b** | реюз sizecurve (800/1600/3200/whole, ch17/13) + omission-скоринг ($0 генерации) | reflow-инвар. omission per size | **$0**, `exp14/sizecurve/*`, err-фолбэки исключить |
| **Q2c** | A0 vs широкое-чтение/узкая-эмиссия (эмиссия=чанк, окно=сцена read-only) | T-ana+T-tense точность при out-ток A0 | eval-риг glm-5; кэш z.ai ВЕРИФИЦИРОВАН 1.9) cache-normalized колонка ЛЕГИТИМНА |
| **Q3a** | A0 vs +carryover(K=3): 3 режима src-only/draft-сосед/final-сосед; стейт суб-арм Q3a | T-ana+T-ell точность per режим (Q3a: T-gen/T-reg) | eval-риг: билингв невыровненный хвост в промт |
| **Q3b** | A0 vs +lookahead M=2 (src-only, шов-дедуп-гард ON) | T-cat точность (пустая ячейка exp14) | eval-риг |
| **Q4a** | A0 vs сильный переводчик (draft=`deepseek-v4-pro`) + суб-арм strong-draft+do-nothing | fidelity-трапы ЧЕРНОВИКА до редактора (span) | eval-риг; v4-pro держит семью DeepSeek (mistral свободен под судью) |
| **Q4b** | A0 vs diff-fidelity+style редактор C2; ±сегмент-маркеры) | trap-точность (T-inv) при формат-комплаенсе 90% | eval-риг: anchored search/replace + Go-стиль tolerant apply (Python-порт) |
| **Q4c** | A0 vs reflow-план отдельным пассом C1.3) | mean_spp при omission-инвар.=0 (валидатор плана) | eval-риг |
| **Q0** | A0 vs do-nothing (экспорт черновика) | TOST-эквивалентность, маржа M на trap-точн.+KPI | **$0** генерации (do-nothing = экспорт draft) |
**Порядок/стоп-гейты:** Q2b($0, ре-атрибуция) **Q1+Q3 (несущие, S2)** Q2a/Q2c Q4a/Q4b/Q4c Q0
(обязателен, дёшев). Каждый Q стоп-гейт; стоп при исчерпании бюджета легитимен (приоритет пре-рег);
НО стоп после Q2b НЕ закрывает центральный конфликт. Двойной якорь A0A0 до интерпретации любого Q.
### §1.6 Метрики / агрегация (§D3)
- **Reflow-инвариантный omission (ГЛАВНЫЙ, валидируется на вручную вычитанном whole-chapter выходе ДО скоринга
арм):** по КАЖДОМУ предложению источника присутствие семантических атомов (числа, сущности/глоссарий-хиты,
полярность отрицания) ГДЕ УГОДНО в целевом чанке. НЕ длинo-зависимые гарды (RegressionGuard/coverage смещены
против крупных чанков фабрикуют B0.4).
- **Детерминированные $0:** mean_spp / доля 1-предл. абзацев / диалог-тире / CJK-утечка (⚠ Han-в-скобках после
кириллич.терма НЕ штраф, решение владельца #3) / glossary-консистентность (LTCR по сиду) / доля классов
границ / шов-дедуп / позиционный градиент ВНУТРИ арма.
- **Карта независимости сигналов:** метрики с общим драйвером длины (out-ток, mean_spp, длино-гарды) = ОДИН
сигнал; «сигналы сходятся» требует 1 длинo-независимого (trap-точность/span-верность).
- **Trap-судьи:** 2 кросс-семейных 1.10), temp 0, каждый пейр в ОБОИХ порядках; **6 голосов, при расколе 4:2
добор до 10** (ослабление против §A.7 «~10» бюджетная поправка, фиксируется явно); leave-one-judge-out;
катастроф-скрин К ПОБЕДИТЕЛЮ тоже; fidelity-first, без pooled-style.
- **Агрегация:** ПАРНЫЕ по-главные разности армякорь ВНУТРИ среза; кластер-SE по книге НЕ считаются (несущий
срез 1 кластер) генерализация на «любую книгу» = декларированное ограничение, закрываемое S1S4-разнообразием;
один первичный контраст на Q + Holm-Bonferroni; мощность честно: на 812 главах разрешимы средн./крупн. эффекты
первичны ТРАПЫ.
- **Слепота владельца:** финалисты слепые пакеты (`exp15/monitor/`), метки перемешаны. **Человеческий эндпоинт
гейтит** (планка 2 претензии, D35): метрики НОМИНИРУЮТ, ратифицирует слепое чтение владельца.
### §1.7 Дерево решений (§D5, пороги пинятся числом ДО прогона)
- **Q1:** T-tense+T-ana (общ.знам., S2) сдвиг **порог (пин: парная разность +0.10 доли починенных трапов, p<0.05
Holm)** строить §B1.4/B1.5-DP; null на S2 (НЕ только плоский S1) граница вторична, приоритет когезии (Q3).
- **Q2a/Q2c:** Q2a-первичка (cost-of-pass при omission-инвар.) лучше A0 И Q2c НЕ воспроизводит окном edit=глава
легитимен A.8.1). Q2c воспроизводит (trap-первичка Q2a при меньшей эмиссии) «мелкая эмиссия + широкое окно».
- **Q3a/Q3b:** знаменатель = кросс-граничные трапы, которые A0 ПРОВАЛИВАЕТ; carryover чинит **50%** оживление
ратифицируется (режим по дельте src/draft/final + владелец §E.1); null при верифиц. пересекающих когезия требует окна/Ф2.
- **Q4a:** strong-draft+do-nothing чинит ** пин-доли (≥0.5)** T-inv, что flash-draft валит, при COGS пин-потолка
арм «структура у переводчика» в прод-кандидаты.
- **Q4b:** формат-комплаенс <90% ИЛИ fidelity-first trap хуже full-regen диффы откладываются (закрыть D21.4/D21.10 явно);
90% и атом-omission=0 дифф-редактор в прод-кандидаты.
- **Q4c:** mean_spp A0 И атом-omission=0 при COGS A0×1.3 reflow отдельным пассом; иначе остаётся в editor-промпте.
- **Q0:** TOST-эквивалентность (маржа **M пин: |Δ| < 0.05 доли** на первичках) A0do-nothing мандаты редактора
пересматриваются (APE-урок); НЕ-отвержение без эквивалентности = «данных мало».
- **Финал любой ветки:** прод-кандидат слепое чтение владельца (гейтящий эндпоинт).
### §1.8 Слуги (live /models ✅ + вендор-док ✅, 2026-07-17)
Все присутствуют в /models. `deepseek-chat`/`deepseek-reasoner` депрекейтятся **2026-07-24 15:59 UTC** (оба v4-flash);
арм-конфиг на `deepseek-v4-flash`/`-pro` НЕ задет. Слуги: draft `deepseek-v4-flash`; editor `glm-5`; Q4a-strong
`deepseek-v4-pro`; судьи `grok-4.3`, `mistral-large-latest`(=Large 3); майнер `kimi-k2.6`; gpt-5.4=`gpt-5.4-2026-03-05`,
gemini=`gemini-3.1-pro-preview` (пины на случай эскалации/3-го судьи).
### §1.9 Цены, кэш, бюджет, капы (`exp15/freeze_facts.json`, `eval/exp15/budget_calc.py`)
Цены/1M USD (офиц., 2026-07-17): deepseek-v4-flash 0.14/0.0028/0.28; v4-pro 0.435/0.003625/0.87; glm-5 1.00/0.20/3.20;
grok-4.3 1.252.50/0.200.40/2.505.00 (reasoning additive out); mistral-large-3 0.50//1.50; kimi-k2.6 0.95/0.16/4.00;
gemini-3.1-pro 24/0.20.4/1218 (thinking=output); gpt-5.4 2.50/0.25/15.00.
**Кэш ВЕРИФИЦИРОВАН**: z.ai/GLM auto-implicit, `usage.prompt_tokens_details.cached_tokens`, hit ~0.2×input
**§E.8-бис гейт ПРОЙДЕН, Q2c cache-normalized колонка ЛЕГИТИМНА**; DeepSeek auto ~2%×miss; OpenAI/Gemini auto.
**Бюджет (recompute из trap-N×голоса×2 порядка×2 судьи):** несущий блок (Q1+Q3a+Q3a+Q3b) armы $1.71 + судьи $6.66 +
майнер $0.27 = **$8.64**; полный пакет $13.13 оба < **$15 (хард-кап владельца)**. **Апекс-судья gemini как 2-й = $44
несущий блок ИНФИЗИБЛ**; grok+mistral бюджет-вынужденный правильный выбор (зафиксировано).
**Капы:** per-call predicted-cost гейт ДО каждого вызова (в run-скриптах); стоп-гейт после каждого Q; хард-кап $15.
**Риск (пин):** DeepSeek анонсировал (SCMP/TNW 30.06) peak-surge ×2 в Beijing-часы (0104 & 0610 UTC) НЕ на офиц.
таблице; митигация: платные DeepSeek-армы ВНЕ этих окон, либо ×2 бюджет; ре-чек у 24.07-катовера. Gemini thoughts-accounting
и glm-5 PAYG-доступ эмпир-верификация на 1-token пробе у первого платного гейта (`freeze_facts.json` risks).
### §1.10 Судьи и майнер (семейно чисты)
- **Судьи (2 кросс-семейных):** `grok-4.3` (xAI, reasoning ON) + `mistral-large-latest` (Mistral Large 3). Ни один
не из семьи арм-моделей (DeepSeek draft/Q4a, GLM editor) и не майнер (Moonshot). Опц. 3-й `gemini-3.1-pro` ТОЛЬКО
на leave-one-out подмножестве при остатке бюджета (иначе инфизибл).
- **Майнер:** `kimi-k2.6` (Moonshot) исключён из судей, семья арм/судьи.
- **Отклонение от D-лог апекс-пары (grok+gemini):** заменён geminimistral как бюджетная поправка 1.9); зафиксировано явно.
### §1.11 Gender-транспорт (решение владельца #2) + спорные
Поле `gender` УЖЕ в сиде и потребляется Go (`memseed.go:35``memory.go:273` хешstore; `migrate.go:183` =
male|female|hidden|''). Транспорт `eval/exp15/gender_transport.py` идемпотентен, байт-стабилен, пре-снапшот+лог+асерты
(паттерн exp14b_reseed_promote), audit-first (no-op на уже-гендерном сиде snapshot-хеш СОХРАНЁН до подписи).
Аудит: **13 person-записей, теперь 12 гендерны** (方源/方正/古月X male, 沈翠 female, 白凝冰 hiddenгендерно-нейтр.,
**`人祖`=male ПОДПИСЬ ВЛАДЕЛЬЦА, канон D19.3**); **`古月`=n-a** (клан, без поля подтверждено). Подписи в
`exp15/gender_signoff.yaml` (пин). Транспорт применил 人祖male байт-стабильно (diff=1 строка, идемпотент); новый seed-хеш §1.1.
**T-gen-трапы гонятся полноценно** (квота 10). Будущие трап-персонажи добавляются в signoff идемпотентно до Q3a.
Scene-state слот (eval-side, Q3a) surface-ит пол self-review OK.
### §1.12 Отклонения от §D (явно)
1. Судья-пара grok+mistral вместо апекс grok+gemini бюджет ($15 не держит gemini-thinking-output). §1.91.10.
2. Голоса 610 (не «~10») уже бюджет-поправка самого §D3, повторно фиксирую.
3. **Порт инъекции exp14b — НЕ реюзается** (поведенчески устарел до-trust-gate); A0-инъекция из реального `tmctl translate`. §1.2.
4. **Механизм-армы — eval-риги** (бэкенд не умеет logical/carryover/diff/wide-read); A0/A0 реальный бэкенд. §1.2.
5. S2 «свежий сцен-вебновелл» **S2 синтетическая склейка ПЕРВЫХ 节 蛊真人** (решение владельца): швы=ground-truth сцен-границы; РАЗБЛОКИРУЕТ платные Q1/Q3; репорт помечается «синтетика+претрейн, предварительно до чистого S2» 1.14). Свежая новелла = чистовое подтверждение, НЕ гейт.
### §1.13 Гейты владельца — ЗАКРЫТЫ (2026-07-17)
- **A. S2-материал S2 (склейка ПЕРВЫХ 蛊真人), решение владельца.** Правила пре-рег §1.14. Разблокирует Q1/Q3;
предварительно (синтетика+претрейн), свежая новелла = чистовое подтверждение, не гейт.
- **B. Gender подписан:** `人祖`=male (канон D19.3), `古月`=n-a (клан). Применено, seed re-hash §1.1, T-gen полноценно.
- **C. Бюджет/судьи подтверждены:** $13.13/$8.64 в $15; grok-4.3 (reasoning-ON, **wire-чек ДО платных**) + mistral-large-3
(слаг **live-фактчек ДО платных**); Q4a=deepseek-v4-pro; майнер kimi-k2.6 (из {openai/kimi/gemini}).
### §1.14 S2 — синтетическая сцен-склейка (пре-рег правила, решение владельца 2026-07-17)
Построение (`eval/exp15/build_s2prime.py`, детерминир., $0): конкатенация N ПЕРВЫХ последовательных 蛊真人 (opening-арка,
第一卷) в единый текст; ПЕРЕД склейкой стрип 第X节-заголовков на швах (шов = НЕЯВНАЯ сцен-граница, без явного маркера).
Каждый шов = записанная ground-truth граница (rune-offset + пара соседних 节-id).
- **(б) Ручная классификация каждого шва:** «scene-shift» (реальная смена времени/места/POV/сцены) vs
«continuation-cliffhanger» ( обрывается посреди сцены, следующий продолжает). Раздельные страты; continuation-швы =
**negative-boundaries** («здесь резать НЕЛЬЗЯ»). Классификация чтением контекста шва; рационал per-шов в леджер §2.
- **(в) Q1-контраст на size-matched бюджете ~34k ток:** greedy vs logical ОДИН бюджет, различие только в выравнивании
разрезов на швы. Метрика границы (вторичная): доля scene-shift-швов, на которые разрез попал (выше=лучше) vs доля
continuation-швов, разрезанных (ниже=лучше). Размер-эффект (1500 vs 34k) домен Q2, НЕ Q1.
- **Трапы** размещаются straddling швов (кросс-граничные); T-* привязаны к scene-shift-швам (где граница ДОЛЖНА чинить).
- **(г) Оговорка репорта:** S2 = синтетическая пере-нарезка IN-претрейн книги результаты ПРЕДВАРИТЕЛЬНЫ; чистое
подтверждение на свежей вне-претрейн новелле, когда появится (не гейт запуска).
---
## §2 — Профили срезов + трап-леджер
**Структурные профили (`eval/exp15/structural_profile.py`, $0, ДО прогона — проверка «срез задействует рычаг»):**
| Срез | chars | median cjk/строка | term/100c | dialogue-opener | орнамент-строк | scene_marked | flat_LPS | вывод |
|---|---|---|---|---|---|---|---|---|
| S1 (guzhenren whole) | 7.99M | 29 | 4.46 | 0.19 | **0** | False | True | плоский фоллбек-режим |
| **S2 (склейка 节1-12)** | 36,186 | 32 | 4.34 | 0.21 | 0 (швы неявные) | False | True | сцен-структура НЕЯВНАЯ на швах 2 ниже) |
| S3 (isekai ja) | 232,921 | 46 | 3.26 | 0.45 | 86 (``) | True | False | line-per-utterance + разделители |
| S4 (fifty-shades en) | 873,697 | 57 (mean 107) | 0.51 | 0.53 | 3 | True (blank-run 0.99) | False | длинно-абзацный |
**S2 шов-леджер (`exp15/S2prime.txt`, `S2prime_seams.json`, `S2prime_seam_labels.json`):** 12 первых 蛊真人
(opening-арка), заголовки стрипнуты 11 швов = ground-truth сцен-границы (rune-offsets: 3372/6496/8981/12214/14479/
17050/19960/23363/26698/29527/32558). Ручная классификация (полигон, рационал+цитата per шов self-review в labels):
| Страта | швы | роль в Q1 |
|---|---|---|
| **scene-shift** (резать ХОРОШО) | 1,2,3,6,7,8,9 (7 шт; soft: 1,7) | logical-стратегия ДОЛЖНА выровнять разрез |
| **continuation** (negative-boundary, резать ПЛОХО) | 4,5,10,11 (4 шт) | разрез здесь = штраф (анафора/референт через шов) |
Примеры: шов4 (节45) 节4 обрывается на «古月方源!», 节5 продолжает (自己 через шов) = negative; шов9 (节910)
«已已三天三夜了» скачок 3 дня + POV方源 = scene-shift. S2 = синтетика IN-претрейн ПРЕДВАРИТЕЛЬНО 1.14г).
Если трап-квота (T-tense/T-ana 20 straddling scene-shift) недоберётся на 7 швах расширить N节 ДО платных вызовов.
**Трап-леджер:** заполняется после майнинга (kimi-k2.6) + ручного отбора, ДО платных вызовов (стратификация,
ожидаемое поведение per трап, общий знаменатель в A0).
## §3 — Результаты по Q (первичка/вторичка раздельно)
### Q2b — реюз exp14 sizecurve, $0 генерации (`eval/exp15/reflow_omission.py`, `exp15/q2b_omission.json`)
Reflow-инвариантный entity-omission (lemma-match pymorphy3). **Оркестратор-амендменты вшиты:** (1) match по ЛЕММЕ,
inflection вне decl.forms = `inflection_gap` ФЛАГ (span-чек), НЕ omission; (2) variance-чекceiling; (3) content-floor
бэкстоп (не сработал); (4) провенанс БАЙТ-идентичен (`chapter_source` = `exp14_sizecurve.py:30-32`). **Валидирован на
вручную-вычитанном ch13-whole** (0 ложных omission; term-drift главастарейшина корректно НЕ omission).
Результат (ch13/17 × 800/1600/3200/whole, 0 err-фолбэков): **within-chapter size-span ch13=0.059, ch17=0.0 НЕТ
монотонного sizeomission тренда.** ВСЕ raw-флаги (`класс А`,`класс В`,`культивация`) = **TERM-DRIFT артефакты**, не
потеря контента: sizecurve-выходы (2026-07-11) ПРЕДшествуют reseed класс/разряд (D38.5, 07-12), рендерят 甲等/丙等 как
«разряд» (grep-verified) **истинный entity-omission ≈0 на ВСЕХ размерах.**
**Вердикт: ПОТОЛОК ИНСТРУМЕНТА (амендмент 2)** это НЕ «размер безопасен»: именованные сущности выживают на любом
размере по природе; тихая потеря крупного чанка (если есть) на уровне КЛАУЗЫ/детали, невидима entity-присутствию.
Центральный вопрос sizeomission требует SPAN-СУДЕЙ (платный **Q2a**), как и заявляет дизайн Q2b не ратифицирует
edit=глава, только Q2a»). Побочно: подтверждён term-drift класс/разряд glossary-consistency ось, отдельно от omission.
_(Q1/Q3 — платные на S2; стартуют после wire-чеков §1.13-C и трап-майнинга.)_
## §4 — Дерево решений §D5 применённое
_(после результатов.)_
## §5 — Деньги
Спент этой сессии: **$0.00043 / $15** (только wire-чек: grok $0.00031 + mistral $0.00004 + glm-5 $0.00008
`exp15/wirecheck.json`). Q2b $0 (реюз sizecurve). **Остаток $14.99957.** Прогноз полного пакета $13.13 /
несущего $8.64 (`exp15/budget_calc.py`). Пер-call predicted-cost гейт + пер-Q стоп-гейт в run-скриптах платной сессии.
## §6 — Самопроверка + отклонения от пре-рега
Ревью ИСПОЛНЕНИЕМ в каждом скрипте: gender idempotency-реран (applied=0, hash-стабилен) + byte-diff; hand-proofread
omission-валидация ch13-whole; wire-гейт асерты (reasoning_tokens>0 и т.д.). Отклонения от §D — §1.12 (зафиксированы
ДО прогона). **Полигон-само-ловля (D32.4-класс):** первичная Q2b verdict-логика ложно показала «discriminating» —
`omission_rate_span` смешивал cross-chapter baseline (17 всегда 2 флага) с size-вариацией; поймано и исправлено на
within-chapter size-span ДО записи вывода. «0 ошибок ≠ 0 ошибок» соблюдён: raw-флаги НЕ приняты за omission без term-drift-дизамбигуации.
---
## ХЕНДОФФ — платная сессия Q1/Q3 (полигон, 2026-07-17)
> Старт свежей сессии: `docs/POLYGON_SEGMENTATION_EMPIRICS_SESSION_PROMPT.md` + этот §1 фриз + этот хендофф.
> **ПРЕ-РЕГ ПЕРЕ-СОЧИНЯТЬ ЗАПРЕЩЕНО** — любое изменение армов/метрик/порогов/дерева = НОВЫЙ experiment-ID.
> Бэкенд-дерево ЗАМОРОЖЕНО оркестратором до конца платных армов (якорь A0 стабилен). Пол `人祖`=male, `古月`=n-a — подписаны.
**(а) Позиция в порядке §D2.** СДЕЛАНО: пре-рег фриз (коммит) → wire-гейт → **Q2b** (потолок инструмента; size↔omission → span-судьи).
СЛЕДУЮЩЕЕ: **Q1 + Q3 (несущие) на S2** → затем Q2a/Q2c → Q4 → Q0. Двойной якорь A0↔A0 на S2 (floor шума) — ДО интерпретации любого Q.
**(б) Пины и артефакты.**
- Фриз-коммит **`b9272a1`**. Бэкенд HEAD `68032f7` (≥ d3f6b34). Сид `guzhenren-seed-v2.yaml` sha256 **`175a67ad2f05caeaec8fc5b8c8d304334e8dc73eebd3caf5fc3b4b8be0c408f4`**. Промпты: translator `35d3ad6e…`, editor `878b0da3…`.
- Спент **$0.00043 / $15**; остаток $14.99957.
- Скрипты (ВНЕ git, зона `eval/exp15/`, лендит оркестратор): `preflight_models.py`, `gender_transport.py`, `structural_profile.py`, `build_s2prime.py`, `budget_calc.py`, `fertility_calib.py`, `reflow_omission.py`, `wirecheck.py`.
- Артефакты (ВНЕ git, `/home/ubuntu/books/gu-zhenren/exp15/`): `freeze_facts.json` (цены/кэш/риски), `preflight_models.json`, `gender_signoff.yaml`, `S2prime.txt` + `S2prime_seams.json` + `S2prime_seam_labels.json`, `fertility_calib.json`, `q2b_omission.json`, `wirecheck.json`, пре-gender бэкап `guzhenren-seed-v2.pre-gender.yaml`.
- Реюз $0: `exp14/sizecurve/*` (Q2b done), `exp14/material.json→trap_chunks` (9), `exp14/arms/A-ref-prev|both` (Q3), `rerun/records.json` (ch13/17 source БАЙТ-идентичен sizecurve — `chapter_source`).
**(в) Мягкие находки / гочи (несущие — не потерять).**
1. **Инъекция A0 — ТОЛЬКО из реального `tmctl translate`** (нет $0-пути; порт `exp14b_reseed_promote.py` ПОВЕДЕНЧЕСКИ УСТАРЕЛ — до-trust-gate longest-match, разойдётся на draft-nests-over-approved). Читать `retrieval_state.injected_ids` из SQLite; при расхождении верить Go.
2. **Механизм-армы = eval-риги** (бэкенд не умеет logical/carryover/lookahead/diff/wide-read). Q1 logical-граница = Python-порт §B1.5-DP; carryover/lookahead — §B3. A0/A0 — единственные из реального бэкенда.
3. **A0 draft deepseek `reasoning:"off"` в pipeline-c1.yaml = NO-OP** (echoMineViolation принуждает thinking-ON) → reproduce thinking-ON.
4. **Q1 size-match: фертильность 1.20·cjk+0.39·other** (`fertility_calib.json`, R²=0.96, glm-4.6-токены; placeholder 0.75/0.25 занижал ~60%). Бюджет Q1 ~34k ток; greedy vs logical — ОДИН бюджет, различие только в выравнивании разрезов на швы.
5. **S2 soft-швы 1 и 7** (scene-shift, LOW confidence: шов1 = топик-переход к экспозиции, шов7 = смена локации по анонсу) — взвесить осторожно, при желании пере-читать. Negative (continuation): 4,5,10,11. Scene-shift: 1,2,3,6,7,8,9.
6. **Трап-квота:** если T-tense/T-ana ≥20 straddling scene-shift-швов недоберётся на 7 швах → расширить N节 (`build_s2prime.py N`, N>12) + пере-классифицировать новые швы ДО платных вызовов. Майнер `kimi-k2.6` (семейно чист), исключён из судей.
7. **DeepSeek peak-surge:** платные DeepSeek-армы ВНЕ 0104 & 0610 UTC (Beijing ×2, `freeze_facts.json`), либо ×2 бюджет; ре-чек цен у 24.07-катовера.
8. **Судьи подтверждены живьём:** grok-4.3 reasoning-ON (262 rt), mistral-large-latest резолвится, glm-5 PAYG доступен. Gemini как 3-й судья — эмпир-верификация thoughts-accounting ДО опоры на его usage.
9. **`reflow_omission.py` реюзабелен** для детерм. вторички (entity-omission), НО ПОТОЛОК (сущности выживают) — первичка Q1/Q3 = trap-точность span-судей; term-substitution (класс/разряд) = glossary-drift-ось, не omission.
10. **Метрика границы Q1 (вторичка):** доля разрезов на scene-shift-швы (выше=лучше) vs continuation-швы (ниже=лучше); первичка — T-tense+T-ana точность (общий знаменатель в A0).