mm-clear-gate · v0.1.0 · 2026-08-01 · sha256 75351a14777ad7d2
mm-clear-gate v0.1.0A
Immutable. This exact content is served forever at /api/v1/blob/75351a14777ad7d2.
--- name: mm-clear-gate version: 0.1.0 description: Гейт перед /clear — read-only проверка «всё ли записано», вердикт из exit code скрипта, а не из реплики модели. Проверяет свежесть handoff, состояние vault-репо, дерево проекта, запушенность, лог сессии, плюс validate.health как предупреждение. Два режима планки - mid (между этапами GSD, дефолт) и end (конец сессии). Use when user says "/mm gate", "/mm-gate", "можно чистить", "всё ли записано", "готов к clear", "проверь перед clear", ЛИБО когда сам собираешься предложить /clear. --- # mm-clear-gate — гейт перед `/clear` Решает проблему: единственным подтверждением «всё сохранено» была фраза модели о сессии, память о которой `/clear` и стирает. Вердикт должен приходить **из скрипта с exit code**, а не из реплики. **Вся логика — в скрипте.** Скилл его запускает, печатает вывод целиком и переводит exit code в одну строку. Ничего не пересчитывает и не пересказывает. ## Запуск ```bash python <repo>/scripts/clear-gate.py --mode mid # дефолт: между этапами GSD python <repo>/scripts/clear-gate.py --mode end # конец сессии ``` `<repo>` — корень mm-репозитория (`paths.skills_repo` из конфига). Проверяемый проект — текущий cwd; можно задать явно через `--project <путь>`. Режим: `/mm gate` → `mid`, `/mm gate end` (или «конец сессии», «закругляемся») → `end`. ## Что делать с выводом 1. Напечатай вывод скрипта **целиком, дословно** — секции блокеров, предупреждений и пройденного. Не сокращай список файлов, не убирай подсказки-команды. 2. Добавь одну строку по exit code: - `0` → `✅ Гейт пройден — можно /clear.` - `1` → `⛔ Гейт не пройден — чистить нельзя, сначала закрой блокеры выше.` 3. При exit 1 **не предлагай `/clear`** и не утверждай, что всё записано. Блокеры перечислены — назови их и остановись. 4. Ничего не чини сам. Гейт read-only, исправления — отдельное решение оператора. ## Планка по режимам | Проверка | mid | end | |---|---|---| | Свежесть handoff (`HANDOFF.json` / `.continue-here.md`) | блокер | блокер | | Vault-репо: грязный или не запушен | блокер | блокер | | Дерево проекта незакоммичено | предупреждение¹ | блокер | | HEAD впереди origin | предупреждение | блокер | | Лог сессии в `<vault>/sessions/` | не проверяется | блокер | | `validate.health` | предупреждение | предупреждение | ¹ становится блокером, если handoff устарел: незаписанное состояние плюс грязное дерево — это уже потеря. Почему так: `/clear` не трогает диск, поэтому между этапами GSD незакоммиченное и незапушенное ничего не теряют — блокировать их значит красить гейт в красный там, где всё в порядке, и приучать себя его пролистывать. Настоящий вопрос mid-режима — записано ли *состояние работы* (handoff) и доехало ли записанное (vault). ## Жёсткие правила - **Read-only.** Только `git status` / `rev-list` / `log`, mtime файлов и `validate.health` без `--repair`. Никаких коммитов, пушей и правок. - **`git fetch` не выполняется** — это сеть и мутация refs. Сравнение идёт с последним известным origin: `ahead` точен, `behind` может быть устаревшим (и потому лишь предупреждение). - **Exit code определяют только блокеры.** Предупреждения на вердикт не влияют никогда. - **7 forensic-проверок не дублируются** — на них есть ссылка в выводе, когда health не `healthy`. ## Edge cases - **Проект не под GSD** — handoff и health помечаются `н/д`, не блокируют. - **Vault не найден или не git-репо** — предупреждение и подсказка `/mm vault`, не блокер. Путь к vault собирается из имени в `passport.md`; если паспорта нет, берётся имя папки и vault может не найтись. - **Handoff-файлов нет вовсе** — блокер: состояние работы нигде не записано. - **Нет upstream у ветки при наличии remote** — блокер: запушенность установить нельзя.