From 0eab075f84a19745ee50731c40bb275e6b869b7a Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Mon, 3 Aug 2026 14:38:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D1=87=D0=B8=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BD=D0=B0=D1=85=D0=BE=D0=B4=D0=BA=D0=B8=20=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C?= =?UTF-8?q?=D1=8E:=20=D1=86=D0=B8=D0=BA=D0=BB=20=D0=B7=D0=B0=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8?= =?UTF-8?q?=20=D0=B8=20=D1=82=D1=80=D0=B8=20=D0=BE=D1=82=D1=81=D1=83=D1=82?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0=D0=B2=D1=88=D0=B8=D1=85=20?= =?UTF-8?q?=D1=81=D0=BB=D0=BE=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - task-pipeline и task-batch запрещали шаг, который сами же добавили: раздел границ и финальный доклад переписаны под снятую границу приёмки - «триаж сводит строки в одну» противоречило «не сливает» — деградация снова поразрядная во всех трёх местах - канон не требовал в CLAUDE.md имени основной ветки, testdata и запретов, а скелета CLAUDE.md не было вовсе — заведён - обратимость жила в двух домах, читатели ходили в пустой; единственный дом теперь CLAUDE.md - заведены слоты «Единые точки проекта» и «Триггеры профиля», куда charter'ы слали, а канон их не создавал - блок «Вопросы к проходам» стал частью задания прохода: за ним ходили двое из девяти - чек-лист синка и правило «замер + настройка» сведены к одному дому; plugin.json больше не про бриф --- av-dev-pipeline/.claude-plugin/plugin.json | 2 +- av-dev-pipeline/agents/review-adversary.md | 8 +- av-dev-pipeline/agents/review-ops.md | 15 ++-- av-dev-pipeline/agents/review-reimpl.md | 4 +- av-dev-pipeline/agents/review-rubric.md | 11 +-- av-dev-pipeline/agents/review-triage.md | 3 +- .../skills/review-pipeline/SKILL.md | 14 +++- .../references/project-facts.md | 4 +- av-dev-pipeline/skills/task-batch/SKILL.md | 12 +-- av-dev-pipeline/skills/task-pipeline/SKILL.md | 31 ++++---- av-dev-pm/skills/canon/references/canon.md | 62 ++++++++++++---- .../skills/canon/references/skeletons.md | 74 ++++++++++++++++++- 12 files changed, 175 insertions(+), 65 deletions(-) diff --git a/av-dev-pipeline/.claude-plugin/plugin.json b/av-dev-pipeline/.claude-plugin/plugin.json index 04b0ad6..7abb1d8 100644 --- a/av-dev-pipeline/.claude-plugin/plugin.json +++ b/av-dev-pipeline/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "av-dev-pipeline", - "description": "Проведение задачи через полный цикл Spec Driven Development и конвейер ревью: детерминированный гейт, сверка со спеками, враждебные постановки, эксплуатационный постмортем, независимая реализация, архитектура и обязательный триаж. Плюс прогон нескольких задач разом. Проектная специфика — инварианты, команда гейта, прецеденты, доменные факты — приходит из файла-брифа проекта, который заводится отдельным скиллом, а не пишется руками.", + "description": "Проведение задачи через полный цикл Spec Driven Development и конвейер ревью с детерминированным гейтом, сверкой со спеками, враждебными постановками, эксплуатационным постмортемом, независимой реализацией и обязательным триажем; плюс прогон нескольких задач разом по одной в изолированном worktree. Требует OpenSpec. Проектную конкретику проходы читают в документах канона плагина av-dev-pm напрямую.", "author": { "name": "Anton Vakhrushev", "email": "anwinged@gmail.com" diff --git a/av-dev-pipeline/agents/review-adversary.md b/av-dev-pipeline/agents/review-adversary.md index fcd1f93..61b301b 100644 --- a/av-dev-pipeline/agents/review-adversary.md +++ b/av-dev-pipeline/agents/review-adversary.md @@ -38,10 +38,10 @@ color: red - **`CLAUDE.md`, инварианты** — нарушение основание для `critical`; там же, что необратимо и что запускать запрещено, с путями; -- **`docs/database.md`** — чем физически лежит запись и какие настройки имеют - числовое значение (таймаут занятости, лимит тела, ретеншен). **Из этого - строятся пути к отказу в обслуживании**, и без них замер сравнить не с чем; -- **`docs/research/`** — измеренные объёмы с провенансом; +- **`docs/database.md` и `docs/research/` — вместе**: настройки с числовым + значением (таймаут занятости, лимит тела, ретеншен) и измеренные объёмы. **Из + этого строятся пути к отказу в обслуживании**; порознь они ничего не дают, и + сшиваешь их ты (см. project-facts, «Сшивать обязаны проходы»); - **`docs/architecture.md`** — окружение и внешние зависимости; - **`docs/review.md`** — журнал: что здесь уже пробивалось и чем воспроизведено; и блок `adversary` в «Вопросах к проходам», если он есть, — эти вопросы diff --git a/av-dev-pipeline/agents/review-ops.md b/av-dev-pipeline/agents/review-ops.md index 99fadfa..d586570 100644 --- a/av-dev-pipeline/agents/review-ops.md +++ b/av-dev-pipeline/agents/review-ops.md @@ -22,16 +22,11 @@ color: yellow характер потока и есть ли у отправителя обратная связь; **что обратимо, а что нет**. `CLAUDE.md` говорит, что запускать запрещено, и что необратимо. -**Два документа читаются вместе, и это твоя обязанность, а не удобство.** -`docs/research/` даёт измеренные числа с провенансом, `docs/database.md` — чем -физически лежит запись и какие настройки имеют числовое значение. Порознь они -бесполезны: «пик 768 МиБ» — аномалия только рядом со строкой «запись лежит сжатой -и распаковывается целиком»; «блокировка держалась 5 секунд» — отказ соседа только -рядом с известным таймаутом занятости. Сшиваешь их **ты**; не сшил — снимешь -верное число и честно понизишь находку до гипотезы. - -Карта «что нужно проходу → где лежит» — -`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`. +**`docs/research/` и `docs/database.md` читаются вместе, и это твоя обязанность, +а не удобство:** число без настройки сравнить не с чем, и находка честно упадёт +до гипотезы. Почему именно так и какие ещё есть стыки — +`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`, раздел +«Сшивать обязаны проходы». Там же карта «что нужно проходу → где лежит». Два обстоятельства почти всегда меняют цену отказов, и если документы их подтверждают — держи перед глазами: diff --git a/av-dev-pipeline/agents/review-reimpl.md b/av-dev-pipeline/agents/review-reimpl.md index 5f2a786..5ac0749 100644 --- a/av-dev-pipeline/agents/review-reimpl.md +++ b/av-dev-pipeline/agents/review-reimpl.md @@ -23,8 +23,8 @@ color: purple - **`CLAUDE.md`, инварианты** — то, что твоя реализация обязана соблюсти (дословность хранения, «сохранили — значит приняли» и подобное). - **`docs/research/` и `docs/database.md` вместе** — измеренные объёмы и - представление данных. Решение, разумное на сотне записей, неразумно на - миллионе; и то и другое читается вместе, порознь они ничего не решают. + представление данных: решение, разумное на сотне записей, неразумно на + миллионе (почему именно вместе — project-facts, «Сшивать обязаны проходы»). - **`docs/conventions/`** — твоя версия должна быть сравнимой по форме. Карта «что нужно проходу → где лежит» — diff --git a/av-dev-pipeline/agents/review-rubric.md b/av-dev-pipeline/agents/review-rubric.md index 7c8d95e..f00d03b 100644 --- a/av-dev-pipeline/agents/review-rubric.md +++ b/av-dev-pipeline/agents/review-rubric.md @@ -28,11 +28,12 @@ color: purple Карта «что нужно проходу → где лежит» — `${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`. -**Этих документов нет** — порождай рубрику по общей практике, но `critical` по -основанию «нарушен инвариант проекта» (в фазе 2) не присваивай и дай строку: -«`docs/review.md` и инвариантов нет: рода узлов и прецеденты неизвестны; -требование «минимум три пункта специфичны для типа узла» выполнено по общей -практике, а не по этому проекту». +**Документа нет — строка на каждый, отдельно.** Нет `docs/review.md`: «рода +узлов и прецеденты неизвестны; требование „минимум три пункта специфичны для +типа узла" выполнено по общей практике, а не по этому проекту». Нет инвариантов +в `CLAUDE.md`: `critical` по основанию «нарушен инвариант проекта» в фазе 2 не +присваивай и скажи об этом. Одной строкой за два документа не отделывайся — +чинятся они разным. ## Порядок фаз обязателен diff --git a/av-dev-pipeline/agents/review-triage.md b/av-dev-pipeline/agents/review-triage.md index 21da7ac..f9f4375 100644 --- a/av-dev-pipeline/agents/review-triage.md +++ b/av-dev-pipeline/agents/review-triage.md @@ -40,7 +40,8 @@ color: green Карта «что нужно проходу → где лежит» — `${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`. -**Деградация поразрядная, и ты — тот, кто сводит её строки в одну.** Свою часть +**Деградация поразрядная, и ты — тот, кто собирает её строки в один список, +сохраняя каждую.** Свою часть тоже называй: нет инвариантов в `CLAUDE.md` — ни одну находку не поднимай до `critical` по этому основанию (сослаться не на что), ранжируй по обратимости, выведенной из кода, и назови это предположением. Нет `docs/review.md` — отсев diff --git a/av-dev-pipeline/skills/review-pipeline/SKILL.md b/av-dev-pipeline/skills/review-pipeline/SKILL.md index 6828fb8..5c64215 100644 --- a/av-dev-pipeline/skills/review-pipeline/SKILL.md +++ b/av-dev-pipeline/skills/review-pipeline/SKILL.md @@ -79,8 +79,13 @@ description: Конвейер ревью изменения — детермин ## Что получает каждый проход -Задание любому проходу состоит из пяти вещей: +Задание любому проходу состоит из шести вещей: +- **его блок вопросов** из «Вопросы к проходам» в `docs/review.md`, если он там + есть, — **дословно**. Блок адресован проходу поимённо и выведен из промаха + этого проекта; заставлять девять charter'ов самим ходить за ним значит + получить, что за ним ходят двое. Проход отвечает на такие вопросы явно, + дополнительно к обязательным; - **контракт находок** — путь к [references/finding-contract.md](references/finding-contract.md) (в установленном плагине — `${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/`); @@ -306,9 +311,10 @@ Recall обоих равен длине их источника — это и е никто другой. Материал берётся из документов: `docs/security.md` — враждебному, -`docs/architecture.md` плюс **`docs/research/` и `docs/database.md` вместе** — -эксплуатационному. Последние два сшивает сам проход: число без настройки не с чем -сравнить. Без этих документов стадия вырождается в общие места. +`docs/architecture.md`, `docs/research/` и `docs/database.md` — +эксплуатационному. Что с чем сшивать и почему — [project-facts.md](references/project-facts.md), +раздел «Сшивать обязаны проходы». Без этих документов стадия вырождается в общие +места. ## Стадия 3 — Independent reimplementation (`deep`, по триггеру) diff --git a/av-dev-pipeline/skills/review-pipeline/references/project-facts.md b/av-dev-pipeline/skills/review-pipeline/references/project-facts.md index ed9aa3a..b7e4c75 100644 --- a/av-dev-pipeline/skills/review-pipeline/references/project-facts.md +++ b/av-dev-pipeline/skills/review-pipeline/references/project-facts.md @@ -50,7 +50,9 @@ ## Деградация — поразрядная Документа нет — деградирует то, что из него читалось, и **только оно**. Каждый -проход пишет свою строку в границы покрытия; триаж сводит их в одну. +проход пишет **свою** строку в границы покрытия; триаж собирает их в один +список и **не сливает в одну строку**: разные пробелы чинятся разным — периметр +пишется руками за десять минут, а числа требуют замера. | Нет документа | Что деградирует | | --- | --- | diff --git a/av-dev-pipeline/skills/task-batch/SKILL.md b/av-dev-pipeline/skills/task-batch/SKILL.md index 8f64291..8738822 100644 --- a/av-dev-pipeline/skills/task-batch/SKILL.md +++ b/av-dev-pipeline/skills/task-batch/SKILL.md @@ -46,8 +46,9 @@ description: Проводит несколько задач разом — пл - **Батч не владеет спринтом и целями.** Он сообщает исход по каждой задаче в тех же трёх словах, что и `task-pipeline`: сделана / не доведена / оказалась крупнее задачи. -- **Записей учёта батч не трогает и задач не закрывает** — как и одиночный - пайплайн. Закрытие — акт владельца спринта после приёмки. Урожай ревью батч +- **Задачи закрывает пайплайн внутри каждого сабагента**, шагом 9а, вызовом + Skill `av-dev-pm:tasks`. Батч сам записей учёта не трогает: он не знает, чем + кончилась приёмка, и дублировать закрытие ему незачем. Урожай ревью батч отдаёт списком, а задачи из него заводит тот, кто ведёт задачи проекта. ## Ключевое отличие от одиночного пайплайна @@ -305,9 +306,10 @@ rebase в файле X», а не «нераспознанное пересеч - Убери worktree и ветки **только успешно влитых** задач, в конце `git worktree prune`. Worktree и ветки **провалившихся** не трогай — они нужны для ручного дожатия. -- **Задачи батч не закрывает** — ни одну, ни свои, ни чужие записи учёта не - трогает. Он сообщает исход по каждой; закрытие происходит после приёмки и - делается владельцем спринта. +- **Записей учёта батч не трогает** — их правит пайплайн внутри сабагента на + шаге 9а. Батч сообщает исход по каждой задаче; если какой-то сабагент дошёл до + коммита, но закрытия не сделал (плагина нет, вызов не разрешился), скажи это + строкой — иначе задача останется открытой молча. - Доложи кратко: - **исход по каждой задаче** одним из трёх слов, с хешем коммита; - план волн и порядок интеграции, с пометкой, какие задачи шли по одной как diff --git a/av-dev-pipeline/skills/task-pipeline/SKILL.md b/av-dev-pipeline/skills/task-pipeline/SKILL.md index d03d3ad..070869b 100644 --- a/av-dev-pipeline/skills/task-pipeline/SKILL.md +++ b/av-dev-pipeline/skills/task-pipeline/SKILL.md @@ -43,11 +43,14 @@ description: Автономно проводит одну задачу чере - **Беклогом, спринтом, целями и приоритетами.** Задача приходит извне. Пайплайн её не выбирает, не приоритизирует, не заводит и не переоценивает; если в проекте есть свой процесс управления задачами — он и решает, что брать. -- **Записями учёта.** Пайплайн **не закрывает задачу**, не двигает её по - статусам, не правит индекс и не зовёт скриптов учёта. Он сообщает исход; - закрытие — акт владельца спринта **после приёмки**, и оно происходит снаружи. - Закрыть задачу самому — значит закрыть её до коммита и до всякой приёмки, то - есть заверить собственную работу. +- **Форматом задач.** Пайплайн **не правит индексы руками и не выдумывает путь + к скрипту учёта**: он зовёт Skill `av-dev-pm:tasks`, который этим владеет + (шаг 9а). Закрытие как таковое — его работа, и это осознанное решение с + названной ценой: **приёмщик и исполнитель совпали**. Закрытие поэтому **не + окончательно** — человек на сессии возвращает задачу `reopen` с причиной, а + доклад по критериям приёмки становится единственным, по чему приёмка вообще + возможна. Плагина `av-dev-pm` в проекте нет — вызов не разрешится, и тогда + учёт остаётся владельцу, о чём говорится в докладе. - **Заведением задач из урожая ревью.** Отложенные находки отдаются **списком** (см. шаг 7); превращать их в задачи — работа того, кто ведёт задачи проекта. - **Определением ценности.** «Нужна ли эта функциональность» — не вопрос @@ -279,14 +282,11 @@ description: Автономно проводит одну задачу чере прозой уже проверен на живом проекте и дал 6 записей ADR на 43 изменения; работает только обязательное отрицание. -Документы и их триггеры: `openspec/specs/` (поведение — вливает `opsx:archive`), -`database.md` (тронуты миграции), `architecture.md` (новый компонент, граница, -внешняя зависимость), `adr/` (дорогой откат, намеренный отказ, пересмотр -прежнего), `research/` (узнали новое о внешних данных), `security.md` (новый -недоверенный вход, токен, путь наружу), `conventions/` (промоут, включая -**удаление** формулировки, ставшей правилом линтера), `review.md` -(воспроизведённый дефект — с пометкой «проскочил» или «пойман ревью»), -`passport.md`, `CLAUDE.md`. +**Список документов и их триггеров здесь не дублируется** — он в чек-листе +скилла `av-dev-pm:docs`, и копия уже однажды разошлась с оригиналом, потеряв два +триггера. Плагина нет — открой канон (`av-dev-pm/skills/canon/references/canon.md`) +и пройди по разделам его раскладки: каждый документ канона получает строку. +Канона в проекте тоже нет — назови это исходом и предложи `av-dev-pm:canon`. ### 9а. Закрыть задачу @@ -313,8 +313,9 @@ description: Автономно проводит одну задачу чере сделано», тело списком 1–3 пункта, без трейлеров). Одна задача — один осмысленный коммит. -Готово — доложи кратко. Доклад и есть выход пайплайна: **задача остаётся -открытой**, её закрывает владелец спринта после приёмки. +Готово — доложи кратко. Задача к этому моменту **закрыта шагом 9а** (или учёт +явно оставлен владельцу, если плагина нет). Доклад — то, по чему человек проводит +приёмку и решает, не вернуть ли задачу `reopen`. - **исход** задачи одним из трёх слов и, если не «сделана», чем ограничен результат; diff --git a/av-dev-pm/skills/canon/references/canon.md b/av-dev-pm/skills/canon/references/canon.md index d8a2819..c716cdb 100644 --- a/av-dev-pm/skills/canon/references/canon.md +++ b/av-dev-pm/skills/canon/references/canon.md @@ -77,11 +77,18 @@ kebab-case. ### `architecture.md` — **обзор, не поведение** Принципы; компоненты **со ссылками на capability**, а не с пересказом их -требований; внешние границы и форматы чужих систем; окружение — где работает, -что рядом, кто перезапускает; **внешние зависимости поимённо** и чем каждая +требований; **единые точки проекта** — где генерируются идентификаторы и время, +где единственный парсер входного формата, где маппинг доменной ошибки в код +ответа, где общий путь приёма (это материал для вопроса «не появился ли второй +способ»); внешние границы и форматы чужих систем; окружение — где работает, что +рядом, кто перезапускает; **внешние зависимости поимённо** и чем каждая отказывает (не только «падает», но и «отвечает медленно», «молчит», «отдаёт мусор»); кто заметит отказ и когда; характер потока — непрерывный, по запросу, -по расписанию; что обратимо, а что нет; деплой; открытые вопросы. +по расписанию; деплой; открытые вопросы. + +**Обратимости здесь нет** — её единственный дом `CLAUDE.md`: туда ходят пять +проходов, и раздвоение адреса означало бы, что проект написал ответ, а ревью его +не прочитало. **Поведение системы сюда не пишется.** Его нормативный дом — `openspec/specs/`, куда `opsx:archive` вливает дельты; второй дом синхронизировать руками @@ -159,12 +166,21 @@ kebab-case. Два раздела с разными сроками жизни. -**Настройка конвейера под проект:** типовые узлы (рода узлов и 3–5 проверяемых -свойств к каждому); типовые ложноположительные — находки, которые здесь выглядят -убедительно и всегда неверны; вопросы к проходам поимённо с провенансом; -недоступно проверке — два подраздела, «не проверит ни один проход» -(принципиальная граница, по факту промаха не пересматривается) и «перестали -проверять сознательно» (пересматривается первым). +**Настройка конвейера под проект**, пять подразделов с точными именами — по ним +проходы находят свой кусок: + +- **Типовые узлы** — рода узлов проекта и 3–5 проверяемых свойств к каждому; +- **Типовые ложноположительные** — находки, которые здесь выглядят убедительно и + всегда неверны, каждая со строкой «почему здесь это не дефект»; +- **Вопросы к проходам** — поимённо, в форме `<имя прохода>: <вопрос> + (<провенанс>)`; +- **Триггеры профиля** — проектная конкретизация правила выбора профиля ревью: + какие пути и контракты означают `deep`, что считается «поведением, видимым + снаружи», при каком изменении запускается независимая реализация. Уточняет + умолчания конвейера, а не отменяет их; +- **Недоступно проверке** — два подраздела: «не проверит ни один проход» + (принципиальная граница, по факту промаха не пересматривается) и «перестали + проверять сознательно» (пересматривается первым). **Журнал дефектов:** запись на каждый воспроизведённый дефект с пометкой **проскочил / пойман ревью**. Проскочившие — эвал-сет для калибровки конвейера, @@ -173,13 +189,24 @@ kebab-case. ### `CLAUDE.md` -Что это и стек; **инварианты с severity рядом с формулировкой** — по ним -проходы присваивают `critical`, поэтому severity стоит здесь, а не выводится -каждым проходом заново; команды; **семантика гейта** — чем краснеет безусловно и -почему, где логи, что означает исход, чего в гейте намеренно нет, **кто и когда -обязан гонять дорогое вне гейта**; что запускать запрещено, с путями; что -считается необратимым; общий станок, врывающийся в замороженный спринт; ориентир -по размеру спринта. +Что это и стек; **инварианты с severity рядом с формулировкой** — по ним проходы +присваивают `critical`, поэтому severity стоит здесь, а не выводится каждым +проходом заново; команды; **семантика гейта** — чем краснеет безусловно и почему, +где логи, что означает исход, чего в гейте намеренно нет, **кто и когда обязан +гонять дорогое вне гейта**. + +Плюс то, что нужно git-операциям и проходам и не выводится ниоткуда: + +- **имя основной ветки** — от неё считается база диффа + (`git merge-base HEAD <ветка>`), в неё вливает батч, от неё ветвятся задачи. + Угадывание между `master` и `main` ломает интеграцию целиком; +- **что запускать запрещено, с путями** — рабочая БД, боевой каталог данных, + внешние сервисы. Запретом с путями, а не «будь осторожен»; +- **где `testdata`** и что в них лежит; **куда писать временное**; +- **что считается необратимым** — единственный дом: от обратимости зависит вся + шкала ранжирования триажа и право проходов на `critical`; +- **общий станок**, врывающийся в замороженный спринт; **ориентир по размеру + спринта**. ### `openspec/config.yaml` @@ -202,6 +229,9 @@ kebab-case. | измеренное число | `research/` | | настройка с числовым значением | `database.md` | | периметр и модель угроз | `security.md` | +| что необратимо | `CLAUDE.md` — **не** `architecture.md` | +| единые точки проекта | `architecture.md` | +| имя основной ветки, `testdata`, временный каталог | `CLAUDE.md` | | что уже механизировано правилом | `conventions/README.md` | ## Пустое называется пустым diff --git a/av-dev-pm/skills/canon/references/skeletons.md b/av-dev-pm/skills/canon/references/skeletons.md index b483215..17b8a87 100644 --- a/av-dev-pm/skills/canon/references/skeletons.md +++ b/av-dev-pm/skills/canon/references/skeletons.md @@ -71,7 +71,12 @@ медленно, молчит, отдаёт мусор): - Кто заметит отказ и когда: - Характер потока (непрерывный, по запросу, по расписанию): -- Что обратимо, а что нет: + +## Единые точки проекта + +Где генерируются идентификаторы и время; где единственный парсер входного +формата; где маппинг доменной ошибки в код ответа; где общий путь приёма. +Материал для вопроса «не появился ли второй способ делать то, что уже делается». ## Деплой @@ -257,6 +262,13 @@ ### Вопросы к проходам Форма: `<имя прохода>: <вопрос> (<провенанс>)`. Главный источник — журнал ниже. +Проход, увидев свой блок, задаёт эти вопросы дополнительно к обязательным. + +### Триггеры профиля + +Проектная конкретизация правила выбора профиля: какие пути и контракты означают +`deep`, что здесь считается «поведением, видимым снаружи», при каком изменении +запускается независимая реализация. Уточняет умолчания конвейера, не отменяет их. ### Недоступно проверке @@ -286,6 +298,66 @@ Новый проект: «Дефектов пока не было. Настройка конвейера появится с первым ревью.» +## `CLAUDE.md` + +Лежит в корне, не в `docs/`. Единственный файл канона, который агент читает +**всегда**, поэтому в нём то, без чего нельзя сделать ни шага. + +```markdown +# CLAUDE.md + +Памятка для работы над <проект>. Перед задачей прочитай также +[docs/passport.md](docs/passport.md), [docs/architecture.md](docs/architecture.md) +и [docs/conventions/](docs/conventions/README.md). + +## Что это + +Абзац: что делает и чего **не** делает. + +## Стек + +## Инварианты + +Что нарушать нельзя. Каждый пункт — три вещи: формулировка **как проверяемое +свойство**, а не лозунг; последствие нарушения и его обратимость; **severity** +рядом. По этим формулировкам проходы ревью присваивают `critical`, поэтому +severity стоит здесь, а не выводится каждым проходом заново. + +## Команды + +## Гейт + +- Команда целиком и как определяется база диффа: +- Где логи шагов: +- Что означает каждый исход: +- **Что красит безусловно и почему:** +- Чего в гейте намеренно нет и **кто тогда обязан это гонять:** + +## Запреты + +Что запускать нельзя, **с путями**: рабочая БД, боевой каталог данных, внешние +сервисы. Плюс где `testdata` и куда писать временное. + +## Работа + +- **Основная ветка:** <имя> +- **Необратимое** (спрашивается у человека всегда): +- **Общий станок** — какая проверка, покраснев, врывается в замороженный спринт: +- **Ориентир по размеру спринта:** 5–8 задач, ориентир а не закон +- **Что такое «сделана»:** пайплайн проекта пройден + критерии приёмки проверены + поимённо + +## Язык + +- Документация, комментарии, сообщения коммитов — русский. +- Код и идентификаторы — английский. +``` + +Имя основной ветки, запреты с путями и «что необратимо» — не украшение: без +первого падают git-операции батча и расчёт базы диффа, без второго проход может +тронуть рабочие данные, без третьего вся шкала ранжирования триажа держится на +догадке. + ## `docs/.pm.json` ```json