Снимок кода — код этапа не меняется, пока собирается версия (в YTEVO02 run_vN.sh зовёт этап 0510_autocut как есть, в сессии он не правился). Любая правка — новая версия в имени, прежняя остаётся рядом.
Роман 03.10.2026: «там из процессов только публикация одинаковое».
pravki./review.directives_v4.json), не правка файла.run_vN.sh через очередь; приёмка — чек-лист числами (qc_<tag>.json).Общее у треков — только Publish. Страница версии до рендера — план экранов с той же механикой «# ссылка», «ок / править»; здесь — её продолжение после рендера: не «что будет», а «что стало».
Правки клиента к v5 — по версиям: что пошло не так и что стало правилом.
Правила из этих версий: звук раньше экранов; край слова — по собранному звуку; экраны сверять после ужатий. На 03.10 сборка v8 ждёт очередь, файлов v8 ещё нет.
Образец — YTEVO02, правки клиента к v5, показанные на v7 (страница v3, 03.10.2026). Живой образец с роликами — на диске: /Volumes/T7-Beige-RYA/YTEVO/YTEVO-Projects/YTEVO02_evolution_manifesto/00_Setup/05_Review/v7_compare/YTEVO02_v7_vs_v5.html; на сайте его нет — в кадрах клиент.

compare_page.py
SUMMARY в compare_page.py
compare_v5_v7.py clips → TEXT в compare_page.py
compare_page.py --check → compare_page.pyЕсли менялся кадр — на странице версии раздел «Кадрирование по замеру» (образец YTCG37 v4): правило кадра, что вышло числами, все планы парами v3 → v4 с ← → ↑ px; в генераторе этапа такого раздела пока нет — надо построить.
del/ins; «Что сделано», «Чем проверено», ⚠. Сверх-находки — те же карточки, свёрнуты.Так замечание лежит в compare_points.py (места и окна) и в directives_v4.json (поле _vN_why). Пример — замечание № 9.
| Поле | Откуда берётся | Пример (№ 9) |
|---|---|---|
| Таймкод клиента | ось той версии, которую он смотрел (v5), не текущей | 11:55 |
| Слова клиента | дословно, без пересказа | «обрыв окончания» |
| Было | расшифровка прошлого файла и пробы источника; обрыв назван словами | «…родится именно здесь» — слово обрезано; распознавание слышит «в этом» |
| Стало | расшифровка звука новой версии тем же способом | «…родится именно здесь.» |
| Что сделано | действие над листом в единицах листа | конец куска k40 продлён на 0,80 с |
| Чем проверено | инструмент и число, не «послушал» | расшифровка: v5 — «именно в этом», v7 — «именно здесь» |
| Где в указаниях | ключ directives_v4.json (edges, trims, screens_time) и строка в _v6_why | «k40 конец до „здесь“ целиком (+0,80 с)» |
Окно ролика — с запасом в несколько секунд до и после: правку надо слышать в потоке речи, а не обрубком (в образце 6–49 с на пару).
edges: «k40 конец до „здесь“ целиком»Слова клиента дословно — «обрыв окончания». Ролик «было» режется из YTEVO02_v5_light.mp4, который он смотрел; окно — с запасом до и после.
trims и edges пишутся в старой оси; probe.py печатает все три времени: фильм v5, старая ось, источник.YTEVO02_v5_light.mp4, который смотрел клиент, а не из листа: иначе он не узнает место.EXTRA с теми же полями, свёрнутый раздел и предупреждение сверху — не молча. v7 → v8: экраны S10 и S13 стояли 5,28 и 6,92 с вместо 11,48 и 10,76; слоги «ЭВА · Ц» → «ЭВО · ЦИ».hf conform screens deliver qc light — звук не пересобирается, длина та же, 22 796 кадров (на 03.10 сборка ждёт очередь, файлов v8 ещё нет).Таблица этапа Cut (правка → что пересоберётся) глазами ревью.
| Замечание | Куда в указаниях | Что пересобирается |
|---|---|---|
| обрыв слова, лишний звук на краю | edges — сдвиг края куска | лист → звук → экраны (моменты по dialogue.wav нового листа) → задетые куски → выдача → приёмка |
| запинка, повтор, пауза | trims — ужатие внутри куска | то же; стык прячется ракурсом второй камеры или в окне экрана |
| убрать реплику или спикера целиком | trims на весь кусок + screens_off | лист, звук, экраны; на старой оси остаётся дыра — края экранов рядом задавать screens_time |
| на экране не то | план экрана (lesson_plan) или facts | только этот экран (шаг hf) и выдача; звук не трогается |
| экран стоит мало или много | screens_time | этот экран и выдача |
| крупность, «много места над головой» | zoom / framing | куски этого чанка и выдача — отдельной версией: v7 рядом с v6, v6 цел; показ — раздел «Кадрирование по замеру»: правило, что вышло, все планы v3 → v4 числами ← → ↑ px и парами кадров (образец YTCG37 v4, 03.10) |
Звук раньше экранов: screens2.py ставит экраны по словам dialogue.wav текущего листа; первый прогон v6 шёл со звуком v5 — 12 экранов перерисовали вторым проходом. Версии — в имени, ничего не затирать: лист перед правкой — в _bak_vN_дата/, прежний файл остаётся в 03_Exports/.
| Замечание · куда в указаниях | Лист | Звук | Экраны | Куски | Выдача |
|---|---|---|---|---|---|
Речь: обрыв, запинка, лишняя реплика · edges, trims | ✓ | ✓ | ✓ | ! | ✓ |
Экран: не то или не столько · lesson_plan, facts, screens_time | · | · | ! | · | ✓ |
Кадр: крупность, место над головой · zoom, framing | · | · | · | ! | ✓ |
По таблице выше и README этапа 0510_autocut. Реплика целиком — trims на весь кусок + screens_off. После любой пересборки — приёмка qc.py; крупность — отдельной версией, прежняя цела.
light.py): v5 ушла ему в Loom (главы и расшифровку для Loom готовит сессия); замечания вернулись Роману голосом и текстом, он переслал их сессии._qcfail_sync) — лежит до его слова.| Что | Когда | Норма | Откуда взялась |
|---|---|---|---|
| У каждого замечания — пара и адрес | compare_page.py --check перед записью | «роликов не хватает: 0»; у карточки id, в сводке ссылка | ворота «у каждого замечания пара» |
| Тексты «было / стало» — по расшифровке обоих файлов | compare_v5_v7.py hear до вёрстки | оба окна одним способом (mlx-whisper, слова с временем); обрыв и повтор названы словами | распознавание дописывает: «здесь» → «в этом», «не хватает» → «актуально» |
| Ролик «было» — из файла клиента | при нарезке пар (clips) | «было» = лёгкая копия, которую смотрел клиент; «стало» — готовый файл новой версии | иначе клиент не узнаёт место |
| Приёмка vN+1 — числами в подвале | после qc.py новой версии | все ворота зелёные: кадры по плану, −14 LUFS, синхрон в допуске 20 мс, склейки по плану, чёрного нет | чек-лист; первая выдача v7 легла с −35 мс |
| Собранная речь — до рендера и после | audition.py --only до сборки, --film по файлу | все слова на месте, метки резов ┃ между словами; двойное слово — узким окном (win) | Whisper «дописал» «всего» — выдача v6 остановлена |
| Сверх-находки сверены | перед предупреждением сверху | у каждой — пара, адрес, что сделано | ворота «каждая находка сверена» |
Ухом фильм не слушал никто — звук проверен распознаванием, огибающими и замерами; так и пишется в подвале. Что код не проверил, помечено ⚠ и отдано Роману на слух.
| Файл | Что хранит | Кто пишет |
|---|---|---|
directives_v4.json → _v6_why, _v7_why, _v8_why | что и зачем по каждому месту; _edges_why, _screens_time_why — почему край стоит так | сессия, при каждой правке |
compare_points.py | замечания дословно, окна обеих осей, точки правки; сверх-находки EXTRA | сессия |
_v6_tools/README.md | «три вещи, которые стоили времени»: Whisper дописывает, две сетки кадров, дыра в листе | сессия после приёмки |
00_Handoff/HANDOFF_… | замечание → что сделано → vN, приёмка числами, открытое для Романа | сессия в конце |
| чек-лист целостности | новая строка из ошибки, которую нашёл клиент: обрыв слова в файле, экран после ужатий | сессия, после «ок» Романа |
| журнал переделок | что переделывали из-за порядка шагов (звук после экранов) | сессия |
audition.py), внутри источника — отрезками порознь (probe.py --hear)._v6_tools/README.md · хэндофф v6, раздел 6floor(v_in·25+0,5), длина — по старой оси; при разном числе кадров уезжает и конец: k50 при +0,28 терял 40 мс речи. Сдвиг брать так, чтобы оба квантования дали одно число (+0,285), швы сверять встык._v6_tools/README.md · _edges_whyscreens_time (S05: 106,38)._v6_tools/README.md · _screens_time_whyrun_vN.sh шаг audio первый.хэндофф v6, раздел 6qc.py красный. Первая выдача v7 оставлена как YTEVO02_v7_4K_qcfail_sync.mp4, не удалена; там теперь общий план камеры A.хэндофф v6, раздел 8P=/Volumes/T7-Beige-RYA/YTEVO/YTEVO-Projects/YTEVO02_evolution_manifesto T=$P/00_Setup/02_Assembly/autocut_v4/_v6_tools V=~/YTAI/environment/.venv_transcribe/bin/python $V ~/YTAI/scripts/05_editing/0510_autocut/plan.py --project $P build --check # ворота листа: дыры, нахлёсты, экраны zsh $T/run_v6.sh # v6: audio hf conform screens deliver qc — тяжёлые шаги через render_queue.py --idle-pass 240 zsh $T/run_v7.sh # v7: то же + light; --jobs 1, RENDERQ_MAX_SWAP_GB=14, RENDERQ_MAX_PRESSURE=2 zsh $T/run_v8.sh conform screens deliver qc light # v8: только экраны и выдача, звук не трогается python3 $T/compare_page.py --check # сколько роликов не хватает; версию страницы не растит python3 $T/compare_page.py # → 05_Review/v7_compare/YTEVO02_v7_vs_v5.html + version.json $V ~/YTAI/scripts/05_editing/0510_autocut/light.py $P/03_Exports/YTEVO02_v7_4K.mp4 --kinds 1080 --name YTEVO02_v7 # лёгкая копия 1080p клиенту; через очередь python3 scripts/site/site_archive.py push --apply # показ → Shared Drive «Archive», папка yt.rya.ae/ (без --apply сухо)
Образец сделан под один проект: пути и версии зашиты в скриптах _v6_tools. run_vN.sh — имя по версии: run_v6.sh, run_v7.sh, run_v8.sh.
$V $T/probe.py k16 --pad 2.5 # место по исходному звуку: слова с временем, паузы, три оси времени $V $T/strips.py --only k13,k38 # края кусков по 10 мс в трёх полосах с линейкой кадров $V $T/edge_cards.py # карточка на каждый звуковой край листа $V $T/audition.py --dir $P/00_Setup/02_Assembly/autocut_v4/directives_v4.json --only k16,k17 # собранная речь куска с метками резов — до рендера $V $T/audition.py --film $P/03_Exports/YTEVO02_v7_4K.mp4 --all # то же по звуку готового файла — приёмка $V $T/compare_v5_v7.py hear # оба окна каждого места → probes/compare_hear.{txt,json} $V $T/compare_v5_v7.py clips --out $P/00_Setup/05_Review/v7_compare # пары роликов 1280×720 аппаратным кодеком, по одному
Модели — через общий замок MLX, по одной; ролики — аппаратным кодеком по одному.
_v6_tools/; тексты «было / стало» и «что сделано» написаны руками по расшифровкам.~/YTAI/scripts: пути, версии и места зашиты в коде.gen_screen_plan.py: «# ссылка», «ок / править», «Скопировать решения».edges/trims куска → окно в прошлой и новой версии, без ручного compare_points.py.site_archive.py push. Приёмка и счётчики — из qc_<tag>.json.compare_points.py вести как формат — его генератор потом и прочитает.