Today grants live in AttachManager's memory. Every restart of the daemon (deploy, crash, logout) drops them and the human has to lend again from Connect/Remote — hit twice on 2026-09-26 while deploying 0.6.0 (#10 comment).
Proposal: persist {id, runtime, session, profile, principal, expires_at} in UserDefaults and the attach secret in the Keychain (service dev.openab.instance-mcp.grant, account = grant id); on start, re-create the ReverseAttachClient for every grant whose expires_at is in the future and let its normal redial policy run (a pod that was replaced meanwhile answers 401 → grant ends, as designed). Revocation deletes both records.
Acceptance: lend → launchctl kickstart -k the agent → within one backoff the pod shows attached=true again with no human action; GET /attach lists the same grant id.
Today grants live in
AttachManager's memory. Every restart of the daemon (deploy, crash, logout) drops them and the human has to lend again from Connect/Remote — hit twice on 2026-09-26 while deploying 0.6.0 (#10 comment).Proposal: persist
{id, runtime, session, profile, principal, expires_at}in UserDefaults and the attach secret in the Keychain (servicedev.openab.instance-mcp.grant, account = grant id); on start, re-create theReverseAttachClientfor every grant whoseexpires_atis in the future and let its normal redial policy run (a pod that was replaced meanwhile answers 401 → grant ends, as designed). Revocation deletes both records.Acceptance: lend →
launchctl kickstart -kthe agent → within one backoff the pod showsattached=trueagain with no human action;GET /attachlists the same grant id.