qc_<tag>.json лежит рядом с версией, ворота — 0 красных строк. Чего код не умеет, проверяем глазами или на слух — и так и пишем.qc_<tag>.json лежит рядом с версиейСводка столбца «Чем и как» семи таблиц ниже: код — порог в движке, агент — Claude по кадру и речи, глазами и на слух — человек.
| Группа | Код | Агент | Глазами | На слух | Надо построить |
|---|---|---|---|---|---|
| Цвет | ✓ | ✓ | ✓ | · | — |
| ЗвукНадо построить: звук = видео у шортсов | ✓ | · | · | ✓ | звук = видео у шортсов |
| Слова и смыслНадо построить: смысл и динамика на стыке | ✓ | ✓ | ✓ | ✓ | смысл и динамика на стыке |
| КадрНадо построить: ракурс при смене камеры | ✓ | ✓ | ✓ | · | ракурс при смене камеры |
| Полнота | ✓ | ✓ | ✓ | ✓ | — |
| Экраны | ✓ | ✓ | ✓ | · | — |
| Техпаспорт | ✓ | · | ✓ | · | — |
«На слух» в полноте — музыка по блокам; «глазами» в техпаспорте — лист рамки шортса и проверка YouTube. Ни одна группа не держится только на коде.
Одна строка на проверку: код — порог в движке, агент — Claude по кадру и речи, глазами / на слух — человек; «надо построить» — кода ещё нет.
| Цвет | Норма | Чем и как | Источник |
|---|---|---|---|
| Гамма известна, куб тот самый | refused пуст — незнакомая гамма это отказ; sha256 куба = манифест | код: color_apply (--verify) · solo develop_for · sc_color plan | YTEVO: 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 detect | FX3 утром писал ноль в L |
| Звук = видео по длине | фильм: ± 0,08 с; шортсы — надо построить | код: doc_cut qc final | хэндофф «Что дальше» |
| Слова | Норма | Чем и как | Источник |
|---|---|---|---|
| Край в паузе между словами | воздух после последнего слова ≤ 0,30 с, перед первым 0,15; не ближе 0,05 с к чужому; рез на границе кадра; смычка 40–110 мс — не пауза | код: shorts.py edges [--fix] (CTC) · sc_align.py audit (0 резов вне паузы) · doc_cut align.py | YTFP01 v2: «хоро|шо», «молод|цы»; YTCR: ~45 кусков из 229 без последнего слова |
| Собранная речь = лист | распознать то, что услышит зритель; 0 потерь на краях; у стыка 3 + 3 слова, < 5 из 6 → флаг | код под замком моделей: headless verify.py · sc_qc asr · doc_cut verify.py | YTEVO02 v6: обрывы на 11:29 и 15:07 нашёл клиент |
| Смысл и динамика не обрезаны | конец куска — конец этой же мысли; слушать, что звучит после реза | на слух: sc_qc joins → слушать стыки; надо построить | Роман 03.10: «не обрезаем ли смысл или динамику» |
| Герой под «я» — только он | чужих лиц и чужой мысли в единице нет; повторы перебивок сняты (104 → 34) | глазами: sc_sheet cuts · clip; код: sc_dedup fix | YTCR: каталог назвал героем коллегу |
| Правила канала о структуре | блок фонда не раньше 34-й минуты, кусок куратора ≤ 90 с; последний звук — героя | код: review_profile.json → structure_rules | YTCH: первая сборка — фонд 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 px | YTLAB 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; verify | YTAgeFree 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 пунктов экранного QC | grammar · typography · bullets · layout · color · names · titles · brands · facts · meaning · consistency; 🔴 / 🟡 / 🟢 | агент: кадры fps=1 → листы 4×4 → свип → deep-read по хи-рез кадру → verify | YTRF 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 check | YTLAB: 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 | дыра в листе тянула экран до конца |
| Паспорт YouTube | H.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 · check | YTTRBM: ×1,78–2,37, мягко |
| Мелькнувший кадр, рамка, плашка | ⚠ «мелькнул кадр» в render и status; лист с кадром из каждого куска рамки; плашка — крупный план + речь ≥ 1 с | код: render → status; код + глазами: sheet | YTFP01 v1: 12 кадров старой рамки; плашка на педагоге |
| Версия и YouTube | файл версии лежит или залит — отказ (--force); upload после «ок»; status: вышел · по ссылке · ⚠ приватный · ⚠ не в графике | код: render · status; человек | Роман 02.10: «не надо заливать до согласования» |
Числа из чек-листа выше: где норма, где на грани, где брак.
норма ±2, «зелень» — a < −2 (color_lab.py); YTCH14 v3 → v4
«синева» — b < −3; тепло заката оставляем на 70 % — не брак
≥ 74 % — норма; < 66 % — «жёсткая тень на лице»
< 45 — «кожа красная», > 62 — «жёлтая»; насыщенность 12–26
«плоско» — размах < 70 п. (цветы v3: 14–78 %); «зажаты тени» — > 2,5 % кадра ниже 1,5 %
−14 ±1 · пик ≤ −1 dBTP · LRA ≤ 8 (doc_cut: пик ≤ −0,9) — qc.py, 17_audio/standard.py
autocut ≤ 20 мс на планах ≥ 3 с · headless ≤ кадра · doc_cut 0 ± 2, ⛔ > 25; 30,5 — YTEVO02 v5
≥ 93 не отличить · < 85 видно · < 30 — монтаж при том же звуке, не брак (video_tech_qc.py)
lint 0, контраст ≥ 3 — sc_gfx check · screens2 check; YTLAB: 125 экранов переделаны
Разбор 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.json | YTCH, 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 ⚠ → status | YTFP01, 02.10 |
| Знак ₽ уехал вниз на экране суммы | Роман по витрине → кегль 700 px не мерился; кегль по файлу шрифта + nowrap. Первая «починка» вслепую не сработала, а отчёт ушёл | замер строки по шрифту; готовый HTML и кадр до рендера и до отчёта | YTCH, 23.09 |
| Мелкий текст на экранах | Роман трижды: «крупным прямо», «в разы крупнее», «это для YouTube» → кегль по каналу, lower_scale | sc_gfx check · screens2 check; кадры на 390 px | YTLAB 02.10 · YTUVIE 09 |
| Элемент не у своего места («Step 1» показан в другом месте) | Роман по v1 → элемент у шага, встаёт на слове; страница экранов до рендера | план экранов с кадрами; агент timing | YTCG, 02.10 |
| Лишняя графика: подложка на пол-экрана, финальная карточка | Роман по v2: «старый больше нравится», «в конце ничего не надо» → plain плашка, без end card | правило канала в плане экранов; 5–6 экранов стиля до вёрстки | YTCG, 03.10 |
| Запретное слово в названии и описании | Роман после заливки («Сколково», «Russian-language») → правка на YouTube; слова-запреты в профиле канала | forbid на рендере и перед upload; описание глазами | YTTRBM, 01.10 |
| Нет карты при упоминании мест; нет бренда на титре; нет QR | Роман по кату v3 → таблица упоминаний мест (таймкод, контекст); титр с брендом; QR отдельным файлом | лист мест → экран на каждое; титр по канону; QR с UTM | YTUVI, 01.10 |
| Не все структурные элементы (часть, итог, призыв с лого) | Роман: «все ли структурные элементы есть?» → список структуры канала с кадром-примером; недостающее — списком, ждать «да» | структура на странице версии кадрами, на языке фильма | YTCG, 02.10 |
| Отчёт без просмотра: замеры DOM вместо кадров | Роман: «всегда делай скриншоты и сам смотри все» → скриншоты нашли четыре дефекта вёрстки | все листы и карточки глазами на 1240 и 390 | YTUVI, 02.10 |
Строки сюда добавляет сессия, нашедшая ошибку; раз в неделю — прогон скрипта по выжимкам сессий (надо построить).
Подсчёт по sessions_errors.json: 43 записи, 8 тем. «Процесс» — не группа чек-листа, его строки — в «Проверках самой приёмки».
cut.py run до deliveryt_4k25; VMAF к прошлой версии — пока по вызовуedges: рез в паузе между словами; edges.strict — не собирать с резом внутри словаrender сверяет края, запреты, растяжение, мелькнувший кадр; --dry — план по секундамsheet — кадр из каждого куска рамки; status — что на YouTube, запросомupload до «ок» — нет; черновики файлами в 04_Shorts и Telegramshorts.py status собирает edges, render ⚠ и YouTube в один экранvideo_tech_qc — два вызова, один отчётqc.py движков, edges.py, video_tech_qc.pyvideo_qc_checklist.md, reference_video_qc_*; правила канала — профили| Проверка | Когда | Норма | Откуда взялась |
|---|---|---|---|
| Чек-лист прогнан | до показа версии | фильм — qc движка + паспорт; шортс — edges · render · sheet · status | YTTRBM v1 вышел до приёмки |
| Отчёт рядом с версией | после прогона | 08_Cut/qc_<tag>.json, autocut_v4/qc/, edges.json у задания | иначе «что проверяли?» не ответить |
| 0 красных строк | до deliver | cut.py run падает на ⛔; render — на edges.strict | ворота этапа Cut |
| По собранному, не по исходнику | речь и синхрон | распознаётся dialog или мастер; синхрон — на готовом файле | YTEVO02: приёмка по исходнику пропустила обрывы |
| Модель — через очередь | verify · asr | mlx_queue.py, замок mlx.lock, память ≥ 30 % | 03.10 00:50: qc вне очереди на 497 %, нагрузка 52 |
| Листы просмотрены все | после рендера | каждый лист планов и экранов; скриншоты страницы 1240 и 390 | YTLAB: окна общих планов |
| Регрессия прошлой версии | со второй версии | каждая правка: ✅ / ❌ / ⚠; озвучка — по новому транскрипту | YTRF v3 → v4 |
| Кадр и полнота глазами | после рендера, по листам | лицо в окне и по третям, место над головой, титр при первом появлении, QR, конец по каналу | YTEVO02 v7 · YTUVI v3 |
| Ошибки из сессий собраны | раз в неделю · при новой странице | выжимки сессий → sessions_errors.json → строка с источником; пока разовый скрипт — надо построить | Роман 03.10: «проанализируй все сессии с ошибками и решениями» |
| Файл | Что хранит | Кто пишет |
|---|---|---|
эта страница · kb_claude.json | один чек-лист: норма, чем, источник | сессия, нашедшая ошибку |
999_extra/video_qc_checklist.md | 11 пунктов, пайплайн агентов, грабли свипа | канон с 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.json | structure_rules, forbid, edges.strict, plate.seconds | Роман словами → сессия в профиль |
память reference_video_qc_*, feedback_* | источники строк: слова Романа, цена ошибки | сессия в день события |
sessions_errors.json · scan_sessions.py | ошибка · как нашли · решение · проверка теперь (43 записи, 8 тем); источник таблицы «Методы» | скрипт по выжимкам сессий; регулярно — надо построить |
# $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 мс