Дорожки сходятся на странице версии до рендера (План экранов). Машина доводит дорожку до числа; последний узел — человек.
Правило попадает сюда только после настоящей ошибки и живёт втроём: слова Романа в памяти → строка чек-листа с мерилом → порог в коде.
Пример: «хоро|шо» в YTFP01 (02.10.2026) → edges.strict в профиле канала → строка «Звук и рез» ниже.
| Правило | Откуда (проект, дата) | Чем проверяет машина | Подробности |
|---|---|---|---|
| Край — выравниванием текста по звуку (CTC), не по меткам Whisper: метки рано на 85–570 мс, первое слово растянуто в тишину | YTEVO03, 27.09.2026: ~40 % краёв плохие; YTCR04, 02.10: ~45 кусков из 229 без последнего слова | shorts.py edges [--fix] · sc_align.py edges (MMS_FA) · doc_cut align.py — Whisper заново ±4 с | Ingest |
| Рез — в паузе между словами, на границе кадра: конец куска — первая пауза после своего слова, начало — последняя перед ним; фейд не длиннее тишины | YTFP01, 02.10.2026: «хоро|шо», «молод|цы», хвост «-тей» — два шортса из пяти | edges: воздух после ≤ 0,30 с, до ≤ 0,15; к чужому слову не ближе 0,05; edges.strict — рез внутри слова не собирается | Shorts |
| Провал громкости — не пауза: смычка согласной даёт 40–110 мс тишины внутри слова | YTFP01: первые версии резали по провалам | edges.py: огибающая двух полос (шипящие +12 дБ); буква, отделённая тишиной > 0,15 с, — не из слова | Ingest |
| Повторное распознавание куска ничего не доказывает — Whisper дописывает оборванное слово; проверять собранную речь, которую услышит зритель | YTEVO02 v6, 02.10.2026: обрывы 11:29 и 15:07 прошли приёмку, нашёл клиент | sc_qc.py asr · headless verify.py (3+3 слова у стыка, < 5 из 6 → ⚠) · doc_cut verify.py | Фильм кодом |
| Мерило края — audit: ноль резов вне паузы | YTCR04: 0 из 458 краёв | sc_align.py audit печатает каждый рез не в паузе с причиной | Story |
| Конец куска — конец этой же мысли; слушать, что звучит после реза; чужая реплика внутри единицы — ошибка | YTEVO02, 02.10.2026: реплика Дарьи между фразами Анастасии; шортсы с чужой мыслью в конце | на слух по сводке sc_qc.py joins; кодом — надо построить | Чек-лист |
| На часовой записи фразы сдвинуты на 1–7 с — якоря в местной расшифровке; звук режется до сэмпла, финал — только сборкой | YTCH14, 02.10.2026; YTEVO02 v5: обрезка в плеере — звук позже на 30,5 мс | doc_cut align.py memex (84 куска за 6 мин) · story.py resolve ⛔ якорь не найден | Звук |
| Правило | Откуда (проект, дата) | Чем проверяет машина | Подробности |
|---|---|---|---|
| Листы кадров всех планов смотреть все — не выборку и не замеры вместо глаз: экраны на кадрах, кадр каждого плана, готовый файл | YTLAB01, 02.10.2026: окна общих планов режут человека — нашлось на листе; правило скриншотов Романа | sc_sheet.py cuts · gfx · shorts.py sheet · листы final_* doc_cut · qc.py frame_check | Чек-лист |
| Спикер — по центру видимой части кадра (правее панели, в окне холста); поля слева и справа равны — замером силуэта, не на глаз | YTCG37 v3, 03.10.2026: кадр по точке между глаз — центр уезжал на 64 px (медиана, до 354) 4K; образец анализа — страница YTCG37 v4 «Кадрирование по замеру» (03.10 04:33): правило, что вышло, все 36 планов v3 → v4 числами ← → ↑ px и парами кадров | solo.py silhouette (Apple Vision) → frame_fit; headless director.py figure_x — центр фигуры за весь срок | Фильм кодом |
| Место над головой — постоянная доля высоты: крупный 6 %, средний 8,5 %, окно 6 % (в v4 — 7,5 %); упёрлись в край исходника — наезд до +0,3, не сдвиг | YTCG37 v3: 14–26 % над головой; YTEVO02 v7, 03.10.2026: наезд ×1,15 — клиент: «меньше места над головой» | frame_fit — поля по верху тела; autocut: zoom в directives; «было → стало» на странице; таблица всех планов с числами ← → ↑ — на странице версии | Фильм кодом |
| Окно спикера и панель не режут лицо: окно общего плана — по лицам | YTLAB01: человек выходил за окно — 7 из 109 планов | headless director.py reframe — win по лицам; gfx.py mock — экран на кадре фильма | Экраны кодом |
| Крупность: говорит один — его крупный план; каждый стык звука закрыт сменой крупности, перебивкой или общим планом; крупный дольше 22 с разбавляется; наезд ×1,12 — крайний способ | YTCG37: незакрытый стык дублей — plan падает; YTCH11, 26.09.2026: монолог в одном кадре — кадр меняется «как у Дудя» | director.py plan (PUNCH 1,12; LONG_CU 22 с); solo.py plan падает на незакрытом стыке | Story |
| Рамка шортса — по лицу и без скачков, дорожками лиц; разделённый кадр — лицо по центру верхней части | YTFP01 v1: 12 кадров нового ракурса со старой рамкой; YTTRBM01: из 1080p ×1,78–2,37 — мягко | render: дорожка ≥ 12 % замеров; рамка в пределах 70/50 px, не чаще раза в 1,2 с; ⚠ «мелькнул кадр»; > ×1,25 → ⚠; crop.headroom 0,36 — центр лица (YTEVO02 — 0,31) | Shorts |
| Кожа тремя числами, не одними светами: тень (p20) · середина · света, разброс ≥ ~15 пунктов | YTLAB01 и YTCG37 v1, 02.10.2026: «лицо пересвет» при светах на цели | доска цвета и check движков; принято: середина 38–41, света 56–62 % | Цвет |
| Правило | Откуда (проект, дата) | Чем проверяет машина | Подробности |
|---|---|---|---|
| Показывать предмет рассказа в те моменты, когда о нём говорят; говорящая голова без тех, о ком речь, историю не передаёт | YTFP01, 02.10.2026: «показывать прям в эти моменты деток крайне важно» | picks: поле broll — начало ≥ broll.from, длина ≥ 1,0 с, без наложений; render --dry — план по секундам | Shorts |
| Кадр — к фразе, не «для красоты»: «у нас уши» — импланты крупно; кадр, который фразе противоречит, хуже говорящей головы | YTFP01; YTAgeFree01, 03.07.2026: ложка у рта при словах «не торопить» | агент по кадру и речи ±13 с (context · count · timing · missing-viz); глазами | Чек-лист |
| Герой под «я» — только он сам; чужой человек годится там, где речь о «них» | YTCR04, 02–03.10.2026: каталог зрения назвал коллегу героем — 12 мест под «я» | SFace с эталонами face_finder/refs_*.npy (HERO_SIM 0,30; ложные 0,42–0,54 — глазами) · sc_sheet.py cuts | Ingest |
| Каталог кадров — по склейкам мастера, листами; свои съёмки первыми; каталог зрения «что в кадре» — указатель, не гейт | YTCR04: VLM путает людей; YTCR01: немые сцены без транскрипта терялись | scout.py cuts → sheets → strip → faces → crop; sc_prep.py → broll_catalog.md; Qwen2.5-VL на Memex | Ingest |
| Один кадр исходника не мелькает дважды; повторы снимает код, не глаз | YTCR04: 104 пары повторов — восемь помощников брали те же лучшие кадры | sc_dedup.py fix (MARGIN 1,0 с, FAR 4 мин; dedup_log.md); шортсы — занятые кадры в broll/README.md | Story |
| Запретные участки не берутся ни куском, ни перебивкой: красная линия канала, чужой материал | YTFP01: мультфильм и песня в выпуске — претензия Content ID | keep_out в задании (scope all · pieces · broll): picks и render останавливаются | Shorts |
| Первый кадр — на говорящем; кусок не открывать перебивкой; пауза после пика — молчание героя, не город с прохожими | YTFP01 v1: плашка героини легла на педагога из перебивки | broll.from в профиле; plate_from в отборе; плашка гаснет со сменой кадра | Shorts |
| Правило | Откуда (проект, дата) | Чем проверяет машина | Подробности |
|---|---|---|---|
| Цифра в речи — инфографика, которая делает её видимой: сетка точек, счётчик, шкала, доля — на словах; не список; служебных меток в кадре нет | YTEVO02, 02.10.2026: «Двое из 60» стояло списком — «крайне важно создать сильную инфографику» | момент из *.words.json; образец — t_hero60 в screens2.py; несверенное — на странице | План экранов |
| Карта — инфографика на слова: только то, что герой называет (маршрут, место, страна); линии рисуются на глазах; неназванный город не ставить (Khartoum → Sudan) | YTCR04; YTCG37, 02–03.10.2026: «карты делать как в YTCR04, стиль YTCG» | sc_geo.py: Natural Earth 1:50m + берег Дубая OSM («© OpenStreetMap»), виды map_route · map_place · map_world · map_dubai; ytcg_geo.py: 1:10m, world · uae, zones | Экраны кодом |
| Интерфейсы и документы — перерисовка реальных образцов: гуглим скриншот или бланк → рисуем своё в языке канала, без чужих логотипов и персональных данных; факты сверяет клиент | Роман, 03.10.2026: «гугли и показывай интерфейсы реальные, перерисовывать реальные карточки и документы»; YTCG37 v3: документы ждут образцов клиента | есть: ui_email, ui_social (YTCR, стилизованные); YTCG kind: docs · doc — условные DOC_ART без гербов. По реальным образцам — надо построить | Экраны кодом |
| Язык клиента, не «как у нас»: YTEVO — Bounded капсом + Inter, #0F0F11 / #F1F1EE / #EE3227, плоско — без свечений, частиц, 3D и отскоков | YTEVO пилот, 02.10.2026: Gilroy на navy из профиля — второй набор из 47 экранов | палитра и шрифты тома (screens2.py); 5–6 кадров стиля на кадрах фильма до вёрстки всех; «ок» Романа | Экраны кодом |
| Хук не заслонять: живые лица, холст во весь кадр не ставить, подпись не с первой секунды; вступление гостя — боковая панель; ИИ датировать годом интервью; Романа не рекламировать | YTLAB01 v3, 02.10.2026: «по состоянию на 2025 год», «не надо меня искать» | layout: 'side' в gfx.py; asof на экранах; страница всех экранов до рендера | План экранов |
| Элемент стоит у своего шага и встаёт на слове спикера; части ролика видны; плашка снизу — поверх кадра, без колонки на пол-экрана; в конце ролика графики нет | YTCG37 v1–v2, 02–03.10.2026: «она говорит Step 1, а ты показываешь в другом месте»; «в конце ничего не надо» | транскрипт по блокам на странице плана — экран сверяется по словам; plain в ytcg.py; глазами | План экранов |
| Смысловой слой: экран не противоречит речи, не показывает больше, чем сказано, не опаздывает; показуемое не идёт голой головой; «или/или» — не ↔; призыв — «шторка» с QR с UTM | YTAgeFree01, 03.07.2026; YTCH14, 02.10.2026: призыв как YTFP P11; YTUVI01, 01.10: «QR с ютуб-номерами» | агент: кадр + речь ±13 с, дыры ≥ 16 с; doc_cut gfx split: zbarimg читает QR обратно, иначе ⛔; без письма фонда — ⛔ | Чек-лист |
Сводный лист по ремёслам; рендер — после ответа Романа на странице плана или объявленного умолчания, правка после рендера — новая версия. Пороги целиком — Чек-лист.
| Ремесло | Что гонять | Норма | Откуда взялась |
|---|---|---|---|
| Звук и рез | sc_align.py audit · shorts.py edges · ASR собранной речи (sc_qc.py asr, verify.py) | 0 резов вне паузы; воздух ≤ 0,30 / 0,15 с; 0 потерянных слов | YTFP01 — два шортса из пяти; YTEVO02 — обрывы нашёл клиент |
| Кадр | листы планов и экранов · solo.py silhouette · shorts.py sheet · скриншоты 1240 и 390 | силуэт по центру, поля равны, над макушкой 6–8,5 %; каждый кадр просмотрен | YTCG37 v3 — центр уезжал на 64 px (медиана); YTLAB01 — окна режут лицо |
| Перебивки | sc_sheet.py cuts + SFace по эталону · sc_dedup.py report · picks, render --dry | чужих лиц под «я» нет; повторов 0; keep_out не задет | YTCR04 — коллега под «я», 104 пары повторов |
| Визуализация | страница версии со всеми экранами и транскриптом · check тома · zbarimg для QR | типы и стиль «ок» до вёрстки; lint 0, контраст ≥ 3; экран на слове | YTLAB01 — 125 экранов переделаны; YTCG37 — экран не у шага |
провал громкости — не пауза: смычка согласной даёт 40–110 мс тишины внутри слова («хоро|шо»); буква за тишиной дольше 0,15 с — уже не из слова
выше порога — всё равно глазами: похожие типажи дают 0,42–0,54
Числа — edges.py (AIR_END, AIR_START, GUARD) и таблицы выше. Поля кадра и место над головой — отдельная страница Спикер в центре.
Карта, не каталог: версии и замки — Machine Stack, навыки — Channel Screens.
| Ремесло | Инструмент в коде | Модель или навык | Где описано |
|---|---|---|---|
| Звук и рез | edges.py (шортсы) · sc_align.py, sc_qc.py · doc_cut align.py, verify.py | CTC: MMS_FA, wav2vec2-xlsr-ru, 960H; mlx-whisper для ASR сборки; замок mlx.lock | Ingest · Звук |
| Кадр | shorts.py sheet · sc_sheet.py · director.py, qc.py frame_check · solo.py silhouette · face_finder/ | YuNet (лица), SFace (кто), Apple Vision vision_person (силуэт); кадры экранов — chrome-headless-shell | Фильм кодом · Чек-лист |
| Перебивки | scout.py · sc_dedup.py · sc_prep.py · keep_out в job.py | Qwen2.5-VL-7B на Memex — каталог; SFace с refs_*.npy — герой; выбор пишут агенты Claude, код проверяет | Story · Shorts |
| Визуализация | тома HyperFrames: screens2.py, sc_gfx.py + sc_geo.py, ytcg.py + ytcg_geo.py, doc_cut gfx.py; в 999_extra — remotion/, infographic/ | навыки hyperframes (general-video, talking-head-recut, motion-graphics), remotion-*, infographic; карты — Natural Earth и OSM | Экраны кодом · Channel Screens |
| Файл | Что хранит | Кто пишет |
|---|---|---|
| память: reference_whisper_word_edges_unreliable · feedback_speaker_centered_measured · feedback_shorts_show_subject_broll и соседние | правила ремёсел словами Романа, с проектом и датой | сессия сразу после правки или ошибки |
README движков «Каноны», «Грабли»; 0701_finished/README.md «Перебивки» | как теперь делаем и что стоило времени | сессия тем же коммитом, что и порог |
YTs/{CH}/shorts_profile.json: edges.strict · broll.from · plate; задание выпуска: keep_out, crop.headroom | правила канала для кода; факты дня съёмки — в задании, не в профиле | сессия по решению Романа, причина в *_note |
999_extra/face_finder/refs_*.npy · YTs/{CH}/{CH}_voices.json | эталоны лица и голоса героя | сессия по кадрам, где герой точно он; глазами |
docs/BRIEF_edl.md · PICKS_PROMPT.md · review_profile.json → structure_rules | правила агентам: как резать, где кадры, что нельзя | сессия после каждого прогона — грабли помощников |
Каждая стоила версии фильма или партии шортсов.