Skip to content

docs(a2a): standardize the AdCP 1.0 profile - #6630

Merged
bokelley merged 3 commits into
mainfrom
standardize-a2a-extension
Aug 17, 2026
Merged

docs(a2a): standardize the AdCP 1.0 profile#6630
bokelley merged 3 commits into
mainfrom
standardize-a2a-extension

Conversation

@bokelley

Copy link
Copy Markdown
Contributor

Summary

  • define the AdCP A2A 1.0 profile at https://adcontextprotocol.org/extensions/adcp/v3
  • standardize Agent Card advertisement and activation, { skill, input } messages, response extraction, and advisory text parts
  • carry AdCP submitted responses in completed A2A tasks and poll durable work through get_task_status
  • add binding vectors, conformance tests, schema/compliance guidance, and align existing docs and SDK guidance

Why

AdCP already described parts of an A2A binding, but the guidance was inconsistent across docs and examples. A2A 1.0 now provides a bounded extension mechanism, so this PR standardizes the profile without defining a new transport. The URI follows the compatible AdCP major (v3), while runtime release and capability discovery remain authoritative through get_adcp_capabilities.

Impact

Clients and adapters get one deterministic A2A 1.0 binding. Existing examples now use required messageId, AgentSkill.id, SendMessage response branches, and correct continuation and push semantics. AdCP and A2A task identifiers remain separate, and artifact.metadata.adcp_task_id is no longer duplicated.

Validation

  • full pre-commit suite: 6,171 passed, 30 skipped
  • npm run test:a2a-profile-extension: 20 passed
  • A2A response extraction suite: 70 passed
  • schema validation: 823 schemas / 32 checks
  • docs navigation: 22 passed
  • owned links: 20 passed
  • TypeScript typecheck
  • current and AdCP 3.0 storyboard compatibility matrices
  • protocol, SDK, and docs expert reviews: pass

Closes #3052

Comment thread tests/a2a-profile-extension-v3.test.cjs Fixed
@bokelley
bokelley marked this pull request as ready for review August 17, 2026 09:05
@bokelley bokelley changed the title [codex] standardize AdCP A2A 1.0 profile docs(a2a): standardize the AdCP 1.0 profile Aug 17, 2026
Comment thread docs/building/by-layer/L3/async-operations.mdx Outdated
@aao-secretariat aao-secretariat Bot added the ladon/needs-human-review Ladon has escalated this PR for human review. label Aug 17, 2026

@aao-secretariat aao-secretariat Bot 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.

Ladon verdict: Escalate to human review

Escalate — gated paths touched without an approving review.

This PR standardizes the AdCP A2A 1.0 profile extension v3: a new normative doc, test vectors + conformance test, and a sweep of A2A docs/schemas/compliance from the unversioned v2 shape to the versioned { skill, input } shape polled via get_task_status. Wire-shape changes are gated behind the new /v3 extension URI; the 27 schema-source edits are description-only (task_id polling text), and schema↔docs coherence holds.

Why escalate (not approve): The diff modifies 16 files under static/schemas/source/**, which are under a deterministic hard approval gate (gated_paths: true), and review_decision is not APPROVED. Decision-table row 2 requires escalation to a human/CODEOWNERS reviewer in this case. Additionally, this is a transport-layer (A2A) profile change, which the repo's breaking-class hard gate says is never auto-approved absent an approving review.

No blocking critical/high findings were surfaced — the schema edits are description-only and coherence checks pass, so this is not a request-changes.

Medium findings

  • docs/building/by-layer/L3/async-operations.mdx:25 — General fail-closed webhook MUST removed during the refactor. A human should confirm this normative requirement is preserved (or intentionally relocated) before merge.

A human/CODEOWNERS reviewer must approve the gated static/schemas/source/** changes.

Medium findings

  • docs/building/by-layer/L3/async-operations.mdx:25 — General fail-closed webhook MUST removed from async-operations.mdx

Why human review

  • Modifies 16 files under static/schemas/source/** (hard approval gate; gated_paths=true) and review_decision is not APPROVED — human/CODEOWNERS review required.
  • A2A profile/transport-layer change: repo's breaking-class hard gate requires human ratification unless review_decision is APPROVED.
  • Medium: docs/building/by-layer/L3/async-operations.mdx:25 — general fail-closed webhook MUST dropped during refactor; confirm the normative requirement is preserved.
  • This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/mcp-webhook-payload.json (modified) matches static/schemas/source/**; static/schemas/source/core/protocol-envelope.json (modified) matches static/schemas/source/**; static/schemas/source/creative/sync-creatives-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/creative/sync-creatives-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/build-creative-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/build-creative-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/create-media-buy-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/create-media-buy-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/sync-audiences-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/update-media-buy-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/update-media-buy-response.json (modified) matches static/schemas/source/**; static/schemas/source/signals/get-signals-async-response-submitted.json (modified) matches static/schemas/source/**) and the current GitHub review decision is 'unknown', not APPROVED. This is a hard gate enforced in cod

…(truncated)…

@aao-secretariat aao-secretariat Bot 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.

Ladon verdict: Escalate to human review

Escalate — gated-path approval gate not satisfied.

This PR modifies 16 files under static/schemas/source/**, which is a hard, deterministic approval gate (gated_paths: true). The current review_decision is unknown/none — NOT APPROVED — so decision-table row 2 fires: outcome must be escalate. In addition, the repo's breaking-class hard gate treats A2A / transport-layer profile changes as never-auto-approvable without human ratification.

Delta this pass: Four editorial doc edits (linking bare get_task_status mentions to the real get-task-status-request.json schema) plus one equivalence-preserving test refactor (Array.includesSet.has, behavior unchanged). No blocking or medium findings surfaced in the delta. The prior medium finding on docs/building/by-layer/L3/async-operations.mdx:25 is out of scope this pass and not carried forward. This is a clean, net-positive iteration — but the gate is path-based and does not lift on diff cleanliness alone.

Escalation reasons:

  • Modifies 16 files under static/schemas/source/** (hard approval gate; gated_paths=true) and review_decision is not APPROVED — human/CODEOWNERS review required.
  • A2A profile / transport-layer change: repo's breaking-class hard gate requires human ratification unless review_decision is APPROVED.

The gate lifts automatically once a human/CODEOWNERS approval is recorded (review_decision: APPROVED); at that point a clean diff like this one can approve.

Why human review

  • Modifies 16 files under static/schemas/source/** (hard approval gate; gated_paths=true) and review_decision is not APPROVED — human/CODEOWNERS review required.
  • A2A profile / transport-layer change: repo's breaking-class hard gate requires human ratification unless review_decision is APPROVED.
  • This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/mcp-webhook-payload.json (modified) matches static/schemas/source/**; static/schemas/source/core/protocol-envelope.json (modified) matches static/schemas/source/**; static/schemas/source/creative/sync-creatives-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/creative/sync-creatives-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/build-creative-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/build-creative-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/create-media-buy-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/create-media-buy-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/sync-audiences-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/update-media-buy-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/update-media-buy-response.json (modified) matches static/schemas/source/**; static/schemas/source/signals/get-signals-async-response-submitted.json (modified) matches static/schemas/source/**) and the current GitHub review decision is 'unknown', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.

@aao-secretariat aao-secretariat Bot 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.

Ladon verdict: Escalate to human review

Escalate — hard approval gate on static/schemas/source/** not yet satisfied.

This PR modifies 16 files under static/schemas/source/**, which is a deterministic, path-based hard approval gate (gated_paths: true). The current review_decision is unknown/none — not APPROVED — so the gate is NOT satisfied. Per decision-table row 2, the outcome must be escalate until a human/CODEOWNERS approval is recorded.

Additionally, the PR carries an A2A profile / transport-layer standardization change. Per the repo's breaking-class and 3.1.x transport-layer hard gates, transport-profile changes require human ratification and are never auto-approved absent an APPROVED review decision.

This is a subsequent pass. The delta since the prior escalate is a single two-sentence clarification in docs/building/by-layer/L3/async-operations.mdx (progress notifications optional; server MUST reject unsupported webhook channels with a structured error rather than silently downgrade). The reviewer found this clean and coherent with the surrounding MUST and the constitution's fail-closed principles — no wire-shape change, no schema↔docs drift, no oneOf regression.

Blocking findings: none (no critical/high/medium findings this run).

Escalation reasons:

  • 16 files under static/schemas/source/** modified — hard, non-overridable approval gate; review_decision is not APPROVED. Human/CODEOWNERS review required.
  • A2A profile / transport-layer change — breaking-class governance requires human ratification unless review_decision is APPROVED.

The diff itself is clean; the escalation is purely because the deterministic path gate and transport-layer governance gate require a recorded human/CODEOWNERS approval, which is not present. Once review_decision becomes APPROVED, this can fall through to a normal decision.

Why human review

  • Modifies 16 files under static/schemas/source/** (hard approval gate; gated_paths=true) and review_decision is not APPROVED — human/CODEOWNERS review required.
  • A2A profile / transport-layer change: repo's breaking-class and 3.1.x transport-layer hard gates require human ratification unless review_decision is APPROVED.
  • Gated paths under static/schemas/source/** (mcp-webhook-payload.json, protocol-envelope.json, sync-creatives-, build-creative-, create-media-buy-, get-products-, sync-audiences-, sync-catalogs-, update-media-buy-, get-signals-) touched while review_decision is unknown, not APPROVED.
  • This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/mcp-webhook-payload.json (modified) matches static/schemas/source/**; static/schemas/source/core/protocol-envelope.json (modified) matches static/schemas/source/**; static/schemas/source/creative/sync-creatives-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/creative/sync-creatives-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/build-creative-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/build-creative-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/create-media-buy-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/create-media-buy-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/sync-audiences-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-async-response-submitted.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-b

…(truncated)…

@bokelley
bokelley merged commit 5c3ba24 into main Aug 17, 2026
50 checks passed
@bokelley
bokelley deleted the standardize-a2a-extension branch August 17, 2026 10:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ladon/needs-human-review Ladon has escalated this PR for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Spec: formalize the AdCP-over-A2A wire binding

2 participants