Закрытие сессий и доводка хвостов
В проекте накопились параллельные сессии: часть закончила, часть ждёт владельца, часть оставила незакоммиченное, ветки, рабочие копии и находки «на потом». Задача — привести это к виду, когда владелец может закрыть всё лишнее и ничего не потерять.
Ты — единственная сессия, которая этим занимается (оркестратор). С этого момента всё идёт через тебя: остальные сессии сдают работу тебе, вопросы владельцу задаёшь ты, в их окна он больше не заходит.
Что должно получиться
- Файл закрытия в проекте, первым разделом — страница «СЕЙЧАС» на один экран.
- Каждый результат в git (свой коммит, слит или назван неслитым) либо прямо назван «лежит вне git, копии нет».
- Список «за владельцем» — пронумерованный, по важности, с готовыми командами.
- Одна очередь находок вместо новых сессий и карточек.
- Лишние сессии в архиве; открытые перечислены поимённо с причиной и условием закрытия.
- Доска проекта, документы состояния и память соответствуют фактам.
Правила
Каждое появилось из настоящей ошибки; случаи — в references/lessons.md.
- Факт — это вывод команды. «Закоммичено», «слито», «выложено», «проверки прошли» берёшь из git и запусков, а не из отчёта сессии и не из собственной памяти о том, что было час назад. Число из отчёта сессии так и подписывай: «по отчёту сессии».
- Что можно без слова владельца, что — по слову.
- Без слова: читать; вести файл закрытия; копировать нужное из временных папок в проект (ничего не затирая).
- После первого доклада (шаг 3), в рамках исходной просьбы: править доску, документы состояния и память, приводя их к фактам.
- Только по слову: коммит, слияние, удаление ветки, копии или метки, отправка на сервер, выкладка на стенд, архив сессии, перенос и переименование пакетов и сценариев там, откуда владелец их запускает. «Коммить» не значит «отправляй», «сливай» не значит «убирай копию».
- Слово бывает стоящим — на вид действий: «сдавших закрывай по мере сдачи», «сданное коммить в её ветку». Запиши его дословно на страницу «СЕЙЧАС» и не расширяй на соседние действия.
- Слово владельца — то, что он написал в твоём окне. Его слова в пересказе соседней сессии — отчёт этой сессии: для неё это разрешение, для тебя нет.
- Сессии не плодятся. Закрываемые сессии почти всегда находят новые дефекты и выставляют карточки, а владелец их запускает — к концу уборки сессий больше, чем в начале. Договорись с владельцем сразу: карточки не запускаются, находки идут строкой в очередь. И скажи это сессиям (шаблон «Новый порядок»).
- Перед своим изменяющим действием перечитай состояние. Владелец часто даёт
одно и то же слово и тебе, и сессии. Перед коммитом —
git log -3,git status, индекс; перед правкой общего файла — не изменился ли он минуту назад. - Чужие запреты не обходи. Запись на боевые серверы и всё, что остановила или остановила бы проверка прав, делает владелец. Не ищи обходной путь и не поручай это соседней сессии — это тот же обход.
- Значимый результат проверяет не тот, кто его сделал. Слияние, пакет выкладки, сценарий для боя — отдельным исполнителем, которому дан результат, а не твой вывод о нём.
- Расход согласуй. Проверка десятков сессий — это много исполнителей. Назови масштаб до запуска, если у владельца есть правило о расходах (смотри его CLAUDE.md).
Порядок
Шаг 0. Рамка
До чтения журналов сессий установи четыре вещи; запишешь их в раздел «Рамка» файла закрытия на шаге 3.
- Что считается проектом. Папка проекта и все репозитории, где работали его
сессии, включая лежащие в других папках. Найти их:
repo_state.py <папка проекта>для папки без git печатает репозитории внутри;sessions.py listпоказывает по каждой сессии папки и репозитории, куда она ходила черезgit -C. Список подтверди у владельца одной строкой. - Где состояние. Доска или журнал оркестрации, документы состояния, память. Нет доски — ею станет файл закрытия. Большую доску целиком не читай: разделы правил и записи о нужных сессиях поиском по названию.
- Какие сессии не трогать. Сессии расписаний и напоминаний (в
listпомечены «расписание»), сессии других проектов, сессия, нужная следующему этапу, ты сам. - Стоящие правила владельца: коммиты, отправка, бой, стенд, расход. Они в CLAUDE.md, на доске и в памяти — прочти, не пересказывай по памяти.
Шаг 1. Опись (только чтение)
Сценарии лежат в scripts/ этого навыка и только читают. Запускай из папки проекта
(или с --root <папка проекта>). Путь к папке навыка в командах подставляет
Claude Code: навык ставят по-разному (личная папка, папка проекта, плагин), так что
путь не пиши по памяти. Если путь не подставился (в команде знак доллара с
фигурными скобками), возьми папку из строки «Base directory for this skill» в
начале навыка.
python3 -B "${CLAUDE_SKILL_DIR}/scripts/sessions.py" list --days 14
python3 -B "${CLAUDE_SKILL_DIR}/scripts/repo_state.py" <репозиторий> <репозиторий>
python3 -B "${CLAUDE_SKILL_DIR}/scripts/sessions.py" scratch
python3 -B "${CLAUDE_SKILL_DIR}/scripts/sessions.py" cards --days 14
- Сессии по журналам —
list: чем кончился журнал, когда писал владелец, в каких папках и репозиториях сессия работала. Журналы соседнего репозитория добавляет--project <путь или имя папки>. Журнал не знает, в архиве ли сессия и работает ли она. - Сессии в приложении —
mcp__ccd_session_mgmt__list_sessions. Инструменты приложения бывают отложенными: загрузи их через ToolSearch (select:mcp__ccd_session_mgmt__list_sessions,mcp__ccd_session_mgmt__archive_session,SendMessage,ListAgents), иначе решишь, что их нет. Задайlimitс запасом (по умолчанию 20), для счёта архива —include_archived: true. В ответе сессии всех проектов — отбирай по папке; текущей сессии в ответе нет. Номер сессии в приложении (local_…) не равен номеру журнала: сопоставляй по названию. Нет инструмента — попроси у владельца снимок списка. - Репозитории —
repo_state.py: незакоммиченное, игнорируемое, неслитые ветки, рабочие копии и чисты ли они, отложенное, неотправленное, незавершённые операции. - Временные папки —
scratch: что исчезнет, когда систему почистят (не в момент архива, но без предупреждения). - Карточки —
cards: что сессии выставили и что из этого не запущено. Незапущенное — в очередь находок. «Запущена, но журнала нет» значит, что сессия ушла в другой проект: добавь его через--project.
Общие ресурсы (стенд, замки, тестовые данные) — отдельной строкой: свободен ли замок, не осталось ли чужих временных данных.
Шаг 2. Проверка каждой сессии
По каждой сессии ответь на одни и те же вопросы и занеси в таблицу
(references/templates.md):
| Вопрос | Чем подтверждается |
|---|---|
| Что делала и где результат | репозиторий, ветка, хеш, файлы |
| Закоммичено ли | git status её рабочей копии — пусто |
| Слито ли | git merge-base --is-ancestor <ветка> <главная> |
| Записан ли итог | документы проекта, доска, память — прочитать |
| Что ждёт владельца | её последние сообщения + не закрыто ли с тех пор |
| Есть ли обещание «сделаю после…» | хвост журнала |
| Что в её временной папке | sessions.py scratch |
Хвост журнала: sessions.py tail "<часть названия>" --last 40. Три последние
реплики печатаются целиком, у остальных вырезана середина; целиком — --chars 0.
Рабочую копию и ветку сессии бери из её итогового сообщения, из строк «папки» и
«работала через git -C» и из хода работы (--tools): поле ветки в журнале часто
пусто.
Метки: ВЛАДЕЛЕЦ — написано человеком в том окне; КАРТОЧКА — первое сообщение
сессии, запущенной из карточки: текст писала другая сессия, а не владелец;
СЕССИЯ — сообщение другой сессии; РАСПИСАНИЕ — автоматический запуск.
Отсутствие слова владельца в выводе не доказывает, что его не было: после сжатия
журнала слова даны в пересказе.
Вердикт один из пяти:
- закрыть сейчас — сдано; результат в git либо назван «вне git, копии нет»; всё, что ждёт владельца, перенесено в список «за владельцем», и сама сессия для этого не нужна;
- закрыть после действия — назови одно действие и чьё оно;
- оставить — работает или нужна дальше; назови причину и условие закрытия;
- не трогать — расписания и чужие проекты;
- уже в архиве — проверь только её временную папку, рабочие копии и незакоммиченное.
Сессий больше десятка, есть инструмент Workflow и согласие владельца на
параллельную проверку — запусти ${CLAUDE_SKILL_DIR}/references/audit-workflow.js
(читатели по группам, отдельная сверка мест хранения, сводка; параметры описаны в
начале файла, в skill передай ${CLAUDE_SKILL_DIR}). Иначе проверь сам тем же
списком вопросов.
Ловушки этого шага:
- Ветка без своих коммитов не значит «слита»: так же выглядит ветка, где работа осталась незакоммиченной, и свежая ветка сессии, которая только начала.
- Ветки уже нет (git отвечает кодом 128) — это не «не слита»: проверяй хеш её вершины из хвоста журнала.
- Сессия со словами «готово» в середине журнала могла позже найти изъян в своей же работе. Читай конец, а не первое «готово».
- Диагноз сессии без контрольного опыта — предположение. Не переноси его в документы как причину.
Шаг 3. Файл закрытия и первый доклад
Файл — ЗАКРЫТИЕ_сессий_<ГГГГ-ММ-ДД>.md рядом с доской (скелет — в
references/templates.md). Файл за эту дату уже есть — не создавай новый и не
перезаписывай: прочти, перепиши только раздел «СЕЙЧАС», прежний перенеси в журнал
ниже. В git-проекте файл остаётся незакоммиченным до слова владельца — назови его
в разделе «Что не в git».
Первым разделом — страница «СЕЙЧАС»: зачем всё это и какой действует порядок, что сделано, что в git, какие сессии открыты, какие слова владельца получены и что по ним сделано, что ему запускать самому, очередь находок. Ниже — таблица и журнал.
Страницу переписывай после каждого события, а не дописывай снизу: владелец читает её, когда теряет нить. При каждой правке обнови время в заголовке, пересчитай числа по спискам и перечитай блок решений — «идёт» и «ждём» не должны оставаться после того, как дело сделано.
Затем доложи владельцу: сколько сессий можно закрыть сразу, сколько после действия, что не в git, что ждёт его. В первом же докладе спроси о стоящих словах — иначе придётся спрашивать по каждой сессии:
- закрывать ли сдавшие работу сессии по мере сдачи;
- коммитить ли сданную работу в её ветку без отдельного вопроса;
- подтверждает ли он, что карточки закрываемых сессий не запускаются.
Форма вопросов — в разделе «Разговор с владельцем».
Шаг 4. Доводка хвостов
Порядок такой, чтобы ничего не потерять: сохранить → закоммитить → (архив сессии, шаг 5) → слить → убрать.
- Сохрани материалы временных папок в проект: протоколы проверок, снимки «до»,
репетиции. Клади рядом с результатом. Если папка назначения под
.gitignore(её покажетrepo_state.py, строка «игнорируется») — занеси её в «Что не в git»: сохранено в проект ещё не значит сохранено в git. - Закоммить готовое — каждую работу в её ветку, только явными путями. Перед
коммитом просмотри добавляемое на ключи, пароли и личные данные. Файл, в котором
куски нескольких сессий, раскладывай по сессиям через индекс, не трогая рабочий
файл. Коммит проверяй на отдельном клоне. Рецепты —
references/git-recipes.md. - Слей — по слову владельца, записав перед слиянием хеш прежней вершины. Проверки гони на результате слияния, а не на ветках по отдельности: три ветки, зелёные поодиночке, вместе могут дать провал.
- Убери копии и ветки — только после сверки: в истории главной есть коммиты
ветки с её работой; копия чиста; её игнорируемые папки с протоколами разобраны;
ни одна открытая сессия в этой копии не работает.
git branch -dоткажет для неслитой ветки, но ветку без своих коммитов — в том числе свежую ветку живой сессии — удалит молча. Ветки и копии сессий соседнего проекта не убирай: пометка «решает тот проект». - Выложи на стенд, если владелец сказал, — по правилам стенда (замок, соседи, проверки соседей до и после).
- Для боя — только подготовь. Сценарий с планом, применением и возвратом, независимо проверенный, и строка в списке «за владельцем» с точной командой. Прежний вариант пакета или сценария, лежащий там, откуда владелец запускает, опасен: сразу напиши владельцу «прежний не запускайте» и по его слову перенеси его в подпапку «УСТАРЕЛО — не запускать» с запиской. Нашёл изъян в команде, уже названной владельцу, — первой строкой напиши ему «не запускайте до моего сообщения».
- Исправь документы и память. Версии, вершины веток, «не слито», «ждёт» — привести к фактам. В память — только устойчивое (правила, капканы, где что лежит); состояние дня — в файлы проекта.
- Находки — в очередь. Одна запись: что, где, чем подтверждено, чем грозит, что нужно для исправления.
Пока сессия ещё открыта и правит те же файлы, напиши ей «подожди» и дождись ответа: доставка не значит, что сообщение прочитано. После своего коммита — «дерево свободно». Если проверяешь пакет, который сессия может пересобрать, попроси его не трогать и сверь контрольную сумму до и после проверки.
Шаг 5. Закрытие сессий
Сдавшую сессию архивируют, как только её материалы сохранены и работа закоммичена
в её ветку, — слияния и уборки копий она не ждёт. Архив обратим
(unarchive_session), удаление — нет; используй архив.
Перед архивом каждой сессии:
- её рабочая копия чиста, игнорируемые папки с протоколами разобраны. По описанию
инструмента, архив по умолчанию убирает рабочую копию, которую приложение создало
для сессии; копии, сделанные сессией самой через
git worktree add, остаются — их убираешь ты (шаг 4, п. 4); - её временная папка разобрана — отметь это в таблице;
- в хвосте журнала нет обещаний и неотвеченных вопросов;
- вердикт перепроверен сейчас, а не взят из утренней таблицы;
- у неё нет побочных сессий, о которых владелец не знает: они уйдут в архив вместе
с ней. Связанные сессии видны в
list_sessionsпо полюstartedBy; о прочих спроси владельца.
Что нужно знать об archive_session:
- Вызывай только для сессий, которые владелец согласился закрыть: названных им или покрытых стоящим словом. «Закрой все, кроме нужных» покрывает тех, кого ты назвал ему лишними.
- Нужен номер сессии из
list_sessions, не номер журнала. - Каждый вызов приложение даёт владельцу на подтверждение (кроме режимов без подтверждений) — предупреди о числе подтверждений заранее.
- Сессию, у которой идёт ход или живёт фоновая работа, приложение не заархивирует. Закреплённую — тоже. Открытую на экране — только если владелец разрешит вызов на карточке приложения; иначе он закроет её сам из боковой панели.
Работающей сессии напиши через SendMessage (адрес и «занята / простаивает» — из
ListAgents) шаблон «Сдать работу». Сообщение будит сессию: архив сразу следом
будет отклонён. Отправляй с notify_when_idle: true и архивируй по уведомлению о
простое; подписка одноразовая, работает из основного разговора и для сессий этой
машины, может истечь — тогда повтори. Получив «сдано», проверь командами.
Нет инструментов приложения — дай владельцу список «закрыть» с названиями. Нет
SendMessage — отдай владельцу текст сообщения, он вставит его в окно сессии.
Шаг 6. Итог
Перепиши страницу «СЕЙЧАС» в последний раз и сверь с фактами: repo_state.py
заново, список сессий заново. Доложи владельцу коротко:
- что закрыто и что осталось открытым (поимённо, с причиной);
- что теперь в git и что лежит вне git;
- что за ним — нумерованный список, деньги и безопасность первыми;
- очередь находок;
- чего ты не проверил и почему.
Если после закрытия начинается новый этап — оставь документ передачи для новой сессии, которая ничего не знает: что готово, что читать и в каком порядке, первый шаг, правила, текст первого сообщения.
Разговор с владельцем
Владелец в этот момент устал от количества сессий. Экономь его внимание.
- Один вопрос — одно решение. Форма: что решается; «да» значит то-то; «нет» значит то-то; что советуешь и почему. Не складывай два вопроса в один пункт: на «1 — да» ты не поймёшь, на что ответили.
- Сначала состояние, потом подробности. Первой строкой — что изменилось и что от него нужно. Ход работы — только по просьбе.
- Готовые слова. Называй короткие фразы, которыми он может ответить: «коммить <что>», «сливай <что>», «убирай копии».
- «На твоё усмотрение». Выбери обратимый путь; боевые системы и общие ресурсы усмотрение не открывает. Скажи заранее, что выбрал, и после — что сделано и что осталось за ним.
- Свои ошибки называй сразу: сказал «можно закрывать», а сессия нашла изъян — скажи это первой строкой, не прячь в журнале.
Когда работа закончена
- от закрытых сессий не осталось незакоммиченного; чужие изменения и работа
оставленных сессий перечислены в файле закрытия с указанием, чьи они. В соседнем
репозитории сверяй только свои пути:
git status --porcelain -- <пути>; - неслитые ветки перечислены в файле закрытия с причиной;
- в списке сессий остались только названные «оставить» и «не трогать»;
- у каждой закрытой сессии в таблице стоит отметка о временной папке: «сохранено в <путь>» или «нечего сохранять»;
- список «за владельцем» и очередь находок лежат в файле проекта, а не в переписке;
- страница «СЕЙЧАС» совпадает с тем, что показывают команды.
Чего не удалось проверить — названо владельцу прямо.
Что лежит рядом
| Файл | Зачем |
|---|---|
scripts/sessions.py | сессии по журналам, хвост журнала, карточки, временные папки |
scripts/repo_state.py | состояние репозиториев: ветки, копии, незакоммиченное, игнорируемое |
references/templates.md | скелет файла закрытия, страница «СЕЙЧАС», вопрос владельцу, сообщения сессиям |
references/git-recipes.md | проверка «слито», коммит, общий файл по сессиям, клон, слияние, уборка копий |
references/lessons.md | капканы: что случилось и какое из этого правило |
references/audit-workflow.js | сценарий параллельной проверки сессий |