← Интерфейсы и исследования

Что менять в конвейере: выводы исследований 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).

Как строить, по их же находкам:

Ставить между episodes и verify. Это не заменяет наш verify (он про буквальность цитат), а закрывает то, что verify структурно не видит.

A2. Достроить состояние мира двумя полями

Почему: наш character-personas.json — 5,4 КБ (~1400 токенов) на книгу при рекомендуемом объёме писательской библии 1 500–4 000 слов. Запас есть, не хватает двух вещей, обе с измеренным эффектом:

  1. 1. Интервалы валидности фактов — би-темпоральность как в Zep/Graphiti: «Билли Бонс жив до L1420», противоречащий факт не удаляется, а помечается моментом устаревания. Это то, что даёт графу состояния 0,709 против 0,291 у векторного RAG.
  2. 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. Подтверждено исследованием, уже было в плане

C. Решено не делать

D. Порядок

Дешёвое и не блокирующее ничего — сначала: A5 (кэш, часы работы), A2 (два поля в JSON, полдня). Затем A3 (триплеты крючков — правка схемы storygraph, которая и так пишется). Затем A1 (стадия-критик, день-два). A4 — самое дорогое, затрагивает визуальный контур; делать вместе с первым сезоном, где персонаж меняет облик.


Реализовано 15.08.2026

Все пять пунктов раздела A внедрены в ~/src/tikbook. Что именно изменилось:

ЧтоГдеСтатус
A1 Стадия-критик constorystages/constory.py, prompts/constory.md, ORDER после episodesработает на живой книге
A2 Состояние мира: state_changes + learnsprompts/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 — сохранённый отчёт был устаревшим, сгенерированным до появления проверки речевого бюджета. Моя правка ни при чём.

Что осталось

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) — у нас первичен текст книги, а не речь.