Installs into .claude/skills of the current project.
Are you the author of Slot?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/tonydzi-slot)
---
name: slot
description: "РЕЕСТР ПЕРЕИСПОЛЬЗУЕМЫХ СЕССИЙ + выдача слота: породить ВИДИМУЮ Антону фоновую сессию БЕЗ апрув-окна, переиспользовав… Триггеры: /slot, /слот, «дай слот», «покажи слоты», «реестр сессий», «какие сессии можно переиспользовать», «запусти сессию в фоне», «нужна отдельная сессия», «сколько слотов осталось», «верни рутину назад», «slot», «reuse a session»."
version: 1.0.0
---
# /slot — реестр переиспользуемых сессий
## ⭐⭐⭐ ГЛАВНОЕ СВЕРХУ (24.08.2026): ПЕРЕИСПОЛЬЗОВАНИЕ — ПЕРВЫЙ выбор, create — второй
Приказ Антона 24.08 голосом: «нужно переиспользовать сессии, чтобы они как можно реже
запрашивали аппрувы». Порядок 31.07 («сначала create») **отменён**, потому что премиса,
на которой он стоял, опровергнута замером в тот же вечер.
**Что замерено 24.08 18:42 на хабе (живой прогон, не рассуждение):**
1. `update_scheduled_task(слот, description + prompt + fireAt)` прошёл **молча**.
2. Сессия поднялась мгновенно (у разовой задачи задержки диспетчера нет).
3. Сессия **переименовала себя сама** первым ходом через `mcp__ccd_session_mgmt__set_session_title`
и в `list_sessions` видна как «ПРОБА переиспользования слота 1842» (`titleSource=tool`),
а НЕ под чужим `taskId`. Старое утверждение «список title сессии не читает» — мертво.
4. Приложение само называет цену холодного `create` (текст ответа инструмента):
*«Tool approvals granted during a run are stored on the task and auto-applied to future
runs»* — **апрувы живут НА ЗАДАЧЕ**. Новая задача = пустая история апрувов = сессия
встанет на первом коннекторе, и окно будет ждать Антона. Прогретая — не встанет.
**Процедура (единственная):**
```
python ~/.claude/scripts/session_slot.py --claim "<суть сессии>" # даст taskId слота
update_scheduled_task(
taskId="<слот>",
description="<человеческое имя, видно в разделе Scheduled>",
fireAt="<ТОЛЬКО из двери: `python ~/.claude/scripts/_shared/fireat_now.py --in 15`>", notifyOnCompletion=true,
prompt="ПЕРВЫМ ДЕЛОМ переименуй эту сессию: вызови mcp__ccd_session_mgmt__set_session_title
с title \"<суть>\". Затем: <сид>")
```
⛔ **Строка про `set_session_title` обязательна** — без неё сессия висит под чужим именем,
и это ровно та невидимость, из-за которой канон переворачивали в июле.
`create_scheduled_task` остаётся честным путём **только когда пул пуст** — гейт
`spawn_slot_guard.py` теперь сам отбивает `create` при непустом пуле и печатает готовый
вызов `update`. Пул не посчитался — гейт пускает `create`, но **кричит в stderr**
(fail-open обязан быть громким, урок 29.07).
**Здоровье рельсы одной командой:** `python ~/.claude/scripts/session_approvals_doctor.py`
(0 LLM, 0 сети): рычаги · живость хука · объединение сторов · размер пула · режим прав у
порождённых сессий · оценка «создано против переиспользовано» за 7 дней.
## Зачем это существует (история: почему строили обход)
Антон 29.07: **«УБЕРИ ЭТИ АПРУВЫ»** и **«запрещено запускать любые сессии в чёрную»**.
Два требования сразу, и они тянут в разные стороны:
- сессия обязана быть **видимой** в списке приложения — иначе Антон не может её открыть,
дотолкать после лимита и ответить на её вопрос. Невидимый `claude -p` не считается
(замер: 29 таких сессий, в списке — ноль);
- но `create_scheduled_task` **поднимает апрув-окно даже при `bypassPermissions`** +
allow-list + auto-allow хуке: он захардкожен выше всех трёх рычагов (замер 29.07 —
хук отстрелялся 5 раз за минуту, окно всё равно вылезло).
Выход один: `update_scheduled_task` проходит **молча**. Значит новую видимую сессию мы не
создаём, а **переиспользуем задачу, которая уже отработала**. Пул таких задач и есть реестр.
## ⚠️ Сколько слотов ты РЕАЛЬНО видишь (поправка 2026-08-20, замер [машина флота])
Прежде чем поверить числу из `--list`: движок берёт **один** стор —
`max(files, key=os.path.getmtime)` (`session_slot.py:108`), а задачи приложения лежат
в **нескольких** сторах разными наборами. Замер на [машина флота] 20.08: свежий по mtime стор — 6 задач,
второй — 73, объединение — 79. Классификация по одному стору: **5 свободных**, по объединению:
**61**. То есть `--list` может показать пустой пул там, где слотов десятки, и ты без нужды
уйдёшь в `create_scheduled_task`.
**Что делать сейчас:** увидел «слотов нет / мало» — не верь, пересчитай объединением:
```
python ~/.claude/scripts/routine_registry_collect.py # читает ВСЕ сторы, дедуп по lastRunAt
```
и сверься с `[шина]/routine-registry/<узел>.jsonl` (поле `schedule`/`last7`).
Починка самого движка — задача `task-2026-08-20-session-slot-store-union`.
Канон: память `task-registrations-live-in-disk-stores`, `00-System/Session-Slots-Passport.md` §Поправка 20.08.
## Реестр — что в пуле
Три группы, и разница между ними существенная:
| | что это | можно брать |
|---|---|---|
| 🟢 **свободные** | разовые задачи (`fireAt` в прошлом, выключены) — отстрелялись и никому не нужны | да, первыми |
| 🔵 **конвертируемые** | **выключенные** рутины (cron, `enabled=false`, месяцами не запускались) | да, но конверсия ломает рутину → обратима через `--restore` |
| ⛔ **занятые** | живые рутины (`enabled=true`) и армированные задачи, ждущие своего часа | **никогда** |
⚠️ **Пул ПЕР-МАШИННЫЙ.** У каждого узла свой `scheduled-tasks.json`: задача, отработавшая
на ноуте, для хаба не существует. Поэтому карточка реестра тоже пер-машинная —
`00-System/Task-Slots-Registry-<ИМЯ-УЗЛА>.md`. Общий файл `Task-Slots-Registry.md` оставлен
как указатель: он один раз уже соврал, показав пул случайной машины (замер 29.07 23:49 —
ноут записал «свободно 1», хаб тем же прогоном переписал на «20»).
**Смотреть реестр (0 токенов, ничего не меняет):**
```
python ~/.claude/scripts/session_slot.py --list
```
**Обновить карточку в волте:**
```
python ~/.claude/scripts/session_slot.py --registry
```
Снимок на 29.07.2026 (хаб): 🟢 20 свободных · 🔵 10 конвертируемых · ⛔ 32 занятых.
Цифры живут своей жизнью — верь `--list`, не этой строке.
## Как выполнять
**Шаг 1. Взять слот.** Одна команда: сперва отдаёт свободные разовые, и только когда они
кончились — мёртвые рутины (перед этим сама копирует их `SKILL.md` в
`_config-backup\slot-originals\` и пишет cron в ledger, чтобы конверсия была обратимой).
```
python ~/.claude/scripts/session_slot.py --claim "<суть сессии>"
```
Слот бронируется атомарно (файл с `O_EXCL`) — два одновременных `--claim` не получат один
и тот же слот. Пул пуст → `exit 3`: тогда честный путь — **один** `create` с диалогом, и
гейт сам его пропустит.
Не трогать выключенные рутины вовсе: `--no-convert`.
**Шаг 2. Придумать имя.** Обязательный формат (Антон 29.07: «называй ВСЕ ТАКИЕ сессии по
особенному, так мне понятнее»): `AUTO-<узел>-<ГГММДД>-<суть>`. Готовое имя:
```
python ~/.claude/scripts/auto_session_name.py "<суть>"
```
⛔ **ВРЕМЯ ДЛЯ `fireAt` РУКАМИ НЕ ПИШЕТСЯ НИКОГДА** (forever-fix 10.09.2026, класс из 6 случаев
11.08-09.09, узлы HP17/[машина флота]/хаб). Причина доказана: `fireAt` судят часы ПРИЛОЖЕНИЯ, а шелл
врал то на 73 мин (HP17 31.08), то на 11 ч ([машина флота] 08.09), то на 7 ч (ноут спал между ходами
09.09) — приложение было право ВСЕ 6 раз. Дверь читает самую свежую метку, которую записало
САМО приложение, и считает от неё:
```
python ~/.claude/scripts/_shared/fireat_now.py --in 15 # -> 2026-09-10T10:30:00Z, готово к вставке
```
Отбило «fireAt must be in the future» → **зови дверь ЗАНОВО** (каждый отказ делает её ответ
точнее), время руками не правь. Полные аргументы разом:
`python ~/.claude/scripts/routine_rights_census.py spawn-args --in 15` (там уже эта дверь внутри).
**Шаг 3. Занять слот через update** (тот самый молчаливый вызов):
```
update_scheduled_task(taskId="<выданный слот>", description="<имя из шага 2>",
prompt="<self-contained сид>", fireAt="<из `fireat_now.py --in 15`>",
notifyOnCompletion=true)
```
Промпт — **самодостаточный сид**: Outcome · Контекст из recall · Scope · Deliverable · DoD ·
не-цели · куда эскалировать. Сессия стартует с нуля и контекста этой не увидит.
📛 **И блок STOP-DUP в КАЖДЫЙ сид** (сводный вердикт 07.08, «+» Антона 14.08): `cat $OBSIDIAN_VAULT/08-Templates/seed-stop-dup-block.md` → вставь блок ЦЕЛИКОМ и ДОСЛОВНО (на 30.08 там 6 строк: 📛 ON AIR · 👤 консолидатор · 🔁 RECALL ЛЕТЯЩЕЙ · 🪫 бак · 🔍 улика · ⏳ премисса с ранним выходом; число строк смотри В ФАЙЛЕ, не здесь — счётчик в пяти местах расходится). Один источник — правится только тот файл, копий здесь нет.
**Шаг 3-бис. ⛔ ПРОЧИТАЙ ФАКТ ОБРАТНО — вызов прошёл ≠ промпт заменился.**
`update_scheduled_task` отвечает бодрым «updated» и на частичный апдейт: забыл поле `prompt` —
расписание переставится, а слот поедет со СТАРЫМ приказом и молча выполнит чужую работу.
Замер 25.08.2026 (хаб): два слота перепрофилированы «на глазок», mtime их `SKILL.md` остались
вчерашними, в 16:00 повторно отработал робот старых постов (соседняя сессия потом разгребала
дубли), в 16:20 повторно поехал уже закрытый DR-заказ, а обе новые задачи не случились вовсе.
Это 3-й датированный случай класса «отчитался о записи, не прочитав факт» (Breakage-Journal).
Поэтому сразу после Шага 3, ДО доклада Антону:
```bash
f="$USERPROFILE/.claude/scheduled-tasks/<taskId>/SKILL.md"
ls -l --time-style=+%d_%H:%M "$f" # mtime обязан быть СЕЙЧАС, не вчерашним
grep -ci "<слово из нового промпта>" "$f" # >0
grep -ci "<слово из СТАРОГО промпта>" "$f" # 0 — иначе слот не переписан
```
Не сошлось — слот НЕ занят: повтори update с полем `prompt` и проверь снова.
Докладывать «сессия поставлена» можно только после этой проверки.
**Шаг 4. ⛔ ПЕРЕИМЕНОВАНИЕ НЕ РАБОТАЕТ — не тратить на него время (замер 30.07).**
Сайдбар приложения в разделе Routines рисует **`taskId` включённой задачи**, а не title
сессии и не её description. Отсюда два факта, опрокинувших вчерашнюю рельсу:
- переиспользованный слот несёт **чужой** `taskId` (напр. `sess-public-repo-hygiene-dr`), и
Антон не узнаёт в нём свою сессию. `set_session_title` этого не меняет: **18
переименований 29.07 не изменили в списке ничего**;
- разовая задача после срабатывания уходит в `enabled=false` и **исчезает из списка
совсем** (вернуть без нового `fireAt` нельзя, API отказывает). Именно поэтому Антон
30.07 сказал «я вообще НЕ ВИЖУ ТВОИХ СЕССИЙ» — они отработали и пропали.
**Что делать вместо этого** (уточнено 31.07 замером). Гейт `spawn_slot_guard` **пропускает**
`create_scheduled_task`, когда `taskId` совпадает с `AUTO_TASKID` = `^auto-<узел>-<ГГММДД>-<суть>$`
(строчными). Тогда, 29.07, мы думали, что платим за это «одним апрувом». **Замер 31.07
показал: апрува нет вовсе** — четыре `create` подряд прошли молча. То есть у пути `create`
с правильным именем НЕТ минусов против слота, а плюс есть (верное имя сразу) → см. блок
«ГЛАВНОЕ СВЕРХУ». Слот через `update` — для фона, где узнаваемость строки не нужна.
⚠️ Развилка живёт в коде гейта. Если поведение сайдбара изменится — правь `AUTO_TASKID` в
`spawn_slot_guard.py`, а не этот текст в трёх местах.
**Шаг 5. Записать в журнал задач** (`10-Tasks/task-*.md`) — сессия И запись в реестре,
никогда одно вместо другого.
**Шаг 6. Вернуть рутину, если съели.**
```
python ~/.claude/scripts/session_slot.py --restore <id>
```
Печатает, чем именно вернуть: cron из ledger + путь к сохранённому `SKILL.md`.
## Границы
- ⛔ Живые рутины (`enabled=true`) под слот не идут **никогда** — проверяется тестом.
- ⛔ Чип `spawn_task` вместо сессии — только когда нужны физические руки Антона или другая
машина, с маркером `ТРЕБУЕТ РУК АНТОНА:` / `ДРУГАЯ МАШИНА:` и немедленным пингом
(замер: 107 из 346 чипов не нажаты никогда). Держит `chip_guard.py`.
- ⛔ Голый `claude -p` — только на узлах без приложения (Якорь/headless) с флагом
`--headless-node`; остальное отбивает `blackbox_session_guard.py`.
- Tier-2 внутри порождённой сессии не ослабляется: деньги/исходящее/необратимое — к Антону.
## Как понять, что работает
```
python ~/.claude/scripts/_test_session_slot.py # ждём "ВСЁ ЗЕЛЕНО"
```
Сетка проверяет и движок (три группы, живая рутина не съедается, реестр пер-машинный,
выбран самый свежий файл, а не бэкап), и гейт (`create` при непустом пуле = отбить).
**Слой видимости:** каждая попытка `create` пишется в `~/.claude/logs/_spawn_slot_guard.log`
— иначе не отличить «гейт молчал» от «гейт ни разу не сработал».
## Что уже ломалось (чтобы не наступить снова)
- **29.07: v2 движка стала отдавать три группы вместо двух** → `free, _busy = classify(...)`
упало `ValueError` и в тесте, и **в самом гейте**; `except Exception` в гейте превратил
поломку в тихое `ALLOW`, и апрув-окна снова шли к Антону. Лечение: распаковка по индексу,
а не по фиксированному числу имён, плюс крик в `stderr` при fail-open. Урок: **гейт,
который глотает свою поломку молча, хуже отсутствующего**.
- **29.07: карточка реестра была общим синкаемым файлом** при пер-машинном пуле → два
писателя, показывала пул случайной машины. Лечение: имя узла в имени файла.
- **Реестр приложения живёт в памяти:** прямая запись в `scheduled-tasks.json` не действует,
приложение перезатрёт (замер 29.07 08:25). Только через `update_scheduled_task`.
## Родня
`/sessions` — что работает **сейчас** (read-only, телефонный формат). Этот скилл про другое:
где взять место под **новую** сессию. Паспорт детали:
`00-System/Session-Slots-Passport.md`.
<!--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.