Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add agents/nickzaitsev/ru-normalizr/mutation-auditgit clone --depth 1 https://github.com/NickZaitsev/ru-normalizrWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/agents/nickzaitsev/ru-normalizr/mutation-audit)<a href="https://agentmods.dev/agents/nickzaitsev/ru-normalizr/mutation-audit"><img src="https://agentmods.dev/badge/agents/nickzaitsev/ru-normalizr/mutation-audit.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.04525 |
| Opus 5 | $0.00000 | $0.02263 |
| Sonnet 5 | $0.00000 | $0.00905 |
| Haiku 4.5 | $0.00000 | $0.00453 |
Grade A, and why
mutation-audit scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 6d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 277 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Мутационный аудит: что закрывать тестом, а что нет
Разовый аудит через mutmut (версия <3 — третья требует POSIX: os.fork,
os.wait, resource). Инструмента в репозитории нет и не должно быть: он
переписывает исходники на месте и меняет переводы строк на CRLF, поэтому любой
прогон делается в отдельном git worktree, никогда в рабочей копии.
Итог по модулям (подтверждённые выжившие — те, что уцелели против полного набора тестов, а не только против узкого):
| Модуль | Мутантов | Выживших | Убито |
|---|---|---|---|
dictionary.py |
219 | 20 | 91% |
abbreviations.py |
444 | 116 | 74% |
years.py |
870 | 252 | 71% |
ordinals.py |
498 | 155 | 69% |
numerals/_helpers.py |
905 | 310 | 66% |
Критерий: убивать мутанта только реальным предложением
Мутант считается убитым, если настоящее русское предложение даёт другой результат. Тест, который подгоняет вход под мутанта или закрепляет заведомо неверный вывод, хуже отсутствия теста: он мешает починить дефект.
Практическое следствие — часть выживших закрывать нечем, и это нормально. Ниже перечислены классы, на которые не стоит тратить время повторно.
Неубиваемые по построению
Мутации строк в проверках принадлежности. mutmut оборачивает литерал как
"XX…XX", то есть добавляет символы, а не убирает. Для char in "набор"
мутант расширяет набор, и поведение не меняется. Замены элементов кортежа
(startswith((".", "!", …))) убиваются нормально, а множества-литералы — нет.
Значения по умолчанию, сравниваемые только с противоположным.
vowel_mode="single" и pause_mode="preserve" в expand_person_initials
сравниваются лишь с "double" и "comma", поэтому подстановка в значение по
умолчанию ничего не меняет.
Винительный падеж, совпадающий с именительным. Ключи "за", "на", "по"
в PREPOSITIONS_TO_CASE (years.py):
у год/годы и у порядкового числительного неодушевлённого рода винительный
совпадает с именительным, поэтому промах по ключу не виден. Мутанты их
значений при этом убиваются — неизвестная строка падежа ломает рендеринг.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 6d ago First seen · 277 lines · 0 tokens per session scan A 4b155db60edc
mutation-audit is an agent published in the GitHub repository NickZaitsev/ru-normalizr (22 stars, last pushed 29d ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 4,525 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other agents, from other repositories
RULES
Agent "RULES" from phel-lang/phel-lang, covering phel rules + cli, rules, new features (v0.30 – main), gotchas and cli.
fixture-reviewer
Audits .test integration fixtures under tests/php/Integration/Fixtures for drift against the current compiler output. Use after lexer, parser, analyzer, or emitter changes.
module-docs-sync
Audits and updates CLAUDE.md files in src/php/ modules to match the actual code. Use after large refactors, new modules, or periodic maintenance.
tdd-coach
Guides test-driven development with red-green-refactor discipline. Use when implementing features or fixes with TDD.
quick-syntax
One-screen cheatsheet. For exhaustive rules see RULES.md; for typing details see tasks/typed-defn.md.
owner-judge
Reviews proposed changes to VoiceStudio against the owner's documented standards. Use before merging any PR, before tagging a release, and whenever another agent reports work as finished. Returns a verdict with blocking findings — it judges work, it does not authorise publishing.