### 1 · read the agent card GET /.well-known/agent-card.json HTTP/1.1 Host: localhost:41241 Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { "name": "test-runner", "description": "Checks out a commit, runs its test suite in a clean container, and streams the log.", "supportedInterfaces": [ { "url": "http://localhost:41241/a2a/jsonrpc", "protocolBinding": "JSONRPC", "protocolVersion": "1.0" }, { "url": "http://localhost:41241/a2a/rest", "protocolBinding": "HTTP+JSON", "protocolVersion": "1.0" } ], "provider": { "url": "https://ci.example.com", "organization": "Platform Team" }, "version": "2.3.0", "capabilities": { "streaming": true, "pushNotifications": true }, "defaultInputModes": [ "text/plain", "application/json" ], "defaultOutputModes": [ "text/plain", "application/json" ], "skills": [ { "id": "run-tests", "name": "Run tests", "description": "Run the test suite of a repository at one commit and report each failure with its log.", "tags": [ "ci", "tests" ], "examples": [ "Run the unit tests for payments-api at commit 9f3c2e1" ] } ] } ### 2 · read the agent card GET /.well-known/agent-card.json HTTP/1.1 Host: localhost:41242 Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { "name": "code-reviewer", "description": "Reviews a unified diff against a base branch and returns findings with file and line.", "supportedInterfaces": [ { "url": "http://localhost:41242/a2a/jsonrpc", "protocolBinding": "JSONRPC", "protocolVersion": "1.0" }, { "url": "http://localhost:41242/a2a/rest", "protocolBinding": "HTTP+JSON", "protocolVersion": "1.0" } ], "provider": { "url": "https://review.example.com", "organization": "Developer Tools" }, "version": "0.9.4", "capabilities": { "streaming": true }, "defaultInputModes": [ "text/plain", "text/x-diff" ], "defaultOutputModes": [ "text/plain", "application/json" ], "skills": [ { "id": "review-diff", "name": "Review a diff", "description": "Compare a diff with its base branch and report risky changes.", "tags": [ "review", "diff" ], "examples": [ "Review this diff of payments-api" ], "inputModes": [ "text/x-diff", "text/plain" ] }, { "id": "answer-question", "name": "Answer a review question", "description": "Answer a short question about what this reviewer checks.", "tags": [ "review", "faq" ] } ] } ### 3 · read the agent card GET /.well-known/agent-card.json HTTP/1.1 Host: localhost:41243 Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { "name": "deployer", "description": "Deploys a tagged build to staging after an operator approves it.", "supportedInterfaces": [ { "url": "http://localhost:41243/a2a/jsonrpc", "protocolBinding": "JSONRPC", "protocolVersion": "1.0" }, { "url": "http://localhost:41243/a2a/rest", "protocolBinding": "HTTP+JSON", "protocolVersion": "1.0" } ], "provider": { "url": "https://deploy.example.com", "organization": "Platform Team" }, "version": "1.4.1", "capabilities": { "streaming": true, "extendedAgentCard": true }, "securitySchemes": { "bearer": { "httpAuthSecurityScheme": { "description": "A token issued by the platform team.", "scheme": "Bearer" } } }, "securityRequirements": [ { "schemes": { "bearer": { "list": [] } } } ], "defaultInputModes": [ "text/plain" ], "defaultOutputModes": [ "text/plain", "application/json" ], "skills": [ { "id": "deploy", "name": "Deploy a build", "description": "Deploy one tagged build to staging, with operator approval.", "tags": [ "deploy", "staging" ], "examples": [ "Deploy build 2026.10.06-1 to staging" ] } ], "signatures": [ { "protected": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpPU0UiLCJraWQiOiJkZXBsb3llci1rZXktMSJ9", "signature": "yPk834ji_dOVmxElhzV3yTYBT9NVp8Bx1j5K0LQmOww" } ] } ### 4 · SendMessage to test-runner POST /a2a/jsonrpc HTTP/1.1 Host: localhost:41241 Content-Type: application/json A2A-Version: 1.0 { "jsonrpc": "2.0", "id": 1, "method": "SendMessage", "params": { "message": { "messageId": "e539a78b-c8ef-4346-8b12-ae6ead581e57", "role": "ROLE_USER", "parts": [ { "text": "Run the unit tests for payments-api at commit a41d7c3" } ] } } } HTTP/1.1 200 OK Content-Type: application/json { "jsonrpc": "2.0", "id": 1, "result": { "task": { "id": "954267b7-cd3e-4468-84b2-bba1a2bd61f2", "contextId": "59e43731-246c-459c-b5c6-bf83035578ba", "status": { "state": "TASK_STATE_COMPLETED", "message": { "messageId": "104ae5df-902b-4a6a-bb69-01aa767c7dcf", "contextId": "59e43731-246c-459c-b5c6-bf83035578ba", "taskId": "954267b7-cd3e-4468-84b2-bba1a2bd61f2", "role": "ROLE_AGENT", "parts": [ { "text": "13 passed" } ] }, "timestamp": "2026-10-06T09:00:06.750Z" }, "history": [ { "messageId": "e539a78b-c8ef-4346-8b12-ae6ead581e57", "contextId": "59e43731-246c-459c-b5c6-bf83035578ba", "taskId": "954267b7-cd3e-4468-84b2-bba1a2bd61f2", "role": "ROLE_USER", "parts": [ { "text": "Run the unit tests for payments-api at commit a41d7c3" } ] }, { "messageId": "b93da845-0a68-4c1b-b7b6-ac94abca91c0", "contextId": "59e43731-246c-459c-b5c6-bf83035578ba", "taskId": "954267b7-cd3e-4468-84b2-bba1a2bd61f2", "role": "ROLE_AGENT", "parts": [ { "text": "Checking out a41d7c3 and starting the suite" } ] } ], "artifacts": [ { "artifactId": "test-log", "name": "test-log.txt", "parts": [ { "text": "collected 13 items\n" }, { "text": "tests/test_charges.py ........ [ 61%]\n" }, { "text": "tests/test_refunds.py ..... [100%]\n" }, { "text": "13 passed in 4.38s\n" } ] }, { "artifactId": "summary", "name": "summary.json", "parts": [ { "data": { "passed": 13, "failed": 0 }, "mediaType": "application/json" } ] } ] } } } ### 5 · SendMessage to code-reviewer POST /a2a/jsonrpc HTTP/1.1 Host: localhost:41242 Content-Type: application/json A2A-Version: 1.0 { "jsonrpc": "2.0", "id": 2, "method": "SendMessage", "params": { "message": { "messageId": "331241a9-82f1-4ec0-9ee5-7012853d452f", "role": "ROLE_USER", "parts": [ { "text": "Review this diff of payments-api." }, { "raw": "LS0tIGEvdGVzdHMvdGVzdF9yZWZ1bmRzLnB5CisrKyBiL3Rlc3RzL3Rlc3RfcmVmdW5kcy5weQpAQCAtMTUsMyArMTUsNyBAQCBkZWYgdGVzdF9mdWxsX3JlZnVuZCgpOgorZGVmIHRlc3RfcGFydGlhbF9yZWZ1bmRfa2VlcHNfY2VudHMoKToKKyAgICBhc3NlcnQgcGFydGlhbF9yZWZ1bmQoY2hhcmdlKDEwMDApLCA0NTApLm5ldCA9PSA0NTAK", "filename": "refunds.diff", "mediaType": "text/x-diff" } ] } } } HTTP/1.1 200 OK Content-Type: application/json { "jsonrpc": "2.0", "id": 2, "result": { "task": { "id": "80bc7784-c3a4-40bf-a87e-2d67b6e4dd84", "contextId": "6e9de948-15f7-48c1-a1c1-fdb3a2e385cb", "status": { "state": "TASK_STATE_INPUT_REQUIRED", "message": { "messageId": "420c02ed-5262-4ec1-9561-dfee1dfd7009", "contextId": "6e9de948-15f7-48c1-a1c1-fdb3a2e385cb", "taskId": "80bc7784-c3a4-40bf-a87e-2d67b6e4dd84", "role": "ROLE_AGENT", "parts": [ { "text": "Which base branch should I compare this diff against?" } ] }, "timestamp": "2026-10-06T09:00:01.750Z" }, "history": [ { "messageId": "331241a9-82f1-4ec0-9ee5-7012853d452f", "contextId": "6e9de948-15f7-48c1-a1c1-fdb3a2e385cb", "taskId": "80bc7784-c3a4-40bf-a87e-2d67b6e4dd84", "role": "ROLE_USER", "parts": [ { "text": "Review this diff of payments-api." }, { "raw": "LS0tIGEvdGVzdHMvdGVzdF9yZWZ1bmRzLnB5CisrKyBiL3Rlc3RzL3Rlc3RfcmVmdW5kcy5weQpAQCAtMTUsMyArMTUsNyBAQCBkZWYgdGVzdF9mdWxsX3JlZnVuZCgpOgorZGVmIHRlc3RfcGFydGlhbF9yZWZ1bmRfa2VlcHNfY2VudHMoKToKKyAgICBhc3NlcnQgcGFydGlhbF9yZWZ1bmQoY2hhcmdlKDEwMDApLCA0NTApLm5ldCA9PSA0NTAK", "filename": "refunds.diff", "mediaType": "text/x-diff" } ] } ] } } } ### 6 · SendMessage: answer code-reviewer POST /a2a/jsonrpc HTTP/1.1 Host: localhost:41242 Content-Type: application/json A2A-Version: 1.0 { "jsonrpc": "2.0", "id": 3, "method": "SendMessage", "params": { "message": { "messageId": "877994af-ff2f-4504-98e0-0e8c64beb012", "contextId": "6e9de948-15f7-48c1-a1c1-fdb3a2e385cb", "taskId": "80bc7784-c3a4-40bf-a87e-2d67b6e4dd84", "role": "ROLE_USER", "parts": [ { "text": "main" } ] } } } HTTP/1.1 200 OK Content-Type: application/json { "jsonrpc": "2.0", "id": 3, "result": { "task": { "id": "80bc7784-c3a4-40bf-a87e-2d67b6e4dd84", "contextId": "6e9de948-15f7-48c1-a1c1-fdb3a2e385cb", "status": { "state": "TASK_STATE_COMPLETED", "message": { "messageId": "9f3cda35-b2ad-44a3-903e-4ddea99e1e65", "contextId": "6e9de948-15f7-48c1-a1c1-fdb3a2e385cb", "taskId": "80bc7784-c3a4-40bf-a87e-2d67b6e4dd84", "role": "ROLE_AGENT", "parts": [ { "text": "1 finding" } ] }, "timestamp": "2026-10-06T09:00:02.500Z" }, "history": [ { "messageId": "331241a9-82f1-4ec0-9ee5-7012853d452f", "contextId": "6e9de948-15f7-48c1-a1c1-fdb3a2e385cb", "taskId": "80bc7784-c3a4-40bf-a87e-2d67b6e4dd84", "role": "ROLE_USER", "parts": [ { "text": "Review this diff of payments-api." }, { "raw": "LS0tIGEvdGVzdHMvdGVzdF9yZWZ1bmRzLnB5CisrKyBiL3Rlc3RzL3Rlc3RfcmVmdW5kcy5weQpAQCAtMTUsMyArMTUsNyBAQCBkZWYgdGVzdF9mdWxsX3JlZnVuZCgpOgorZGVmIHRlc3RfcGFydGlhbF9yZWZ1bmRfa2VlcHNfY2VudHMoKToKKyAgICBhc3NlcnQgcGFydGlhbF9yZWZ1bmQoY2hhcmdlKDEwMDApLCA0NTApLm5ldCA9PSA0NTAK", "filename": "refunds.diff", "mediaType": "text/x-diff" } ] }, { "messageId": "420c02ed-5262-4ec1-9561-dfee1dfd7009", "contextId": "6e9de948-15f7-48c1-a1c1-fdb3a2e385cb", "taskId": "80bc7784-c3a4-40bf-a87e-2d67b6e4dd84", "role": "ROLE_AGENT", "parts": [ { "text": "Which base branch should I compare this diff against?" } ] }, { "messageId": "877994af-ff2f-4504-98e0-0e8c64beb012", "contextId": "6e9de948-15f7-48c1-a1c1-fdb3a2e385cb", "taskId": "80bc7784-c3a4-40bf-a87e-2d67b6e4dd84", "role": "ROLE_USER", "parts": [ { "text": "main" } ] }, { "messageId": "c9ff9cf4-d5e5-4ae8-8e4a-b626b825bc06", "contextId": "6e9de948-15f7-48c1-a1c1-fdb3a2e385cb", "taskId": "80bc7784-c3a4-40bf-a87e-2d67b6e4dd84", "role": "ROLE_AGENT", "parts": [ { "text": "Comparing the diff against main" } ] } ], "artifacts": [ { "artifactId": "review", "name": "review.json", "parts": [ { "text": "1 finding in tests/test_refunds.py" }, { "data": { "base": "main", "findings": [ { "file": "tests/test_refunds.py", "line": 18, "severity": "low", "finding": "The test name does not say which rounding rule it checks." } ] }, "mediaType": "application/json" } ] } ] } } } ### 7 · SendMessage to deployer POST /a2a/jsonrpc HTTP/1.1 Host: localhost:41243 Content-Type: application/json A2A-Version: 1.0 Authorization: Bearer dpl_test_7c1e4b { "jsonrpc": "2.0", "id": 4, "method": "SendMessage", "params": { "message": { "messageId": "9851e4d5-25f4-4a82-95af-4c654a13d22e", "role": "ROLE_USER", "parts": [ { "text": "Deploy build 2026.10.06-1 to staging" } ] } } } HTTP/1.1 200 OK Content-Type: application/json { "jsonrpc": "2.0", "id": 4, "result": { "task": { "id": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "status": { "state": "TASK_STATE_AUTH_REQUIRED", "message": { "messageId": "1db4a812-747d-4b65-b9ec-d12994a90ffa", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "role": "ROLE_AGENT", "parts": [ { "text": "An operator must approve this deploy at http://localhost:41243/approve/a31361b3-6811-49e8-afe9-fbfcafced6f8" } ] }, "timestamp": "2026-10-06T09:00:02.500Z" }, "history": [ { "messageId": "9851e4d5-25f4-4a82-95af-4c654a13d22e", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "role": "ROLE_USER", "parts": [ { "text": "Deploy build 2026.10.06-1 to staging" } ] }, { "messageId": "16218b58-1d46-4ce2-bb8e-1680c75b1004", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "role": "ROLE_AGENT", "parts": [ { "text": "Preparing build 2026.10.06-1 for staging" } ] } ] } } } ### 8 · SubscribeToTask on deployer POST /a2a/jsonrpc HTTP/1.1 Host: localhost:41243 Content-Type: application/json A2A-Version: 1.0 Authorization: Bearer dpl_test_7c1e4b Accept: text/event-stream { "jsonrpc": "2.0", "id": 5, "method": "SubscribeToTask", "params": { "id": "a31361b3-6811-49e8-afe9-fbfcafced6f8" } } HTTP/1.1 200 OK Content-Type: text/event-stream data: {"jsonrpc": "2.0", "id": 5, "result": {"task": {"id": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "status": {"state": "TASK_STATE_AUTH_REQUIRED", "message": {"messageId": "1db4a812-747d-4b65-b9ec-d12994a90ffa", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "role": "ROLE_AGENT", "parts": [{"text": "An operator must approve this deploy at http://localhost:41243/approve/a31361b3-6811-49e8-afe9-fbfcafced6f8"}]}, "timestamp": "2026-10-06T09:00:02.500Z"}, "history": [{"messageId": "9851e4d5-25f4-4a82-95af-4c654a13d22e", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "role": "ROLE_USER", "parts": [{"text": "Deploy build 2026.10.06-1 to staging"}]}, {"messageId": "16218b58-1d46-4ce2-bb8e-1680c75b1004", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "role": "ROLE_AGENT", "parts": [{"text": "Preparing build 2026.10.06-1 for staging"}]}]}}} # The operator approves the deploy, outside A2A. ### 9 · operator approves POST /approve/a31361b3-6811-49e8-afe9-fbfcafced6f8 HTTP/1.1 Host: localhost:41243 Content-Type: application/json {} HTTP/1.1 200 OK Content-Type: application/json { "approved": true, "taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8" } data: {"jsonrpc": "2.0", "id": 5, "result": {"statusUpdate": {"taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "status": {"state": "TASK_STATE_WORKING", "message": {"messageId": "025a7c9b-3cc3-4c60-a437-b1512298d884", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "role": "ROLE_AGENT", "parts": [{"text": "Approved by an operator. Rolling out to staging"}]}, "timestamp": "2026-10-06T09:00:02.750Z"}}}} data: {"jsonrpc": "2.0", "id": 5, "result": {"artifactUpdate": {"taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "artifact": {"artifactId": "deploy-report", "name": "deploy-report.json", "parts": [{"data": {"environment": "staging", "build": "2026.10.06-1", "url": "https://staging.example.com", "healthChecks": "3 of 3 passing"}, "mediaType": "application/json"}]}, "lastChunk": true}}} data: {"jsonrpc": "2.0", "id": 5, "result": {"statusUpdate": {"taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "status": {"state": "TASK_STATE_COMPLETED", "message": {"messageId": "6e49ae88-5874-423f-824b-f01ef2ea2170", "contextId": "c4ea2d65-1586-4b07-8e9c-7d3555385cb7", "taskId": "a31361b3-6811-49e8-afe9-fbfcafced6f8", "role": "ROLE_AGENT", "parts": [{"text": "Build 2026.10.06-1 is live on staging"}]}, "timestamp": "2026-10-06T09:00:03.000Z"}}}}