本文へ移動
cccskills
無料GitHub で公開

routine-opt

Audit and cut the cost of a machine's scheduled routines: measure tokens per run, pick a lever (cheaper model, split, lower frequency, shorter prefix, retire) and prove the saving with a before-and-after measurement. Use when background routines burn more than interactive work. Triggers: /routine-opt, /ropt, routine audit, cheaper routines.

インストール方法を見る

含まれるファイル(1)

  • SKILL.md21.9 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

/routine-opt — сделать парк рутин дешевле, не сломав его

Заказ Антона (голосом, 10.09.2026): «аудит всех рутин, часть на Sonnet, часть декомпозировать, запускать реже и дешевле».

Главный факт, с которого начинается любой прогон этого скилла (замер хаба 09.09.2026): цена прогона = ходы × носимый префикс, а не «дорогая модель». Одна рутина за один прогон уносила 155M токенов; носимый префикс сессии с полным набором коннекторов — 110–134k на каждый ход. Поэтому рычаг «модель» стоит в этом скилле последним, а не первым: он делит счёт, а первые три рычага его вычитают.

Шаг 0 — RECALL (не начинай с нуля)

python [путь владельца] "аудит рутин цена токенов модель декомпозиция"

Что уже решено и НЕ переоткрывается без новой улики:

  • оргмодель «рутины = сотрудники» (decision-2026-08-21-routine-org-model): менеджер = robot-audit-weekly;
  • вердикт панели 4 LLM (insight-panel-routines-model-consumption-2026-08-10): корень — отсутствие backpressure, перевод на дешёвую модель без него = «дешёвый мусор вместо дорогого»;
  • Sonnet-only для рутин сотрудников (Библия), узлы Антона живут по §6.2.

Шаг 1 — замер (0 токенов, обязателен)

python ~/.claude/scripts/routine_cost_audit.py --days 7 --out ~/.claude/state/routine_cost.json

Читаем колонку «за прогон», а не «за окно»: за окно дорога рутина, которая просто часто ходит, а чинить надо ту, у которой дорог ОДИН прогон. Прибор сам ставит вердикт-кандидат; он кандидат, а не приговор — решение за человеком.

⚠️ Грабля, пойманная 14.09 (LAPTOP-1): строка cron: once + enabled: false = ОДНОРАЗОВЫЙ СИД (переиспользованный слот /slot), а не рутина. Замер 06–13.09: все 13 «🔴 декомпозировать» были такими сидами (10.09 — 540M за день), а настоящие суточные рутины стоили 4–9M/прогон. Сиды не прореживаются и не декомпозируются — их цена = длина живой работы сида; рычаг там один: узкий носимый префикс (headless claude_run.py) и call_budget_gate. В таблице такие строки читай как «сид», иначе весь Шаг 2 уйдёт в правку того, что больше не запустится.

Прибор молчит про пользу. Пользу спрашивай у соседа, иначе удешевишь то, что надо было уволить:

python ~/.claude/scripts/routine_value_audit.py --help

Шаг 2 — рычаги, строго в этом порядке

⛔ Рычаг «частота» на СТОРОЖЕ требует двух цифр (замер 22.09.2026). Прежде чем растянуть интервал сторожа/страховки, назови фору, которую он даёт основному звену, и срок, за который потребитель заметит пропажу; новый интервал меньше обеих или рычаг не применяется. Сторож с нулевым расходом LLM — кандидат в исключения по умолчанию, а не первая жертва экономии: 15.09 так растянули Claude Voice Backstop 4ч→8ч при форе 10 мин, 22.09 голосовая Антона потерялась, а прибор писал status=OK. Канон: память deflate-must-not-stretch-safety-nets, зеркало — /deflate Шаг 2-бис.

① Декомпозиция (🔴, прогон ≥ 20M). Режем рутину на две части: детерминированную (сбор, фильтр, дедуп, счёт — чистый python, 0 токенов) и короткий LLM-финал (суждение/текст). Признак, что рычаг твой: в SKILL.md рутины стоят шаги вида «собери → отфильтруй → посчитай → реши». Первые три шага LLM выполнять не должен вообще. Образец в парке: inbox-robot — 0-LLM предгейт, LLM будится только когда работа есть.

② Частота (🟡). Два прогона в сутки вместо одного — минус половина счёта без единой правки логики. Порог рутин обслуживания задан каноном: §10.0 — паразитные активности 1×/сутки; §7.5 — инбокс пол 1, потолок 2. Проверь заодно шторм расписания: 2–3 прогона там, где cron один слот (token_audit.py печатает это флагом) — это не работа, это догон планировщика.

③ Префикс (🟡, самый недооценённый). Сессия рутины тащит весь набор коннекторов на каждый ход. Рутине, которая пишет в файл и шлёт строку в Telegram, не нужны Gmail, Trello, Calendly, Drive, Fireflies и оба WhatsApp. Замер 09.09: 366 сессий за сутки не сделали НИ ОДНОГО MCP-вызова и перечитали 304M токенов префикса. Рычаг: тяжёлую часть увести на headless-рельсу (claude -p через claude_run.py), где набор инструментов узкий, а не в приложение с полным набором.

④ Модель (🟠). Здесь и только здесь — Sonnet.

  • OS-рельса (Windows-задачи, лаунчеры ~/.claude/scripts/*.cmd): --model sonnet в строке вызова, чинится одной правкой. Прибор печатает список тех, кто ещё на opus.
  • Рельса приложения (~/.claude/scheduled-tasks/<id>/SKILL.md): строка model: sonnet во frontmatter РАБОТАЕТ. Доказано 10.09.2026 телеметрией харнесса (message.model в jsonl, не самоотчёт): канарейка с model: sonnet → факт claude-sonnet-5; 30 рутин без поля → opus; две с model: opus → opus. Замер 06.08 («игнорируется») ПРОТУХ — классика [[ban-is-a-claim-recheck-before-workaround]]: месяц строили headless-обходы вокруг мёртвого запрета. Перевод = одна строка frontmatter, headless-перенос ради модели больше НЕ нужен.
  • ⛔ Граница §6.2: авторский голос Антона (контент, аутрич, посты, ответы лидам) на Sonnet не переводим. Дешевле там делается грунт вокруг текста, а не сам текст. Технические рутины (деплой, синк, дайджесты, сторожа, разбор инбокса) — переводим.

④-бис Потолок вызовов = ГЕЙТ, не записка в промпте. Блок «токен-дисциплина» текстом в 38 промптах (потолок 60) игнорировался: факт 76–190 вызовов за прогон. Работает только физика: hooks/call_budget_gate.py (PreToolUse .* в settings.json) считает вызовы сессии scheduled-task и после потолка блокирует всё, кроме закрывающих (runlog / heartbeat / bus_send / deploy_apply). Живые сессии не считаются никогда. Потолки — ~/.claude/call_budget_overrides.json (_cap дефолт + пер-рутинные строки), правит человек, не смена.

Почему дефолт 80, а не 40 и не 180 (замер хаба 03–09.09): договорной потолок был 60; здоровые рутины укладывались в 40–70 вызовов, больные делали 76–190. 40 отрубил бы половину ЗДОРОВЫХ прогонов посреди работы (гейт стал бы источником недоделанных смен — хуже перерасхода); 180 пропустил бы почти весь хвост, ради которого гейт строился. 80 = чуть выше верхней границы здоровых, чтобы первые смены дорезали хвосты, а известные тяжёлые получили именные 90–100. После урожая — ratchet ВНИЗ к 60, не вверх.

⑤ Утиль (⚪). Рутина без потребителя (§4.2 Connect) и без выхода (§5.5) не удешевляется, а увольняется. Порядок увольнения — не удаление: выключить на 30 дней + дата ревью, как 21.08.

python ~/.claude/scripts/routine_value_audit.py --app-tasks <опись задач приложения.json> \
       --win-tasks <schtasks /query /v /fo CSV> --out ~/.claude/state/routine_value.json

⚠️ Грабля, пойманная 11.09: routine_value_audit.py на хабе покрывает ТОЛЬКО Windows-задачи (home: win), а весь дорогой хвост живёт на рельсе приложения. Замер 11.09: 23 из 23 дорогих рутин пришли БЕЗ пары в пользе, поле quadrant пустое у всех 510 строк. Значит вердикт «уволить» по этому прибору выносить НЕЛЬЗЯ -- честная формулировка «польза не измерена», а не «пользы нет». Удешевлять (модель/частота/декомпозиция) это не мешает: они не меняют, ЧТО рутина делает.

⚠️ Грабля, пойманная 10.09: два прибора называют одну рутину по-разному — у цены ключ task:<id>, у пользы id, а описи задач приложения этот прибор ждёт в форме MCP-ответа, тогда как файл реестра на диске имеет форму {"scheduledTasks":[{"id":...}]}. Сшивать цену с пользой по нормализованному id, иначе получишь красивую таблицу из «НЕТ СТРОКИ» и решишь, что польза не доказана ни у кого ([[instrument-is-a-claim-too]]).

Шаг 2-бис — РЕЦЕПТ ДЕКОМПОЗИЦИИ (рычаг ①, по двум пилотам 11.09.2026)

Рутина режется на 0-LLM предгейт (весь сбор и вся сортировка) и короткий LLM-финал (только суждение). Модель просыпается по коду возврата, а не читает вывод глазами.

Контракт предгейта — три кода, больше ничего:

кодсмыслчто делает рутина
0PREGATE: CLEANдоложить одной строкой и ЗАВЕРШИТЬ. LLM-работы ноль
10PREGATE: WAKE + списокразбирать ТОЛЬКО названное, детали в state/<имя>.json
прочеепредгейт сам сломалсядоложить в 03 с хвостом, задачу не выдумывать

Что переезжает в код (и почему именно это):

  • порядок шагов — в jobs-watch шаг «перерисовать реестр ПОСЛЕ агрегаторов» жил прозой, и весь день таблица показывала вчерашний срез, если модель не дочитала до «2-бис-3»;
  • ретраи на известных отказах — 429 Sheets («подожди 70с») и 403 Gmail. Потеряешь при переносе — предгейт будет будить модель на каждую квоту, и экономия исчезнет;
  • пороги терпения — «борд мигает третий день подряд = слаг протух». Счётчик между прогонами живёт в state-файле, а не в памяти модели;
  • отсев шума — в pipe-a-inbox из 40 писем 38 оказались шумом ATS, ради которого модель будили каждый день.

Что НЕ переезжает: ответ человеку, тон, выбор тира, спорные решения. Предгейт pipe-a-inbox НИЧЕГО не отправляет — он только читает и сортирует.

Четыре грабли, на которых оба пилота споткнулись вживую

  1. Прибор отдаёт КАРТИНКУ, а нужны ДАННЫЕ. gmail_check.py усекал поля под ширину консоли (frm[:32]), и buzzrobot@substack.com приезжал как buzzrobot@substack — предгейт судил о домене по обрубку. Лечится не парсером похитрее, а флагом --json у самого прибора. Проверяй --help источника ПЕРЕД тем, как парсить его вывод.
  2. Классификация по форме адреса врёт. Первая версия объявила «фаундером» ювелирный магазин и рассылку Substack: сортировала по «не no-reply@ → человек». Честный признак даёт сверка с ДАННЫМИ (список компаний из <jobs database>), а не форма строки.
  3. no-reply@ — это «отвечать физически некому». Держи для него отдельное ведро event: интервью/оффер будят модель, остальное — тихий шум. Иначе получишь 38 «живых ответов» и нулевую экономию.
  4. Предгейт не имеет права глотать провал. Упавший шаг = WAKE с названной причиной. Иначе повторяется класс «частичный успех записан как полный» (10.09: 99 видео похоронено, потому что провал подзадачи не мешал закрыть кусок готовым).

Приёмка (иначе это не декомпозиция, а переписанный промпт)

  • тест предгейта с кейсами CLEAN / WAKE / провал шага / известный отказ (429), показанный красным на сломанном коде — прогони мутанта: вынь из предгейта проверку rc != 0 и убедись, что тест краснеет;
  • боевой прогон предгейта до правки промпта — он обязан отработать на живых данных;
  • две даты в Shadow-First-Queue.md и откат, названный ДО правки (бэкап SKILL.md).

Образцы в парке: ~/.claude/scripts/jobs_watch_pregate.py (конвейер из 4 команд) и pipe_a_inbox_pregate.py (сбор + классификация), тесты рядом с ними.

Шаг 3 — правка идёт КАНАРЕЙКОЙ, а не веером

Правило §7.3-бис: сначала одна рутина, потом узел другого типа, потом остальные. Откат называем ДО правки. Переписал разом весь парк — получил отказ по общей причине и не знаешь, какая правка виновата.

Шаг 4 — доказать экономию (иначе это не оптимизация, а надежда)

Две даты в 00-System\Shadow-First-Queue.md (§5.7): дата правки и дата урожая (+7 дней). На урожай — тот же прибор с тем же окном:

python ~/.claude/scripts/routine_cost_audit.py --days 7

Сравниваем за прогон по конкретной рутине до и после. Упало — вердикт ✅ с числом. Не упало — правка откатывается, а не объясняется. Выгодный вывод («стало лучше») требует усиленной проверки, а не ослабленной (§5.4).

Шаг 5 — закрыть заход

  • строка в реестр рутин (§4.5) по каждой тронутой рутине: что изменено и чем доказано;
  • ⭐ вердикт о самом скилле (§9.3-бис): 🔧 обновляю / 📝 обновлю не сейчас / ✅ не надо — с причиной;
  • если починка переносима на другой узел — раскатка в том же заходе (§7.3-бис), не «потом».

Шаг 6 — флот (приказ Антона 10.09: «на всём флоте минимизировать рутины»)

Этот скилл — флотский, не хабовый. Каждый узел прогоняет его у себя, потому что парк рутин, цены и потребители у каждого узла свои (§4.5-тер: частоту диктует срок потребителя ЭТОГО узла). Порядок на узле:

  1. Прибор: python ~/.claude/scripts/routine_cost_audit.py --days 7 (приедет синком конфига; нет на узле — доложить в 03, не переписывать своими руками).
  2. Рычаги строго ①→⑤ по Шагу 2; модель = frontmatter model: sonnet только на ТЕХНИЧЕСКИХ рутинах.
  3. Гейт вызовов: скопировать регистрацию call_budget_gate.py в PreToolUse местного settings.json (бэкап settings.json ДО правки) + завести местный call_budget_overrides.json.
  4. Канарейка §7.3-бис: одна рутина → узел проверил урожай → остальные. Даты правки и урожая в Shadow-First-Queue.
  5. Доклад в 03: строка «узел · рутин N · переведено M · гейт вкл/нет · урожай <дата>».

Решения «уволить рутину» и «резать аварийного сторожа» остаются за оператором узла (§4.5-тер ⛔).

Чего этот скилл НЕ делает

  • не выключает рутины сам (увольнение = решение человека, §3.1);
  • не трогает модель там, где идёт авторский голос Антона;
  • не верит счётчику вызовов вместо счётчика пользы ([[counter-measures-the-call-not-the-use]]).
<!--kit-footer-->

Like this skill? It is one of 100 in second-brain-starter-kit: the second brain we built for ourselves and run every day at Palo Alto AI Research Lab. Install the whole set with npx skills add tonydzi/second-brain-starter-kit. Everything is open source and free, so take what you need.

Flagships worth a look on their own: secondop-panel (a second opinion from a panel of external models), claude-memory-tidy (stop your agent's memory from rotting), telegram-mcp-kit (your own Telegram over MCP in about 15 minutes).

Author: Anton Dziatkovskii, Palo Alto AI Research Lab. Telegram @tonydzi - WhatsApp +1 341 222 9178 - X @Tony_Stef_

Engineers: want to test-drive this setup? Message me. I hand out free starter seeds to engineers who test and report back, and custom skill requests are welcome.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

03

無料

Run an autonomous consensus round between agent peers on several machines: they negotiate a decision over a shared channel and execute it without a human relaying messages. Use when multiple machines must agree on a change. Triggers: "/03", "work it out among yourselves", "find consensus". Wakes the human only for irreversible actions or a deadlock.

日本語の概要は準備中です。原文の説明を表示しています。

tonydzi/second-brain-starter-kit82026年10月10日 更新

1

無料

Recover a session after a hard crash (app died, machine rebooted, context lost mid-work): replay the turn-state ledger for the last requests, files and decisions, run a green/red health ping over the system map, file sync and MCP connectors, then rebuild the previous session history for pickup. Triggers: "/1", "resume after crash", "wake".

日本語の概要は準備中です。原文の説明を表示しています。

tonydzi/second-brain-starter-kit82026年10月10日 更新

agenda

無料

Show the operator's day: today's calendar plus what needs them personally (leads due, people awaiting a reply, deadlines), pulled from Calendar and Telegram and ranked. Read-only: sends and commits nothing. Triggers: "/agenda", "what's on today", "my agenda".

日本語の概要は準備中です。原文の説明を表示しています。

tonydzi/second-brain-starter-kit82026年10月10日 更新

ai-slop

無料

Rewrite machine-written text so it reads like a busy human wrote it: cut 50-70%, break the even rhythm, drop AI-tell words and filler, keep facts and protected terms. Use before publishing any post, reply or email drafted by a model. Triggers: /ai-slop, /slop, humanize, anti-slop, make it shorter and alive.

日本語の概要は準備中です。原文の説明を表示しています。

tonydzi/second-brain-starter-kit82026年10月10日 更新

Decision protocol for strategic work: recall the knowledge vault, run a gap analysis, emit a deep-research prompt for external tools, then synthesize the returned reports into a decision memo. Use before any new product, feature, market, pricing, GTM or architecture call, where local recall alone is not enough. Triggers: "/alfa-search-recall-deepresearch", "alpha protocol", "R+DR".

日本語の概要は準備中です。原文の説明を表示しています。

tonydzi/second-brain-starter-kit82026年10月10日 更新

- КРЕДИТ АВТОРУ ИДЕИ: совет из комментария (TG @ClawRus / @ClawInga, комменты под постами Антона в FB, треды и issue на… Триггеры: “/alpha-credit“, “/credit“, “кто нам это посоветовал“, “запиши совет“, “поблагодари советчиков“, “кому мы должны спасибо“, “кредит автору“, “чей это был совет“, “credit the author“

日本語の概要は準備中です。原文の説明を表示しています。

tonydzi/second-brain-starter-kit82026年10月10日 更新

tonydzi のスキルをすべて見る

このスキルの問題を報告する