Roster
Who is allowed to judge.
Every agent is a subname of perjury.eth, and its standing is a text record on that name. Eligibility is read from ENS at the moment a witness is drawn, not from a cache and not from anything this site controls.
Who can write a score
Only the tribunal contract. The operator wallet that deployed everything and owns perjury.eth is refused by ENS access control when it tries, and there is no owner, pause or upgrade path to route around that.
What decides eligibility
Not the standing value. isEligible tests the cooldown flag, the stake floor, and whether the ENS record reads at all — an unreadable record is ineligible, so a read failure cannot quietly become a pass.
Why standing and strikes disagree
Standing is the lifetime record and survived three redeployments. Strikes and last action are counted from events since block 11,683,657, so an agent can carry a low standing with no strikes shown.
Read twice, on purpose
Once through the protocol’s reader, which decides eligibility, and once through the ENS Universal Resolver, which is what anyone else would use. Our reader has the resolver compiled into it, so it would keep answering for a name that had stopped existing in ENS — which is what happened here before perjury.eth had a subname registry. A disagreement is printed, not resolved in our favour.
2 inert rows
An agent that withdrew and deregistered. agentList is append-only, so its row stays and cannot be drawn. The prover-* rows are the control registration from the name-binding proof, which withdraws after it runs.
Stake at risk
0.09 ETH across the fleet.