{"slug":"mm-clear-gate","title":"mm-clear-gate","summary":"Гейт перед /clear — read-only проверка «всё ли записано», вердикт из exit code скрипта, а не из реплики модели. Проверяет свежесть GSD-handoff в репозитории проекта, свежесть vault-файлов для Project Knowledge, состояние vault-репо, дерево проекта, запушенность, лог сессии, плюс ","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-20T07:57:11.235473Z","repo":{"url":"https://github.com/mworldorg/markdown-memory","stars":25,"forks":4,"license":"MIT","updatedAt":"2026-09-19T00:53:56Z"},"bodyHtml":"<hr>\n<h2>name: mm-clear-gate\nversion: 0.2.0\ndescription: Гейт перед /clear — read-only проверка «всё ли записано», вердикт из exit code скрипта, а не из реплики модели. Проверяет свежесть GSD-handoff в репозитории проекта, свежесть vault-файлов для Project Knowledge, состояние vault-репо, дерево проекта, запушенность, лог сессии, плюс validate.health как предупреждение. Два режима планки - mid (между этапами GSD, дефолт) и end (конец сессии). Use when user says \"/mm gate\", \"/mm-gate\", \"можно чистить\", \"всё ли записано\", \"готов к clear\", \"проверь перед clear\", ЛИБО когда сам собираешься предложить /clear.</h2>\n<h1>mm-clear-gate — гейт перед <code>/clear</code></h1>\n<p>Решает проблему: единственным подтверждением «всё сохранено» была фраза модели о сессии, память о которой <code>/clear</code> и стирает. Вердикт должен приходить <strong>из скрипта с exit code</strong>, а не из реплики.</p>\n<p><strong>Вся логика — в скрипте.</strong> Скилл его запускает, печатает вывод целиком и переводит exit code в одну строку. Ничего не пересчитывает и не пересказывает.</p>\n<h2>Запуск</h2>\n<pre><code>python &lt;repo&gt;/scripts/clear-gate.py --mode mid   # дефолт: между этапами GSD\npython &lt;repo&gt;/scripts/clear-gate.py --mode end   # конец сессии\n</code></pre>\n<p><code>&lt;repo&gt;</code> — корень mm-репозитория (<code>paths.skills_repo</code> из конфига). Проверяемый проект — текущий cwd; можно задать явно через <code>--project &lt;путь&gt;</code>.</p>\n<p>Режим: <code>/mm gate</code> → <code>mid</code>, <code>/mm gate end</code> (или «конец сессии», «закругляемся») → <code>end</code>.</p>\n<h2>Что делать с выводом</h2>\n<ol>\n<li>Напечатай вывод скрипта <strong>целиком, дословно</strong> — секции блокеров, предупреждений и пройденного. Не сокращай список файлов, не убирай подсказки-команды.</li>\n<li>Добавь одну строку по exit code:\n<ul>\n<li><code>0</code> → <code>✅ Гейт пройден — можно /clear.</code></li>\n<li><code>1</code> → <code>⛔ Гейт не пройден — чистить нельзя, сначала закрой блокеры выше.</code></li>\n</ul>\n</li>\n<li>При exit 1 <strong>не предлагай <code>/clear</code></strong> и не утверждай, что всё записано. Блокеры перечислены — назови их и остановись.</li>\n<li>Ничего не чини сам. Гейт read-only, исправления — отдельное решение оператора.</li>\n</ol>\n<h2>Планка по режимам</h2>\n<table>\n<thead>\n<tr>\n<th>Проверка</th>\n<th>mid</th>\n<th>end</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Свежесть <strong>GSD-handoff</strong> в репозитории проекта (<code>.planning/HANDOFF.json</code>, <code>.continue-here.md</code>)</td>\n<td>блокер</td>\n<td>блокер</td>\n</tr>\n<tr>\n<td>Свежесть <strong>vault-файлов</strong> для Project Knowledge (<code>handoff.md</code>, <code>dashboard.md</code>)</td>\n<td>предупреждение³</td>\n<td>блокер³</td>\n</tr>\n<tr>\n<td>Vault-репо: грязный или не запушен</td>\n<td>блокер</td>\n<td>блокер</td>\n</tr>\n<tr>\n<td>Дерево проекта незакоммичено</td>\n<td>предупреждение¹</td>\n<td>блокер</td>\n</tr>\n<tr>\n<td>HEAD впереди origin</td>\n<td>предупреждение</td>\n<td>блокер</td>\n</tr>\n<tr>\n<td>Лог сессии в <code>&lt;vault&gt;/sessions/</code></td>\n<td>не проверяется</td>\n<td>блокер</td>\n</tr>\n<tr>\n<td>Фаза Complete без passing-<code>VERIFICATION.md</code></td>\n<td>блокер²</td>\n<td>блокер²</td>\n</tr>\n<tr>\n<td><code>validate.health</code></td>\n<td>предупреждение</td>\n<td>предупреждение</td>\n</tr>\n</tbody>\n</table>\n<p>¹ становится блокером, если GSD-handoff устарел: незаписанное состояние плюс грязное дерево — это уже потеря.</p>\n<p>² только фазы <strong>текущего</strong> milestone (берётся из <code>milestone:</code> в <code>STATE.md</code>). Архивные вехи не трогаем: чинить их поздно, а гейт, краснеющий на том, что никто не пойдёт исправлять, начинают пролистывать. Строки со статусом <code>Deferred</code>, <code>In Progress</code>, <code>Executed — verification partial</code> не проверяются — ловится ровно расхождение «ROADMAP говорит <code>Complete</code>, а <code>verification.status</code> даёт не <code>passed</code>».</p>\n<p>Зачем: в <code>execute-phase</code> шаг <code>verify_phase_goal</code> стоит <strong>перед</strong> <code>update_roadmap</code> и guard'а не имеет, то есть при полном прогоне фаза физически не может стать Complete без отчёта. Но если планы гонять поштучно, а ROADMAP править отдельно, весь хвост workflow (верификация, learnings, todos) пропускается — так у Filtrator фаза 8 простояла Complete без единого <code>VERIFICATION.md</code>, и пять фаз из восьми оказались без отчётов. Сигнал у GSD был всегда (<code>verification.status</code>), но оставался advisory: его никто не читал. Здесь он становится вердиктом.</p>\n<p>³ два разных места записи, и одно другое не заменяет. <strong>GSD-handoff</strong> — <code>.planning/*</code> в репозитории проекта, пишет <code>/gsd-pause-work</code>. <strong>Vault-файлы</strong> — <code>handoff.md</code> и <code>dashboard.md</code> в vault, пишет <code>/mm save</code>; именно они едут в Project Knowledge claude.ai. Срабатывает, если mtime любого из них старше даты последнего коммита в репозитории проекта. Отдельного порога у проверки нет: пятиминутный порог GSD-handoff переиспользуется лишь как допуск на дребезг (<code>/mm save</code> пишет файлы, коммит ложится следом) — планка это сам факт «старше коммита».</p>\n<p>Планка по режимам — та же, что у лога сессии: между этапами GSD claude.ai vault не перечитывает, контекст восстанавливается из <code>.planning/</code>, поэтому в <code>mid</code> это предупреждение и на вердикт не влияет. Потерей устаревший vault становится на выходе из сессии — в <code>end</code> блокер.</p>\n<p>Зачем: 2026-08-08 на RasilshikParser <code>/gsd-pause-work</code> обновил <code>.planning/HANDOFF.json</code>, и гейт дал <code>exit 0</code> — проверка свежести смотрела на GSD-handoff и была права, проверка vault смотрела на чистоту репо и тоже была права. Vault был чист, запушен и отставал по содержанию на 65 часов. Новый чат прочитал состояние трёхдневной давности и предложил уже сделанное. Ни одна из двух проверок не задавала вопрос «а описывают ли vault-файлы сегодняшнюю работу».</p>\n<p>Почему так: <code>/clear</code> не трогает диск, поэтому между этапами GSD незакоммиченное и незапушенное ничего не теряют — блокировать их значит красить гейт в красный там, где всё в порядке, и приучать себя его пролистывать. Настоящий вопрос mid-режима — записано ли <em>состояние работы</em> (GSD-handoff) и доехало ли записанное (vault-репо). Vault-файлы для claude.ai между фазами не перечитываются, поэтому там они лишь предупреждение; спрашиваются в полную силу на выходе из сессии.</p>\n<h2>Жёсткие правила</h2>\n<ul>\n<li><strong>Read-only.</strong> Только <code>git status</code> / <code>rev-list</code> / <code>log</code>, mtime файлов и <code>validate.health</code> без <code>--repair</code>. Никаких коммитов, пушей и правок.</li>\n<li><strong><code>git fetch</code> не выполняется</strong> — это сеть и мутация refs. Сравнение идёт с последним известным origin: <code>ahead</code> точен, <code>behind</code> может быть устаревшим (и потому лишь предупреждение).</li>\n<li><strong>Exit code определяют только блокеры.</strong> Предупреждения на вердикт не влияют никогда.</li>\n<li><strong>7 forensic-проверок не дублируются</strong> — на них есть ссылка в выводе, когда health не <code>healthy</code>.</li>\n</ul>\n<h2>Edge cases</h2>\n<ul>\n<li><strong>Проект не под GSD</strong> — GSD-handoff и health помечаются <code>н/д</code>, не блокируют.</li>\n<li><strong>Vault не найден или не git-репо</strong> — vault ищется по имени из <code>passport.md</code>, затем по <code>project_path</code>, объявленному в артефактах vault, затем по имени папки проекта. Найден, но не git-репо — <strong>блокер</strong> с подсказкой <code>/mm vault</code>: без git нет ни синхронизации с Knowledge, ни истории, ни восстановления. Определить не удалось (нет каталога Projects, путь объявляют несколько vault, связь проект↔vault не установлена) — <code>НЕ ПРОВЕРЕНО</code>, что считается за блокер. Паспорт называет проект, а папки такой нет — предупреждение <code>/mm vault</code>: здесь отсутствие установлено положительно. Проверка свежести vault-файлов во всех этих случаях пропускается (<code>н/д</code>) — про сам vault уже сказано выше, со своей подсказкой, а второй голос о том же завёл бы параллельную ветку блокеров.</li>\n<li><strong>GSD-handoff-файлов нет вовсе</strong> — блокер: состояние работы нигде не записано.</li>\n<li><strong><code>handoff.md</code> / <code>dashboard.md</code> нет в найденном vault</strong> — отсутствующий файл пропускается, вердикт выносится по тем, что есть; если нет ни одного — проверка <code>н/д</code>. Отсутствие это не устаревание: сверять не с чем, дефект другой и чинится в другом месте, а блокер здесь краснел бы на vault'ах, заведённых до появления <code>dashboard.md</code>.</li>\n<li><strong>Нет upstream у ветки при наличии remote</strong> — блокер: запушенность установить нельзя.</li>\n</ul>\n","files":[{"path":"SKILL.md","sizeBytes":11530,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-20T07:57:42.9982Z","sha256":"1AC339425A2B61DA17A9E4603D8E2E5B1B95B45742F2413E83D50462BBD7E5DC","sizeBytes":4341},"review":null,"source":{"repositoryUrl":"https://github.com/mworldorg/markdown-memory","path":"skills/mm-clear-gate","license":"MIT","commit":"6de01f351f29806308a5bb5387ce96d5cb940b25","subtreeSha":"00BD71363741543428F468EDC9D2F742258AB892C16981D98AA1C996EE71163A","lastSyncedAt":"2026-09-27T20:54:54.452487Z"},"reviewedAt":"2026-09-20T07:59:30.069691Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/mworldorg/markdown-memory/tree/main/skills/mm-clear-gate"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install mworldorg-markdown-memory@llmmart"},{"target":"git","command":"git clone https://github.com/mworldorg/markdown-memory.git"}]}