/slot — реестр переиспользуемых сессий
⭐⭐⭐ ГЛАВНОЕ СВЕРХУ (24.08.2026): ПЕРЕИСПОЛЬЗОВАНИЕ — ПЕРВЫЙ выбор, create — второй
Приказ Антона 24.08 голосом: «нужно переиспользовать сессии, чтобы они как можно реже
запрашивали аппрувы». Порядок 31.07 («сначала create») отменён, потому что премиса,
на которой он стоял, опровергнута замером в тот же вечер.
Что замерено 24.08 18:42 на хабе (живой прогон, не рассуждение):
update_scheduled_task(слот, description + prompt + fireAt) прошёл молча.
- Сессия поднялась мгновенно (у разовой задачи задержки диспетчера нет).
- Сессия переименовала себя сама первым ходом через
mcp__ccd_session_mgmt__set_session_title
и в list_sessions видна как «ПРОБА переиспользования слота 1842» (titleSource=tool),
а НЕ под чужим taskId. Старое утверждение «список title сессии не читает» — мертво.
- Приложение само называет цену холодного
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, ДО доклада Антону:
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: 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.