задачи ведутся автономно, вопросы выносятся блокерами

- умолчание — делать, а не спрашивать: развилка вынимается пунктом в секцию
  `блокеры` беклога, задача переформулируется на остаток и доводится до коммита
- спрашиваем только про необратимое: деплой, выкладку наружу, удаление данных
- находка ревью с пометкой «развилка» больше не останавливает работу, а
  уезжает блокером с вариантами и ценой каждого
This commit is contained in:
av
2026-08-01 14:33:06 +03:00
parent b2885c79e3
commit 7998c6b86e
6 changed files with 68 additions and 23 deletions
+1 -1
View File
@@ -109,7 +109,7 @@ healthlog этот перевес сильнее обычного: сырой а
трогается инвариант сохранности данных (дословность точки, состав трогается инвариант сохранности данных (дословность точки, состав
координатного ключа, правило слияния, срок жизни архива, раздельность координатного ключа, правило слияния, срок жизни архива, раздельность
токенов), либо надо менять спеку. Формулируй готовым вопросом с 2–3 токенов), либо надо менять спеку. Формулируй готовым вопросом с 2–3
вариантами: оркестратор передаст его человеку через `AskUserQuestion` почти вариантами: оркестратор передаст его человеку блокером в беклог почти
дословно. дословно.
Сомневаешься — ставь `развилка`. Ошибка в сторону лишнего вопроса дешевле Сомневаешься — ставь `развилка`. Ошибка в сторону лишнего вопроса дешевле
+3 -2
View File
@@ -192,8 +192,9 @@ read-modify-write под конкурентными доставками, а т
## Что происходит с находками дальше ## Что происходит с находками дальше
- Оркестратор чинит помеченное `Действие: инлайн` и **не логирует мелочь**. - Оркестратор чинит помеченное `Действие: инлайн` и **не логирует мелочь**.
- `Действие: развилка`на человека через `AskUserQuestion`, вопросом с - `Действие: развилка`блокером в секцию `блокеры` беклога, вопросом с
вариантами. вариантами и ценой каждого. Оркестратор не останавливается: он урезает
изменение до остатка и доводит его.
- Находка не для этого мерджа, но реальная (отложенный `major`, развилка, - Находка не для этого мерджа, но реальная (отложенный `major`, развилка,
решённая «потом») — не теряется: заводится задачей через скилл `backlog` решённая «потом») — не теряется: заводится задачей через скилл `backlog`
(интейк из ревью), с оракулом и провенансом в теле. Мелочь класса `nit` — в (интейк из ревью), с оракулом и провенансом в теле. Мелочь класса `nit` — в
@@ -77,7 +77,8 @@
`инлайн` — оркестратор чинит сам, не спрашивая и не логируя. `развилка` — цена `инлайн` — оркестратор чинит сам, не спрашивая и не логируя. `развилка` — цена
исправления сопоставима с переработкой, либо выбор меняет scope, либо решение исправления сопоставима с переработкой, либо выбор меняет scope, либо решение
трогает инвариант: идёт человеку через `AskUserQuestion` вопросом с вариантами. трогает инвариант: уезжает блокером в беклог вопросом с вариантами и ценой
каждого, а работа продолжается на остатке.
Потребитель отчёта — оркестратор, который **реализует прочитанное**. Поэтому Потребитель отчёта — оркестратор, который **реализует прочитанное**. Поэтому
потолок в 7 пунктов — не забота о внимании читателя, а защита кодовой базы от потолок в 7 пунктов — не забота о внимании читателя, а защита кодовой базы от
+46 -19
View File
@@ -38,15 +38,39 @@ healthlog — хранилище данных о здоровье, у котор
## Принцип автономности ## Принцип автономности
Зови пользователя (через **AskUserQuestion**) только когда решение реально его: **Умолчание — делать, а не спрашивать.** Задача доводится до коммита без
участия человека; предполагается, что так пройдёт большинство задач.
- **Выбор задачи**, если он не задан явно. Наткнулся на вопрос, который решать не тебе, — **не останавливайся и не
- **Развилки грумминга** на explore: несколько равнозначных направлений, спрашивай**. Вынь его блокером и продолжай:
спорный scope, продуктовый компромисс.
- **Замечания ревью спек**, требующие выбора: смена подхода, урезание/расширение 1. Заведи пункт в секции `блокеры` беклога:
scope, риск инварианту хранения данных. `backlog.py add --slug <slug> --priority блокеры --hook <что заблокировано>`.
- Всё остальное — механика: делаем без спроса. Мелкие замечания ревью чиним Тело отвечает на три вопроса: **что именно решить**, **какие есть варианты
инлайн, не логируем. и цена каждого**, **что стоит, пока решения нет**. Плюс твоя рекомендация —
человек чаще соглашается, чем выбирает заново, и готовое суждение экономит
ему весь контекст.
2. **Переформулируй задачу на остаток** — то, что делается без этого решения.
Впиши в её тело ссылку на блокер и границу: докуда доводим сейчас.
3. Доведи остаток до конца и закоммить. Задача не «висит на вопросе», она
сделана в объявленных границах.
Если полезного остатка нет вовсе — блокер заводится, задача остаётся на месте
со ссылкой на него, и берётся следующая. Это редкий случай; чаще остаток есть.
Блокеры разбираются пачками, а не по одному: прерывать поток ради каждого
дороже, чем накопить.
### Когда всё-таки спрашивать
Узко и по другому основанию — не «сложное решение», а **необратимое действие**:
- деплой, выкладка наружу, смена публичного адреса или токенов;
- удаление или перезапись данных в `./data`, включая подрезку архива;
- всё, что уходит за пределы машины.
Здесь ошибка не откатывается коммитом, поэтому спрашиваем даже когда решение
кажется очевидным. Развилка в дизайне — блокер; необратимое действие — вопрос.
Стиль правок — заточка под проект и конвенции, right-size, без золочения. Стиль правок — заточка под проект и конвенции, right-size, без золочения.
@@ -56,8 +80,9 @@ healthlog — хранилище данных о здоровье, у котор
- Если задача задана (slug, файл в `docs/backlog/` или описание) — прочитай её - Если задача задана (slug, файл в `docs/backlog/` или описание) — прочитай её
файл и связанные спеки/черновики. файл и связанные спеки/черновики.
- Если не задана — покажи топ-кандидатов из `docs/backlog/README.md` (высокий - Если не задана — выбирай сам: верхняя секция приоритета, не `[idea]`, не
приоритет, не `[idea]`) через **AskUserQuestion** и дай выбрать. заблокированная целиком. Из равных бери ту, что разблокирует больше других.
Выбор объявляешь в докладе, а не согласовываешь заранее.
- Задача с префиксом `[idea]` (ещё без решения «делаем») — сперва обязательно - Задача с префиксом `[idea]` (ещё без решения «делаем») — сперва обязательно
через explore (шаг 2), там она либо становится задачей, либо остаётся идеей. через explore (шаг 2), там она либо становится задачей, либо остаётся идеей.
@@ -74,8 +99,9 @@ healthlog — хранилище данных о здоровье, у котор
### 2. (Опц.) Груммить идею — `opsx:explore` ### 2. (Опц.) Груммить идею — `opsx:explore`
Только для `[idea]`-задач или когда постановка мутная. Вызови Skill Только для `[idea]`-задач или когда постановка мутная. Вызови Skill
`opsx:explore`. Развилки грумминга — на пользователя (AskUserQuestion). Выход: `opsx:explore`. Развилку грумминга не выноси на человека — заведи блокером и
ясная постановка, готовая к propose. **В explore не пишем код.** груми остаток. Выход: ясная постановка, готовая к propose. **В explore не
пишем код.**
### 3. Завести change — `opsx:propose` ### 3. Завести change — `opsx:propose`
@@ -99,7 +125,8 @@ healthlog — хранилище данных о здоровье, у котор
### 5. Отработать замечания ревью предложения ### 5. Отработать замечания ревью предложения
- Мелочь и явные улучшения — правь сам в спеках/дизайне. - Мелочь и явные улучшения — правь сам в спеках/дизайне.
- Развилки (компромисс, scope, инвариант) — на пользователя (AskUserQuestion). - Развилки (компромисс, scope, инвариант) — блокером, спеки урезаются на
остаток.
- После правок перепрогони `openspec validate --strict <id>`. - После правок перепрогони `openspec validate --strict <id>`.
### 6. Написать код — `opsx:apply` ### 6. Написать код — `opsx:apply`
@@ -138,8 +165,8 @@ healthlog — хранилище данных о здоровье, у котор
покрытия. покрытия.
Отработай так же, как шаг 5: помеченное `инлайн` чини сам и не логируй, Отработай так же, как шаг 5: помеченное `инлайн` чини сам и не логируй,
`развилка`на пользователя через AskUserQuestion (вопрос уже сформулирован `развилка`блокером в беклог (вопрос уже сформулирован триажем, его остаётся
триажем). После правок — снова `task gate`. перенести). После правок — снова `task gate`.
**Границы покрытия из отчёта не выбрасывай** — они уезжают в финальный доклад **Границы покрытия из отчёта не выбрасывай** — они уезжают в финальный доклад
(шаг 10) сжатой строкой. Отчёт, из которого исчезло «что проверить было (шаг 10) сжатой строкой. Отчёт, из которого исчезло «что проверить было
@@ -173,8 +200,8 @@ healthlog — хранилище данных о здоровье, у котор
сделано», тело списком 1–3 пункта, без трейлеров). Одна задача — один сделано», тело списком 1–3 пункта, без трейлеров). Одна задача — один
осмысленный коммит. осмысленный коммит.
Готово — доложи пользователю кратко: что сделано, какие развилки решались, Готово — доложи пользователю кратко: что сделано, какие блокеры заведены и
ссылка на архивный change. **Плюс одна строка границ покрытия** из отчёта чем ограничен остаток, ссылка на архивный change. **Плюс одна строка границ покрытия** из отчёта
ревью: какой профиль гонялся и что проверить было невозможно. Доклад без неё ревью: какой профиль гонялся и что проверить было невозможно. Доклад без неё
сообщает «проверено», не сообщая, что именно. сообщает «проверено», не сообщая, что именно.
@@ -188,7 +215,7 @@ healthlog — хранилище данных о здоровье, у котор
всегда, но в профиле `quick`. всегда, но в профиле `quick`.
- Гейт блокирует: пока `task gate` красный, опиниативные проходы не - Гейт блокирует: пока `task gate` красный, опиниативные проходы не
запускаются. Чинить и перезапускать, а не «посмотреть заодно». запускаются. Чинить и перезапускать, а не «посмотреть заодно».
- Если ревью предлагает крупную переработку — это развилка, не правь молча, - Если ревью предлагает крупную переработку — это развилка: не правь молча и
вынеси пользователю. не спрашивай, заведи блокером и доведи остаток.
- Держи пользователя в цикле короткими репликами на переходах фаз, но не проси - Держи пользователя в цикле короткими репликами на переходах фаз, но не проси
подтверждать механику. подтверждать механику.
+7
View File
@@ -84,6 +84,13 @@ Module path — `git.vakhrushev.me/av/healthlog`.
`opsx:archive` → чистка беклога → коммит. Ревью — скилл `review-pipeline`, `opsx:archive` → чистка беклога → коммит. Ревью — скилл `review-pipeline`,
проходы — агенты `healthlog-review-*`. проходы — агенты `healthlog-review-*`.
**Действуем автономно.** Умолчание — делать, а не спрашивать. Вопрос, который
решать не мне, **вынимается блокером** в секцию `блокеры` беклога (что решить,
варианты с ценой каждого, что стоит без решения, рекомендация), задача
переформулируется на остаток, остаток доводится до коммита. Блокеры
разбираются пачками. Спрашиваем только про **необратимое**: деплой, выкладку
наружу, удаление или перезапись данных в `./data`.
Гейт блокирует: пока `task gate` красный, опиниативные проходы ревью не Гейт блокирует: пока `task gate` красный, опиниативные проходы ревью не
запускаются. запускаются.
+9
View File
@@ -4,6 +4,15 @@
Приоритет — грубая оценка «ценность / стоимость». Спекулятивные Приоритет — грубая оценка «ценность / стоимость». Спекулятивные
задачи помечены `[idea]` в заголовке. Ведётся скиллом `backlog`. задачи помечены `[idea]` в заголовке. Ведётся скиллом `backlog`.
**Блокеры** — вопросы, вынутые из задач. Работа над задачей идёт автономно; если
внутри обнаружился вопрос, который решать не мне, он **вынимается** отдельным
пунктом сюда, а сама задача переформулируется на остаток и продолжается. Пункт
блокера отвечает на три вопроса: что именно решить, какие есть варианты с ценой
каждого, и что заблокировано, пока решения нет. Разбираются пачками, а не по
одному — прерывать поток ради каждого дороже, чем накопить.
## блокеры
## высокий ## высокий
- [Разбор метрик в часовые объекты](razbor-metrik-v-obekty.md) — Доставки копятся непрозрачными телами — точек в хранилище нет вовсе, всё остальное упирается в это - [Разбор метрик в часовые объекты](razbor-metrik-v-obekty.md) — Доставки копятся непрозрачными телами — точек в хранилище нет вовсе, всё остальное упирается в это
- [Тренировки и секции с собственными id](trenirovki-i-zapisi.md) — Тренировки с геотреком и состояние разума приходят, но не разбираются — без них не закрыть ни трекер, ни агента-медика - [Тренировки и секции с собственными id](trenirovki-i-zapisi.md) — Тренировки с геотреком и состояние разума приходят, но не разбираются — без них не закрыть ни трекер, ни агента-медика