diff --git a/.claude/agents/healthlog-review-triage.md b/.claude/agents/healthlog-review-triage.md index 236257a..8251df5 100644 --- a/.claude/agents/healthlog-review-triage.md +++ b/.claude/agents/healthlog-review-triage.md @@ -109,7 +109,7 @@ healthlog этот перевес сильнее обычного: сырой а трогается инвариант сохранности данных (дословность точки, состав координатного ключа, правило слияния, срок жизни архива, раздельность токенов), либо надо менять спеку. Формулируй готовым вопросом с 2–3 - вариантами: оркестратор передаст его человеку через `AskUserQuestion` почти + вариантами: оркестратор передаст его человеку блокером в беклог почти дословно. Сомневаешься — ставь `развилка`. Ошибка в сторону лишнего вопроса дешевле diff --git a/.claude/skills/review-pipeline/SKILL.md b/.claude/skills/review-pipeline/SKILL.md index 537ebc3..168798f 100644 --- a/.claude/skills/review-pipeline/SKILL.md +++ b/.claude/skills/review-pipeline/SKILL.md @@ -192,8 +192,9 @@ read-modify-write под конкурентными доставками, а т ## Что происходит с находками дальше - Оркестратор чинит помеченное `Действие: инлайн` и **не логирует мелочь**. -- `Действие: развилка` — на человека через `AskUserQuestion`, вопросом с - вариантами. +- `Действие: развилка` — блокером в секцию `блокеры` беклога, вопросом с + вариантами и ценой каждого. Оркестратор не останавливается: он урезает + изменение до остатка и доводит его. - Находка не для этого мерджа, но реальная (отложенный `major`, развилка, решённая «потом») — не теряется: заводится задачей через скилл `backlog` (интейк из ревью), с оракулом и провенансом в теле. Мелочь класса `nit` — в diff --git a/.claude/skills/review-pipeline/references/finding-contract.md b/.claude/skills/review-pipeline/references/finding-contract.md index 6e27ccc..c250b1a 100644 --- a/.claude/skills/review-pipeline/references/finding-contract.md +++ b/.claude/skills/review-pipeline/references/finding-contract.md @@ -77,7 +77,8 @@ `инлайн` — оркестратор чинит сам, не спрашивая и не логируя. `развилка` — цена исправления сопоставима с переработкой, либо выбор меняет scope, либо решение -трогает инвариант: идёт человеку через `AskUserQuestion` вопросом с вариантами. +трогает инвариант: уезжает блокером в беклог вопросом с вариантами и ценой +каждого, а работа продолжается на остатке. Потребитель отчёта — оркестратор, который **реализует прочитанное**. Поэтому потолок в 7 пунктов — не забота о внимании читателя, а защита кодовой базы от diff --git a/.claude/skills/task-pipeline/SKILL.md b/.claude/skills/task-pipeline/SKILL.md index 75db08e..bc05918 100644 --- a/.claude/skills/task-pipeline/SKILL.md +++ b/.claude/skills/task-pipeline/SKILL.md @@ -38,15 +38,39 @@ healthlog — хранилище данных о здоровье, у котор ## Принцип автономности -Зови пользователя (через **AskUserQuestion**) только когда решение реально его: +**Умолчание — делать, а не спрашивать.** Задача доводится до коммита без +участия человека; предполагается, что так пройдёт большинство задач. -- **Выбор задачи**, если он не задан явно. -- **Развилки грумминга** на explore: несколько равнозначных направлений, - спорный scope, продуктовый компромисс. -- **Замечания ревью спек**, требующие выбора: смена подхода, урезание/расширение - scope, риск инварианту хранения данных. -- Всё остальное — механика: делаем без спроса. Мелкие замечания ревью чиним - инлайн, не логируем. +Наткнулся на вопрос, который решать не тебе, — **не останавливайся и не +спрашивай**. Вынь его блокером и продолжай: + +1. Заведи пункт в секции `блокеры` беклога: + `backlog.py add --slug --priority блокеры --hook <что заблокировано>`. + Тело отвечает на три вопроса: **что именно решить**, **какие есть варианты + и цена каждого**, **что стоит, пока решения нет**. Плюс твоя рекомендация — + человек чаще соглашается, чем выбирает заново, и готовое суждение экономит + ему весь контекст. +2. **Переформулируй задачу на остаток** — то, что делается без этого решения. + Впиши в её тело ссылку на блокер и границу: докуда доводим сейчас. +3. Доведи остаток до конца и закоммить. Задача не «висит на вопросе», она + сделана в объявленных границах. + +Если полезного остатка нет вовсе — блокер заводится, задача остаётся на месте +со ссылкой на него, и берётся следующая. Это редкий случай; чаще остаток есть. + +Блокеры разбираются пачками, а не по одному: прерывать поток ради каждого +дороже, чем накопить. + +### Когда всё-таки спрашивать + +Узко и по другому основанию — не «сложное решение», а **необратимое действие**: + +- деплой, выкладка наружу, смена публичного адреса или токенов; +- удаление или перезапись данных в `./data`, включая подрезку архива; +- всё, что уходит за пределы машины. + +Здесь ошибка не откатывается коммитом, поэтому спрашиваем даже когда решение +кажется очевидным. Развилка в дизайне — блокер; необратимое действие — вопрос. Стиль правок — заточка под проект и конвенции, right-size, без золочения. @@ -56,8 +80,9 @@ healthlog — хранилище данных о здоровье, у котор - Если задача задана (slug, файл в `docs/backlog/` или описание) — прочитай её файл и связанные спеки/черновики. -- Если не задана — покажи топ-кандидатов из `docs/backlog/README.md` (высокий - приоритет, не `[idea]`) через **AskUserQuestion** и дай выбрать. +- Если не задана — выбирай сам: верхняя секция приоритета, не `[idea]`, не + заблокированная целиком. Из равных бери ту, что разблокирует больше других. + Выбор объявляешь в докладе, а не согласовываешь заранее. - Задача с префиксом `[idea]` (ещё без решения «делаем») — сперва обязательно через explore (шаг 2), там она либо становится задачей, либо остаётся идеей. @@ -74,8 +99,9 @@ healthlog — хранилище данных о здоровье, у котор ### 2. (Опц.) Груммить идею — `opsx:explore` Только для `[idea]`-задач или когда постановка мутная. Вызови Skill -`opsx:explore`. Развилки грумминга — на пользователя (AskUserQuestion). Выход: -ясная постановка, готовая к propose. **В explore не пишем код.** +`opsx:explore`. Развилку грумминга не выноси на человека — заведи блокером и +груми остаток. Выход: ясная постановка, готовая к propose. **В explore не +пишем код.** ### 3. Завести change — `opsx:propose` @@ -99,7 +125,8 @@ healthlog — хранилище данных о здоровье, у котор ### 5. Отработать замечания ревью предложения - Мелочь и явные улучшения — правь сам в спеках/дизайне. -- Развилки (компромисс, scope, инвариант) — на пользователя (AskUserQuestion). +- Развилки (компромисс, scope, инвариант) — блокером, спеки урезаются на + остаток. - После правок перепрогони `openspec validate --strict `. ### 6. Написать код — `opsx:apply` @@ -138,8 +165,8 @@ healthlog — хранилище данных о здоровье, у котор покрытия. Отработай так же, как шаг 5: помеченное `инлайн` чини сам и не логируй, -`развилка` — на пользователя через AskUserQuestion (вопрос уже сформулирован -триажем). После правок — снова `task gate`. +`развилка` — блокером в беклог (вопрос уже сформулирован триажем, его остаётся +перенести). После правок — снова `task gate`. **Границы покрытия из отчёта не выбрасывай** — они уезжают в финальный доклад (шаг 10) сжатой строкой. Отчёт, из которого исчезло «что проверить было @@ -173,8 +200,8 @@ healthlog — хранилище данных о здоровье, у котор сделано», тело списком 1–3 пункта, без трейлеров). Одна задача — один осмысленный коммит. -Готово — доложи пользователю кратко: что сделано, какие развилки решались, -ссылка на архивный change. **Плюс одна строка границ покрытия** из отчёта +Готово — доложи пользователю кратко: что сделано, какие блокеры заведены и +чем ограничен остаток, ссылка на архивный change. **Плюс одна строка границ покрытия** из отчёта ревью: какой профиль гонялся и что проверить было невозможно. Доклад без неё сообщает «проверено», не сообщая, что именно. @@ -188,7 +215,7 @@ healthlog — хранилище данных о здоровье, у котор всегда, но в профиле `quick`. - Гейт блокирует: пока `task gate` красный, опиниативные проходы не запускаются. Чинить и перезапускать, а не «посмотреть заодно». -- Если ревью предлагает крупную переработку — это развилка, не правь молча, - вынеси пользователю. +- Если ревью предлагает крупную переработку — это развилка: не правь молча и + не спрашивай, заведи блокером и доведи остаток. - Держи пользователя в цикле короткими репликами на переходах фаз, но не проси подтверждать механику. diff --git a/CLAUDE.md b/CLAUDE.md index f4cdc78..7381c1c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -84,6 +84,13 @@ Module path — `git.vakhrushev.me/av/healthlog`. `opsx:archive` → чистка беклога → коммит. Ревью — скилл `review-pipeline`, проходы — агенты `healthlog-review-*`. +**Действуем автономно.** Умолчание — делать, а не спрашивать. Вопрос, который +решать не мне, **вынимается блокером** в секцию `блокеры` беклога (что решить, +варианты с ценой каждого, что стоит без решения, рекомендация), задача +переформулируется на остаток, остаток доводится до коммита. Блокеры +разбираются пачками. Спрашиваем только про **необратимое**: деплой, выкладку +наружу, удаление или перезапись данных в `./data`. + Гейт блокирует: пока `task gate` красный, опиниативные проходы ревью не запускаются. diff --git a/docs/backlog/README.md b/docs/backlog/README.md index 8b6425c..03787e0 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -4,6 +4,15 @@ Приоритет — грубая оценка «ценность / стоимость». Спекулятивные задачи помечены `[idea]` в заголовке. Ведётся скиллом `backlog`. +**Блокеры** — вопросы, вынутые из задач. Работа над задачей идёт автономно; если +внутри обнаружился вопрос, который решать не мне, он **вынимается** отдельным +пунктом сюда, а сама задача переформулируется на остаток и продолжается. Пункт +блокера отвечает на три вопроса: что именно решить, какие есть варианты с ценой +каждого, и что заблокировано, пока решения нет. Разбираются пачками, а не по +одному — прерывать поток ради каждого дороже, чем накопить. + +## блокеры + ## высокий - [Разбор метрик в часовые объекты](razbor-metrik-v-obekty.md) — Доставки копятся непрозрачными телами — точек в хранилище нет вовсе, всё остальное упирается в это - [Тренировки и секции с собственными id](trenirovki-i-zapisi.md) — Тренировки с геотреком и состояние разума приходят, но не разбираются — без них не закрыть ни трекер, ни агента-медика