Skip to content

docs: add A2A server FRD (simple profile) - #208

Open
Tsuyoshi Ushio (TsuyoshiUshio) wants to merge 1 commit into
mainfrom
tsuyoshiushio-a2a-frd-and-design
Open

Tsuyoshi Ushio (TsuyoshiUshio) wants to merge 1 commit into
mainfrom
tsuyoshiushio-a2a-frd-and-design

Conversation

@TsuyoshiUshio

@TsuyoshiUshio Tsuyoshi Ushio (TsuyoshiUshio) commented Sep 9, 2026 •

Copy link
Copy Markdown
Contributor

Purpose

Add FRD 0009 for the experimental A2A server simple profile and its FRD index entry. This PR contains documentation only. It has no product behavior, dependency, or configuration changes.

The FRD covers only the scope that #209 implements:

  • Opt-in builtin_endpoints.a2a configuration (mode: simple, explicit url).
  • Per-agent Agent Card and A2A 1.0 JSON-RPC SendMessage route.
  • One non-streaming, direct Message response. The existing HTTP auth, runner, and sessions are used again.
  • Fixed request and response limits.

Streaming, Tasks, push notifications, REST binding, and other items are listed as planned work only. They are not specified in this FRD.

Does this introduce a breaking change?

  • Yes
  • No

Pull Request Type

  • Bugfix
  • Feature
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Documentation content changes
  • Other... Please describe:

How to Test

Review docs/frds/0009-a2a-server.md. Start with the goals, non-goals, and Decisions log.

Other Information

This is the bottom PR of the stack. The implementation and sample are in #209.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

The architecture and compatibility proposal require final human review.

Review effort: Lite
Findings: None

What changed in this PR

This documentation-only PR proposes A2A server support through FRD 0009, architecture documentation, and a staged implementation plan.

Changes:

  • Adds FRD 0009 and its index entry.
  • Documents A2A architecture, lifecycle, authentication, and compatibility gates.
  • Defines staged implementation work, including Durable execution.
File Summary
docs/​frds/​README.md Adds FRD 0009 to the index.
docs/​frds/​0009-a2a-server.md Defines requirements, decisions, and acceptance criteria.
docs/​design/​a2a-server.md Documents the proposed architecture and compatibility gates.
docs/​design/​a2a-implementation-plan.md Defines staged implementation slices and acceptance criteria.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@TsuyoshiUshio Tsuyoshi Ushio (TsuyoshiUshio) changed the title docs: propose A2A server architecture docs: add A2A server FRD (simple profile) Sep 25, 2026
@TsuyoshiUshio
Tsuyoshi Ushio (TsuyoshiUshio) marked this pull request as ready for review September 25, 2026 19:34

@hallvictoria hallvictoria left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few design and coverage questions before implementation.

- `url` is required. It is the trusted external JSON-RPC URL that the Agent Card
publishes. It must be absolute HTTPS, without credentials, query, or fragment.
HTTP is accepted only for loopback hosts. The path must end with
`/agents/{slug}/a2a`. The runtime does not infer it from request headers.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we avoid requiring the public URL to end with the internal Functions route? API Management and reverse proxies commonly rewrite paths, while A2A only requires the card to publish an absolute reachable URL. Keeping the HTTPS and credential checks but allowing a different external path would cover those deployments.

it is absent. The runner session ID is a SHA-256 hash of the auth scope, agent
slug, and `contextId`, so client input never becomes a file name. Function,
admin, and anonymous modes share one app trust scope. Entra uses the validated
tenant and object or client identity.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hashing makes contextId filename-safe, but it does not establish ownership. In anonymous/function/admin modes every caller shares the same app scope, so a caller who knows another context ID can resume that transcript. Could continuation require identity-backed auth or a signed server-issued context token, or otherwise remain stateless in shared-scope modes?

### Conversation context

The optional `contextId` continues a conversation. The server generates one when
it is absent. The runner session ID is a SHA-256 hash of the auth scope, agent

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reusing runner sessions also inherits the one-active-turn-per-session constraint. Concurrent requests with the same contextId can load the same history and append conflicting turns, especially across workers. Please define per-context serialization/rejection and include a concurrent same-context test.


### Limits

Fixed limits for each agent: 32 executions in flight, 256 KiB request body,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this limit intended to be global or per worker process? An in-memory limiter is per Functions worker, so scale-out can exceed 32 executions for one agent. Please either describe it as a per-process safety limit or specify distributed/global admission control.

`returnImmediately`, unsupported methods and Parts, limits, and JSON-RPC ID
correlation.
- [x] CI: clean wheel install of `[a2a]` on Python 3.13 and 3.14.
- [x] E2E: real Functions host. MAF `A2AAgent` and a raw HTTP client fetch the

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The real-host E2E in the implementation PR uses anonymous auth, and Core Tools does not enforce function keys locally. Could we add an integration scenario that protects both card discovery and JSON-RPC invocation, or narrow this checked item to anonymous interoperability?

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants