Skip to content

feat(agent): нерассмотренные правила каталога видны в трекере - #1372

Open
ArtVsMark wants to merge 5 commits into
mainfrom
agent/rules-inbox
Open

feat(agent): нерассмотренные правила каталога видны в трекере#1372
ArtVsMark wants to merge 5 commits into
mainfrom
agent/rules-inbox

Conversation

@ArtVsMark

Copy link
Copy Markdown
Owner

Closes #1351

Что было не так

Каталог правил пополняется чужими сменами, а решение «принимаем ли мы это
правило и чем оно у нас держится» принимает проект. Зазор между появлением
правила и решением не был виден нигде: .rules/bindings.json честно писал
unreviewed, но по расписанию файл никто не открывает, а гейт полноты говорит
только «ответа нет вовсе» — про правило, ответ по которому есть и означает «не
дошли руки», он молчит.

Замер: 30 правил со статусом unreviewed плюс 10, появившихся после последней
сверки. Самому старому — пять дней, и узнать это можно было только вручную.

Что сделано

scripts/rules_inbox.py держит один постоянный issue: список правил без
решения и метрика.

Метрика — возраст, а не только число. Сколько дней самому старому
нерассмотренному: возраст растёт сам и показывает запущенность, тогда как число
показывает лишь объём и может годами стоять на месте, пока разбирают новые.

Два состояния различены. «Не рассмотрено» (ответ есть, решения нет) и
«ответа нет вовсе» (правило появилось после сверки) — разные вещи: второе роняет
гейт формата, поэтому такие строки уходят первыми.

Issue находится по скрытому маркеру в теле. Ни номер, ни заголовок для
этого не годятся: номер пришлось бы где-то хранить, а хранимое состояние
разъезжается ровно так же, как разъехался бы список задач в документе; заголовок
меняется вместе с числом в нём.

Пустые входящие не закрываются. Issue постоянный: следующее правило каталога
появится в нём само, и заводить его заново не придётся.

Кто запускает

tracker-guardrails.yml — тем же ночным прогоном, что и остальные проверки
трекера, сразу после клонирования каталога.

Проверка

  • показ на живом каталоге: 40 нерассмотренных, самому старому 5 дн.;
  • 11 тестов, сеть подменена: принятое правило во входящих не висит, пустой
    список говорит «разобрано всё» и остаётся открытым, отсутствие даты не ломает
    метрику, показ без --apply не делает ни одного вызова;
  • python scripts/preflight.py — чисто: 5385 passed, 98 skipped.

Чем закрывается #1351

Это последний из пяти пунктов. Ранее: .rules/bindings.json и гейт формата
(#1360), генератор указателя на bindings (#1345), обратная ссылка в
задачу-источник (#1371).

Работа сделана вместе: @ArtVsMark — постановка, решения и приёмка; Claude Code — реализация.

claude and others added 2 commits August 26, 2026 14:18
Closes #1351

## Что было не так

Каталог правил пополняется чужими сменами, а решение «принимаем ли мы это
правило и чем оно у нас держится» принимает проект. Зазор между появлением
правила и решением не был виден нигде: `.rules/bindings.json` честно писал
`unreviewed`, но по расписанию файл никто не открывает, а гейт полноты говорит
только «ответа нет вовсе» — про правило, ответ по которому есть и означает «не
дошли руки», он молчит.

Замер: 30 правил со статусом `unreviewed` плюс 10, появившихся после последней
сверки. Самому старому — пять дней, и узнать это можно было только вручную.

## Что сделано

`scripts/rules_inbox.py` держит **один постоянный issue**: список правил без
решения и метрика.

**Метрика — возраст, а не только число.** Сколько дней самому старому
нерассмотренному: возраст растёт сам и показывает запущенность, тогда как число
показывает лишь объём и может годами стоять на месте, пока разбирают новые.

**Два состояния различены.** «Не рассмотрено» (ответ есть, решения нет) и
«ответа нет вовсе» (правило появилось после сверки) — разные вещи: второе роняет
гейт формата, поэтому такие строки уходят первыми.

**Issue находится по скрытому маркеру в теле.** Ни номер, ни заголовок для
этого не годятся: номер пришлось бы где-то хранить, а хранимое состояние
разъезжается ровно так же, как разъехался бы список задач в документе; заголовок
меняется вместе с числом в нём.

**Пустые входящие не закрываются.** Issue постоянный: следующее правило каталога
появится в нём само, и заводить его заново не придётся.

## Кто запускает

`tracker-guardrails.yml` — тем же ночным прогоном, что и остальные проверки
трекера, сразу после клонирования каталога.

## Проверка

- показ на живом каталоге: 40 нерассмотренных, самому старому 5 дн.;
- 11 тестов, сеть подменена: принятое правило во входящих не висит, пустой
  список говорит «разобрано всё» и остаётся открытым, отсутствие даты не ломает
  метрику, показ без `--apply` не делает ни одного вызова;
- `python scripts/preflight.py` — чисто: 5385 passed, 98 skipped.

## Чем закрывается #1351

Это последний из пяти пунктов. Ранее: `.rules/bindings.json` и гейт формата
(#1360), генератор указателя на bindings (#1345), обратная ссылка в
задачу-источник (#1371).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com>
Конфликт позиционный: и защита main (#1296), и обратная ссылка правил (#1351)
дописывали шаг ночного прогона в одно место. Оба оставлены, логика ни одной
стороны не менялась.

Маркеры проверены прогоном: в YAML они дают не красный шаг, а прогон с нулём
джобов, и снаружи это читается как «почти всё прошло».

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com>
@ArtVsMark ArtVsMark added the merge-when-green Согласие смержить без автора: авто-мерж включится, как позеленеет label Aug 26, 2026
@ArtVsMark
ArtVsMark enabled auto-merge (squash) August 26, 2026 14:33
@claude claude Bot added area/ci CI/CD и скрипты (.github/, scripts/) area/docs Документация (docs/, README, CLAUDE.md) enhancement New feature or request labels Aug 26, 2026
@ArtVsMark ArtVsMark added the needs-rebase Конфликт с main: очередь пропускает, нужно ручное слияние label Aug 26, 2026
ArtVsMark and others added 3 commits August 26, 2026 18:14
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com>
…les-inbox

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/ci CI/CD и скрипты (.github/, scripts/) area/docs Документация (docs/, README, CLAUDE.md) enhancement New feature or request merge-when-green Согласие смержить без автора: авто-мерж включится, как позеленеет needs-rebase Конфликт с main: очередь пропускает, нужно ручное слияние

Projects

None yet

2 participants