Что менять в конвейере: выводы исследований 13–15 августа 2026
Сводка изменений, вытекающих из четырёх разборов: vector-db-for-pipeline.md (измерения по консистентности), dramabox-ai-roles.md (архитектура конкурента дословно), pipeline-challenge.md (постадийный аудит наукой) и storygraph-tools.md.
Отсортировано по соотношению «эффект измерен / стоит дёшево». Пункты, которые уже были в плане, помечены — их research подтвердил, а не открыл.
A. Делать сейчас
A1. Проход-критик на консистентность — новая стадия constory
Почему: самая высокая измеренная отдача во всём исследовании. Автокритик находит 550 ошибок из 1000, эксперты-люди — 171; F1 0,678 против 0,281 (ConStory-Bench, ACL Findings 2026).
Как строить, по их же находкам:
- - наводить на позицию 40–60% эпизода — там измеренная кластеризация ошибок;
- - целить в фактические и хронологические противоречия (доминируют), стиль выносить отдельным проходом — стилевые ошибки статистически не коррелируют с фактическими;
- - дешёвый наводчик — повышенная энтропия текста (+12–19%) в местах ошибок;
- - учитывать, что ошибки накапливаются линейно с длиной, то есть 10-й эпизод требует больше внимания, чем 1-й.
Ставить между episodes и verify. Это не заменяет наш verify (он про буквальность цитат), а закрывает то, что verify структурно не видит.
A2. Достроить состояние мира двумя полями
Почему: наш character-personas.json — 5,4 КБ (~1400 токенов) на книгу при рекомендуемом объёме писательской библии 1 500–4 000 слов. Запас есть, не хватает двух вещей, обе с измеренным эффектом:
- 1. Интервалы валидности фактов — би-темпоральность как в Zep/Graphiti: «Билли Бонс жив до L1420», противоречащий факт не удаляется, а помечается моментом устаревания. Это то, что даёт графу состояния 0,709 против 0,291 у векторного RAG.
- 2. Visibility-теги «кто что знает в какой момент» — +34,6 п.п. в ReverieMem. Для «Острова сокровищ» это критично: Джим знает о заговоре, а команда не знает, что он знает.
Объём работы — десятки записей в JSON на книгу, никакой инфраструктуры.
A3. Кодифицировать крючки триплетами
Почему: модели оставляют «ружьё Чехова» невыстрелившим даже когда нужный контекст есть в окне (Codified Foreshadowing-Payoff). Надежда «модель сама вспомнит» не работает.
Хранить foreshadow → trigger → payoff как явные триплеты в артефакте storygraph и проверять на этапе verify: каждый посеянный крючок обязан иметь выстрел внутри сезона либо явную пометку «переносится в следующий».
Это же прямой ответ на то, что DramaBox решает через RAG — у нас решается структурно и проверяемо.
A4. Единица идентичности — не персонаж, а пара «персонаж + состояние внешности»
Почему: EntityBench, 140 реальных сериалов, 2 491 шот: 62% шотов — «тест на память», максимальный разрыв между появлениями 33,5 шота. Пайплайн с одной канонической картинкой на героя не выразит «в 12-й серии она надевает куртку охраны».
Менять схему артефактов: у персонажа появляется список состояний внешности с версией и полем «причина изменения». Затрагивает art/artmap/portraits и video.
A5. Кэш книги вместо повторного чтения
Почему: книга статична, из неё пишется десять эпизодов. Без кэша «Три мушкетёра» стоят 3,1 млн входных токенов на сезон, с кэшем — 620 тысяч. Впятеро дешевле, ноль ошибок отбора.
Порог: эффективная ёмкость 1M-контекста 60–70% номинала. До ~600–700 тыс. токенов книга подаётся целиком; выше — двухпроходность через storygraph (она и так в плане).
B. Подтверждено исследованием, уже было в плане
- -
storygraphкак отдельная стадия (чертёж R², ICLR 2025) — подтверждена дважды: это и решение проблемы длинных книг, и правильный механизм отбора фрагментов по loc вместо семантического поиска. - - Подмешивать в письмо исходный текст по loc, а не свой пересказ — рекурсивное слияние пересказов множит галлюцинации.
- - Медиана трёх прогонов у судей — дисперсия подтверждена эмпирически.
- - Судить другой моделью, чем пишем — self-preference bias задокументирован.
- - Гейт с книжным критиком — получил научное обоснование: Narrative Flattening показывает, что post-training сжимает тематическую и стилистическую вариативность, и это не лечится ни библией персонажей, ни RAG — только внешним отбором и человеческим решением. Слоп — свойство модели, а не промпта.
C. Решено не делать
- - Векторная БД любого вида. Milvus и Pinecone переразмерены на три порядка (наш каталог — 8–16 тыс. векторов, порог окупаемости 1–10 млн). Chroma небезопасен в многопроцессном режиме. Когда семантический поиск понадобится — numpy-перебор (2,7 мс на 8 тыс. векторов), затем sqlite-vec, затем pgvector, если Postgres появится по другим причинам.
- - RAG для консистентности персонажей. Измеримо хуже структурированного состояния: 0,291 против 0,709. Писательские инструменты (Novelcrafter) эмбеддинги для этой задачи не используют вообще.
- - RAG для письма сценария. Отбор по loc из графа строго сильнее: он отвечает на вопрос «что происходит в этой точке причинной цепи», а не «что похоже на то, что я пишу», и проверяется grep-ом.
- - LanceDB — вернуться, если дойдём до обучения LoRA персонажей на своих кадрах; сейчас эпизоды это файлы, а не датасет.
D. Порядок
Дешёвое и не блокирующее ничего — сначала: A5 (кэш, часы работы), A2 (два поля в JSON, полдня). Затем A3 (триплеты крючков — правка схемы storygraph, которая и так пишется). Затем A1 (стадия-критик, день-два). A4 — самое дорогое, затрагивает визуальный контур; делать вместе с первым сезоном, где персонаж меняет облик.
Реализовано 15.08.2026
Все пять пунктов раздела A внедрены в ~/src/tikbook. Что именно изменилось:
| Что | Где | Статус |
|---|---|---|
A1 Стадия-критик constory | stages/constory.py, prompts/constory.md, ORDER после episodes | работает на живой книге |
A2 Состояние мира: state_changes + learns | prompts/storygraph.md, отчёт в stages/storygraph.py | появится при следующем прогоне графа |
| A3 Крючки-триплеты + детерминированные ворота | prompts/storygraph.md (секция Foreshadowing), гейт _foreshadow_gate в stages/verify.py | ворота работают, покрыты юнит-тестом |
| A4 Пара «персонаж × состояние внешности» | prompts/characters.md (поле appearances), prompts/artmap.md + stages/artmap.py (блок states) | появится при следующем прогоне |
| A5 Кэш книги | — | уже было решено в архитектуре, см. ниже |
A5 оказался не нужен: конвейер и так не читает книгу в контекст
Проверил перед тем, как что-то менять. LLM-стадии запускают headless Claude CLI с инструментами Read/Grep в каталоге книги — промпты весят 1,4–6,4 КБ, а книга (380 КБ) в них не подставляется вообще: модель читает нужные куски сама. Стадия dramatize — единственная, кто инлайнит текст, и она инлайнит окно вокруг loc сегмента (от −45 до +15 строк), а не книгу целиком.
То есть «отбор по loc вместо семантического поиска», который я рекомендовал, в конвейере уже реализован. Изменений не потребовалось.
Проверка A1 на «Острове сокровищ»
Первый же прогон критика нашёл три фактических противоречия, все подтверждаются книгой. Главное (severity 3):
beat-лист сезона: «Джим и доктор Ливси убегают от охотников с картой».
Книга, L672–674: «доктора внезапно вызвали к больному за много миль, и после смерти моего отца он у дома не бывал».
Собственный синопсис эпизода 3: «Джим и его мать... Джим убегает».
Beat-лист противоречит и книге, и своему же синопсису. Цитату проверил вручную по text.txt — критик не выдумал её. Два других замечания того же рода: «недостроенный частокол», которого в книге нет (он описан готовым), и неверная причина сделки с Сильвером в девятом эпизоде.
Это ровно тот класс ошибок, который verify структурно не видит: он проверяет буквальность цитат, а здесь неверны состояния и присутствие персонажей — то, что FABLES называет главной болезнью книжных пересказов.
Проверка A3
Гейт крючков покрыт юнит-тестом на синтетике (римские главы, диапазоны VII–IX, четыре сценария: выстрел в сезоне / выстрел вне сезона / нет выстрела в книге / слабый крючок). Обратная совместимость проверена на обеих книгах: граф старой версии без поля foreshadowing даёт ноль находок и не ломает ворота.
Оговорка про регрессию, которой не было
При прогоне verify на eighty-days счётчик ошибок вырос с 39 до 124. Проверил, откатив свой код: старая версия даёт те же 124 — сохранённый отчёт был устаревшим, сгенерированным до появления проверки речевого бюджета. Моя правка ни при чём.
Что осталось
- - Новые поля (
state_changes,learns,foreshadowing,appearances) появятся в артефактах при следующем прогонеstorygraphиcharacters— старые артефакты их не содержат, и это нормально: гейты написаны так, чтобы не падать на старых данных. - - Стадию
constoryимеет смысл добавить вshowrunner(автопрогон конвейера) послеepisodes— сделаю отдельно, чтобы не смешивать с этой правкой.
Kill-критерии и метрики не меняются: Attention Span Score остаётся северной звездой, гейт критика — обязательным.
Дополнение 16.08: что взято из разбора AI-видеоредакторов
По итогам ai-video-editors.md (12 продуктов) реализовано в конвейере и редакторе на dev.dinershtein.com. Каждый пункт — украденный у индустрии приём, доведённый до места, куда его владелец не донёс.
Конвейер (tools/generate.py)
@-сущности в промптах — стандарт, к которому независимо пришли семь продуктов (LTX, Flow, Runway, Higgsfield, Morphic, Kapwing, CapCut). @jim-hawkins в keyframe_prompt разворачивается в момент генерации в имя + канонический visual из personas.json. В episodes.json остаётся @slug, поэтому правка облика персонажа доезжает до всех сцен при следующей пересборке. Провенанс хранит сырой промпт и развёрнутый отдельно.
Локи сцен (Runway scene locking, prompt locking из Neural Frames): "locked": true у сцены — конвейер её не пересобирает, патч из редактора полей не меняет. Нужно для сцен, под которые уже сгенерировано аудио.
video --stale — пересборка только протухших сцен: тех, чей текущий промпт или движение расходятся с провенансом. Сцены без провенанса (отрендеренные до его появления) не пересобираются вслепую — неизвестно ≠ протухло. Провенанс теперь пишет промпт целиком: обрезка до 200 символов ломала детектор протухания на длинных промптах.
tools/apply_patch.py — замыкает цикл: правка в редакторе → «Скачать патч» → apply_patch → video --stale. Уважает локи, --force снимает защиту.
Редактор (tools/editor.py)
Пустые карточки — ниша, которую не занял никто из двенадцати (у Descript есть Placeholder Notes, но без генерации). Несобранная сцена — это пунктирная карточка с промптом прямо на дорожке, и редактор теперь строится для всех эпизодов со сценами: сезон размечается плейсхолдерами до того, как потрачен первый доллар.
Лоток версий промпта (Runway Edit Studio, «Reuse prompt»): все прошлые рендеры сцены из провенанса, кнопка «вернуть» перезаряжает старый промпт в поле.
Оценка стоимости до правки (Higgsfield: цена на кнопке Generate): на оранжевом поле промпта видно «≈ 13 ед. (как прошлый раз)» или среднюю по эпизоду — до того, как человек начал печатать.
@-сущности живьём: панель «итоговый промпт» разворачивает @slug так же, как генератор, подсвечивает известные синим, опечатки — красным («уйдёт в модель как текст»), и обновляется при вводе.
Машина состояний клипа (Descript, цвет = состояние): свежий / протух / не собран / собран-до-провенанса / заблокирован. Состояние «собрана до провенанса» отдельное и честное: чем сделана — неизвестно, и --stale её не тронет.
Из разбора не взято (осознанно): перегенерация в соседний артборд (Morphic) — версии у нас живут в лотке, а не в пространстве; seed (Flora) — модели fal его толком не уважают; транскрипт-как-таймлайн (Descript) — у нас первичен текст книги, а не речь.