feat(agent): задача знает, что породила правило каталога - #1371
Merged
Conversation
Часть #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
enabled auto-merge (squash)
August 26, 2026 11:18
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Часть #1351 — обратная ссылка в задачу-источник (пункт 2 из пяти)
Что было не так
Связь между задачей и правилом односторонняя: у правила есть раздел «След» с
номером нашей задачи, у задачи о правиле — ни слова. Читатель задачи не узнаёт,
что из неё вышло правило, и следующий разбор того же места начинается с нуля:
вывод прошлого разбора лежит в другом репозитории и оттуда не виден.
Замер: 67 правил каталога ссылаются на 54 наши задачи. Ни на одной из них об
этом не сказано.
Что сделано
scripts/link_rules_to_issues.pyдостраивает вторую сторону:породило правило— видна в списке задач, то есть отвечает навопрос «какие наши задачи дали правила» без чтения тел;
Источник — машинный экспорт каталога (
export/rules.json) с полемtrails, а неразбор Markdown: это объявленный контракт каталога, а не наша догадка о его
формате.
Два свойства, без которых механизм вреден
Комментарий один. Идемпотентность держится скрытым маркером в теле, а не
совпадением текста: текст меняется, когда правил на задаче становится больше, и
сравнение по нему плодило бы новый комментарий каждую ночь. Найден — обновляется
по месту; совпал дословно — не трогается вовсе.
Умолчание сухое. Без
--applyпечатается план. Скрипт пишет в трекер, и«случайно запустил» не должно означать «прошёлся по пятидесяти четырём задачам».
Кто запускает
tracker-guardrails.yml, сразу после шага, который клонирует каталог. Этоединственный шаг файла, которому нужна запись в трекер, — права подняты с
issues: readдоissues: writeи это названо в комментарии рядом.Проверка
--apply;комментарий и не создаёт новый, неизменившийся — не трогает, сухой прогон не
делает ни одного вызова, отсутствие каталога даёт код 2, а не 1;
python scripts/preflight.py— чисто: 5383 passed, 98 skipped.Что осталось в #1351
Пункт 3 — постоянный issue «входящие» с правилами в статусе
unreviewed(сейчас их 30) и метрикой «сколько дней самому старому».
Работа сделана вместе: @ArtVsMark — постановка, решения и приёмка; Claude Code — реализация.