Part of #179. Follow-up — deferred until after the demo wave. Companion to #203 (Lockdown rename); pairs with the #198 wire work; sequenced after #31.
Problem
ProposalOrigin::Agent is anonymous — the E2 handle is app-local cosmetics, and Policy.revoked is one global flag. So the only honest "stop" today is the global Lockdown (#203). To stop ONE agent — or to show two agents without lying — the wire needs identity.
Scope (spec level)
Non-goals
- Multi-agent policy authoring UI.
- Agent authentication/attestation (identity here is a label + revocation key, not a security boundary — say so honestly in the UI).
Acceptance (when picked up)
Two concurrently connected agents render distinctly in Activity; stopping one leaves the other running; Lockdown still stops both. Wire round-trip + evolution tests.
Part of #179. Follow-up — deferred until after the demo wave. Companion to #203 (Lockdown rename); pairs with the #198 wire work; sequenced after #31.
Problem
ProposalOrigin::Agentis anonymous — the E2 handle is app-local cosmetics, andPolicy.revokedis one global flag. So the only honest "stop" today is the global Lockdown (#203). To stop ONE agent — or to show two agents without lying — the wire needs identity.Scope (spec level)
ProposalOrigin::Agent { id }(additive variant or field, Wire-contract evolution: Hello capability discovery + the five evolution rules #31 evolution rules — same mechanism as Dapp origin on the wire: attribute browser transactions to the requesting site #198's Dapp variant).RevokeAll(Lockdown) unchanged.Non-goals
Acceptance (when picked up)
Two concurrently connected agents render distinctly in Activity; stopping one leaves the other running; Lockdown still stops both. Wire round-trip + evolution tests.