A check that cannot fail is not a check. This is a short story about one such check on EmpoorioChain, how it was found, and what replaced it — told in detail because the same pattern hides in every infrastructure project.
The script
scripts/testnet_validator_audit.py existed to produce the evidence behind the decentralization report: which validators are active, whether they match the versioned inventory, how many independent operators there are. The report cited it as its reproducible source.
On 5 September 2026, during a full audit of the chain, someone ran it with a deliberately impossible endpoint:
python3 scripts/testnet_validator_audit.py --rpc http://127.0.0.1:1
Port 1. Connection refused. The script printed three validators — in us-east-1, eu-west-1 and ap-southeast-1 — and exited with code 0.
It had never read the chain. It read data/Genesis/validators.json, echoed its contents in the report's format, and succeeded. The file contained template entries built from Substrate's well-known development accounts. The report had been publishing them as infrastructure since May.
Why nobody noticed
Because the output looked right. Three validators across three regions is what a healthy testnet inventory looks like. Nothing in the pipeline compared the file to reality, and the script's success code told CI that everything was fine. The question that exposed it was not "is the output correct?" but "what would have to be true for this script to fail?" The answer was: nothing.
The rewrite
The script now:
- Connects to one or more RPC endpoints (
--rpc, repeatable). - Reads
Session::ValidatorsandAura::Authoritiesfrom chain state. - Compares the on-chain set with
data/Genesis/validators.json. - Exits 1 if they disagree, or if no endpoint answers.
- Writes a JSON artefact with date, commit, endpoints and the observed set.
python3 scripts/testnet_validator_audit.py \
--network testnet \
--validators data/Genesis/validators.json \
--rpc https://rpc.testnet.empooriochain.org \
--rpc https://rpc2.testnet.empooriochain.org \
--output artifacts/decentralization/testnet/latest.json
Run against the live network it reports what is actually there: two validators, both Empoorio's, both in IONOS AS8560. The inventory file was replaced with those two real accounts. The decentralization report was reissued with the correction at the top and its status set to not suitable for mainnet.
The rule
The team wrote the lesson down as a review question for every verification step, script, test and post_upgrade hook:
Ask what would have to be true for this condition to be false. If the answer is "nothing", the control is decorative.
The same week it caught four post_upgrade hooks asserting facts about the world ("this storage is empty") that their migrations did not control, and a compliance test whose condition was tautological. Each was rewritten to check something that could actually be wrong.
Why publish this
Because the alternative would be to quietly fix the script and leave a May report claiming three validators. The ecosystem's public documentation carries correction blocks precisely so that a reader can see not only the current state but how confident to be in it — and a project that publishes its verification failures is one whose verifications you can begin to trust.
Based on DECENTRALIZATION_REPORT.md (correction block dated 2026-09-05) and the September 2026 audit notes.


