{"source":"agent-registry","count":5,"agents":[{"name":"fleet_controller","model":"gemini-3.7-flash","role":"Task decomposition and customer resolution","tools":["find_customer","get_customer","list_orders","get_order","get_subscription"],"mutates":false,"collaborates_with":["billing_agent","account_agent"],"contract":{"agent":"fleet_controller","may_call":["find_customer","get_customer","get_order","get_subscription","list_orders"],"may_mutate":[],"must_not_call":["cancel_subscription","delete_account","issue_refund","record_note","unlock_account","update_address"],"needs_human_above":null,"always_needs_human":[],"max_tool_calls_per_task":12,"max_seconds_per_turn":90.0,"enforced_at":"policy.before_tool","why":"Sees the whole ticket, so it holds no mutating tool at all: the component with the most context has the least authority."},"registry":{"resource":"agentregistry-00000000-0000-0000-b79b-8a10b203f0ca","agent_id":"urn:agent:projects-434066362046:projects:434066362046:locations:global:agentregistry:services:attest-fleet-controller","version":"1.0.0","skills":["find_customer","get_customer","list_orders","get_order","get_subscription"],"protocols":["A2A_AGENT"]},"registered":true},{"name":"billing_agent","model":"gemini-3.7-flash","role":"Refunds and order actions","tools":["get_customer","list_orders","get_order","issue_refund","record_note"],"mutates":true,"collaborates_with":["fleet_controller"],"contract":{"agent":"billing_agent","may_call":["get_customer","get_order","issue_refund","list_orders","record_note"],"may_mutate":["issue_refund","record_note"],"must_not_call":["cancel_subscription","delete_account","unlock_account","update_address"],"needs_human_above":"cumulative refund of 100 per order","always_needs_human":[],"max_tool_calls_per_task":12,"max_seconds_per_turn":90.0,"enforced_at":"policy.before_tool","why":"Moves money. Cannot touch addresses, subscriptions or account state, so a confused or injected billing agent has no lever to reach them."},"registry":{"resource":"agentregistry-00000000-0000-0000-b610-b9026aa05c45","agent_id":"urn:agent:projects-434066362046:projects:434066362046:locations:global:agentregistry:services:attest-billing-agent","version":"1.0.0","skills":["get_customer","list_orders","get_order","issue_refund","record_note"],"protocols":["A2A_AGENT"]},"registered":true},{"name":"account_agent","model":"gemini-3.7-flash","role":"Address, subscription, lock and deletion actions","tools":["find_customer","get_customer","get_subscription","update_address","cancel_subscription","unlock_account","delete_account","record_note"],"mutates":true,"collaborates_with":["fleet_controller"],"contract":{"agent":"account_agent","may_call":["cancel_subscription","delete_account","find_customer","get_customer","get_subscription","record_note","unlock_account","update_address"],"may_mutate":["cancel_subscription","delete_account","record_note","unlock_account","update_address"],"must_not_call":["issue_refund"],"needs_human_above":null,"always_needs_human":["delete_account"],"max_tool_calls_per_task":12,"max_seconds_per_turn":90.0,"enforced_at":"policy.before_tool","why":"Changes account state. Holds no refund tool, so it cannot move money however it is prompted."},"registry":{"resource":"agentregistry-00000000-0000-0000-3963-0b30c80c2016","agent_id":"urn:agent:projects-434066362046:projects:434066362046:locations:global:agentregistry:services:attest-account-agent","version":"1.0.0","skills":["find_customer","get_customer","get_subscription","update_address","cancel_subscription","unlock_account","delete_account","record_note"],"protocols":["A2A_AGENT"]},"registered":true},{"name":"vision_reader","model":"gemini-3.7-flash","role":"Reads an image attached to a ticket (screenshot, receipt, photo) into text before planning","tools":[],"mutates":false,"collaborates_with":["fleet_controller"],"contract":{"agent":"vision_reader","may_call":[],"may_mutate":[],"must_not_call":["cancel_subscription","delete_account","issue_refund","record_note","unlock_account","update_address"],"needs_human_above":null,"always_needs_human":[],"max_tool_calls_per_task":12,"max_seconds_per_turn":90.0,"enforced_at":"policy.before_tool","why":"Reads an attached image into text. No tools at all: an attachment is attacker-controlled input and must not carry authority."},"registry":{"resource":"agentregistry-00000000-0000-0000-e70e-2f4033eeca3c","agent_id":"urn:agent:projects-434066362046:projects:434066362046:locations:global:agentregistry:services:attest-vision-reader","version":"1.0.0","skills":["vision_reader-verify"],"protocols":["A2A_AGENT"]},"registered":true},{"name":"auditor","model":"gemma-4-31b-it","role":"LLM verification for tasks without a deterministic post-condition","tools":[],"mutates":false,"collaborates_with":[],"contract":{"agent":"auditor","may_call":[],"may_mutate":[],"must_not_call":["cancel_subscription","delete_account","issue_refund","record_note","unlock_account","update_address"],"needs_human_above":null,"always_needs_human":[],"max_tool_calls_per_task":12,"max_seconds_per_turn":90.0,"enforced_at":"policy.before_tool","why":"Judges a claim when no deterministic check exists. No tools, and a different model family from the workers, so it cannot act on its own verdict."},"registry":{"resource":"agentregistry-00000000-0000-0000-2107-4ac362ff8d26","agent_id":"urn:agent:projects-434066362046:projects:434066362046:locations:global:agentregistry:services:attest-auditor","version":"1.0.0","skills":["auditor-verify"],"protocols":["A2A_AGENT"]},"registered":true}]}