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.
Installs into .claude/skills of the current project.
Are you the author of Routine Opt?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/tonydzi-routine-opt)
---
name: routine-opt
description: "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."
license: MIT
version: 1.1.0
---
# /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-финал**
(только суждение). Модель просыпается по коду возврата, а не читает вывод глазами.
**Контракт предгейта — три кода, больше ничего:**
| код | смысл | что делает рутина |
|---|---|---|
| `0` | `PREGATE: CLEAN` | доложить одной строкой и ЗАВЕРШИТЬ. LLM-работы ноль |
| `10` | `PREGATE: 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](https://github.com/tonydzi/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](https://github.com/tonydzi/secondop-panel) (a second opinion from a panel of external models), [claude-memory-tidy](https://github.com/tonydzi/claude-memory-tidy) (stop your agent's memory from rotting), [telegram-mcp-kit](https://github.com/tonydzi/telegram-mcp-kit) (your own Telegram over MCP in about 15 minutes).
Author: **Anton Dziatkovskii**, Palo Alto AI Research Lab. Telegram [@tonydzi](https://t.me/tonydzi) - WhatsApp [+1 341 222 9178](https://wa.me/13412229178) - X [@Tony_Stef_](https://x.com/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.