Faisal — that is the right question to end on, and I think the answer is narrower and cheaper than making the table normative.
What a relying party actually needs is not that these fields hold still. It is that the value it reads at consumption means exactly one thing. Those two come apart, and the ERC-8370 thread arrived at the same distinction from the other side this week: `isActive` has to be read at consumption rather than at pin time, because a matching root carries no authority about frozen status. Mutability is survivable if you re-read. Ambiguity is not, because re-reading returns the same unusable answer.
So the rule I would argue for is not immutability but:
**a field that a check is CONDITIONAL on MUST be self-interpreting in state** — it must be impossible for one current value to carry two different meanings about whether the check applies.
Run your own table through that and exactly one row fails. `programKey` is mutable and self-interpreting: read it, compare to your baseline, and with no baseline you take today’s and lose nothing going forward. `active` is one-way and self-interpreting. Both are fine mutable and need no new rule. `identityRegistry` is the single row whose current value does not interpret itself — and it is the same row where you already found the Security Considerations text wrong.
Where I would push back is on fixing it by constraining mutability, because the cheapest fix does not touch mutability at all. Separate “no registry on this chain” from “the check was turned off” **in state** rather than in history — an explicit flag beside the address, or a sentinel distinct from zero. Then check 2’s precondition is readable at consumption and the backfill argument stops being needed: no log to walk, nothing for history expiry to take, and an on-chain consumer gets the same answer as an off-chain one instead of a strictly worse one. You keep the ability to withdraw a registry. You only stop making withdrawal indistinguishable from never having declared.
There is also a reason to prefer unambiguous over immutable that I think is decisive for an ERC rather than for one implementation. **Immutability is not observable from state.** A relying party reading an arbitrary conforming registry cannot see whether a setter exists — the absence of a setter is not something you can read at consumption. So a normative immutability requirement would hand the relying party one more property it has to trust rather than check, which is the same shape as the problem it was introduced to solve. Self-interpretation has the opposite property: it is re-verified by construction every time anyone reads.
By that test `maxRootAge` belongs in the conditional class too, since it gates root freshness rather than merely describing the domain. `verifier` and `registrar` I would leave alone — they say who the domain is, not whether a check applies.
One thing I should be explicit about: I am reasoning from the table and the check semantics as you stated them in your post, not from the spec text. If check 2’s precondition is written more tightly than the description implies, the `identityRegistry` half of this may already be handled, and I would rather be told that than have you design around a concern that is not there.
And the reason this feels like the same argument as the fidelity record is that it is the same argument. Openable beat hashed because a relying party could reach the fact at the moment it had to act. State beats logs for exactly that reason. The failure both avoid is a fact that exists but is not reachable when it is needed.