◂ Этап ReviewRYA.AEIntegrity Checklist — чек-лист целостности: цвет, звук, слова, кадр, полнота, экраныревью · 3 окт 2026
Каждый монтаж — фильм и шортс — перед показом проходит один растущий чек-лист, первый шаг этапа Review: цвет, звук, целостность слов (не обрезан ли смысл или динамика), кадр (человек в центре, место над головой, окно спикера), полнота (всё ли нужное есть), экраны, техпаспорт файла. У строки — норма, инструмент, способ проверки (код, агент, глазами, на слух) и источник: какая ошибка её породила. Роман, 03.10.2026: «проанализируй все сессии с ошибками и решениями». Подробности: Цвет, Звук, План экранов, Фильм кодом, Шортсы машиной; переделки — Процесс.
📌 Правило. Строка чек-листа появляется после настоящей ошибки и носит её источник. Семь групп — цвет · звук · слова и смысл · кадр · полнота · экраны · техпаспорт — прогоняются на каждом монтаже до показа; отчёт qc_<tag>.json лежит рядом с версией, ворота — 0 красных строк. Чего код не умеет, проверяем глазами или на слух — и так и пишем.
Одним взглядом
7групп
проверок на каждом монтаже
цвет · звук · слова · кадр · полнота · экраны · техпаспорт
0красных
строк в отчёте — ворота до показа
qc_<tag>.json лежит рядом с версией
143сессии
разобраны: июль — 3 октября
176 попаданий → 43 записи с решением
−14 ±1LUFS
мастер фильма и шортса
пик ≤ −1 dBTP; у фильма ещё LRA ≤ 8
1Схема2Чем проверяем3Чек-лист4Пороги5Методы из сессий6Фильм · шортс7Рост8Проверки9Знания10Грабли11Команды12Где лежит

20.2 · 1Схема: как чек-лист живёт

🔎 Ошибка найдена
Роман по версиистраница версии: «ок / править»
+
Клиент, монтажёрправки в доке, чат, Telegram
+
Приёмка кодом⛔ в отчёте движка или шортсов
✍️ Строка
Строка с источникомчто · норма · чем · проект, дата
→
Проверка кодомпорог в движке, README этапа
→
Глазами или на слухпока кода нет — помечено честно
🔁 Каждый монтаж
qc движкаautocut · headless · doc_cut · story
→
video_tech_qcпаспорт YouTube, VMAF к прошлой
→
shorts.py statusedges · sheet · render ⚠ — шортсы
→
qc_<tag>.json✓/⛔ по строкам, рядом с версией
👁 Показ
Листы кадроввсе планы и экраны, не выборка
→
Страница версииссылка у экрана, поле комментария
→
«ок» Романаили правка = новая версия
📚 Рост
Обратная связьстраница, Telegram, клиент, сессии
→
Новая строкас источником, в тот же день
→
Код проверкипорог в движке + README
→
Эта страницаодна таблица на все движки
машиначеловек решает или смотритагент Claudeитог дорожки

20.2 · 2Чем проверяется каждая группа

Сводка столбца «Чем и как» семи таблиц ниже: код — порог в движке, агент — Claude по кадру и речи, глазами и на слух — человек.

ГруппаКодАгентГлазамиНа слухНадо построить
Цвет✓✓✓·—
ЗвукНадо построить: звук = видео у шортсов✓··✓звук = видео у шортсов
Слова и смыслНадо построить: смысл и динамика на стыке✓✓✓✓смысл и динамика на стыке
КадрНадо построить: ракурс при смене камеры✓✓✓·ракурс при смене камеры
Полнота✓✓✓✓—
Экраны✓✓✓·—
Техпаспорт✓·✓·—
✓проверяет·не используется

«На слух» в полноте — музыка по блокам; «глазами» в техпаспорте — лист рамки шортса и проверка YouTube. Ни одна группа не держится только на коде.

20.2 · 3Чек-лист: семь групп

Одна строка на проверку: код — порог в движке, агент — Claude по кадру и речи, глазами / на слух — человек; «надо построить» — кода ещё нет.

ЦветНормаЧем и какИсточник
Гамма известна, куб тот самыйrefused пуст — незнакомая гамма это отказ; sha256 куба = манифесткод: color_apply (--verify) · solo develop_for · sc_color planYTEVO: 61 клип DJI из 163 под кубом S-Log3
Кожа тремя числамитень (p20) · середина · света, разброс ≥ ~15; принято: середина 38–41, света 56–62 %; после сборки медиана 96–114код: доска, check движков; глазами: варианты ±0,2 ст.02.10 дважды «лицо пересвет» при светах на цели (YTLAB, YTCG); глазами — листы готового файла
Серое вровеньa и b нейтральных (низкая насыщенность, L 22–93) в пределах ±2; флажок «зелень» — a < −2, «синева» — b < −3; тепло заката — не браккод: color_lab.py — флажок под каждым вариантом; глазами: доска по сценамYTCH14 v3: интервью a −2,8…−4,8, двор и подъезд b до −7,6; Роман 03.10: «не уходи в зелёный или синий»
Тень лицаp20 кожи ≥ 0,74 середины; флажок «жёсткая тень на лице» — p20 < 0,66 середины; после look — второй проходкод: color_lab.py; глазами: доска, нажать и держать — «сейчас»Роман 03.10: «нет ли жёсткой совсем темноты лица»; YTCH14: после look тень 72 при середине 113
Цвет лицаугол кожи в Lab 45–62°, насыщенность 12–26; флажки «кожа красная · жёлтая · бледная · пережжена»код: color_lab.py, вторичка ведёт к 52° и 13–24; глазами: доскаYTCH14: после снятия зелени кожа Sony краснела — 28–42°; Роман 03.10: «…и цвет лица»
Лицо не тёмное и не пересвеченосередина кожи ≥ 100 (0–255), света p95 ≤ 175; контровой закат светлее — цель 122, предложениекод: color_lab.py; глазами: доскаРоман 03.10 о закате: «светлое лицо ещё должно быть»
Контраст кадратени–света p2–p98: размах ≥ 70 п.; ниже 1,5 % — не больше 2,5 % кадракод: color_lab.py — флажки «плоско», «зажаты тени»; глазами: доскаYTCH14 v3: цветы во дворе 14–78 %; Роман: «контраст должен быть»
Фон выбит — справочновыше 98,5 % — больше 2 % кадра: серый флажок, в счёт не идёт; окно или небо за героем — не браккод: color_lab.py; глазами: доскапочему — на странице Цвет в AI Editing
Клип без куба⛔ рендер не идёткод: conform · doc_cut renderклип без проявки оставался серым
Красный бренда после кодированияна экранах (238,50,39) ±10; последний кадр экрана = макет, (208,2,27) ±2код: autocut qc screens · screens_verifyкодек 4:2:0 уводил красный клиента
Цвет = смысл на экране🟢 правильно · 🔴 нельзя; «нельзя» зелёным — ошибкаагент по хи-рез кадру + глазамиYTRF: 11 пунктов экранного QC

Листы снимаются с готового mp4, не с исходников (final_NN.jpg, final_gfx_NN.jpg). Числа — половина приёмки, вторая — глаза.

Звук: Звук
ЗвукНормаЧем и какИсточник
Источник голосацелый *_orig.wav, f32 48 кГц; до лимитера только f32код: ffprobe · 17_audioсрезы и s24-копии теряли пики; Роман 03.10
Эхо комнатыхвост через 0,1 / 0,2 / 0,3 с: было −24 / −28 / −31 дБ, после изоляции −32 / −35 / −42код: solo tail_db · на слухYTCG v1: «голос — эхо»
Речь после чистки целаясдвиг изолятора ≤ 1 мс; расшифровка заново = лист (951 слово, 100 %); шипящие на местекод: clean · dialog · ASR; на слухизолятор роняет громкую речь, ест согласные
Мастер−14 ±1 LUFS · пик ≤ −1 dBTP · LRA ≤ 8 (doc_cut: пик ≤ −0,9)код: qc loud · ebur128; числа — 17_audio/standard.pyодно место чисел для всех движков
Синхрон звук–картинкаautocut ≤ 20 мс на планах ≥ 3 с · headless ≤ кадра (40 мс) · doc_cut 0 ± 2 мс к WAV, ⛔ > 25код: qc sync · av_checkобрезка в плеере: звук позже на 30,5 мс (YTEVO02 v5)
Тишина и мёртвый каналsilencedetect −55 дБ ≥ 2 с вне вставок; канал тише −50 мёртвкод: headless qc detectFX3 утром писал ноль в L
Звук = видео по длинефильм: ± 0,08 с; шортсы — надо построитькод: doc_cut qc finalхэндофф «Что дальше»
Слова и смысл: Ingest · Story
СловаНормаЧем и какИсточник
Край в паузе между словамивоздух после последнего слова ≤ 0,30 с, перед первым 0,15; не ближе 0,05 с к чужому; рез на границе кадра; смычка 40–110 мс — не паузакод: shorts.py edges [--fix] (CTC) · sc_align.py audit (0 резов вне паузы) · doc_cut align.pyYTFP01 v2: «хоро|шо», «молод|цы»; YTCR: ~45 кусков из 229 без последнего слова
Собранная речь = листраспознать то, что услышит зритель; 0 потерь на краях; у стыка 3 + 3 слова, < 5 из 6 → флагкод под замком моделей: headless verify.py · sc_qc asr · doc_cut verify.pyYTEVO02 v6: обрывы на 11:29 и 15:07 нашёл клиент
Смысл и динамика не обрезаныконец куска — конец этой же мысли; слушать, что звучит после резана слух: sc_qc joins → слушать стыки; надо построитьРоман 03.10: «не обрезаем ли смысл или динамику»
Герой под «я» — только ончужих лиц и чужой мысли в единице нет; повторы перебивок сняты (104 → 34)глазами: sc_sheet cuts · clip; код: sc_dedup fixYTCR: каталог назвал героем коллегу
Правила канала о структуреблок фонда не раньше 34-й минуты, кусок куратора ≤ 90 с; последний звук — героякод: review_profile.json → structure_rulesYTCH: первая сборка — фонд 14 мин из 22
Факт сверен, имя единоканон имён и фактов в промпте; числа, даты, должности; экран ↔ озвучкаагент: deep-read + verify; спорное глазамиYTRF: свип путал должность и год
Кадр: человек в кадре
КадрНормаЧем и какИсточник
Человек в центре или по третямпо центру видимой части кадра (весь кадр, правее панели или колонки, окно холста); поля слева и справа равны — разница ≤ 4 px, меряются по верху тела (голова, волосы, плечи), руки и ноги не в счёт; шортс — лицо по центру, центр лица на 36 % высоты рамки (crop.headroom 0,36)код: silhouette → frame_fit (Apple Vision раз в секунду по всем дублям, окно плана по медиане; YTCG37 v4: 303 кадра) · render — рамка по дорожке лица · листы планов глазамиYTCG37 v3 → v4: центр был смещён в среднем на 64 px, до 354; образец анализа — страница YTCG37 v4 «Кадрирование по замеру» (03.10 04:33): правило, что вышло, все 36 планов v3 → v4 числами ← → ↑ px и парами кадров
Место над головойпостоянная доля высоты: средний план 8,5 %, крупный 6 %, окно холста 6 % (в v4 — 7,5 %); упёрлись в край исходника — наезд до +0,3, не сдвигкод: frame_fit по силуэту (поля по верху тела, UPPER); пара «было → стало» на странице версии; глазами по листу плановYTCG37 v3: над головой 296–552 px = 14–26 % высоты, v4: 83–195 px; YTEVO02 v7: «меньше места над головой» → наезд ×1,15; образец анализа — страница YTCG37 v4 «Кадрирование по замеру» (03.10 04:33): правило, что вышло, все 36 планов v3 → v4 числами ← → ↑ px и парами кадров
Окно спикера не режет лицолицо целиком в окне или в чистой половине; шов — число профиля (split_x), к шву приводят сдвигом кадра, не швакод: gfx.py mock · qc.py plan · детектор лиц на кадрах с панелями; глазамиYTLAB: Павел срезан краем; YTUVI: шторка на ведущей
Крупность по правилу Романа«быть крупным прямо»: эмоция крупно; хук — живые лица без холста; титры читаются с телефонаплан экранов: типы «ок»; глазами кадры на 390 pxYTLAB v1–v3, 02.10
Рамка шортса без скачководна рамка на склейку по дорожке лица; смена рамки = смена ракурса; 0 ⚠ «мелькнул кадр»код: render → status; sheet — кадр из каждого куска рамкиYTFP01 v1: 12 кадров старой рамки
Общие планы и safe-зонаговорящий не у края общего плана; титры не на лице; плашка снизу — без подложки на пол-кадраагент: layout по кадру; листы планов; глазами11 пунктов QC; YTCG v2, 03.10
Ракурс при смене камерыпосле перехода A → B спикер с той же стороны, горизонт ровный, переход на границе фразыглазами по листу планов; кода нет — надо построитьзадание Романа 03.10; случая в сессиях пока нет
Полнота: всё нужное есть
ПолнотаНормаЧем и какИсточник
Главы и экраны по листу всеэкран на каждый пункт плана; ничего не выпало на границе части; карточка на каждую главукод: brief.py lint якорей · manifest ↔ план · autocut qc screens; страница версииYTEVO02: дыра в листе тянула экран
Титр имени при первом появленииу каждого говорящего; имя и роль по канону; бренд, где канал требуетплан экранов; агент names; глазамиYTUVI v3: «добавь название бренда»
QR и призыв по структурешторка: лого, QR с UTM (youtube · код ролика · utm_content=qr), «ссылка в описании»; QR читается с телефонаплан экранов, правило канала; глазамиYTCG 02.10: «нужно лого», «QR код сделать»
Контакты и цифры с источникомконтакты — плашкой, не на слух; число на экране = в речи, оценка подписанаагент: facts · count · missing-viz; verifyYTAgeFree 03.07; YTEVO02: 5 vs 6 советов
Музыка по блокампо плану блоков, не поверх голоса; Epidemic — канал в safelistкод: audio.py all · sc_music.py plan; на слухYTEVO02 02.10: «Музыка нужна»
Субтитры и слова по каналусубтитры по ролям и на языках канала; расшифровка с ролями *.words.jsonкод: wordrole_transcribe; проверка ролей агентамиYTTRBM 01.10: «субтитры по ролям?»
Финальная карточка по каналуYTCG — «в конце ничего, YouTube сам»; YTAgeFree — оверлеем YouTube; остальные — профильплан экранов; профиль каналаYTCG 03.10
Запретное не попалоkeep_out в задании; forbid в профиле: слова, ссылки («Сколково» у YTTRBM; Instagram* с пометкой РФ)код: picks · render · перед upload; описание на YouTube глазамиYTTRBM 01.10; YTUVIE 19.09
Версия в имени, прежняя рядомvN в имени (не m5); новый номер, старая рядом; на YouTube старая закрыта, id в deleted; полный транскрипт на странице версии — каждое слово в одной строкекод: render не затирает · status; проверка слов скриптомYTCH 29.09: «почему m5?»; YTCH 26.08
ЭкраныНормаЧем и какИсточник
11 пунктов экранного QCgrammar · typography · bullets · layout · color · names · titles · brands · facts · meaning · consistency; 🔴 / 🟡 / 🟢агент: кадры fps=1 → листы 4×4 → свип → deep-read по хи-рез кадру → verifyYTRF v4, 05.06.2026; video_qc_checklist.md
Смысловой слой и темпcontext — не противоречит речи · count — не больше пунктов, чем сказано · timing — не позже темы · missing-viz — контакты не голой головой; меню из 5 глав за 4 с не прочитатьагент: кадр + окно речи ±13 с; дыры ≥ 16 с без графики; глазамиYTAgeFree, 03.07.2026: ложка у рта при «не торопить»
Экран на словахмомент из *.words.json; цифра в кадре = инфографика, не список; служебных меток в кадре неткод: brief.py lint якорей · глазамиYTEVO02: «Двое из 60» стояло списком
Типы и стиль «ок» до вёрсткитипы утверждены; 5–6 экранов стиля на кадрах — до всех; lint 0, контраст ≥ 3человек: страница версии; код: sc_gfx check · screens2 checkYTLAB: 125 экранов переделаны; контраст 2,69 у #F08010 по белому
Кадры = будущий рендерmock: исходник + куб + сдвиг + графика; звук текущего листа; окна общих планов не режут лицокод: gfx.py mock · headless qc.py plan; глазами листы плановYTEVO02 v6: 12 экранов до нового звука; YTLAB: Павел срезан краем
Все экраны просмотреныfinal_gfx_NN.jpg все; страница версии со всеми экранамичеловекYTLAB: показали 5–6 → «мелкие правки» → v4
Техпаспорт и файл: Фильм кодом · Шортсы машиной
ФайлНормаЧем и какИсточник
Кадров по листу, кадр-в-кадрnb_frames = total_frames; 25/1 CFR; 3840×2160; bt709/tv; шаг PTS 512; движение в середине плана = исходник (±2), точно ≥ 80 % плановкод: autocut qc frames · headless container + frame_check · doc_cut qc finalчасти уезжали на кадр на стыках
Смены кадра, чёрное, стоп-кадрыscene > 0,10 на запланированных, лишние ≥ 0,30 вне экранов — ⛔; blackdetect d=0,2–0,3; freezedetect d=0,6–4 вне графикикод: autocut qc cuts · black · headless detectдыра в листе тянула экран до конца
Паспорт YouTubeH.264 High, GOP ½ fps, 2 B, CABAC, 4:2:0, BT.709; 4K 35–45 Мбит/с, 1080p 8; AAC 48 кГц 384 кбит/с; moov в началекод: video_tech_qc run --profile yt_4k25 (headless: --no-scan)кат монтажёра: Main 17,6 Мбит/с, 44,1 кГц (YTCH)
VMAF к прошлой версии≥ 93 не отличить · < 85 видно · < 30 — другая картинка, не браккод: video_tech_qc run --ref; --roi руками при субтитрах у одной сторонышортсы под 30 МБ = 3–5 Мбит/с
Копии = мастерlight.py: кадры, первый кадр, звук не сдвинут (⚠ звук против картинки не сверяет); чистый мастер шортсов: сдвиг речи ≤ 2 мскод: light.py · shorts_master.py verifyрез в плеере не на границе кадра
Мастер шортса 4Kрастяжение ≤ ×1,25, выше ⚠; 1080p → find4k → check: same / offset / otherкод: render · find4k · checkYTTRBM: ×1,78–2,37, мягко
Мелькнувший кадр, рамка, плашка⚠ «мелькнул кадр» в render и status; лист с кадром из каждого куска рамки; плашка — крупный план + речь ≥ 1 скод: render → status; код + глазами: sheetYTFP01 v1: 12 кадров старой рамки; плашка на педагоге
Версия и YouTubeфайл версии лежит или залит — отказ (--force); upload после «ок»; status: вышел · по ссылке · ⚠ приватный · ⚠ не в графикекод: render · status; человекРоман 02.10: «не надо заливать до согласования»

20.2 · 4Пороги числами на шкале

Числа из чек-листа выше: где норма, где на грани, где брак.

Серое: a нейтральных− зелень · + пурпур
−4,8 v3v4
−6−224

норма ±2, «зелень» — a < −2 (color_lab.py); YTCH14 v3 → v4

Серое: b нейтральных− синева · + тепло
−7,6 v3v4
−8−326

«синева» — b < −3; тепло заката оставляем на 70 % — не брак

Тень лица к серединеp20 / середина, %
72 / 113 после look
406674100

≥ 74 % — норма; < 66 % — «жёсткая тень на лице»

Угол кожи в Labградусы
52 цель28–42 Sony без вторички
20456280

< 45 — «кожа красная», > 62 — «жёлтая»; насыщенность 12–26

Контраст кадра p2–p98размах, п.
64 — цветы v3
070100

«плоско» — размах < 70 п. (цветы v3: 14–78 %); «зажаты тени» — > 2,5 % кадра ниже 1,5 %

Громкость мастераLUFS integrated
−14 цель
−20−15−13−8

−14 ±1 · пик ≤ −1 dBTP · LRA ≤ 8 (doc_cut: пик ≤ −0,9) — qc.py, 17_audio/standard.py

Синхрон звук — картинка|сдвиг|, мс
20 autocut30,5 — рез в плеере40 кадр
060

autocut ≤ 20 мс на планах ≥ 3 с · headless ≤ кадра · doc_cut 0 ± 2, ⛔ > 25; 30,5 — YTEVO02 v5

VMAF к прошлой версии0–⁠100
< 30 — другая картинка
0308593

≥ 93 не отличить · < 85 видно · < 30 — монтаж при том же звуке, не брак (video_tech_qc.py)

Контраст текста на экранеотношение к 1
2,69 — #F08010 по белому
136

lint 0, контраст ≥ 3 — sc_gfx check · screens2 check; YTLAB: 125 экранов переделаны

нормана гранибрак

20.2 · 5Методы проверки из сессий: ошибка → как нашли → как чиним → как проверяем теперь

Разбор 143 производственных сессий (июль — 3 октября 2026): 176 попаданий, 43 записи в sessions_errors.json. Здесь история и метод; норма — в чек-листе выше; переделки по шагам — на Процессе.

ОшибкаКак нашли → решениеПроверка теперьИсточник
Обрывы слов и запинки в фильме, 6 местклиент прислал таймкоды по v5 → правки указаниями сборки, сверка речи у стыков, страница «было → стало»; Роман: «сам транскрибируй, чтобы слова не резать»verify 3 + 3 слова у стыка · asr собранной речи до рендера; стыки на слухYTEVO02, 02.10
Шортс обрывает последнее слово «хорошо»Роман по файлу v2 → рез в смычке согласной, провал громкости принят за паузу; край — выравниванием по звукуedges [--fix]; edges.strict — render не стартуетYTFP01, 02.10
Экран спорит с речью: 5 направлений на презе, говорят про 6клиент → экран перерисованагент: count match, кадр + окно речи ±13 сYTEVO02, 02.10
«Лицо пересвет» дважды при светах кожи на целиРоман по готовому фильму → середина 56 %, разброс 13; экспозиция в логе до проявкикожа тремя числами, разброс ≥ ~15; варианты ±0,2 ст.YTLAB · YTCG, 02.10
«Лицо оч тёмное» после проявочных кубовРоман по скриншоту → витрина: уровень сцены 0…+3 по кадрам, числа против эталонного кадраlut_board по сценам → color_choice.jsonYTCH, 30.09
Цвет «плохо»: серое в зелень и синеву, кадр плоский, лицо тёмноеРоман по YTCH14 v3: «почему так плохо с цветокором… Измеряй по лицу, не уходи в зелёный или синий, контраст должен быть» → цепочка из 9 шагов; доска по сценам: варианты рядом, числа и флажки под кадром, ссылка # у каждого — «доска цвета — хорошо»мерки под каждым вариантом доски (color_lab.py): серое ±2, тень лица ≥ 0,74 середины, угол кожи 45–62°, размах ≥ 70 п.; v3: зелень в 8 сценах из 23 → v4: 3 флажка «плоско»YTCH14, 03.10
Много места над головой на крупныхголосовое клиента → наезд ×1,15 на крупные с камеры A; v6 рядом, пара кадров для сравненияглазами по листу планов; мера кодом — надо построитьYTEVO02 v7, 03.10
Шторка съедала ведущуюРоман по витрине → лица замерены детектором: 1557–2119 px, шов на 2112; сперва шов → 1500, потом Роман: «вместо спикера экран подвинул?» → шов 1920, кадр сдвигают под лицодетектор лиц на кадрах с панелями; split_x в профиле; сдвиг кадра (face_pos)YTUVI, 22.09
Скачок рамки на соседа, 12 кадров старой рамкилист рамки → дорожки лиц по склейке, имя дорожке целиком; render пишет ⚠ «мелькнул кадр»sheet — кадр из каждого куска; render ⚠ → statusYTFP01, 02.10
Знак ₽ уехал вниз на экране суммыРоман по витрине → кегль 700 px не мерился; кегль по файлу шрифта + nowrap. Первая «починка» вслепую не сработала, а отчёт ушёлзамер строки по шрифту; готовый HTML и кадр до рендера и до отчётаYTCH, 23.09
Мелкий текст на экранахРоман трижды: «крупным прямо», «в разы крупнее», «это для YouTube» → кегль по каналу, lower_scalesc_gfx check · screens2 check; кадры на 390 pxYTLAB 02.10 · YTUVIE 09
Элемент не у своего места («Step 1» показан в другом месте)Роман по v1 → элемент у шага, встаёт на слове; страница экранов до рендераплан экранов с кадрами; агент timingYTCG, 02.10
Лишняя графика: подложка на пол-экрана, финальная карточкаРоман по v2: «старый больше нравится», «в конце ничего не надо» → plain плашка, без end cardправило канала в плане экранов; 5–6 экранов стиля до вёрсткиYTCG, 03.10
Запретное слово в названии и описанииРоман после заливки («Сколково», «Russian-language») → правка на YouTube; слова-запреты в профиле каналаforbid на рендере и перед upload; описание глазамиYTTRBM, 01.10
Нет карты при упоминании мест; нет бренда на титре; нет QRРоман по кату v3 → таблица упоминаний мест (таймкод, контекст); титр с брендом; QR отдельным файломлист мест → экран на каждое; титр по канону; QR с UTMYTUVI, 01.10
Не все структурные элементы (часть, итог, призыв с лого)Роман: «все ли структурные элементы есть?» → список структуры канала с кадром-примером; недостающее — списком, ждать «да»структура на странице версии кадрами, на языке фильмаYTCG, 02.10
Отчёт без просмотра: замеры DOM вместо кадровРоман: «всегда делай скриншоты и сам смотри все» → скриншоты нашли четыре дефекта вёрсткивсе листы и карточки глазами на 1240 и 390YTUVI, 02.10

Строки сюда добавляет сессия, нашедшая ошибку; раз в неделю — прогон скрипта по выжимкам сессий (надо построить).

43 записи из сессий — по темам
кадр7
экраны и факты7
полнота7
процессне показал, не проверил, залил до «ок»6
цвет4
звук и голос4
слова и смысл4
техпаспорт и файл4

Подсчёт по sessions_errors.json: 43 записи, 8 тем. «Процесс» — не группа чек-листа, его строки — в «Проверках самой приёмки».

20.2 · 6Для фильма и для шортса

1Длинный фильм — обязательно
  • qc движка: кадры по листу, громкость, синхрон, чёрное, экраны; ⛔ останавливает cut.py run до deliver
  • собранная речь = лист (verify · asr) — до рендера, под замком моделей
  • паспорт yt_4k25; VMAF к прошлой версии — пока по вызову
  • листы всех планов и экранов глазами; страница версии «ок / править»
2Шортс — обязательно
  • edges: рез в паузе между словами; edges.strict — не собирать с резом внутри слова
  • render сверяет края, запреты, растяжение, мелькнувший кадр; --dry — план по секундам
  • sheet — кадр из каждого куска рамки; status — что на YouTube, запросом
  • upload до «ок» — нет; черновики файлами в 04_Shorts и Telegram
3Общее для обоих
  • мастер −14 ±1 LUFS, пик ≤ −1 dBTP; слово целиком на краю — по звуку, не по меткам Whisper
  • цвет бренда после кодирования, кожа тремя числами; факты и имена — агентом по канону
  • версия в имени, отчёт рядом с версией
  • кадр и полнота — по листам глазами: лицо, место над головой, титр, QR, конец по каналу
4Где команда однанадо построить
  • шортсы: shorts.py status собирает edges, render ⚠ и YouTube в один экран
  • фильм: qc движка + video_tech_qc — два вызова, один отчёт
  • одной команды на фильм и шортс нет: «звук = видео», ASR собранной речи и VMAF — в разных местах

20.2 · 7Как чек-лист растёт

1Как ошибка становится строкой
  • каждая проверка — после настоящей ошибки, с источником (проект, дата, слова Романа)
  • сначала норма числом и мерило, потом порог в движок и строка в README
  • нет мерила — строка всё равно есть: «глазами» или «надо построить»
  • проверок «на всякий случай» нет: они растят отчёт, не качество
2Где живёт список и кто обновляет
  • эта страница — одна таблица на все движки; пороги — в qc.py движков, edges.py, video_tech_qc.py
  • канон и память: video_qc_checklist.md, reference_video_qc_*; правила канала — профили
  • сессия, нашедшая ошибку, — в тот же день; раз в версию — прогнать и сравнить с прошлым отчётом
3Решает Романоткрыто
  • список Миши из чатов: у сессии чатов нет. Нужна ссылка на чат или экспорт — каждая ошибка войдёт строкой с источником «чат Миши»
  • VMAF к прошлой версии — ворота в движках или только на сдачах монтажёра
  • где лежит исправленная float-копия петлички — до правки кода звука
4💬 Моё мнение
  • одна команда приёмки на фильм и шортс одним отчётом ✓/⛔ — то же стоит в «Что дальше» Процесса
  • причина: сегодня это шесть вызовов в пяти папках; забытый вызов — YTEVO02
  • варианты: обёртка над движками или шаг qc в каждом по общему списку из одного файла

20.2 · 8Проверки самой приёмки

ПроверкаКогдаНормаОткуда взялась
Чек-лист прогнандо показа версиифильм — qc движка + паспорт; шортс — edges · render · sheet · statusYTTRBM v1 вышел до приёмки
Отчёт рядом с версиейпосле прогона08_Cut/qc_<tag>.json, autocut_v4/qc/, edges.json у заданияиначе «что проверяли?» не ответить
0 красных строкдо delivercut.py run падает на ⛔; render — на edges.strictворота этапа Cut
По собранному, не по исходникуречь и синхронраспознаётся dialog или мастер; синхрон — на готовом файлеYTEVO02: приёмка по исходнику пропустила обрывы
Модель — через очередьverify · asrmlx_queue.py, замок mlx.lock, память ≥ 30 %03.10 00:50: qc вне очереди на 497 %, нагрузка 52
Листы просмотрены всепосле рендеракаждый лист планов и экранов; скриншоты страницы 1240 и 390YTLAB: окна общих планов
Регрессия прошлой версиисо второй версиикаждая правка: ✅ / ❌ / ⚠; озвучка — по новому транскриптуYTRF v3 → v4
Кадр и полнота глазамипосле рендера, по листамлицо в окне и по третям, место над головой, титр при первом появлении, QR, конец по каналуYTEVO02 v7 · YTUVI v3
Ошибки из сессий собраныраз в неделю · при новой страницевыжимки сессий → sessions_errors.json → строка с источником; пока разовый скрипт — надо построитьРоман 03.10: «проанализируй все сессии с ошибками и решениями»

20.2 · 9Что обновляет базу знаний

ФайлЧто хранитКто пишет
эта страница · kb_claude.jsonодин чек-лист: норма, чем, источниксессия, нашедшая ошибку
999_extra/video_qc_checklist.md11 пунктов, пайплайн агентов, грабли свипаканон с 05.06.2026
qc_<tag>.json · verify_<tag>.json · qc_asr_<tag>.jsonотчёт версии: ✓/⛔, числа, листы, стыкиqc.py движков, verify.py, sc_qc
edges.json у задания шортсовсверенные края; не пересчитывается, пока границы те жеshorts.py edges · render
17_audio/standard.pyчисла звука — одно местоэтап звука; движки читают
YTs/{CH}/review_profile.json · shorts_profile.jsonstructure_rules, forbid, edges.strict, plate.secondsРоман словами → сессия в профиль
память reference_video_qc_*, feedback_*источники строк: слова Романа, цена ошибкисессия в день события
sessions_errors.json · scan_sessions.pyошибка · как нашли · решение · проверка теперь (43 записи, 8 тем); источник таблицы «Методы»скрипт по выжимкам сессий; регулярно — надо построить

20.2 · 10Ошибки и грабли самой приёмки

ASR куска «доказал», что слово целоеWhisper дописывает оборванное слово («…мир во» → «вокруг»); проверять собранный звук с метками резов и выравниванием по звукуYTEVO02 v6
Adversarial verify слишком скептичен для смыслаdefault real=false рационализирует верные находки; для смысловых слово Романа выше, verify — второе мнение, не воротаYTAgeFree, 03.07.2026
Vision-свип галлюцинируетпутал должность, год, написания; истина — deep-read по хи-рез кадру + verify; opus читает кириллицу точнее; лого-бэйдж канала не флагатьYTRF v4
Проверка по исходнику или по лёгкой копииlight.py не сверяет звук с картинкой, рез плеера даёт 30,5 мс — финал только сборкой, QC только по мастеруYTEVO02 v5
Замок моделей занятпроверка речи снята по лимиту 30 мин и ушла за рендер; модель мимо очереди грузит мак. Приёмка — через mlx_queue и очередь рендераYTCR, 03.10
VMAF ≈ 0 на участке — «брак»это монтаж при том же звуке: кадры < 30 — в other_picture. --roi auto без субтитров ищет полосу по чужому тексту — ROI рукамиYTCH, 28–29.09
Шесть кадров скачок рамки не ловятпрыжок на соседа виден только на листе с кадром из каждого куска; мелькнувший кадр ловит сам renderYTTRBM · YTFP01
Текст за головой — не ошибкау YTUVI текст на слоях за ведущей — стиль канала; агент layout и ревью это не флагаютYTUVI, 01.10

20.2 · 11Команды

Приёмка фильма по движкам
# $V = .venv_transcribe/bin/python · $P = проект · $X = 999_extra · $AC/$HC/$DC/$SC = 0510_autocut / 0510_headless_cut / 0511_doc_cut / 0511_story_cut
$V $AC/qc.py --project $P --file ФИЛЬМ.mp4 [--only frames,loud,sync,cuts,screens,black]  # autocut: autocut_v4/qc/qc_<файл>.json, выход 1 при красном
$V $HC/cut.py run --job J --tag <tag> --from qc  # headless: шаги qc → deliver; ⛔ останавливает сдачу
$V $HC/qc.py run --job J --edl edl.json --file film.mp4 --tag <tag> [--no-tech]  # кадр-в-кадр, синхрон, чёрное, громкость, паспорт, листы; qc.py plan — листы планов до рендера
$V $DC/qc.py final --job J --tag v1  # doc_cut: 08_Cut/qc_<tag>.json + final_NN.jpg, final_gfx_NN.jpg
$V $SC/sc_align.py audit <проект>  # story_cut: резы вне паузы — ждём 0
python3 $X/mlx_queue.py <кто> -- $V $SC/sc_qc.py asr <проект>  # собранная речь против листа; sc_qc.py joins — стыки вплотную
python3 $X/mlx_queue.py <кто> -- $V $HC/verify.py --job J --edl edl_audio.json --wav dialog_<tag>.wav --tag <tag>  # 3 + 3 слова у каждого стыка
python3 $X/video_tech_qc.py run ФИЛЬМ.mp4 --profile yt_4k25 --out DIR --ref ПРОШЛАЯ.mp4 [--ocr --roi 0:0.72]  # паспорт + VMAF; профили yt_4k25 · yt_1080p25 · yt_short1080
Приёмка шортса
# $SH = 07_shorts/0701_finished · задание 00_Setup/07_Shorts/<CODE>_shorts_job.json
$V $SH/shorts.py edges --job J [--fix] [--only S02]  # край по словам; --fix переносит рез
$V $SH/shorts.py render --job J --version N [--dry]  # сверяет края, запреты, растяжение, мелькнувший кадр; --dry — план по секундам
$V $SH/shorts.py sheet --job J · check --job J · find4k --job J  # лист рамки · мастер против эталона · поиск 4K
$V $SH/shorts.py status --job J [--offline]  # что готово и что на YouTube; ⚠ render повторяются здесь
$V $AC/shorts_master.py --project $P verify  # чистый мастер фильма для шортсов: сдвиг речи ≤ 2 мс

20.2 · 12Где лежит

Чек-лист и техпаспорт
~/YTAI/scripts/999_extra/video_qc_checklist.md11 пунктов экранного QC, пайплайн агентов, грабли
~/YTAI/scripts/999_extra/video_tech_qc.pyпаспорт YouTube, VMAF, звук, OCR; _README.md рядом; review_contact_sheets.py
Приёмка в движках
~/YTAI/scripts/05_editing/0510_autocut/qc.pyframes · loud · sync · cuts · screens · black; screens_verify.py, light.py, shorts_master.py
~/YTAI/scripts/05_editing/0510_headless_cut/qc.pyкадр-в-кадр, синхрон, detect, паспорт, листы; verify.py; cut.py — шаг qc
~/YTAI/scripts/05_editing/0511_doc_cut/qc.pyfinal · sheets; verify.py, align.py — речь по репликам
~/YTAI/scripts/05_editing/0511_story_cut/sc_qc.pyasr · joins; sc_align.py audit, sc_sheet.py, sc_dedup.py
~/YTAI/scripts/07_shorts/0701_finished/edges.pyкрай по словам; shorts.py, render.py — ⚠ кадра
Отчёты в проекте
{project}/00_Setup/08_Cut/qc_<tag>.jsonheadless и doc_cut; verify_<tag>.json, qc_asr_<tag>.json; листы в 08_Cut/qc/
{project}/00_Setup/07_Shorts/edges.jsonсверенные края шортсов; задание и отбор рядом
Правила каналов и память
~/YTAI/YTs/{CH}/review_profile.jsonstructure_rules, rules_text; shorts_profile.json — forbid, edges.strict; память reference_video_qc_*
Чек-лист целостности · сверено 03.10.2026 · примеры: YTEVO02 (обрывы слов нашёл клиент, место над головой) · YTFP01 (рез внутри слова, скачок рамки)