A keyless agent's grant stops working when its owner rotates their key issue #135 closed: completed andymccall opened this · 1 comment
andymccall set labels bug ·
closed by change 45a6f5ec85cf ·
andymccall
Confirmed live (2026-10-25 02:05): with the hub at 936b24b2 (pins this fix) and oxy at main, oxygen 910c8ce4 was committed by agent:claude with this repository's author.key d89664ce (Andy's newest), sealed under the grant 4cd9916c signed, and the hub took the push. The workaround used for dd308902, faa079a1 and 8db4255e (author.key set to 4cd9916c for the commit and push only, then restored) is no longer needed.
Found 2026-10-24 23:40 pushing oxygen (T1, oxygenhub#301) as agent:claude: the push was refused
change caa5448d2b21 is not authenticated by its author, andoxy showsaysINVALID signature: key 75bd276a0cf7 is neither the author nor a delegate.Cause: the agent's grant was signed on 2026-10-17 by Andy's key of the time (4cd9916c). Andy has rotated since (each delegation rotates his identity; now d89664ce), and the oxygen repository pins
author.keyto the new key.Repo::grantedrequiresgrant.grantor == authorexactly, so a grant by an earlier key of the same identity chain no longer counts, and every keyless commit in a repository that pins the owner's newest key fails. Repositories where the agent home'sauthor.key(still 4cd9916c) is used work.Fix: a grant by a rotation predecessor of the author (the author identity's
previouschain, each step stored or in the home's keys/) authorizes the agent as a grant by the author would; verify the grant with that predecessor's identity. The policy already accepts rotation predecessors for references (predecessor_authorized). Test: rotate the owner after granting, commit keyless with the new key as author.Every rotation (delegate add/remove) would otherwise break every agent until the owner re-grants.