feat(ci): отставание реестра находок ловит механизм, а не следующий аудит - #1369
Merged
Conversation
…удит Без issue: правило родилось из инцидента этой смены; отдельной задачи не заводилось ## Инцидент Документ аудита объявляет собственное правило состояния: находка открыта, пока её ID не значится в реестре PR. Правило было, механизма не было — и реестр отстал на 152 записи: 57 строк против 209 фактически закрытых находок. Следствия не косметические. Состояние читают только из реестра, поэтому отставший реестр числит закрытое открытым: следующий аудит переоткрывает сделанное, а правило «документ переезжает в archive, когда закрыты все» не срабатывает никогда — незакрытые не кончаются. Сверка руками (PR #1366) долг закрыла, но не устранила причину: следующий пропуск строки снова заметят через месяцы. ## Механизм `scripts/check_audit_registry.py` сверяет три источника: ID находок из таблиц живых аудитов, реестр (строки `| ID | что было | #PR |`) и тела смерженных pull request. Кандидат — ID, упомянутый в PR и отсутствующий в реестре; формулировка вокруг упоминания разбирается. Реестр ищется **по форме строки, а не по заголовку раздела**: переименование секции не должно отключать проверку молча — тот же принцип, по которому запрет MCP держится формой, а не именами. Три ловушки разбора, каждая найдена на живых телах PR: - **контекст — абзац, а не предложение**: точки живут в путях (`SECURITY.md`), и обрезка по ним превращала «из подэпика #986 остаются: …» в подтверждение закрытия; - **заголовок сильнее формы строки**: под «## Что осталось в файле» лежит ровно тот же список «`ID` — что не так», что и под «## Что сделано»; - **частичное закрытие — не закрытие**: «`READER-1-04` (часть про URL)» оставляет вторую половину живой, и реестр её принять не должен. Плюс отсев PR, которые находки заводят или ведут сам документ (`docs(audit)`, переписывание тел в чек-листы): они перечисляют ID десятками, включая открытые. ## Что нашлось первым же прогоном Две находки, пропущенные ручной сверкой: `LNCH-1-01` (PR #1140) и `DES-1-04` (PR #1276 — по более раннему PR она числилась оставшейся, и я поверил тексту, а не последнему слову истории). Обе дописаны в реестр этим же PR. ## Проверка - вживую: до правки — «реестр отстал на 2 записи», после — «реестр совпадает с историей мержей»; - 10 тестов на фикстурах, по одному на каждую ловушку разбора выше; в сеть не ходит ни один; - `python scripts/preflight.py` — чисто: 5370 passed, 98 skipped; - гард объявлен в `tests/test_guard_scripts_are_wired.py`. 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 10:35
Оба шага ночного прогона трекера оставлены: защита main (#1296) и реестр находок. Конфликт был позиционный — обе стороны дописывали шаг в одно место, логика ни одной не менялась. Маркеры конфликта проверены прогоном, а не глазами: первое разведение съело закрывающую скобку в реестре гардов, и тест сборки это поймал. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com>
… agent/audit-registry-guard Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Co-Authored-By: Artem Markitanov <86671904+ArtVsMark@users.noreply.github.com>
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.
Без issue: правило родилось из инцидента этой смены; отдельной задачи не заводилось
Инцидент
Документ аудита объявляет собственное правило состояния: находка открыта, пока её
ID не значится в реестре PR. Правило было, механизма не было — и реестр отстал на
152 записи: 57 строк против 209 фактически закрытых находок.
Следствия не косметические. Состояние читают только из реестра, поэтому отставший
реестр числит закрытое открытым: следующий аудит переоткрывает сделанное, а
правило «документ переезжает в archive, когда закрыты все» не срабатывает
никогда — незакрытые не кончаются.
Сверка руками (PR #1366) долг закрыла, но не устранила причину: следующий
пропуск строки снова заметят через месяцы.
Механизм
scripts/check_audit_registry.pyсверяет три источника: ID находок из таблицживых аудитов, реестр (строки
| ID | что было | #PR |) и тела смерженных pullrequest. Кандидат — ID, упомянутый в PR и отсутствующий в реестре; формулировка
вокруг упоминания разбирается.
Реестр ищется по форме строки, а не по заголовку раздела: переименование
секции не должно отключать проверку молча — тот же принцип, по которому запрет
MCP держится формой, а не именами.
Три ловушки разбора, каждая найдена на живых телах PR:
SECURITY.md), иобрезка по ним превращала «из подэпика 🎯 [Подэпик] Песочница и микробенч ломают верные решения и переворачивают рейтинг #986 остаются: …» в подтверждение
закрытия;
тот же список «
ID— что не так», что и под «## Что сделано»;READER-1-04(часть про URL)» оставляетвторую половину живой, и реестр её принять не должен.
Плюс отсев PR, которые находки заводят или ведут сам документ (
docs(audit),переписывание тел в чек-листы): они перечисляют ID десятками, включая открытые.
Что нашлось первым же прогоном
Две находки, пропущенные ручной сверкой:
LNCH-1-01(PR #1140) иDES-1-04(PR #1276 — по более раннему PR она числилась оставшейся, и я поверил тексту, а
не последнему слову истории). Обе дописаны в реестр этим же PR.
Проверка
историей мержей»;
ходит ни один;
python scripts/preflight.py— чисто: 5370 passed, 98 skipped;tests/test_guard_scripts_are_wired.py.Работа сделана вместе: @ArtVsMark — постановка, решения и приёмка; Claude Code — реализация.