◂ База знанийRYA.AEMontage TZ from Source — ТЗ на монтаж из исходниковобновлено 14 сен 2026
Когда ката ещё нет: монтажный лист собирается из съёмки по пословным якорям транскрипта, графика — мокапами 4K с проверкой раскладки в DOM, структуру и дизайн судят два агента на фильм. Режим montage_tz стадии 4.7.
Принцип. Лист детерминирован из слов, а не из секунд: правка на полсекунды не ломает склейку; всё, что можно проверить кодом (title-safe, переполнение, якоря), проверяется кодом.
клипы + транскриптsegment_local Qwen3-8Bmontage_plan.jsonbuild_montage → montage.jsonмокапы + DOM-QCстраница · standalone · бриф
1Когда: ката нет, есть съёмка2Входы3Пословные якоря4Контракт montage.json (ytai-montage-v1)5Мокапы 4K и DOM-QC без токенов6Структурная страница и standalone для телефона7Облако: два агента на фильм8Грабли

🎬4.8 · 1Когда: ката нет, есть съёмка

Манифесты, разговоры, интервью на 1–2 камеры, где монтажёру нужен готовый монтажный лист, а не ревью его сборки (YTEVO02 «Эволюция»: 11:53 из 23 минут исходника, 17 кусков, 20 экранов графики). Режим montage_tz той же стадии: review.py init --mode montage_tz. Общее с 4.7 — карточка, профиль, транскрипт, стейт-машина, Memex, бриф.

📥4.8 · 2Входы

  • Клипы встык съёмочного дня (card.clips: файл, начало, конец по сквозному TC) и роли (card.speakers: «Speaker 1» → «A · Дарья»).
  • Транскрипт с пословными таймкодами и диаризацией (wordrole_transcribe --plain, на Memex).
  • План montage_plan.json: целевой порядок кусков с якорями и каталог графики (тексты экранов живут в плане, не в коде).
  • Стиль экранов — из профиля канала (style.*) или из плана (презентация клиента).

🎯4.8 · 3Пословные якоря

Граница куска = (подсказка_сек, "слово"): берётся ближайшее к подсказке вхождение слова, поэтому правка на полсекунды не ломает склейку. tc_in = начало первого слова, tc_out = конец последнего + min(зазор, 0,3 с). Для каждой склейки: файл-источник и смещение внутри него, кто в кадре (по большинству слов), паузы ≥0,7 с, пересечение стыка клипов. Экраны графики получают таймкод в чистовике (on: [hint, word]).

parts: ["say", [1011.76, "потому"], [1029.0, "плечами"]] | ["gfx", "G02", 4.0] | ["hold", "текст", 2.0]
gfx:   [["G01", [1022.3, "двое"]]]

Локальная сегментация тезисов — Qwen3-8B по окнам ~3,5 мин (segment_local, ~16 с на окно): модель отдаёт номер строки + слово, код привязывает к секундам (±3 с, затем ±10 с, иначе отброс).

🧬4.8 · 4Контракт montage.json (ytai-montage-v1)

  • pieces[]: id, title, block, act, note, dst_in/dst_out, dur, dur_trimmed; parts[]: kind, src_in/src_out, dst_in/dst_out, file_in/off_in, file_out/off_out, crosses_clip, camera, speaker, words, first/last, text, gaps, trim_est; gfx[]: id, src, dst, on_word, kind, title, place.
  • gfx_catalog, gfx_used, total, total_trimmed, source_total, n_say_parts, n_gaps.
  • Golden-тест: YTEVO02 из montage_plan.json даёт файл, идентичный историческому (0 расхождений); конвертер из легаси-скрипта — build_montage.py --plan-from-legacy.

🖼4.8 · 5Мокапы 4K и DOM-QC без токенов

Экраны собираются из HTML-тел каталога (gfx_catalog[*].screens) в стиле профиля/клиента и рендерятся в 4K через chrome-headless-shell. Раскладка проверяется прямо в DOM (--dump-dom, body[data-qc]: title-safe и переполнение) — ноль токенов; варианты А/Б для спорных экранов; бейдж DRAFT из профиля. Ревью дизайна — один агент по одному контактному листу всех экранов (≤1568 px), не по 28 картинкам.

📄4.8 · 6Структурная страница и standalone для телефона

build_structure_html — лента фильма по montage.json + segments.json + мокапы: транскрипт никогда не перепечатывается руками. make_standalone — один самодостаточный HTML с data-URI превью для телефона/почты; плюс телефонный бриф (4.7 §7).

☁️4.8 · 7Облако: два агента на фильм

1
structure 1 агент

Вход — путь к segments.json (тезисы с якорями), правила формата и описание фильма; выход — порядок, что оставить/снять и почему, список графики с якорями, главы. Пишет cloud/out/structure.json сам; structure_call.py --apply сливает в план, ручные note не трогает.

out montage_plan.json обновлён
2
design_review 1 агент

Один контактный лист мокапов + список экранов → ok/problems/fix на экран; --apply-design прикрепляет замечания к экранам.

out design_review.json

Было: 11 агентов и ≈1 M токенов с непрошенной стадией сверки (YTEVO02, 11.09). Стало: ≈0,15–0,2 M.

⚖️4.8 · 8Грабли

  • Стыки Sony: полный 4-ГБ файл = есть следующий; сквозной TC съёмочного дня считается по длительностям клипов, не по creation_time.
  • Вторая камера/сцена — свой план (scenes[]), не вставка в основной лист (иначе два призыва подряд).
  • Модель не умеет надёжно писать секунды — только «строка + слово»; якоря всегда сверяются с words.json.
  • Разделитель в имени папки проекта — только подчёркивание (YTEVO02_evolution_manifesto).
Слова — якоря, код — арбитр, агенту — только структура и вкус.
◂ База знанийRYA.AEReview Timeline — 6-слойный ревью-таймлайн катаобновлено 9 сен 2026
Ревью готового ката монтажёра без правки его видео: рендер лежит на V1 нетронутым, а всё, что мы хотим сказать монтажёру, лежит слоями сверху — футажи, инфографика, плашки ТЗ, стрелки «где ошибка», структура. Один и тот же источник правды (pravki_v2.json) рождает секвенцию в Premiere, лист в Google Sheets, вкладку в сценарном доке и Drive-папку материалов с комментами. Эталонная реализация — YTUVI01 «Корунд — Рубин», Review_v6.
Принцип. Ошибка ищется машиной (кадры 1 fps → OCR → локальные VLM/LLM), подтверждается агентом с глазами и веб-факт-чеком, а показывается монтажёру прямо на кадре: стрелка в место ошибки + нарисованный правильный титр. Текст ТЗ копируется с таймлайна кнопкой панели.
рендер v1prep кадры·OCR·VLM·LLMaudit агенты по главам + скептикиpravki_v2.jsonPNG 4K + review JSONUXP → Premiere · Sheet · Doc · Drive
96 слоёв10Конвейер11Аудит экранов12Формат ТЗ13Приёмка14Графика15Поверхности16Экономия токенов17Правила и грабли18Скрипты

🧱4.8 · 96 слоёв поверх нетронутого оригинала

слойчто лежитформат
V1ОРИГИНАЛ — рендер монтажёра целикомне трогать никогда, A1 цело; звук вставок → A2/A3
V2вставленные футажи: видео и фото (клипы, сканы, гравюры)клипы по таймкодам; стиллы ≤ 4,8 с
V3ВСЯ инфографика: драфты схем/карт, плашки-определения терминов при каждом упоминании, мини-карты локаций, нарисованные исправления титровпрозрачный PNG 4K; полноэкранным остаётся только то, что заменяет кадр (карта, схема)
V4комментарии ТЗ: lower-third «ТЗ-NN · место + что сделать»полный текст + Drive-ссылки в маркере мастер-клипа и по кнопке панели Copy ТЗ @ playhead
V5ошибки на экране: эллипс-обводка + стрелка в место ошибки + плашка «ТЗ-NN · ОПЕЧАТКА / ФАКТ / ВАЛЮТА»координаты — из OCR-bbox кадра (×3840/2160), не на глаз
V6структура: плашки глав, подглавы на каждом титульном экране, прогресс перечислений «N из M»прозрачные; главы — верх-лево с градиентом, подглавы/прогресс — левый борт середина (верх кадра занят титрами ката)
Маркеры секвенции = только названия глав, разноцветные span (Green/Cyan/Orange/Magenta/Blue/Yellow по кругу). Никаких ТЗ и точек на линейке — навигация только по главам. Слои включаются/выключаются глазом: каждая категория информации на своём слое.

⚙️4.8 · 10Конвейер (всё локально, кроме суждения агентов)

1
Prep — кадры и текст экранов локально · ~75 мин на 40 мин ката

run_prep.sh (nohup + caffeinate, до 3 попыток на стадию, селфчек после каждой, TG-уведомления): ffmpeg 1 fps 1080p (hw videotoolbox) → Apple Vision OCR (vision_ocr_ru, bbox каждой строки) → группировка секунд в экраны по пересечению слов (анимация допечатки = один экран, best = самый полный кадр) → Qwen2.5-VL-7B (mlx) дословная транскрипция + описание → Qwen3-8B корректор (опечатки/валюта/англ./факты-кандидаты).

out screens_v6.json · vlm_v6.jsonl · llm_v6.json · prep_check_*.json
2
Audit — агенты по главам workflow · 13 пакетов

Пакет главы = экраны с кадрами, OCR-bbox, VLM/LLM-подсказками и озвучкой ±8 с. Аудитор обязан открыть каждый кадр (OCR путает Й/И, Щ/Ш; полукадры анимации), проверяет текст, факты (WebSearch: GIA, Lotus, SSEF, Sotheby's), формат валют, английский без перевода, экран≠озвучка, вёрстку. На каждую находку — 3 скептика с разными линзами (визуал / лингвист-факт / редактор); остаётся при ≥2 «не опровергнуто». Критик полноты добирает экраны, не отмеченные ни как ошибка, ни как чистые.

out audit_findings_v6.json (bbox, fix_text, evidence, existing_tz)
3
Apply — находки → ТЗ и размещения

s8_apply_audit.py: одна новая ТЗ на экран (несколько находок сливаются), находка под существующим ТЗ получает только стрелку (ТЗ-21b, 21c…), стрелка ставится на секунду дописанного титра, не на старт анимации. Канон Романа побеждает мнение верификатора (валюта «$34,8 МЛН», не «34 800 000 $»).

out pravki_v2.json (ТЗ-33+, source=audit_v6) · audit_v6.json
4
Render + layout + build

make_infographics_v6.py (HTML→PNG 4K через chrome-headless-shell, body{background:transparent}) → make_review_v6.py (раскладка по трекам с арбитражем наездов, сетка 25p, стиллы ≤4,8 с) → mockbuild_v6.js (прогон JSON через реальный partsBuilder на mock-ppro) → панель UXP → Review → секвенция {CODE}_5_Review_v6_tz_v{N}.

out {CODE}_review_v6.json · previews_v6/index.html (композит каждого оверлея на кадре)
5
Surfaces — лист, док, Drive

s9_materials_drive.py (файлы в Review_materials + коммент на каждом; кадры ошибок ещё и в shots для =IMAGE) → tz_sheet.py (лист «ТЗ монтажёру», самопроверка) → doc_tab_tz_v3.py + _verify.py до ALL PASS. Снятые Романом ТЗ получают status: rejected — номера сохраняются, строки исчезают везде разом.

🔍4.8 · 11Аудит экранов: что проверяем

  • ТЕКСТ опечатки, орфография, регистр химических символов (Al₂O₃:Cr, а не AL₂O₃:CR), ё/е внутри экрана, обрезка кадром.
  • ФАКТЫ каждое число/дата/имя/вес/цена — веб-поиском по авторитетным источникам, ссылка в evidence.
  • ВАЛЮТА знак перед числом и сокращение: «$30,3 МЛН»; единый формат по всему фильму.
  • ЯЗЫК английские графики/подписи без русского перевода или где английский крупнее русского.
  • ЭКРАН ≠ ОЗВУЧКА титр противоречит сказанному.
  • ВЁРСТКА титр за головой ведущей (буквы закрыты), чужие водяные знаки и UI плеера во вставках, грубые маски.
Выход по каждой ошибке: стрелка на V5 + (если можно нарисовать) правильный титр на V3 — патч в цвет кадра (сэмплинг фона и «чернил» по bbox) + верный текст + бейдж «ИСПРАВЛЕНО · ТЗ-NN · драфт». Сомнительные OCR-флаги перепроверять кадром: анимация титров даёт ложные срабатывания.

🧾4.8 · 12Формат ТЗ: блоки, а не стена текста

Роман (10.09): «сплошной текст сложен для восприятия». Каждое ТЗ печатается именованными блоками с жирными метками — глаз находит нужное за секунду:

  • ❌ СЕЙЧАС что на экране сейчас и в чём проблема (по одной строке на находку).
  • ✅ СДЕЛАТЬ действие монтажёра, без объяснений «почему».
  • 📋 СПИСОК если ТЗ покрывает много точек (термины, локации, подглавы) — ПОЛНЫЙ список с таймкодами, чтобы заказчик мог отметить, что оставляем, а что убираем.
  • 📍 ГДЕ таймкод-диапазон + якорь из озвучки.
  • 📚 ИСТОЧНИК чем подтверждено: книга/журнал со страницей и ссылкой, лабораторная статья, официальный сайт.
  • 🎬 НА ТАЙМЛАЙНЕ где смотреть в ревью-секвенции (какой слой, какой файл драфта).
  • 💬 РОМА комментарии заказчика — фиолетовым, переживают регенерацию.

v7 — «как карта структуры» (Роман, 10.09: «каждый таймкод — списком, друг под другом»). Эталон — кадр карты структуры: крупный заголовок, под ним вертикальный список «таймкод слева — пункт справа», одна строка = одна мысль:

  • Одна строка — один таймкод любое перечисление с двумя и более таймкодами разбивается на пункты «M:SS ▸ что там» под коротким заголовком; в доке таймкод пункта моноширинный серый — «▸» встаёт столбцом. Lint в s10 и verify дока: 0 строк с ≥2 таймкодами (диапазон «a–b» = один).
  • «Почему» — отдельной строкой не хвостом к действию; длинные описания (варианты замены, контекст кадра) — заголовок + пункты.
  • Списки — из данных структура (главы и подглавы), термины и локации генерятся из тех же данных, что и графика (SUB, terms_v6.json), — список в доке всегда совпадает с картинкой.
  • Суммы цифрами «$30,3 МЛН (= $30 300 000)» — чтобы был виден размер числа; на драфте два варианта оформления (А — крупно все цифры, Б — «$X,X МЛН» и мелко цифрами), на таймлайне оба подряд — заказчик выбирает.
  • Опечатки: было → стало отдельная строка «было «…» → стало «…»», изменённые знаки красным (стало — жирным на розовом, было — зачёркнуто; вставленные пробел и запятая видны по фону). На драфте исправления — изменённые буквы другим цветом с подчёркиванием. Диф — typo_diff.py (difflib по символам, числа целиком).
  • Сомнительная «опечатка» если буква могла быть закрыта головой ведущей (титр за головой — приём канала), ТЗ формулируется как проверка исходника титра, а не как исправление.

v7.1 — что добавила приёмка (глазами по всем страницам вкладки; правила лежат в v7_tools/listify_rules_v2.md и их проверяет guard_v7b.py):

  • Таймкод — в начале строки не внутри фразы: «добавить плашку на 3:08–3:11» → «3:08–3:11 ▸ добавить плашку». В скобках внутри фразы таймкод допустим только в строке-сводке.
  • Ни одного перечисления в строку через «→», «/», «|», «;», «vs»: шаги процесса — пунктами по порядку, варианты — «А ▸ …», «Б ▸ …». Исключение — дословная цитата экранного титра.
  • Без внутреннего жаргона имена кадров (h0555, s078, f0061), «нота 049», «коммент 050», «ночной разбор», «ревью №1» — заменяются таймкодами; секунды («166.0–168.6 с») переводятся в таймкоды.
  • Без обрывков «линия уходит…», «так пишут только про…» — мысль восстанавливается из полной находки аудита или переформулируется.
  • У каждого ТЗ есть ✅ СДЕЛАТЬ — конкретное действие; если находка его не содержала, оно формулируется из неё, без новых фактов.
  • Комментарий заказчика главнее старого текста ТЗ: если 💬 просит иначе — переписывается ✅ СДЕЛАТЬ, а не остаются две разные инструкции.
  • Вопрос заказчику — это ❓ «Роман: отметь, что оставляем» не живёт внутри ТЗ монтажёру: такие строки уходят в decision и печатаются отдельным блоком.
  • Длительности словами «6 мин 11 с», а не «6:11» — иначе читается как таймкод.
  • Шапка вкладки — тоже списками «как читать», слои, ссылки и снятые ТЗ — по строке на пункт; никаких «{N}» в имени секвенции.
  • Подпись под каждой картинкой «таймкод · что видно» — не только под превью, но и под фото, рефами, непрозрачными драфтами.
Источник истины — структура parts в pravki, а не готовый текст: элемент блока — строка или {"h": заголовок, "items": [пункты]}; ручные уточнения живут в tz_overrides.json и накладываются поверх при каждой сборке. Каждая картинка-материал несёт строку «📚 источник: …» — какая книга/статья, страница и ссылка на сам источник в архиве.

4.8 · 13Приёмка: свою же работу смотрят глазами

Сборка «ALL PASS» по коду ещё не значит, что документ читается. Поэтому последний шаг цикла — приёмка постранично, как её увидит монтажёр:

  • Вкладка → PDF → PNG v7_tools/export_tab_pdf.py (экспорт именно вкладки: /export?format=pdf&tab=t.…, дальше pdftoppm ~110 dpi).
  • Агенты по страницам wf_final_doc_qa_v7.js: батч ≈8 страниц на агента, у каждого — критерии заказчика и просьба не додумывать («мелко — так и напиши»). На 64 страницах это дало 320 замечаний: 51 критичное.
  • Замечания — обратно в ТЗ wf_final_qa_fix_v7.js: переписчик + скептик на батч, каждому ТЗ приложены ЕГО замечания, полные находки аудита и 💬 заказчика; результат проходит guard_v7b.py и сливается merge_r3.py.
  • Что чинит код, а что редактор картинки, подписи, ширины колонок, порядок строк, разрывы страниц — код; смысл, формулировки, противоречия — редактор (агент или локальная модель). Агентам это говорится прямо, иначе они правят не своё.
  • Превью тоже принимаются отдельный проход по каждому превью: видно ли, о чём ТЗ; не срезан ли объект; читается ли при ширине колонки. Поправки кадра, рамки и подписи — в previews_v7.json.
Приёмка находит то, что не ловит lint: таймкод внутри фразы, устаревшие цифры («11 пунктов» против 10 глав), ссылки на снятые ТЗ, инструкцию, спорящую с комментарием заказчика. Правило: замечание либо чинится, либо становится вопросом ❓ — молча не остаётся.

🎨4.8 · 14Графика: термины, карты, структура

  • Термины каталог terms_catalog.py (regex по озвучке + определение, факты сверены), индекс упоминаний terms_index.py: плашка при каждом упоминании, cooldown 45 с на термин, 2–3 термина в окне ≤5 с — одна групповая плашка. Правый борт, середина кадра.
  • Локации мини-карта при каждом упоминании на реальной географии (Natural Earth 50m, public domain): страна подсвечена, точка месторождения, подпись по-русски; координаты сверены. Полноразмерная карта — там, где карта заменяет кадр.
  • Канон названий зритель путает страну, город и старое имя страны, если их писать по-разному. Правило: современное имя первым, старое в скобках («МЬЯНМА (БИРМА)», «ШРИ-ЛАНКА (ЦЕЙЛОН)»); пояснение «одна страна, переименована в таком-то году» — один раз, при первом упоминании; город/долина/месторождение всегда подписаны своей страной («МОГОК», второй строкой «долина в Мьянме (Бирме)»). В списке ТЗ города идут сразу за своей страной, а не по частоте — иначе три строки читаются как три разных места. В данных это одна запись PLACES (родитель, роль, старое имя, сноска), из неё выводится и плашка, и заголовок в ТЗ.
  • Имя vs термин старое имя страны в торговле («бирманский рубин», «сиамские рубины») — не география: «сиамские рубины» оказались способом подделки, и это термин, а не карта. Проверять, что регексп ловит место, а не одноимённое слово («танзанит» ≠ Танзания), и что ASR-написание совпадает с каталогом («мазамбик» против «мозамбик»).
  • Перечисление стран когда в озвучке подряд звучат 6–9 стран, мини-карты схлопываются в одну точку и дерутся за место. Вместо них — одна большая карта в три шага, страны загораются по мере перечисления; мини-карты внутри этого окна глушатся (MAP_WINDOWS).
  • Подглавы плашка «ГЛАВА NN · название ▸ подтема» на каждом титульном экране (список — из OCR-инвентаря).
  • Прогресс «N из M» для перечислений (3 способа синтеза, 6 способов обработки): обзор всего списка «ЧТО ДАЛЬШЕ» сразу после заставки главы, затем панель с подсветкой следующего пункта за ~3 с до смены подтемы — структура всегда ДО пункта.
  • Прозрачность пояснительные панели — на полупрозрачной подложке по центру (видео видно); тёмные глухие драфты — только для карт/схем, заменяющих кадр.
  • Карта структуры одним кадром: все главы с подглавами и таймкодами (стадия H) — и как приложение к доку («чтобы удобно было проверить»), и как драфт зрительской «карты выпуска» с «ВЫ ЗДЕСЬ» на каждую главу.
  • Превью для дока прозрачный 4K-оверлей в ячейке дока превращается в тёмную точку, поэтому для дока и листа каждое изображение накладывается на реальный кадр в свой таймкод и кропается на то, о чём речь (s12_doc_previews.py): оверлей — кроп по альфе; fix — «БЫЛО / СТАЛО» столбиком (цены — «БЫЛО / ВАРИАНТ А / ВАРИАНТ Б»); кадр со стрелкой — кроп вокруг ошибки; ТЗ без картинок — кадр в таймкод ТЗ. В доке превью стоит в своём абзаце на всю ширину колонки, под ним подпись «таймкод · что видно»; QA превью — агентами по батчам (пробный кроп → поправки в previews_v7.json).
Все PNG несут бейдж «DRAFT · перерисовать в стиле канала» — это макеты смысла, а не финальная графика.

🗂4.8 · 15Поверхности: один источник — четыре выхода

поверхностьчто несётгенератор
Секвенция Premiere6 слоёв, маркеры глав; текст ТЗ — маркер клипа / кнопка «Copy ТЗ @ playhead»make_review_v6.py → панель UXP (partsBuilder ≥1.11.1)
Лист «ТЗ монтажёру»№ · v1 TC · тип · название · что сделать · материалы со ссылками · 3 кадра =IMAGE · решение Романа · статусtz_sheet.py (идемпотентно, gid меняется)
Вкладка дока «ТЗ монтажёру»одна таблица: главы = строки с заливкой + [скобки]; ТЗ списками «таймкод ▸ пункт»; справа крупное превью в своём абзаце + подпись; активные ссылкиdoc_tab_tz_v3.py (build_rows() — чистая функция) + _verify.py
Drive Review_materials/кадры со стрелками, fix-драфты, вся графика; на каждом файле коммент «ТЗ · таймкод · слой»s9_materials_drive.py
Правки Романа делаются в доке: удалил строку = «не менять» → status: rejected; дописал текст в ячейку → roman_comment — печатается «💬 …» фиолетовым жирным в доке и в колонке J листа. Перед ЛЮБОЙ регенерацией — s13_doc_edits.py: текущая вкладка против build_rows() сборщика по тому же pravki → отчёт «пропали строки / дописки / правки ячеек / Drive-комменты» (запасной путь — диф экспорта ревизий Drive). Все поверхности регенерируются согласованно; номера ТЗ никогда не переиспользуются.

🪙4.8 · 16Экономия токенов: что делать локально, что агентами

  • Локально (0 токенов): кадры, OCR с bbox, VLM-транскрипция, LLM-корректор, индекс терминов/локаций, рендер PNG, раскладка, мок-сборка, лист/док/Drive. Это ~90% работы.
  • Агентам — только суждение: «это ошибка или нет» и факт-чек. Пакет главы ≤26 экранов, чтобы агент реально открыл каждый кадр; в промпте — что OCR/VLM лишь подсказка.
  • Скептики окупаются: из 73 кандидатов 14 отпали на верификации (ложные OCR-артефакты, вкусовщина). Три линзы дешевле, чем три идентичных проверяющих.
  • Критик полноты — последним, ему дать только id непроверенных экранов и файл инвентаря (не встраивать 40 КБ в промпт).
  • Session limit (сброс 10:00 МСК) снимает агентов посреди workflow: аудиторов запускать первыми, верификацию — pipeline (не барьер), результат сохранять по мере готовности; недопроверенное дожать самому по кадрам или resumeFromRunId.
  • Не повторять аудит целиком после правок Романа: pravki — источник истины, снятые ТЗ помечаются, регенерация поверхностей — минуты и 0 токенов.
  • Локальная модель умеет и редактуру: когда облачные агенты в лимите, слитые строки разбирает Qwen3-8B (mlx) — s14_polish_local.py. Задача даётся ПО ОДНОЙ строке («разбей на пункты, ничего не потеряй»), а не «перепиши ТЗ»: маленькую задачу модель 8B делает надёжно, а код сверяет таймкоды и слова и при провале берёт детерминированный разбор. Формулировки после неё всё равно читает человек.

⚖️4.8 · 17Правила и грабли

  • alpha-рендер: у прозрачных страниц html,body{background:transparent}, иначе оверлей глушит видео; GUI-Chrome в headless на маке виснет — chrome-headless-shell из ~/.cache/puppeteer.
  • Стиллы ≤ 4,8 с (дефолт still-duration Premiere 5 с клампит длиннее); таймкоды на сетке 25p (×0,04), хвостовые встык — иначе чёрные проблески; sequence_name не кончать на _v\d — авто-версия билдера срежет.
  • Верхняя полоса кадра занята титрами ката: подглавы/прогресс — слева-посередине, термины/карты — справа-посередине; плашка уступает титульному экрану (сдвиг за его конец) и инфографике (окно −3…+6 с, иначе выпадает — с записью в dropped).
  • Клип-маркеры на Premiere 25.x приходят без имени/коммента — копируемый текст ТЗ обеспечивает кнопка панели «Copy ТЗ @ playhead» (читает review-JSON, чей sequence_name — префикс активной секвенции).
  • Вставки видео не класть без согласования — предлагать таймкодами; ссылки везде активные, у PDF — номер страницы; материалы — в Drive-папку проекта с комментом на каждом файле.
  • OCR путает Й/И на титрах — якоря селфчека сравнивать нормализованно; VLM читает кириллицу, но полукадры анимации даёт как обрезки — best-кадр = самый полный текст экрана.
  • Docs API: картинки вставлять пачками по 20, при сбое пачки — по одной; backoff на 429/5xx; картинку — в ПУСТОЙ абзац (иначе текст следующей строки встаёт справа от картинки). Регенерация вкладки ~10–15 мин — в фоне.
  • Выравнивающий цифровой пробел U+2007 Python-овский \s съедает — добавлять его после чистки строки и не чистить готовый текст повторно. И в регулярках стиля искать именно U+2007: с обычным пробелом «0:57» останется без моноширинного начертания, а «33:42» получит — столбик выйдет разнородным.
  • get_doc тянет ВЕСЬ документ со всеми вкладками (~30 с на вызов): шапку вставлять одной пачкой с самостоятельным счётом индексов, а не «абзац → перечитать док». Разница — 25 минут против 4 на сборку вкладки.
  • Таймкоды с долями секунды («2:46.0–2:48.6») ломают наивный шаблон \d{1,2}:\d{2} — verify считал их за два таймкода. Шаблон один на все скрипты: диапазон и доли — часть одного таймкода.
  • Автокроп превью по альфе: нижнюю полосу кадра исключать — водяной знак «DRAFT · перерисовать» растягивает рамку на весь кадр, и кроп теряет смысл.
  • Заплатка нарисованного исправления перекрывает соседние строки титра: у fix задаются pad (узкая рамка) и badge:above (плашка «ИСПРАВЛЕНО» над текстом); индексы формул — настоящими <sub>/<sup>, иначе Georgia ставит их на базовую линию.
  • Заголовок ТЗ из находки аудита не резать по числу знаков — обрыв посреди слова читается как брак; резать по границе слова и снимать OCR-скобки «ПУТАЛ[И]».
  • Строки таблицы внутри главы сортировать по времени, а не по номеру ТЗ: монтажёр идёт по фильму, а не по нумерации.

🧰4.8 · 18Скрипты

Комплект: ~/YTAI/scripts/999_extra/review_timeline_audit/ (README внутри) — run_prep.sh, s1…s9, make_infographics_v6.py, make_review_v6.py, terms_catalog.py, terms_index.py, mockbuild_v6.js, wf_audit_v6.js (Workflow-скрипт аудита), run_post.sh; формат v7 — s10_format_tz.py (списки + lint), s11_apply_sources.py, s12_doc_previews.py (превью), s13_doc_edits.py (правки заказчика из дока), typo_diff.py, s14_polish_local.py (доводка строк локальной моделью), run_v7.sh (весь цикл с --from/--until); приёмка и доводка — в v7_tools/: export_tab_pdf.py, wf_final_doc_qa_v7.js, wf_final_qa_fix_v7.js, wf_listify_v7.js, wf_preview_qa_v7.js, listify_rules.md + listify_rules_v2.md, guard_v7.py/guard_v7b.py, merge_listify.py/merge_r3.py, apply_qa.py. Скилл графики: /infographic. Панель: scripts/05_editing/0500_uxp/ (Review-пикер, partsBuilder, кнопка Copy ТЗ).

# 1) подготовка (ночь, автономно)
./run_prep.sh            # кадры → OCR → VLM → LLM, селфчеки, TG
python3 s6_pack_chapters.py
# 2) аудит агентами: Workflow(scriptPath=wf_audit_v6.js, args={packs, existing_tz_file, inventory_file})
# 3) применить и пересобрать всё
./run_post.sh            # s8 → G → JSON → previews → mockbuild → Drive → лист → док+verify
# 4) цикл правок заказчика (формат v7)
python3 s13_doc_edits.py # что он поменял в доке → pravki / tz_overrides.json
python3 s10_format_tz.py && python3 s11_apply_sources.py
python3 make_infographics_v6.py C G H && python3 make_review_v6.py && node mockbuild_v6.js
python3 s12_doc_previews.py --render && python3 s12_doc_previews.py --upload && python3 s12_doc_previews.py --apply
python3 s9_materials_drive.py && python3 ../montage/tz_sheet.py
python3 ../montage/doc_tab_tz_v3.py && python3 ../montage/doc_tab_tz_v3_verify.py   # в фоне, до ALL PASS
./run_v7.sh --from s10   # то же одной командой, с логом v7.log
# 5) приёмка глазами и доводка по её замечаниям
python3 v7_tools/export_tab_pdf.py OUT 110     # вкладка → PDF → PNG-страницы
# Workflow(wf_final_doc_qa_v7.js) — агенты по страницам → замечания
# Workflow(wf_final_qa_fix_v7.js) — переписчик+скептик по замечаниям → guard_v7b → merge_r3.py
python3 s14_polish_local.py                    # хвост локальной моделью, если агенты в лимите
Пример проекта: YTUVI01 (тулинг также в ~/Downloads/YTUVI01_Sonya_cut/work/v6/, HANDOFF_REVIEW_CYCLE.md §5.5). См. также 4.5 Assembly Brief Cycle и 4.3 Editor Montage Sheet.
Оригинал монтажёра неприкосновенен; ошибка показывается на кадре, исправление рисуется, текст копируется с таймлайна. Один JSON правок — четыре согласованные поверхности.