feat(skills): session-handoff body filled, bump 0.1.0 -> 0.2.0
MINOR bump — skeleton (v0.1.0) gets functional 6-section body. Source: .workshop/.archive/2026-05-24-session-handoff-skill.md (Round 1 design + Round 2 resolved Q1-Q10). Body sections: When to use (read/write triggers + skip patterns), Inputs (read/write), Steps (read 5 + write 5), Failure modes (incl. secret-detection abort), Side effects (sliding overwrite + git-tracked, no global state), What NOT to do (no auto-execute, no append-with-archive, no cross-project, no SessionEnd-hook dependency). Still skeleton from claude-skills/ POV: no install.sh run, no push, no hermes/mapping.yaml entry — those remain in baseline tasks (session-handoff-install / -hermes-mapping / -test-trigger / -bootstrap-template-extend / -review umbrella). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,35 +1,134 @@
|
|||||||
---
|
---
|
||||||
name: session-handoff
|
name: session-handoff
|
||||||
version: 0.1.0
|
version: 0.2.0
|
||||||
description: Sliding handoff между CC сессиями через `.tasks/NEXT_SESSION.md`. Read on start (orient + ask user'а перед действиями), write on substantive-commit (prefix не meta/docs/style/chore + body>200 OR files>3; первый non-trivial commit сессии всегда) или session-end фразе («завершаем сессию», «сворачиваемся», «закругляемся», «wrap up session», «end session», «we're done for now»). Триггер-строка CLAUDE.md `session handoff: read on start, write on end`. Sliding overwrite — один файл, история через git log. Project-scope, никакого global state. НЕ триггерится на «закрываем эту таску», «pause», «отбой», «разбегаемся» — task-zone / non-session phrases.
|
description: Sliding handoff между CC сессиями через `.tasks/NEXT_SESSION.md`. Read on start (orient + ask user'а перед действиями), write on substantive-commit (prefix не meta/docs/style/chore + body>200 OR files>3; первый non-trivial commit сессии всегда) или session-end фразе («завершаем сессию», «сворачиваемся», «закругляемся», «wrap up session», «end session», «we're done for now»). Триггер-строка CLAUDE.md `session handoff: read on start, write on end`. Sliding overwrite — один файл, история через git log. Project-scope, никакого global state. НЕ триггерится на «закрываем эту таску», «pause», «отбой», «разбегаемся» — task-zone / non-session phrases.
|
||||||
---
|
---
|
||||||
|
|
||||||
# session-handoff
|
# session-handoff
|
||||||
|
|
||||||
Sliding handoff prompt между CC сессиями. На старте сессии — читает `.tasks/NEXT_SESSION.md`, ориентирует агента и спрашивает user'а перед действиями. При substantive commit'е или session-end фразе — перезаписывает handoff для следующей сессии. Sliding overwrite: один файл, история — через `git log -p .tasks/NEXT_SESSION.md`.
|
Sliding handoff prompt между CC сессиями. На старте — читает `.tasks/NEXT_SESSION.md`, ориентирует агента и спрашивает user'а перед действиями. При substantive commit'е или session-end фразе — перезаписывает handoff для следующей сессии. Sliding overwrite: один файл, история — через `git log -p .tasks/NEXT_SESSION.md`.
|
||||||
|
|
||||||
Дизайн-источник (обязательно прочитать перед заполнением тела): `.workshop/.archive/2026-05-24-session-handoff-skill.md` (Round 1 design + Round 2 resolved Q1–Q10).
|
Forward-looking, не timeline: handoff = связка новых вещей конкретно для следующего разворота, не overview всего проекта. STATUS.md / MEMORY.md / `.wiki/log.md` остаются авторитетными для своего scope'а.
|
||||||
|
|
||||||
|
Дизайн-источник: `~/projects/.workshop/.archive/2026-05-24-session-handoff-skill.md` (Round 1 design + Round 2 resolved Q1–Q10).
|
||||||
|
|
||||||
## When to use
|
## When to use
|
||||||
|
|
||||||
<пусто — дописывается во втором проходе глазами по архивному буферу>
|
**Read mode (session start):**
|
||||||
|
- CLAUDE.md проекта содержит trigger-строку `session handoff: read on start, write on end`.
|
||||||
|
- Файл `.tasks/NEXT_SESSION.md` существует.
|
||||||
|
|
||||||
|
**Write mode (session end / substantive commit):**
|
||||||
|
- User'ская фраза из whitelist:
|
||||||
|
- русский: «завершаем сессию», «сворачиваемся», «закругляемся»
|
||||||
|
- английский: «wrap up session», «end session», «we're done for now»
|
||||||
|
- ИЛИ — agent только что сделал substantive commit. Эвристика:
|
||||||
|
- prefix НЕ в (`meta:`|`docs:`|`style:`|`chore:`|`fix typo`)
|
||||||
|
- AND (body length > 200 символов OR files changed > 3)
|
||||||
|
- Плюс: **первый** non-trivial commit сессии — всегда триггерит, даже если ниже порога (старт работы = context shift).
|
||||||
|
|
||||||
|
**Skip (false-positive guards):**
|
||||||
|
- «закрываем эту таску» — task close, не session. Это zone `using-tasks`.
|
||||||
|
- «pause», «приостанови» — task-pause, не session-end.
|
||||||
|
- «отбой», «разбегаемся» — слишком broad, может относиться к другому контексту.
|
||||||
|
- «сейчас завершу одну задачу и тогда поговорим» — частичное завершение.
|
||||||
|
- Не-git папка, или `.tasks/` отсутствует — silent exit.
|
||||||
|
- CLAUDE.md проекта НЕ содержит trigger-строку — silent exit.
|
||||||
|
|
||||||
|
При неоднозначности — **ASK**, не угадывать: «закрываем сессию или таску?»
|
||||||
|
|
||||||
## Inputs
|
## Inputs
|
||||||
|
|
||||||
<пусто>
|
**Read mode:**
|
||||||
|
- `.tasks/NEXT_SESSION.md` — sliding handoff, должен существовать.
|
||||||
|
- Текущая дата (для staleness check против `_last_updated_`).
|
||||||
|
|
||||||
|
**Write mode:**
|
||||||
|
- `git log --oneline -5` — последние commits сессии.
|
||||||
|
- `.tasks/STATUS.md` — open треки + 🔴 active task'и (для mid-task capture).
|
||||||
|
- Контекст сессии — pending user-decisions, waiting permissions, memory updates, preemptive guards.
|
||||||
|
|
||||||
## Steps
|
## Steps
|
||||||
|
|
||||||
<пусто>
|
### Read mode
|
||||||
|
|
||||||
|
1. **Detect.** Проверить что `.tasks/NEXT_SESSION.md` существует. Нет — silent exit.
|
||||||
|
2. **Staleness check.** Прочитать frontmatter `_last_updated_`. Возраст > 7 дней → отметить user'у:
|
||||||
|
```
|
||||||
|
handoff от <date> (N дней назад) — возможно устарел.
|
||||||
|
Оверrайдить или продолжить?
|
||||||
|
```
|
||||||
|
Дождаться ответа перед продолжением.
|
||||||
|
3. **Summarize.** Прочитать тело handoff'а — 5 секций (recent commits / open треки / спроси user'а / не делать / memory updates).
|
||||||
|
4. **Orient.** Пересказать user'у одним блоком: «прошлая сессия предложила X (open треки + ask-items + don't-items + memory updates). Делаем?»
|
||||||
|
5. **Wait.** Не делать никаких действий до подтверждения user'ом. Default = orient + ask, **никакого auto-execute**.
|
||||||
|
|
||||||
|
### Write mode
|
||||||
|
|
||||||
|
1. **Scope check.** Это текущий проект (cwd с `.tasks/`). Никаких global мутаций, никаких других проектов.
|
||||||
|
2. **Mid-task capture.** Если в `.tasks/STATUS.md` есть 🔴 active task — захватить:
|
||||||
|
```
|
||||||
|
left mid-task: <slug>
|
||||||
|
where_stopped: <текст из STATUS.md>
|
||||||
|
```
|
||||||
|
3. **Compose content.** Собрать `.tasks/NEXT_SESSION.md`:
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
_last_updated_: <ISO 8601 timestamp>
|
||||||
|
session_id: <hash или дата>
|
||||||
|
---
|
||||||
|
|
||||||
|
# Next session handoff
|
||||||
|
|
||||||
|
## Recent commits
|
||||||
|
- <slug>: <subject> (3–5 последних)
|
||||||
|
...
|
||||||
|
|
||||||
|
## Open треки
|
||||||
|
| Трек | Готовность | Entry-point |
|
||||||
|
|---|---|---|
|
||||||
|
| ... | ... | ... |
|
||||||
|
|
||||||
|
## Спроси user'а
|
||||||
|
- <pending decision 1>
|
||||||
|
- <waiting permission 2>
|
||||||
|
|
||||||
|
## Не делать (preemptive guards)
|
||||||
|
- <guard 1>
|
||||||
|
- <guard 2>
|
||||||
|
|
||||||
|
## Memory updates за сессию
|
||||||
|
- <что нового сохранилось / обновилось>
|
||||||
|
```
|
||||||
|
Пустую секцию — оставить заголовок + пометка `(нет на этом раунде)`. Чтобы next агент видел: не забыто, а пусто.
|
||||||
|
4. **Sliding overwrite.** `Write` поверх `.tasks/NEXT_SESSION.md` (предыдущее содержимое НЕ архивируется в `.archive/handoff-*.md` — sliding contract). История восстанавливается через `git log -p .tasks/NEXT_SESSION.md`.
|
||||||
|
5. **Stage.** `git add .tasks/NEXT_SESSION.md` — попадает в следующий commit сессии (или в текущий, если запись была вызвана session-end фразой).
|
||||||
|
|
||||||
## Failure modes
|
## Failure modes
|
||||||
|
|
||||||
<пусто>
|
- **CLAUDE.md без trigger-строки** → silent exit, не вмешиваться. Скил project-opt-in.
|
||||||
|
- **Не git-repo / `.tasks/` отсутствует** → silent exit. Скил требует обоих условий.
|
||||||
|
- **`.tasks/NEXT_SESSION.md` отсутствует** в read mode → silent exit (первая сессия проекта, нечего читать).
|
||||||
|
- **Неоднозначная фраза** («закругляемся» в контексте отдельной таски, а не сессии) → ASK user'а «закрываем сессию или таску?», не угадывать.
|
||||||
|
- **Secret detected.** Содержимое handoff'а матчит паттерны секретов (`AKIA...`, `sk-...`, `ghp_...`, `ssh-rsa`, `BEGIN PRIVATE KEY`, JWT в обычном виде, `password=`/`token=` без obfuscation) → **abort write**, не записывать. Файл идёт в git — не место для credentials. Сообщить user'у с указанием подозрительной строки, дать дочистить контекст руками.
|
||||||
|
- **Stale handoff (> 7 дней)** в read mode → не silent, **спросить** user'а оверrайдить или продолжить (Q9 resolved 2026-05-24).
|
||||||
|
- **Mid-task без STATUS.md entry** в write mode → записать handoff без mid-task секции, не блокировать.
|
||||||
|
|
||||||
## Side effects
|
## Side effects
|
||||||
|
|
||||||
<пусто>
|
- Записывает / перезаписывает `.tasks/NEXT_SESSION.md` (project-scope only).
|
||||||
|
- Файл git-tracked, попадает в commit (либо вместе с session work, либо отдельным commit'ом).
|
||||||
|
- Никаких других файлов: `.archive/` не плодим (sliding), `.wiki/log.md` не дёргаем (это не promoted event), `STATUS.md` не правим.
|
||||||
|
- Никаких global мутаций, никаких других проектов, никаких user-level config writes.
|
||||||
|
|
||||||
## What NOT to do
|
## What NOT to do
|
||||||
|
|
||||||
<пусто>
|
- **Не auto-execute** действия из read handoff'а. Default = orient + ask. Прошлая сессия могла ошибиться; user agency сохраняем.
|
||||||
|
- **Не append-with-archive.** Sliding only. `.archive/handoff-<date>.md` создавать не нужно — это создавало бы N artefact'ов, которые user не хочет. История — через git log.
|
||||||
|
- **Не триггерить на task-zone phrases** («закрываем эту таску», «pause»), broad farewells («отбой», «разбегаемся»), partial completions («сейчас завершу одну задачу и тогда поговорим»).
|
||||||
|
- **Не писать секреты** в handoff. Если контент матчит secret-patterns — abort, попросить user'а вычистить контекст.
|
||||||
|
- **Не на каждом commit'е.** Только substantive (см. эвристика в When to use). Trivial `chore: bump dep` или `docs: typo` НЕ триггерят, иначе handoff'ы шумят.
|
||||||
|
- **Не дублировать STATUS.md / MEMORY.md.** Handoff = **forward-looking связка** новых вещей для следующего разворота, не overview всего проекта. Open треки — да, но как мостик «вот где остановились», не как replica STATUS.md.
|
||||||
|
- **Не cross-project.** Per-project scope. «Завершаем сессию» в `.workshop/` не трогает `.admin/` и наоборот.
|
||||||
|
- **Не зависеть от harness `SessionEnd` hook** — такого hook'а в Claude Code нет (есть только `SessionStart`, `UserPromptSubmit`, `PreToolUse`, `PostToolUse`, `Stop`, `Notification`). Триггер — фраза или substantive-commit detection в самом agent flow.
|
||||||
|
- **Не считать handoff авторитетным** на стороне читателя. Это рекомендация прошлой сессии, не директива. User может override любую её часть.
|
||||||
|
|||||||
Reference in New Issue
Block a user