Design: process-mock-videos — self-healing loop для обработки роликов
Дата: 2026-07-09
1. Цель
Автоматизировать прогон очереди mock/chatgtp/videotobe.md через chatgtp-пайплайн в
статьи blog-draft/, с самопроверкой результата и авто-исправлением причин сбоя —
циклом, который повторяется, пока все ролики не пройдут набор проверок или пока не
исчерпан лимит итераций.
Скилл не заменяет find-mock-interview-videos (discovery). Это отдельная задача:
processing существующей очереди.
2. Не-цели (YAGNI)
- Не трогает discovery / поиск новых видео.
- Не переписывает уже опубликованные
blog/*файлы — пишет только вblog-draft/. - Не строит UI/дашборд — вывод текстовый, в терминал +
process.md. - Не добавляет платных моделей — только free OpenRouter.
3. Драйвер цикла
Цикл ведёт Claude по инструкциям SKILL.md. Причина: self-fix шага 4
(правка *.prompt.md, run_pool.sh, Go-кода) требует рассуждения, недоступного
bash-скрипту. Скрипты (free_models.sh, check_articles.sh, llm_grade.sh,
run_pool.sh) — инструменты, которые Claude вызывает; классификацию сбоев и
правки делает Claude.
4. Компоненты
Все новые файлы — под .claude/skills/process-mock-videos/.
| Файл | Роль | Тип |
|---|---|---|
SKILL.md | Инструкции драйвера цикла для Claude | новый |
scripts/free_models.sh | Тул выбора моделей → models.txt | новый |
scripts/check_articles.sh | Проверки 1–3 по каждому id → таблица статусов | новый |
scripts/llm_grade.sh | Проверка 4 (LLM-качество), финальный прогон | новый |
mock/chatgtp/run_pool.sh | Движок прогона + per-video ротация модели | правка существующего |
4.1 free_models.sh — источник моделей
Находка из исследования OpenRouter (2026-07-09):
- Публичного endpoint с рейтингом по популярности нет.
/rankings— server-rendered RSC (POST), нестабилен для парсинга.api/frontend/v1/private/models→ 401 (требует Clerk-cookie). - Публичный
GET https://openrouter.ai/api/v1/models→ 200, отдаёт ~346 моделей, из них ~26 free (pricing.prompt=="0" && pricing.completion=="0"), с полямиcontext_length,architecture(модальности). Поля популярности нет.
Поэтому «топ рейтинга» через чистый API недостижим — честный тул:
GET /api/v1/models.- Фильтр free:
pricing.prompt=="0" && pricing.completion=="0". - Фильтр text→text:
architecture.input_modalities/output_modalitiesсодержатtextи не только аудио/картинку (отсечьlyria, voice-модели и т.п.). - Порядок: сначала curated allowlist проверенных instruct-моделей
(напр.
qwen/qwen3-*,meta-llama/llama-3.3-70b-instruct:free,openai/gpt-oss-120b:free,google/gemma-*-it:free,nvidia/nemotron-*), затем остальные free по убываниюcontext_length. - Вывод: упорядоченный список id в
models.txt(по одному в строке), плюс stdout-сводка.
Fallback: если API недоступен — использовать существующий models.txt
(последний удачный) или встроенный curated список.
4.2 run_pool.sh — правка
Текущий скрипт: 3 воркера, 3 ключа, pull-next из очереди, один AI_MODEL.
Правка: при FAIL по видео воркер ротирует модель — берёт следующую из
models.txt и повторяет то же видео; помечает FAIL окончательно только когда
список моделей исчерпан. Ротация — bash, без обращения к Claude (дёшево, для
429/rate-limit/пустой-ответ/делистнутая-модель).
Существующее логирование DONE/FAIL в process.md и --resume сохраняются.
4.3 check_articles.sh — проверки 1–3
По каждому id из очереди, каскадом (дешёвые раньше):
- DONE + файл: в
process.mdдля id естьDONE; вblog-draft/есть*<id>*.mdили.mdx. - mdxcheck:
node mdxcheck.mjs <file>печатаетOK. - Контент не мусор: есть frontmatter (
---), длина ≥ порога, присутствует кириллица, нет refusal-строк (I cannot,I'm sorry,as an AI,как ИИ,не могу помочьи т.п.).
Вывод: строки id status category, где category = имя первой упавшей проверки
(missing, mdx, garbage) или ok. Формат машиночитаемый (для Claude) и
человекочитаемый.
4.4 llm_grade.sh — проверка 4 (только финал)
Один раз, в конце цикла, на статьях со status=ok. Отправляет статью free-топ-модели
(первая из models.txt) с запросом «оцени связность и полноту ответов, верни
PASS/FAIL + причина». FAIL → добавляется в список на доработку следующей итерации
(если лимит итераций не исчерпан) или в финальный отчёт.
5. Проверки (сводка)
| # | Проверка | Инструмент | Когда |
|---|---|---|---|
| 1 | DONE в логе + файл существует | check_articles.sh | каждую итерацию |
| 2 | MDX компилируется | mdxcheck.mjs | каждую итерацию |
| 3 | Контент не мусор | check_articles.sh | каждую итерацию |
| 4 | LLM-качество | llm_grade.sh | один раз, финал |
6. Self-fix — классификация и правки
Всё авто (без апрува), с git-откатом (см. §7). Claude сопоставляет категорию сбоя с фиксом:
| Категория сбоя | Признак | Фикс | Исполнитель |
|---|---|---|---|
| model/transport | 429, rate-limit, пустой ответ, модель делистнута | ротация модели | bash-авто в run_pool.sh |
| content/mdx | category=mdx или garbage, refusal | правка *.prompt.md | Claude, авто |
| infra | краш скрипта, битый путь, Go-паника | правка run_pool.sh / Go | Claude, авто |
7. Loop + git-безопасность
free_models.sh → models.txt
iter = 1
loop:
git commit -am "checkpoint before iter <iter>" # контрольная точка
run_pool.sh (только невыполненные/упавшие id, --resume)
check_articles.sh → статусы
ok_count = число status=ok
if все id ok:
llm_grade.sh (финальная проверка 4)
если все PASS → выход + отчёт
иначе добавить FAIL-ы в список доработки
если список доработки пуст → выход + отчёт
classify failures
apply fixes (rotation / prompt / script) — авто, коммит правок
re-run упавших id
new_ok = число status=ok после правок
if new_ok < ok_count: # регресс
git reset --hard <checkpoint> # откат плохого фикса
пометить категорию как "нужен ручной разбор"
iter++
if iter > MAX (=5): выход + отчёт что осталось
Каждая итерация — коммит-checkpoint перед прогоном. Если правка ухудшила pass-count
относительно checkpoint — жёсткий откат git reset --hard к нему, категория
помечается для ручного разбора, цикл продолжается по остальным.
Уточнение семантики отката: checkpoint фиксирует только отслеживаемые файлы —
код и промпты (*.prompt.md, run_pool.sh, Go). Сгенерированные статьи лежат в
blog-draft/ (untracked), git reset --hard их не трогает; они перегенерируются
идемпотентно на следующем прогоне (--resume / при необходимости --clean-state
по конкретному id). Таким образом откат отменяет именно плохую правку кода/промпта,
а не результаты, — что и требуется.
8. Финальный отчёт
В конце — сводка: сколько id всего, сколько OK / PASS, что осталось не решено и почему (категория + помечено ли для ручного разбора), какие правки применены (ссылки на коммиты), какая модель победила по большинству видео.
9. Success criteria
- Скилл запускается на непустой
videotobe.mdи доводит цикл до выхода (все OK/PASS илиiter>MAX) без ручного вмешательства. free_models.shвозвращает непустой упорядоченныйmodels.txtпри доступном API; корректно падает на fallback при 401/сетевой ошибке.check_articles.shверно классифицирует известные примеры: валидная статья →ok; сломанный MDX →mdx; пустой/refusal →garbage; нет файла →missing.- Регресс-правка откатывается через
git reset --hardк checkpoint (проверяемо: ok_count не может уменьшиться между итерациями). - Ничего в
blog/не изменено.