Repo-boost
Приведи текущий репозиторий к агентскому стандарту iskron: плотный, AI-first AGENTS.md (читается каждую сессию, а не человеком однажды) + CLAUDE.md, указывающий на него, ритуалы сессии с графом, прошитые хуками, и гейт качества. Конфиг ты генерируешь из скелета — ничего не копируется руками, пользователь не вставляет шаблонов.
Настоящий деливерабл — интерфейс доверия: документ, которому агент может верить каждую сессию, а не просто красиво-плотный файл. AGENTS.md — производный вид, проекция источников, которые уже держат истину (код, package.json, конфиг CI, файловая система, граф), плюс тонкий слой авторского суждения (готчи, why-клаузы), который больше нигде не живёт. Поэтому контракт двуглав: плотность (каждая строка меняет поведение) и точность (каждая производная строка перепроверена против источника в этом прогоне). Плотная ложная строка хуже многословной — короткую и уверенную агент глотает без сопротивления. Проверяй с той же строгостью, с какой сжимаешь.
Скелет тела живёт в references/agents-template.md (относительно этого скилла). Прочти его: это набор ##-секций, которые обязан иметь готовый AGENTS.md, со слотами <…> и немногими заметками <!-- … -->. Заполни слоты, выброси неприменимые опциональные строки/секции, вычисти каждую заметку, не оставь ни одной угловой скобки. Скелет — что произвести; этот файл — как.
Контракт: 10. Шаг 7 штампует это число в каждый записанный AGENTS.md. Увеличивай на единицу только когда перемена здесь или в скелете делает уже сгенерированный файл неверным — секция добавлена, переименована или изъята, ритуал изменён, имя тула выпало; никогда — ради формулировок. Репо с меньшим штампом получает предложение полной дуги — запуск по слову человека или комнаты, на вахте без окна сам, спросив коллег (правило держит шаг «Выравнивание» двери iskron), — и ты называешь контракт, из которого пришёл его конфиг.
То же число стоит первым словом в description — и это не дубль, а несущая копия. Скилл-тело агент читает только после загрузки, а загружается скилл по описанию: номер, живущий лишь здесь, не может сработать триггером никогда — сравнить его не с чем, пока не позовут руками. В контексте всякой сессии сходятся ровно две вещи — список скиллов с их описаниями и AGENTS.md со штампом; сравнение возможно только между ними. Потому число дублируется нарочно, а расхождение двух копий ловит make validate.
Это простой счётчик, и он нарочно ни дата, ни версия плагина. Дата не выражает двух перемен в один день — второй нечем объявить себя. Версия релиза движется на каждом релизе, включая не трогающие ни одного скилла здесь, — штамповать её значило бы объявлять каждый конфиг устаревшим после любого релиза, а сигнал устаревания, срабатывающий постоянно, перестают читать. Этот счётчик — собственность шаблона и движется только когда его выход становится неверен. Конфиг со штампом-датой предшествует этой схеме — считай его ниже любого числа и предложи полную дугу.
Редакция установленной поставки сверяется здесь, и только здесь. Скилл не несёт на себе своей версии, а установленная копия отстаёт от сопровождаемой на выпуски; протухший текст читается так же авторитетно, как текущий, и его дефекты предстают дефектами метода. Поэтому всякий прогон — полный или рефреш — начинается сверкой того, что бежит, с тем, что выпущено, и тот же ход агент делает, прежде чем назвать инструкцию скилла неверной (туда его шлют feedback и entry):
cat ~/.claude/plugins/cache/*/*/*/.claude-plugin/plugin.json # что у тебя бежит
gh release view --repo <репозиторий плагина> --json tagName # что существует
node ~/.iskron-bridge/iskron-bridge.mjs --version # какую сборку несёт копия моста
Отстал больше чем на патч — обнови поставку и перезапусти сессии харнеса, чтобы не осталось старых процессов, и только потом прогоняй дугу: конфиг, выведенный из протухшего скилла, наследует его дефекты. Копия моста, отставшая от поставки, — самый частый источник «уже починенных» дефектов. Число контракта этого не заменяет: оно движется только с формой конфига, версия — с каждой отгрузкой.
Скелет сознательно инлайнит граф-агностичную агентскую дисциплину (Рабочие принципы, части «Жизненного цикла сессии») в каждый сгенерированный AGENTS.md, чтобы файл стоял сам — для агентов без доступа к графу. Держи её инлайн — не заменяй указателем в граф методологии, хотя содержание там дублируется.
Аудит → классификация → действие (не «свежий-или-настроенный»)
Репозиторий никогда не бывает просто свежим или настроенным — это спектр, и ловушка звучит так: «файл существует, значит, его факты верны». Не ветвись по наличию AGENTS.md / CLAUDE.md / .claude/. Вместо этого аудируй каждую заботу против её источника истины и классифицируй:
- absent — заявки ещё нет → выведи из источника (или, для авторского слота без проверяемого источника, спроси пользователя).
- stale — заявка есть, но расходится с источником → ре-спроецируй из источника, перезаписав устаревший текст. Не тащи вперёд только потому, что было записано.
- correct — заявка совпадает с источником → оставь.
Прогоняй по-заботно по карте источников ниже. «Свежий репо» — просто всё absent; зрелый — смесь, и опаснее всего почти-верный: немногие устаревшие строки прячутся среди доверенных (потому проверочный проход — по всему артефакту, Шаг 7). Авторские слоты без проверяемого источника: absent → спроси пользователя; никогда не выдумывай.
Источник истины по заботам
У каждого класса заявок один авторитет. Проверяй там — не вспоминай:
| Забота |
Источник истины |
Как проверить |
| Версии, зависимости |
package.json / pyproject.toml / go.mod / Cargo.toml + lockfile |
прочитать |
| Команды build/test/lint/dev |
scripts в package.json, Makefile/Justfile, CI-workflow |
прочитать; --help/dry-run, где дёшево |
| Гейт качества (строгость, max-warnings) |
конфиг линтера, tsconfig, CI-yaml |
прочитать |
| Структура проекта, path-алиасы |
файловая система + tsconfig/конфиг бандлера |
glob / list |
| Nature, production statement, послабления |
пользователь (авторское) |
подтвердить в разговоре |
| Носители Reality + как их наблюдать |
пользователь (авторское) |
подтвердить в разговоре — никогда не выводить |
| Проектные решения, why-клаузы, открытые вопросы |
Граф |
iskron_orient / iskron_search |
| Состояние веток, что в полёте |
git + форжа (открытый PR) |
git status / log; CLI форжи |
| Готчи |
авторское (прошлая боль) |
только sanity-check — не автовыводить |
Два рода строк, обрабатываемых по-разному: производные факты (верхние строки) ре-проецируются из источника каждый прогон — устаревшие никогда не сохраняются; авторское суждение (нижние — готчи, why-клаузы, nature) больше нигде не живёт — сохраняй его, лишь сверяя на здравость с кодом.
Контракт выхода — плотность и точность
AGENTS.md читается каждую сессию, поэтому он обязан быть и плотным, и истинным — на равных, не форма-прежде. Точность операционализирована выше (аудит/классификация против карты источников) и ниже (проверочный проход, Шаг 7). Половина плотности — пять правил:
- Императив, адресованный агенту. «Ориентируйся до кода», не «агенту следует ориентироваться».
- Правило плотности. Каждая строка должна менять то, что агент делает. Если удаление строки не изменит поведения — удали её. Читается как чек-лист, не эссе: без мотивации, афоризмов и кругов почёта.
- Без проектных обоснований, без дублирования графа. Почему решения живёт в графе (вимарши) — линкуй, не пересказывай.
AGENTS.md — reference-артефакт (шабда); нарратив в нём заводит второй источник истины, который дрейфует от графа и вводит будущих агентов в заблуждение. Краткая клауза (why: …) — только для инварианта, который будущий агент иначе нарушит: код-готча или неочевидное ограничение, никогда — проектное оправдание.
- Таблицы и буллеты вместо абзацев. Одна директива на буллет.
- Целевой длины нет — но секция, растёкшаяся в абзацы, почти всегда несёт обоснование, которому место в графе. Перенеси туда.
Вне объёма — механика оркестрации. AGENTS.md обращён к одному агенту в одной сессии. Цепочки гейтов сборки, суб-агентная проверка пушей, model-routing, многополосная координация сюда не идут — их инлайн ломает правило плотности для одиночного читателя. Дом: выделенный скилл оркестрации/планировщика или граф методологии — кроме среза суб-агентного делегирования, который этот скилл проецирует ролевыми файлами (Шаг 6, references/delegation.md), никогда прозой AGENTS.md. Линкуй при нужде, не инлайнь.
Рабочий пример — одна и та же запись ## Code conventions, плохо (нарратив) и хорошо (AI-first):
- ❌ «Мы стараемся аккуратно обращаться с состоянием, потому что это демо и стор — единственное место, где живут данные, поэтому важно, чтобы компоненты правильно читали его при смене персоны, иначе демо может выглядеть сломанным.»
- ✅ «Persona-scoped UI читает роль через
use-acting-context; перепроверь рендер при смене персоны. (why: стор — единственный источник данных, устаревшее чтение показывает данные чужой роли.)»
Хорошая версия — директива + одна клауза-инвариант. Плохая — три предложения обоснования, которым место в вимарше.
Процедура
Идемпотентна насквозь: в зрелом репо прогоняй каждый self-check и действуй только по провалам; докладывай, что осталось.
Два такта
Такт 1 «встать» — без единого вопроса, до минуты, в любом репозитории. Это первый и по умолчанию единственный такт при первом контакте, по слову «iskronify» — от человека в чате или из комнаты. Ничего не спрашивай; всё, что не выводится, ложится дыркой.
- Адреса. Граф и роль — из слова человека, строки приглашения или существующего
AGENTS.md. Графа нет и он не назван → единственный вопрос такта 1: имя графа (iskron_realm(action="list") показывает доступные; создание — iskron_realm(action="create") по слову человека), без него пункты 2–5 не стоят. Роль владельца — 主-роль человека твоих ключей в этом графе (iskron_me(action="kartas")); перечень, в котором стоишь ты сам, — знак сбитой привязки: владельца из него не выводи, слот остаётся дыркой на узле согласования; ролей у человека здесь нет вовсе — заведи svatantra-роль владельца (Шаг 2).
- Контур репозитория.
origin → хост/организация/репо → iskron_search(q="", node_type="holon", attrs_filter="repository:<значение>"). Есть — он; нет — iskron_add_holon (граница проекта, contains от корня графа или от контура, под которым живут репозитории этого графа) с attrs.repository. Один репозиторий — один контур.
- Роль на репо.
iskron_search(q="", node_type="karta", steward_of=<контур>). Есть — она; нет — iskron_add_karta (manifested_as=adhikarin, мотивация — дистиллят того, что репо шипит) и ребро steward к контуру. Одна роль на репозиторий по умолчанию: инбоксы не сливаются.
- Обложка. Скелет
AGENTS.md по references/agents-template.md: обложка — таблица слотов. Выводимые слоты (граф, контур, роли, репозиторий, стек по файлам, команда гейта по package.json/Makefile/аналогу, структура) заполняются с источником «выведено»; авторские (nature, цена поломки, потребители, Reality, память, фидбэк, interop) — <не согласовано — #N>, где #N — узел согласования из п. 5. Ритуалы «Жизненного цикла сессии» инлайнятся из шаблона как есть.
- Узел согласования. Вимарша
genre=hint «Согласование iskronify для <репо>» на контуре, гроссбухом: строка на слот — [слот] [вопрос словами человека] = открыто; posed_to — роль владельца, а когда её слот — дырка (п.1), ребра-инбокса не ставь: адресат узла — кадр в комнату или в мост человека, и posed_to встанет, когда роль заведут. Затем кадр туда, где на тебя смотрят, — комната или мост человека: «есть вопросы по проекту, за который я отвечаю, — ответьте или скажите, кто может ответить». Не портянка человеку: агенты рядом обычно знают, прод ли это, кто потребитель и чем верифицировать.
- Хук старта и сторож памяти — из Шага 4 только
SessionStart с адресами и memory-guard PreToolUse; стаб MEMORY.md из Шага 5 — только над пустой или отсутствующей директорией памяти. Непустая — не трогай ничего: эвакуация (Шаг 5) ждёт ответа о кросс-проектной памяти, и это строка узла согласования, а строка скелета о заморозке в этом случае пишется как <не согласовано — #N>; строка скелета обязана быть истинной с первого такта, не обещанием. Остальные хуки — такт 2. Указатель CLAUDE.md — Шаг 7.
- Стояние — не здесь: его занимает старт двери
iskron, и только на вахту.
Отчёт — гроссбух такта в комнату или человеку: что заведено, что выведено, что открыто; затем эстафета Шага 7 — тизер роадмапа.
Такт 2 «доделать» — лениво, не блокируя. Каждый старт сессии в этом репо (раздел «Старт» двери iskron, шаг «Выравнивание») читает узел согласования: строка получила ответ — слот обложки вписывается с источником «согласовано: кто» без переспроса; ответа нет — одна строка человеку и работа идёт. Ответы агентов (по кадрам и на узле) записываются с честной эпистемикой — anumita, не pratyakshita, — и человеку предлагается верифицировать выведенное понимание, а не ответить на список. Полная дуга — Шаги 1, 3, 4, 6 с интервью, строгим гейтом, всеми хуками и ролевыми суб-агентами — идёт, когда человек рядом и сказал «iskronify», либо когда узел согласования закрыл авторские слоты: тогда AGENTS.md перепроецируется той же обложкой. Ничего из такта 2 не мешает такту 1 и работе после него.
Отложенная авторская секция объявляется, не роняется — особенно Reality: на неё указывают другие секции. Оставь заголовок и одну настоящую строку под ним — «Ещё не устоялось: прогони интервью (скажи iskronify), прежде чем принимать здесь любую поведенческую заявку.» — не слот, так что проверка «без угловых скобок» проходит. Отсутствующая секция читается как «проверять нечего» — противоположность правде — и оставляет указатели из «Жизненного цикла сессии» и Рабочего принципа 6 нацеленными в пустоту.
Шаг 1 — Согласуй (такт 2)
В такте 1 ничего из этого не спрашивается: слоты стоят дырками на узле согласования, и вопросы уходят сперва агентам по каналам, потом человеку на верификацию. Не выбирай дефолты молча. Подтверди в разговоре и запиши в обложку: Nature (и, если не production, какие принципы ослаблены и почему), имя графа (создай, если нет), «Стек», гейт качества (предложи строжайший — Шаг 3). Для существующего репо сначала выведи из репо и старого конфига, подтверждай только двусмысленное.
Также согласуй, кто владеет направлением: владелец графа как svatantra-роль (主) — создаётся в Шаге 2, если её нет. Вопросы вне мандата будут ставиться ей граф-вимаршами (posed_to), не только чатом.
Также согласуй общее изменяемое состояние build/test: читает или мутирует ли сборка/тест общий ресурс — базу, фиксированный порт, dev-сервер, глобальный кэш, облачную песочницу? Если да — зафиксируй по-полосную изоляцию (per-branch БД/схема, per-lane порт, per-lane temp) как готчу: агенты гоняют ветки конкурентно в отдельных worktree, и общий ресурс портится поперёк полос. Пропусти, если общего изменяемого состояния нет.
Также согласуй реальность — против чего здесь проверяется заявка; заполняет таблицу Reality. Кодовый репо, репо данных и инфраструктурный отвечают на это по-разному, поэтому ничего не выводи — спрашивай: куда приземляется изменение, какие эффекты производит, какие из них наблюдаемы и какой именно командой / URL / запросом, что агент достаёт сам, а что требует пользователя. Дожимай до канонического носителя каждого класса заявок — собранный артефакт, не исходники; живой эндпоинт, не хендлер; чистая установка, не тёплый кэш. Класс без достижимого наблюдения идёт в Ceiling со своей причиной, никогда — аспирационной строкой. (Как таблица работает при закрытиях — дисциплина «Сверка реальностью» скилла vahta.)
Также согласуй кросс-проектную память — спроси один раз на пользователя, не на репо (ответ прошлой прокачки переиспользуем): хочет ли пользователь, чтобы переживающее любой отдельный репозиторий сохранялось — личный граф @<handle>/mind для фактов о нём и глобально инжектируемый файл предпочтений («как со мной действовать»: ~/.claude/CLAUDE.md, ~/.config/opencode/AGENTS.md) для стоячих инструкций? Да → заведи слой: бутстрап графа (minding §3) и файл предпочтений (создай, если нет; один источник, слинкованный между харнессами, которые пользователь гоняет); сгенерированная маршрутизация сохраняет ветки личного графа, а сообщение memory-guard — маршрут minding. Нет → маршрутизация репо-скоупна: факты проекта — в этот репо и его граф, остальное остаётся сессионно-локальным; ветки личного графа, пункт о предпочтениях и маршрут minding в сообщении гарда опускаются. Никогда не предполагай, что слой существует, потому что у харнесса есть под него слот.
Тем же ходом согласуй фидбэк-рефлексию — тоже один раз на пользователя: не против ли он, чтобы агент в конце сессии, после мержа или завершения задачи рефлексировал опыт о самом методе — где скилл, правило или поверхность подвели или удивили — и записывал стоящее в граф работы — на контур инструмента, адресно его стюарду, — после проверки на дубли и только случаем, не мнением? Да → регион feedback-reflection в скелете остаётся, и push-хук (Шаг 4) несёт напоминание такта. Нет → удали регион целиком; опыт остаётся сессионно-локальным. Спрашивается это потому, что рефлексия пишет в граф от имени делателя без прямого задания, — выбор владельца, не агента; и потому такт висит на хуке, а не на памяти: строка «в конце сессии дай фидбэк» — обязанность без собственного знака, файл к концу сессии давно вне контекста.
Также согласуй сосуществование с workflow-набором (только когда обнаружен коэрсивный набор — его скиллы видны в списке, или его директория есть в кэше плагинов, например ~/.claude/plugins/; сегодня это superpowers): скажи пользователю, что найдено, и согласуй режим:
- Полный interop (рекомендуется) — AGENTS.md получает interop-подсекцию (из
references/superpowers-interop.md этого скилла) + spec-write-хук (Шаг 4);
- Только проза — подсекция без spec-write-хука;
- Пропустить — без текста сосуществования (не рекомендуется; назови риск: дизайн-сессии, ведомые набором, по умолчанию не осядут в граф).
Человек не обязан быть в треде — и обычно его там нет. Прогон идёт вахтой, ночью, из комнаты, из чужого харнесса. «Спроси» тогда тихо вырождается в одно из двух — агент выдумывает авторский слот или встаёт и не делает ничего. Оба хуже пропуска. Порядок — такт 2, и он такой.
- Сделай всё, что от ответа не зависит. Аудит по источникам, выводимые заботы, гейт, хуки — ничего из этого человека не ждёт. Встать целиком, упершись в один слот, — не осторожность, а простой.
- Подними вопрос узлом согласования, а не в пустоту. Один hint-узел на контуре репозитория, гроссбухом по слотам,
posed_to роли владельца — один узел на всё согласование, не по узлу на слот: человек отвечает разом; веер из шести вимарш он читает как шесть требований. Сперва спроси агентов: кадр в комнату или стюардам соседних контуров — «есть вопросы по проекту, за который я отвечаю, ответьте или скажите, кто может»; их ответы ложатся строками с anumita.
- Разбуди по каналу, выбрав строку с доски.
iskron_channel(action="list") → стояние-мост твоего человека: чат-бот, телефон, что его ретранслирует. Роль — не адрес: одну роль часто держат мосты к разным людям, и имя стояния у них совпадает буквально; различает строку @handle, сверенный с хендлом твоего человека, — никогда не имя. Моста нет вовсе — адресуй роль выше: стюарда родительского контура или бригадира. Вопрос к начальнику законен ровно тем, что твой человек недостижим, и так и скажи в теле.
- Пиши обложку с дыркой, а не с догадкой. Несогласованный слот остаётся
<не согласовано — #N> и называет узел согласования. Дырку видит всякая следующая сессия и всякий линт; догадку — никто. Так пропуск самозаживает: старт двери читает узел, находит ответ и вписывает слот, не переспрашивая человека второй раз; человеку остаётся верифицировать выведенное.
И один слот не задерживает остальные. Согласование — не транзакция: отвеченное записывается сразу, ждёт только неотвеченное. Прогон, отложенный целиком до ответа на один вопрос, отдаёт человеку репозиторий ровно в том виде, в каком взял.
Шаг 2 — бутстрап графа
- Граф существует? Нет: согласуй имя, затем
iskron_realm(action="create").
- Если у проекта есть структура сверх самого графа — существует фокус-контур (названный по границе проекта,
contains от корня графа), и его #seq идёт в обложку. Границу проектируй скиллом design, создавай iskron_add_holon. Контур несёт свой репозиторий стандартным атрибутом repository — хост/организация/репо из git remote get-url origin, без протокола и .git (например github.com/iskron-ai/skills); по нему работает фильтр attrs_filter="repository:…", а старт двери iskron сверяет его с origin при каждом входе. Ставь при заведении и на рефреше, если его нет; один контур — один репозиторий.
- Делатель становится стюардом. Создай роль агента репозитория (
iskron_add_karta, manifested_as=adhikarin, мотивация — дистиллят Production statement) и проведи её steward к фокус-контуру: adhikarin без steward-ребра — живое предупреждение («действует, но ни за что не отвечает»). Создай svatantra-роль владельца, если Шаг 1 её не нашёл. Запиши оба seq в обложку — слот в доке есть единственный путь, на который агент может опереться.
- Холон + стюард — корень поля интеграции. Этого достаточно, чтобы всякая будущая работа вывела потребителей и эффекты из графа: обход держит
integrity своим режимом поля интеграции — не пересказывай его здесь, он дрейфует молча. Не спрашивай человека об «общих поверхностях» и не пиши их список в AGENTS.md: такая проза устаревает в ходе самой работы. Не найденная обходом зависимость — дефект модели: допроектируй крии и феномены (design), непрошитые связи дотки (weaving).
Шаг 3 — Гейт качества (предложи строжайший, пользователь подтверждает)
По каждому пункту: предложи строжайший разумный для стека вариант, трейд-офф одной строкой, дождись подтверждения. Дефолт строгий; послабления — только по явной просьбе, откалиброванной ценой поломки из обложки, и записываются там по-инструментно.
Ужесточение существующего гейта не бесплатно. На зрелом репо с уже ослабленным гейтом max-warnings 0 — не галочка, а обязательство рефакторинга. Прежде чем предлагать ужесточение — измерь: прогони линтер/тайпчекер на предлагаемой строгости, посчитай провалы, покажи цену. Ужесточению уже-ослабленного нужна та же явная просьба, что послаблению, — и, возможно, отдельная ветка, не бутстрап.
- Линтер, максимально строгий (
@typescript-eslint/strict; Ruff E,F,B,I,N,UP,RUF; golangci-lint широкий; clippy -- -D clippy::pedantic).
- Форматтер, auto-fix on save + pre-commit (Prettier,
ruff format, gofumpt, rustfmt).
- Тайпчекер, strict, если в стеке есть (
tsc --strict, mypy --strict / pyright --strict).
- Pre-commit-хук: линтер + форматтер + тайпчек по staged-файлам.
- Тест-фреймворк + дисциплина (unit для библиотек; +integration для сервисов; +e2e для UI; порог покрытия для production). Записать в «Конвенции кода».
- CI: lint + typecheck + tests на каждый пуш, падает на предупреждениях. Обязателен для
production.
- Гейт обязан быть ВЫЗЫВАЕМЫМ, а не перечисленным. Заведи в проекте один вызов, чья цепочка и есть записанное правило (
npm run gate, make check, just check — по стеку), и в AGENTS.md называй ЕГО ИМЕНЕМ, а не списком шагов. Собранный вручную гейт молча теряет шаг и всё равно кончается зелёным выводом: проверяемого признака у пересказа нет. Перечисление исполняется пересказом, а пересказ теряет элементы молча: «прогнал гейт» и «прогнал семь восьмых гейта» кончаются одинаково зелёным выводом, и проверяемого признака у исполнения нет. Один вызов делает «гейт зелёный» наблюдением, а не заявкой о собственной аккуратности, и расхождение с CI становится невозможным по построению — обе стороны зовут одно и то же. CI обязан звать тот же вызов, а не повторять шаги своим списком. Цепочка вынужденно собирается руками — запиши почему и чем тогда проверяется её полнота.
- CI-паритет: всякая проверка, способная упасть, должна гейтить PR, а не только post-merge. Проаудируй workflow на джобы, скоупленные push-
main/release (кодоген, генерация схем/API-спек/доков, сборка образа или бандла, проверка миграций) — проверка только-после-мержа позволяет двум по отдельности зелёным PR сломать main после мержа. Дотяни до прогона и на PR; неустранимый сейчас зазор запиши готчей.
Команды — в «Команды», дисциплину — в «Конвенции кода».
Шаг 4 — Хуки
Деливерабл — ритуалы, не файл. Определи, какими харнессами репо пользуется, и прошей поверхность каждого — hooks-файл Claude Code, [hooks] в config.toml Codex, plugin-директорию OpenCode — по references/harness-surfaces.md, где лежат проверенные пути, имена событий и пер-ритуальный маппинг. Харнессов может быть несколько — прошей каждый. Где у харнесса нет поверхности для ритуала — скажи, какой не удалось автоматизировать: он всё равно связывает через прозу «Жизненный цикл сессии» в AGENTS.md, которую скелет инлайнит ровно поэтому. Никогда не пиши конфиг формата, о котором гадаешь.
Остальное в этом шаге — форма Claude Code. Хуки в .claude/settings.json (коммитится — ритуалы всего проекта, нужны каждому агенту на каждом клоне) — безусловные из списка ниже, плюс условный spec-write — только когда согласование Шага 1 выбрало полный interop (согласованный режим записан в interop-штампе AGENTS.md, Шаг 7; нет подсекции = не согласовано = без spec-write). Мержи, никогда не перезаписывай: в файле могут жить записи других наборов — добавляй свои рядом в тех же массивах; удаление чужих хуков ломает чужие ритуалы. JSON генерируй под этот проект — пиши сам:
SessionStart → напоминание прочитать раздел «Старт» скилла-двери iskron до действий, с адресами этого репо: граф, фокус-контур, seq роли агента и роли владельца — и одной фразой, что стояние занимается только на вахту (слово «вахта», start, строка приглашения, кадр), одним вызовом iskron_stand. Протокол старта живёт в самом скилле, хук его не пересказывает: пересказ в хуке дрейфовал бы от скилла отдельно, а поднимать контракт на каждую правку старта — волна по всем репо.
PostToolUse с "matcher": "Bash" → когда команда содержит git push: напоминание спросить, какой это был пуш — где done значит merged, пуш, лишь открывший или обновивший PR, не отгрузил ничего: запиши ответ там, где он действительно стоит, и оставь тела и модусы описывающими то, что несёт транк (модель, записанная прежде мержа, описывает то, чего в репо нет, а отозванный PR оставляет её лгать). После мержа — обновить граф только от свежего свидетельства артефакта (сверить с реальностью + продвинуть карту превращений, и завершить то, что мерж разрешил, по осям — addressed_by записывает ответ, отпускание — отдельный акт), промести отгруженный контур (переключить модусы каждого спроектированного узла, который пуш реализовал, — весь контур, не только тронутые, — и завершить дизайн-вимарши, которые отгрузка разрешила), отработать инбокс (posed_to-вопросы, на которые работа ответила), прогнать самопроверку после зелёного пуша, а на открытом PR или завершённом крупном этапе — открыть холодное ревью суб-агентом (дифф ветки против транка + репозиторий + референсы на все узлы графа, входящие в дифф; integrity выводит от них поле интеграции и состояние соседей; reviewer возвращает затронутые контуры и steward-роли, открытые вимарши, готовность интеграции и кого нужно разбудить; не дошёл trace — чинить граф ткачеством, а не дописывать бриф), перечитать дифф и узлы на заимствованные проектно-менеджерские слова — ticket, backlog, sprint, epic, story, done, blocker, committed — называя каждое пользователю и спрашивая, как это зовётся в проекте, а не подменяя самому; и: невпущенные design/spec-доки на этой ветке → впустить (intake, затем design) до закрытия; при согласованной фидбэк-рефлексии — её такт по региону feedback-reflection (дедуп в общем фидбэк-графе; пустая рефлексия — валидный исход). Словарная перечитка едет на этом хуке нарочно: она — механизм запрета прозы, а запрет, живущий только в AGENTS.md, агент и проскальзывает.
PreToolUse с "matcher": "Write|Edit|MultiEdit" → memory-guard: когда целевой путь внутри локальной директории проектной памяти — блокируй запись (exit 2, маршрутизирующее сообщение в stderr) — состояние живёт в репо, графе или личном графе пользователя, никогда в локальной памяти агента, и запрет — по директории, а не по категории; директория остаётся замороженной на стабе-запрете (Шаг 5). Блокировать здесь безопасно: путь однозначен, легитимных записей туда ноль by policy. Хук срабатывает в момент, когда включается инстинкт «сохранить», а AGENTS.md уже далеко в контексте. Точный JSON ниже.
Stop → хук незастывания (для репо, где несут агентские вахты): ход, кончившийся планом без перемены, — застывание, и агент технически мёртв до следующего пробуждения. Команда хука разбирает хвост transcript: финальный текст ассистента матчится на маркеры застывания («начну с», «приступлю к», «если ты не против», "I'll start with", "shall I") и в ходе не было ни одного пишущего вызова (Write/Edit/MCP-записи) → блокируй завершение (decision block, причина в ответе): «Начало не объявляется — совершается: сделай первый ход выбранного, либо запиши вопрос адресату (вимарша + кадр) и скажи, что записал.» Уважай stop_hook_active: повторный стоп после блока пропускается — хук будит один раз и не зацикливает. Эвристика текстовая, ложный позитив безвреден: агент делает ход или честно переформулирует финал.
PreToolUse с матчером на пишущие тулы графа (mcp__.*iskron_(add_.*|batch)) → указатель момента writing: неблокирующее эхо конверта с одной строкой — пять решений скилла, hint как указатель, CHECKS как работа. Скилл загружается в один момент, а пишется в другой; строка стоит ровно там, где агент составляет вызов. Тот же указатель мост приписывает к описаниям этих тулов, а дверь iskron держит карту моментов — три места, одна строка, дословно. Точный JSON ниже.
PostToolUse с "matcher": "Write|Edit" → spec-write-хук (только полный interop): когда путь записанного файла похож на design/spec-док — напоминание, что файл есть черновой вид, а запись дизайна — граф. Тот же стиль конверта, гейт по .tool_input.file_path, как push-хук гейтится по тексту команды; точный JSON ниже.
Каждый хук запускает shell-command, эхающий конверт хука в stdout. Вложенность (event → массив → {"hooks":[{"type":"command","command":…}]}) — то, что легко перепутать:
{ "hooks": { "SessionStart": [ { "hooks": [ { "type": "command",
"command": "echo '{\"hookSpecificOutput\":{\"hookEventName\":\"SessionStart\",\"additionalContext\":\"<start reminder: read the iskron door's Start section first; realm, focus holon, agent karta, owner karta; standing only on watch, via iskron_stand>\"}}'" } ] } ] } }
Запись PostToolUse добавляет "matcher": "Bash" и гейтит эхо по команде: jq -r '.tool_input.command // ""' | grep -q 'git push' && echo '<envelope>' || true.
Это матчит текст команды, так что сработает и на командах, лишь упоминающих git push (echo, heredoc PR-тела, валидация самого этого хука) — известный ложный позитив. Для неблокирующего напоминания безвреден — шипь как есть; только никогда не повышай этот текст-матч до чего-либо, что гейтит работу. Чтобы срезать шум — ветвись ещё и по .tool_response, чтобы напоминание срабатывало только на реально прошедший пуш.
Свежесть ветки — механическая проверка, не память. Предложи pre-push git-хук (или добавь в тот же PostToolUse-гейт): ветка не потомок origin/main → сказать в момент пуша — git fetch -q origin main && git merge-base --is-ancestor origin/main HEAD || echo 'ветка отстала от main — перебазируй до пуша'. Обнаруживать отставание конфликтом через несколько слияний — провал формы, не делателя: причина и следствие разнесены так, что изнутри их не связать. По той же причине пост-мерж-последовательность вешается на событие мержа (напоминание выше), никогда на условие-затишье вроде «когда ничего не в работе» — у занятого делателя оно не наступает никогда.
Memory-guard — в отличие от напоминаний он блокирует: PreToolUse-команда с exit 2 останавливает вызов тула и отдаёт Claude сообщение из stderr. Путь однозначен (.claude/projects/<encoded>/memory/), ложных позитивов почти ноль. Последний маршрут сообщения следует ответу Шага 1 о кросс-проектной памяти — при «нет» выброси фразу о личном графе:
{ "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command",
"command": "jq -r '.tool_input.file_path // \"\"' | grep -Eq '\\.claude/projects/.*/memory/' && { echo 'BLOCKED: local agent memory is forbidden entirely, not by category (AGENTS.md, Persistence rules). Route the fact: repo conventions / code facts → AGENTS.md; project state, this repo'''s servers and dated duties → the project realm; a user-scoped fact no project owns → the personal realm @<handle>/mind (minding skill) — drop this route under cross-project-memory=no. This dir stays frozen at its prohibition stub.' >&2; exit 2; } || exit 0" } ] }
Эта запись идёт под "PreToolUse" — собственный массив события, не массив PostToolUse.
Указатель момента writing — второй объект в том же массиве PreToolUse, с матчером по имени тула (имя MCP-тула в Claude Code — mcp__<сервер>__iskron_batch, поэтому матч по хвосту):
{ "matcher": "mcp__.*iskron_(add_.*|batch)", "hooks": [ { "type": "command",
"command": "jq -r '.tool_name // \"\"' | grep -Eq 'iskron_(add_[a-z_]+|batch)$' && echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"additionalContext\":\"Момент скилла writing: перед вызовом по каждому узлу назови читателя, что изменит извлечение и что здесь ново; тип и given_as, три модуса как утверждения, имя-тезис, стрелки со смыслом; hint — гроссбух превращения: исходы с вердиктами и что дальше, не пересказ карты; строки CHECKS в ответе — работа этого такта.\"}}' || true" } ] }
Spec-write-хук (только полный interop), тот же стиль гейта — широкий поведенческий glob; ложные позитивы безвредны для неблокирующего напоминания, никогда не повышай его до гейта работы:
{ "matcher": "Write|Edit", "hooks": [ { "type": "command",
"command": "jq -r '.tool_input.file_path // \"\"' | grep -qE '(^|/)specs/[^/]+\\.md$|(^|/)docs/.*design[^/]*\\.md$' && echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PostToolUse\",\"additionalContext\":\"A design draft was written; per AGENTS.md this file is a draft view — the graph is the design record. Intake it (intake skill, then design skill) in this session — do not defer to a push.\"}}' || true" } ] }
Spec-write-запись мержится в тот же массив PostToolUse, что и git-push-хук — соседние объекты, не замены; memory-guard живёт в собственном массиве PreToolUse.
Self-check: все три базовых хука на месте, и spec-write присутствует тогда и только тогда, когда interop-штамп AGENTS.md говорит full (нет штампа или prose-only → его НЕ должно быть — не до-добавляй на рефреше); SessionStart зовёт раздел «Старт» двери iskron (не entry) и называет реальный слаг графа, фокус-контур и seq роли агента, не плейсхолдеры; ни одна чужая хук-запись не выпала при мерже.
Внимание: запись .claude/settings.json харнесс может пометить как само-модификацию и потребовать явного одобрения — вынеси запись на подтверждение, а не считай, что она легла молча.
Шаг 5 — Гигиена репозитория
- Закоммить
.claude/settings.json; заигнорь .claude/settings.local.json в .gitignore. Если .claude/ игнорится широко — добавь явный un-ignore: !.claude/settings.json. Проверь git check-ignore -v .claude/settings.json .claude/settings.local.json.
- Трекаемые secret/env-файлы: прогони
git ls-files '.env*' '*secret*' '*local*'. Если трекается реальный env/secret (не .example) — предупреди в «Конвенции кода»: никогда не стейджить локальные правки — git update-index --skip-worktree <file>, никогда git add -A / commit -a (агент, правящий трекаемый env, иначе сливает его в PR).
- Локальная директория проектной памяти (
~/.claude/projects/<encoded-path>/memory/): проаудируй, эвакуируй, затем заморозь. Там не остаётся ничего — запрет по директории, не по категории. Проектное состояние (решения, ограничения, готчи) → AGENTS.md / граф, состояние ветки → git и тело PR; серверы и датированные долги этого проекта → его граф; собственные владения пользователя (личные машины, сроки, люди, кросс-проектные находки) → его личный граф (minding) — но только при ответе Шага 1 «да» на кросс-проектную память; при «нет» они остаются в AGENTS.md репо, если этот репо обязан их держать, иначе выбрасываются с ведома пользователя. Предпочтения стиля работы — инструкции, не факты: → глобально инжектируемый файл инструкций (его заводит minding §3), никогда не узел. Затем заморозь: MEMORY.md становится однострочным стабом-запретом («состояние живёт в репо или графе — см. AGENTS.md, Persistence rules»), а memory-guard (Шаг 4) блокирует дальнейшие записи в момент срабатывания инстинкта. Эвакуируй прежде, чем заморозить — стаб поверх непрочитанного уничтожает то, что должен был переселить. Причина: воспроизводимость + мультимашинная, мультиагентная работа — локальная память невидима любому другому агенту и машине.
- Форжа и её CLI — выведи, никогда не предполагай GitHub. Прочти
git remote -v; хост решает инструмент (gh GitHub, fj Forgejo/Codeberg, glab GitLab, tea Gitea). Проверь, что он установлен и аутентифицирован, и назови его в «Git workflow» вместе с командой наблюдения. Это не косметика: открыть PR — единственный шаг передачи, которым агент владеет целиком, и агент, не знающий инструмента, превращает его обратно в вопрос пользователю. Неопознанный self-hosted хост → спроси, каким CLI пользуются; никогда не угадывай gh потому, что знаешь его.
- «Стек», «Команды», «Структура проекта», «Конвенции кода» несут реальное содержимое пропорционально зрелости. Пусто в первый день — нормально;
TBD — нет.
HANDOVER.md не заводится, и AGENTS.md несёт раздел, объясняющий его отсутствие — без раздела следующая сессия заведёт файл заново, по привычке и не найдя запрета. Состояние ветки живёт в git branch/log, теле открытого PR и гроссбухе в семени genre=hint превращения, из которого тело PR собирается; из четырёх домов одних и тех же фактов рукописный — единственный, который врёт молча. Файл уже есть — эвакуируй содержимое по этим домам и удали его.
README.md короткий, человеко-обращённый, AGENTS.md не дублирует.
Шаг 6 — Ролевые суб-агенты делегирования
Проецируй доктрину делегирования именованными ролевыми агентами, не прозой AGENTS.md (механика оркестрации — вне AGENTS.md, контракт выхода выше). Доктрина + шаблоны файлов: references/delegation.md (относительно этого скилла).
- Всегда:
.claude/agents/reader.md (дешёвый тир, разведка), .claude/agents/worker.md (средний тир, исполнение брифа) и .claude/agents/verifier.md (верхний тир, холодная приёмка), алиасы моделей haiku/sonnet/opus. Verifier проецируется даже там, где у репо ещё нет рантайма — именно он делает таблицу Reality действенной, и репо, обретший носитель позже, не должен требовать пере-прогона ради своего приёмщика.
- Когда репо показывает использование OpenCode (
opencode.json / .opencode/, или пользователь говорит): .opencode/agents/reader.md, worker.md, verifier.md и reviewer.md, mode: subagent, модель пришпилена в каждом файле — незапиненный суб
…(truncated)
1---2name: iskronify3description: КОНТРАКТ AGENTS.md: 10. Предложи БЕЗ ПРОСЬБЫ полную дугу, когда штамп iskronify в AGENTS.md ниже 10, дата вместо числа или штампа нет; запуск — слово человека или комнаты, на вахте без окна — сам, спросив коллег. По просьбе — iskronify, «прокачай репо», «привести проект к стандарту», «завести/обновить AGENTS.md», set up AGENTS.md. Два такта: «встать» — один вопрос (граф, если не назван), контур по origin, роль на репо, обложка из выводимого, хук старта; «доделать» — согласование гроссбухом на каждом старте. Нужны тулы iskron_*.4---56# Repo-boost78Приведи **текущий репозиторий** к агентскому стандарту iskron: плотный, AI-first `AGENTS.md` (читается каждую сессию, а не человеком однажды) + `CLAUDE.md`, указывающий на него, ритуалы сессии с графом, прошитые хуками, и гейт качества. Конфиг ты **генерируешь** из скелета — ничего не копируется руками, пользователь не вставляет шаблонов.910Настоящий деливерабл — **интерфейс доверия**: документ, которому агент может верить каждую сессию, а не просто красиво-плотный файл. `AGENTS.md` — *производный вид*, проекция источников, которые уже держат истину (код, `package.json`, конфиг CI, файловая система, граф), плюс тонкий слой авторского суждения (готчи, why-клаузы), который больше нигде не живёт. Поэтому контракт двуглав: **плотность** (каждая строка меняет поведение) и **точность** (каждая производная строка перепроверена против источника *в этом прогоне*). Плотная ложная строка хуже многословной — короткую и уверенную агент глотает без сопротивления. Проверяй с той же строгостью, с какой сжимаешь.1112Скелет тела живёт в `references/agents-template.md` (относительно этого скилла). Прочти его: это набор `##`-секций, которые обязан иметь готовый `AGENTS.md`, со слотами `<…>` и немногими заметками `<!-- … -->`. Заполни слоты, выброси неприменимые опциональные строки/секции, вычисти каждую заметку, не оставь ни одной угловой скобки. Скелет — *что произвести*; этот файл — *как*.1314**Контракт: `10`.** Шаг 7 штампует это число в каждый записанный `AGENTS.md`. Увеличивай на единицу только когда перемена здесь или в скелете делает уже сгенерированный файл *неверным* — секция добавлена, переименована или изъята, ритуал изменён, имя тула выпало; никогда — ради формулировок. Репо с меньшим штампом получает предложение полной дуги — запуск по слову человека или комнаты, на вахте без окна сам, спросив коллег (правило держит шаг «Выравнивание» двери `iskron`), — и ты называешь контракт, из которого пришёл его конфиг.1516**То же число стоит первым словом в `description` — и это не дубль, а несущая копия.** Скилл-тело агент читает только после загрузки, а загружается скилл по описанию: номер, живущий лишь здесь, не может сработать триггером никогда — сравнить его не с чем, пока не позовут руками. В контексте всякой сессии сходятся ровно две вещи — список скиллов с их описаниями и `AGENTS.md` со штампом; сравнение возможно только между ними. Потому число дублируется нарочно, а расхождение двух копий ловит `make validate`.1718Это простой счётчик, и он нарочно ни дата, ни версия плагина. Дата не выражает двух перемен в один день — второй нечем объявить себя. Версия релиза движется на каждом релизе, включая не трогающие ни одного скилла здесь, — штамповать её значило бы объявлять каждый конфиг устаревшим после любого релиза, а сигнал устаревания, срабатывающий постоянно, перестают читать. Этот счётчик — собственность шаблона и движется только когда его выход становится неверен. **Конфиг со штампом-датой предшествует этой схеме** — считай его ниже любого числа и предложи полную дугу.1920**Редакция установленной поставки сверяется здесь, и только здесь.** Скилл не несёт на себе своей версии, а установленная копия отстаёт от сопровождаемой на выпуски; протухший текст читается так же авторитетно, как текущий, и его дефекты предстают дефектами метода. Поэтому всякий прогон — полный или рефреш — начинается сверкой того, что бежит, с тем, что выпущено, и тот же ход агент делает, прежде чем назвать инструкцию скилла неверной (туда его шлют **feedback** и **entry**):2122```23cat ~/.claude/plugins/cache/*/*/*/.claude-plugin/plugin.json # что у тебя бежит24gh release view --repo <репозиторий плагина> --json tagName # что существует25node ~/.iskron-bridge/iskron-bridge.mjs --version # какую сборку несёт копия моста26```2728Отстал больше чем на патч — обнови поставку и перезапусти сессии харнеса, чтобы не осталось старых процессов, и только потом прогоняй дугу: конфиг, выведенный из протухшего скилла, наследует его дефекты. Копия моста, отставшая от поставки, — самый частый источник «уже починенных» дефектов. Число контракта этого не заменяет: оно движется только с формой конфига, версия — с каждой отгрузкой.2930Скелет сознательно *инлайнит* граф-агностичную агентскую дисциплину (Рабочие принципы, части «Жизненного цикла сессии») в каждый сгенерированный `AGENTS.md`, чтобы файл стоял сам — для агентов без доступа к графу. Держи её инлайн — не заменяй указателем в граф методологии, хотя содержание там дублируется.3132## Аудит → классификация → действие (не «свежий-или-настроенный»)3334Репозиторий никогда не бывает просто *свежим* или *настроенным* — это спектр, и ловушка звучит так: «файл существует, значит, его факты верны». Не ветвись по наличию `AGENTS.md` / `CLAUDE.md` / `.claude/`. Вместо этого **аудируй каждую заботу против её источника истины и классифицируй**:3536- **absent** — заявки ещё нет → выведи из источника (или, для авторского слота без проверяемого источника, спроси пользователя).37- **stale** — заявка есть, но расходится с источником → ре-спроецируй из источника, перезаписав устаревший текст. Не тащи вперёд только потому, что было записано.38- **correct** — заявка совпадает с источником → оставь.3940Прогоняй по-заботно по карте источников ниже. «Свежий репо» — просто *всё absent*; зрелый — смесь, и опаснее всего *почти-верный*: немногие устаревшие строки прячутся среди доверенных (потому проверочный проход — по всему артефакту, Шаг 7). Авторские слоты без проверяемого источника: *absent* → спроси пользователя; никогда не выдумывай.4142### Источник истины по заботам43У каждого класса заявок один авторитет. Проверяй там — не вспоминай:4445| Забота | Источник истины | Как проверить |46|---|---|---|47| Версии, зависимости | `package.json` / `pyproject.toml` / `go.mod` / `Cargo.toml` + lockfile | прочитать |48| Команды build/test/lint/dev | scripts в `package.json`, `Makefile`/`Justfile`, CI-workflow | прочитать; `--help`/dry-run, где дёшево |49| Гейт качества (строгость, max-warnings) | конфиг линтера, `tsconfig`, CI-yaml | прочитать |50| Структура проекта, path-алиасы | файловая система + `tsconfig`/конфиг бандлера | glob / list |51| Nature, production statement, послабления | пользователь (авторское) | подтвердить в разговоре |52| Носители Reality + как их наблюдать | пользователь (авторское) | подтвердить в разговоре — никогда не выводить |53| Проектные решения, why-клаузы, открытые вопросы | Граф | `iskron_orient` / `iskron_search` |54| Состояние веток, что в полёте | git + форжа (открытый PR) | `git status` / `log`; CLI форжи |55| Готчи | авторское (прошлая боль) | только sanity-check — не автовыводить |5657Два рода строк, обрабатываемых по-разному: **производные факты** (верхние строки) ре-проецируются из источника каждый прогон — устаревшие никогда не сохраняются; **авторское суждение** (нижние — готчи, why-клаузы, nature) больше нигде не живёт — сохраняй его, лишь сверяя на здравость с кодом.5859## Контракт выхода — плотность и точность6061`AGENTS.md` читается *каждую сессию*, поэтому он обязан быть и **плотным**, и **истинным** — на равных, не форма-прежде. Точность операционализирована выше (аудит/классификация против карты источников) и ниже (проверочный проход, Шаг 7). Половина плотности — пять правил:621. **Императив, адресованный агенту.** «Ориентируйся до кода», не «агенту следует ориентироваться».632. **Правило плотности.** Каждая строка должна менять то, что агент *делает*. Если удаление строки не изменит поведения — удали её. Читается как чек-лист, не эссе: без мотивации, афоризмов и кругов почёта.643. **Без проектных обоснований, без дублирования графа.** *Почему* решения живёт в графе (вимарши) — линкуй, не пересказывай. `AGENTS.md` — reference-артефакт (шабда); нарратив в нём заводит второй источник истины, который дрейфует от графа и вводит будущих агентов в заблуждение. Краткая клауза `(why: …)` — *только* для инварианта, который будущий агент иначе нарушит: код-готча или неочевидное ограничение, никогда — проектное оправдание.654. **Таблицы и буллеты вместо абзацев.** Одна директива на буллет.665. **Целевой длины нет** — но секция, растёкшаяся в абзацы, почти всегда несёт обоснование, которому место в графе. Перенеси туда.6768**Вне объёма — механика оркестрации.** `AGENTS.md` обращён к одному агенту в одной сессии. Цепочки гейтов сборки, суб-агентная проверка пушей, model-routing, многополосная координация сюда не идут — их инлайн ломает правило плотности для одиночного читателя. Дом: выделенный скилл оркестрации/планировщика или граф методологии — кроме среза суб-агентного делегирования, который этот скилл проецирует ролевыми файлами (Шаг 6, `references/delegation.md`), никогда прозой AGENTS.md. Линкуй при нужде, не инлайнь.6970Рабочий пример — одна и та же запись `## Code conventions`, плохо (нарратив) и хорошо (AI-first):71- ❌ «Мы стараемся аккуратно обращаться с состоянием, потому что это демо и стор — единственное место, где живут данные, поэтому важно, чтобы компоненты правильно читали его при смене персоны, иначе демо может выглядеть сломанным.»72- ✅ «Persona-scoped UI читает роль через `use-acting-context`; перепроверь рендер при смене персоны. (why: стор — единственный источник данных, устаревшее чтение показывает данные чужой роли.)»7374Хорошая версия — директива + одна клауза-инвариант. Плохая — три предложения обоснования, которым место в вимарше.7576## Процедура7778Идемпотентна насквозь: в зрелом репо прогоняй каждый self-check и действуй только по провалам; докладывай, что осталось.7980## Два такта8182**Такт 1 «встать» — без единого вопроса, до минуты, в любом репозитории.** Это первый и по умолчанию единственный такт при первом контакте, по слову «iskronify» — от человека в чате или из комнаты. Ничего не спрашивай; всё, что не выводится, ложится дыркой.831. **Адреса.** Граф и роль — из слова человека, строки приглашения или существующего `AGENTS.md`. Графа нет и он не назван → единственный вопрос такта 1: имя графа (`iskron_realm(action="list")` показывает доступные; создание — `iskron_realm(action="create")` по слову человека), без него пункты 2–5 не стоят. Роль владельца — 主-роль человека твоих ключей в этом графе (`iskron_me(action="kartas")`); перечень, в котором стоишь ты сам, — знак сбитой привязки: владельца из него не выводи, слот остаётся дыркой на узле согласования; ролей у человека здесь нет вовсе — заведи svatantra-роль владельца (Шаг 2).842. **Контур репозитория.** `origin` → `хост/организация/репо` → `iskron_search(q="", node_type="holon", attrs_filter="repository:<значение>")`. Есть — он; нет — `iskron_add_holon` (граница проекта, `contains` от корня графа или от контура, под которым живут репозитории этого графа) с `attrs.repository`. Один репозиторий — один контур.853. **Роль на репо.** `iskron_search(q="", node_type="karta", steward_of=<контур>)`. Есть — она; нет — `iskron_add_karta` (`manifested_as=adhikarin`, мотивация — дистиллят того, что репо шипит) и ребро `steward` к контуру. Одна роль на репозиторий по умолчанию: инбоксы не сливаются.864. **Обложка.** Скелет `AGENTS.md` по `references/agents-template.md`: обложка — таблица слотов. Выводимые слоты (граф, контур, роли, репозиторий, стек по файлам, команда гейта по `package.json`/`Makefile`/аналогу, структура) заполняются с источником «выведено»; авторские (nature, цена поломки, потребители, Reality, память, фидбэк, interop) — `<не согласовано — #N>`, где `#N` — узел согласования из п. 5. Ритуалы «Жизненного цикла сессии» инлайнятся из шаблона как есть.875. **Узел согласования.** Вимарша `genre=hint` «Согласование iskronify для <репо>» на контуре, гроссбухом: строка на слот — `[слот] [вопрос словами человека] = открыто`; `posed_to` — роль владельца, а когда её слот — дырка (п.1), ребра-инбокса не ставь: адресат узла — кадр в комнату или в мост человека, и `posed_to` встанет, когда роль заведут. Затем кадр туда, где на тебя смотрят, — комната или мост человека: «есть вопросы по проекту, за который я отвечаю, — ответьте или скажите, кто может ответить». Не портянка человеку: агенты рядом обычно знают, прод ли это, кто потребитель и чем верифицировать.886. **Хук старта и сторож памяти** — из Шага 4 только `SessionStart` с адресами и memory-guard `PreToolUse`; стаб `MEMORY.md` из Шага 5 — **только над пустой или отсутствующей директорией памяти**. Непустая — не трогай ничего: эвакуация (Шаг 5) ждёт ответа о кросс-проектной памяти, и это строка узла согласования, а строка скелета о заморозке в этом случае пишется как `<не согласовано — #N>`; строка скелета обязана быть истинной с первого такта, не обещанием. Остальные хуки — такт 2. Указатель `CLAUDE.md` — Шаг 7.897. **Стояние** — не здесь: его занимает старт двери `iskron`, и только на вахту.90Отчёт — гроссбух такта в комнату или человеку: что заведено, что выведено, что открыто; затем эстафета Шага 7 — тизер роадмапа.9192**Такт 2 «доделать» — лениво, не блокируя.** Каждый старт сессии в этом репо (раздел «Старт» двери `iskron`, шаг «Выравнивание») читает узел согласования: строка получила ответ — слот обложки вписывается с источником «согласовано: кто» без переспроса; ответа нет — одна строка человеку и работа идёт. Ответы агентов (по кадрам и на узле) записываются с честной эпистемикой — `anumita`, не `pratyakshita`, — и человеку предлагается **верифицировать выведенное понимание**, а не ответить на список. Полная дуга — Шаги 1, 3, 4, 6 с интервью, строгим гейтом, всеми хуками и ролевыми суб-агентами — идёт, когда человек рядом и сказал «iskronify», либо когда узел согласования закрыл авторские слоты: тогда `AGENTS.md` перепроецируется той же обложкой. Ничего из такта 2 не мешает такту 1 и работе после него.9394**Отложенная авторская секция объявляется, не роняется** — особенно *Reality*: на неё указывают другие секции. Оставь заголовок и одну настоящую строку под ним — «Ещё не устоялось: прогони интервью (скажи iskronify), прежде чем принимать здесь любую поведенческую заявку.» — не слот, так что проверка «без угловых скобок» проходит. Отсутствующая секция читается как «проверять нечего» — противоположность правде — и оставляет указатели из «Жизненного цикла сессии» и Рабочего принципа 6 нацеленными в пустоту.9596### Шаг 1 — Согласуй (такт 2)97В такте 1 ничего из этого не спрашивается: слоты стоят дырками на узле согласования, и вопросы уходят сперва агентам по каналам, потом человеку на верификацию. Не выбирай дефолты молча. Подтверди в разговоре и запиши в обложку: **Nature** (и, если не `production`, какие принципы ослаблены и почему), **имя графа** (создай, если нет), «Стек», **гейт качества** (предложи строжайший — Шаг 3). Для существующего репо сначала выведи из репо и старого конфига, подтверждай только двусмысленное.9899Также согласуй, **кто владеет направлением**: владелец графа как svatantra-роль (主) — создаётся в Шаге 2, если её нет. Вопросы вне мандата будут ставиться ей граф-вимаршами (`posed_to`), не только чатом.100101Также согласуй **общее изменяемое состояние build/test**: читает или мутирует ли сборка/тест общий ресурс — базу, фиксированный порт, dev-сервер, глобальный кэш, облачную песочницу? Если да — зафиксируй по-полосную изоляцию (per-branch БД/схема, per-lane порт, per-lane temp) как готчу: агенты гоняют ветки конкурентно в отдельных worktree, и общий ресурс портится поперёк полос. Пропусти, если общего изменяемого состояния нет.102103Также согласуй **реальность** — против чего здесь проверяется заявка; заполняет таблицу *Reality*. Кодовый репо, репо данных и инфраструктурный отвечают на это по-разному, поэтому ничего не выводи — спрашивай: куда приземляется изменение, какие эффекты производит, какие из них наблюдаемы и какой именно командой / URL / запросом, что агент достаёт сам, а что требует пользователя. Дожимай до *канонического носителя* каждого класса заявок — собранный артефакт, не исходники; живой эндпоинт, не хендлер; чистая установка, не тёплый кэш. Класс без достижимого наблюдения идёт в *Ceiling* со своей причиной, никогда — аспирационной строкой. (Как таблица работает при закрытиях — дисциплина «Сверка реальностью» скилла vahta.)104105Также согласуй **кросс-проектную память** — спроси один раз на *пользователя*, не на репо (ответ прошлой прокачки переиспользуем): хочет ли пользователь, чтобы переживающее любой отдельный репозиторий сохранялось — личный граф `@<handle>/mind` для фактов о нём и глобально инжектируемый файл предпочтений («как со мной действовать»: `~/.claude/CLAUDE.md`, `~/.config/opencode/AGENTS.md`) для стоячих инструкций? **Да** → заведи слой: бутстрап графа (**minding** §3) и файл предпочтений (создай, если нет; один источник, слинкованный между харнессами, которые пользователь гоняет); сгенерированная маршрутизация сохраняет ветки личного графа, а сообщение memory-guard — маршрут minding. **Нет** → маршрутизация репо-скоупна: факты проекта — в этот репо и его граф, остальное остаётся сессионно-локальным; ветки личного графа, пункт о предпочтениях и маршрут minding в сообщении гарда опускаются. Никогда не предполагай, что слой существует, потому что у харнесса есть под него слот.106107Тем же ходом согласуй **фидбэк-рефлексию** — тоже один раз на *пользователя*: не против ли он, чтобы агент в конце сессии, после мержа или завершения задачи рефлексировал опыт *о самом методе* — где скилл, правило или поверхность подвели или удивили — и записывал стоящее в граф работы — на контур инструмента, адресно его стюарду, — после проверки на дубли и только случаем, не мнением? **Да** → регион feedback-reflection в скелете остаётся, и push-хук (Шаг 4) несёт напоминание такта. **Нет** → удали регион целиком; опыт остаётся сессионно-локальным. Спрашивается это потому, что рефлексия пишет в граф от имени делателя без прямого задания, — выбор владельца, не агента; и потому такт висит на хуке, а не на памяти: строка «в конце сессии дай фидбэк» — обязанность без собственного знака, файл к концу сессии давно вне контекста.108109Также согласуй **сосуществование с workflow-набором** (только когда обнаружен коэрсивный набор — его скиллы видны в списке, или его директория есть в кэше плагинов, например `~/.claude/plugins/`; сегодня это superpowers): скажи пользователю, что найдено, и согласуй режим:1101. **Полный interop** (рекомендуется) — AGENTS.md получает interop-подсекцию (из `references/superpowers-interop.md` этого скилла) + spec-write-хук (Шаг 4);1112. **Только проза** — подсекция без spec-write-хука;1123. **Пропустить** — без текста сосуществования (не рекомендуется; назови риск: дизайн-сессии, ведомые набором, по умолчанию не осядут в граф).113114115**Человек не обязан быть в треде — и обычно его там нет.** Прогон идёт вахтой, ночью, из комнаты, из чужого харнесса. «Спроси» тогда тихо вырождается в одно из двух — агент **выдумывает** авторский слот или **встаёт** и не делает ничего. Оба хуже пропуска. Порядок — такт 2, и он такой.1161171. **Сделай всё, что от ответа не зависит.** Аудит по источникам, выводимые заботы, гейт, хуки — ничего из этого человека не ждёт. Встать целиком, упершись в один слот, — не осторожность, а простой.1182. **Подними вопрос узлом согласования, а не в пустоту.** Один hint-узел на контуре репозитория, гроссбухом по слотам, `posed_to` роли владельца — **один узел на всё согласование, не по узлу на слот**: человек отвечает разом; веер из шести вимарш он читает как шесть требований. Сперва спроси агентов: кадр в комнату или стюардам соседних контуров — «есть вопросы по проекту, за который я отвечаю, ответьте или скажите, кто может»; их ответы ложатся строками с `anumita`.1193. **Разбуди по каналу, выбрав строку с доски.** `iskron_channel(action="list")` → стояние-мост твоего человека: чат-бот, телефон, что его ретранслирует. **Роль — не адрес:** одну роль часто держат мосты к разным людям, и имя стояния у них совпадает буквально; различает строку `@handle`, сверенный с хендлом твоего человека, — никогда не имя. Моста нет вовсе — адресуй роль выше: стюарда родительского контура или бригадира. Вопрос к начальнику законен ровно тем, что твой человек недостижим, и так и скажи в теле.1204. **Пиши обложку с дыркой, а не с догадкой.** Несогласованный слот остаётся `<не согласовано — #N>` и называет узел согласования. Дырку видит всякая следующая сессия и всякий линт; догадку — никто. Так пропуск самозаживает: старт двери читает узел, находит ответ и вписывает слот, **не переспрашивая человека второй раз**; человеку остаётся верифицировать выведенное.121122**И один слот не задерживает остальные.** Согласование — не транзакция: отвеченное записывается сразу, ждёт только неотвеченное. Прогон, отложенный целиком до ответа на один вопрос, отдаёт человеку репозиторий ровно в том виде, в каком взял.123124### Шаг 2 — бутстрап графа125- Граф существует? Нет: согласуй имя, затем `iskron_realm(action="create")`.126- Если у проекта есть структура сверх самого графа — существует фокус-контур (названный по границе проекта, `contains` от корня графа), и его `#seq` идёт в обложку. Границу проектируй скиллом `design`, создавай `iskron_add_holon`. **Контур несёт свой репозиторий стандартным атрибутом `repository`** — `хост/организация/репо` из `git remote get-url origin`, без протокола и `.git` (например `github.com/iskron-ai/skills`); по нему работает фильтр `attrs_filter="repository:…"`, а старт двери `iskron` сверяет его с origin при каждом входе. Ставь при заведении и на рефреше, если его нет; один контур — один репозиторий.127- **Делатель становится стюардом.** Создай роль агента репозитория (`iskron_add_karta`, `manifested_as=adhikarin`, мотивация — дистиллят Production statement) и проведи её `steward` к фокус-контуру: adhikarin без steward-ребра — живое предупреждение («действует, но ни за что не отвечает»). Создай svatantra-роль владельца, если Шаг 1 её не нашёл. Запиши оба seq в обложку — слот в доке есть единственный путь, на который агент может опереться.128- **Холон + стюард — корень поля интеграции.** Этого достаточно, чтобы всякая будущая работа вывела потребителей и эффекты из графа: обход держит `integrity` своим режимом поля интеграции — не пересказывай его здесь, он дрейфует молча. Не спрашивай человека об «общих поверхностях» и не пиши их список в AGENTS.md: такая проза устаревает в ходе самой работы. Не найденная обходом зависимость — дефект модели: допроектируй крии и феномены (`design`), непрошитые связи дотки (`weaving`).129130### Шаг 3 — Гейт качества (предложи строжайший, пользователь подтверждает)131По каждому пункту: предложи строжайший разумный для стека вариант, трейд-офф одной строкой, дождись подтверждения. Дефолт строгий; послабления — только по явной просьбе, откалиброванной ценой поломки из обложки, и записываются там по-инструментно.132133**Ужесточение существующего гейта не бесплатно.** На зрелом репо с уже ослабленным гейтом `max-warnings 0` — не галочка, а обязательство рефакторинга. Прежде чем предлагать ужесточение — *измерь*: прогони линтер/тайпчекер на предлагаемой строгости, посчитай провалы, покажи цену. Ужесточению уже-ослабленного нужна та же явная просьба, что послаблению, — и, возможно, отдельная ветка, не бутстрап.134- **Линтер**, максимально строгий (`@typescript-eslint/strict`; Ruff `E,F,B,I,N,UP,RUF`; `golangci-lint` широкий; `clippy -- -D clippy::pedantic`).135- **Форматтер**, auto-fix on save + pre-commit (Prettier, `ruff format`, `gofumpt`, `rustfmt`).136- **Тайпчекер**, strict, если в стеке есть (`tsc --strict`, `mypy --strict` / `pyright --strict`).137- **Pre-commit-хук**: линтер + форматтер + тайпчек по staged-файлам.138- **Тест-фреймворк + дисциплина** (unit для библиотек; +integration для сервисов; +e2e для UI; порог покрытия для production). Записать в «Конвенции кода».139- **CI**: lint + typecheck + tests на каждый пуш, падает на предупреждениях. Обязателен для `production`.140- **Гейт обязан быть ВЫЗЫВАЕМЫМ, а не перечисленным.** Заведи в проекте один вызов, чья цепочка и есть записанное правило (`npm run gate`, `make check`, `just check` — по стеку), и в `AGENTS.md` называй ЕГО ИМЕНЕМ, а не списком шагов. Собранный вручную гейт молча теряет шаг и всё равно кончается зелёным выводом: проверяемого признака у пересказа нет. Перечисление исполняется пересказом, а пересказ теряет элементы молча: «прогнал гейт» и «прогнал семь восьмых гейта» кончаются одинаково зелёным выводом, и проверяемого признака у исполнения нет. Один вызов делает «гейт зелёный» наблюдением, а не заявкой о собственной аккуратности, и расхождение с CI становится невозможным по построению — обе стороны зовут одно и то же. CI обязан звать тот же вызов, а не повторять шаги своим списком. Цепочка вынужденно собирается руками — запиши почему и чем тогда проверяется её полнота.141- **CI-паритет**: всякая проверка, способная *упасть*, должна гейтить PR, а не только post-merge. Проаудируй workflow на джобы, скоупленные push-`main`/release (кодоген, генерация схем/API-спек/доков, сборка образа или бандла, проверка миграций) — проверка только-после-мержа позволяет двум по отдельности зелёным PR сломать `main` после мержа. Дотяни до прогона и на PR; неустранимый сейчас зазор запиши готчей.142143Команды — в «Команды», дисциплину — в «Конвенции кода».144145### Шаг 4 — Хуки146**Деливерабл — ритуалы, не файл.** Определи, какими харнессами репо пользуется, и прошей поверхность *каждого* — hooks-файл Claude Code, `[hooks]` в `config.toml` Codex, plugin-директорию OpenCode — по `references/harness-surfaces.md`, где лежат проверенные пути, имена событий и пер-ритуальный маппинг. Харнессов может быть несколько — прошей каждый. Где у харнесса нет поверхности для ритуала — скажи, какой не удалось автоматизировать: он всё равно связывает через прозу «Жизненный цикл сессии» в AGENTS.md, которую скелет инлайнит ровно поэтому. Никогда не пиши конфиг формата, о котором гадаешь.147148Остальное в этом шаге — форма Claude Code. Хуки в `.claude/settings.json` (коммитится — ритуалы всего проекта, нужны каждому агенту на каждом клоне) — безусловные из списка ниже, плюс условный spec-write — **только когда согласование Шага 1 выбрало полный interop** (согласованный режим записан в interop-штампе AGENTS.md, Шаг 7; нет подсекции = не согласовано = без spec-write). **Мержи, никогда не перезаписывай:** в файле могут жить записи других наборов — добавляй свои рядом в тех же массивах; удаление чужих хуков ломает чужие ритуалы. JSON генерируй под *этот* проект — пиши сам:149- **`SessionStart`** → напоминание прочитать раздел «Старт» скилла-двери `iskron` до действий, с адресами *этого* репо: граф, фокус-контур, seq роли агента и роли владельца — и одной фразой, что стояние занимается только на вахту (слово «вахта», `start`, строка приглашения, кадр), одним вызовом `iskron_stand`. Протокол старта живёт в самом скилле, хук его не пересказывает: пересказ в хуке дрейфовал бы от скилла отдельно, а поднимать контракт на каждую правку старта — волна по всем репо.150- **`PostToolUse`** с `"matcher": "Bash"` → когда команда содержит `git push`: напоминание **спросить, какой это был пуш** — где done значит merged, пуш, лишь открывший или обновивший PR, не отгрузил ничего: запиши ответ там, где он действительно стоит, и оставь тела и модусы описывающими то, что несёт транк (модель, записанная прежде мержа, описывает то, чего в репо нет, а отозванный PR оставляет её лгать). После *мержа* — обновить граф только от свежего свидетельства артефакта (сверить с реальностью + продвинуть карту превращений, и завершить то, что мерж разрешил, по осям — `addressed_by` записывает ответ, отпускание — отдельный акт), **промести отгруженный контур** (переключить модусы каждого спроектированного узла, который пуш реализовал, — весь контур, не только тронутые, — и завершить дизайн-вимарши, которые отгрузка разрешила), **отработать инбокс** (`posed_to`-вопросы, на которые работа ответила), прогнать самопроверку после зелёного пуша, **а на открытом PR или завершённом крупном этапе — открыть холодное ревью суб-агентом** (дифф ветки против транка + репозиторий + референсы на все узлы графа, входящие в дифф; `integrity` выводит от них поле интеграции и состояние соседей; reviewer возвращает затронутые контуры и steward-роли, открытые вимарши, готовность интеграции и кого нужно разбудить; не дошёл trace — чинить граф ткачеством, а не дописывать бриф), **перечитать дифф и узлы на заимствованные проектно-менеджерские слова** — ticket, backlog, sprint, epic, story, done, blocker, committed — называя каждое пользователю и спрашивая, как это зовётся в проекте, а не подменяя самому; и: невпущенные design/spec-доки на этой ветке → впустить (`intake`, затем `design`) до закрытия; при согласованной фидбэк-рефлексии — её такт по региону feedback-reflection (дедуп в общем фидбэк-графе; пустая рефлексия — валидный исход). Словарная перечитка едет *на этом хуке* нарочно: она — механизм запрета прозы, а запрет, живущий только в AGENTS.md, агент и проскальзывает.151- **`PreToolUse`** с `"matcher": "Write|Edit|MultiEdit"` → **memory-guard**: когда целевой путь внутри локальной директории проектной памяти — **блокируй запись** (exit 2, маршрутизирующее сообщение в stderr) — состояние живёт в репо, графе или личном графе пользователя, никогда в локальной памяти агента, и запрет — по директории, а не по категории; директория остаётся замороженной на стабе-запрете (Шаг 5). Блокировать здесь безопасно: путь однозначен, легитимных записей туда ноль by policy. Хук срабатывает в момент, когда включается инстинкт «сохранить», а AGENTS.md уже далеко в контексте. Точный JSON ниже.152- **`Stop`** → **хук незастывания** (для репо, где несут агентские вахты): ход, кончившийся планом без перемены, — застывание, и агент технически мёртв до следующего пробуждения. Команда хука разбирает хвост transcript: финальный текст ассистента матчится на маркеры застывания («начну с», «приступлю к», «если ты не против», "I'll start with", "shall I") *и* в ходе не было ни одного пишущего вызова (Write/Edit/MCP-записи) → **блокируй завершение** (decision block, причина в ответе): «Начало не объявляется — совершается: сделай первый ход выбранного, либо запиши вопрос адресату (вимарша + кадр) и скажи, что записал.» Уважай `stop_hook_active`: повторный стоп после блока пропускается — хук будит один раз и не зацикливает. Эвристика текстовая, ложный позитив безвреден: агент делает ход или честно переформулирует финал.153- **`PreToolUse`** с матчером на пишущие тулы графа (`mcp__.*iskron_(add_.*|batch)`) → **указатель момента writing**: неблокирующее эхо конверта с одной строкой — пять решений скилла, hint как указатель, CHECKS как работа. Скилл загружается в один момент, а пишется в другой; строка стоит ровно там, где агент составляет вызов. Тот же указатель мост приписывает к описаниям этих тулов, а дверь `iskron` держит карту моментов — три места, одна строка, дословно. Точный JSON ниже.154- **`PostToolUse`** с `"matcher": "Write|Edit"` → **spec-write-хук** (только полный interop): когда путь записанного файла похож на design/spec-док — напоминание, что файл есть черновой вид, а запись дизайна — граф. Тот же стиль конверта, гейт по `.tool_input.file_path`, как push-хук гейтится по тексту команды; точный JSON ниже.155156Каждый хук запускает shell-`command`, эхающий конверт хука в stdout. Вложенность (`event → массив → {"hooks":[{"type":"command","command":…}]}`) — то, что легко перепутать:157```json158{ "hooks": { "SessionStart": [ { "hooks": [ { "type": "command",159 "command": "echo '{\"hookSpecificOutput\":{\"hookEventName\":\"SessionStart\",\"additionalContext\":\"<start reminder: read the iskron door's Start section first; realm, focus holon, agent karta, owner karta; standing only on watch, via iskron_stand>\"}}'" } ] } ] } }160```161Запись `PostToolUse` добавляет `"matcher": "Bash"` и гейтит эхо по команде: `jq -r '.tool_input.command // ""' | grep -q 'git push' && echo '<envelope>' || true`.162Это матчит *текст* команды, так что сработает и на командах, лишь *упоминающих* `git push` (echo, heredoc PR-тела, валидация самого этого хука) — известный ложный позитив. Для неблокирующего напоминания безвреден — шипь как есть; только никогда не повышай этот текст-матч до чего-либо, что гейтит работу. Чтобы срезать шум — ветвись ещё и по `.tool_response`, чтобы напоминание срабатывало только на реально прошедший пуш.163**Свежесть ветки — механическая проверка, не память.** Предложи pre-push git-хук (или добавь в тот же PostToolUse-гейт): ветка не потомок `origin/main` → сказать в момент пуша — `git fetch -q origin main && git merge-base --is-ancestor origin/main HEAD || echo 'ветка отстала от main — перебазируй до пуша'`. Обнаруживать отставание конфликтом через несколько слияний — провал формы, не делателя: причина и следствие разнесены так, что изнутри их не связать. По той же причине пост-мерж-последовательность вешается на **событие** мержа (напоминание выше), никогда на условие-затишье вроде «когда ничего не в работе» — у занятого делателя оно не наступает никогда.164165Memory-guard — в отличие от напоминаний он **блокирует**: `PreToolUse`-команда с exit 2 останавливает вызов тула и отдаёт Claude сообщение из stderr. Путь однозначен (`.claude/projects/<encoded>/memory/`), ложных позитивов почти ноль. Последний маршрут сообщения следует ответу Шага 1 о кросс-проектной памяти — при «нет» выброси фразу о личном графе:166```json167{ "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command",168 "command": "jq -r '.tool_input.file_path // \"\"' | grep -Eq '\\.claude/projects/.*/memory/' && { echo 'BLOCKED: local agent memory is forbidden entirely, not by category (AGENTS.md, Persistence rules). Route the fact: repo conventions / code facts → AGENTS.md; project state, this repo'''s servers and dated duties → the project realm; a user-scoped fact no project owns → the personal realm @<handle>/mind (minding skill) — drop this route under cross-project-memory=no. This dir stays frozen at its prohibition stub.' >&2; exit 2; } || exit 0" } ] }169```170Эта запись идёт под `"PreToolUse"` — собственный массив события, не массив `PostToolUse`.171172Указатель момента writing — второй объект в том же массиве `PreToolUse`, с матчером по имени тула (имя MCP-тула в Claude Code — `mcp__<сервер>__iskron_batch`, поэтому матч по хвосту):173```json174{ "matcher": "mcp__.*iskron_(add_.*|batch)", "hooks": [ { "type": "command",175 "command": "jq -r '.tool_name // \"\"' | grep -Eq 'iskron_(add_[a-z_]+|batch)$' && echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"additionalContext\":\"Момент скилла writing: перед вызовом по каждому узлу назови читателя, что изменит извлечение и что здесь ново; тип и given_as, три модуса как утверждения, имя-тезис, стрелки со смыслом; hint — гроссбух превращения: исходы с вердиктами и что дальше, не пересказ карты; строки CHECKS в ответе — работа этого такта.\"}}' || true" } ] }176```177Spec-write-хук (только полный interop), тот же стиль гейта — широкий поведенческий glob; ложные позитивы безвредны для неблокирующего напоминания, никогда не повышай его до гейта работы:178```json179{ "matcher": "Write|Edit", "hooks": [ { "type": "command",180 "command": "jq -r '.tool_input.file_path // \"\"' | grep -qE '(^|/)specs/[^/]+\\.md$|(^|/)docs/.*design[^/]*\\.md$' && echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PostToolUse\",\"additionalContext\":\"A design draft was written; per AGENTS.md this file is a draft view — the graph is the design record. Intake it (intake skill, then design skill) in this session — do not defer to a push.\"}}' || true" } ] }181```182Spec-write-запись мержится в тот же массив `PostToolUse`, что и git-push-хук — соседние объекты, не замены; memory-guard живёт в собственном массиве `PreToolUse`.183184Self-check: все три базовых хука на месте, и spec-write присутствует **тогда и только тогда**, когда interop-штамп AGENTS.md говорит `full` (нет штампа или `prose-only` → его НЕ должно быть — не до-добавляй на рефреше); `SessionStart` зовёт раздел «Старт» двери `iskron` (не `entry`) и называет реальный слаг графа, фокус-контур и seq роли агента, не плейсхолдеры; ни одна чужая хук-запись не выпала при мерже.185186Внимание: запись `.claude/settings.json` харнесс может пометить как само-модификацию и потребовать явного одобрения — вынеси запись на подтверждение, а не считай, что она легла молча.187188### Шаг 5 — Гигиена репозитория189- Закоммить `.claude/settings.json`; заигнорь `.claude/settings.local.json` в `.gitignore`. Если `.claude/` игнорится широко — добавь явный un-ignore: `!.claude/settings.json`. Проверь `git check-ignore -v .claude/settings.json .claude/settings.local.json`.190- **Трекаемые secret/env-файлы**: прогони `git ls-files '.env*' '*secret*' '*local*'`. Если трекается реальный env/secret (не `.example`) — предупреди в «Конвенции кода»: никогда не стейджить локальные правки — `git update-index --skip-worktree <file>`, никогда `git add -A` / `commit -a` (агент, правящий трекаемый env, иначе сливает его в PR).191- Локальная директория проектной памяти (`~/.claude/projects/<encoded-path>/memory/`): проаудируй, **эвакуируй, затем заморозь**. Там не остаётся ничего — запрет по директории, не по категории. Проектное состояние (решения, ограничения, готчи) → AGENTS.md / граф, состояние ветки → git и тело PR; серверы и датированные долги этого проекта → его граф; собственные владения пользователя (личные машины, сроки, люди, кросс-проектные находки) → его личный граф (**minding**) — но только при ответе Шага 1 «да» на кросс-проектную память; при «нет» они остаются в AGENTS.md репо, если этот репо обязан их держать, иначе выбрасываются с ведома пользователя. Предпочтения стиля работы — инструкции, не факты: → глобально инжектируемый файл инструкций (его заводит minding §3), никогда не узел. Затем заморозь: `MEMORY.md` становится однострочным стабом-запретом («состояние живёт в репо или графе — см. AGENTS.md, Persistence rules»), а memory-guard (Шаг 4) блокирует дальнейшие записи в момент срабатывания инстинкта. **Эвакуируй прежде, чем заморозить** — стаб поверх непрочитанного уничтожает то, что должен был переселить. Причина: воспроизводимость + мультимашинная, мультиагентная работа — локальная память невидима любому другому агенту и машине.192- **Форжа и её CLI — выведи, никогда не предполагай GitHub.** Прочти `git remote -v`; хост решает инструмент (`gh` GitHub, `fj` Forgejo/Codeberg, `glab` GitLab, `tea` Gitea). Проверь, что он установлен и аутентифицирован, и назови его в «Git workflow» вместе с командой наблюдения. Это не косметика: открыть PR — единственный шаг передачи, которым агент владеет целиком, и агент, не знающий инструмента, превращает его обратно в вопрос пользователю. Неопознанный self-hosted хост → спроси, каким CLI пользуются; никогда не угадывай `gh` потому, что знаешь его.193- «Стек», «Команды», «Структура проекта», «Конвенции кода» несут реальное содержимое пропорционально зрелости. Пусто в первый день — нормально; `TBD` — нет.194- **`HANDOVER.md` не заводится**, и AGENTS.md несёт раздел, объясняющий его отсутствие — без раздела следующая сессия заведёт файл заново, по привычке и не найдя запрета. Состояние ветки живёт в `git branch`/`log`, теле открытого PR и гроссбухе в семени `genre=hint` превращения, из которого тело PR собирается; из четырёх домов одних и тех же фактов рукописный — единственный, который врёт молча. Файл уже есть — эвакуируй содержимое по этим домам и удали его.195- `README.md` короткий, человеко-обращённый, AGENTS.md не дублирует.196197### Шаг 6 — Ролевые суб-агенты делегирования198Проецируй доктрину делегирования **именованными ролевыми агентами**, не прозой AGENTS.md (механика оркестрации — вне AGENTS.md, контракт выхода выше). Доктрина + шаблоны файлов: `references/delegation.md` (относительно этого скилла).199- Всегда: `.claude/agents/reader.md` (дешёвый тир, разведка), `.claude/agents/worker.md` (средний тир, исполнение брифа) и `.claude/agents/verifier.md` (верхний тир, холодная приёмка), алиасы моделей `haiku`/`sonnet`/`opus`. Verifier проецируется даже там, где у репо ещё нет рантайма — именно он делает таблицу *Reality* действенной, и репо, обретший носитель позже, не должен требовать пере-прогона ради своего приёмщика.200- Когда репо показывает использование OpenCode (`opencode.json` / `.opencode/`, или пользователь говорит): `.opencode/agents/reader.md`, `worker.md`, `verifier.md` и `reviewer.md`, `mode: subagent`, модель **пришпилена** в каждом файле — незапиненный суб201202…(truncated)