◂ База знанийRYA.AEСценарий под диктора — из записи эксперта в текст для начитки и визуализациюобновлено 26 сен 2026
С 22.09 у YTUVIE главный путь — карточка урока: курс режется на короткие видео, эксперт рассказывает сам, без суфлёра, и ему нужна опора, а не начитка (раздел 1). Сценарий под диктора — запасной путь для текста, который читают с суфлёра. Он живёт в одном Google-доке на тему: на каждое занятие и каждую версию — своя вкладка, на вкладке — одна таблица из семи столбцов. Столбец 4 «Как было» — речь эксперта из записи встречи (Zoom), очищенная от устного мусора: это основа, из неё ничего не выдумывается. Столбец 5 «Как сейчас · текст для начитки» — наш текст, который диктор читает с суфлёра в студии. Столбец 7 «Визуализация» — что зритель видит на экране в этот момент. Всё остальное (тайминг, суть блока, экраны записи, вставки) существует, чтобы эти три столбца читались без пояснений.
📌 Место в потоке. Третий шаг Pre-Production: виды экранов уже описаны в библиотеке (1.1), шаблоны заставок и плашек готовы (1.2). Главный путь — карточки уроков (13_preprod/1306_lesson_cards/): вход — карта эксперта (xmind), его дека и карта курса; выход — страница карточек 05_Lessons/YTUVIE_course_cards.html, её открывают на площадке. Запасной путь — сценарий под диктора (1303_prompter_scripts/): вход — запись встречи темы (пословный транскрипт + кадры), если записи нет — legacy-пакет для автора script_pack.py; выход — вкладка «Занятие NN · vK» в доке темы и экспорт суфлёру (.txt/.docx для sufler.pro). Дальше — съёмка (2.2 Shoot Day SOP) или, если снимать нечего, сразу монтаж (5.1 Assembly Brief, 6.6 Montage TZ).
🎙 запись встречи→ 🧹 «как было» Qwen3-8B→ ✍️ «как сейчас» структура YouTube→ 🖼 экраны 6 · 7 + вставки→ ✅ гейты flow · deixis · qa→ 📄 вкладка дока + суфлёр

1.1 · 1Что это и когда

Главный путь: карточка урока вместо суфлёра (решения Романа 22–23.09). Курс «Лаборатория AI-контента» — 63 коротких видео в трёх уровнях: блок 1–8 → тема 1.1 (цикл «рассказ → скринкаст → ДЗ», их 18) → урок 1.2.1. Эксперт говорит своими словами; карточка даёт ему путь урока и то, что нельзя забыть или переврать.
  • 1
    Вехи — 3–6 шагов урока (steps.py): из верхнего уровня тезисов xmind эксперта, иначе из частей опорных пунктов. Демо — всегда первая веха, призыв к следующему уроку — последняя.
  • 2
    Демо: что и где. demo.where — конкретный адрес (сервис → раздел → экран), не «показать результат»: «надо писать где, чтобы не забыть». Без «где» сборка падает. Экран пишет сам эксперт, снимает Роман.
  • 3
    Дословно — только то, что нельзя переврать: цифры, названия моделей, лимиты, адреса. Каждое число обязано найтись в источниках темы (слайды, тезисы, секции карты, готовые сценарии, промпты PM).
  • 4
    CTA — одна фраза о том, зачем смотреть следующий урок, без механики сценария (стоп-лист preprod_profile.vocabulary.banned_labels). Показ продукта в начале блока и темы и переход в конце пишутся отдельно — у блоков и тем (шаг 6).
ШагИнструмент (1306_lesson_cards/)ВыходЧто проверяет код
1lessons_map.py --root $R --xmind … --deck … [--check]05_Lessons/lessons_map.jsonxmind ↔ дека: расхождения — в conflicts[], истина за декой; номера черновые
2align_sections.json — рукамивидео → секции карты курсамашинное сопоставление путает соседние секции — выверить глазами
3cards.py --root $R --topics 01,02,03 [--cta] [--check]05_Lessons/cards.jsonвыверенные карточки бережёт по полю reviewed
4packs.py → облачный проход → cards_merge.py --in <ответ> [--check]демо, опорные пункты, CTA в cards.jsondemo.what/where у каждого видео и конкретны; CTA без механики; нет выдуманных цифр; нет «модуль»; измеренный хронометраж агент не перебивает
5themes.py --write → renumber.py [--apply] → renumber_check.py --before …themes.json, номера «блок.тема.урок»у каждого нового номера то же содержание, все ссылки разрешаются; после каждого lessons_map.py — заново
6облачный проход → themes_merge.py --in … --packs …показ продукта и переход у блока и темыте же гейты, что у карточек
7timing.py --root $R --check | --write | --balanceминуты урока, раскладка по сменамминуты — только отсюда: сценарий суфлёра → слова записи × K ≈ 0,87 → измеренная ставка мин/пункт
8steps.py --write · group_say.py (Qwen3-8B) · questions.py · verbatim_fix.py · prep_build.py --writeвехи, части пунктов, открытые вопросы, подготовка по сменам prep_<дата>.jsonформа частей — кодом (bad_shape), не промптом
9cards_page.py --root $R --date … · structure_page.py → verify_page.pyYTUVIE_course_cards.html (дерево блок → тема → урок, отметка «снято») + YTUVIE_checklist.txt; YTUVIE_course_structure.htmlссылки ведут на реальные id, структура страницы; глазами — скриншот до сдачи
R=/Volumes/T7-Beige-RYA/YTUVIE-Folder/YTUVIE-Уроки/YTUVIE-S1_Preprod — папка спринта. ⚠️ Суфлёрные гейты (qa_script, ts_polish, коридор ±15 %) к карточкам не применяются: их не читают вслух. Готовые сценарии суфлёра остаются в деле — по их словам timing.py считает честные минуты.
Запасной путь — сценарий под диктора (всё дальше на этой странице): текст читают с суфлёра. Один док на тему, вкладка на версию, одна таблица на вкладку. Док темы называется по коду и записи — «YTUVIE01 · Установочная · сценарий занятия по записи M01 (25.08.2026)». Каждая сборка сценария — новая вкладка Занятие 01 · v4; старые вкладки не удаляются, история итераций остаётся в доке. Сборщик отказывается писать в существующую вкладку («новая версия = новое имя вкладки»); флаг --replace — только чтобы пересобрать ту же версию после правки.
  • 1
    ОДНА таблица на вкладку. Главы — строки внутри таблицы с заливкой: в столбце 5 текст [01B-01 · название · в записи 0:01–8:03 · ~6.1 мин] стилем HEADING_3, поэтому главы попадают в оглавление дока. Таблица-на-главу запрещена: повторяющиеся шапки рвут поток чтения.
  • 2
    Шапка вкладки в этом порядке: H1 заголовок → «Материалы» (ссылки списком: запись, папка темы, инфографика, дека эксперта, картинки дока, препродакшен) → «Структура занятия» (главы с таймингом, подпункты и вставки списком) → «Как читать» (легенда) → строка «Источник».
  • 3
    После таблицы — «Произношение»: как читать латиницу с суфлёра (в v4 — 22 названия: ChatGPT — чат джи-пи-ти, HeyGen — хейген, ElevenLabs — илевен лабс, Sol — сол …). Берётся из YTs/YTUVIE/preprod_profile.json → tools_glossary, только те названия, что встретились в тексте занятия. Написание в тексте — латиницей, чтобы эксперт и монтажёр видели одно и то же.
  • 4
    Вход. Запись встречи темы: пословный транскрипт 01_Research/work/M01/transcript/M01.words.json, кадры экрана и дека эксперта. Модель «видео = занятие»: запись и есть занятие, студийная версия следует ей, синтеза из других встреч нет. Записи нет (тема 02) — legacy-пакет script_pack.py --root … --blocks 02A: карта курса, дословные выдержки, лексикон эксперта, целевой объём слов — и текст пишет автор.
Живой пример: вкладка «Занятие 01 · v4» — 13 глав, 82 читаемые строки, 24 строки-вставки (столько же в inserts_M01.json). Код стадии: ~/YTAI/scripts/13_preprod/1303_prompter_scripts/ (не в git — см. грабли).

1.1 · 2Семь столбцов — таблица

Заголовки — символ в символ как в доке. Ширины 24 / 52 / 84 / 130 / 210 / 200 / 210 pt, кегль 10; картинки 195 pt; в столбце 6 — не больше 4 экранов записи (каждый может дать до 4 панелей), в столбце 7 — не больше 4 мокапов на строку.

№ЗаголовокЧто в нёмКто / что заполняет
11 · №Номер читаемой строки 01…82; у вставки — номер предыдущей читаемой строки с буквой 01a; у главы пусто.сборщик, после сплайса вставок
22 · ТаймингЦелевое время в занятии от начала таблицы и длительность: 0:00–1:09 / ≈69 с. Вставки занимают время наравне с чтением, у них приписка «· вставка». Шрифт 8 pt моно.сборщик: 130 слов/мин по тексту «как сейчас»; вставка — её dur
33 · Смысловой блокСуть блока одной строкой, 4–8 слов («Привлекать негде, кто говорит и вопрос к роликам»); «⟂ без шлифовки» — в 5 стоит «как было». У вставки — INS-11 · Три ролика до первой фразы жирным.ts_polish → polish.jsonl (gist); подпункты «пути урока» — ts_short + облачный судья
44 · Как былоРечь эксперта из записи, очищенная от мусора устной речи; 8 pt серым. Пусто у вставки и у чистого скринкаста.ts_llm — Qwen3-8B локально, выравнивание по дословному
55 · Как сейчас · текст для начиткиТо, что читается с суфлёра: абзацы-паузы, связки, ключевые фразы жирным, сноски мелким в конце ячейки. У главы — [id · название · tc · ~мин]; у вставки — [СНЯТЬ|ПРАВА|НАРИСОВАТЬ|ВСТАВКА: действие] + [вид экрана] + [источник] + [статус · владелец].облачная шлифовка ← проверка кодом (polish_merge); правки Романа
66 · Экран из видеоВсе сменяющиеся экраны записи внутри строки: скриншоты без спикера, только уникальные; подпись под картинкой «таймкод · кадр · заголовок». Референс монтажёру.screen_crop + dHash; чистый слайд деки вместо кропа, когда слайд есть
77 · ВизуализацияЗаставка главы (в строке главы), «путь урока» с текущим подпунктом (в каждой читаемой строке), инфографика в палитре сайта, кадр записи в нашей рамке. Техинфо — текстом под картинкой.plan_from_script → build_mockups (infographics_uvie); виды — 1.1
Три строки из v4 — глава, обычная, вставка. Картинки столбцов 6–7 в текстовый экспорт не попадают; столбец 5 строки 01 сокращён.
1 · №2 · Тайминг3 · Смысловой блок4 · Как было5 · Как сейчас · текст для начитки6 · Экран из видео7 · Визуализация
[01B-01 · Маршрут по темам и что обязательно делаете вы · в записи 0:01–8:03 · ~6.1 мин]C01 · заставка главы
010:00–1:09
≈69 с
Привлекать негде, кто говорит и вопрос к роликамА кто у нас еще доходит они давайте на всякий случай можно в чате к покивать у вас камеры включены поэтому.Реклама в России почти кончилась. Каналов, куда можно залить рекламный бюджет, осталось два с половиной: клиенты нужны, деньги есть, а привлекать негде. Остаются охваты, за которые вы не платите отдельно. […] Сейчас будет три коротких ролика. Посмотрите их со звуком и ответьте себе на один вопрос: где здесь живой человек?—C01-01 · путь урока: «Маршрут по темам и что обязательно делаете вы»
01a1:09–1:21
≈12 с · вставка
INS-11 · Три ролика до первой фразы[ВСТАВКА: три ролика подряд, по три-четыре секунды, без подводки и без титров — логопед, игра для неговорящих, самовар на стаканчике; порядок тот же, что потом в полном показе, склейки встык, звук роликов на полной громкости] [источник: исходные ролики эксперта: логопед, игра для неговорящих, самовар на стаканчике; кадры показа этих роликов в записи встречи, если оригиналов нет] [есть материал]——

1.1 · 3Правила строки и чтения

  • 1
    Строка = смысловой блок ~80–140 слов из нескольких абзацев; новый блок — на новом слайде. Абзац = пауза суфлёра: 2–4 абзаца по 20–45 слов, фраза до 22 слов.
  • 2
    Тайминг — 130 слов/мин по тексту «как сейчас», считается от начала таблицы по финальному порядку строк; вставки занимают время наравне с чтением («честный таймлайн»). Время главы — по тому, что реально читается.
  • 3
    Нумеруются только читаемые строки. Вставка — номер предыдущей читаемой строки с буквой: 12a, 12b. Вставки номера читаемых строк не сдвигают; при переносе главы (lesson_t) номера после неё меняются — стабилен id строки (01B-07-r4), на него и ссылаться.
  • 4
    «⟂ без шлифовки» в столбце 3 — шлифовка не прошла проверку, в столбце 5 стоит текст «как было» с автоматическим жирным.
  • 5
    Всё [в квадратных скобках] не читается: главы, техблоки скринкастов, метки; произношение — сноской в конце ячейки. Метка непроверенного факта — [⚠️ ПРОВЕРИТЬ · …], внутри неё нельзя арабские цифры: проверка валит строку по причине «цифры» раньше, чем скобки будут вырезаны.
  • 6
    Цифры — словами («двадцать тысяч», «восемьдесят один доллар»); названия сервисов — латиницей, произношение в списке после таблицы.
  • 7
    Ключевые фразы жирным — 1–3 на абзац, 2–5 слов, внутри предложения (не тег и не резюме в конце абзаца). Жирное = акцент голосом и кандидат на вынос на экран; в файл суфлёра жирное не идёт.
  • 8
    Сноски (произношение, правило РФ про Instagram*) — в конце ячейки мелким серым; в тексте самой начитки их нет.
  • 9
    Одно прощание — в самом конце. «Не надо прощаться, все показываем и в конце говорим про следующий». Машинно: CTV — последняя читаемая строка занятия (flow_check).
  • 10
    Слова «урок» и «модуль» не используем — тема · блок · встреча · занятие. Шлифовка и подписи их запрещают, «модуль» — жёсткий стоп в qa_script.
Легенда «Как читать» — дословно из вкладки v4 (её печатает сборщик в шапку каждой вкладки; итог по времени считается на каждой сборке).
  • —
    Строка — смысловой блок из нескольких абзацев; нумеруются только читаемые строки. Строка главы — [id секции · название · таймкод в записи · ~минут], в столбце 7 — заставка главы.
  • —
    2 · Тайминг — целевое время в занятии (130 слов/мин по тексту «как сейчас») и длительность блока; всего ≈ 57:47: чтение 52:17 + вставки 5:30.
  • —
    Строка-вставка — действие на экране, которого нет в речи: читаемого текста нет, в столбце 5 — что именно делаем. Первое слово в скобках говорит, чья это работа: [СНЯТЬ] — эксперт записывает свой экран, [ПРАВА] — чужой материал, нужно согласие автора, [НАРИСОВАТЬ] — наша плашка или заставка, [ВСТАВКА] — материал уже есть у монтажёра. Номер — предыдущая строка с буквой (12a). Столбцы 6 и 7 — референсы.
  • —
    3 · Смысловой блок — о чём блок, одной строкой; «⟂ без шлифовки» — в столбце 5 стоит текст «как было».
  • —
    4 · Как было — речь эксперта из записи, очищенная от мусора устной речи. 5 · Как сейчас — версия для суфлёра: абзацы-паузы, связки, ключевые фразы жирным; всё [в квадратных скобках] не читается; сноски (произношение, правило РФ) — в конце ячейки.
  • —
    6 · Экран из видео — все сменяющиеся экраны записи внутри строки: сами скриншоты без спикера, только уникальные; подпись (таймкод · кадр · заголовок) под картинкой.
  • —
    7 · Визуализация — «путь урока» (заставка главы с текущим подпунктом) и инфографика в палитре сайта или экраны из записи в нашей рамке; техническая информация — текстом под картинкой.
Строка «Источник» под легендой: «запись M01; очистка и шлифовка текста — модели с локальной проверкой фактов, цифр и названий эксперта; новых фактов не добавлялось».

1.1 · 4«Как было» → «Как сейчас»

4 · Как было — речь эксперта, а не пересказ. Локальная модель (Qwen3-8B, mlx, на Memex) получает расшифровку окна ~150 с в виде «Говорящий | текст» и возвращает только чистые абзацы и пропуски: убирает слова-паразиты, фальстарты, проверки связи, обращения к участникам по имени; реплики других говорящих не включает; ответ эксперта на вопрос оставляет утверждением для зрителя. Ничего не добавляет, не обобщает, не переставляет; числа словами. Каждый абзац выравнивается по дословной речи (difflib по основам слов): совпавших слов ≥ 0,7, длина ≤ 1,15× дословного, каждое предложение подтверждено леммами — иначе абзац уходит в fallback (лёгкая regex-очистка дословного). Слова эксперта, не попавшие ни в абзац, ни в пропуск, становятся fallback-абзацами: речь не теряется.
5 · Как сейчас — тот же материал, пересобранный как YouTube-видео. Структура — канон монтажа (0501_brief/project_knowledge/editing_rules.md §1), перенесённый на занятие:
  • хук
    первая читаемая строка — самый цепляющий момент, вопрос в голове зрителя («где здесь живой человек?»); никаких «добро пожаловать».
  • интро
    кто говорит и что зритель узнает — с обещаниями (в занятии 01 их три; канон — 2–3 конкретных бенефита).
  • петля
    открытая петля любопытства раньше, чем закрыта; закрытие — ниже по занятию.
  • пункты
    главные мысли по порядку записи; у каждой — микро-итог и связка-мостик к следующей.
  • CTA
    два призыва — после первой ценности и ближе к концу; коротко.
  • CTV
    последняя читаемая строка — тизер следующего занятия, единственное прощание.
Шлифовка: 2–4 абзаца по 20–45 слов, 1–3 жирных фразы в абзаце, можно 1–2 короткие связки; факты, цифры, примеры и живые формулировки эксперта сохраняются, новых фактов, цифр, названий и кейсов не добавляется. Qwen3-8B для этого слаб — рабочая схема: два облачных прохода по секциям (черновик + читаемость) → polish_merge.py с локальной проверкой.
  • ⚠️
    Расхождение столбцов 4 и 5 — норма для записанного курса: столбец 5 стал авторским сценарием, строку не откатывают за «новые слова». Авторские правки проходят через --accept-rows (что он прощает и что нет — в граблях).
  • ⚠️
    Общения с аудиторией нет — только записанное. Из текста уходят знакомства участников, опросы, ответы в чат, «если вы угадали»; реплики участников становятся утверждениями эксперта; карточки-вопросы риторические, без паузы на ответ (polish_merge --rewrite-sections).
  • ⚠️
    Факты — из деки эксперта. Прежде чем заводить вопрос эксперту или PM, ответ ищут в его слайдах (цена цеха, боты, сервисы закрылись декой без единого вопроса). Неподтверждённое метится прямо в ячейке 5: [⚠️ ПРОВЕРИТЬ · …].

1.1 · 5Столбцы 6 и 7 — экран записи и визуализация

6 · Экран из видео — что было на экране, пока эксперт это говорил. Внутри строки — все сменяющиеся экраны записи, только уникальные (dHash), спикер вырезан: 1304_visual_tz/screen_crop.py находит панели (слайд целиком или отдельные скриншоты на тёмном фоне, не больше 4) и режет плитку докладчика справа сверху; у записи экрана без плитки — YTAI_SPEAKER_TILE=0,0,0,0. Подпись под картинкой: таймкод · кадр · заголовок. Если слайд есть в деке эксперта (recording_map.json → slides/sNN.png) — берётся чистый слайд вместо кропа кадра. Чистые слайды остаются здесь как референс монтажёру — в столбец 7 они не идут.
7 · Визуализация — что увидит зритель. В строке главы — заставка главы (chapter_card); в каждой читаемой строке — «путь урока»: та же заставка с подсвеченным текущим подпунктом (короткие названия 2–4 слова из ts_short); по смыслу — инфографика 4K в полной палитре сайта (виды chain, bars_compare, staircase, two_sides, cards_n … — библиотека 1.1) или экран записи в нашей рамке framed_shot — только для реальных интерфейсов и статистики (кабинет сервиса, цифры Reels); новые framed_shot для слайдов запрещены.
  • ⚠️
    Столбец 7 — для зрителя: объясняет, а не пересказывает. На экране нет механики сценария. Стоп-лист: обещание · хук · призыв · итог · переход · тизер (в коде шире: вступление, интро, финал, анонс, подводка, мостик, CTA, петля любопытства). Подпись «Обещание назвать цену цеха» на заставке — так нельзя. ts_common.mech_hit проверяет подпись и каждую строку текста с картинки; попадание — нарушение, аудит ts_short --audit-labels не проходит.
  • ⚠️
    Слайд эксперта в 7 не вставляется никогда — перерисовывается нашими видами (в v2 восемь framed_shot ушли в cards_n/bars_compare/chain).
  • ⚠️
    Техинфа — текстом под картинкой (tc, кадр, id мокапа), не на картинке. На картинке только крупный текст (вёрстка ≥ 48 px, подписи 72 px); мелко — лишь сноска про Meta. Никаких DRAFT-плашек.
Схемы рендерит 1304_visual_tz/infographics_uvie.py (3840×2160, инлайн-SVG, Onest + JetBrains Mono, один янтарный акцент); контроль — DOM-QC + контактные листы глазами; PNG 4K и HTML-исходники лежат в папке темы на Drive (ссылка «Инфографика 4K + HTML-исходники» в «Материалах»).

1.1 · 6Вставки и референсы съёмки

Норма (Роман, 20.09): «Любое действие на экране, которого нет в речи, имеет собственную строку с описанием. Ничего не подразумевается». Строка-вставка: читаемого текста нет; в столбце 3 — INS-NN · суть; в столбце 5 — описание действия, и первое слово в скобках говорит, чья это работа. Дальше в той же ячейке: [вид экрана: …], [источник: …], [статус · владелец]. Столбцы 6 и 7 строки-вставки — референсы: кадры из screens.json и схемы из манифеста мокапов. Отдельного столбца «референсы» в таблице нет.
Тег в столбце 5family в кодеЧто этоСъёмкаСтатус · владелец
[СНЯТЬ: …]showэксперт записывает свой экран (скринкаст, кабинет сервиса)да, своим экраном, без студиинужно снять · эксперт
[ПРАВА: …]rightsчужой материал — ролик, скриншот переписки, чужая статистиканетнужны права · PM
[НАРИСОВАТЬ: …]graphicнаша плашка, заставка, переход; вид — в viz[]нетнужно нарисовать
[ВСТАВКА: …]footageматериал уже у монтажёра: ролики эксперта, кадры записинетесть материал
Источник истины — family; shoot, статус и владелец выводятся из неё (inserts_merge.py), расхождение чинится и печатается строкой «✎». До v2 всё шло под одним словом «ВСТАВКА», и съёмку было не отличить от архива.
  • 1
    Гибрид скринкаста. Чистый скринкаст, которого в записи нет (эксперт о нём не говорит), своей строки и главы не получает: его шаги уезжают техблоком […] в строку, где об этом говорят, и в файл суфлёра не попадают. Скринкаст-секция, которая в записи есть, в файле суфлёра — одна строка [СКРИНКАСТ 03A-03 · название · не читаем в студии].
  • 2
    Одна вставка — один якорь (строка или секция, before|after), длительность 2–60 с, описание без квадратных скобок (их ставит сборщик). Одна и та же съёмка на разных якорях — предупреждение: эксперт иначе запишет один экран дважды.
  • 3
    Если по сценарию есть съёмка — строки [СНЯТЬ] (family show) становятся «заявками на показ» и попадают в план съёмочных дней: python3 1305_shoot_prep/shoot_plan.py --root /Volumes/T7-Beige-RYA/YTUVIE-Folder/YTUVIE-Уроки/YTUVIE-S1_Preprod --bookings …/04_Shoot/bookings.json --tg → 04_Shoot/shoot_plan.html; живой пример — /ytuvie/s1/shoot/. Раньше этого источника в плане не было, и полтора десятка заданий всплывали уже на монтаже.
  • 4
    Референсы кадра для съёмки и монтажа — мокапы визуального ТЗ: python3 1304_visual_tz/build_tz_page.py --topic …/YTUVIE01_Kickoff_Setup [--tg] → visual/<CODE>_visual_tz.html (цитата сценария → тип экрана → превью мокапа → текст экрана; шот-листы скринкастов) + лёгкий _visual_brief.html для телефона.

1.1 · 7Конвейер и гейты

Тяжёлое (транскрипт, LLM, рендер) — на Memex, вехи в Telegram; облачные токены — на шлифовку, вставки, судью подписей, структурный проход и аудит смыслов; каждая облачная выдача проверяется кодом.

ШагИнструментВыходЧто проверяет код
1transcript_script.py memex push|start|pull → стадии map → llm → build → check → placesections_map.json, paras.jsonl, script_<блок>.v<N>.json, report.jsoncheck: покрытие речи, цифры/скобки/запрет, длины, доля fallback, экраны
2ts_llm.py --work …/work/M01/prompterparas.jsonl — «как было»выравнивание по дословному: ≥ 0,7 совпавших слов, длина ≤ 1,15×, покрытие лемм ≥ 0,75
3ts_polish.py (локально) / облачные проходы → polish_merge.py --work … --in <polish_*.json>polish.jsonl — «как сейчас» + gistчисла-слова и латиница сохранены, нет цифр, длина 0,75–1,45×, новых слов ≤ 45 % (≤ 55 % у блоков короче 60 слов), абзац ≤ 52 слов, звёздочки парные, жирное внутри фразы; провал → fallback (--fallback-from — на прошлую шлифовку)
4ts_short.py --work … (+ облачный судья)short.jsonl — подписи «пути урока»1–5 слов, без цифр, без «урок/модуль», не повторяет главу, mech_hit
5inserts_merge.py --root … --topic … --meeting M01 --in out/ --applyinserts_M01.json, deixis_01B.jsonякорь существует, 2–60 с, кадры в screens.json, мокапы в манифесте, нет дублей, family
6plan_from_script.py → build_mockups.pyvisual/montage_plan.json, mockups/manifest.jsonDOM-QC мокапов, lint экранов
7doc_lesson_table.py … --dump-rows rows.jsonдамп строк в порядке занятия (с lesson_t), док не тронутвход для двух следующих гейтов
8flow_check.py --topic … --rows rows.jsonflow_check.jsonHARD: строки hook / ctv / loop существуют, петля открыта раньше, чем закрыта, CTV — последняя читаемая, роль ctv ровно одна; WARN: хук в первой-второй строке, у каждой главной мысли микро-итог; раздел promises — отчёт, не гейт
9deixis_check.py --topic … --rows rows.json --kinds screendeixis_check.jsonкаждое «нужен кадр» закрыто: кадр в 6 своей строки, соседняя вставка ±1 или карточка в 7
10qa_script.py --script …/scripts/script_01A.v1.json --channel YTUVIE (версия сценария ≠ версия вкладки)*.qa.jsonHARD: время чтения вне ±15 % от цели блока, «модуль» (banned_framing профиля), несбалансированные скобки, пустые абзацы; WARN (в модели «видео = занятие»): клише, длинные фразы, цифры, латиница без подсказки
11doc_lesson_table.py --topic … --meeting M01 --doc <DOC_ID> --tab "Занятие 01 · v4" --upload --parent <FOLDER_ID> --links "Название=URL;…" [--replace] [--tg]вкладка дока; scripts/doc_M01.json«строк N (ожидалось N)», сбоев картинок 0; --dry-run — первые 24 строки текстом без записи
12export_prompter.py --script … --out-dir …/prompter [--tg]<CODE>_<блок>_v<N>.txt и .docx для sufler.proбез жирного, главы — заголовками [03A-02 · название · ~7 мин], пустая строка = пауза; первый файл открыть в sufler.pro и подтвердить главы/абзацы
Новый док темы: --create --parent <FOLDER_ID> --title "…"; --sections 01A-02,… — образец по части секций; --no-images — без картинок; --all-mockups — все мокапы, а не только инфографика; --version N — конкретная версия сценариев. Картинки уезжают в Drive-папку Preprod_images темы (anyone reader) — без --upload сборщик предупредит «N картинок не залиты».
Гейты перед сдачей вкладки — всё зелёное; это правило процесса: сборщик гейты не читает и роняет сборку только на битых вставках:
  • 1
    flow_check exit 0 — структура занятия не спорит сама с собой; список open-обещаний прочитан глазами.
  • 2
    deixis_check --kinds screen — ни одной незакрытой отсылки к экрану.
  • 3
    qa_script HARD = 0 по каждому блоку; WARN разобраны.
  • 4
    в polish.jsonl: "source": "prev-version" = 0 и "ok": false = 0 — иначе строка молча откатилась и в доке выглядит нормальным текстом.
  • 5
    ts_short --audit-labels --topic … — 0 нарушений механики в подписях, gist и текстах с картинок; DOM-QC мокапов 0.
  • 6
    после сборки: «строк N (ожидалось N)», «сбоев 0»; глазами — три случайные строки и «Произношение».

1.1 · 8Грабли

  • 1
    Два процесса пишут в один док → стёртая вкладка без ошибки. Docs правит документ по месту: пока один чистит вкладку, второй пишет по старым индексам. В doc_lesson_table.py замка нет — один прогон за раз, супервизор конвейера перед ручной сборкой гасить; у сборщиков с автозапуском — замок с PID владельца.
  • 2
    Кэш картинок Drive — по md5 содержимого, не по имени (_drive_ids.json, ключ stem.md5-8.ext). По имени док после перекропа получал старую картинку с тем же именем — спикер в углу (19.09).
  • 3
    Docs API. Индексы — UTF-16 (u16()); строить снизу вверх — ячейки заполняются от последней к первой; namedStyleType сбрасывает оформление текста — назначать до кегля и цвета; insertTable оставляет перед таблицей пустой абзац, наследующий стиль соседа; список вкладок приходит только с includeTabsContent=true; insertInlineImage берёт картинку только по публичному HTTPS (lh3.googleusercontent.com/d/{id}, запасной drive.google.com/uc?export=view); пустой диапазон стиля — 400 «range should not be empty» (пустая ячейка «как было» у скринкаста). Pageless — на каждую вкладку отдельно, с tabId.
  • 4
    --accept-rows прощает длину и новые слова, но не цифры и имена. Прощается: длина, доля новых слов, абзац длиннее 52 слов. Не прощается: «урок/модуль», арабские цифры (даже M01 внутри [⚠️ ПРОВЕРИТЬ …]), потеря глоссарного латинского названия, жирное не внутри фразы (bold_inline_ok); gist вне 2–12 слов молча обнуляется. В флаг класть каждую тронутую строку.
  • 5
    memex pull затирает локальные short.jsonl и polish.jsonl — судейские названия и облачную шлифовку применять после pull.
  • 6
    JSON и суммы через heredoc — только <<'EOF': без кавычек bash подставляет $5 как позиционный параметр, и «$5 МЛН» молча превращается в « МЛН» — ошибки нет. Проверять строки с $ после записи.
  • 7
    --root и --topic — всегда явно. Данные YTUVIE 24.09 переехали на T7-Beige: спринт — /Volumes/T7-Beige-RYA/YTUVIE-Folder/YTUVIE-Уроки/YTUVIE-S1_Preprod, темы — …/YTUVIE-Уроки/YTUVIE-Projects/YTUVIE0N_…. Умолчания в коде (doc_lesson_table, flow_check, inserts_merge, plan_from_script --frames-root) всё ещё смотрят в удалённый ~/Desktop/YTUVIE. На Memex корень прежний — ~/YTAI_work/YTUVIE-S1.
  • 8
    scripts/13_preprod/ не в git (решение 16.09) — публичное описание стадии — эта страница; код живёт локально у Романа и на Memex, README — в папке 13_preprod/.
Knowledge Base · yt.rya.ae · 1.3 Narrator Script · пример: YTUVIE · 63 карточки уроков (главный путь) · сценарий: YTUVIE01 · Занятие 01 · v4 (120 строк × 7, 57:47) · предыдущий: — · правило: на странице живут последний пример и предпоследний