Вход — фильм vN после «ок» и ЦА канала. Шаги 1, 2 и 6 — сессия Claude, 3–5 и 8 — машина, 7 — Роман.
В YTLAB01 три раунда за ночь: сборка из кадров (v1–v3) → ChatGPT «минимум элементов» (v4) → ChatGPT «сначала дизайн» (v5, выбрана B, стоит на ролике 05.10 01:08). Старый путь vidIQ — /kb/thumbnail/: когда исходников 4K нет.
Четыре картинки одного варианта — от кадра исходника до рисунка ChatGPT. Лица на рисунке — те же вырезки, переосвещённые.

$V frames4k.py --job $JOB --only R_C
segment f4k/R_C.png R_C_person.png R_C_subject.png
$V make_sample.py --job $JOB --only B --tag v3
gpt_draw.sh $GPT $GPT/prompt_B_design.txt @$GPT/in/B/inputs.txtВремя фильма — v6 (с хуком «Тизер», сдвиг +5,04 с от v5). Исходник Романа — cam2, Павла — cam3; номер кадра общий, потому что три камеры пишет один рекордер синхронно.
Рамка лица — Apple Vision (faces) по готовым файлам, % высоты кадра 720, варианты A–C с двумя лицами (у портрета D — 36–38 % во всех раундах). В ТЗ просим голову ≈ 45 %; рамка лица меньше головы.
Промежуточный раунд v4 — ChatGPT по ТЗ «минимум элементов», с плашкой: лицо 27–31 %, Роман: «почему так слабо с точки зрения дизайна?».

$V make_sample.py --job $JOB --tag v3
$V make_sample.py --job $JOB --tag v3
$V make_sample.py --job $JOB --tag v3
$V make_sample.py --job $JOB --tag v3
gpt_draw.sh $GPT prompt_X_simple.txt …
gpt_draw.sh $GPT prompt_X_simple.txt …
gpt_draw.sh $GPT prompt_X_simple.txt …
gpt_draw.sh $GPT prompt_X_simple.txt …
gpt_draw.sh $GPT prompt_X_design.txt …
gpt_draw.sh $GPT prompt_X_design.txt …
gpt_draw.sh $GPT prompt_X_design.txt …
gpt_draw.sh $GPT prompt_X_design.txt …Каждое правило стоило круга в кейсе YTLAB01 (04–05.10.2026).
| Роман | Что это значит для этапа |
|---|---|
| «а где моя обложка? ты тз делал чтобы сделать» | этап сдаёт готовые картинки, ТЗ — внутренний шаг |
| «нужен больше фокус на ЦА — компании, у которых есть свои ютуб-каналы и они не знают, что с ними делать» | фраза — в боль ЦА, а не про тему вообще: «КАНАЛ ЕСТЬ — 10 ПРОСМОТРОВ?», «ВАШ КАНАЛ — ПОМОЙКА?» |
| «должно быть понятно, что мы про ютуб-каналы для компаний» | маркер темы в каждой фразе: «КАНАЛ КОМПАНИИ» + логотип YouTube |
| «гости смотрят в разные стороны… они должны смотреть друг на друга» | взгляды сходятся; не совпало с рассадкой в студии — зеркалить вырезки |
| «перегруз… не видна общая превью» | на обложке ≤ 4 элементов; на странице выбора первый экран — только обложки |
| «почему так слабо с точки зрения дизайна? должна быть чистая, эмоции, легко считываться» | раунд «сначала дизайн» — по умолчанию (ТЗ ниже) |
| «ты можешь здесь напрямую юзать чат гпт? пусть делает картинки, ты проверять будешь» | отрисовка — Codex CLI по команде Claude; проверка — Claude, до показа |
| «мне нужно копировать ссылку на каждую превью» | у каждой обложки кнопка «🔗 ссылка» (Drive, доступ по ссылке) |
| (17.08.2026) эксперт справа или по центру, слева никогда | правило канона обложек; в YTLAB01 Роман справа, Павел слева |
Схемы кадра 1280×720: что было в сборке из кадров и что просим у ChatGPT. Пунктир — зоны текста и предмета, силуэты — головы героев.
Эксперт справа или в центре — правило канона с 17.08.2026; в YTLAB01 рассадка в студии была обратной, поэтому обе вырезки зеркальные.
Нарисуй обложку YouTube инструментом генерации изображений. ЭТО ДОЛЖНА БЫТЬ СИЛЬНАЯ, ЧИСТАЯ ОБЛОЖКА УРОВНЯ ТОП-КАНАЛОВ YOUTUBE (как у Diary of a CEO, MrBeast): считывается за полсекунды даже в маленькой миниатюре. Фокус один — лица и эмоции. Ничего мелкого и лишнего. ИЕРАРХИЯ: 1) лица и эмоции — главное, крупно; 2) фраза — коротко и крупно; 3) логотип YouTube — один предмет. Больше воздуха, тёмный чистый фон, премиальный свет: тёплый ключевой свет на лицах, контровой контур, глубина резкости. 1-я картинка — образец компоновки. Повтори расстановку, но сделай чище, крупнее и качественнее. ЛИЦА — приложенные вырезки, это настоящие люди из выпуска: лица, очки, причёски, одежду не меняй. Крупно: головы занимают почти всю высоту под текстом (каждая голова ≈ 45 % высоты кадра), обрезка по плечи/грудь. — 2-я картинка (Павел) — слева: ироничная усмешка; — 3-я картинка (Роман) — справа, чуть крупнее: энергичный жест рукой, убеждает. Они смотрят друг на друга. ТЕКСТ — сверху, кириллица точно так, буква в букву: маленькая строка «КАНАЛ КОМПАНИИ —» — белым, над главной; главная — «ПОМОЙКА?»: огромные лаймовые буквы #E4FF6E с тонкой тёмной тенью. Шрифт — широкий очень жирный гротеск, заглавные. Никакой плашки на всю ширину. Текст не закрывает лица. Других надписей нет. ПРЕДМЕТ — между лицами, внизу: металлическое мусорное ведро, из него торчит логотип YouTube; небольшое — не больше головы. ЦВЕТ — фон глубокий тёмно-синий #0A0D16, лайм #E4FF6E — только для ключевого слова, красный — только логотип YouTube. ФОРМАТ — 1280×720. Сохрани файлом YTLAB01_thumb_B_gpt2.png в текущую папку и ответь путём.
«Сохрани файлом в текущую папку» — так Codex сам копирует PNG из ~/.codex/generated_images/ рядом и отвечает путём. Раунд 1 («минимум элементов», с плашкой) — prompt_X_simple.txt в кейсе: слабее.
Одна команда на раунд: check.py --job $JOB --round 2 --version 5 — готовые файлы 1280×720, листы лиц и ленты, отчёт; код выхода 1, если не прошли техника или число лиц. Машина меряет, глазами смотрит сессия: лица, буквы, лента, угол, число элементов.
| Что | Как | Норма | Откуда |
|---|---|---|---|
| Лица | лист check_X.jpg: кроп лица из рисунка рядом с кропом настоящего кадра (образец уже зеркальный) | узнаётся; выражение как в кадре | YTLAB01 v5: в A ChatGPT повернул взгляд Павла, в C раскрыл смех Роману — сказано Роману |
| Буквы | каждая: Й, Ё, тире, двоеточие, «?» | буква в букву с ТЗ | ChatGPT кириллицу держит (v4, v5 без ошибок), но смотреть обязательно |
| Лента | лист feed_v5.png: каждая обложка в 360 и 168 px | главная строка читается, лица видны | 168 px — карточка в колонке «Далее»; «считывается за полсекунды» |
| Техника | finalize.py внутри check.py: 1280×720 PNG; правый нижний угол свободен — там длительность | < 2 МБ (лимит thumbnails.set) | «лимит — это максимум, а не цель»: сжимать ровно до лимита, оригинал оставить |
| Композиция | у портрета check.py меряет центр лица (x ≥ 0,40); у пары — глазами | эксперт справа или в центре; взгляды сходятся | канон 17.08.2026; YTLAB01 v5: центр лица Романа x = 0,71–0,77 |
| Высота лица | рамка Apple Vision, % высоты кадра | ориентир у пары ≥ 32 %; в ТЗ — голова ≈ 45 % | YTLAB01: раунд 33–37 % принят, 27–31 % — «слабо»; проба 05.10 по тому же ТЗ дала 29–30 %. Предупреждение, не сбой |
| Элементы | пересчитать | ≤ 4: два лица, слово, предмет (+ логотип) | Роман 05.10: «перегруз… не видна общая превью» |

$V check.py --job $JOB --round 2 --version 5
$V feed_check.py --out feed_B.png YTLAB01_thumb_B_v3.png YTLAB01_thumb_B_v4.png YTLAB01_thumb_B_v5.pngПервый экран — только обложки 2×2 и выбор; лента, прошлые раунды и вырезки свёрнуты. Строка ответа копируется одной кнопкой.

$V pick_page.py --job $JOB --version 5 --prev 4,3
название, канал и длительность — из задания: title · channel_name · durationИнструменты кейса вынесены из проекта в этап и переведены на задание thumb_job.json. Последний столбец — что именно проверено 05.10.2026 на данных YTLAB01 и что не запускалось (на ролик ничего не ставилось). Выход шёл во временную папку; в папку кейса добавлено задание thumb_job.json.
| Инструмент | Что делает | Из чего вырос (кейс) | Проверено 05.10 |
|---|---|---|---|
| thumb_job.json | задание: фразы с цитатами, герои и камеры, моменты эмоций, раскладки образца, выбор Романа | константы в make_tz.py, make_tz_v3.py, make_thumbs.py | образец — кейс YTLAB01; цитаты сверены с субтитрами v6 |
| frames4k.py | момент фильма → 4K-кадр героя в цвете фильма + маски | compose/frames4k.py | импорт движка и листа версии; готовые кадры пропущены, новые не снимались |
| segment (Swift) | маски «только человек» и «поднять объект» | compose/segment.swift, без изменений | маски совпали с кейсом пиксель в пиксель |
| cutouts.py | вырезка по габаритам человека, края гаснут; рамки лиц в faces.txt | compose/cutouts.py + ручной прогон faces | вырезка и рамка лица R_C совпали с кейсом |
| make_sample.py | образец компоновки HTML ×2 → 1280×720; раскладки и предметы — в задании | compose/make_thumbs.py | образцы B и D совпали с v3 кейса пиксель в пиксель |
| make_prompt.py + prompt_design_template.txt | ТЗ «сначала дизайн» и картинки к нему в порядке промпта | gpt/prompt_X_design.txt, писались руками | промпты A–D; B повторяет промпт кейса по смыслу |
| gpt_draw.sh | ChatGPT рисует: Codex CLI, картинки флагом -i | gpt/run_gpt.sh, run_gpt2.sh | проба B с тремя вложениями: 4:32, буквы и лица в норме, лица 29–30 % — ниже ориентира, в работу не пошла; до того им же соседняя сессия — три картинки визуализации параллельно |
| check.py = finalize.py + check_faces.py + feed_check.py | готовые файлы 1280×720 до 2 МБ, листы лиц и ленты, отчёт | finals() в make_tz_v5.py + проверка руками | раунд 2 чистый; раунд 1 помечен «мелко»; B v5 побайтно совпала с файлом кейса |
| pick_page.py | страница выбора: обложки 2×2, ссылки, «в тест» / «главная», строка ответа | brief/make_tz_v5.py (и v3, v4 под ним) | страница собрана — снимки выше |
| thumb_set.py | thumbnails.set, канал и токен из channels.json, запись в JSON выпуска | 08_Cut/hooks/set_thumb_v6.py | только --dry-run: обложка B стоит на ролике с 05.10 01:08 |
| 999_extra/sheets_chip_links.py | смарт-чип обложки в ContentList | как есть | не запускался: чип F3 стоит с 05.10 |
Инструменты кейса в проекте (05_Thumbnail/brief/compose/, gpt/run_gpt*.sh, brief/make_tz_v5.py, 08_Cut/hooks/set_thumb_v6.py) оставлены как есть; первый прогон образца пересобрал промежуточные compose/html/thumb_B.* — итог тот же, что v3. Не обобщено: предметы образца — набор SVG из кейса (логотип, ведро, паутина, пыль, облачко); новый предмет — новый ключ PROPS в make_sample.py.
| Что | Чем | Где | Заметка |
|---|---|---|---|
| Маска человека | Apple Vision VNGeneratePersonSegmentationRequest (accurate) | segment.swift, локально | только человек: волосы аккуратно, микрофон перед грудью вырезается — поэтому рамка, а не прозрачность |
| «Поднять объект» | VNGenerateForegroundInstanceMaskRequest (macOS 14+) | segment.swift | человек вместе с микрофоном и стаканом — прозрачность вырезки |
| Рамки лиц | VNDetectFaceRectanglesRequest | faces.swift | центр и высота лица для компоновки; те же рамки — для проверки и замера |
| Цвет кадра | conform.grade движка фильма (ffmpeg: проявка и look сцены) | frames4k.py | вырезка в цвете выпуска, не в логе; номер кадра общий для трёх камер |
| Образец | HTML ×2 в безголовом Chrome → 1280×720 | make_sample.py | текст ужимается по ширине шрифтом канала (Unbounded); предметы — SVG |
| Отрисовка | ChatGPT, генерация изображений — через Codex CLI расширения VS Code (openai.chatgpt 26.930) | gpt_draw.sh | codex exec -i … ; 1:19–4:32 на картинку (11 прогонов по журналам), обложки 1280×720 PNG 1,0–1,3 МБ; в журнале — Codex 0.160.0, модель gpt-6.1-sol; вход — аккаунт ChatGPT Романа. Тем же способом — предметы и фоны для экранов: навык «Иллюстрации ChatGPT» |
| Запасные пути | Gemini в YouTube Studio (промпт ≤ 650 знаков) · vidIQ | руками | когда вырезок нет или ChatGPT недоступен — метод vidIQ |
| Поставить | YouTube Data API thumbnails.set | thumb_set.py | канал и токен из 08_youtube/channels.json; обход DPI как в upload_youtube.py |
| Сдача | Drive (rclone мимо VPN) · Sheets смарт-чипы · Telegram | rclone · sheets_chip_links.py · tg.py | чип F в ContentList; drive_links.json — для кнопок «🔗 ссылка»; одной командой пока нет |
| Файл | Что в нём | Кто пишет | Когда |
|---|---|---|---|
| YTs/{CH}/dna.json | фон, акцент, шрифт, маркер темы — ДНК канала для фразы и образца | сессия, раз на канал | новый канал |
| {проект}/05_Thumbnail/thumb_job.json | фразы с цитатами, моменты эмоций, герои и камеры, раскладки образца, выбор Романа | сессия | по ходу этапа |
| 05_Thumbnail/gpt/prompt_X_design.txt | ТЗ ChatGPT раунда; шаблон этапа — prompt_design_template.txt | make_prompt.py + правки | каждый раунд |
| 05_Thumbnail/drive_links.json · 06_YouTube/{CODE}_v{N}_youtube.json | ссылки Drive; thumbnail, thumbnail_set, thumbnail_url | скрипты сдачи | после выбора |
| память: reference_hub_thumbnails · feedback_ytlab_packaging_channel_owners · reference_codex_cli_image_generation | правила Романа, ЦА канала, как рисует ChatGPT | сессия | после круга с Романом |
| эта страница и /kb/thumbnail/ | два метода: вырезки + ChatGPT и vidIQ | сессия | смена поколения — переписать, не дописывать |
| vidIQ · /kb/thumbnail/ | Этап Thumbnail · AI Editing | |
|---|---|---|
| Кто рисует людей | генератор заново по листу поз | ChatGPT вставляет настоящие вырезки из 4K и переосвещает |
| Вход | кадры ревью-прогона, лист поз, схема областей, промпт | фильм vN, лист версии, 4K-исходники, цвет фильма, ДНК канала |
| Текст | генератор пишет сам (кириллицу держит) | ChatGPT пишет буква в букву; проверка каждой |
| Проверка | глазами перед загрузкой | Claude до показа: лица кропами, буквы, лента 168 px |
| Кто запускает | Роман в vidIQ / Studio | Claude сам (Codex CLI); Роман только выбирает |
| Когда | исходников 4K нет или доступ только к vidIQ | фильм собран кодом или есть 4K и лист версии |
| Результат | обложка + загрузка руками | стоит на ролике через API, Drive, чип, Telegram |
V=~/YTAI/environment/.venv_transcribe/bin/python; T=~/YTAI/scripts/06_thumbnails/0601_ai_thumbnail JOB=<проект>/05_Thumbnail/thumb_job.json; GPT=<проект>/05_Thumbnail/gpt cp $T/thumb_job.example.json $JOB # задание: код, камеры героев, моменты, фразы с цитатами, раскладки $V $T/frames4k.py --job $JOB # 4K-кадры в цвете фильма + маски (segment) $V $T/cutouts.py --job $JOB # вырезки RGBA по габаритам человека + рамки лиц faces.txt $V $T/make_sample.py --job $JOB --tag v3 # образцы компоновки <CODE>_thumb_{A..D}_v3.png $V $T/make_prompt.py --job $JOB # ТЗ «сначала дизайн» → $GPT/prompt_{A..D}_design.txt + in/X/inputs.txt $T/gpt_draw.sh $GPT $GPT/prompt_B_design.txt @$GPT/in/B/inputs.txt & # ChatGPT рисует; варианты — параллельно $V $T/check.py --job $JOB --round 2 --version 5 # готовые v5 + листы check_X.jpg и feed_v5.png + отчёт $V $T/pick_page.py --job $JOB --version 5 --prev 4,3 # страница выбора → строка ответа Романа $V $T/thumb_set.py --job $JOB --file <проект>/05_Thumbnail/<CODE>_thumb_B_v5.png # стоит на ролике — после «ставь её»
Бинари Apple Vision один раз: cd $T && swiftc -O -o segment segment.swift && swiftc -O -o faces faces.swift. Движок фильма для frames4k — scripts/05_editing/0510_headless_cut (старая версия — копия из ~/.cache/ytai/stage_snapshots, флаг --stage).
$V $T/finalize.py --job $JOB --round 2 --version 5 # рисунки раунда → готовые 1280×720 до 2 МБ; прежнюю версию не затирает $V $T/check_faces.py --sample $GPT/in/B/01_образец_B.png --drawn $GPT/<CODE>_thumb_B_gpt2.png --out check_B.jpg # лица рядом: кадр ↔ ChatGPT $V $T/feed_check.py --out feed.png <обложки…> # 360 и 168 px $T/gpt_draw.sh --dry-run $GPT $GPT/prompt_B_design.txt @$GPT/in/B/inputs.txt # показать вызов codex, не рисуя $V $T/thumb_set.py --job $JOB --file <обложка> --dry-run # что и куда будет поставлено, без YouTube
DST="<remote Drive проекта>:<папка проекта>/05_Thumbnail"; EN0=$(ipconfig getifaddr en0) rclone copy <проект>/05_Thumbnail "$DST" --include "<CODE>_thumb_?_v5.png" --bind $EN0 # обложки на Drive мимо VPN rclone lsjson "$DST" --files-only --include "*_v5.png" --bind $EN0 # ID файлов → drive_links.json: https://drive.google.com/file/d/<ID>/view python3 ~/YTAI/scripts/999_extra/sheets_chip_links.py --sheet <id таблицы> --tab "<лист>" --chip "F3=<ID>" --verify # чип обложки в ContentList python3 ~/bin/tg.py photo rya $CHAT <обложка> "<b><CODE> · обложка</b> B стоит на ролике" # весть Роману; подпись — HTML
Образец — сдача фильма в кейсе (08_Cut/hooks/light_v6.sh): тот же remote, чип и сообщение. Команда чтения ID проверена 05.10 на обложках v5 YTLAB01: четыре ссылки совпали с drive_links.json. Сдачи одной командой у этапа пока нет — надо построить.
Apple Vision работает локально, без токенов; Codex CLI входит аккаунтом ChatGPT Романа (~/.codex/auth.json) — ключей в KB нет.