montage_tz стадии 4.7.Манифесты, разговоры, интервью на 1–2 камеры, где монтажёру нужен готовый монтажный лист, а не ревью его сборки (YTEVO02 «Эволюция»: 11:53 из 23 минут исходника, 17 кусков, 20 экранов графики). Режим montage_tz той же стадии: review.py init --mode montage_tz. Общее с 4.7 — карточка, профиль, транскрипт, стейт-машина, Memex, бриф.
card.clips: файл, начало, конец по сквозному TC) и роли (card.speakers: «Speaker 1» → «A · Дарья»).wordrole_transcribe --plain, на Memex).montage_plan.json: целевой порядок кусков с якорями и каталог графики (тексты экранов живут в плане, не в коде).style.*) или из плана (презентация клиента).Граница куска = (подсказка_сек, "слово"): берётся ближайшее к подсказке вхождение слова, поэтому правка на полсекунды не ломает склейку. 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 с, иначе отброс).
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.montage_plan.json даёт файл, идентичный историческому (0 расхождений); конвертер из легаси-скрипта — build_montage.py --plan-from-legacy.Экраны собираются из HTML-тел каталога (gfx_catalog[*].screens) в стиле профиля/клиента и рендерятся в 4K через chrome-headless-shell. Раскладка проверяется прямо в DOM (--dump-dom, body[data-qc]: title-safe и переполнение) — ноль токенов; варианты А/Б для спорных экранов; бейдж DRAFT из профиля. Ревью дизайна — один агент по одному контактному листу всех экранов (≤1568 px), не по 28 картинкам.
build_structure_html — лента фильма по montage.json + segments.json + мокапы: транскрипт никогда не перепечатывается руками. make_standalone — один самодостаточный HTML с data-URI превью для телефона/почты; плюс телефонный бриф (4.7 §7).
Вход — путь к segments.json (тезисы с якорями), правила формата и описание фильма; выход — порядок, что оставить/снять и почему, список графики с якорями, главы. Пишет cloud/out/structure.json сам; structure_call.py --apply сливает в план, ручные note не трогает.
Один контактный лист мокапов + список экранов → ok/problems/fix на экран; --apply-design прикрепляет замечания к экранам.
Было: 11 агентов и ≈1 M токенов с непрошенной стадией сверки (YTEVO02, 11.09). Стало: ≈0,15–0,2 M.
scenes[]), не вставка в основной лист (иначе два призыва подряд).YTEVO02_evolution_manifesto).pravki_v2.json) рождает секвенцию в Premiere, лист в Google Sheets, вкладку в сценарном доке и Drive-папку материалов с комментами. Эталонная реализация — YTUVI01 «Корунд — Рубин», Review_v6.| слой | что лежит | формат |
|---|---|---|
| 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» | прозрачные; главы — верх-лево с градиентом, подглавы/прогресс — левый борт середина (верх кадра занят титрами ката) |
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 корректор (опечатки/валюта/англ./факты-кандидаты).
Пакет главы = экраны с кадрами, OCR-bbox, VLM/LLM-подсказками и озвучкой ±8 с. Аудитор обязан открыть каждый кадр (OCR путает Й/И, Щ/Ш; полукадры анимации), проверяет текст, факты (WebSearch: GIA, Lotus, SSEF, Sotheby's), формат валют, английский без перевода, экран≠озвучка, вёрстку. На каждую находку — 3 скептика с разными линзами (визуал / лингвист-факт / редактор); остаётся при ≥2 «не опровергнуто». Критик полноты добирает экраны, не отмеченные ни как ошибка, ни как чистые.
s8_apply_audit.py: одна новая ТЗ на экран (несколько находок сливаются), находка под существующим ТЗ получает только стрелку (ТЗ-21b, 21c…), стрелка ставится на секунду дописанного титра, не на старт анимации. Канон Романа побеждает мнение верификатора (валюта «$34,8 МЛН», не «34 800 000 $»).
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}.
s9_materials_drive.py (файлы в Review_materials + коммент на каждом; кадры ошибок ещё и в shots для =IMAGE) → tz_sheet.py (лист «ТЗ монтажёру», самопроверка) → doc_tab_tz_v3.py + _verify.py до ALL PASS. Снятые Романом ТЗ получают status: rejected — номера сохраняются, строки исчезают везде разом.
Роман (10.09): «сплошной текст сложен для восприятия». Каждое ТЗ печатается именованными блоками с жирными метками — глаз находит нужное за секунду:
v7 — «как карта структуры» (Роман, 10.09: «каждый таймкод — списком, друг под другом»). Эталон — кадр карты структуры: крупный заголовок, под ним вертикальный список «таймкод слева — пункт справа», одна строка = одна мысль:
SUB, terms_v6.json), — список в доке всегда совпадает с картинкой.typo_diff.py (difflib по символам, числа целиком).v7.1 — что добавила приёмка (глазами по всем страницам вкладки; правила лежат в v7_tools/listify_rules_v2.md и их проверяет guard_v7b.py):
decision и печатаются отдельным блоком.parts в pravki, а не готовый текст: элемент блока — строка или {"h": заголовок, "items": [пункты]}; ручные уточнения живут в tz_overrides.json и накладываются поверх при каждой сборке. Каждая картинка-материал несёт строку «📚 источник: …» — какая книга/статья, страница и ссылка на сам источник в архиве.Сборка «ALL PASS» по коду ещё не значит, что документ читается. Поэтому последний шаг цикла — приёмка постранично, как её увидит монтажёр:
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.terms_catalog.py (regex по озвучке + определение, факты сверены), индекс упоминаний terms_index.py: плашка при каждом упоминании, cooldown 45 с на термин, 2–3 термина в окне ≤5 с — одна групповая плашка. Правый борт, середина кадра.PLACES (родитель, роль, старое имя, сноска), из неё выводится и плашка, и заголовок в ТЗ.MAP_WINDOWS).s12_doc_previews.py): оверлей — кроп по альфе; fix — «БЫЛО / СТАЛО» столбиком (цены — «БЫЛО / ВАРИАНТ А / ВАРИАНТ Б»); кадр со стрелкой — кроп вокруг ошибки; ТЗ без картинок — кадр в таймкод ТЗ. В доке превью стоит в своём абзаце на всю ширину колонки, под ним подпись «таймкод · что видно»; QA превью — агентами по батчам (пробный кроп → поправки в previews_v7.json).| поверхность | что несёт | генератор |
|---|---|---|
| Секвенция Premiere | 6 слоёв, маркеры глав; текст ТЗ — маркер клипа / кнопка «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). Все поверхности регенерируются согласованно; номера ТЗ никогда не переиспользуются.resumeFromRunId.s14_polish_local.py. Задача даётся ПО ОДНОЙ строке («разбей на пункты, ничего не потеряй»), а не «перепиши ТЗ»: маленькую задачу модель 8B делает надёжно, а код сверяет таймкоды и слова и при провале берёт детерминированный разбор. Формулировки после неё всё равно читает человек.html,body{background:transparent}, иначе оверлей глушит видео; GUI-Chrome в headless на маке виснет — chrome-headless-shell из ~/.cache/puppeteer.sequence_name не кончать на _v\d — авто-версия билдера срежет.dropped).\s съедает — добавлять его после чистки строки и не чистить готовый текст повторно. И в регулярках стиля искать именно U+2007: с обычным пробелом «0:57» останется без моноширинного начертания, а «33:42» получит — столбик выйдет разнородным.get_doc тянет ВЕСЬ документ со всеми вкладками (~30 с на вызов): шапку вставлять одной пачкой с самостоятельным счётом индексов, а не «абзац → перечитать док». Разница — 25 минут против 4 на сборку вкладки.\d{1,2}:\d{2} — verify считал их за два таймкода. Шаблон один на все скрипты: диапазон и доли — часть одного таймкода.pad (узкая рамка) и badge:above (плашка «ИСПРАВЛЕНО» над текстом); индексы формул — настоящими <sub>/<sup>, иначе Georgia ставит их на базовую линию.Комплект: ~/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 # хвост локальной моделью, если агенты в лимите
~/Downloads/YTUVI01_Sonya_cut/work/v6/, HANDOFF_REVIEW_CYCLE.md §5.5). См. также 4.5 Assembly Brief Cycle и 4.3 Editor Montage Sheet.