Files
healthlog/.claude/skills/task-pipeline/SKILL.md
T
av b2885c79e3 хранилище описано как свёртка по журналу событий
- экспорт Apple это снапшот всей истории, доставки после его даты — события
  поверх; состояние пересобирается как import(экспорт) + replay(доставки)
- отсюда ретеншен архива меняется с произвольных 14 дней на «до следующего
  проверенного экспорта» (~2 ГБ за квартал, измерено), а свёртка обязана быть
  детерминированной — воспроизведение строго по received_at
- названы границы модели: stateOfMind в экспорт не попадает вовсе, а верхние
  слои за периоды с удалёнными доставками не воскресают и досчитываться не
  должны — каталог обязан говорить это честно
2026-08-01 14:27:13 +03:00

15 KiB
Raw Blame History

name, description
name description
task-pipeline Автономно проводит задачу healthlog через полный цикл SDD — от выбора в беклоге до коммита (opsx explore→propose→ревью спек→apply→ревью кода→archive→чистка беклога). Использовать, когда пользователь просит взять/сделать задачу из беклога или довести идею до реализации.

Пайплайн задачи (healthlog)

Оркестратор одной задачи по Spec Driven Development: проводит её от беклога до коммита максимально автономно, привлекая пользователя только на реальных развилках (компромиссы, изменение scope, угроза инвариантам). Механику не согласовываем — делаем.

Перед стартом прочитай CLAUDE.md, а также README.md, docs/architecture.md, docs/conventions.md, если ещё не в контексте. Это тонкая обёртка над каноническими скиллами opsx:explore / opsx:propose / opsx:apply / opsx:archive — вызывай их через Skill, не переизобретай их шаги.

Что нельзя сломать

healthlog — хранилище данных о здоровье, у которого источник (телефон) шлёт непрерывно и молча. Отсюда особенности, которых нет в обычном сервисе:

  • Поток не останавливается на время задачи. Сервис поднят в контейнере (task up / task restart), данные в ./data. Перезапуск на пару секунд безопасен — дыру закроют средний и глубокий проходы синхронизации; а вот сломанный приём, оставленный работать, теряет данные необратимо.
  • Потерянная доставка не восстанавливается. Тело, не попавшее в архив, в журнал не попадает вовсе: телефон его не перешлёт. Разобранное же всегда пересобираемо свёрткой, поэтому цена ошибки разбора и цена ошибки приёма различаются на порядок. Любая правка разбора, слияния или вывода слоя — это deep-профиль ревью, без исключений.
  • Данные чувствительны. Ничего из ./data не попадает ни в git, ни в логи выше DEBUG, ни в вывод агента. Гейт проверяет первое механически (no-health-data), остальное — на тебе.
  • Разведка уже проведена. docs/local-research.md — 46 находок на живом потоке, половина расходится с документацией HAE. Проверь там, прежде чем строить догадку о формате: скорее всего вопрос уже закрыт измерением.

Принцип автономности

Зови пользователя (через AskUserQuestion) только когда решение реально его:

  • Выбор задачи, если он не задан явно.
  • Развилки грумминга на explore: несколько равнозначных направлений, спорный scope, продуктовый компромисс.
  • Замечания ревью спек, требующие выбора: смена подхода, урезание/расширение scope, риск инварианту хранения данных.
  • Всё остальное — механика: делаем без спроса. Мелкие замечания ревью чиним инлайн, не логируем.

Стиль правок — заточка под проект и конвенции, right-size, без золочения.

Шаги

1. Выбрать / прочитать задачу

  • Если задача задана (slug, файл в docs/backlog/ или описание) — прочитай её файл и связанные спеки/черновики.
  • Если не задана — покажи топ-кандидатов из docs/backlog/README.md (высокий приоритет, не [idea]) через AskUserQuestion и дай выбрать.
  • Задача с префиксом [idea] (ещё без решения «делаем») — сперва обязательно через explore (шаг 2), там она либо становится задачей, либо остаётся идеей.

Формат файла задачи и индекса держит скилл backlog — здесь мы беклог только читаем. Если по ходу выбора вскрылось, что задача устарела, дублируется или разрослась в эпик, это работа для скилла backlog, а не для пайплайна.

Оцени тривиальность (влияет на шаг 4):

  • Тривиальная — локальная правка без изменения поведения/спек/схемы БД, очевидное решение. Explore и ревью спек пропускаем.
  • Нетривиальная — новое/изменённое поведение, дизайн-развилки, затрагивает инварианты, схему БД или несколько capability. Полный цикл.

2. (Опц.) Груммить идею — opsx:explore

Только для [idea]-задач или когда постановка мутная. Вызови Skill opsx:explore. Развилки грумминга — на пользователя (AskUserQuestion). Выход: ясная постановка, готовая к propose. В explore не пишем код.

3. Завести change — opsx:propose

Вызови Skill opsx:propose. Получаем proposal.md, дизайн (для нетривиальных), дельта-спеки (ADDED/MODIFIED/REMOVED Requirements), tasks.md. Каждое ### Requirement содержит SHALL/MUST; структурные заголовки английские, сценарии GIVEN/WHEN/THEN. Прогони openspec validate --strict <id>.

4. (Нетривиальная) Ревью предложения — профиль design, ДО кода

Первый чекпоинт ревью-процесса. Вызови Skill review-pipeline с профилем design и ссылкой на change <id>. Он запустит healthlog-review-specs (режим «дизайн/спеки ДО кода»), healthlog-review-rubric (фаза 1: приёмочные критерии для задуманного узла), healthlog-review-idiom и healthlog-review-architecture по предложению.

Смысл профиля: архитектурная находка на готовом коде стоит переписывания и потому игнорируется — та же находка здесь стоит абзаца обсуждения. Рубрику из healthlog-review-rubric перенеси в tasks.md как приёмочные критерии.

5. Отработать замечания ревью предложения

  • Мелочь и явные улучшения — правь сам в спеках/дизайне.
  • Развилки (компромисс, scope, инвариант) — на пользователя (AskUserQuestion).
  • После правок перепрогони openspec validate --strict <id>.

6. Написать код — opsx:apply

Вызови Skill opsx:apply для реализации tasks.md. Код по конвенциям docs/conventions.md: ошибки stdlib с %w/errors.Is, логи только slog без секретов и тел запросов, время в UTC через store.Now(), ULID через internal/ident, миграции goose. Меняешь схему — обнови ER-схему docs/database.md в том же change (гейт это проверяет).

Прогони task gate и добейся зелёного — он же гейт следующего шага.

Поведенческая верификация. Если задача меняет реальное поведение (новый эндпоинт, разбор входа, схема БД, форма ответа) — зелёных юнит-тестов мало. Подними изменение вживую: task restart, затем прогони сценарий по настоящим данным из ./data (89+ доставок реального потока) или скриптом из tmp/research/. Пропусти только для чисто внутренних правок без наблюдаемого рантайма.

Сервис не оставляем лежать. Если task restart упал — почини или откати до конца шага: телефон продолжает слать всё это время.

7. Ревью кода — Skill review-pipeline

Второй чекпоинт. Вызови Skill review-pipeline, дав ссылку на change <id>, базу диффа и профиль. Профиль выбирается по факту изменения, а не по ощущению важности (правило — в самом скилле):

  • миграция, новый пакет, контракт Read API или MCP, правило слияния точек или вывод слоя → deep;
  • иначе меняется поведение, видимое снаружи → standard;
  • иначе (багфикс, локальная правка, доки) → quick.

Скилл сам гоняет гейт, нужные проходы и обязательный триаж. Возвращает отчёт с потолком 7 пунктов, разметкой Действие: инлайн | развилка и секцией границ покрытия.

Отработай так же, как шаг 5: помеченное инлайн чини сам и не логируй, развилка — на пользователя через AskUserQuestion (вопрос уже сформулирован триажем). После правок — снова task gate.

Границы покрытия из отчёта не выбрасывай — они уезжают в финальный доклад (шаг 10) сжатой строкой. Отчёт, из которого исчезло «что проверить было невозможно», превращается в ложное ощущение проверенности.

8. Архивировать — opsx:archive

Вызови Skill opsx:archive: change уезжает в openspec/changes/archive/, дельты вливаются в openspec/specs/.

9. Закрыть беклог и синк доков

Ревью выполненного — до чистки. Затем:

  • Удали файл задачи docs/backlog/<slug>.md и строку в docs/backlog/README.md. Реализованное не держим в беклоге — у него есть коммит и спека.
  • Суть переехавшего решения — в docs/architecture.md, если ещё не там.
  • Менялась структура БД — убедись, что docs/database.md обновлён в этом же change.
  • Новое, узнанное о формате HAE или о данных, — в docs/local-research.md очередной находкой. Это источник истины по формату, и он ценнее кода.
  • Проверь согласованность индекса командой check скилла backlog.

10. Коммит

Коммить в текущую ветку (git rev-parse --abbrev-ref HEAD), сам ветку не создавай и не переключай, ничего не пушь. При ручном запуске HEAD обычно на master — коммит идёт прямо в него, без feature-веток.

Сообщение — по-русски, по скиллу commit (первая строка отвечает «что сделано», тело списком 1–3 пункта, без трейлеров). Одна задача — один осмысленный коммит.

Готово — доложи пользователю кратко: что сделано, какие развилки решались, ссылка на архивный change. Плюс одна строка границ покрытия из отчёта ревью: какой профиль гонялся и что проверить было невозможно. Доклад без неё сообщает «проверено», не сообщая, что именно.

Тонкости

  • Не завязывайся на master и корень репо. Скилл работает в текущем worktree и на текущей ветке: не делай git checkout/switch, не создавай веток, не пушь.
  • Не пропускай openspec validate --strict перед архивацией.
  • Тривиальная задача: шаги 2 и 4 пропускаются; ревью кода (шаг 7) остаётся всегда, но в профиле quick.
  • Гейт блокирует: пока task gate красный, опиниативные проходы не запускаются. Чинить и перезапускать, а не «посмотреть заодно».
  • Если ревью предлагает крупную переработку — это развилка, не правь молча, вынеси пользователю.
  • Держи пользователя в цикле короткими репликами на переходах фаз, но не проси подтверждать механику.