# Где действует правило · Where a rule applies > **Этот файл собирается скриптом** `scripts/aggregate_bindings.py` из > ответов потребителей и не правится руками. Пустая клетка означает, что > потребитель не подключён, а не что правило им отклонено. > **This file is generated** by `scripts/aggregate_bindings.py` from the > consumers' answers and is never edited by hand. An empty cell means the > consumer is not connected, not that the rule was rejected there. ## Потребители · Consumers | Проект · Project | Состояние · State | Следов · Trails | Родил · Born | Ответов · Answers | Без ответа · Unanswered | Лишних · Stale | Действует · Active | Гейтом · Gate | Конвейером · Pipeline | Навыком · Skill | Документом · Document | Ничем · Nothing | Механизмов · Mechanisms | Почему · Why | |---|---|---|---|---|---|---|---|---|---|---|---|---|---| | `Engineering-Incidents-Playbook` | подключён | 55 | 34 | 207 | 0 | 0 | 176 | 125 | 9 | 0 | 31 | 11 | 110 | | | `Stepik-Python-Grader` | подключён | 187 | 132 | 195 | 12 | 0 | 192 | 86 | 39 | 0 | 67 | 0 | 145 | | | `ArtVsMark` | подключён | 29 | 18 | 203 | 4 | 0 | 146 | 95 | 12 | 0 | 25 | 1 | 44 | | | `Claude-Code_Usage-Token` | подключён | 17 | 15 | 181 | 26 | 0 | 152 | 95 | 9 | 0 | 46 | 2 | 86 | | | `Glossary-Python` | подключён | 0 | 0 | 181 | 26 | 0 | 117 | 60 | 12 | 0 | 29 | 16 | 78 | | | `Engineering-Pipeline-Mechanisms` | подключён | 9 | 8 | 207 | 0 | 0 | 194 | 166 | 19 | 1 | 8 | 0 | 214 | | ## Чем держат другие · How others enforce it > Слева — тот, у кого механизм есть, и его адрес. Справа — у кого это правило признано действующим и не обеспечено ничем. > Чужой механизм не обязан подойти: стеки разные. Раздел отвечает на один вопрос — кто уже сталкивался и чем закрыл. > On the left, whoever holds the rule and where. On the right, whoever calls it active but holds it by nothing. | № | Держит · Held by | Ничем · By nothing | |---|---|---| | 007 | `Stepik-Python-Grader` — документ: docs/agent/dispatcher.md — окно, ждущее разрешения, узнаётся по pending_action в реестре сессий; порог получаса, решение принимает диспетчер; `Engineering-Pipeline-Mechanisms` — конвейер: scripts/unlooked.py — состояние прогона взгляда разбирается на ДЕВЯТЬ имён, и ни одно незавершённое не сводится к «взгляда не было»: запись без исхода даёт «прогон ещё идёт», а исход, которого разбор не знает, называется СЛОВОМ ПЛОЩАДКИ — `neutral`, `timed_out`, `action_required`, `stale`. Именно `action_required` площадка ставит заходу, который ждёт разрешения. Ведёт реестр .github/workflows/automerge.yml, очередь позднего взгляда берёт по нему .github/workflows/review.yml; держат tests/test_unlooked.py. | `Glossary-Python` | | 012 | `Engineering-Incidents-Playbook` — гейт: .claude/hooks/push_guard.py — хук PreToolUse, объявленный в .claude/settings.json: толчок в ветку, отличную от текущей головы, отвергается ДО вызова git. Конвейер такого не ловит — он видит артефакт, а не действие, и к его запуску ветка уже сдвинута. Приём взят у грейдера — у него это тоже хук перед вызовом инструмента, — а файл нет: его запрет шире и собран под его конвейер. Разрешены толчок без имени ветки, толчок текущей и явная ссылка HEAD:<ветка>. Набор — tests/test_push_guard.py; живая проба состоялась при постройке: хук отверг толчок в несуществующую ветку и на ней же нашлась своя поломка — `2>&1` считалось именем ветки. ГРАНИЦА: ЧЬЯ ветка, сторож по-прежнему не знает — он знает только, что она не та, на которой стоит окно; `Stepik-Python-Grader` — гейт: .claude/hooks/pre_tool_use.py — пуш в ветку, отличную от текущей, отвергается до вызова git; CI такое поймать не может, он видит артефакт, а не действие; `ArtVsMark` — документ: ВЕРДИКТ ИСПРАВЛЕН 8 СЕНТЯБРЯ: стояло «участник один: чужих веток, в которые можно было бы вписаться, здесь не бывает». Они бывают, и перечислены поимённо в scripts/checks.py::MACHINE_BRANCHES — dependabot/** и chore/metrics: их ведут обновлятель зависимостей и суточный прогон, а не окно. ПРЕДМЕТ ОПЛАЧЕН: 7 сентября окно нажало «обновить ветку» на изменении #134 от dependabot — то есть внесло правку в чужую ветку, — и созданный коммит слияния с автором-окном заставил односторонний довод гейта журнала потребовать запись о решении у изменения, где правку сделал бот. Чинилось это на нашей стороне (scripts/check_journal.py::audit перестал считать слияние авторством), но причина была в том, что тронули не свою ветку. ДЕРЖИТСЯ ЗАПИСЬЮ, И ГЕЙТА НЕТ: CLAUDE.md § Ветки называет машинные приставки и то, что задачи и решения у них нет. Запретить окну пуш в чужую ветку отсюда нечем — это право площадки, а не содержимое репозитория; часть чужих веток закрыта правами (правку прогонов окну не дают, 403), и это защита площадки, а не наша. Половина, которой механизма нет, названа, а не выдана за покрытую; `Claude-Code_Usage-Token` — гейт: .claude/hooks/push_guard.py — хук PreToolUse, объявленный в .claude/settings.json: толчок в ветку, отличную от текущей головы, отвергается ДО вызова git. Конвейер такого не ловит по построению — он видит артефакт, а к его запуску ветка уже сдвинута. Разбирается каждая команда строки: `cd … && git push origin main` прячет толчок за соединителем, и судить по первому слову значило бы не судить вовсе. Разрешены толчок без источника, толчок текущей и явное HEAD:<ветка> — ложный отказ здесь дороже пропуска, потому что его чинят отключением хука, а не исправлением команды (051). ГРАНИЦА НАЗВАНА В САМОМ ХУКЕ: он работает только в агентских окнах, человек из терминала им не защищён; предмет правила при этом именно агентский. Набор — tests/test_push_guard.py.; `Engineering-Pipeline-Mechanisms` — гейт: .claude/hooks/push_guard.py — хук PreToolUse, объявленный в .claude/settings.json: толчок в ветку, отличную от текущей головы, отвергается ДО вызова git; общая ветка отвергается из любой головы (131). Конвейер такого не ловит по построению — он видит артефакт, а к его запуску ветка уже сдвинута. Прежний ответ говорил «предмет вне досягаемости: чья ветка, знает человек» — и описывал не тот предмет: признак «чужая» машине недоступен, а «не совпадает с головой» доступен вполне. Инцидент свой: 10.09.2026 окно с ветки agent/items-sweep толкнуло в agent/marking-moves-out-of-the-queue, и конвейер открыл второе изменение на ту же работу (#116). Приём взят у трёх соседей, файл свой: у них запреты свои (162). Разбор идёт по словам команды, а не подстрокой: `git push` в теле записываемого файла — данные (085). | `Glossary-Python` | | 013 | `Engineering-Incidents-Playbook` — конвейер: .github/workflows/agent-pr.yml передаёт заголовок и тело файлами (`--body-file`), а не строкой в оболочке; то же в .github/workflows/automerge.yml; `Stepik-Python-Grader` — гейт: .claude/hooks/pre_tool_use.py — heredoc без кавычек в делимитере с экранированием в теле отвергается до записи файла; `Claude-Code_Usage-Token` — гейт: scripts/shell_heredoc.py — в блоках `run:` прогонов разделитель heredoc обязан быть закавычен. Незакавыченный оболочка ИНТЕРПРЕТИРУЕТ: раскрывает $переменные, подстановки и обратные слэши, записанное расходится с написанным, и прогон при этом зелёный — красное появляется дальше и по другой причине. Замер 2026-09-07: 9 прогонов, heredoc'ов 0 — предмет класса есть, нарушений сегодня нет, и гейт держит достигнутое. ГРАНИЦА: ручное экранирование в аргументе (`--body "…\"…\""`) не судится — отличить законную кавычку в тексте от экранирования разбором нельзя, и держит это приём доставки текста файлом, а не проверка. Набор — tests/test_shell_heredoc.py.; `Engineering-Pipeline-Mechanisms` — гейт: tests/test_gates_contract.py::test_workflows_do_not_embed_code — ни один шаг прогона не несёт встроенной программы: логика зовётся файлом из scripts/. Цена встроенного кода здесь двойная: оболочка меняет экранирование по дороге, и вдобавок его не касаются ни ruff, ни mypy, ни набор тестов — три гейта разом перестают его видеть | `Glossary-Python` | | 018 | `Engineering-Incidents-Playbook` — гейт: tests/ проверяют узлы — функции скриптов на подделанном дереве; .github/workflows/ci.yml прогоняет цепочку целиком. Разные окружения, разные предметы; `Stepik-Python-Grader` — документ: CLAUDE.md § Два окна и docs/agent/environments.md § Облако проверяет узлы, локальное окно — цепочку; планируя срез аудита, окно проставляется сразу; `Claude-Code_Usage-Token` — гейт: .github/workflows/ci.yml и scripts/preflight.py. Деление есть и оно оплачено: локальный preflight проверяет узлы (гейты, типы, тесты) на одной машине, матрица из девяти ячеек — цепочку на трёх ОС и трёх версиях Python. Что это не бюрократия, показал замер: гейт кодировки подпроцессов родился из отказа, видимого ТОЛЬКО на windows-раннере, где локаль cp1252, и только если в выводе попалась нужная буква. Локальное зелёное на linux было не доказательством, а средой без нужного звена. Живой случай 2026-09-04, переезд значков на ветку: локальный preflight был ЗЕЛЁНЫМ, потому что файл значка лежал на диске неотслеживаемым — его собрал сборщик прямо перед проверкой. В прогоне после checkout его нет, и три ubuntu-ячейки покраснели: два теста читали файл из дерева, две записи ответа называли его адресом. То есть локальная среда содержала звено, которого у CI нет, и зелёное на ней ничего не доказывало. Воспроизведено удалением файла локально — оба отказа повторились дословно.; `Engineering-Pipeline-Mechanisms` — конвейер: .github/workflows/ci.yml — узлы и цепочка разведены по окружениям: набор в scripts/ и tests/ проверяет механизмы по одному на раннере, а цепочку — площадка, и только она. Поэтому решение принимается по прогону, а не по зелёному набору (139), а с #48 гейты идут ещё и на общей ветке: изменение и main — разные окружения, и зелёное на изменении не значит зелёного на main | `Glossary-Python` | | 028 | `Stepik-Python-Grader` — конвейер: scripts/check_issue_checklists.py — комплексный issue от трёх находок ведёт чек-лист с исходом каждой; `Claude-Code_Usage-Token` — документ: .github/pull_request_template.md — восемь пунктов галочками, а не прозой; CLAUDE.md § «Перед PR» — тот же чек-лист, исполняемый одной командой scripts/preflight.py. Состояние задачи не вычисляется чтением: у каждого пункта либо галочка, либо её нет.; `Glossary-Python` — конвейер: .github/workflows/rules-inbox.yml — комплексная задача проекта (задача «Правила каталога: входящие») НЕ ВЕДЁТСЯ РУКАМИ ВОВСЕ: её тело пересчитывается действием каталога из .rules/bindings.json ежедневно. Чек-лист нужен там, где состояние правят прозой и оно расходится с делом; здесь править нечего — состояние выводится из ответа, а ответ и есть предмет работы. Прежний ответ «трекера у проекта пока нет» был неверен: задача заведена 5 сентября прогоном, оба его захода зелены. ГРАНИЦА НАЗВАНА: пересчёт суточный, поэтому тело задачи отстаёт от ответа на срок до суток — это задержка расписания, а не расхождение правки с делом, против которого правило; `Engineering-Pipeline-Mechanisms` — конвейер: scripts/task_shape.py::without_a_checklist — шаг debt на каждом изменении называет открытые задачи, которые ведут три и более пункта прозой, а не галочками. Эпик с дочерними задачами и задача с любыми галочками кандидатами не считаются: у первого счёт ведёт трекер, вторая его уже ведёт. AGENTS.md, раздел «Открытая работа» — комплексная задача ведётся подзадачами площадки. Задача, которую ведёт механизм, кандидатом не считается вовсе: её тело пересобирается каждым заходом, и галочка, поставленная рукой, исчезнет на следующем, а состояние её и так счётчик. Признак — общая метка живой задачи (findings.is_kept_by_a_mechanism), а не догадка | `Engineering-Incidents-Playbook` | | 032 | `Stepik-Python-Grader` — документ: docs/agent/roles.md: если предмет роли наблюдаем в работающем продукте, роль обязана его запустить — вывод чтением кода считается неполным; `ArtVsMark` — гейт: .github/workflows/pr-check.yml — вывод о работоспособности делается прогоном вхолостую, а не чтением кода; `Claude-Code_Usage-Token` — документ: README.md и README.en.md, § «Статус». Правило требует ЗАПУСКАТЬ там, где предмет наблюдаем, и запуск состоялся: 2026-09-03 транскриптный сбор прогнан на живом транскрипте — 3833 строки, 650 ответов, — и первый же прогон нашёл то, чего не увидели ни тесты, ни чтение кода: вывод команды молчал о 572 отброшенных повторах, то есть о 47% строк с расходом. Правило окупилось с первого применения. Что осталось непрогнанным, названо там же и не замазано: реестровая половина и запись в хранилище. У облачного окна реестра нет — MCP ему не заведён, — и это «негде запустить»; у локального он есть, и там это по-прежнему «не запускали».; `Engineering-Pipeline-Mechanisms` — гейт: tests/test_review_safety.py::test_a_permitted_run_is_actually_possible и ::test_both_interpreter_names_are_permitted — роль внешнего взгляда объявляет прогон проверок, и прогоны держат, что объявленное ВОЗМОЖНО: если список разрешает «python -m pytest», в джобе обязаны быть setup-python и установка проверок, а разрешение выдаётся обоим именам интерпретатора. Механизм построен 09.09.2026 по задаче #33 и закрыл её: до того ревью на #32 честно сказало, что прогнать не смогло, и всё-таки вынесло «находок 0» — вердикт чтением выглядел как вердикт после прогона (045). Что РОЛЬ ДЕЙСТВИТЕЛЬНО прогнала продукт, а не только могла, из дерева не прочесть: это остаётся её собственным отчётом (182). ГДЕ ЭТОТ ЗАПУСК НЕ ДОХОДИТ, НАЗВАНО В docs/roles.md: вход у взгляда один — от правил с ответом «document», которые собирает scripts/review_map.py, — и пласты, не бывшие правилами каталога, ему не называет никто. В карте они помечены «роли нет». | `Glossary-Python` | | 038 | `Stepik-Python-Grader` — документ: CLAUDE.md § Два окна: имя окна начинается с окружения ([WEB]/[LOCAL]/[CLI]), метка ставится при открытии; канон — docs/agent/environments.md; `ArtVsMark` — документ: CLAUDE.md § Окно — имя начинается с окружения, витрину ведут только облачные окна: [WEB]. РАЗЛОЖЕНО НАДВОЕ по 182, МЕХАНИЗМА НЕТ ни у одной половины: признак окружения лежит в реестре сессий, а имя окна не попадает в репозиторий ни одним следом — ни коммитом, ни телом изменения. Сверять нечего и не с чем, и это не «дорого», а буквально нет данных. ДЕРЖИТСЯ ЗАПИСЬЮ: CLAUDE.md § Окно. ПЕРЕВЕДЁН ИЗ «ДЕРЖИТСЯ НИЧЕМ» 7 СЕНТЯБРЯ, И ЭТО НЕ ПОЯВЛЕНИЕ МЕХАНИЗМА, А ИСПРАВЛЕНИЕ ВЕРДИКТА: требование записано в читаемом месте и читается ПЕРЕД делом, а вердикт говорил «ничем» — то есть занижал существующее. Разница не косметическая: «ничем» значит, что никто не напомнит, «документом» — что напомнит текст, который окно обязано прочесть. Гейта по-прежнему нет, и половина, которой он невозможен, названа выше.; `Claude-Code_Usage-Token` — документ: CLAUDE.md § «Окно: имя, срок, перезапуск» — имя окна начинается с метки окружения ([WEB], [LOCAL], [CLI]), задача после, метка ставится при открытии. Названо и ПОЧЕМУ: окружения различаются возможностями, а не удобством — у локального есть реестр сессий, у облачного нет, и инвариант «замер делает окно» существует именно из-за эфемерности облачного. Там же сказано, чего метка НЕ делает: ветка признаком окружения не служит — agent/** говорит «ведёт окно», и второй смысл потребовал бы менять имя ветки при переезде работы, чего площадка у открытого PR не умеет. Механизма нет и быть не может: имя окна живёт вне репозитория.; `Engineering-Pipeline-Mechanisms` — документ: CLAUDE.md — раздел «Имя окна и его окружение» | `Glossary-Python` | | 043 | `Engineering-Incidents-Playbook` — гейт: scripts/build_rules_index.py — check_superseded: пометка «Заменено» разрешается в существующую запись, не зацикливается и стоит в обоих деревьях; отвергаемый предмет прогоняется в scripts/check_gates.py. ГРАНИЦА: ЗАМЕНЯЕТ ли одна запись другую — суждение автора, гейт держит форму уже принятого решения; `Stepik-Python-Grader` — гейт: scripts/check_adr_records.py; `Claude-Code_Usage-Token` — документ: HISTORY.md и docs/release.md — отменённое решение не правится, а называется вместе с ценой: отвергнутый hatch-vcs описан там, где объяснено, почему версия правится руками. Тот же приём применён к УТВЕРЖДЕНИЮ, а не решению: docs/spec.md § «Откуда взято число» прямо говорит, что прежнее объяснение расхождения источников оказалось неверным, и чем оно заменено, — а не заменяет абзац молча.; `Engineering-Pipeline-Mechanisms` — гейт: scripts/check_decisions_edit.py — изменение не переписывает контекст, решение и отвергнутые варианты уже принятой записи и не удаляет её; статус и последствия менять можно — ими запись помечается заменённой и ими же копится опыт | `Glossary-Python` | | 047 | `Engineering-Incidents-Playbook` — документ: CLAUDE.md § Когда окно перезапускают — сменились правила работы, окна перезапускают, а не рассылают им письма: свод и ядро читаются ОДИН раз, при старте, и правка живому окну не видна вовсе. ГРАНИЦА: реестра живых окон нет и не будет — рассылка потребовала бы знать, кто сейчас открыт; `Stepik-Python-Grader` — документ: CLAUDE.md § Гейты: смена правил транспорта требует перезапуска активных окон — настройки читаются при старте сессии; `ArtVsMark` — документ: CLAUDE.md § Окно — прямой цитатой: сменились правила работы, окна перезапускаются. Этот файл читается один раз, при старте; `Claude-Code_Usage-Token` — документ: CLAUDE.md § «Окно: имя, срок, перезапуск» — сменились правила, окна перезапускаются; свод читается окном ОДИН РАЗ, при старте, и правка до открытого окна не доезжает вовсе. Признак проблемы из правила здесь буквален: за одну серию свод правился шесть раз, и граница «соблюдают / не соблюдают» прошла бы ровно по дате создания окна. ГРАНИЦА НАЗВАНА В ТОМ ЖЕ РАЗДЕЛЕ: рассылки живым окнам не будет — реестра открытых окон нет и не предвидится, а знать, кто открыт, для рассылки обязательно. Механизм ручной и объявлен, а не подразумевается.; `Engineering-Pipeline-Mechanisms` — гейт: scripts/check_rulebook_fresh.py — шаг `rulebook-fresh` называет правки `AGENTS.md`/`CLAUDE.md`, случившиеся ПОД уже работающим окном: между первым его коммитом и головой изменения, чужим окном (своя правка окну известна). Вторая половина — навык `.claude/skills/rulebook-reread`: он читается В МОМЕНТ ВЫЗОВА, а не при старте окна, и потому показывает свод живым; этого у документа нет по построению. Перезапуск шаг не объявляет и решать за человека не берётся — класс `unreviewed`, слияния не держит (051). Разбор и отвергнутые варианты — docs/decisions/026-the-rulebook-is-reread-without-a-restart.md | `Glossary-Python` | | 053 | `Engineering-Incidents-Playbook` — гейт: scripts/merge_ready.py::frozen, подключён шагом «красная общая ветка замораживает очередь» в .github/workflows/automerge.yml: пока последний прогон хоть одной работы общей ветки не зелёный, изменение не получает ни автомержа, ни слияния. Размораживает метка `blocker` на самом изменении — объявлена в .github/labels.yml; вычислить «а это ли починка» механизм не может, и признак ставит человек. Заморозка спрашивается ПЕРВОЙ, до проверок самого изменения: это условие входа, а не сортировка, и случай на это есть. .github/workflows/main-red.yml заводит задачу, пока ветка красная, — вторая половина: заморозка останавливает очередь, дежурный зовёт человека. ИЗМЕРЕНО: до 2 сентября 2026 ответ называл механизмом только дежурного, а тот никого не останавливает — ветка покраснела в 08:55, и за полчаса в неё уехали два изменения с зелёными проверками на сломанном основании (146). Тем же заходом снято `--exclude attribution-history` у дежурного: причина исключения давно выражена ключом --since, а само оно пережило её молча (068). Приём взят у грейдера целиком — метка та же и значит то же (162); набор — tests/test_merge_ready.py, одиннадцать случаев с обеих сторон. ГРАНИЦА: ПОРЯДОК внутри очереди — кто голова среди незамороженных — не держится ничем: у соседа он вычисляется своей шкалой приоритетов, здесь изменения идут по готовности, и это отдельный предмет (052); `Stepik-Python-Grader` — конвейер: scripts/gh_rest.py queue вычисляет очередь из состояния API и печатает обоснование (приоритет метки, общий файл, готовность), а не берёт из хранимого реестра; `Claude-Code_Usage-Token` — гейт: scripts/merge_queue.py и scripts/pr_ready.py — пока общая ветка красная или занята прогоном, вердикт BLOCKED и не едет никто; конфликтный и придержанный пропускаются, не задерживая остальных. CLAUDE.md § «Работа с GitHub»: «Первым — то, что чинит красный main; пока он красный, остальное не мержится вовсе».; `Engineering-Pipeline-Mechanisms` — гейт: scripts/automerge.py — ступень очереди есть НОМЕР ИСТОЧНИКА РАБОТЫ из контура 1 (docs/behaviour.md): один словарь на оба контура, а не второй порядок для слияния. Источник 0 и 4 приходят меткой, 3 выводится машинно из строки снятия находки, 5 — эвристика по тронутому ответу каталогу и объявлена эвристикой; 1 и 2 не выводятся до обращения к площадке и называются там, где заход их обнаружил — цена правила 052. Пропускная способность («трогает общий с соседом файл») решает ВНУТРИ ступени, а не между ними: приоритетом она не является. Приход решает последним. ТОТ ЖЕ НОМЕР СТОИТ У ПЛАНА РАБОТ: scripts/work_plan.py называет разделы плана номерами источников контура 1, и работа ДО изменения и изменение в очереди стоят на одной ступени — адресов у ответа два, а не один (022). Общий у них НОМЕР, подписи свои, по предмету; совпадение номеров держит tests/test_work_plan.py::test_the_plan_and_the_queue_count_sources_alike, а не дисциплина. Держат tests/test_automerge.py::test_the_step_is_the_number_of_the_work_source, ::test_a_finding_repair_outruns_the_plan и ::test_a_shared_file_decides_inside_a_step_not_across_them | `Glossary-Python` | | 086 | `Engineering-Incidents-Playbook` — гейт: scripts/collect_proposals.py::check_verdicts — оценку находке ставит НЕ нашедший: проект присылает предложение БЕЗ номера (форма запрещает поле прямо), а вердикт выносит принимающая сторона, и гейт требует у каждого предложения статус из закрытого набора, у принятого — существующий номер правила, у отклонённого — причину. Номер не переиспользуется: два предложения под одним отвергаются. ГРАНИЦА, И ОНА ПОЛОВИНА ПРАВИЛА: вторая половина — «шкала опровергателя калибруется примерами» — не держится ничем, и предмета для неё пока нет: вердиктов семь, все «принято», ни одного отказа. Гейт на калибровку отказа мерил бы пустоту (075), и заводить его стоит с первым же отклонённым предложением. У соседа калибровка держится документом — шкалой на примерах в своде (162); `Stepik-Python-Grader` — документ: CLAUDE.md § Режим ответов (🔍 не ставит окончательную тяжесть — его оценка заявка; ⚖️ доказывает) и docs/agent/multiagent.md § адверсариальный верификатор со шкалой на примерах; `Engineering-Pipeline-Mechanisms` — гейт: scripts/findings.py — WEIGHTS: шкала закрытая, три градации, как роды у фрагментов журнала; вес живёт в самой записи живой задачи и читается строкой (ENTRY_RE). scripts/review_findings.py — вес берётся из строки находки, слово вне шкалы весом не считается и к ближайшему НЕ приводится, а неназванный записывается как «без веса»: подстановка самого лёгкого решила бы за ревьюера в сторону, удобную разбирающему (154). Порядок записей — по весу, а не по приходу (053). Вторая половина правила держалась и раньше: тяжесть ставит не тот, кто нашёл, — ревью записывает, разбирает и отклоняет окно, и отклонение оставляет след (026). Держат tests/test_review_findings.py::test_a_finding_without_a_weight_says_so, ::test_a_weight_outside_the_scale_is_not_a_weight и ::test_the_heaviest_finding_is_written_first ОПРОВЕРГАТЕЛЬ ЗАВЕДЁН 16.09.2026, и это вторая половина правила: шаг 12f `verify` в .github/workflows/review.yml входит от ОДНОЙ находки и пытается опровергнуть её премису, отвечая словом из закрытой шкалы (scripts/review_findings.py — premise_of, verified). Прежде шкала была, а отдельного проверяющего с установкой «опровергай по умолчанию» не было: замер того дня — находка `1fd43a4` описывала дефект, закрытый двумя днями раньше, и заметил это человек. Ответ верификатора снятием не является: находку снимает работа (154). | `Claude-Code_Usage-Token` | | 094 | `Stepik-Python-Grader` — документ: docs/dev/adr/0004-src-layout.md § Альтернативы, вариант B: src-layout плюс тонкие root-shim'ы отклонён явно — два пути импорта и их дрейф; `ArtVsMark` — гейт: ВЕРДИКТ ИСПРАВЛЕН 8 СЕНТЯБРЯ: стояло «слоёв совместимости нет: у витрины нет ни версий, ни потребителей», и это ложно дважды. Версия у витрины есть — schema её ответа каталогу, — и потребитель есть: сам каталог читает .rules/bindings.json и публикует сводку. Совместимость держится ГРАНИЦЕЙ, а не заглушкой: scripts/build_metrics.py::RULES_SCHEMA и ::FACTS_SCHEMA задают мажор, который сборка умеет читать, и чужой мажор её РОНЯЕТ, а не переводится молча. Минор разбирает scripts/build_metrics.py::answered_version, и он же держит правило: номер поднимает перечитывание, а не сборка. Переходного слоя «пока поддержим оба» нет ни у одного контракта — это и есть чистая миграция, которой требует правило; `Engineering-Pipeline-Mechanisms` — гейт: .github/workflows/agent-pr.yml — приставка ветки теперь одна: `agent/**`. Вторая, `claude/**`, стояла переходной заглушкой (облачному окну имя ветки назначает платформа) и снята после того, как новый путь подтверждён прогонами, а не когда был написан. Возврата заглушки не будет тихого: tests/test_gates_contract.py::test_branch_prefixes_match_the_workflow сверяет список прогона со списком в scripts/agent_pr.py — разъехавшись, они дали бы худший из отказов, когда прогон стартует, а изменение не открывается и красного нигде нет | `Engineering-Incidents-Playbook` | | 099 | `Engineering-Incidents-Playbook` — гейт: словарь областей в scripts/build_rules_index.py закрытый: область, которой в нём нет, сборку не проходит, и спор решается пополнением словаря осознанно; `Stepik-Python-Grader` — документ: docs/dev/glossary.md § Дубли двух поколений импорта: при конфликте выигрывает тематика — иначе «Типы данных» осталась бы без int/str/float; `Claude-Code_Usage-Token` — документ: docs/labels.md § «Когда подходят две зоны». Правило разрешения записано по последствию, а не по правильности: выигрывает зона, чьё отсутствие оставило бы поиск пустым. Живой пример там же — PR восьмой порции трогал обе витрины, .gitignore и ответ каталогу; формально подходили и area/docs, и area/ci, и выбор объяснён последствием, а не вкусом. Записано это здесь и сейчас: до разбора правила спор о зоне решался интуитивно, а таблица требований говорила только «ровно одна» — то есть про случай, когда не подходит ни одна, и молчала про случай, когда подходят две.; `Engineering-Pipeline-Mechanisms` — документ: .rules/bindings.json, поле «_зачем» — конфликт «где живёт ответ по правилу: у каталога или у проекта» разрешён по ПОСЛЕДСТВИЮ, а не по правильности: у каталога раздел без ответов остаётся осмысленным, у проекта без них пустеет предмет — здесь живёт механизм, и одно правило в разных проектах держится по-разному. Так же разведены docs/pipeline.md и docs/behaviour.md: состав и поведение | `Glossary-Python` | | 101 | `Stepik-Python-Grader` — конвейер: scripts/gh_rest.py — временный отказ отличается от постоянного по ответу сервера: 403/429 с исчерпанным остатком или Retry-After поднимают RateLimited («ждать»), а 401/403 без них — GitHubError («повтор не поможет»); названная сервером пауза важнее расчётной; `Claude-Code_Usage-Token` — гейт: src/claude_code_usage/storage.py, функция push — три попытки, и перед каждой повторной ветка подтягивается с --rebase: расхождение историй двух окон, пишущих в один файл, это ровно тот временный отказ, который проходит сам, а pull его и устраняет. Идемпотентность обеспечена до повторов, а не после: файл append-only, а confirm() после удачного пуша сверяет, что строки действительно в файле, — перебазирование молча отбрасывает коммит с уже применённым диффом, и «пуш вернул успех» этого не показывает. ГРАНИЦА НАЗВАНА: повторяются все отказы push, включая постоянные (нет прав, нет удалённого репозитория), — три попытки к «нет прав» ничего не добавят, кроме двух лишних секунд, и разбирать код отказа git по тексту stderr дороже этой цены.; `Engineering-Pipeline-Mechanisms` — гейт: packages/transport/ghrest.py — постоянный отказ отделён от временного и не повторяется: 404 — свой род, 401/403 без заголовков квоты — «причина другая», а не лимит. Исчерпанной квоте механизм не назначает своей паузы: срок берётся из retry-after либо x-ratelimit-reset площадки. Держат tests/test_ghrest.py: test_exhausted_quota_is_its_own_kind, test_forbidden_without_quota_headers_is_not_rate_limit, test_retry_after_alone_is_enough_for_rate_limit | `Engineering-Incidents-Playbook` | | 105 | `Engineering-Incidents-Playbook` — конвейер: .github/workflows/review.yml — ревью ведёт ОТДЕЛЬНЫЙ прогон со своей учётной записью, а не то окно, что писало изменение. Форма взята у соседа ArtVsMark/Stepik-Python-Grader, чей ответ по 105 лежит в export/where.json (правило 162); расхождения с ним названы в шапке нашего файла. И вторая половина, заведённая 8 сентября: работа внешнего взгляда УЧИТЫВАЕТСЯ, а не пропадает вместе с окном — scripts/review_findings.py разбирает вердикт ревьюера строками «НАХОДКА: …» и «ВЕРДИКТ: находок N», кладёт заметки в живую задачу и уносит названные разобранными; `Stepik-Python-Grader` — конвейер: .github/workflows/claude-code-review.yml — ревью ведёт отдельный прогон, не то окно, что писало код; claude-review в списке обязательных проверок защиты main; `ArtVsMark` — документ: .rules/roles.md § Почему ревизор — роль, а не «повнимательнее» — второй проход своим же инструментом повторяет собственные слепые пятна, поэтому вопрос «сходится ли объявленное с фактическим» вынесен в отдельную роль; живого второго участника нет, часть работы переведена в гейты, остальное играет владелец. РАЗЛОЖЕНО НАДВОЕ по 182: половина «роль объявлена и у неё есть артефакт» УЖЕ держится — scripts/check_roles.py сверяет таблицу покрытия пластов с деревом в обе стороны. У половины «аудит выполнен ЧУЖИМИ глазами» МЕХАНИЗМА НЕТ: кто смотрел, в репозитории не записано, а проверять наличие строки о ревизоре значило бы зеленеть вокруг объявления (146). ДЕРЖИТСЯ ЗАПИСЬЮ: .rules/roles.md § Почему ревизор — роль, а не «повнимательнее». ПЕРЕВЕДЁН ИЗ «ДЕРЖИТСЯ НИЧЕМ» 7 СЕНТЯБРЯ, И ЭТО НЕ ПОЯВЛЕНИЕ МЕХАНИЗМА, А ИСПРАВЛЕНИЕ ВЕРДИКТА: требование записано в читаемом месте и читается ПЕРЕД делом, а вердикт говорил «ничем» — то есть занижал существующее. Разница не косметическая: «ничем» значит, что никто не напомнит, «документом» — что напомнит текст, который окно обязано прочесть. Гейта по-прежнему нет, и половина, которой он невозможен, названа выше.; `Engineering-Pipeline-Mechanisms` — конвейер: .github/workflows/review.yml — внешний взгляд ведёт отдельный прогон с закрытым списком инструментов и без истории окна, а не второй заход того же окна по своему же коду. Разбор образцов и что взято у каждого соседа — docs/decisions/002-review-taken-from-two-neighbours.md. Прогонять проверки роль умеет с 09.09.2026: у джоба есть интерпретатор, установка проверок и разрешение обеим формам команды, и держат это прогоны tests/test_review_safety.py (ответ по 032). Слепое пятно ответа названо иначе: прогнала ли роль на самом деле, из дерева не прочесть — это её собственный отчёт. | `Claude-Code_Usage-Token` | | 106 | `Engineering-Incidents-Playbook` — гейт: scripts/check_showcase.py — у вопроса набора НАЗВАН АДРЕСАТ (`for`), и ответ ему разный. Посетителю — живой значок, названный в витрине, либо строка `absent` с причиной: витрина не показывает то, на что ответить нечем, а пробел называется — значка нет и значок застыл с витрины неотличимы. Сопровождающему — `where`, разрешимый адрес живого источника; значок ему запрещён отдельно: число, дёргающееся от каждого изменения, шумит там, куда смотрят один раз. ИЗМЕРЕНО: до схемы 1.1 у трёх вопросов из десяти стояло «значка нет; получается прогоном pytest -q» — источник, названный прозой и не проверяемый ничем; теперь путь сверяется с деревом (044). Числа тестов и тестовых модулей живут колонками снимка выпуска в docs/HISTORY.md, считает их scripts/history_metrics.py по дереву тега. ГРАНИЦА: верно ли ЧИСЛО в значке и свеж ли он, гейт не судит — значки живут на ветке `badges`, и сверять их в дереве общей ветки не с чем; `Stepik-Python-Grader` — документ: HISTORY.md: решение владельца — не показывать широко, пока не пройден настоящий курс и вердикты не сошлись с платформой; протокол прогона — docs/agent/course-walkthrough.md; `Claude-Code_Usage-Token` — документ: README.md и README.en.md, § «Статус». Признак преждевременности из правила выполняется здесь буквально: самый дорогой класс дефектов — запись в чужой приватный репозиторий с коммитом и пушем — на настоящем материале не проверялся ни разу, все знания о нём получены на подделанных данных в тестах. Пакет при этом уже выпускается. Поэтому витрина говорит об этом прямо и на обоих языках, а не описывает команду словом «работает»: огласка умножает и хорошее, и плохое, и умалчивать тут значило бы умножать второе.; `Engineering-Pipeline-Mechanisms` — гейт: БУКВА ПРАВИЛА — «сначала настоящий прогон, потом огласка», и на витрине это значит: значок не показывают, пока за ним нет работающего механизма. tests/test_showcase.py именно это и держит: у вопроса посетителя значок обязан быть И показан в README, И собираться scripts/build_facts.py — значок, которого никто не собирает, застывает, а с витрины застывший и отсутствующий неотличимы. Гейт поймал это на первом же заходе: значок выпуска собирался, а в витрине его не было. Набор вопросов один на семью и взят у каталога (.rules/showcase.json), у которого это правило держится тем же приёмом (162). | `Glossary-Python` | | 108 | `Engineering-Incidents-Playbook` — гейт: scripts/audit_catalogue.py — у растущей части docs/HISTORY.md есть предел, выраженный числом, и вышедшее за окно гейт называет поимённо, старшими вперёд. Дословность переноса в архив машинно не проверяется, и это сказано в самом скрипте; `Stepik-Python-Grader` — гейт: scripts/check_docs_guardrails.py не даёт CHANGELOG.md держать больше трёх версионных заголовков: старое переезжает дословно в docs/archive/changelog-archive.md; `ArtVsMark` — гейт: scripts/build_metrics.py::check_focus_limit — потолок «Current focus» в пять строк; `Claude-Code_Usage-Token` — гейт: scripts/doc_limits.py — у четырёх растущих документов объявлен предел ЧИСЛОМ, и рядом с числом сказано, что делать при переполнении: CLAUDE.md 600 строк (вынести раздел в docs/), CHANGELOG.md 3 раздела версий (старшие дословно в архив), HISTORY.md 200 строк, docs/spec.md 400. Полнее всего сейчас CLAUDE.md — 504 из 600, и это число печатается КАЖДЫМ прогоном: его рост виден до отказа. Свод читают целиком при старте каждого окна, то есть его длина — цена каждого окна, а не одного. Числа взяты с запасом намеренно: предел, краснеющий назавтра, приучают обходить, а не соблюдать (051). ГРАНИЦА: дословность переноса в архив машине не видна. Набор — tests/test_doc_limits.py.; `Engineering-Pipeline-Mechanisms` — гейт: scripts/build_changelog.py — обе половины правила. Вышедшее переезжает ДОСЛОВНО: при выпуске фрагменты уходят в changelog.d/released/<версия>/ и остаются источником, а не сокращаются. Предел теперь есть и стоит у ПРЕДСТАВЛЕНИЯ, а не у источника: развёрнутыми собираются UNFOLDED_RELEASES последних выпусков, остальные названы ссылкой на свой каталог со счётом записей — оборвать раздел молча значило бы читаться как «раньше ничего не было». Держат tests/test_gates_reject.py::test_the_journal_unfolds_a_bounded_number_of_releases и ::test_a_short_history_folds_nothing | `Glossary-Python` | | 121 | `Stepik-Python-Grader` — конвейер: scripts/check_container_closure.py — ночной обход сверяет состояние эпика со счётчиком незакрытых дочерних задач: закрытый контейнер с открытой работой становится находкой с адресатом; `Claude-Code_Usage-Token` — конвейер: .github/workflows/rules-inbox.yml и scripts/rules_answer.py. Контейнер здесь — задача #74 «разобрать очередь порциями», единицы — правила каталога, и закрытие контейнера доказывается СЧЁТЧИКОМ незакрытых единиц, а не тем, что порции кончились: прогон входящих печатает в задачу-указатель, сколько правил разобрано и у скольких статус unreviewed, а гейт ответа печатает, сколько всего записей и у скольких назван разрешимый адрес. Обе цифры собираются машиной из данных, а не ведутся руками, — отстать они не могут.; `Engineering-Pipeline-Mechanisms` — конвейер: scripts/task_shape.py::closed_with_live_units — шаг debt ведёт ревизию закрытого: называет закрытые задачи, у которых остались открытые пункты или подзадачи. Обратная сторона looks_done, у которой предмет противоположный — работа сделана, а контейнер открыт. Окно ревизии названо в самой строке: утверждение верно ровно для этих задач. Ревизия считается ДВУМЯ числами: свежее закрытое и закрытое до того, как у проекта появился счётчик пунктов (task_shape.ITEMS_SINCE — 10.09.2026, день заведения items.py). До него отметить пункты было нечем, ответ по таким задачам известен заранее, и держать их в общем числе значит держать постоянное слагаемое, которое перестают читать (051). Из ревизии они не исчезают — названы отдельно и с причиной (046). Приём тот же, что у отметки атрибуции cb26ec4 | `Engineering-Incidents-Playbook` | | 124 | `Engineering-Incidents-Playbook` — документ: AGENTS.md § Перезапуск — это диагностика. Перезапускается ОДНА упавшая работа, а не весь прогон; попытка ровно одна — второй перезапуск того же места это попытка получить нужный ответ повторением вопроса. Три случая разрешённого перезапуска разведены таблицей, и каждый называет, ЧТО записывается: причина найдена и устранена — ничего, это обычная починка; работа умерла до первого теста — фрагмент журнала; та же работа зеленела на этом же коммите раньше — фрагмент журнала как НЕСТАБИЛЬНОСТЬ, с номером прогона. Отдельного реестра нестабильностей нет намеренно: запись едет тем же фрагментом в changelog.d/, что и всякая починка, и там же отвечает, тянет ли она на правило — второй реестр разошёлся бы с первым (022). Сказано и то, что «флаки» причиной не является. У соседа это прогон с закрытым списком разрешённых к автоперезапуску и своим файлом находок; приём взят, файл нет — здесь перезапускает человек кнопкой площадки, и автоматического перезапуска нет вовсе (162). ГРАНИЦА: что перезапуск СОСТОЯЛСЯ, машина здесь не видит — кнопку жмёт человек, и запись остаётся на нём; `Stepik-Python-Grader` — конвейер: scripts/rerun_flaky_checks.py: список разрешённых к автоперезапуску закрыт, попытка ровно одна, а зелёное со второго раза записывается находкой в docs/agent/flaky-runs.md; `ArtVsMark` — документ: ВЕРДИКТ ИСПРАВЛЕН 8 СЕНТЯБРЯ: стояло «набор проверок — одна: выбирать, что перезапускать, не из чего». РАЗЛОЖЕНО НАДВОЕ по 182. ПЕРВАЯ ПОЛОВИНА — «перезапускать минимум» — предмета не имеет, и теперь по названной причине, а не по счёту работ: работ на изменении четыре (agent-pr, PR check, automerge, release-hold), но набор тестов один, а автоматического перезапуска нет нигде — группа одновременности в .github/workflows/pr-check.yml ОТМЕНЯЕТ прогон на устаревшей голове, а не запускает заново. ВТОРАЯ ПОЛОВИНА — «зелёное со второго раза — находка» — предмет имеет, и он проявился в тот же день: изменение #183 стояло готовым при зелёных проверках девять с половиной минут, и его расклинило внешним толчком, после которого проверка прошла заново. Находка записана в задачу #148 замером — три случая, их длительность и порог, — а не списана на случайность. ДЕРЖИТСЯ ЗАПИСЬЮ: сторожа застрявших изменений пока нет, он и есть предмет #148; `Claude-Code_Usage-Token` — документ: CLAUDE.md § «Перезапуск проверки — это диагностика» — перезапускается ОДНА упавшая проверка, а не весь набор; зелёное со второго раза записывается находкой с именем проверки и коммитом, иначе набор тихо теряет доверие. Замер 2026-09-03 на #87 приведён там же: перезапущены были три отменённых прогона, а не набор, зелёное принято находкой, разобрано задачей #88 и ПОЧИНЕНО правкой групп отмены (scripts/concurrency_head.py), а не повторным нажатием.; `Engineering-Pipeline-Mechanisms` — гейт: scripts/main_red.py — упал ровно один обязательный джоб: перезапускается он один и ОДИН раз, номер попытки спрашивается у площадки (`run_attempt`), а не хранится, поэтому бесконечный повтор невозможен по построению; зелёное со второго раза записывается находкой о мигании в живую задачу, а не считается починкой. .github/workflows/main-red.yml — право `actions: write` объявлено ровно здесь и только здесь. tests/test_main_red.py проверяет отказом: вторая попытка, несколько красных сразу и неразобранный адрес записи дают три РАЗНЫЕ причины не перезапускать | `Glossary-Python` | | 133 | `Engineering-Incidents-Playbook` — конвейер: scripts/check_overlap.py — шаг «кто ещё правит те же файлы» в .github/workflows/agent-pr.yml: пересечение файлов ветки с чужими ОТКРЫТЫМИ изменениями печатается и пишется в сводку работы, где его видит толкнувший. Не отказ: пересечение бывает законным — производные трогает почти каждая правка, и красное на законном приучало бы пропускать красное (051). Живость берётся у площадки, а не из формы истории: слияние идёт squash, и git branch --no-merged считает живыми все 23 ветки из двух. ГРАНИЦА: шаг стоит на стороне площадки, потому что в агентском окне gh нет — там проверка отвечает третьим исходом; `Stepik-Python-Grader` — конвейер: граница PR считается пересечением файлов, а не числом задач: scripts/check_work_overlap.py зовётся неблокирующим шагом scripts/preflight.py; `ArtVsMark` — документ: CLAUDE.md § Критические запреты — оговорка к запрету на несколько тем: пересечение файлов сильнее темы. У витрины общие файлы почти у каждой правки — HISTORY.md и .rules/bindings.json, — поэтому изменения идут по одному, и встречи на общем файле не случается; `Claude-Code_Usage-Token` — документ: CLAUDE.md § «Работа с GitHub». Признак нужды выполнялся здесь буквально и дорого: .rules/bindings.json правит КАЖДАЯ порция разбора целиком, и параллельные ветки встречаются в нём гарантированно. Замер 2026-09-03: пять порций подряд ехали строго по одной, каждая ждала мержа предыдущей, и заход растянулся на пять кругов очереди вместо одного. Приём, который правило даёт для этого случая — ставить ветки СТОПКОЙ, одна на другую, — записан вместе с порядком проверки (сначала зоны, потом пересечение файлов внутри зоны) И ВМЕСТЕ С ЕГО ГРАНИЦЕЙ: конвейер стопку пока не держит — scripts/merge_queue.py перечисляет PR с фильтром по базе main, и PR, поставленный на ветку agent/**, очередь не видит вовсе. Проверено чтением кода очереди после того, как приём был записан, — то есть механизм сверен с правилом, а не подразумеван под ним. Разбор — задача #98.; `Engineering-Pipeline-Mechanisms` — документ: AGENTS.md — граница изменения задаётся пересечением файлов. ЧИСЛО ТЕПЕРЬ СЧИТАЕТСЯ, А НЕ ВСПОМИНАЕТСЯ: scripts/change_parts.py печатает, на сколько компонент связности распадается дифф против общей ветки (файлы связаны, если тронуты одним коммитом), и зовёт его навык close-a-finding перед коммитом. Механизм НЕ КРАСНЕЕТ намеренно — он называет величину и оставляет решение автору; гейтом признак быть не может, и это замерено, а не предположено. Держит tests/test_change_parts.py, включая третий исход: пустой вход даёт отказ, а не «одна часть» — иначе «граница соблюдена» прозвучало бы там, где предмета не было вовсе | `Glossary-Python` | | 135 | `Engineering-Incidents-Playbook` — гейт: scripts/check_attribution.py — личность окна узнаётся ЗАПИСЬЮ и проверяется по ней: гейт сверяет поле автора коммитов ветки (при слиянии объединяющим коммитом в общую ветку едет именно оно) и трейлеры соавторства против разрешительного списка .github/authors.txt, а .github/workflows/attribution-history.yml спрашивает то же у первопредков main — там, где подмена и проявляется. ПРЕЖНИЙ ОТВЕТ БЫЛ НЕВЕРЕН: «проба делается ДО работы, а гейт стоит после неё» — но 135 и говорит, что личность узнаётся записью, а не опросом, и проверка записи это и есть проба. Живой случай в тот же корпус: 2 сентября окружение окна сменило подпись соавтора с «Claude» на «Claude Opus 5» молча, ни о чём не объявив; нашла это проверка по первопредкам, а не опрос токена и не память окна. ГРАНИЦА: ДО первой записи личность по-прежнему неизвестна — гейт узнаёт её постфактум, и пробным изменением остаётся первое же; `Stepik-Python-Grader` — документ: CLAUDE.md § Формат коммитов: автор PR — человек, соавторство — место вклада Claude; scripts/check_pr_ready.py и scripts/check_attribution.py --check-branch запускаются окном, а не прогоном; `ArtVsMark` — гейт: .rules/README.md § Из окна не пишут — личность этого окна установлена пробой того же класса, а не опросом токена, и результат годен только для него: следующее окно проверяет заново. scripts/check_author.py — то, что окно подписалось не тем именем, теперь выясняется записью и проверкой, а не памятью; `Claude-Code_Usage-Token` — документ: .github/workflows/merge-queue.yml. Проба сделана и её итог записан в самом файле: PR, открытые окном, числятся за владельцем, а не за ботом, — то есть личность на записи установлена ЗАПИСЬЮ, а не выведена из класса окружения. Второе подтверждение пришло само, на разборе правила 123: у коммитов в main автор — владелец, а committer — GitHub, и обе подписи проверены по конечной истории. Опрос учётных данных этого не показал бы: на чтении токен отвечает владельцем независимо от того, чем он подпишет запись.; `Engineering-Pipeline-Mechanisms` — гейт: .github/workflows/attribution-history.yml — личность записи узнаётся ЗАПИСЬЮ: первопредками общей ветки, а не тем, что окно объявило о себе. Гейт на изменении этого не видит по построению — он спрашивает коммиты ветки, а в общую ветку едет уплотнение, тело которому составляет очередь. Замер 10.09.2026: из ста первопредков после объявленной отметки шестнадцать шли без строки соавтора, и все они старше того дня, когда очередь научилась переносить трейлеры. Отметка `since` объявлена в прогоне: старый хвост переписать нечем, а вечное красное — фон, а не сигнал (051). Плюс CLAUDE.md, раздел «Подпись и открытие изменения». | `Glossary-Python` | | 142 | `Engineering-Incidents-Playbook` — гейт: .github/workflows/consumers-sync.yml — шаг «у находки есть адресат» заводит задачу при отказе; scripts/review_findings.py — заметки внешнего взгляда переживают слияние: они записываются в живую задачу с отпечатком и снимаются строкой «Разобрано: <отпечаток>» в теле изменения-починки. Замер 8 сентября: из 29 слитых изменений с прогоном ревью вердикт успел к слиянию у 10, и находки #392 не увидел никто; `Stepik-Python-Grader` — конвейер: scripts/nightly_checks.py — ночной обход ведёт одну задачу с меткой «ночной обход»: пока находки есть, она открыта и обновляется, стало чисто — закрывается; красным прогон при этом не становится, потому что красное на вкладке прогонов адресатом не является; `ArtVsMark` — конвейер: предметов ЧЕТЫРЕ, перебраны все — четвёртый добавлен 8 сентября вместе со сторожем застрявших изменений (.github/workflows/stuck-prs.yml и scripts/stuck_prs.py): изменение, готовое и не слитое, не краснеет НИГДЕ, и адресата у этого молчания не было вовсе. Прежде здесь стояло «предметов три», и это было верно ровно до появления четвёртого. .github/workflows/metrics.yml — отказ приезжает изменением, то есть в трекер и в почту владельцу; .github/workflows/rules-inbox.yml — очередь нерассмотренных правил ведёт задачу, а не красноту на вкладке прогонов. Третий предмет закрыт: .github/workflows/main-red.yml — дежурный по общей ветке спрашивает вкладку прогонов раз в сутки и ведёт ОДНУ задачу, пока там есть красное. Адресат один на ВСЕ прогоны, а не по одному на каждый: пробел был назван у attribution-history, но предмет оказался крупнее — красное на общей ветке не принадлежит никому у любого прогона. Логика взята у каталога ссылкой на закреплённую версию — дежурный каталога, вынесенный туда этим же окном (playbook#139, playbook#141); своей копии здесь нет. Исключений у витрины НЕТ, и это решение: у каталога attribution-history исключён, потому что его красное означало бы непочинимый долг прошлого, а здесь долг объявлен заново ключом --since, и каждое новое красное на нём означает новый дефект; .github/workflows/staleness.yml — у устаревшей витрины появился адресат: сторож ведёт ОДНУ задачу и не красит вкладку прогонов, потому что красное было бы вторым адресатом того же сообщения. Инцидент 28 августа: суточная сборка не запустилась ни разу, витрина сутки показывала вчерашнее, и заметил это владелец — у пропущенного прогона адресата не было вовсе, потому что самого прогона не было; `Claude-Code_Usage-Token` — конвейер: .github/workflows/schedule-alarm.yml и scripts/schedule_alarm.py. Отказ прогона по расписанию заводит ОДНУ задачу на этот прогон и закрывает её, как только тот снова зелёный. Повторные отказы её не комментируют — обновляют тело молча: очередь мержей ходит 48 раз в сутки, и комментарий на каждый был бы способом от задачи отписаться, а не адресатом. Сторож вынесен отдельным прогоном не из вкуса: шагу `if: failure()` внутри очереди понадобилось бы право писать задачи, и досталось бы оно всему остальному в том прогоне. ГРАНИЦА НАЗВАНА: прогон, умерший так, что события о завершении не пришло вовсе, сторож не ловит — отличить это от «не запускалось» можно только опросом по времени, то есть ещё одним прогоном по расписанию, у которого была бы та же беда. Связь сторожа со сторожимыми держит тест tests/test_schedule_alarm.py: переименование прогона иначе отключило бы сторожа молча.; `Engineering-Pipeline-Mechanisms` — гейт: scripts/review_findings.py — находки внешнего взгляда уезжают в живую задачу-адресата и снимаются строкой «Разобрано: <отпечаток>» в теле изменения; scripts/unlooked.py — сам факт отсутствия взгляда; scripts/main_red.py — краснота общей ветки, разведённая по классу проверки; .pipeline.yml — у КАЖДОЙ совещательной проверки объявлено поле `addressee` с разрешимым адресом, и scripts/pipeline_checks.py отвергает ответ без него: красное, которому негде пережить слияние, делает совещательную проверку вежливо выключенной. tests/test_pipeline_checks.py проверяет это отказом | `Glossary-Python` | | 149 | `Stepik-Python-Grader` — гейт: tests/conftest.py — фикстура _system_temp_inside_basetemp уводит системный temp внутрь pytest-basetemp на время прогона; правило родилось здесь, из ложного обвинения стороннего теста; `ArtVsMark` — гейт: предмет нашёлся при вынесении этого вердикта, а не был известен заранее: .github/workflows/agent-pr.yml и .github/workflows/metrics.yml писали тело изменения в /tmp — общий каталог исполнителя, куда одинаково ходят и прогон, и всё остальное на машине. Переведены на $RUNNER_TEMP: площадка выдаёт его КАЖДОМУ прогону отдельно, то есть прогон площадку забирает себе, а не полагается на то, что сосед не помешает. Исключений по имени не заводилось ни одного, и это соответствует правилу: список исключений оставил бы площадку общей. Тот же выбор у каталога — его дежурный пишет в $RUNNER_TEMP. ПРОБЕЛ ЗАКРЫТ 28 августа: scripts/check_mechanisms.py::audit_runners разбирает прогоны и отвергает запись в общий /tmp. Гейт над прогонами завёлся не ради одной строки — вместе с ним закрылись 100, 104 и 022/073, то есть все утверждения вида «у ВСЕХ прогонов так», которые до того проверялись чтением восьми файлов глазами. Ровно этого и ждал вердикт: заводить гейт под один предмет было дорого, под четыре — дёшево. Прежняя запись о поведении automerge — 010, 063, 111, 126. Заводить его ради одной строки в scripts/check_page.py значило бы растянуть предмет чужого гейта: тот отвечает за ТЕКСТ витрины, а не за прогоны; `Engineering-Pipeline-Mechanisms` — гейт: tests/test_suite_owns_its_ground.py — предикат ПО ДЕРЕВУ: набор не называет общей площадки (системный временный каталог, домашняя папка) и свой сервер поднимает на порту, который выбирает площадка, а не мы; третья проверка меряет довод — своя площадка у набора действительно в ходу, иначе оба запрета держали бы пустоту. Замер 18.09.2026: обращений к общей площадке НОЛЬ — файлы механизмов собираются в tmp_path (tests/test_facts.py, tests/test_gates_reject.py), транспорт проверяется на своём HTTP-сервере со случайным портом (tests/test_ghrest.py). Исключений по имени в наборе нет ни одного. ЧИТАЕТСЯ ВСЁ РАЗБОРОМ, и три способа назвать площадку разведены по трём узлам: литерал «/tmp», вызов (home, expanduser, gettempdir, mkdtemp), чтение environ[HOME]. Прежняя редакция сверяла построчно одним набором образцов и отсеивала комментарии по решётке — то есть докстроку отсеять не могла вовсе, и проза о /tmp покраснела бы наравне с обращением, а «Path . home ()» с пробелами прошло бы. Подтверждено откатом всеми тремя способами и отрицательным исходом: упоминание в докстроке зелено. Предел назван: список литералов закрытый, написанное иначе пройдёт | `Engineering-Incidents-Playbook` | | 187 | `Stepik-Python-Grader` — гейт: scripts/ci_aggregate.py и .github/workflows/ci-complete.yml — один вердикт с постоянным именем, собранный ЧЕРЕЗ API, а не через needs: джоб на зависимостях при падении соседа пропускается, а пропущенное защита ветки засчитывает как пройденное; закреплено в CLAUDE.md § Гейты; `ArtVsMark` — гейт: scripts/check_mechanisms.py::required_job_conditions — у работы, чья запись держит слияние, не должно быть условия уровня работы: пропущенная работа оставляет запись «skipped», а защита ветки сверяет ИМЯ, а не исход, и нейтральное засчитывает. Правило родилось здесь: 7 сентября изменение #140 слилось при КРАСНОЙ обязательной проверке — на голове лежали три записи с именем PR check (failure, skipped, cancelled). Вторая половина держится там же: .github/workflows/pr-check.yml — одна группа отмены на голову, проверяется scripts/check_mechanisms.py::cancellation_groups.; `Engineering-Pipeline-Mechanisms` — гейт: scripts/ci_complete.py — пропущенная, отменённая и отсутствующая записи считаются отказом; tests/test_gates_complete.py прогоняет каждый из этих случаев. Признак нарушения, названный самим правилом, проверяется отдельно: scripts/ci_complete.py отвергает голову, на которой больше ОДНОЙ живой записи с именем обязательной проверки, — вердикт по такой голове неоднозначен, и молчаливый выбор между записями был бы выбором наугад | `Engineering-Incidents-Playbook` | | 199 | `ArtVsMark` — code: предмет есть и перебран: событийных прогонов в группе с cancel-in-progress: false у витрины два. .github/workflows/agent-pr.yml — будится пушем и внутри захода СПРАШИВАЕТ состояние: открыто ли уже изменение (gh pr list) и разошлась ли ветка с main, вместо того чтобы верить событию. .github/workflows/release-hold.yml — будится завершением чужого прогона и читает состояние проверок изменения через scripts/hold.py, а не исход разбудившего события. Остальные группы отменяют предыдущий заход (cancel-in-progress: true) и предметом правила не являются.; `Engineering-Pipeline-Mechanisms` — гейт: scripts/automerge.py::hand_over — заход очереди больше не ждёт зелёного внутри себя, и потому его смерть в очереди ничего не теряет: взведение у площадки ПЕРЕЖИВАЕТ прогон, который его выдал, и слияние случится без нового события. Прежде здесь стоял опрос внутри захода, заведённый от замера 10.09.2026 — 45 из 120 заходов умерли, не начав работу, — но он лечил следствие: держал исполнителя и упирался в собственный предел. Решение docs/decisions/011-merging-is-handed-to-the-platform.md отдало ожидание площадке. Держит это tests/test_automerge.py | `Engineering-Incidents-Playbook` | | 200 | `ArtVsMark` — документ: projects.json — у каждого показателя проекта либо источник значения, либо отказ с причиной; scripts/build_metrics.py::verify_absence проверяет, что отказ не устарел. Числа самой витрины перебраны 17 сентября на «может ли оно стать другим»: тесты, покрытие, проверки на изменение, выпуски, версии Python, звёзды, подписанные коммиты — все ходят, знаменателя по построению нет ни у одного.; `Engineering-Pipeline-Mechanisms` — гейт: tests/test_facts.py — значок правил считает держащиеся МАШИНОЙ от действующих, а не `answered/total`: прежнее число было равно знаменателю по построению и не могло сдвинуться никогда. Гейт сверяет, что значок несёт то же число, что и факты. ВТОРАЯ ПОЛОВИНА ПРИТЯЗАНИЯ — «назовите ЗАРАНЕЕ, при каком событии значок покажет другое» — держится с 18.09.2026: .rules/showcase.json, раздел `moves`, объявляет событие по каждому значку инвентаря, а tests/test_showcase.py требует объявления у всех шести и отвергает отписку короче двадцати знаков; обратная половина там же — объявление не переживает свой значок. Предмет берётся из ИНВЕНТАРЯ СБОРКИ, а не из объявления: иначе забытый значок вышел бы из-под проверки вместе со своей записью | `Engineering-Incidents-Playbook` | | 202 | `Engineering-Incidents-Playbook` — гейт: .claude/hooks/push_guard.py — `ветка_воскресает`: перед толчком сверяет свою ссылку `refs/remotes/origin/<ветка>` с ответом площадки, и толчок в удалённую при слиянии ветку не уезжает вовсе. Предмет проверки задаёт `везёт_содержимое`: чистое удаление ссылки (`--delete`, `-d`, `:имя`) коммитов не переносит и пропускается, смешанная форма `git push origin своя :чужая` остаётся толчком содержимого, а адресат явной ссылки разворачивается через `цель` — `HEAD:другая` текущей ветки не касается и отказа не получает (051). Строку разбирает одна функция `толчки`, её ответу задаются все три вопроса файла; `Engineering-Pipeline-Mechanisms` — гейт: ДВА МЕХАНИЗМА, И ОНИ СПРАШИВАЮТ РАЗНОЕ. (1) .claude/hooks/push_guard.py::merged_away — перед вызовом git, ЛОКАЛЬНЫМИ ссылками: слежение за ОДНОИМЁННОЙ веткой (так его ставит push -u) при исчезнувшей ссылке origin/<имя>. Первое означает «ветку толкали», второе — «площадка её убрала». Предмет — ветка ЦЕЛИ толчка, а не голова: у формы `HEAD:имя` они разные. Держит tests/test_push_guard.py на живых репозиториях. ЗАМЕР 18.09.2026 ПО 147 ЖИВЫМ ВЕТКАМ: признак верно называет 145; предел — ветка, толкнутая БЕЗ -u, таких одна из 147. ВТОРОЙ ПРЕДЕЛ И ОКАЗАЛСЯ ДОРОГИМ: локальные ссылки устаревают до первого git fetch, и окно, не видевшее слияния, проходит. (2) scripts/check_branch_revival.py::look — вопрос ПЛОЩАДКЕ, зовётся из scripts/preflight.py::push_branch перед толчком. Признак: по этой ГОЛОВЕ уже есть СЛИТОЕ изменение (head=<владелец>:<ветка>, merged_at не пуст). Отсутствие ветки предметом не является: воскрешённая существует и от живой неотличима. Закрытое БЕЗ слияния предметом не является тоже — по такой ветке работают дальше (051). Отказ называет, что делать вместо толчка (104). ЗАМЕР 19.09.2026 ПО ВСЕМ ВЕТКАМ ПЛОЩАДКИ: их пять, ровно одна несёт слитое изменение — agent/an-empty-parametrisation-must-redden, изменение #509, та самая ветка из инцидента. Держит tests/test_branch_revival.py (девять прогонов, все четыре объявленных исхода) и tests/test_window_preflight.py — вшивка судится СОСТАВОМ вызовов git, а не кодом возврата. Названные пределы: толчок с чужой машины мимо предполётной, и отсутствие токена — тогда гейт говорит «не спросили», а не «чисто» (045). | `ArtVsMark` | | 205 | `Engineering-Pipeline-Mechanisms` — гейт: tests/test_bindings.py::test_every_inapplicable_answer_names_a_predicate_over_the_tree — у каждого ответа «неприменимо» требуется признак опровержимости: путь, каталог, команда или число. Одного СОБЫТИЯ не хватает, и это второй конец проверки: test_an_event_alone_is_not_a_predicate отвергает «правило вступит вместе с первым подагентом». | `Engineering-Incidents-Playbook` | | 207 | `Engineering-Pipeline-Mechanisms` — гейт: scripts/audit_profile.py — ПОРЯДОК прохода считается механизмом, а не выбирается: подозрение есть доля корней притязания правила, встреченных в тексте ответа, и заход печатает полосы, остаток и следующую пачку. Сверенность берётся из самого ответа (поле analysed), а не из списка рядом, который надо не забыть обновить (049). Процедуру держит навык .claude/skills/audit-the-answers/SKILL.md: пачка, замер по дереву вместо чтения, отметка в ответе, отдача числом и решение идти дальше. tests/test_audit_profile.py проверяет отказом — пустая выгрузка, пустые ответы, несошедшиеся номера и правило без притязания дают третий исход, а не пустой профиль, который читался бы как «всё сверено». docs/decisions/030-the-answer-audit-stops-on-a-measured-yield.md — первый заход и его числа | `Engineering-Incidents-Playbook` | | 208 | `Engineering-Pipeline-Mechanisms` — гейт: scripts/preflight.py — заход `--push` толкает ветку ТЕМ ЖЕ вызовом, который проверяет, и красное до толчка не доходит: `push_branch` зовётся из `main` только после зелёного вердикта. Обход остался возможным и стал отдельным названным действием — заход без `--push` печатает вердикт и не толкает, а `git push` руками проект не запрещает. Держат tests/test_window_preflight.py (толчок на красном, толчок без просьбы, ветка без приставки agent/) и .claude/hooks/push_guard.py со стороны цели толчка. | `Engineering-Incidents-Playbook` | ## Сколько держит механизм · How much each mechanism holds > Считается путь к файлу, найденный в поле `where` ответа потребителя. Механизм, держащий много правил, — это и образец, и точка отказа. > Counted by the file path found in the consumer's `where` field. A mechanism holding many rules is both a model to copy and a single point of failure. | Проект · Project | Механизм · Mechanism | Держит правил · Rules held | |---|---|---| | `Engineering-Incidents-Playbook` | `scripts/build_rules_index.py` | 16 | | `Engineering-Incidents-Playbook` | `scripts/check_bindings.py` | 14 | | `Engineering-Incidents-Playbook` | `.github/workflows/ci.yml` | 12 | | `Engineering-Incidents-Playbook` | `scripts/check_gates.py` | 12 | | `Engineering-Incidents-Playbook` | `AGENTS.md` | 11 | | `Engineering-Incidents-Playbook` | `scripts/aggregate_bindings.py` | 10 | | `Engineering-Incidents-Playbook` | `export/README.md` | 9 | | `Engineering-Incidents-Playbook` | `.github/workflows/agent-pr.yml` | 8 | | `Engineering-Incidents-Playbook` | `.github/workflows/automerge.yml` | 8 | | `Engineering-Incidents-Playbook` | `scripts/check_charter.py` | 7 | | `Engineering-Incidents-Playbook` | `scripts/check_workflows.py` | 7 | | `Engineering-Incidents-Playbook` | `scripts/link_trails.py` | 7 | | `Engineering-Incidents-Playbook` | `CONTRIBUTING.md` | 6 | | `Engineering-Incidents-Playbook` | `scripts/check_prose.py` | 6 | | `Engineering-Incidents-Playbook` | `scripts/check_showcase.py` | 6 | | `Engineering-Incidents-Playbook` | `scripts/check_subprocess.py` | 5 | | `Engineering-Incidents-Playbook` | `scripts/collect_proposals.py` | 5 | | `Engineering-Incidents-Playbook` | `.claude/hooks/push_guard.py` | 4 | | `Engineering-Incidents-Playbook` | `.rules/consumers.json` | 4 | | `Engineering-Incidents-Playbook` | `.rules/schedules.json` | 4 | | `Engineering-Incidents-Playbook` | `CLAUDE.md` | 4 | | `Engineering-Incidents-Playbook` | `README.md` | 4 | | `Engineering-Incidents-Playbook` | `scripts/audit_catalogue.py` | 4 | | `Engineering-Incidents-Playbook` | `scripts/check_attribution.py` | 4 | | `Engineering-Incidents-Playbook` | `scripts/ghcli.py` | 4 | | `Engineering-Incidents-Playbook` | `scripts/main_red.py` | 4 | | `Engineering-Incidents-Playbook` | `scripts/refresh_derived.py` | 4 | | `Engineering-Incidents-Playbook` | `scripts/sync_inbox.py` | 4 | | `Engineering-Incidents-Playbook` | `.github/labels.yml` | 3 | | `Engineering-Incidents-Playbook` | `.rules/transport.json` | 3 | | `Engineering-Incidents-Playbook` | `action.yml` | 3 | | `Engineering-Incidents-Playbook` | `docs/HISTORY.md` | 3 | | `Engineering-Incidents-Playbook` | `export/rules.json` | 3 | | `Engineering-Incidents-Playbook` | `scripts/check_locale.py` | 3 | | `Engineering-Incidents-Playbook` | `scripts/check_schedules.py` | 3 | | `Engineering-Incidents-Playbook` | `scripts/check_transport.py` | 3 | | `Engineering-Incidents-Playbook` | `scripts/collect_changelog.py` | 3 | | `Engineering-Incidents-Playbook` | `scripts/history_metrics.py` | 3 | | `Engineering-Incidents-Playbook` | `scripts/merge_ready.py` | 3 | | `Engineering-Incidents-Playbook` | `scripts/version.py` | 3 | | `Engineering-Incidents-Playbook` | `tests/test_ghcli.py` | 3 | | `Engineering-Incidents-Playbook` | `tests/test_sync_inbox.py` | 3 | | `Engineering-Incidents-Playbook` | `.github/workflows/attribution-history.yml` | 2 | | `Engineering-Incidents-Playbook` | `.github/workflows/badges.yml` | 2 | | `Engineering-Incidents-Playbook` | `.github/workflows/consumers-sync.yml` | 2 | | `Engineering-Incidents-Playbook` | `.github/workflows/main-red.yml` | 2 | | `Engineering-Incidents-Playbook` | `.github/workflows/off-prefix.yml` | 2 | | `Engineering-Incidents-Playbook` | `.github/workflows/review.yml` | 2 | | `Engineering-Incidents-Playbook` | `.rules/bindings.json` | 2 | | `Engineering-Incidents-Playbook` | `.rules/exclusives.json` | 2 | | `Engineering-Incidents-Playbook` | `docs/VERSIONING.md` | 2 | | `Engineering-Incidents-Playbook` | `export/where.json` | 2 | | `Engineering-Incidents-Playbook` | `rules/README.md` | 2 | | `Engineering-Incidents-Playbook` | `scripts/check_links.py` | 2 | | `Engineering-Incidents-Playbook` | `scripts/check_own_name.py` | 2 | | `Engineering-Incidents-Playbook` | `scripts/check_python_version.py` | 2 | | `Engineering-Incidents-Playbook` | `scripts/check_skips.py` | 2 | | `Engineering-Incidents-Playbook` | `scripts/check_verdict_order.py` | 2 | | `Engineering-Incidents-Playbook` | `scripts/pr_body.py` | 2 | | `Engineering-Incidents-Playbook` | `scripts/review_findings.py` | 2 | | `Engineering-Incidents-Playbook` | `scripts/sync_labels.py` | 2 | | `Engineering-Incidents-Playbook` | _остальные_ · _the rest_ | 49 механизмов по одному правилу; без названного адреса: 1 из 165 | | `Stepik-Python-Grader` | `CLAUDE.md` | 46 | | `Stepik-Python-Grader` | `.github/workflows/ci.yml` | 14 | | `Stepik-Python-Grader` | `scripts/check_rule_bindings.py` | 14 | | `Stepik-Python-Grader` | `docs/agent/multiagent.md` | 12 | | `Stepik-Python-Grader` | `.github/workflows/tracker-guardrails.yml` | 9 | | `Stepik-Python-Grader` | `docs/agent/preflight.md` | 9 | | `Stepik-Python-Grader` | `scripts/gh_rest.py` | 9 | | `Stepik-Python-Grader` | `scripts/check_pr_ready.py` | 8 | | `Stepik-Python-Grader` | `scripts/preflight.py` | 8 | | `Stepik-Python-Grader` | `docs/agent/environments.md` | 7 | | `Stepik-Python-Grader` | `scripts/check_docs_guardrails.py` | 7 | | `Stepik-Python-Grader` | `docs/agent/roles.md` | 6 | | `Stepik-Python-Grader` | `scripts/check_workflow_guardrails.py` | 6 | | `Stepik-Python-Grader` | `.rules/bindings.json` | 5 | | `Stepik-Python-Grader` | `CHANGELOG.md` | 4 | | `Stepik-Python-Grader` | `scripts/check_adr_records.py` | 4 | | `Stepik-Python-Grader` | `scripts/check_attribution.py` | 4 | | `Stepik-Python-Grader` | `scripts/check_work_overlap.py` | 4 | | `Stepik-Python-Grader` | `.rules/proposals.json` | 3 | | `Stepik-Python-Grader` | `CONTRIBUTING.md` | 3 | | `Stepik-Python-Grader` | `HISTORY.md` | 3 | | `Stepik-Python-Grader` | `docs/agent/claude-handoff.md` | 3 | | `Stepik-Python-Grader` | `docs/agent/course-walkthrough.md` | 3 | | `Stepik-Python-Grader` | `scripts/check_declared_outcomes.py` | 3 | | `Stepik-Python-Grader` | `scripts/check_hidden_defaults.py` | 3 | | `Stepik-Python-Grader` | `scripts/rerun_flaky_checks.py` | 3 | | `Stepik-Python-Grader` | `src/stepik_grader/web/playground.py` | 3 | | `Stepik-Python-Grader` | `templates/bindings.json` | 3 | | `Stepik-Python-Grader` | `.claude/hooks/pre_tool_use.py` | 2 | | `Stepik-Python-Grader` | `.github/workflows/agent-pr.yml` | 2 | | `Stepik-Python-Grader` | `.rules/sources_of_truth.json` | 2 | | `Stepik-Python-Grader` | `docs/dev/corpus.md` | 2 | | `Stepik-Python-Grader` | `docs/dev/glossary.md` | 2 | | `Stepik-Python-Grader` | `gh_rest.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_audit_registry.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_branch_protection.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_gate_tests.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_generated_sources.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_glossary_examples.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_locale_guardrails.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_orphan_branches.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_raw_values.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_rules_digest.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_sources_of_truth.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_stale_repo_names.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_three_outcomes.py` | 2 | | `Stepik-Python-Grader` | `scripts/check_version_consistency.py` | 2 | | `Stepik-Python-Grader` | `scripts/generate_rules_digest.py` | 2 | | `Stepik-Python-Grader` | `scripts/link_rules_to_issues.py` | 2 | | `Stepik-Python-Grader` | `scripts/move_merge_queue.py` | 2 | | `Stepik-Python-Grader` | `scripts/nightly_checks.py` | 2 | | `Stepik-Python-Grader` | `src/stepik_grader/core/runner.py` | 2 | | `Stepik-Python-Grader` | `src/stepik_grader/web/runs.py` | 2 | | `Stepik-Python-Grader` | `tests/conftest.py` | 2 | | `Stepik-Python-Grader` | `tests/test_runner.py` | 2 | | `Stepik-Python-Grader` | `tests/test_runs.py` | 2 | | `Stepik-Python-Grader` | _остальные_ · _the rest_ | 89 механизмов по одному правилу; без названного адреса: 0 из 192 | | `ArtVsMark` | `scripts/build_metrics.py` | 64 | | `ArtVsMark` | `scripts/check_mechanisms.py` | 45 | | `ArtVsMark` | `CLAUDE.md` | 23 | | `ArtVsMark` | `.github/workflows/pr-check.yml` | 17 | | `ArtVsMark` | `.github/workflows/automerge.yml` | 15 | | `ArtVsMark` | `scripts/check_bindings.py` | 15 | | `ArtVsMark` | `scripts/check_labels.py` | 15 | | `ArtVsMark` | `.github/workflows/agent-pr.yml` | 14 | | `ArtVsMark` | `scripts/checks.py` | 14 | | `ArtVsMark` | `README.md` | 13 | | `ArtVsMark` | `scripts/check_roles.py` | 13 | | `ArtVsMark` | `scripts/check_author.py` | 11 | | `ArtVsMark` | `scripts/check_page.py` | 11 | | `ArtVsMark` | `.github/workflows/metrics.yml` | 10 | | `ArtVsMark` | `.rules/README.md` | 10 | | `ArtVsMark` | `.rules/roles.md` | 10 | | `ArtVsMark` | `scripts/hold.py` | 10 | | `ArtVsMark` | `.github/workflows/release-hold.yml` | 9 | | `ArtVsMark` | `HISTORY.md` | 9 | | `ArtVsMark` | `scripts/gh_outcome.py` | 9 | | `ArtVsMark` | `.rules/bindings.json` | 8 | | `ArtVsMark` | `projects.json` | 6 | | `ArtVsMark` | `scripts/check_journal.py` | 6 | | `ArtVsMark` | `.github/workflows/main-red.yml` | 5 | | `ArtVsMark` | `.github/workflows/rules-inbox.yml` | 5 | | `ArtVsMark` | `pr-check.yml` | 4 | | `ArtVsMark` | `scripts/neighbours.py` | 4 | | `ArtVsMark` | `.github/workflows/attribution-history.yml` | 3 | | `ArtVsMark` | `.rules/proposals.json` | 3 | | `ArtVsMark` | `agent-pr.yml` | 3 | | `ArtVsMark` | `.github/workflows/snake.yml` | 2 | | `ArtVsMark` | `.rules/facts-contract.md` | 2 | | `ArtVsMark` | `CHANGELOG.md` | 2 | | `ArtVsMark` | `scripts/check_branch.py` | 2 | | `ArtVsMark` | `scripts/collect_changelog.py` | 2 | | `ArtVsMark` | _остальные_ · _the rest_ | 9 механизмов по одному правилу; без названного адреса: 0 из 145 | | `Claude-Code_Usage-Token` | `CLAUDE.md` | 34 | | `Claude-Code_Usage-Token` | `scripts/preflight.py` | 30 | | `Claude-Code_Usage-Token` | `docs/spec.md` | 15 | | `Claude-Code_Usage-Token` | `.github/workflows/rules-inbox.yml` | 13 | | `Claude-Code_Usage-Token` | `scripts/rules_answer.py` | 13 | | `Claude-Code_Usage-Token` | `.rules/bindings.json` | 12 | | `Claude-Code_Usage-Token` | `scripts/changelog.py` | 11 | | `Claude-Code_Usage-Token` | `scripts/merge_queue.py` | 10 | | `Claude-Code_Usage-Token` | `src/claude_code_usage/whitelist.py` | 10 | | `Claude-Code_Usage-Token` | `scripts/pr_check.py` | 9 | | `Claude-Code_Usage-Token` | `scripts/pr_ready.py` | 9 | | `Claude-Code_Usage-Token` | `scripts/utf8_output.py` | 9 | | `Claude-Code_Usage-Token` | `.rules/showcase.json` | 7 | | `Claude-Code_Usage-Token` | `docs/labels.md` | 7 | | `Claude-Code_Usage-Token` | `scripts/check_pr_metadata.py` | 7 | | `Claude-Code_Usage-Token` | `src/claude_code_usage/cli.py` | 7 | | `Claude-Code_Usage-Token` | `scripts/subprocess_encoding.py` | 6 | | `Claude-Code_Usage-Token` | `src/claude_code_usage/storage.py` | 6 | | `Claude-Code_Usage-Token` | `tests/test_subprocess_encoding.py` | 6 | | `Claude-Code_Usage-Token` | `CHANGELOG.md` | 5 | | `Claude-Code_Usage-Token` | `docs/roles.md` | 5 | | `Claude-Code_Usage-Token` | `scripts/shell_ascii.py` | 5 | | `Claude-Code_Usage-Token` | `src/claude_code_usage/transcripts.py` | 5 | | `Claude-Code_Usage-Token` | `.github/workflows/merge-queue.yml` | 4 | | `Claude-Code_Usage-Token` | `HISTORY.md` | 4 | | `Claude-Code_Usage-Token` | `README.md` | 4 | | `Claude-Code_Usage-Token` | `docs/release.md` | 4 | | `Claude-Code_Usage-Token` | `scripts/repo_links.py` | 4 | | `Claude-Code_Usage-Token` | `tests/test_pr_check.py` | 4 | | `Claude-Code_Usage-Token` | `tests/test_transcripts.py` | 4 | | `Claude-Code_Usage-Token` | `.github/workflows/badges.yml` | 3 | | `Claude-Code_Usage-Token` | `docs/versioning.md` | 3 | | `Claude-Code_Usage-Token` | `scripts/concurrency_head.py` | 3 | | `Claude-Code_Usage-Token` | `scripts/gh_rest.py` | 3 | | `Claude-Code_Usage-Token` | `scripts/release.py` | 3 | | `Claude-Code_Usage-Token` | `scripts/subprocess_timeout.py` | 3 | | `Claude-Code_Usage-Token` | `scripts/version.py` | 3 | | `Claude-Code_Usage-Token` | `tests/test_changelog.py` | 3 | | `Claude-Code_Usage-Token` | `tests/test_utf8_output.py` | 3 | | `Claude-Code_Usage-Token` | `.github/workflows/release.yml` | 2 | | `Claude-Code_Usage-Token` | `.rules/exclusive.json` | 2 | | `Claude-Code_Usage-Token` | `.rules/proposals.json` | 2 | | `Claude-Code_Usage-Token` | `README.en.md` | 2 | | `Claude-Code_Usage-Token` | `docs/storage-setup.md` | 2 | | `Claude-Code_Usage-Token` | `scripts/badges.py` | 2 | | `Claude-Code_Usage-Token` | `scripts/exclusive_claims.py` | 2 | | `Claude-Code_Usage-Token` | `tests/test_registry.py` | 2 | | `Claude-Code_Usage-Token` | `tests/test_repo_links.py` | 2 | | `Claude-Code_Usage-Token` | `tests/test_shell_ascii.py` | 2 | | `Claude-Code_Usage-Token` | _остальные_ · _the rest_ | 37 механизмов по одному правилу; без названного адреса: 0 из 150 | | `Glossary-Python` | `.github/workflows/ci.yml` | 16 | | `Glossary-Python` | `docs/architecture.md` | 9 | | `Glossary-Python` | `tests/test_data_integrity.py` | 9 | | `Glossary-Python` | `tests/test_validation.py` | 9 | | `Glossary-Python` | `CLAUDE.md` | 8 | | `Glossary-Python` | `src/glossary/validation.py` | 8 | | `Glossary-Python` | `.rules/bindings.json` | 7 | | `Glossary-Python` | `.github/workflows/rules-inbox.yml` | 5 | | `Glossary-Python` | `README.md` | 5 | | `Glossary-Python` | `pyproject.toml` | 5 | | `Glossary-Python` | `tests/test_workflow_guardrails.py` | 5 | | `Glossary-Python` | `.pre-commit-config.yaml` | 4 | | `Glossary-Python` | `CONTRIBUTING.md` | 4 | | `Glossary-Python` | `data/glossary.json` | 4 | | `Glossary-Python` | `data/glossary.schema.json` | 4 | | `Glossary-Python` | `scripts/automerge.py` | 4 | | `Glossary-Python` | `scripts/facts.py` | 4 | | `Glossary-Python` | `src/glossary/cli.py` | 4 | | `Glossary-Python` | `src/glossary/exporters/html.py` | 4 | | `Glossary-Python` | `tests/test_facts.py` | 4 | | `Glossary-Python` | `.github/workflows/automerge.yml` | 3 | | `Glossary-Python` | `.github/workflows/badges.yml` | 3 | | `Glossary-Python` | `CHANGELOG.md` | 3 | | `Glossary-Python` | `src/glossary/loader.py` | 3 | | `Glossary-Python` | `tests/test_check_attribution.py` | 3 | | `Glossary-Python` | `.rules/proposals.json` | 2 | | `Glossary-Python` | `docs/agent/roles.md` | 2 | | `Glossary-Python` | `facts.json` | 2 | | `Glossary-Python` | `scripts/check_attribution.py` | 2 | | `Glossary-Python` | `scripts/check_exclusive.py` | 2 | | `Glossary-Python` | `scripts/check_journal.py` | 2 | | `Glossary-Python` | `scripts/check_third_outcome.py` | 2 | | `Glossary-Python` | `tests/quality_baseline.json` | 2 | | `Glossary-Python` | `tests/test_automerge.py` | 2 | | `Glossary-Python` | `tests/test_check_journal.py` | 2 | | `Glossary-Python` | `tests/test_live_surface.py` | 2 | | `Glossary-Python` | `tests/test_roles.py` | 2 | | `Glossary-Python` | `tests/test_rules_bindings.py` | 2 | | `Glossary-Python` | _остальные_ · _the rest_ | 40 механизмов по одному правилу; без названного адреса: 0 из 101 | | `Engineering-Pipeline-Mechanisms` | `tests/test_gates_reject.py` | 25 | | `Engineering-Pipeline-Mechanisms` | `scripts/ci_complete.py` | 17 | | `Engineering-Pipeline-Mechanisms` | `scripts/review_findings.py` | 17 | | `Engineering-Pipeline-Mechanisms` | `.pipeline.yml` | 16 | | `Engineering-Pipeline-Mechanisms` | `AGENTS.md` | 16 | | `Engineering-Pipeline-Mechanisms` | `scripts/agent_pr.py` | 16 | | `Engineering-Pipeline-Mechanisms` | `scripts/build_facts.py` | 14 | | `Engineering-Pipeline-Mechanisms` | `.github/workflows/review.yml` | 13 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_version.py` | 13 | | `Engineering-Pipeline-Mechanisms` | `docs/behaviour.md` | 12 | | `Engineering-Pipeline-Mechanisms` | `.rules/bindings.json` | 11 | | `Engineering-Pipeline-Mechanisms` | `tests/test_gates_complete.py` | 11 | | `Engineering-Pipeline-Mechanisms` | `.github/workflows/ci.yml` | 10 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_journal.py` | 10 | | `Engineering-Pipeline-Mechanisms` | `scripts/drift.py` | 10 | | `Engineering-Pipeline-Mechanisms` | `scripts/unlooked.py` | 10 | | `Engineering-Pipeline-Mechanisms` | `tests/test_bindings.py` | 10 | | `Engineering-Pipeline-Mechanisms` | `tests/test_ghrest.py` | 10 | | `Engineering-Pipeline-Mechanisms` | `tests/test_review_safety.py` | 10 | | `Engineering-Pipeline-Mechanisms` | `CLAUDE.md` | 9 | | `Engineering-Pipeline-Mechanisms` | `scripts/automerge.py` | 9 | | `Engineering-Pipeline-Mechanisms` | `tests/test_gates_contract.py` | 9 | | `Engineering-Pipeline-Mechanisms` | `docs/release.md` | 8 | | `Engineering-Pipeline-Mechanisms` | `tests/test_facts.py` | 8 | | `Engineering-Pipeline-Mechanisms` | `.github/workflows/agent-pr.yml` | 7 | | `Engineering-Pipeline-Mechanisms` | `facts.json` | 7 | | `Engineering-Pipeline-Mechanisms` | `packages/transport/ghrest.py` | 7 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_pr_meta.py` | 7 | | `Engineering-Pipeline-Mechanisms` | `scripts/pipeline_checks.py` | 7 | | `Engineering-Pipeline-Mechanisms` | `tests/test_docs_shape.py` | 7 | | `Engineering-Pipeline-Mechanisms` | `CHANGELOG.md` | 6 | | `Engineering-Pipeline-Mechanisms` | `README.md` | 6 | | `Engineering-Pipeline-Mechanisms` | `docs/roles.md` | 6 | | `Engineering-Pipeline-Mechanisms` | `scripts/build_changelog.py` | 6 | | `Engineering-Pipeline-Mechanisms` | `scripts/main_red.py` | 6 | | `Engineering-Pipeline-Mechanisms` | `tests/test_automerge.py` | 6 | | `Engineering-Pipeline-Mechanisms` | `tests/test_drift.py` | 6 | | `Engineering-Pipeline-Mechanisms` | `docs/pipeline.md` | 5 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_required_context.py` | 5 | | `Engineering-Pipeline-Mechanisms` | `scripts/debt.py` | 5 | | `Engineering-Pipeline-Mechanisms` | `scripts/family.py` | 5 | | `Engineering-Pipeline-Mechanisms` | `tests/test_review_findings.py` | 5 | | `Engineering-Pipeline-Mechanisms` | `tests/test_showcase.py` | 5 | | `Engineering-Pipeline-Mechanisms` | `.claude/hooks/push_guard.py` | 4 | | `Engineering-Pipeline-Mechanisms` | `.github/labels.yml` | 4 | | `Engineering-Pipeline-Mechanisms` | `.github/workflows/claude.yml` | 4 | | `Engineering-Pipeline-Mechanisms` | `.github/workflows/rules-inbox.yml` | 4 | | `Engineering-Pipeline-Mechanisms` | `docs/decisions/002-review-taken-from-two-neighbours.md` | 4 | | `Engineering-Pipeline-Mechanisms` | `scripts/changerefs.py` | 4 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_rule_links.py` | 4 | | `Engineering-Pipeline-Mechanisms` | `scripts/findings.py` | 4 | | `Engineering-Pipeline-Mechanisms` | `scripts/labels.py` | 4 | | `Engineering-Pipeline-Mechanisms` | `scripts/preflight.py` | 4 | | `Engineering-Pipeline-Mechanisms` | `tests/outcomes.py` | 4 | | `Engineering-Pipeline-Mechanisms` | `tests/test_source_hygiene.py` | 4 | | `Engineering-Pipeline-Mechanisms` | `.github/workflows/automerge.yml` | 3 | | `Engineering-Pipeline-Mechanisms` | `.github/workflows/badges.yml` | 3 | | `Engineering-Pipeline-Mechanisms` | `.rules/proposals.json` | 3 | | `Engineering-Pipeline-Mechanisms` | `.rules/protection.json` | 3 | | `Engineering-Pipeline-Mechanisms` | `.rules/schedules.json` | 3 | | `Engineering-Pipeline-Mechanisms` | `.rules/showcase.json` | 3 | | `Engineering-Pipeline-Mechanisms` | `claude.yml` | 3 | | `Engineering-Pipeline-Mechanisms` | `docs/decisions/001-attribution-of-merged-1.md` | 3 | | `Engineering-Pipeline-Mechanisms` | `scripts/arm.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_derived_refs.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_pipeline.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `scripts/work_plan.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `tests/conftest.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `tests/test_decisions_format.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `tests/test_gaps_section.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `tests/test_outcomes_run.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `tests/test_pipeline_checks.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `tests/test_platform_shape.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `tests/test_roles_map.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `tests/test_schedules.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `tests/test_third_outcome.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `tests/test_unlooked.py` | 3 | | `Engineering-Pipeline-Mechanisms` | `.rules/leniency.json` | 2 | | `Engineering-Pipeline-Mechanisms` | `.rules/outcomes.json` | 2 | | `Engineering-Pipeline-Mechanisms` | `.rules/rerun.json` | 2 | | `Engineering-Pipeline-Mechanisms` | `badges.yml` | 2 | | `Engineering-Pipeline-Mechanisms` | `build_changelog.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `changelog.d/README.md` | 2 | | `Engineering-Pipeline-Mechanisms` | `check_env.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `ci.yml` | 2 | | `Engineering-Pipeline-Mechanisms` | `ci_complete.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `docs/decisions/004-schedules-stay-service-observes.md` | 2 | | `Engineering-Pipeline-Mechanisms` | `docs/decisions/011-merging-is-handed-to-the-platform.md` | 2 | | `Engineering-Pipeline-Mechanisms` | `packages/transport/report.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `review.yml` | 2 | | `Engineering-Pipeline-Mechanisms` | `rules-inbox.yml` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_contract.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_decisions_edit.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_env.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_new_is_tested.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_own_name.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/check_window_lifetime.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/contract.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/journal.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/paths.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/release.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/squash_body.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/task_shape.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `scripts/version.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/fixtures/check-runs.shape.json` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_agent_pr_consent.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_bindings_addresses.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_changerefs.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_citation_applicability.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_contract_surface.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_declared_numbers.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_declared_versions.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_journal_fragments.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_main_red.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_new_is_tested.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_package_at_the_consumer.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_protection.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_push_guard.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_release.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_rulebook_fresh.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_settings_anchor.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_steps_speak_outward.py` | 2 | | `Engineering-Pipeline-Mechanisms` | `tests/test_window_preflight.py` | 2 | | `Engineering-Pipeline-Mechanisms` | _остальные_ · _the rest_ | 91 механизмов по одному правилу; без названного адреса: 0 из 194 | ## Правила · Rules | № | `Engineering-Incidents-Playbook` | `Stepik-Python-Grader` | `ArtVsMark` | `Claude-Code_Usage-Token` | `Glossary-Python` | `Engineering-Pipeline-Mechanisms` | |---|---|---|---|---|---|---| | 001 | действует | действует | действует | действует | действует | действует | | 002 | действует | действует | действует | действует | действует | действует | | 003 | действует | действует | действует | действует | нет предмета | действует | | 004 | действует | действует | действует | действует | действует | действует | | 005 | действует | действует | действует | действует | действует | действует | | 006 | действует | действует | действует | действует | действует | действует | | 007 | нет предмета | действует | нет предмета | нет предмета | действует | действует | | 008 | действует | нет предмета | действует | нет предмета | нет предмета | действует | | 009 | действует | действует | действует | действует | действует | действует | | 010 | действует | действует | действует | действует | действует | действует | | 011 | действует | действует | действует | действует | нет предмета | действует | | 012 | действует | действует | действует | действует | действует | действует | | 013 | действует | действует | нет предмета | действует | действует | действует | | 014 | действует | действует | действует | действует | действует | действует | | 015 | нет предмета | действует | нет предмета | нет предмета | нет предмета | действует | | 016 | действует | действует | действует | действует | действует | действует | | 017 | действует | действует | действует | действует | действует | действует | | 018 | действует | действует | нет предмета | действует | действует | действует | | 019 | нет предмета | действует | нет предмета | действует | нет предмета | действует | | 020 | отклонено | действует | нет предмета | нет предмета | нет предмета | действует | | 021 | действует | действует | действует | действует | действует | действует | | 022 | действует | действует | действует | действует | действует | действует | | 023 | действует | действует | действует | действует | действует | действует | | 024 | действует | действует | отклонено | действует | действует | действует | | 025 | действует | действует | действует | отклонено | нет предмета | действует | | 026 | действует | действует | действует | действует | нет предмета | действует | | 027 | действует | действует | действует | действует | действует | действует | | 028 | действует | действует | нет предмета | действует | действует | действует | | 029 | действует | действует | действует | действует | действует | действует | | 030 | действует | действует | действует | действует | действует | действует | | 031 | отклонено | действует | нет предмета | нет предмета | нет предмета | действует | | 032 | нет предмета | действует | действует | действует | действует | действует | | 033 | действует | действует | нет предмета | действует | нет предмета | нет предмета | | 034 | отклонено | действует | нет предмета | нет предмета | нет предмета | действует | | 035 | действует | действует | нет предмета | отклонено | действует | действует | | 036 | нет предмета | действует | нет предмета | нет предмета | нет предмета | нет предмета | | 037 | действует | действует | нет предмета | действует | действует | действует | | 038 | нет предмета | действует | действует | действует | действует | действует | | 039 | действует | действует | действует | действует | действует | действует | | 040 | действует | действует | нет предмета | действует | действует | действует | | 041 | действует | действует | действует | действует | нет предмета | действует | | 042 | действует | действует | нет предмета | действует | действует | действует | | 043 | действует | действует | нет предмета | действует | действует | действует | | 044 | действует | действует | действует | действует | нет предмета | действует | | 045 | действует | действует | действует | действует | действует | действует | | 046 | действует | действует | действует | действует | нет предмета | действует | | 047 | действует | действует | действует | действует | действует | действует | | 048 | нет предмета | нет предмета | нет предмета | действует | нет предмета | нет предмета | | 049 | действует | действует | действует | действует | действует | действует | | 050 | действует | действует | действует | нет предмета | действует | действует | | 051 | действует | действует | действует | действует | действует | действует | | 052 | действует | действует | нет предмета | действует | нет предмета | действует | | 053 | действует | действует | нет предмета | действует | действует | действует | | 054 | действует | действует | нет предмета | действует | нет предмета | действует | | 055 | действует | действует | нет предмета | действует | действует | действует | | 056 | действует | действует | действует | действует | действует | действует | | 057 | действует | действует | действует | действует | действует | действует | | 058 | действует | действует | действует | действует | действует | действует | | 059 | нет предмета | действует | нет предмета | действует | действует | действует | | 060 | отклонено | действует | нет предмета | нет предмета | нет предмета | действует | | 061 | отклонено | действует | нет предмета | действует | нет предмета | действует | | 062 | действует | действует | действует | действует | действует | действует | | 063 | действует | действует | действует | действует | нет предмета | действует | | 064 | действует | действует | действует | действует | действует | действует | | 065 | действует | действует | нет предмета | действует | нет предмета | нет предмета | | 066 | нет предмета | действует | нет предмета | нет предмета | нет предмета | нет предмета | | 067 | действует | действует | действует | нет предмета | нет предмета | действует | | 068 | действует | действует | действует | действует | действует | действует | | 069 | нет предмета | действует | действует | действует | нет предмета | действует | | 070 | действует | действует | действует | действует | нет предмета | действует | | 071 | действует | действует | действует | действует | нет предмета | действует | | 072 | действует | действует | действует | действует | действует | действует | | 073 | действует | действует | действует | действует | действует | действует | | 074 | действует | действует | действует | действует | действует | действует | | 075 | действует | действует | действует | действует | действует | действует | | 076 | нет предмета | действует | нет предмета | действует | действует | действует | | 077 | действует | действует | нет предмета | действует | действует | нет предмета | | 078 | нет предмета | действует | действует | действует | нет предмета | действует | | 079 | действует | нет предмета | нет предмета | нет предмета | нет предмета | действует | | 080 | действует | действует | действует | действует | действует | действует | | 081 | нет предмета | действует | нет предмета | действует | нет предмета | нет предмета | | 082 | действует | действует | действует | действует | действует | действует | | 083 | нет предмета | действует | действует | нет предмета | нет предмета | действует | | 084 | действует | действует | действует | отклонено | нет предмета | действует | | 085 | действует | действует | нет предмета | нет предмета | нет предмета | действует | | 086 | действует | действует | нет предмета | действует | нет предмета | действует | | 087 | нет предмета | действует | нет предмета | действует | нет предмета | действует | | 088 | действует | действует | нет предмета | действует | нет предмета | действует | | 089 | действует | действует | действует | отклонено | действует | действует | | 090 | действует | действует | действует | действует | действует | действует | | 091 | действует | действует | действует | действует | нет предмета | действует | | 092 | действует | действует | нет предмета | действует | нет предмета | действует | | 093 | действует | действует | действует | действует | действует | действует | | 094 | действует | действует | действует | нет предмета | нет предмета | действует | | 095 | нет предмета | действует | нет предмета | действует | нет предмета | нет предмета | | 096 | действует | действует | нет предмета | действует | действует | действует | | 097 | действует | действует | действует | действует | действует | действует | | 098 | действует | действует | нет предмета | действует | действует | действует | | 099 | действует | действует | нет предмета | действует | действует | действует | | 100 | действует | действует | действует | действует | действует | действует | | 101 | действует | действует | нет предмета | действует | нет предмета | действует | | 102 | действует | действует | нет предмета | действует | нет предмета | действует | | 103 | нет предмета | действует | нет предмета | нет предмета | нет предмета | нет предмета | | 104 | действует | действует | действует | действует | действует | действует | | 105 | действует | действует | действует | действует | нет предмета | действует | | 106 | действует | действует | нет предмета | действует | действует | действует | | 107 | действует | действует | действует | действует | нет предмета | действует | | 108 | действует | действует | действует | действует | действует | действует | | 109 | действует | действует | действует | действует | нет предмета | действует | | 110 | действует | действует | нет предмета | действует | нет предмета | действует | | 111 | действует | действует | действует | действует | действует | действует | | 112 | нет предмета | действует | нет предмета | отклонено | действует | действует | | 113 | действует | действует | нет предмета | действует | действует | действует | | 114 | действует | действует | действует | нет предмета | нет предмета | действует | | 115 | нет предмета | действует | нет предмета | нет предмета | действует | действует | | 116 | действует | действует | нет предмета | действует | нет предмета | действует | | 117 | отклонено | действует | нет предмета | нет предмета | нет предмета | действует | | 118 | действует | действует | действует | действует | действует | действует | | 119 | действует | действует | действует | действует | действует | действует | | 120 | действует | действует | нет предмета | действует | нет предмета | нет предмета | | 121 | действует | действует | нет предмета | действует | нет предмета | действует | | 122 | действует | действует | нет предмета | действует | действует | действует | | 123 | действует | действует | действует | действует | действует | действует | | 124 | действует | действует | действует | действует | действует | действует | | 125 | действует | действует | действует | действует | действует | действует | | 126 | действует | действует | действует | действует | нет предмета | действует | | 127 | действует | действует | действует | действует | действует | действует | | 128 | действует | действует | действует | действует | действует | действует | | 129 | действует | действует | действует | действует | нет предмета | действует | | 130 | действует | действует | нет предмета | действует | нет предмета | действует | | 131 | действует | действует | действует | нет предмета | действует | действует | | 132 | действует | действует | действует | действует | действует | действует | | 133 | действует | действует | действует | действует | действует | действует | | 134 | действует | действует | действует | действует | действует | действует | | 135 | действует | действует | действует | действует | действует | действует | | 136 | действует | действует | действует | действует | действует | действует | | 137 | действует | действует | действует | действует | действует | действует | | 138 | действует | действует | действует | действует | действует | действует | | 139 | действует | действует | действует | действует | действует | действует | | 140 | действует | действует | действует | действует | действует | действует | | 141 | действует | действует | действует | действует | действует | действует | | 142 | действует | действует | действует | действует | действует | действует | | 144 | действует | действует | действует | действует | действует | действует | | 145 | действует | действует | действует | действует | действует | действует | | 146 | действует | действует | действует | действует | действует | действует | | 147 | действует | действует | действует | действует | действует | действует | | 148 | действует | действует | действует | действует | нет предмета | действует | | 149 | действует | действует | действует | нет предмета | нет предмета | действует | | 150 | действует | действует | действует | действует | действует | действует | | 151 | действует | действует | действует | действует | действует | действует | | 152 | действует | действует | действует | действует | действует | действует | | 153 | действует | действует | действует | действует | действует | действует | | 154 | действует | действует | действует | действует | действует | действует | | 155 | действует | действует | нет предмета | нет предмета | нет предмета | действует | | 156 | действует | действует | действует | нет предмета | действует | действует | | 157 | действует | действует | действует | действует | действует | действует | | 158 | действует | действует | действует | действует | действует | действует | | 159 | действует | действует | действует | действует | действует | действует | | 160 | действует | действует | действует | действует | действует | действует | | 161 | действует | действует | действует | действует | действует | действует | | 162 | действует | действует | действует | действует | действует | действует | | 163 | действует | действует | нет предмета | нет предмета | нет предмета | действует | | 164 | действует | действует | действует | действует | действует | действует | | 165 | действует | действует | действует | действует | действует | действует | | 166 | действует | действует | действует | действует | действует | действует | | 167 | действует | действует | действует | действует | действует | действует | | 168 | действует | действует | действует | действует | действует | действует | | 169 | действует | действует | действует | действует | нет предмета | действует | | 170 | действует | действует | действует | действует | нет предмета | действует | | 171 | действует | действует | действует | действует | действует | действует | | 172 | действует | действует | действует | действует | нет предмета | действует | | 173 | действует | действует | действует | действует | действует | действует | | 174 | действует | действует | действует | действует | действует | действует | | 175 | действует | действует | действует | действует | действует | действует | | 176 | действует | действует | действует | действует | действует | действует | | 177 | действует | действует | действует | действует | действует | действует | | 178 | действует | действует | действует | действует | нет предмета | действует | | 179 | действует | действует | действует | действует | действует | действует | | 180 | действует | действует | действует | действует | нет предмета | действует | | 181 | действует | действует | действует | действует | действует | действует | | 182 | действует | действует | действует | действует | действует | действует | | 183 | действует | действует | действует | — | — | действует | | 184 | действует | действует | действует | — | — | действует | | 185 | действует | действует | действует | — | — | действует | | 186 | действует | действует | действует | — | — | действует | | 187 | действует | действует | действует | — | — | действует | | 188 | нет предмета | действует | действует | — | — | действует | | 189 | действует | действует | действует | — | — | действует | | 190 | действует | действует | действует | — | — | действует | | 191 | нет предмета | действует | действует | — | — | действует | | 192 | действует | действует | действует | — | — | действует | | 193 | нет предмета | действует | действует | — | — | нет предмета | | 194 | нет предмета | действует | действует | — | — | нет предмета | | 195 | действует | действует | действует | — | — | действует | | 196 | действует | действует | действует | — | — | действует | | 197 | действует | — | действует | — | — | действует | | 198 | нет предмета | — | действует | — | — | действует | | 199 | действует | — | действует | — | — | действует | | 200 | действует | — | действует | — | — | действует | | 201 | действует | — | нет предмета | — | — | нет предмета | | 202 | действует | — | действует | — | — | действует | | 203 | нет предмета | — | действует | — | — | действует | | 204 | действует | — | действует | — | — | действует | | 205 | действует | — | — | — | — | действует | | 206 | действует | — | — | — | — | действует | | 207 | действует | — | — | — | — | действует | | 208 | действует | — | — | — | — | действует |