docs(a2a): standardize the AdCP 1.0 profile - #6630
Conversation
There was a problem hiding this comment.
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) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/build-creative-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/build-creative-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/create-media-buy-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/create-media-buy-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/sync-audiences-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/update-media-buy-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/update-media-buy-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/signals/get-signals-async-response-submitted.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'unknown', not APPROVED. This is a hard gate enforced in cod
…(truncated)…
There was a problem hiding this comment.
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.includes → Set.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) andreview_decisionis notAPPROVED— human/CODEOWNERS review required. - A2A profile / transport-layer change: repo's breaking-class hard gate requires human ratification unless
review_decisionisAPPROVED.
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) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/build-creative-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/build-creative-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/create-media-buy-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/create-media-buy-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/sync-audiences-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/update-media-buy-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/update-media-buy-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/signals/get-signals-async-response-submitted.json (modified) matchesstatic/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.
There was a problem hiding this comment.
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_decisionis notAPPROVED. Human/CODEOWNERS review required. - A2A profile / transport-layer change — breaking-class governance requires human ratification unless
review_decisionisAPPROVED.
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) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/build-creative-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/build-creative-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/create-media-buy-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/create-media-buy-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/sync-audiences-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-async-response-submitted.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/sync-catalogs-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-b
…(truncated)…
Summary
https://adcontextprotocol.org/extensions/adcp/v3{ skill, input }messages, response extraction, and advisory text partssubmittedresponses in completed A2A tasks and poll durable work throughget_task_statusWhy
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 throughget_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, andartifact.metadata.adcp_task_idis no longer duplicated.Validation
npm run test:a2a-profile-extension: 20 passedCloses #3052