review.py, Memex делает всё локальное автономно, облако — один компактный проход (≤10 агентов, без картинок), все поверхности — из одного pravki. Сессия Claude систему вызывает, а не переписывает.Ревью ката (cut_review): монтажёр прислал сборку → локальный разбор экранов и речи → один облачный проход → ТЗ и все поверхности. ТЗ из исходников (montage_tz): ката нет — монтажный лист собирается из съёмки по пословным якорям (4.8).
Общее: карточка фильма + профиль канала, одна стейт-машина review.py, транскрипт, рендер графики, телефонный бриф, Memex-раннер. Форматы поверхностей — канон 4.6 (6 слоёв, ОДНА таблица во вкладке, блоки ❌/✅/📋/📍/📚/🎬/💬) — не переизобретаются.
Зачем система: четыре цикла (YTUVI01, YTUVI02, YTCH12, YTEVO02) сожгли ≈99 M токенов; 59 % — фан-аут воркфлоу (1 080 агентов, ≈54 k накладных на каждого), аудит экранов гонялся 5 раз (741 агент, 33,5 M), 271 разовый скрипт писался в сессиях. На данных YTUVI02 24 из 26 находок класса «вёрстка» прошли трёх скептиков, хотя по правилу Романа это не ошибки — качество даёт фильтр по классу в коде, а не скептики.
scripts/05_editing/0509_review_cycle/ # код (git); на Memex — rsync-копия с VERSION
├── review.py · proj_config.py · stages/ · cloud/ · montage/ · shared/ · memex/ · geo/ · templates/ · docs/contracts.md
{project}/00_Setup/05_Review/ # всё состояние фильма
├── review_card.json · review_state.json · REVIEW_STATE.md · review_terms.json
├── {CODE}_v1.words.json · {CODE}_review_v6.json (UXP Review-пикер сканирует эту папку)
├── pravki/ (pravki_v2.json — источник истины) · work/v1/ (кадры, OCR, VLM, LLM, пробы, кандидаты, находки)
├── cloud/ (in/ out/ raw/ state.json CALL.txt) · mockups/ · notes/ · logs/
YTs/{CH}/review_profile.json # профиль канала: стиль, каноны, классы ТЗ, чувствительностьРабочих копий инструмента рядом с данными больше нет — так расходились три версии (репо · work/v6 · Memex). Карточка ищется по YTAI_CARD, YTAI_PROJECT_DIR или вверх от текущей папки; внешние id (док, Drive, лист) — только из неё: пусто = отказ, не фолбэк на прошлый фильм.
Memex — «глаза»: качает кат напрямую с Drive, режет кадры 1 fps, Apple Vision OCR с bbox, транскрипт (whisper large-v3 + диаризация), Qwen2.5-VL дословно читает каждый экран, Qwen3-8B даёт признаки, VLM-пробы (чужие следы, обрезка, zoom-перечит спорных слов). Автономно: review.py memex start → nohup + caffeinate + сторож, вехи в Telegram, ноутбук можно выключить. Mac — «руки»: маршрутизация кандидатов, один облачный проход, графика, таймлайн, док, лист, Drive, бриф.
| # | стадия | хост | инструмент | гейт |
|---|---|---|---|---|
| 1 | download | memex | rclone из cut_drive напрямую | кат на диске |
| 2 | frames | memex | ffmpeg 1 fps 1080p | кадров ≥ длительность − допуск |
| 3 | ocr | memex | s2_ocr_hires (Apple Vision, bbox) | селфчек ocr + якоря |
| 4 | transcript | memex | wordrole_transcribe --plain (.venv_transcribe) | words.json |
| 5 | vlm | memex | s3_vlm Qwen2.5-VL-7B | селфчек vlm |
| 6 | llm | memex | s4_llm Qwen3-8B (признаки, не вердикты) | селфчек llm |
| 7 | probe | memex | s3b_probe_vlm: чужие следы, обрезка, zoom-перечит | probes на всех экранах |
| 8 | selfcheck | memex | s5_selfcheck all | ALL OK |
| 9 | route | mac | route_candidates: auto / cloud / drop | candidates.json |
| 10 | cloud | mac | pack → Workflow wf_judge (J≤4, F, V, S) → collect | все пакеты done, покрытие 100 % |
| 11 | apply | mac | s8_apply_audit: классовый фильтр, одна ТЗ на экран | audit_v6.json + pravki |
| 12 | align | mac | align: n-gram кат ↔ план/прошлые версии (card.align_against) | align.json |
| 13 | risk | mac | risk_registry (YTCH): ⚠️ на подтверждение фонда, не ⛔ | risk.json |
| 14 | acts | mac | acts_compact Qwen3-8B по актам + проверки структуры (YTCH) | acts_compact.json |
| 15 | verdict | mac | 1 облачный агент: вердикт, обязательные правки, структура (YTCH) | verdict.json применён |
| 16 | terms | mac | terms_index | terms_v6.json |
| 17 | format_tz | mac | s10_format_tz + lint | lint_v7.json |
| 18 | polish | mac | s14_polish_local Qwen3-8B по одной строке + guard | длинных строк 0 |
| 19 | sources | mac | s11_apply_sources | — |
| 20 | render | mac | make_infographics_v6 (chrome-headless 4K PNG) | PNG в mockups |
| 21 | review_json | mac | make_review_v6 (ytai-part-v1, 6 слоёв) | {CODE}_review_v6.json |
| 22 | mock | mac | mockbuild_v6.js через partsBuilder | 0 ошибок |
| 23 | previews | mac | s7 + s12 --render + preview_qc_local | qc 0 high |
| 24 | drive | mac | s9_materials_drive + s12 --upload/--apply | файлы с комментами |
| 25 | sheet | mac | tz_sheet | лист обновлён |
| 26 | doc_tz | mac | doc_tab_tz_v4 (гейт: review.py edits) | вкладка записана |
| 27 | doc_nav | mac | doc_tab_review_v1 (навигатор) | вкладка записана |
| 28 | verify | mac | doc_tab_tz_v4_verify | ALL PASS |
| 29 | doc_qc | mac | doc_pdf_qc (pdftotext/pdfimages/PIL) | 0 high |
| 30 | phone_brief | mac | phone_brief → Telegram | файл ≤1 МБ отправлен |
| 31 | producer_page | mac | producer_page / review_page | HTML |
| # | стадия | хост | инструмент | гейт |
|---|---|---|---|---|
| 1 | transcript | memex | wordrole_transcribe --plain (.venv_transcribe) | words.json |
| 2 | segment | memex | segment_local Qwen3-8B: тезисы + якоря | segments.json |
| 3 | montage | mac | build_montage по пословным якорям | montage.json |
| 4 | structure | mac | 1 облачный агент: структура/тезисы/графика | montage_plan обновлён |
| 5 | mockups | mac | build_mockups + DOM-QC | PNG 4K |
| 6 | design_review | mac | 1 облачный агент по контактному листу мокапов | design_review.json применён |
| 7 | structure_html | mac | build_structure_html | HTML |
| 8 | standalone | mac | make_standalone (для телефона) | один HTML |
| 9 | phone_brief | mac | phone_brief → Telegram | файл ≤1 МБ отправлен |
Каждая стадия идемпотентна, гейт — по артефактам на диске; review_state.json можно потерять — ничего не переделается. Пауза/стоп — флаги ~/.cache/<project>/PAUSE|STOP, стадии читают их на границе экрана.
Скилл /review читает ровно пять файлов (README стадии, contracts.md, REVIEW_STATE.md проекта, карточку, профиль) и дальше только вызывает review.py. Тикет для новой сессии не пишется руками — review.py ticket генерит его из карточки и стейта: запуск в новом чате, факты, состояние стадий, следующий шаг, грабли проекта, «готово, когда».
R=~/YTAI/scripts/05_editing/0509_review_cycle/review.py
python3 $R init --project <path|CODE> --channel YTUVI --mode cut_review --cut gdrive:…/cut.mp4
python3 $R memex --project P push [--with-cut] · start · status · pause · resume · pull
python3 $R run --project P --until route # после pull: маршрутизация
python3 $R cloud --project P judge --print-call # → Workflow({...}) один раз → cloud collect --run <id>
python3 $R resume --project P # apply → … → doc → verify → бриф в TG
python3 $R edits --project P # правки Романа из дока — ДО регенерации вкладокГигиена главного потока (нарушение = утечка токенов): кадры и скриншоты только через shared/shot.py (≤1280 px или кроп по bbox), JSON > 50 КБ только через shared/peek.py, никаких разовых скриптов в проекте (баг → правка в репо + memex push), Grep/Glob вместо cat, сессию закрывать status + ticket.
rules_text), классы ТЗ (tz_classes.keep/drop), белый список латиницы, чувствительность (YTCH: паттерны, ⚠️ вместо ⛔), правила структуры.YTs/YTUVI/review_terms_base.json): плашки V3, мини-карты, канон «МЬЯНМА (БИРМА)», confusables, canon_words.Полные схемы — docs/contracts.md в папке стадии.
Опечатки: токен вне словаря (pymorphy3 + каталог + canon_words), три независимых чтения (OCR = VLM = zoom) и найденное исправление из озвучки/каталога → auto; пары Й/И, Ё/Е, Щ/Ш и омоглифы — всегда в облако. Валюта, английский без перевода, дефисы — регексы по канону профиля. Дубли по OCR-сигнатуре, existing_tz по таймкоду. Класс «вёрстка/вкус» не кандидат. На YTUVI02: 61 из 84 старых находок решаются локально, 0 ложных auto, в облако — 24 кандидата.
≤50 экранов и ≤60 кандидатов на пакет: строки OCR с индексами, текст и описание VLM, озвучка ±8 с, локальные сигналы, кандидаты, список существующих ТЗ, канон канала. Кадры не прикладываются намеренно: сомнение в буквах → need_frames, код нарежет кропы. 40-минутный фильм — 4 пакета по ~100 КБ.
Судья J по пакетам (confirm/refute/need_frame/fact_check по кандидатам + новые находки по тексту всех экранов + clean_screens), факт-чек F одним агентом по списку утверждений (WebSearch по авторитетам канала), кропы V одним агентом (≤16 кропов ≤800 px или контактный лист 4×4), скептик S одним агентом на весь список — default real = true, опровержение только с кодом: T вкус · V допустимый вариант · H буквы за головой → «проверить исходник» · C покрыто ТЗ · F факт защитим · D дубль. Агент сначала пишет результат на диск (cloud/out/), потом возвращает — обрыв по лимиту ничего не теряет.
cloud collect собирает out/, журнал воркфлоу, task-output; проверяет покрытие (непокрытые экраны досылаются пакетом J_NNb); сливает в audit_findings.json. Повтор — только pending-пакеты; перед повтором cloud salvage (достаёт результаты упавшего прогона из логов сессии) и cloud cost (таблица прогонов — метрика экономии).
YTCH: локально n-gram выравнивание, стоп-реестр (25 паттернов, ⚠️ на подтверждение фонда), Qwen3-8B по актам + кодовые проверки структуры (фонд не раньше 34-й минуты, тизер не только из бед, последний звук) → 1 агент вердикта. YTEVO: 1 агент структуры + 1 дизайн-ревью по контактному листу (4.8).
make_review_v6 → mockbuild_v6.js (0 ошибок) → UXP Review.review.py edits перед любой регенерацией (удалённые Романом строки → rejected, дописки → 💬).doc_pdf_qc (PDF вкладки → сироты заголовков, подписи «таймкод · что видно», перечисления, длинные абзацы, картинки) и preview_qc_local (альфа-рамка в кропе, читаемость на 350 px через OCR, лучшая секунда кадра) — вместо 37 агентов; текст ТЗ доводит s14_polish_local (Qwen3-8B по одной строке + кодовый страж).| стадия | было (агентов / токенов) | стало |
|---|---|---|
| аудит экранов | 233–244 / 6,1–14,8 M | 0 — локально (OCR, VLM, LLM, пробы, маршрутизация) |
| догоняющая верификация | до 264 за 3 прогона / 12,6 M | 0 — pending-пакеты, salvage |
| судья J + факты F + кропы V + скептик S | — | 7 (≤10) / ≈0,7–1,5 M |
| listify · QA дока · QA превью | 65 / ≈6,2 M | 0 — код + локальные модели |
| YTCH: документальный вердикт | 36 / 8,7 M | 1–2 / 0,12–0,25 M |
| YTEVO: ТЗ из исходников | 11 / ≈1 M | 2 / 0,15–0,2 M |
Главный тред: ≤300 k на цикл (пять файлов на старте, кадров 0, скриптов 0). Замер: review.py cloud cost --session <id>.
typo · grammar · fact · currency · language · mismatch · foreign_trace (+ structure у YTCH); вёрстка/вкус/темп не попадают по коду. Целевой размер списка никогда не задаётся.status: rejected = Роман снял строку; повторный s8_apply_audit не перенумеровывает.hard: true).export PATH=/opt/homebrew/bin:$PATH; версия кода на Memex = VERSION, дрейф виден в memex status.html,body{background:transparent}, chrome-headless-shell; стиллы ≤4,8 с; tc на сетке 25p; клипы 23.976 → Interpret 25p.route_candidates --eval: 61/84 локально, 0 ложных auto, облачный список 24 на 95 экранов; пробы: вотермарк «唐» (s058) пойман, «ВЫСОКВАЯ» (s031) — три чтения → auto.cloud cost.montage.json = 0 расхождений, 28/28 мокапов побайтно.pull сверяет md5.Тулинг-эталон и история решений — 4.6; исходники метода — docs/contracts.md, README.md стадии.
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.