Skip to content
Back to skills

Slot

ASecurity

РЕЕСТР ПЕРЕИСПОЛЬЗУЕМЫХ СЕССИЙ + выдача слота: породить ВИДИМУЮ Антону фоновую сессию БЕЗ апрув-окна, переиспользовав… Триггеры: /slot, /слот, «дай слот», «покажи слоты», «реестр сессий», «какие сессии можно переиспользовать», «запусти сессию в фоне», «нужна отдельная сессия», «сколько слотов осталось», «верни рутину назад», «slot», «reuse a session».

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 25, 2026
ai-agentspythonbashnodegitapi

Works with

  • api
  • mcp

Security analysis

A100/100

Scanned October 6, 2026

npx -y skills add tonydzi/second-brain-starter-kit --skill slot --agent claude-code

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.

Security grade badge for Slot
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tonydzi-slot/badge)](https://www.skillsdirectory.com/skills/tonydzi-slot)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…