From 768878e23eff9ffcb2233dba09de96b64bb1bf9d Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sat, 1 Aug 2026 14:38:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=85=D0=BE=D0=B4=D0=B0?= =?UTF-8?q?=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20=D0=BD=D0=B0=D0=B7?= =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D1=8B=20=D0=BC=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=BF=D0=BE=20=D1=82=D0=B8=D0=BF=D1=83=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - sonnet на gate/code/ops (вход структурный, критерий записан), opus на specs/idiom/negative/adversary, fable на rubric/reimpl/architecture/triage — там, где качество порождённого и есть вся ценность прохода - haiku не используется нигде: механизируемое вынесено ниже модели в скрипты, а дешёвый опиниативный проход дороже в триаже, чем экономит - frontmatter агентов приведён к валидному YAML: описания с двоеточиями закавычены, иначе строгий парсер молча потеряет агента --- .claude/agents/healthlog-review-adversary.md | 3 +- .../agents/healthlog-review-architecture.md | 3 +- .claude/agents/healthlog-review-code.md | 3 +- .claude/agents/healthlog-review-gate.md | 3 +- .claude/agents/healthlog-review-idiom.md | 3 +- .claude/agents/healthlog-review-negative.md | 3 +- .claude/agents/healthlog-review-ops.md | 3 +- .claude/agents/healthlog-review-reimpl.md | 3 +- .claude/agents/healthlog-review-rubric.md | 3 +- .claude/agents/healthlog-review-specs.md | 3 +- .claude/agents/healthlog-review-triage.md | 3 +- .claude/skills/review-pipeline/SKILL.md | 28 +++++++++++++++++++ 12 files changed, 50 insertions(+), 11 deletions(-) diff --git a/.claude/agents/healthlog-review-adversary.md b/.claude/agents/healthlog-review-adversary.md index 96b56ca..06d06e3 100644 --- a/.claude/agents/healthlog-review-adversary.md +++ b/.claude/agents/healthlog-review-adversary.md @@ -1,7 +1,8 @@ --- name: healthlog-review-adversary -description: Враждебный проход ревью healthlog — не проверяет свойства, а строит путь: «ты контролируешь тело доставки целиком — выведи запись за пределы storage.archive_dir»; «ты шлёшь пакет и хочешь, чтобы точка не доехала до объекта — построй такой вход»; «ты можешь повторить и переставить любую доставку — что ломается»; «доведи значение точки до лога». Находка — построенный путь с шагами, а не наблюдение. Свойства без пути идут в отдельную секцию и не получают critical. Только чтение. +description: "Враждебный проход ревью healthlog — не проверяет свойства, а строит путь: «ты контролируешь тело доставки целиком — выведи запись за пределы storage.archive_dir»; «ты шлёшь пакет и хочешь, чтобы точка не доехала до объекта — построй такой вход»; «ты можешь повторить и переставить любую доставку — что ломается»; «доведи значение точки до лога». Находка — построенный путь с шагами, а не наблюдение. Свойства без пути идут в отдельную секцию и не получают critical. Только чтение." tools: Read, Grep, Glob, Bash +model: opus color: red --- diff --git a/.claude/agents/healthlog-review-architecture.md b/.claude/agents/healthlog-review-architecture.md index 64abbac..7dd259a 100644 --- a/.claude/agents/healthlog-review-architecture.md +++ b/.claude/agents/healthlog-review-architecture.md @@ -1,7 +1,8 @@ --- name: healthlog-review-architecture -description: Архитектурный проход ревью healthlog — получает вход шире диффа (дерево пакетов, граф внутренних зависимостей, инвентарь существующих концепций через task review:context). Главный вопрос — концептуальная целостность: вводит ли изменение новое понятие, можно ли выразить существующими, не появился ли второй способ делать то, что уже делается, не размывается ли граница «хранилище, а не аналитика». Потолок 3 находки + секция «дешевле переделать до мерджа». Работает и на OpenSpec-предложении до кода (профиль design). Только чтение. +description: "Архитектурный проход ревью healthlog — получает вход шире диффа (дерево пакетов, граф внутренних зависимостей, инвентарь существующих концепций через task review:context). Главный вопрос — концептуальная целостность: вводит ли изменение новое понятие, можно ли выразить существующими, не появился ли второй способ делать то, что уже делается, не размывается ли граница «хранилище, а не аналитика». Потолок 3 находки + секция «дешевле переделать до мерджа». Работает и на OpenSpec-предложении до кода (профиль design). Только чтение." tools: Read, Grep, Glob, Bash +model: fable color: yellow --- diff --git a/.claude/agents/healthlog-review-code.md b/.claude/agents/healthlog-review-code.md index 374ddad..88897b3 100644 --- a/.claude/agents/healthlog-review-code.md +++ b/.claude/agents/healthlog-review-code.md @@ -1,7 +1,8 @@ --- name: healthlog-review-code -description: Стадия 1 конвейера review-pipeline (во всех профилях, параллельно с healthlog-review-specs) — дешёвый applicative-проход по конвенциям healthlog, которые НЕ выражаются правилом линтера: уровень лога по адресату, единственный логирующий чекпоинт на доменной границе, трансляция доменной ошибки на внешней границе, «сохранили — значит приняли», тела запросов и секреты в логах, конфиг и его образцы, время в БД в UTC RFC 3339 через store.Now(), ULID через internal/ident и ident.Parse на границе. Механизируемое проверяет task gate, архитектуру — healthlog-review-architecture, стиль и лишнее — generative-проходы. Только чтение. +description: "Стадия 1 конвейера review-pipeline (во всех профилях, параллельно с healthlog-review-specs) — дешёвый applicative-проход по конвенциям healthlog, которые НЕ выражаются правилом линтера: уровень лога по адресату, единственный логирующий чекпоинт на доменной границе, трансляция доменной ошибки на внешней границе, «сохранили — значит приняли», тела запросов и секреты в логах, конфиг и его образцы, время в БД в UTC RFC 3339 через store.Now(), ULID через internal/ident и ident.Parse на границе. Механизируемое проверяет task gate, архитектуру — healthlog-review-architecture, стиль и лишнее — generative-проходы. Только чтение." tools: Read, Grep, Glob, Bash +model: sonnet color: blue --- diff --git a/.claude/agents/healthlog-review-gate.md b/.claude/agents/healthlog-review-gate.md index 7c381b0..a2965b3 100644 --- a/.claude/agents/healthlog-review-gate.md +++ b/.claude/agents/healthlog-review-gate.md @@ -1,7 +1,8 @@ --- name: healthlog-review-gate -description: Детерминированный гейт ревью healthlog — запускает task gate (build/vet/lint/gofmt/test/флаки/race/покрытие изменённых строк/миграции/образцы конфига/секреты/данные о здоровье в индексе/уязвимости) и интерпретирует вывод. Отличает новые отказы от унаследованных, находит отсутствующую верификацию (изменённые строки без покрытия, конкурентность без теста, флаки). Пока гейт красный, опиниативные проходы не запускаются. Первый проход конвейера review-pipeline, обязателен во всех профилях. +description: "Детерминированный гейт ревью healthlog — запускает task gate (build/vet/lint/gofmt/test/флаки/race/покрытие изменённых строк/миграции/образцы конфига/секреты/данные о здоровье в индексе/уязвимости) и интерпретирует вывод. Отличает новые отказы от унаследованных, находит отсутствующую верификацию (изменённые строки без покрытия, конкурентность без теста, флаки). Пока гейт красный, опиниативные проходы не запускаются. Первый проход конвейера review-pipeline, обязателен во всех профилях." tools: Bash, Read, Grep, Glob +model: sonnet color: red --- diff --git a/.claude/agents/healthlog-review-idiom.md b/.claude/agents/healthlog-review-idiom.md index 2786c98..6e4cf76 100644 --- a/.claude/agents/healthlog-review-idiom.md +++ b/.claude/agents/healthlog-review-idiom.md @@ -1,7 +1,8 @@ --- name: healthlog-review-idiom -description: Generative-проход ревью healthlog — заземляет «идиоматичность» на конкретику: какая конструкция stdlib ближе всего по форме к решаемой задаче (http.Server, encoding/json, io.Reader и io.LimitReader, compress/gzip, sql.DB/Rows, bufio.Scanner, context, errors.Is/As/Join, sync.Once, time.Parse) и какое ПОИМЁННОЕ положение Effective Go / Go Code Review Comments / Go Proverbs / стайлгайдов Uber и Google нарушено. Ссылка обязана быть на конкретное положение, а не на источник целиком. Различает «идиоматично» и «распространено». Только чтение. +description: "Generative-проход ревью healthlog — заземляет «идиоматичность» на конкретику: какая конструкция stdlib ближе всего по форме к решаемой задаче (http.Server, encoding/json, io.Reader и io.LimitReader, compress/gzip, sql.DB/Rows, bufio.Scanner, context, errors.Is/As/Join, sync.Once, time.Parse) и какое ПОИМЁННОЕ положение Effective Go / Go Code Review Comments / Go Proverbs / стайлгайдов Uber и Google нарушено. Ссылка обязана быть на конкретное положение, а не на источник целиком. Различает «идиоматично» и «распространено». Только чтение." tools: Read, Grep, Glob, Bash +model: opus color: purple --- diff --git a/.claude/agents/healthlog-review-negative.md b/.claude/agents/healthlog-review-negative.md index 6eedb1a..d15b87c 100644 --- a/.claude/agents/healthlog-review-negative.md +++ b/.claude/agents/healthlog-review-negative.md @@ -1,7 +1,8 @@ --- name: healthlog-review-negative -description: Generative-проход ревью healthlog о негативном пространстве — не «что не так», а чего НЕТ и что ЛИШНЕЕ: что есть в зрелой реализации такого узла и отсутствует здесь; хватит ли сигналов владельцу, когда поток молча оборвётся ночью; что опытный человек удалил бы (слои с единственной реализацией, интерфейсы ради моков, незапрошенная конфигурируемость, подстраховка поверх подстраховки); пять вопросов второго инженера, ответ на которые не следует из кода. Только чтение. +description: "Generative-проход ревью healthlog о негативном пространстве — не «что не так», а чего НЕТ и что ЛИШНЕЕ: что есть в зрелой реализации такого узла и отсутствует здесь; хватит ли сигналов владельцу, когда поток молча оборвётся ночью; что опытный человек удалил бы (слои с единственной реализацией, интерфейсы ради моков, незапрошенная конфигурируемость, подстраховка поверх подстраховки); пять вопросов второго инженера, ответ на которые не следует из кода. Только чтение." tools: Read, Grep, Glob, Bash +model: opus color: purple --- diff --git a/.claude/agents/healthlog-review-ops.md b/.claude/agents/healthlog-review-ops.md index f28e18d..f7bfd34 100644 --- a/.claude/agents/healthlog-review-ops.md +++ b/.claude/agents/healthlog-review-ops.md @@ -1,7 +1,8 @@ --- name: healthlog-review-ops -description: Эксплуатационный проход ревью healthlog — пишет постмортем «это упало через неделю на rivendell» от симптома у владельца к строке кода. Обязательные вопросы: рост объёма, деградация окружения (диск, SQLite, Caddy, клиент HAE), повторная и одновременная доставка, частичный откат при двух версиях, миграция под непрерывным потоком, отмена контекста на середине, наблюдаемость и тишина в потоке. Формулирует условиями («если объект за час больше N точек»), а не утверждениями — реального профиля нагрузки не знает. Только чтение. +description: "Эксплуатационный проход ревью healthlog — пишет постмортем «это упало через неделю на rivendell» от симптома у владельца к строке кода. Обязательные вопросы: рост объёма, деградация окружения (диск, SQLite, Caddy, клиент HAE), повторная и одновременная доставка, частичный откат при двух версиях, миграция под непрерывным потоком, отмена контекста на середине, наблюдаемость и тишина в потоке. Формулирует условиями («если объект за час больше N точек»), а не утверждениями — реального профиля нагрузки не знает. Только чтение." tools: Read, Grep, Glob, Bash +model: sonnet color: yellow --- diff --git a/.claude/agents/healthlog-review-reimpl.md b/.claude/agents/healthlog-review-reimpl.md index 84eab91..80f5847 100644 --- a/.claude/agents/healthlog-review-reimpl.md +++ b/.claude/agents/healthlog-review-reimpl.md @@ -1,7 +1,8 @@ --- name: healthlog-review-reimpl -description: Самый дорогой и самый ценный generative-проход ревью healthlog — получает спеку и контракты, пишет собственную реализацию в tmp/, НЕ ОТКРЫВАЯ существующую, и только потом диффит по решениям (декомпозиция, где обрабатываются ошибки, что вынесено в интерфейс, владение данными точки, протяжка context, модель конкурентности). Единственный проход, который системно достаёт «не знаю, чего не знаю». Существующий код не меняет. +description: "Самый дорогой и самый ценный generative-проход ревью healthlog — получает спеку и контракты, пишет собственную реализацию в tmp/, НЕ ОТКРЫВАЯ существующую, и только потом диффит по решениям (декомпозиция, где обрабатываются ошибки, что вынесено в интерфейс, владение данными точки, протяжка context, модель конкурентности). Единственный проход, который системно достаёт «не знаю, чего не знаю». Существующий код не меняет." tools: Read, Grep, Glob, Bash, Write +model: fable color: purple --- diff --git a/.claude/agents/healthlog-review-rubric.md b/.claude/agents/healthlog-review-rubric.md index f55455c..3cfd0b3 100644 --- a/.claude/agents/healthlog-review-rubric.md +++ b/.claude/agents/healthlog-review-rubric.md @@ -1,7 +1,8 @@ --- name: healthlog-review-rubric -description: Generative-проход ревью healthlog — сперва, НЕ ВИДЯ КОДА, порождает 8–12 проверяемых свойств, по которым сильный Go-инженер судит узел такого назначения (разбор пакета HAE, HTTP-хендлер приёма, обработчик Read API, репозиторий часовых объектов, файловый архив с ретеншеном, CLI-команда import/reindex, адаптер MCP), и только потом читает код и оценивает по этой рубрике. Достаёт слой, которого нет ни в одной конвенции. Годится и до кода (профиль design) — тогда рубрика становится приёмочными критериями. Только чтение. +description: "Generative-проход ревью healthlog — сперва, НЕ ВИДЯ КОДА, порождает 8–12 проверяемых свойств, по которым сильный Go-инженер судит узел такого назначения (разбор пакета HAE, HTTP-хендлер приёма, обработчик Read API, репозиторий часовых объектов, файловый архив с ретеншеном, CLI-команда import/reindex, адаптер MCP), и только потом читает код и оценивает по этой рубрике. Достаёт слой, которого нет ни в одной конвенции. Годится и до кода (профиль design) — тогда рубрика становится приёмочными критериями. Только чтение." tools: Read, Grep, Glob, Bash +model: fable color: purple --- diff --git a/.claude/agents/healthlog-review-specs.md b/.claude/agents/healthlog-review-specs.md index c89e8e8..c384f48 100644 --- a/.claude/agents/healthlog-review-specs.md +++ b/.claude/agents/healthlog-review-specs.md @@ -1,7 +1,8 @@ --- name: healthlog-review-specs -description: Сверка изменения healthlog с дельта-спеками OpenSpec в обе стороны — spec→code (каждое требование реализовано и подтверждено тестом) и, что важнее, code→spec (поведение, которое код имеет, а спека не заказывала: тихие ветки, самодеятельные дефолты, проглоченные ошибки, отброшенные поля точки, ретраи «на всякий случай»). Плюс границы спеки — что она не определяет и что пришлось домыслить. Работает в двух режимах: дизайн/спеки ДО кода и код против спек ПОСЛЕ apply. Только чтение. +description: "Сверка изменения healthlog с дельта-спеками OpenSpec в обе стороны — spec→code (каждое требование реализовано и подтверждено тестом) и, что важнее, code→spec (поведение, которое код имеет, а спека не заказывала: тихие ветки, самодеятельные дефолты, проглоченные ошибки, отброшенные поля точки, ретраи «на всякий случай»). Плюс границы спеки — что она не определяет и что пришлось домыслить. Работает в двух режимах: дизайн/спеки ДО кода и код против спек ПОСЛЕ apply. Только чтение." tools: Read, Grep, Glob, Bash +model: opus color: cyan --- diff --git a/.claude/agents/healthlog-review-triage.md b/.claude/agents/healthlog-review-triage.md index 8251df5..c44ec0e 100644 --- a/.claude/agents/healthlog-review-triage.md +++ b/.claude/agents/healthlog-review-triage.md @@ -1,7 +1,8 @@ --- name: healthlog-review-triage -description: Обязательный финальный проход конвейера ревью healthlog — единственный, кто агрегирует. Дедуплицирует находки по причине, добывает оракул для critical/major (пишет падающий тест, гоняет разбор на реальном пакете из testdata, выполняет команду), понижает неподтверждённое до гипотез, отсеивает вкусовщину, ранжирует по ущербу × вероятности и режет до 7 пунктов. Помечает каждую находку «инлайн» или «развилка» для оркестратора. Формирует итоговый отчёт с обязательной секцией границ покрытия. +description: "Обязательный финальный проход конвейера ревью healthlog — единственный, кто агрегирует. Дедуплицирует находки по причине, добывает оракул для critical/major (пишет падающий тест, гоняет разбор на реальном пакете из testdata, выполняет команду), понижает неподтверждённое до гипотез, отсеивает вкусовщину, ранжирует по ущербу × вероятности и режет до 7 пунктов. Помечает каждую находку «инлайн» или «развилка» для оркестратора. Формирует итоговый отчёт с обязательной секцией границ покрытия." tools: Read, Grep, Glob, Bash, Write +model: fable color: green --- diff --git a/.claude/skills/review-pipeline/SKILL.md b/.claude/skills/review-pipeline/SKILL.md index 168798f..3131d03 100644 --- a/.claude/skills/review-pipeline/SKILL.md +++ b/.claude/skills/review-pipeline/SKILL.md @@ -48,6 +48,34 @@ description: Конвейер ревью изменений healthlog — дет - **Приём не теряет доставку.** Код ответа отражает доставку, а не разбор; тело ложится на диск до разбора. +## Модель по проходу + +Следует из правила 2: чем больше работы делает детерминированный инструмент, +тем дешевле может быть модель; чем больше проход **порождает** критерий, тем +дороже. Модель задана во frontmatter каждого агента, менять её здесь не нужно. + +| Модель | Проходы | Почему | +|---|---|---| +| `sonnet` | gate, code, ops | вход структурный, критерий записан заранее | +| `opus` | specs, idiom, negative, adversary | суждение без опоры на инструмент | +| `fable` | rubric, reimpl, architecture, triage | качество порождённого и есть вся ценность | + +**Haiku не используется ни на одном проходе, и это не экономия наоборот.** +Дешёвая модель на опиниативном проходе даёт правдоподобные находки, которые +триаж обязан опровергать оракулом, — а это самая дорогая операция конвейера. +Механизируемая же работа здесь давно вынесена **ниже** модели: `gate.py`, +`diff-coverage.py`, `review-context.py`, `backlog.py` стоят ноль токенов. +Дешёвому проходу просто не осталось работы. + +Сюда же — почему `triage` на самой сильной модели, хотя он «всего лишь +агрегирует». Через него проходит всё, что оркестратор потом **реализует +молча**: ложноположительная находка становится кодом, потерянный `critical` — +дефектом. Ошибка триажа дороже ошибки любого отдельного прохода. + +Экономия при этом достигается не понижением модели, а **непуском прохода**: +`quick` — три стадии, `deep` — одиннадцать. Правило выбора профиля ниже и есть +главный рычаг стоимости. + ## Профили | Профиль | Когда | Стадии |