Connect ›
Cover: The mutation guard: 268 named breaks, each paired with the one test that must die

The mutation guard: 268 named breaks, each paired with the one test that must die

What a mutant is, why the BlazePhoenix guard is curated rather than generated, why every entry names the single test that must fail, how a mutation the optimiser removes is reported as inert rather than killed, and why 268 of 268 is a floor on what the suite watches and not a guarantee.

Known formally as The Curated Mutation Guard in the BlazePhoenix whitepaper.

BlazePhoenix Engineering · updated 2026-09-06 · data through 2026-10-11 · 6 min · written from the deployed bytecode

By Mitra (@Sigmacrit) — anonymous developer of the BlazePhoenix protocol. The code is the résumé.

Abstract in 15 languages · resumo · resumen · 摘要 · 要旨 · ملخص

English — What a mutant is, why the BlazePhoenix guard is curated rather than generated, why every entry names the single test that must fail, how a mutation the optimiser removes is reported as inert rather than killed, and why 268 of 268 is a floor on what the suite watches and not a guarantee.

Português — O que é um mutante, porque é que a guarda da BlazePhoenix é curada em vez de gerada, porque é que cada entrada nomeia o único teste que tem de falhar, como uma mutação que o optimizador remove é reportada como inerte em vez de morta, e porque é que 268 of 268 é um piso sobre aquilo que a suite vigia e não uma garantia.

Español — Qué es un mutante, por qué la guarda de BlazePhoenix está curada en vez de generada, por qué cada entrada nombra la única prueba que debe fallar, cómo una mutación que el optimizador elimina se reporta como inerte en vez de muerta, y por qué 268 of 268 es un suelo sobre lo que la suite vigila y no una garantía.

Français — Ce qu’est un mutant, pourquoi la garde de BlazePhoenix est curée plutôt que générée, pourquoi chaque entrée nomme l’unique test qui doit échouer, comment une mutation que l’optimiseur supprime est signalée comme inerte plutôt que tuée, et pourquoi 268 of 268 est un plancher sur ce que la suite surveille et non une garantie.

Deutsch — Was ein Mutant ist, warum der BlazePhoenix-Wächter kuratiert statt generiert ist, warum jeder Eintrag den einen Test benennt, der fehlschlagen muss, wie eine Mutation, die der Optimierer entfernt, als inert statt als getötet gemeldet wird, und warum 268 of 268 eine Untergrenze dessen ist, was die Suite überwacht, und keine Garantie.

Русский — Что такое мутант, почему страж BlazePhoenix составлен вручную, а не сгенерирован, почему каждая запись называет единственный тест, который обязан упасть, как мутация, удалённая оптимизатором, отмечается инертной, а не убитой, и почему 268 of 268 — это нижняя граница того, за чем следит набор тестов, а не гарантия.

Türkçe — Bir mutantın ne olduğu, BlazePhoenix nöbetinin neden üretilmiş değil elle seçilmiş olduğu, neden her kaydın başarısız olması gereken tek testi adlandırdığı, iyileştiricinin kaldırdığı bir mutasyonun neden öldürülmüş değil etkisiz olarak raporlandığı ve 268 of 268’ün neden paketin izlediği şeyin bir alt sınırı olduğu, bir güvence değil.

العربية — ما هي الطفرة (mutant)، ولماذا حارس BlazePhoenix منتقى يدويًا لا مولَّد آليًا، ولماذا يسمّي كل مدخل الاختبار الوحيد الذي يجب أن يفشل، وكيف تُبلَّغ الطفرة التي يزيلها المحسّن على أنها خاملة لا مقتولة، ولماذا 268 of 268 حدّ أدنى لما تراقبه الحزمة وليست ضمانة.

हिन्दी — म्यूटेंट क्या है, BlazePhoenix गार्ड जनरेट किए जाने के बजाय हाथ से चुना क्यों गया है, हर प्रविष्टि उस एकमात्र टेस्ट का नाम क्यों देती है जिसे विफल होना ही चाहिए, ऑप्टिमाइज़र जिस म्यूटेशन को हटा देता है उसे मारा गया नहीं बल्कि निष्क्रिय क्यों बताया जाता है, और 268 of 268 सुइट जो देखती है उसकी निचली सीमा क्यों है, गारंटी क्यों नहीं।

日本語 — 変異体とは何か、BlazePhoenix のガードがなぜ生成ではなく人手で選ばれているのか、なぜ各項目が落ちなければならない唯一のテストを名指しするのか、最適化器が取り除いた変異がなぜ「殺された」ではなく「不活性」と報告されるのか、そして 268 of 268 がなぜスイートの見ている範囲の下限であって保証ではないのか。

中文 — 什么是变异体,为什么 BlazePhoenix 的守卫是人工策划而非自动生成,为什么每一条都指名那个必须失败的唯一测试,为什么被优化器移除的变异被报告为惰性而不是被杀死,以及为什么 268 of 268 是这套测试所监视范围的下限而不是保证。

한국어 — 변이체란 무엇인가, BlazePhoenix의 감시 목록이 자동 생성이 아니라 수작업으로 선별된 이유, 각 항목이 반드시 실패해야 할 단 하나의 테스트를 지목하는 이유, 최적화기가 제거한 변이가 죽었다가 아니라 불활성으로 보고되는 이유, 그리고 268 of 268이 스위트가 감시하는 범위의 하한이지 보증이 아닌 이유.

Bahasa Indonesia — Apa itu mutan, mengapa penjaga BlazePhoenix dikurasi dan bukan dibangkitkan otomatis, mengapa setiap entri menyebut satu-satunya uji yang harus gagal, bagaimana mutasi yang dihapus pengoptimal dilaporkan sebagai inert alih-alih terbunuh, dan mengapa 268 of 268 adalah batas bawah dari apa yang diawasi suite ini, bukan jaminan.

বাংলা — মিউট্যান্ট কী, BlazePhoenix-এর গার্ড কেন স্বয়ংক্রিয়ভাবে তৈরি না হয়ে হাতে বাছাই করা, কেন প্রতিটি এন্ট্রি সেই একটিমাত্র টেস্টের নাম বলে যেটিকে ব্যর্থ হতেই হবে, অপ্টিমাইজার যে মিউটেশন সরিয়ে দেয় সেটি কেন নিহত নয় বরং নিষ্ক্রিয় বলে জানানো হয়, এবং 268 of 268 কেন স্যুট যা পাহারা দেয় তার নিম্নসীমা, কোনো নিশ্চয়তা নয়।

Filipino — Ano ang isang mutant, bakit kinurate at hindi awtomatikong binuo ang guard ng BlazePhoenix, bakit pinapangalanan ng bawat entry ang iisang test na kailangang mabigo, paano iniuulat bilang inert sa halip na napatay ang isang mutation na inaalis ng optimiser, at bakit ang 268 of 268 ay isang sahig sa kung ano ang binabantayan ng suite at hindi isang garantiya.

What you gain here is a way to read a green test suite without believing it. A passing test proves the code ran; it does not prove that anything would have failed had the code been wrong. Mutation testing closes that gap by asking the suite a question it cannot answer by being green: if this line were broken, which of you would notice? The BlazePhoenix guard asks it 268 times, by name, on every push, and prints the answer beside its denominator.

A mutant is a deliberate, single alteration of one line of source — a comparison flipped, a guard deleted, a constant doubled — compiled and run against the tests. If a test fails, the mutant is killed and that line is watched. If every test stays green, the mutant survived, and the suite has just been shown a hole it cannot see. The idea is from DeMillo, Lipton and Sayward in 1978; what is specific here is the shape the register takes.

Matrix of fifteen source mutations against twenty invariants shown falsifiable; filled cells are the invariants that went red
Mutants aimed at the invariants: fifteen source mutations against the forty stateful invariants, the invariants that went red per mutant, the three closed on 2026-09-05 by giving a campaign the action it lacked, and the one sentinel that survives by design. Source: invariant-mutants.json.

Curated, not generated

Most mutation tools generate thousands of mutants mechanically and report a percentage. The guard in .github/scripts/mutants.py holds 268 hand-written mutants instead, and each pairs one exact line of source with the single test that must fail once that line is altered. The operator classes are the shapes a real regression takes: a guard deleted, a comparison flipped at the bound that decides a refusal, an authorisation condition widened, an error code swapped with its neighbour’s, a modifier removed.

Naming the killing test is the load-bearing choice. A generated score says “83 % of mutants died” and leaves you to guess which guards the surviving 17 % were protecting. A named pair says: this line is the pause check, this test is the one that must go red without it. When a future edit moves the line or weakens the test, the pair breaks by name, and the build says which guard just lost its watcher.

Three properties that make it a guard rather than a score

  1. The paired test is run green on the unmutated tree first, so nothing is scored as a kill for an unrelated reason — a test that was already red would “kill” every mutant.
  2. A mutation the optimiser removes — identical runtime bytecode before and after — is reported as inert, never as killed. A source edit the compiler folds away watched nothing, and a guard that counted it would be lying about its own denominator.
  3. A static check verifies, in about a second, that every mutant still points at exactly one line of real code, so a refactor cannot silently orphan a watcher. Mutation-target integrity is the one metric here with a single correct value: anything below 100 % means a claim points at code that no longer exists.

Aimed at the invariants

Until 2026-09-05 no mutant named a stateful invariant as the test that must die to it. The 39 invariant functions were green, and nothing had asked whether any of them could go red: a campaign whose handler never reaches the state a property protects certifies that property over an empty universe, and looks identical from the outside to one that reaches it. So the same measurement was pointed at the campaigns: fifteen source mutations, one per property the campaigns claim, each run against all 39 invariants on one seed.

mutantwhat it removesnoticed byseconds
the final transfer pays one wei lessholds-nothingRouterHoldsNothing, routerHoldsNothing, HoldsNothingBeyondTheSeed26
the protocol fee doublesthe fee ceilingFeeNeverExceedsProtocolMax27
whenLive no longer checks pausedthe pausePausedRouterNeverSettles27
the reentrancy lock no longer refusesthe lockreentrancyBlocked26
MAX_SLOTS becomes 17the registry boundneverExceedsMaxSlots52
the protocol floor is halvedthe floorsurvived the first measurement; closed by DeliveredNeverBelowTheProtocolFloor52
the post-fee userMinOut check is halveda regression sentinelsurvived, by design — no campaign universe holds a fee-on-transfer output token26

Source: invariant-mutants.json, 2026-09-05, forge test --match-test invariant_ --fuzz-seed 0xb1a2ef00; 15 mutants, 14 killed, 1 survived, 20 invariants shown falsifiable

Eleven of fifteen were noticed on the first measurement and eighteen distinct invariant names went red at least once. The survivors were the finding, each read rather than counted: three had no campaign that could reach them — the protocol floor, the registry’s pair-proof, the bridge-residual sweep’s baseline — and were closed the same day by giving a campaign the action it lacked, each verified red without its guard. The fourth stays, as the table says, by design. Those eleven and the three closed rows are now guard entries paired with the invariant that dies to them.

What the guard admits, and what it refuses

The guard admits only mutants a named test kills. Two checks in the Router’s fee ledger cannot be made to fire by any test in isolation, because the predicate in front of them leaves no path that settles without paying; they are listed as belts, counted as covered nowhere, and kept out of the guard rather than folded into the killed count. A fourth guard on the stable curve — a cap on Newton’s iterate — was written, found unobservable once two fit checks hold, its mutant reported as decorative, and removed. A guard that cannot fire is not a weak guard; it is not a guard, and the register says so instead of carrying it.

Why 268 of 268 is a floor

The figure is always printed beside its denominator, because it is adequacy against this register and nothing else. The register is hand-curated: each mutant exists because a specific guard was worth watching. Killing all of them says the suite watches those guards. It does not say the set is representative of the faults that occur in the wild, and the empirical work on fault–mutant coupling reports that a substantial minority of real faults are not coupled to any mutant from the usual operators. A saturated score is a floor on what is watched, not a ceiling on what could go wrong.

That is also why the guard is paired with instruments that index something other than an injected fault — covering arrays over the regime a fixture fixes, metamorphic relations over how outputs must move, a second oracle written from the venue’s specification. Each sees a class the others cannot, and the honest number for the whole is the minimum, never the sum.

Reproduce

Both commands run from a clean checkout on the release profile; the first prints every mutant with its killing test and its outcome — killed, inert or surviving — and the second is the one-second integrity check.

python3 .github/scripts/mutants.py           # 268 mutants, each with its named killing test
python3 .github/scripts/check_targets.py     # every mutant still points at exactly one line

Do not trust this page — reproduce it

Every claim above is checkable against the chain. Start here:

git clone https://github.com/blazephoenixxyz-crypto/Blaze-Phoenix-Dex && cd Blaze-Phoenix-Dex && python3 .github/scripts/mutants.py  # prints each mutant, its killing test and killed / inert / survived
Cite this article

Licensed CC BY 4.0 — quote, translate and reuse freely, including commercially, with attribution and a link. Copy a ready-made citation:

BlazePhoenix (2026). The mutation guard: 268 named breaks, each paired with the one test that must die. BlazePhoenix Engineering. https://blazephoenix.xyz/learn/the-mutation-guard
@misc{blazephoenix_the_mutation_guard,
  title  = {The mutation guard: 268 named breaks, each paired with the one test that must die},
  author = {BlazePhoenix},
  year   = {2026},
  url    = {https://blazephoenix.xyz/learn/the-mutation-guard},
  note   = {Accessed: reproduce the claim with the command above}
}

Writing an answer, a wiki entry or a paper? The claim above is reproducible against the chain before you quote it — which is the only sound basis for citing a technical source at all.

Contracts are verified on every chain we deploy to — addresses in the protocol manifest. Deeper formal treatment: the whitepaper (PDF). Standards cited: R. A. DEMILLO, R. J. LIPTON, F. G. SAYWARD — HINTS ON TEST DATA SELECTION: HELP FOR THE PRACTICING PROGRAMMER, IEEE COMPUTER 11(4), 1978 — HTTPS://DOI.ORG/10.1109/C-M.1978.218136

Related engineering

Next in Limits of verification · 2 / 4
N-version quote maths: one source, three compilers’ worth of binaries, and what the lane found ›The Core’s quote maths compiled at optimizer_runs 1, 300 and 20000, three binaries compared on 3,000 fuzzed inputs per function. They agree — and the lane’s first full-domain run made the reference itself revert on a dust pool.6 min

Questions, a partnership or a bug to report? Contact us or email contact@blazephoenix.xyz