Context
GET /v1/actors reads an in-memory state.actors map (ui_bridge.rs::list_actors) that is populated during onboarding/pairing but lost on a daemon restart and never rebuilt from chain. After a restart the master + agents are still registered on-chain (operatorMasterWallet[omni]; getOperatorDevices(omni) returns the master + agent device hashes) and GET /v1/onboarding/state correctly reports chain: "master-registered" (because registered_master is rehydrated) — but /v1/actors returns [], so the actor page is empty even though everything is bound. The code already flags this: rehydrate_master_session carries the comment "list_actors reads it from chain when absent (E7 actor-page follow-up)."
Scope
crates/agentkeys-daemon/src/ui_bridge.rs — list_actors and/or rehydrate_master_session.
- Reconstruct the actor tree from chain: master from
registered_master / operatorMasterWallet[omni]; agents from getOperatorDevices(omni) → getDevice(hash) (tier, actor_omni, active) → ApiActor (+ enrich_actor_account).
- Reflect on-chain truth even with an empty in-memory map (post-restart); reconcile with in-memory actors.
Acceptance
- After a daemon restart, the actor page shows the master + every bound agent (cross-checked against
getOperatorDevices).
- Revoked devices excluded (
isActive == false).
Effort
~M.
Context
GET /v1/actorsreads an in-memorystate.actorsmap (ui_bridge.rs::list_actors) that is populated during onboarding/pairing but lost on a daemon restart and never rebuilt from chain. After a restart the master + agents are still registered on-chain (operatorMasterWallet[omni];getOperatorDevices(omni)returns the master + agent device hashes) andGET /v1/onboarding/statecorrectly reportschain: "master-registered"(becauseregistered_masteris rehydrated) — but/v1/actorsreturns[], so the actor page is empty even though everything is bound. The code already flags this:rehydrate_master_sessioncarries the comment "list_actors reads it from chain when absent (E7 actor-page follow-up)."Scope
crates/agentkeys-daemon/src/ui_bridge.rs—list_actorsand/orrehydrate_master_session.registered_master/operatorMasterWallet[omni]; agents fromgetOperatorDevices(omni)→getDevice(hash)(tier, actor_omni, active) →ApiActor(+enrich_actor_account).Acceptance
getOperatorDevices).isActive == false).Effort
~M.