починены находки второго ревью: цикл закрытия задачи и три отсутствовавших слота
- task-pipeline и task-batch запрещали шаг, который сами же добавили: раздел границ и финальный доклад переписаны под снятую границу приёмки - «триаж сводит строки в одну» противоречило «не сливает» — деградация снова поразрядная во всех трёх местах - канон не требовал в CLAUDE.md имени основной ветки, testdata и запретов, а скелета CLAUDE.md не было вовсе — заведён - обратимость жила в двух домах, читатели ходили в пустой; единственный дом теперь CLAUDE.md - заведены слоты «Единые точки проекта» и «Триггеры профиля», куда charter'ы слали, а канон их не создавал - блок «Вопросы к проходам» стал частью задания прохода: за ним ходили двое из девяти - чек-лист синка и правило «замер + настройка» сведены к одному дому; plugin.json больше не про бриф
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "av-dev-pipeline",
|
"name": "av-dev-pipeline",
|
||||||
"description": "Проведение задачи через полный цикл Spec Driven Development и конвейер ревью: детерминированный гейт, сверка со спеками, враждебные постановки, эксплуатационный постмортем, независимая реализация, архитектура и обязательный триаж. Плюс прогон нескольких задач разом. Проектная специфика — инварианты, команда гейта, прецеденты, доменные факты — приходит из файла-брифа проекта, который заводится отдельным скиллом, а не пишется руками.",
|
"description": "Проведение задачи через полный цикл Spec Driven Development и конвейер ревью с детерминированным гейтом, сверкой со спеками, враждебными постановками, эксплуатационным постмортемом, независимой реализацией и обязательным триажем; плюс прогон нескольких задач разом по одной в изолированном worktree. Требует OpenSpec. Проектную конкретику проходы читают в документах канона плагина av-dev-pm напрямую.",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Anton Vakhrushev",
|
"name": "Anton Vakhrushev",
|
||||||
"email": "anwinged@gmail.com"
|
"email": "anwinged@gmail.com"
|
||||||
|
|||||||
@@ -38,10 +38,10 @@ color: red
|
|||||||
|
|
||||||
- **`CLAUDE.md`, инварианты** — нарушение основание для `critical`; там же, что
|
- **`CLAUDE.md`, инварианты** — нарушение основание для `critical`; там же, что
|
||||||
необратимо и что запускать запрещено, с путями;
|
необратимо и что запускать запрещено, с путями;
|
||||||
- **`docs/database.md`** — чем физически лежит запись и какие настройки имеют
|
- **`docs/database.md` и `docs/research/` — вместе**: настройки с числовым
|
||||||
числовое значение (таймаут занятости, лимит тела, ретеншен). **Из этого
|
значением (таймаут занятости, лимит тела, ретеншен) и измеренные объёмы. **Из
|
||||||
строятся пути к отказу в обслуживании**, и без них замер сравнить не с чем;
|
этого строятся пути к отказу в обслуживании**; порознь они ничего не дают, и
|
||||||
- **`docs/research/`** — измеренные объёмы с провенансом;
|
сшиваешь их ты (см. project-facts, «Сшивать обязаны проходы»);
|
||||||
- **`docs/architecture.md`** — окружение и внешние зависимости;
|
- **`docs/architecture.md`** — окружение и внешние зависимости;
|
||||||
- **`docs/review.md`** — журнал: что здесь уже пробивалось и чем воспроизведено;
|
- **`docs/review.md`** — журнал: что здесь уже пробивалось и чем воспроизведено;
|
||||||
и блок `adversary` в «Вопросах к проходам», если он есть, — эти вопросы
|
и блок `adversary` в «Вопросах к проходам», если он есть, — эти вопросы
|
||||||
|
|||||||
@@ -22,16 +22,11 @@ color: yellow
|
|||||||
характер потока и есть ли у отправителя обратная связь; **что обратимо, а что
|
характер потока и есть ли у отправителя обратная связь; **что обратимо, а что
|
||||||
нет**. `CLAUDE.md` говорит, что запускать запрещено, и что необратимо.
|
нет**. `CLAUDE.md` говорит, что запускать запрещено, и что необратимо.
|
||||||
|
|
||||||
**Два документа читаются вместе, и это твоя обязанность, а не удобство.**
|
**`docs/research/` и `docs/database.md` читаются вместе, и это твоя обязанность,
|
||||||
`docs/research/` даёт измеренные числа с провенансом, `docs/database.md` — чем
|
а не удобство:** число без настройки сравнить не с чем, и находка честно упадёт
|
||||||
физически лежит запись и какие настройки имеют числовое значение. Порознь они
|
до гипотезы. Почему именно так и какие ещё есть стыки —
|
||||||
бесполезны: «пик 768 МиБ» — аномалия только рядом со строкой «запись лежит сжатой
|
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`, раздел
|
||||||
и распаковывается целиком»; «блокировка держалась 5 секунд» — отказ соседа только
|
«Сшивать обязаны проходы». Там же карта «что нужно проходу → где лежит».
|
||||||
рядом с известным таймаутом занятости. Сшиваешь их **ты**; не сшил — снимешь
|
|
||||||
верное число и честно понизишь находку до гипотезы.
|
|
||||||
|
|
||||||
Карта «что нужно проходу → где лежит» —
|
|
||||||
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
|
|
||||||
|
|
||||||
Два обстоятельства почти всегда меняют цену отказов, и если документы их
|
Два обстоятельства почти всегда меняют цену отказов, и если документы их
|
||||||
подтверждают — держи перед глазами:
|
подтверждают — держи перед глазами:
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ color: purple
|
|||||||
- **`CLAUDE.md`, инварианты** — то, что твоя реализация обязана соблюсти
|
- **`CLAUDE.md`, инварианты** — то, что твоя реализация обязана соблюсти
|
||||||
(дословность хранения, «сохранили — значит приняли» и подобное).
|
(дословность хранения, «сохранили — значит приняли» и подобное).
|
||||||
- **`docs/research/` и `docs/database.md` вместе** — измеренные объёмы и
|
- **`docs/research/` и `docs/database.md` вместе** — измеренные объёмы и
|
||||||
представление данных. Решение, разумное на сотне записей, неразумно на
|
представление данных: решение, разумное на сотне записей, неразумно на
|
||||||
миллионе; и то и другое читается вместе, порознь они ничего не решают.
|
миллионе (почему именно вместе — project-facts, «Сшивать обязаны проходы»).
|
||||||
- **`docs/conventions/`** — твоя версия должна быть сравнимой по форме.
|
- **`docs/conventions/`** — твоя версия должна быть сравнимой по форме.
|
||||||
|
|
||||||
Карта «что нужно проходу → где лежит» —
|
Карта «что нужно проходу → где лежит» —
|
||||||
|
|||||||
@@ -28,11 +28,12 @@ color: purple
|
|||||||
Карта «что нужно проходу → где лежит» —
|
Карта «что нужно проходу → где лежит» —
|
||||||
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
|
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
|
||||||
|
|
||||||
**Этих документов нет** — порождай рубрику по общей практике, но `critical` по
|
**Документа нет — строка на каждый, отдельно.** Нет `docs/review.md`: «рода
|
||||||
основанию «нарушен инвариант проекта» (в фазе 2) не присваивай и дай строку:
|
узлов и прецеденты неизвестны; требование „минимум три пункта специфичны для
|
||||||
«`docs/review.md` и инвариантов нет: рода узлов и прецеденты неизвестны;
|
типа узла" выполнено по общей практике, а не по этому проекту». Нет инвариантов
|
||||||
требование «минимум три пункта специфичны для типа узла» выполнено по общей
|
в `CLAUDE.md`: `critical` по основанию «нарушен инвариант проекта» в фазе 2 не
|
||||||
практике, а не по этому проекту».
|
присваивай и скажи об этом. Одной строкой за два документа не отделывайся —
|
||||||
|
чинятся они разным.
|
||||||
|
|
||||||
## Порядок фаз обязателен
|
## Порядок фаз обязателен
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,8 @@ color: green
|
|||||||
Карта «что нужно проходу → где лежит» —
|
Карта «что нужно проходу → где лежит» —
|
||||||
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
|
`${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/project-facts.md`.
|
||||||
|
|
||||||
**Деградация поразрядная, и ты — тот, кто сводит её строки в одну.** Свою часть
|
**Деградация поразрядная, и ты — тот, кто собирает её строки в один список,
|
||||||
|
сохраняя каждую.** Свою часть
|
||||||
тоже называй: нет инвариантов в `CLAUDE.md` — ни одну находку не поднимай до
|
тоже называй: нет инвариантов в `CLAUDE.md` — ни одну находку не поднимай до
|
||||||
`critical` по этому основанию (сослаться не на что), ранжируй по обратимости,
|
`critical` по этому основанию (сослаться не на что), ранжируй по обратимости,
|
||||||
выведенной из кода, и назови это предположением. Нет `docs/review.md` — отсев
|
выведенной из кода, и назови это предположением. Нет `docs/review.md` — отсев
|
||||||
|
|||||||
@@ -79,8 +79,13 @@ description: Конвейер ревью изменения — детермин
|
|||||||
|
|
||||||
## Что получает каждый проход
|
## Что получает каждый проход
|
||||||
|
|
||||||
Задание любому проходу состоит из пяти вещей:
|
Задание любому проходу состоит из шести вещей:
|
||||||
|
|
||||||
|
- **его блок вопросов** из «Вопросы к проходам» в `docs/review.md`, если он там
|
||||||
|
есть, — **дословно**. Блок адресован проходу поимённо и выведен из промаха
|
||||||
|
этого проекта; заставлять девять charter'ов самим ходить за ним значит
|
||||||
|
получить, что за ним ходят двое. Проход отвечает на такие вопросы явно,
|
||||||
|
дополнительно к обязательным;
|
||||||
- **контракт находок** — путь к
|
- **контракт находок** — путь к
|
||||||
[references/finding-contract.md](references/finding-contract.md) (в
|
[references/finding-contract.md](references/finding-contract.md) (в
|
||||||
установленном плагине — `${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/`);
|
установленном плагине — `${CLAUDE_PLUGIN_ROOT}/skills/review-pipeline/references/`);
|
||||||
@@ -306,9 +311,10 @@ Recall обоих равен длине их источника — это и е
|
|||||||
никто другой.
|
никто другой.
|
||||||
|
|
||||||
Материал берётся из документов: `docs/security.md` — враждебному,
|
Материал берётся из документов: `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`, по триггеру)
|
## Стадия 3 — Independent reimplementation (`deep`, по триггеру)
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,9 @@
|
|||||||
## Деградация — поразрядная
|
## Деградация — поразрядная
|
||||||
|
|
||||||
Документа нет — деградирует то, что из него читалось, и **только оно**. Каждый
|
Документа нет — деградирует то, что из него читалось, и **только оно**. Каждый
|
||||||
проход пишет свою строку в границы покрытия; триаж сводит их в одну.
|
проход пишет **свою** строку в границы покрытия; триаж собирает их в один
|
||||||
|
список и **не сливает в одну строку**: разные пробелы чинятся разным — периметр
|
||||||
|
пишется руками за десять минут, а числа требуют замера.
|
||||||
|
|
||||||
| Нет документа | Что деградирует |
|
| Нет документа | Что деградирует |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|
|||||||
@@ -46,8 +46,9 @@ description: Проводит несколько задач разом — пл
|
|||||||
- **Батч не владеет спринтом и целями.** Он сообщает исход по каждой задаче в тех
|
- **Батч не владеет спринтом и целями.** Он сообщает исход по каждой задаче в тех
|
||||||
же трёх словах, что и `task-pipeline`: сделана / не доведена / оказалась крупнее
|
же трёх словах, что и `task-pipeline`: сделана / не доведена / оказалась крупнее
|
||||||
задачи.
|
задачи.
|
||||||
- **Записей учёта батч не трогает и задач не закрывает** — как и одиночный
|
- **Задачи закрывает пайплайн внутри каждого сабагента**, шагом 9а, вызовом
|
||||||
пайплайн. Закрытие — акт владельца спринта после приёмки. Урожай ревью батч
|
Skill `av-dev-pm:tasks`. Батч сам записей учёта не трогает: он не знает, чем
|
||||||
|
кончилась приёмка, и дублировать закрытие ему незачем. Урожай ревью батч
|
||||||
отдаёт списком, а задачи из него заводит тот, кто ведёт задачи проекта.
|
отдаёт списком, а задачи из него заводит тот, кто ведёт задачи проекта.
|
||||||
|
|
||||||
## Ключевое отличие от одиночного пайплайна
|
## Ключевое отличие от одиночного пайплайна
|
||||||
@@ -305,9 +306,10 @@ rebase в файле X», а не «нераспознанное пересеч
|
|||||||
- Убери worktree и ветки **только успешно влитых** задач, в конце
|
- Убери worktree и ветки **только успешно влитых** задач, в конце
|
||||||
`git worktree prune`. Worktree и ветки **провалившихся** не трогай — они нужны
|
`git worktree prune`. Worktree и ветки **провалившихся** не трогай — они нужны
|
||||||
для ручного дожатия.
|
для ручного дожатия.
|
||||||
- **Задачи батч не закрывает** — ни одну, ни свои, ни чужие записи учёта не
|
- **Записей учёта батч не трогает** — их правит пайплайн внутри сабагента на
|
||||||
трогает. Он сообщает исход по каждой; закрытие происходит после приёмки и
|
шаге 9а. Батч сообщает исход по каждой задаче; если какой-то сабагент дошёл до
|
||||||
делается владельцем спринта.
|
коммита, но закрытия не сделал (плагина нет, вызов не разрешился), скажи это
|
||||||
|
строкой — иначе задача останется открытой молча.
|
||||||
- Доложи кратко:
|
- Доложи кратко:
|
||||||
- **исход по каждой задаче** одним из трёх слов, с хешем коммита;
|
- **исход по каждой задаче** одним из трёх слов, с хешем коммита;
|
||||||
- план волн и порядок интеграции, с пометкой, какие задачи шли по одной как
|
- план волн и порядок интеграции, с пометкой, какие задачи шли по одной как
|
||||||
|
|||||||
@@ -43,11 +43,14 @@ description: Автономно проводит одну задачу чере
|
|||||||
- **Беклогом, спринтом, целями и приоритетами.** Задача приходит извне. Пайплайн
|
- **Беклогом, спринтом, целями и приоритетами.** Задача приходит извне. Пайплайн
|
||||||
её не выбирает, не приоритизирует, не заводит и не переоценивает; если в
|
её не выбирает, не приоритизирует, не заводит и не переоценивает; если в
|
||||||
проекте есть свой процесс управления задачами — он и решает, что брать.
|
проекте есть свой процесс управления задачами — он и решает, что брать.
|
||||||
- **Записями учёта.** Пайплайн **не закрывает задачу**, не двигает её по
|
- **Форматом задач.** Пайплайн **не правит индексы руками и не выдумывает путь
|
||||||
статусам, не правит индекс и не зовёт скриптов учёта. Он сообщает исход;
|
к скрипту учёта**: он зовёт Skill `av-dev-pm:tasks`, который этим владеет
|
||||||
закрытие — акт владельца спринта **после приёмки**, и оно происходит снаружи.
|
(шаг 9а). Закрытие как таковое — его работа, и это осознанное решение с
|
||||||
Закрыть задачу самому — значит закрыть её до коммита и до всякой приёмки, то
|
названной ценой: **приёмщик и исполнитель совпали**. Закрытие поэтому **не
|
||||||
есть заверить собственную работу.
|
окончательно** — человек на сессии возвращает задачу `reopen` с причиной, а
|
||||||
|
доклад по критериям приёмки становится единственным, по чему приёмка вообще
|
||||||
|
возможна. Плагина `av-dev-pm` в проекте нет — вызов не разрешится, и тогда
|
||||||
|
учёт остаётся владельцу, о чём говорится в докладе.
|
||||||
- **Заведением задач из урожая ревью.** Отложенные находки отдаются **списком**
|
- **Заведением задач из урожая ревью.** Отложенные находки отдаются **списком**
|
||||||
(см. шаг 7); превращать их в задачи — работа того, кто ведёт задачи проекта.
|
(см. шаг 7); превращать их в задачи — работа того, кто ведёт задачи проекта.
|
||||||
- **Определением ценности.** «Нужна ли эта функциональность» — не вопрос
|
- **Определением ценности.** «Нужна ли эта функциональность» — не вопрос
|
||||||
@@ -279,14 +282,11 @@ description: Автономно проводит одну задачу чере
|
|||||||
прозой уже проверен на живом проекте и дал 6 записей ADR на 43 изменения;
|
прозой уже проверен на живом проекте и дал 6 записей ADR на 43 изменения;
|
||||||
работает только обязательное отрицание.
|
работает только обязательное отрицание.
|
||||||
|
|
||||||
Документы и их триггеры: `openspec/specs/` (поведение — вливает `opsx:archive`),
|
**Список документов и их триггеров здесь не дублируется** — он в чек-листе
|
||||||
`database.md` (тронуты миграции), `architecture.md` (новый компонент, граница,
|
скилла `av-dev-pm:docs`, и копия уже однажды разошлась с оригиналом, потеряв два
|
||||||
внешняя зависимость), `adr/` (дорогой откат, намеренный отказ, пересмотр
|
триггера. Плагина нет — открой канон (`av-dev-pm/skills/canon/references/canon.md`)
|
||||||
прежнего), `research/` (узнали новое о внешних данных), `security.md` (новый
|
и пройди по разделам его раскладки: каждый документ канона получает строку.
|
||||||
недоверенный вход, токен, путь наружу), `conventions/` (промоут, включая
|
Канона в проекте тоже нет — назови это исходом и предложи `av-dev-pm:canon`.
|
||||||
**удаление** формулировки, ставшей правилом линтера), `review.md`
|
|
||||||
(воспроизведённый дефект — с пометкой «проскочил» или «пойман ревью»),
|
|
||||||
`passport.md`, `CLAUDE.md`.
|
|
||||||
|
|
||||||
### 9а. Закрыть задачу
|
### 9а. Закрыть задачу
|
||||||
|
|
||||||
@@ -313,8 +313,9 @@ description: Автономно проводит одну задачу чере
|
|||||||
сделано», тело списком 1–3 пункта, без трейлеров). Одна задача — один осмысленный
|
сделано», тело списком 1–3 пункта, без трейлеров). Одна задача — один осмысленный
|
||||||
коммит.
|
коммит.
|
||||||
|
|
||||||
Готово — доложи кратко. Доклад и есть выход пайплайна: **задача остаётся
|
Готово — доложи кратко. Задача к этому моменту **закрыта шагом 9а** (или учёт
|
||||||
открытой**, её закрывает владелец спринта после приёмки.
|
явно оставлен владельцу, если плагина нет). Доклад — то, по чему человек проводит
|
||||||
|
приёмку и решает, не вернуть ли задачу `reopen`.
|
||||||
|
|
||||||
- **исход** задачи одним из трёх слов и, если не «сделана», чем ограничен
|
- **исход** задачи одним из трёх слов и, если не «сделана», чем ограничен
|
||||||
результат;
|
результат;
|
||||||
|
|||||||
@@ -77,11 +77,18 @@ kebab-case.
|
|||||||
### `architecture.md` — **обзор, не поведение**
|
### `architecture.md` — **обзор, не поведение**
|
||||||
|
|
||||||
Принципы; компоненты **со ссылками на capability**, а не с пересказом их
|
Принципы; компоненты **со ссылками на capability**, а не с пересказом их
|
||||||
требований; внешние границы и форматы чужих систем; окружение — где работает,
|
требований; **единые точки проекта** — где генерируются идентификаторы и время,
|
||||||
что рядом, кто перезапускает; **внешние зависимости поимённо** и чем каждая
|
где единственный парсер входного формата, где маппинг доменной ошибки в код
|
||||||
|
ответа, где общий путь приёма (это материал для вопроса «не появился ли второй
|
||||||
|
способ»); внешние границы и форматы чужих систем; окружение — где работает, что
|
||||||
|
рядом, кто перезапускает; **внешние зависимости поимённо** и чем каждая
|
||||||
отказывает (не только «падает», но и «отвечает медленно», «молчит», «отдаёт
|
отказывает (не только «падает», но и «отвечает медленно», «молчит», «отдаёт
|
||||||
мусор»); кто заметит отказ и когда; характер потока — непрерывный, по запросу,
|
мусор»); кто заметит отказ и когда; характер потока — непрерывный, по запросу,
|
||||||
по расписанию; что обратимо, а что нет; деплой; открытые вопросы.
|
по расписанию; деплой; открытые вопросы.
|
||||||
|
|
||||||
|
**Обратимости здесь нет** — её единственный дом `CLAUDE.md`: туда ходят пять
|
||||||
|
проходов, и раздвоение адреса означало бы, что проект написал ответ, а ревью его
|
||||||
|
не прочитало.
|
||||||
|
|
||||||
**Поведение системы сюда не пишется.** Его нормативный дом — `openspec/specs/`,
|
**Поведение системы сюда не пишется.** Его нормативный дом — `openspec/specs/`,
|
||||||
куда `opsx:archive` вливает дельты; второй дом синхронизировать руками
|
куда `opsx:archive` вливает дельты; второй дом синхронизировать руками
|
||||||
@@ -159,10 +166,19 @@ kebab-case.
|
|||||||
|
|
||||||
Два раздела с разными сроками жизни.
|
Два раздела с разными сроками жизни.
|
||||||
|
|
||||||
**Настройка конвейера под проект:** типовые узлы (рода узлов и 3–5 проверяемых
|
**Настройка конвейера под проект**, пять подразделов с точными именами — по ним
|
||||||
свойств к каждому); типовые ложноположительные — находки, которые здесь выглядят
|
проходы находят свой кусок:
|
||||||
убедительно и всегда неверны; вопросы к проходам поимённо с провенансом;
|
|
||||||
недоступно проверке — два подраздела, «не проверит ни один проход»
|
- **Типовые узлы** — рода узлов проекта и 3–5 проверяемых свойств к каждому;
|
||||||
|
- **Типовые ложноположительные** — находки, которые здесь выглядят убедительно и
|
||||||
|
всегда неверны, каждая со строкой «почему здесь это не дефект»;
|
||||||
|
- **Вопросы к проходам** — поимённо, в форме `<имя прохода>: <вопрос>
|
||||||
|
(<провенанс>)`;
|
||||||
|
- **Триггеры профиля** — проектная конкретизация правила выбора профиля ревью:
|
||||||
|
какие пути и контракты означают `deep`, что считается «поведением, видимым
|
||||||
|
снаружи», при каком изменении запускается независимая реализация. Уточняет
|
||||||
|
умолчания конвейера, а не отменяет их;
|
||||||
|
- **Недоступно проверке** — два подраздела: «не проверит ни один проход»
|
||||||
(принципиальная граница, по факту промаха не пересматривается) и «перестали
|
(принципиальная граница, по факту промаха не пересматривается) и «перестали
|
||||||
проверять сознательно» (пересматривается первым).
|
проверять сознательно» (пересматривается первым).
|
||||||
|
|
||||||
@@ -173,13 +189,24 @@ kebab-case.
|
|||||||
|
|
||||||
### `CLAUDE.md`
|
### `CLAUDE.md`
|
||||||
|
|
||||||
Что это и стек; **инварианты с severity рядом с формулировкой** — по ним
|
Что это и стек; **инварианты с severity рядом с формулировкой** — по ним проходы
|
||||||
проходы присваивают `critical`, поэтому severity стоит здесь, а не выводится
|
присваивают `critical`, поэтому severity стоит здесь, а не выводится каждым
|
||||||
каждым проходом заново; команды; **семантика гейта** — чем краснеет безусловно и
|
проходом заново; команды; **семантика гейта** — чем краснеет безусловно и почему,
|
||||||
почему, где логи, что означает исход, чего в гейте намеренно нет, **кто и когда
|
где логи, что означает исход, чего в гейте намеренно нет, **кто и когда обязан
|
||||||
обязан гонять дорогое вне гейта**; что запускать запрещено, с путями; что
|
гонять дорогое вне гейта**.
|
||||||
считается необратимым; общий станок, врывающийся в замороженный спринт; ориентир
|
|
||||||
по размеру спринта.
|
Плюс то, что нужно git-операциям и проходам и не выводится ниоткуда:
|
||||||
|
|
||||||
|
- **имя основной ветки** — от неё считается база диффа
|
||||||
|
(`git merge-base HEAD <ветка>`), в неё вливает батч, от неё ветвятся задачи.
|
||||||
|
Угадывание между `master` и `main` ломает интеграцию целиком;
|
||||||
|
- **что запускать запрещено, с путями** — рабочая БД, боевой каталог данных,
|
||||||
|
внешние сервисы. Запретом с путями, а не «будь осторожен»;
|
||||||
|
- **где `testdata`** и что в них лежит; **куда писать временное**;
|
||||||
|
- **что считается необратимым** — единственный дом: от обратимости зависит вся
|
||||||
|
шкала ранжирования триажа и право проходов на `critical`;
|
||||||
|
- **общий станок**, врывающийся в замороженный спринт; **ориентир по размеру
|
||||||
|
спринта**.
|
||||||
|
|
||||||
### `openspec/config.yaml`
|
### `openspec/config.yaml`
|
||||||
|
|
||||||
@@ -202,6 +229,9 @@ kebab-case.
|
|||||||
| измеренное число | `research/` |
|
| измеренное число | `research/` |
|
||||||
| настройка с числовым значением | `database.md` |
|
| настройка с числовым значением | `database.md` |
|
||||||
| периметр и модель угроз | `security.md` |
|
| периметр и модель угроз | `security.md` |
|
||||||
|
| что необратимо | `CLAUDE.md` — **не** `architecture.md` |
|
||||||
|
| единые точки проекта | `architecture.md` |
|
||||||
|
| имя основной ветки, `testdata`, временный каталог | `CLAUDE.md` |
|
||||||
| что уже механизировано правилом | `conventions/README.md` |
|
| что уже механизировано правилом | `conventions/README.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`
|
## `docs/.pm.json`
|
||||||
|
|
||||||
```json
|
```json
|
||||||
|
|||||||
Reference in New Issue
Block a user