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.
Scanned 10/7/2026
npx -y skills add tonydzi/second-brain-starter-kit --skill routine-opt --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Routine Opt?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/tonydzi-routine-opt)More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.
---
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.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!