Ускорение записи экрана
Запуск Навыка
При явном вызове или однозначном смысловом совпадении применяйте навык сразу. Перед первым шагом покажите ровно одну короткую контекстную строку (не более 30 слов) и продолжайте работу в том же ответе, не ожидая реакции:
Применяю экспериментальный навык «Ускорение записи экрана» (обратная связь — @kir-kopylov): <кратко назовите конкретную пользу для текущего запроса>; продолжаю без ожидания.
Не включайте в строку author_github, внутреннее имя папки или пересказ всего запроса. Не спрашивайте, применять ли навык.
Не завершайте первый ответ строкой уведомления или обещанием будущей разведки. Сразу после неё самостоятельно выполните доступный read-only поиск исходника и, если кандидат однозначен, read-only определите его имя, путь, вес, длительность, геометрию, наличие звука и фактическую частоту кадров. Не создавайте на этом шаге рабочую папку, plan.txt или медиафайлы. Если исходник нельзя выбрать однозначно, задайте один ближайший вопрос о выборе файла. Если исходник однозначен, но точный весовой лимит не следует из запроса, задайте один ближайший вопрос о лимите. Не задавайте оба вопроса сразу.
Если одновременно подходят совместимые навыки, выберите минимальный набор и покажите одну общую строку. Если подходы ведут к несовместимым результатам и запрос не позволяет выбрать, спросите только о желаемом результате, не о разрешении применить навык.
Запуск навыка не расширяет полномочия. Выполните всю безопасную и уже разрешённую часть; запросите подтверждение только непосредственно перед ещё не разрешённым внешним или изменяющим действием. Не запрашивайте повторно уже данное разрешение и не дублируйте системное окно подтверждения.
Обзор
Длинная запись экрана превращается в короткий смотрибельный файл: ступенчатое ускорение, вырезы, сжатие. Высота голоса не меняется, звук с картинкой не разъезжается.
Задача выглядит простой ровно до первой сборки. Запись экрана снимается с переменной частотой кадров — кадр пишется только когда картинка меняется, — и наивная нарезка даёт куски неверной длины. Разбег копится на каждом стыке склейки: на живом примере он достиг трёх секунд за шесть с половиной минут. Поэтому всю арифметику и обязательную сверку длин ведёт скрипт scripts/build.py, а не модель на глаз.
Вся работа идёт в рабочей папке проекта. Исходник только читается, его неизменность проверяется в конце.
Естественные Входы
- «ускорь запись экрана», «сожми скринкаст», «видео слишком длинное»
- «разгони по ступеням», «вырежи куски из записи», «убери лишнее из демо»
- «уложи запись в двадцать пять мегабайт»
- пользователь показывает файл записи экрана с рабочего стола
Процесс
Контрфактический Гейт Рабочего Вопроса
Проверку проводи внутренне; пользователю не показывай вероятные ответы и карту изменений.
Перед любым вопросом проведи контрфактическую проверку: Представь наиболее вероятные ответы пользователя. Назови, какое решение, действие или часть результата изменит каждый ответ. Если следующий шаг при всех ответах одинаков — вопрос запрещён. Если пользователь уже зафиксировал выбор — запиши его, не открывай заново. Если неизвестное техническое и его можно проверить самостоятельно — проверь, не спрашивай. Задавай только ближайший вопрос, ответ на который реально меняет результат.
Шаг 1. Разведка исходника
Найди доступные видеофайлы поиском по маске, имя не набирай руками: в именах macOS встречаются неразрывные пробелы и длинное тире, а формат имени меняется между версиями системы. Сначала проверь файл, прямо указанный или переданный пользователем, рабочую папку и доступные локальные каталоги. Если один кандидат однозначно связан с запросом, выбери его без повторного подтверждения. Если кандидатов несколько или ни одного, после самостоятельного поиска задай один вопрос, который определит исходник; лимит веса одновременно не спрашивай.
До создания рабочей папки прочитай параметры исходника через read-only stat и ffprobe либо равноценный доступный инструмент. На этом шаге не запускай scripts/build.py: он создаёт рабочую папку. Перескажи наблюдаемые длину, вес, геометрию, наличие звуковой дорожки и фактическую частоту кадров простыми словами. Отдельно скажи вслух, если звуковой дорожки нет: тогда весь звуковой конвейер отключается сам, а финал будет один вместо двух.
Шаг 2. Лимит веса и план, затем остановка
Когда исходник определён, извлеки точный лимит веса из запроса и не переспрашивай уже названное значение. Если точного значения нет, задай один ближайший вопрос: без лимита / до пятидесяти мегабайт / другой размер. Если сначала пришлось уточнить исходник, вернись к лимиту только после ответа, не объединяй два вопроса. Значение передаётся флагом --target-mb. Про конкретные пределы почты и мессенджеров ничего не утверждай: они меняются, а пользователь свой предел знает.
Спрашивай лимит до раскладки по скорости: он на раскладку влияет. У записи экрана вес держит длительность, поэтому «не влезаем» лечится более агрессивным планом, а не качеством.
Затем собери таблицу ступеней. Если пользователь её дал — перенеси как есть. Если не дал — возьми образец из references/plan.example.txt и пересчитай под длину исходника. Ступени обязаны покрыть исходник целиком: дыра означает молча потерянный материал, и скрипт такой план отвергнет. Вырезы не придумывай, паузы автоматически не ищи.
Запиши таблицу в plan.txt рабочей папки и посчитай смету без сборки. Пути ниже — от корня папки навыка:
python3 scripts/build.py --src "$SRC" --out <рабочая папка> --dry-run [--target-mb N]
Остановись. Покажи факты об исходнике, таблицу ступеней с длиной каждого куска, итоговую длину, смету веса и времени, попадание в лимит и путь рабочей папки. Второй вопрос: принять / поправить ступени / другое. Жди ответа.
Шаг 3. Пилот, затем остановка
Собери пилот на самой быстрой ступени — это секунды.
python3 scripts/build.py --src "$SRC" --out <рабочая папка> --pilot 30 [--target-mb N]
Остановись и покажи сам пилот, вырезку кадра в натуральную величину, образцы звука до и после растяжения и вес в пересчёте на весь фильм. Вырезку кадра посмотри сам и скажи, читается ли мелкий текст.
Вопрос: собирать / качество получше / скорость поменьше. Жди ответа.
Смысл шага: читаемость мелкого текста и разборчивость ускоренной речи — суждение, которое нельзя измерить. Всё остальное скрипт проверит сам.
Шаг 4. Сборка и приёмка
Запусти полную сборку. Ориентир: двенадцать минут исходника собираются примерно за три минуты, долгие сборки запускай фоном, в процессе ничего не спрашивай.
python3 scripts/build.py --src "$SRC" --out <рабочая папка> [--target-mb N] [--crf N] [--height N]
Коды возврата: ноль — все проверки сошлись; один — ошибка входа, ничего не собрано; два — упал внешний инструмент; три — сверка не сошлась, файлы собраны, но бракованные.
Скрипт печатает покусочную таблицу и нумерованный список проверок. Процитируй их пользователю, а не пересказывай «всё хорошо». Расхождения до полукадра — неделимость кадра, а не ошибка. Вердикт «готово» выдавай только при нуле проваленных проверок; при провале назови номер, факт и допуск.
Ненулевой код возврата — повод остановиться. Нулевой код поводом объявить готово не является: он уже однажды соврал, будучи съеденным конвейером команд.
Границы
Не применяйте навык к видео с камерой, лицом, музыкой или монтажным ритмом: ускорение и подмораживание кадра там читаются как брак. Не применяйте, когда нужен настоящий монтаж — титры, переходы, кадрирование по сюжету. Не применяйте, когда нужно только сжать без изменения скорости: это одна команда, разворачивать четырёхшаговый конвейер незачем. На клипах короче двух минут выигрыш не окупает пилот и сверку. Навык рассчитан на macOS.
Что нельзя терять при доработке навыка:
- обрезку задавать только так: перемотка до входного файла, ограничение длины после него, с обязательным обнулением отсчёта времени;
- длину куска прибивать жёстко и резать обе дорожки одной меткой, добивая картинку подмораживанием кадра, а звук тишиной;
- высоту голоса сохранять отдельной утилитой растяжения, а не подменой частоты дискретизации;
- каждый вызов кодировщика делать с отключённым чтением стандартного ввода;
- вердикт выносить по таблице сверки, а не по коду возврата;
- результат класть в рабочую папку проекта, исходник не трогать.
Подробности и измерения — в references/ffmpeg-notes.md. Читайте его при любой нештатной ситуации: почти все «естественные» решения там уже проверены и отвергнуты с числами.
Опрос После Использования
Опрос задаётся один раз — после того как показан итог и озвучен вердикт по проверкам либо работа явно остановлена, не посреди сборки. Если пользователь уже ответил «пропустить» в этой сессии, не переспрашивайте.
Опрос по навыку:
1. Что в работе этого навыка было полезно?
2. Что стоит доработать в процедуре или формате ответа?
Можно ответить коротко или написать "пропустить".
Если пользователь ответил, сохраните санированную карточку в ~/.codex/skill-runs/uskorenie-zapisi-ekrana/usage-feedback.jsonl — лучше через bundled script:
python3 scripts/log_usage_feedback.py --liked "..." --improve "..." --outcome "..."
Script перед записью редактирует приватные пути, контакты и token-like строки и сохраняет в JSONL redaction_applied и redaction_types. Если запись невозможна из-за sandbox, прав или отсутствия tools, не делайте вид, что лог сохранён: скажите об этом и покажите короткую JSONL-карточку для ручного сохранения. Raw-ответы, контакты, пути и секреты не коммитить.
Логирование Сбоев
Перед выполнением прочитайте локальный known-exceptions.yaml как список уже известных случаев и применяйте подходящее do_next_time без нового поиска.
Если пользователь поправил skill, tool/API/browser упал, нарушен режим работы, пришлось искать workaround или skill сделал ложное предположение, запишите приватную карточку в ~/.codex/skill-runs/<skill-name>/exception-log.jsonl.
Пишите факты: что skill хотел сделать, что сделал, где сломался, какая предпосылка была ложной и что сделать в следующий раз. Если поле неизвестно, пишите unknown. Raw logs не коммитить.