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).steps.py): из верхнего уровня тезисов xmind эксперта, иначе из частей опорных пунктов. Демо — всегда первая веха, призыв к следующему уроку — последняя.demo.where — конкретный адрес (сервис → раздел → экран), не «показать результат»: «надо писать где, чтобы не забыть». Без «где» сборка падает. Экран пишет сам эксперт, снимает Роман.preprod_profile.vocabulary.banned_labels). Показ продукта в начале блока и темы и переход в конце пишутся отдельно — у блоков и тем (шаг 6).| Шаг | Инструмент (1306_lesson_cards/) | Выход | Что проверяет код |
|---|---|---|---|
| 1 | lessons_map.py --root $R --xmind … --deck … [--check] | 05_Lessons/lessons_map.json | xmind ↔ дека: расхождения — в conflicts[], истина за декой; номера черновые |
| 2 | align_sections.json — руками | видео → секции карты курса | машинное сопоставление путает соседние секции — выверить глазами |
| 3 | cards.py --root $R --topics 01,02,03 [--cta] [--check] | 05_Lessons/cards.json | выверенные карточки бережёт по полю reviewed |
| 4 | packs.py → облачный проход → cards_merge.py --in <ответ> [--check] | демо, опорные пункты, CTA в cards.json | demo.what/where у каждого видео и конкретны; CTA без механики; нет выдуманных цифр; нет «модуль»; измеренный хронометраж агент не перебивает |
| 5 | themes.py --write → renumber.py [--apply] → renumber_check.py --before … | themes.json, номера «блок.тема.урок» | у каждого нового номера то же содержание, все ссылки разрешаются; после каждого lessons_map.py — заново |
| 6 | облачный проход → themes_merge.py --in … --packs … | показ продукта и переход у блока и темы | те же гейты, что у карточек |
| 7 | timing.py --root $R --check | --write | --balance | минуты урока, раскладка по сменам | минуты — только отсюда: сценарий суфлёра → слова записи × K ≈ 0,87 → измеренная ставка мин/пункт |
| 8 | steps.py --write · group_say.py (Qwen3-8B) · questions.py · verbatim_fix.py · prep_build.py --write | вехи, части пунктов, открытые вопросы, подготовка по сменам prep_<дата>.json | форма частей — кодом (bad_shape), не промптом |
| 9 | cards_page.py --root $R --date … · structure_page.py → verify_page.py | YTUVIE_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 считает честные минуты.Занятие 01 · v4; старые вкладки не удаляются, история итераций остаётся в доке. Сборщик отказывается писать в существующую вкладку («новая версия = новое имя вкладки»); флаг --replace — только чтобы пересобрать ту же версию после правки.
[01B-01 · название · в записи 0:01–8:03 · ~6.1 мин] стилем HEADING_3, поэтому главы попадают в оглавление дока. Таблица-на-главу запрещена: повторяющиеся шапки рвут поток чтения.YTs/YTUVIE/preprod_profile.json → tools_glossary, только те названия, что встретились в тексте занятия. Написание в тексте — латиницей, чтобы эксперт и монтажёр видели одно и то же.01_Research/work/M01/transcript/M01.words.json, кадры экрана и дека эксперта. Модель «видео = занятие»: запись и есть занятие, студийная версия следует ей, синтеза из других встреч нет. Записи нет (тема 02) — legacy-пакет script_pack.py --root … --blocks 02A: карта курса, дословные выдержки, лексикон эксперта, целевой объём слов — и текст пишет автор.inserts_M01.json). Код стадии: ~/YTAI/scripts/13_preprod/1303_prompter_scripts/ (не в git — см. грабли).Заголовки — символ в символ как в доке. Ширины 24 / 52 / 84 / 130 / 210 / 200 / 210 pt, кегль 10; картинки 195 pt; в столбце 6 — не больше 4 экранов записи (каждый может дать до 4 панелей), в столбце 7 — не больше 4 мокапов на строку.
| № | Заголовок | Что в нём | Кто / что заполняет |
|---|---|---|---|
| 1 | 1 · № | Номер читаемой строки 01…82; у вставки — номер предыдущей читаемой строки с буквой 01a; у главы пусто. | сборщик, после сплайса вставок |
| 2 | 2 · Тайминг | Целевое время в занятии от начала таблицы и длительность: 0:00–1:09 / ≈69 с. Вставки занимают время наравне с чтением, у них приписка «· вставка». Шрифт 8 pt моно. | сборщик: 130 слов/мин по тексту «как сейчас»; вставка — её dur |
| 3 | 3 · Смысловой блок | Суть блока одной строкой, 4–8 слов («Привлекать негде, кто говорит и вопрос к роликам»); «⟂ без шлифовки» — в 5 стоит «как было». У вставки — INS-11 · Три ролика до первой фразы жирным. | ts_polish → polish.jsonl (gist); подпункты «пути урока» — ts_short + облачный судья |
| 4 | 4 · Как было | Речь эксперта из записи, очищенная от мусора устной речи; 8 pt серым. Пусто у вставки и у чистого скринкаста. | ts_llm — Qwen3-8B локально, выравнивание по дословному |
| 5 | 5 · Как сейчас · текст для начитки | То, что читается с суфлёра: абзацы-паузы, связки, ключевые фразы жирным, сноски мелким в конце ячейки. У главы — [id · название · tc · ~мин]; у вставки — [СНЯТЬ|ПРАВА|НАРИСОВАТЬ|ВСТАВКА: действие] + [вид экрана] + [источник] + [статус · владелец]. | облачная шлифовка ← проверка кодом (polish_merge); правки Романа |
| 6 | 6 · Экран из видео | Все сменяющиеся экраны записи внутри строки: скриншоты без спикера, только уникальные; подпись под картинкой «таймкод · кадр · заголовок». Референс монтажёру. | screen_crop + dHash; чистый слайд деки вместо кропа, когда слайд есть |
| 7 | 7 · Визуализация | Заставка главы (в строке главы), «путь урока» с текущим подпунктом (в каждой читаемой строке), инфографика в палитре сайта, кадр записи в нашей рамке. Техинфо — текстом под картинкой. | plan_from_script → build_mockups (infographics_uvie); виды — 1.1 |
| 1 · № | 2 · Тайминг | 3 · Смысловой блок | 4 · Как было | 5 · Как сейчас · текст для начитки | 6 · Экран из видео | 7 · Визуализация |
|---|---|---|---|---|---|---|
| [01B-01 · Маршрут по темам и что обязательно делаете вы · в записи 0:01–8:03 · ~6.1 мин] | C01 · заставка главы | |||||
| 01 | 0:00–1:09 ≈69 с | Привлекать негде, кто говорит и вопрос к роликам | А кто у нас еще доходит они давайте на всякий случай можно в чате к покивать у вас камеры включены поэтому. | Реклама в России почти кончилась. Каналов, куда можно залить рекламный бюджет, осталось два с половиной: клиенты нужны, деньги есть, а привлекать негде. Остаются охваты, за которые вы не платите отдельно. […] Сейчас будет три коротких ролика. Посмотрите их со звуком и ответьте себе на один вопрос: где здесь живой человек? | — | C01-01 · путь урока: «Маршрут по темам и что обязательно делаете вы» |
| 01a | 1:09–1:21 ≈12 с · вставка | INS-11 · Три ролика до первой фразы | [ВСТАВКА: три ролика подряд, по три-четыре секунды, без подводки и без титров — логопед, игра для неговорящих, самовар на стаканчике; порядок тот же, что потом в полном показе, склейки встык, звук роликов на полной громкости] [источник: исходные ролики эксперта: логопед, игра для неговорящих, самовар на стаканчике; кадры показа этих роликов в записи встречи, если оригиналов нет] [есть материал] | — | — |
12a, 12b. Вставки номера читаемых строк не сдвигают; при переносе главы (lesson_t) номера после неё меняются — стабилен id строки (01B-07-r4), на него и ссылаться.[в квадратных скобках] не читается: главы, техблоки скринкастов, метки; произношение — сноской в конце ячейки. Метка непроверенного факта — [⚠️ ПРОВЕРИТЬ · …], внутри неё нельзя арабские цифры: проверка валит строку по причине «цифры» раньше, чем скобки будут вырезаны.flow_check).qa_script.0501_brief/project_knowledge/editing_rules.md §1), перенесённый на занятие:
polish_merge.py с локальной проверкой.--accept-rows (что он прощает и что нет — в граблях).polish_merge --rewrite-sections).[⚠️ ПРОВЕРИТЬ · …].1304_visual_tz/screen_crop.py находит панели (слайд целиком или отдельные скриншоты на тёмном фоне, не больше 4) и режет плитку докладчика справа сверху; у записи экрана без плитки — YTAI_SPEAKER_TILE=0,0,0,0. Подпись под картинкой: таймкод · кадр · заголовок. Если слайд есть в деке эксперта (recording_map.json → slides/sNN.png) — берётся чистый слайд вместо кропа кадра. Чистые слайды остаются здесь как референс монтажёру — в столбец 7 они не идут.
chapter_card); в каждой читаемой строке — «путь урока»: та же заставка с подсвеченным текущим подпунктом (короткие названия 2–4 слова из ts_short); по смыслу — инфографика 4K в полной палитре сайта (виды chain, bars_compare, staircase, two_sides, cards_n … — библиотека 1.1) или экран записи в нашей рамке framed_shot — только для реальных интерфейсов и статистики (кабинет сервиса, цифры Reels); новые framed_shot для слайдов запрещены.
ts_common.mech_hit проверяет подпись и каждую строку текста с картинки; попадание — нарушение, аудит ts_short --audit-labels не проходит.framed_shot ушли в cards_n/bars_compare/chain).1304_visual_tz/infographics_uvie.py (3840×2160, инлайн-SVG, Onest + JetBrains Mono, один янтарный акцент); контроль — DOM-QC + контактные листы глазами; PNG 4K и HTML-исходники лежат в папке темы на Drive (ссылка «Инфографика 4K + HTML-исходники» в «Материалах»).INS-NN · суть; в столбце 5 — описание действия, и первое слово в скобках говорит, чья это работа. Дальше в той же ячейке: [вид экрана: …], [источник: …], [статус · владелец]. Столбцы 6 и 7 строки-вставки — референсы: кадры из screens.json и схемы из манифеста мокапов. Отдельного столбца «референсы» в таблице нет.
| Тег в столбце 5 | family в коде | Что это | Съёмка | Статус · владелец |
|---|---|---|---|---|
[СНЯТЬ: …] | show | эксперт записывает свой экран (скринкаст, кабинет сервиса) | да, своим экраном, без студии | нужно снять · эксперт |
[ПРАВА: …] | rights | чужой материал — ролик, скриншот переписки, чужая статистика | нет | нужны права · PM |
[НАРИСОВАТЬ: …] | graphic | наша плашка, заставка, переход; вид — в viz[] | нет | нужно нарисовать |
[ВСТАВКА: …] | footage | материал уже у монтажёра: ролики эксперта, кадры записи | нет | есть материал |
family; shoot, статус и владелец выводятся из неё (inserts_merge.py), расхождение чинится и печатается строкой «✎». До v2 всё шло под одним словом «ВСТАВКА», и съёмку было не отличить от архива.[…] в строку, где об этом говорят, и в файл суфлёра не попадают. Скринкаст-секция, которая в записи есть, в файле суфлёра — одна строка [СКРИНКАСТ 03A-03 · название · не читаем в студии].before|after), длительность 2–60 с, описание без квадратных скобок (их ставит сборщик). Одна и та же съёмка на разных якорях — предупреждение: эксперт иначе запишет один экран дважды.[СНЯТЬ] (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/. Раньше этого источника в плане не было, и полтора десятка заданий всплывали уже на монтаже.python3 1304_visual_tz/build_tz_page.py --topic …/YTUVIE01_Kickoff_Setup [--tg] → visual/<CODE>_visual_tz.html (цитата сценария → тип экрана → превью мокапа → текст экрана; шот-листы скринкастов) + лёгкий _visual_brief.html для телефона.Тяжёлое (транскрипт, LLM, рендер) — на Memex, вехи в Telegram; облачные токены — на шлифовку, вставки, судью подписей, структурный проход и аудит смыслов; каждая облачная выдача проверяется кодом.
| Шаг | Инструмент | Выход | Что проверяет код |
|---|---|---|---|
| 1 | transcript_script.py memex push|start|pull → стадии map → llm → build → check → place | sections_map.json, paras.jsonl, script_<блок>.v<N>.json, report.json | check: покрытие речи, цифры/скобки/запрет, длины, доля fallback, экраны |
| 2 | ts_llm.py --work …/work/M01/prompter | paras.jsonl — «как было» | выравнивание по дословному: ≥ 0,7 совпавших слов, длина ≤ 1,15×, покрытие лемм ≥ 0,75 |
| 3 | ts_polish.py (локально) / облачные проходы → polish_merge.py --work … --in <polish_*.json> | polish.jsonl — «как сейчас» + gist | числа-слова и латиница сохранены, нет цифр, длина 0,75–1,45×, новых слов ≤ 45 % (≤ 55 % у блоков короче 60 слов), абзац ≤ 52 слов, звёздочки парные, жирное внутри фразы; провал → fallback (--fallback-from — на прошлую шлифовку) |
| 4 | ts_short.py --work … (+ облачный судья) | short.jsonl — подписи «пути урока» | 1–5 слов, без цифр, без «урок/модуль», не повторяет главу, mech_hit |
| 5 | inserts_merge.py --root … --topic … --meeting M01 --in out/ --apply | inserts_M01.json, deixis_01B.json | якорь существует, 2–60 с, кадры в screens.json, мокапы в манифесте, нет дублей, family |
| 6 | plan_from_script.py → build_mockups.py | visual/montage_plan.json, mockups/manifest.json | DOM-QC мокапов, lint экранов |
| 7 | doc_lesson_table.py … --dump-rows rows.json | дамп строк в порядке занятия (с lesson_t), док не тронут | вход для двух следующих гейтов |
| 8 | flow_check.py --topic … --rows rows.json | flow_check.json | HARD: строки hook / ctv / loop существуют, петля открыта раньше, чем закрыта, CTV — последняя читаемая, роль ctv ровно одна; WARN: хук в первой-второй строке, у каждой главной мысли микро-итог; раздел promises — отчёт, не гейт |
| 9 | deixis_check.py --topic … --rows rows.json --kinds screen | deixis_check.json | каждое «нужен кадр» закрыто: кадр в 6 своей строки, соседняя вставка ±1 или карточка в 7 |
| 10 | qa_script.py --script …/scripts/script_01A.v1.json --channel YTUVIE (версия сценария ≠ версия вкладки) | *.qa.json | HARD: время чтения вне ±15 % от цели блока, «модуль» (banned_framing профиля), несбалансированные скобки, пустые абзацы; WARN (в модели «видео = занятие»): клише, длинные фразы, цифры, латиница без подсказки |
| 11 | doc_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 строки текстом без записи |
| 12 | export_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 картинок не залиты».flow_check exit 0 — структура занятия не спорит сама с собой; список open-обещаний прочитан глазами.deixis_check --kinds screen — ни одной незакрытой отсылки к экрану.qa_script HARD = 0 по каждому блоку; WARN разобраны.polish.jsonl: "source": "prev-version" = 0 и "ok": false = 0 — иначе строка молча откатилась и в доке выглядит нормальным текстом.ts_short --audit-labels --topic … — 0 нарушений механики в подписях, gist и текстах с картинок; DOM-QC мокапов 0.doc_lesson_table.py замка нет — один прогон за раз, супервизор конвейера перед ручной сборкой гасить; у сборщиков с автозапуском — замок с PID владельца._drive_ids.json, ключ stem.md5-8.ext). По имени док после перекропа получал старую картинку с тем же именем — спикер в углу (19.09).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.--accept-rows прощает длину и новые слова, но не цифры и имена. Прощается: длина, доля новых слов, абзац длиннее 52 слов. Не прощается: «урок/модуль», арабские цифры (даже M01 внутри [⚠️ ПРОВЕРИТЬ …]), потеря глоссарного латинского названия, жирное не внутри фразы (bold_inline_ok); gist вне 2–12 слов молча обнуляется. В флаг класть каждую тронутую строку.memex pull затирает локальные short.jsonl и polish.jsonl — судейские названия и облачную шлифовку применять после pull.<<'EOF': без кавычек bash подставляет $5 как позиционный параметр, и «$5 МЛН» молча превращается в « МЛН» — ошибки нет. Проверять строки с $ после записи.--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.scripts/13_preprod/ не в git (решение 16.09) — публичное описание стадии — эта страница; код живёт локально у Романа и на Memex, README — в папке 13_preprod/.