review_card.json рядом с проектом. Скрипты падают с текстом, если ключа нет, а не подставляют значение прошлого фильма: молчаливый фолбэк однажды уже привёз карту чужого месторождения в чужое ТЗ. Канон канала — в YTs/{CH}/review_profile.json: стиль графики, классы ТЗ, чувствительные темы. Приоритет простой: профиль задаёт канал, карточка перебивает профиль, окружение перебивает карточку.00_Setup/05_Review/review_card.json, на которой не ругается проверка. Дальше по флоу — с этой карточкой запускается машина стадий (6.2), и из неё же берут константы все поверхности (6.3). Общий смысл этапа — 6.5.Карточка лежит рядом с фильмом, а не в репозитории: код общий для всех каналов, состояние — своё у каждого проекта.
Карточка ищется по цепочке: сначала прямое указание пути, затем корень проекта, затем поиск вверх от текущей папки. Любой ключ можно перебить переменной окружения — имя строится из префикса YTAI_ и ключа заглавными: YTAI_CUT_VERSION, YTAI_LANG. Это для разовых прогонов, а не для постоянной настройки.
Откуда карточка берётся. Первый раз её заводит review.py init --project <путь или КОД> --channel <КАНАЛ> [--mode cut_review] [--cut <адрес ката>] — из шаблона стадии; если у проекта остался старый prep_config.json, его переносит --from-prep-config. Дальше карточка правится руками.
Без ключей ниже ругается review.py card check. ⚠️ Но это не гейт: проверка ничего не блокирует, цепочку можно запустить и с неполной карточкой — она упадёт позже и в менее понятном месте. Поэтому card check гоняют руками перед первым запуском и после каждой ручной правки карточки.
| Ключ | Что задаёт |
|---|---|
schema | версия формата карточки — читатели принимают текущую и предыдущую |
project | короткий идентификатор в нижнем регистре; по нему называется папка кеша и замок прогона |
code | код проекта заглавными — префикс всех выходных файлов |
channel | код канала: по нему находится профиль YTs/{CH}/review_profile.json |
mode | cut_review или montage_tz |
cut_version | версия ката — имя подпапки рабочих файлов; разделяет круги между собой |
src | кат на диске. ⚠️ card check его отсутствие не ругает — он обязателен по смыслу, а не по проверке: если задан, файл должен существовать |
words | пословный транскрипт ката |
duration_sec | длительность: от неё считается ожидаемое число кадров |
chapters, ch_name | границы и названия глав — на них держится вся структура поверхностей |
film | одна строка: что за фильм, кто ведёт, какой канал. Уходит в промпт судьи как контекст |
| Ключ | Что задаёт |
|---|---|
cut_drive | адрес ката на Drive — откуда Memex качает его сам, не дожидаясь ноутбука |
render | лёгкая копия ката для панели Premiere, если основной файл слишком тяжёлый |
fps | сетка таймкодов — по ней считаются тайминги глав, длительности стиллов и позиции на секвенции. Частоты NTSC хранятся числом, но считаются точной дробью: 29,97 — это 30000/1001, иначе к концу часового фильма накапливается сдвиг в кадры |
frames_tolerance | допуск на число нарезанных кадров: видео редко даёт ровно секунду в секунду |
lang | язык поверхностей монтажёра — на каком языке он читает ТЗ. Карточка перебивает профиль канала |
language | язык озвучки — для расшифровки речи. Это другой ключ и другой смысл: фильм может быть снят на одном языке, а монтажёр читать на другом. Автоопределение не передаётся никогда — оно ошибается на музыке и паузах |
exclusions | интервалы с заведомыми не-ошибками и причиной: кандидаты внутри отбрасываются, экраны не пакуются в облако, находки не становятся ТЗ. Так «ошибка», о которой уже договорились, не всплывает каждый круг |
align_against | транскрипты прошлых версий или плана — по ним кат выравнивается с предыдущим кругом |
chapters_plan | план частей: если он есть, главы ката можно предложить автоматически, а не расставлять руками |
canon_words | слова именно этого фильма, которые не опечатка: имена, топонимы, термины |
lang — про то, что читает человек; language — про то, что слышит модель.Это самая длинная часть карточки и единственное место, где структура выпуска описана целиком. Из неё растут заставки глав, название фильма, плашки спикеров, панель подглав, прогресс перечислений, титры подтем, крупные фразы, собственные страницы фильма, вкладка «Главы», карта выпуска в XMind и маркеры секвенции.
| Ключ | Что задаёт |
|---|---|
chapters | границы: пары «секунда — номер главы» |
ch_name | названия глав |
ch_img | кадр-карточка главы для вкладки «Главы» |
ch_no_final | нумерация выпуска. Не совпадает с номером главы: содержательные главы нумеруются подряд, а хук и финал номера не получают и стоят с прочерком |
ch_notes, ch_state | что с заставкой этой главы в кате: заметка и пара «что сейчас → как надо» — две колонки строки во вкладке «Главы» |
ch_extra | места, похожие на заставку главы, но главой не являющиеся: полноэкранный ключевик хука, опоздавшая карточка |
new_ch | главы, которых в кате ещё нет |
ch_plate_variant | дизайн заставки — одна буква: a полотно (по умолчанию) · b шторка · c нижняя треть |
ch_demo_secs, ch_accent | секунды без экранного текста под демонстрацию вариантов и цвета глав |
sub — плоский список троек «секунда, номер главы, подпись». Не словарь по главам: подглавы идут сквозным потоком по фильму, и так их проще и расставлять, и сдвигать. Словарь по главам код не примет вовсе — рендер падает на распаковке. На втором круге список заполняет сама стадия sub (stages/sub_from_prev.py): переносит подглавы прошлого ТЗ на ось нового ката — проекцией, досадкой по словам подписи и снапом на паузу.
// review_card.json — YTUVI01, кат v2: 62 подглавы сквозным списком "sub": [ [ 16, 1, "Цветные камни держат цену" ], [ 44, 1, "Не такой уж обычный рубин" ], [ 71, 1, "Один состав — три цены" ] ], "sub_img": { "01": "sub_card_01.jpg", "02": "sub_card_02.jpg" }, "sub_no_screen": [ 4, 9, 17 ], // порядковые номера в sub (с 1), НЕ секунды; числа для примера "ch_no_final": { "01": "—", "02": "01", "10": "—" }
sub_img — кадр подглавы, ключ равен её порядковому номеру в списке. sub_no_screen — порядковые номера подглав в sub (счёт с 1), титра которых в кате нет. ⚠️ Это не секунды: код сравнивает их с номером подглавы, а не со временем, и записанные секундами они молча не совпадут ни с одной строкой. Подглава без титра — не ошибка кадрирования, а пропущенный монтажёром экран: во вкладке «Главы» она помечается «⚠️ титра подтемы в кате нет», в карте XMind — «➕ СОЗДАТЬ». На втором круге список берётся из сверки с прошлым ТЗ автоматически, той же стадией sub.
Два вида экрана, которые ставятся не по главам, а по месту: название фильма встаёт один раз сразу после хука, плашка спикера — там, где человек впервые появляется. Рисует их stages/bdd_plates.py titles — пока это рендер YTCH на языке брендбука фонда, — показывает вкладка «Главы» в режиме заставок (6.3).
| Ключ | Что задаёт |
|---|---|
film_title | название фильма. Нет ключа (и не передано --film) — название не рисуется, и сборка печатает это отказом |
film_title_variant | подача одной буквой: a полотно — кадр в затемнение, название по центру · b столбик — в три строки у левого поля · c по низу — во всю ширину нижней трети. Пусто — рисуются все три на выбор; задана — только она |
film_title_chapter | глава, чья заставка и есть название фильма — вместо заставки «тизер». Тогда эта строка во вкладке рисуется выбранной подачей названия, а отдельный блок «выбрать вариант названия» в шапку не выводится |
film_title_caption | подпись под названием на такой заставке, например «фильм» |
name_plates | плашки спикеров — список объектов: sec секунда, name, role, kind вид плашки (по умолчанию нижняя треть q_lower_a), now и do — что сейчас и как надо. Во вкладке это строка «👤 имя» под своей главой: плашка спикера — не подглава, а подпись человека. Кадр-подложка берётся через несколько секунд после секунды плашки — подпись в кате в этот момент ещё стоит |
// review_card.json — YTCH12, кат v5 "film_title": "ОДНА С РЕБЁНКОМ", "film_title_variant": "a", "film_title_chapter": "01", "film_title_caption": "фильм", "name_plates": [ { "sec": 676, "name": "ЖИМАГУЛ ПАНФИЛОВА", "role": "куратор по семьям · фонд «Бюро Добрых Дел»", "kind": "q_lower_e", "now": "Подпись в кате стоит на 11:16…", "do": "▶ Перерисовать плашкой спикера фонда…" } ]
Когда в главе идёт список («три способа», «шесть видов обработки»), на экране живёт накопительный прогресс «N из M». Его задают: prog — заголовок и пункты; prog_t — секунды, в которые перечисление продвигается на следующий пункт; prog_final — что показать, когда отмечены все; prog_note — пометка к отдельному пункту; prog_variant — тема панели одной буквой: z тёмная (принята) · h светлая (осталась для сравнения); неизвестная буква останавливает рендер; prog_demo_sec — кадр под демонстрацию.
Два ключа, из которых растут ещё два вида экрана — и их легко не заметить, потому что нужны они не всегда.
| Ключ | Что задаёт |
|---|---|
claims | крупная фраза во весь кадр: секунда, первая строка, вторая строка. Одна мысль, дословно из речи ката. Заполняется руками, но кандидатов предлагает стадия claims — из якорей глав и тезисов актов, не больше одной на главу |
pages | собственная страница фильма: секунда, заголовок, строки и место под портрет или предмет. Приём самого фильма, а не наша плашка — поэтому и выглядит как страница, а не как интерфейс |
| Ключ | Что задаёт |
|---|---|
doc_id, tab_title | док сценария и имя вкладки ТЗ в нём |
nav_tab | имя вкладки-навигатора. Пусто — вкладка не собирается: это способ отказаться от неё, а не забытый ключ |
frozen_tabs | вкладки, которые нельзя перезаписывать ни при каких условиях |
materials_id, project_folder_id, sprint_folder_id | папки Drive: материалы круга, проект, спринт |
sheet_url, notes_sheet_id | лист ТЗ и лист заметок |
shots_remote | публичная папка кадров: из неё картинки подтягиваются в лист формулой |
private_frames_folder_id, images_mode | для фильма, где в кадре человек, которого нельзя показывать по ссылке: закрытая папка кадров и режим temp_grant — кадры встают во вкладки через временный доступ, только при ручном запуске с Мака |
doc_id, вы получите отчёт без единого красного флага и ни одной строки ТЗ у монтажёра. Проверять глазами: после круга смотреть review.py status — у пропущенных стадий стоит именно эта пометка.Отдельно — ключи, которые пишет не человек, а код, и руками их дописывать не нужно:
v2 — вставки слоя футажей. Перезаписывается целиком при каждом применении подбора визуала: ручная дописка исчезнет.drop_segments и disabled_ranges — что Роман снял и что выключил прямо на ревью-секвенции; читается из автосохранения проекта Premiere и означает «вырезать».footage_routing — каталог своих съёмок, из которого берутся собственные клипы вместо стока.Часть ключей существует только ради того, чтобы машина могла проверить саму себя.
ocr_anchors, llm_anchors — две-три фразы, которые в этом кате точно есть на экране. Если чтение экранов их не находит — что-то сломалось на нарезке или распознавании. Пустые якоря означают, что проверка просто пропущена, а не что она прошла.verify_tz — проверки по содержанию ТЗ: «такой-то пункт должен быть про такое-то».notes — грабли конкретного проекта. Печатаются в тикете для следующей сессии, чтобы их не приходилось вспоминать.sources — авторитеты факт-чека именно этого фильма, сверх канальных.film_subject — тема одним словом, для промптов.Проверка карточки смотрит: на месте ли обязательные ключи и верна ли версия схемы; существуют ли файлы, на которые она ссылается; не пусты ли внешние id; есть ли профиль канала; заданы ли якоря селфчека. Отдельно, мягкими предупреждениями, — разумная ли частота кадров, знакомый ли язык поверхностей и не сломаны ли интервалы исключений.
Профиль отвечает на вопрос «как принято на этом канале» и меняется куда реже карточки.
| Ключ | Что задаёт |
|---|---|
style, ch_marker_colors | цвета и шрифты графики, цвета маркеров глав |
rules_text | канон канала прозой: валюта, язык титров, как называются места. Этот текст уходит в промпт судьи |
tz_classes | какие классы находок становятся ТЗ, а какие отбрасываются |
sources_default, fact_check | авторитеты факт-чека и предел числа проверяемых утверждений |
latin_whitelist, lexicon | латиница и слова канала, которые не считаются опечаткой и чужим языком |
terms_base_file | общий каталог терминов и мест канала — поверх него ложится review_terms.json фильма |
doc, drive | шаблоны имён вкладок и имя папки материалов |
mode_default, notes_cycle | режим по умолчанию и нужен ли цикл заметок — см. врезку ниже |
notes_cycle, адрес листа — notes_sheet_id в карточке.Расширения — не у всех каналов:
lang, currency, ocr_langs — для англоязычного канала. lang: en меняет не только подписи: номера правок печатаются FIX-NN вместо ТЗ-NN, метки блоков идут по-английски (▶ DO, ❌ NOW), доводка строк локальной моделью пропускается. Рядом — канон записи сумм и языки распознавания экранов.sensitivity — чувствительные темы: помечать предупреждением и отправлять на подтверждение, но не вырезать самостоятельно.structure_rules, verdict — проверки структуры фильма и редакторский вердикт одним агентом.probe — собственный логотип канала, чтобы зонд не считал его чужим следом.kb — база знаний канала для подбора визуала: корни архивов, что исключать, сколько картинок на эпизод.terms_base_file.status.sub_no_screen и sub_img — порядковые номера, а не секунды. Вставишь подглаву в середину sub — съедут оба списка разом. Поэтому предложения новых экранов в sub не вливаются: они живут в work/{кат}/screens_proposal.json и доезжают до вкладки «Главы» и карты XMind оттуда.v2 руками не дописывать — ключ перезаписывается целиком при следующем применении подбора визуала.