Skip to content

feat(agent): задача знает, что породила правило каталога - #1371

Merged
ArtVsMark merged 1 commit into
mainfrom
agent/rules-backlink
Aug 26, 2026
Merged

feat(agent): задача знает, что породила правило каталога#1371
ArtVsMark merged 1 commit into
mainfrom
agent/rules-backlink

Conversation

@ArtVsMark

Copy link
Copy Markdown
Owner

Часть #1351 — обратная ссылка в задачу-источник (пункт 2 из пяти)

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

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

Замер: 67 правил каталога ссылаются на 54 наши задачи. Ни на одной из них об
этом не сказано.

Что сделано

scripts/link_rules_to_issues.py достраивает вторую сторону:

  • метка породило правило — видна в списке задач, то есть отвечает на
    вопрос «какие наши задачи дали правила» без чтения тел;
  • один комментарий с номерами правил и ссылками.

Источник — машинный экспорт каталога (export/rules.json) с полем trails, а не
разбор Markdown: это объявленный контракт каталога, а не наша догадка о его
формате.

Два свойства, без которых механизм вреден

Комментарий один. Идемпотентность держится скрытым маркером в теле, а не
совпадением текста: текст меняется, когда правил на задаче становится больше, и
сравнение по нему плодило бы новый комментарий каждую ночь. Найден — обновляется
по месту; совпал дословно — не трогается вовсе.

Умолчание сухое. Без --apply печатается план. Скрипт пишет в трекер, и
«случайно запустил» не должно означать «прошёлся по пятидесяти четырём задачам».

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

tracker-guardrails.yml, сразу после шага, который клонирует каталог. Это
единственный шаг файла, которому нужна запись в трекер, — права подняты с
issues: read до issues: write и это названо в комментарии рядом.

Проверка

  • план на живом каталоге: 54 задачи, 67 правил, ни одной записи без --apply;
  • 9 тестов, сеть подменена целиком: повторный прогон обновляет тот же
    комментарий и не создаёт новый, неизменившийся — не трогает, сухой прогон не
    делает ни одного вызова, отсутствие каталога даёт код 2, а не 1;
  • python scripts/preflight.py — чисто: 5383 passed, 98 skipped.

Что осталось в #1351

Пункт 3 — постоянный issue «входящие» с правилами в статусе unreviewed
(сейчас их 30) и метрикой «сколько дней самому старому».

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

Часть #1351 — обратная ссылка в задачу-источник (пункт 2 из пяти)

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

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

Замер: 67 правил каталога ссылаются на 54 наши задачи. Ни на одной из них об
этом не сказано.

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

`scripts/link_rules_to_issues.py` достраивает вторую сторону:

- **метка `породило правило`** — видна в списке задач, то есть отвечает на
  вопрос «какие наши задачи дали правила» без чтения тел;
- **один комментарий** с номерами правил и ссылками.

Источник — машинный экспорт каталога (`export/rules.json`) с полем `trails`, а не
разбор Markdown: это объявленный контракт каталога, а не наша догадка о его
формате.

## Два свойства, без которых механизм вреден

**Комментарий один.** Идемпотентность держится **скрытым маркером** в теле, а не
совпадением текста: текст меняется, когда правил на задаче становится больше, и
сравнение по нему плодило бы новый комментарий каждую ночь. Найден — обновляется
по месту; совпал дословно — не трогается вовсе.

**Умолчание сухое.** Без `--apply` печатается план. Скрипт пишет в трекер, и
«случайно запустил» не должно означать «прошёлся по пятидесяти четырём задачам».

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

`tracker-guardrails.yml`, сразу после шага, который клонирует каталог. Это
единственный шаг файла, которому нужна запись в трекер, — права подняты с
`issues: read` до `issues: write` и это названо в комментарии рядом.

## Проверка

- план на живом каталоге: 54 задачи, 67 правил, ни одной записи без `--apply`;
- 9 тестов, сеть подменена целиком: повторный прогон обновляет тот же
  комментарий и не создаёт новый, неизменившийся — не трогает, сухой прогон не
  делает ни одного вызова, отсутствие каталога даёт код 2, а не 1;
- `python scripts/preflight.py` — чисто: 5383 passed, 98 skipped.

## Что осталось в #1351

Пункт 3 — постоянный issue «входящие» с правилами в статусе `unreviewed`
(сейчас их 30) и метрикой «сколько дней самому старому».

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 11:18
@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 merged commit e9723cd into main Aug 26, 2026
21 checks passed
@ArtVsMark
ArtVsMark deleted the agent/rules-backlink branch August 26, 2026 11:34
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 Согласие смержить без автора: авто-мерж включится, как позеленеет

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants