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

260 lines
32 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 первый, $0.)_
## §4 — Дерево решений §D5 применённое
_(после результатов.)_
## §5 — Деньги
_(usage/cost per скрипт, persisted; cost-of-pass; ретраи+кэш раздельно.)_
## §6 — Самопроверка + отклонения от пре-рега
_(ревью исполнением; §1.12 отклонения, зафиксированные ДО прогона.)_