Skip to content

feat(schema): add media_buy.supported_delivery_types to capabilities - #8458

Open
bokelley wants to merge 4 commits into
mainfrom
bokelley/supported-delivery-types-capability
Open

bokelley wants to merge 4 commits into
mainfrom
bokelley/supported-delivery-types-capability

Conversation

@bokelley

@bokelley bokelley commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Summary

This adds media_buy.supported_delivery_types to get_adcp_capabilities. It's an array of guaranteed and/or non_guaranteed, placed next to and modelled on supported_pricing_models.

  • Why: buyers can skip sellers that don't sell what they're buying (guaranteed-only vs. auction-only) before calling get_products. Today the only signal is the sales-guaranteed / sales-non-guaranteed specialisms. Those are compliance claims, and sales-guaranteed's storyboard actually tests human IO approval.
  • Semantics: like every capability declaration ("Features over versions" in versioning.mdx), it's a commitment. A declaring seller returns only products with a listed delivery_type. When the field is absent, buyers treat delivery types as unknown, not as an empty set.
  • Compatibility: an optional field, so it's additive and a minor change. Under the RFC process, adding an optional field needs no RFC, and the description relies on the existing capability contract instead of adding new normative language.

This was split out of #8454 so it can land in 3.3. The x-adcp-applies-when annotation that builds on it stays on the RFC track (#8452). Background: #8359.

Checks

  • npm run test:schemas (826 + 10 + 6 pass), test:mcp-schema-projection (40 pass), the required-declared and inline-enum-drift lints, and doc JSON validation on the three touched docs.
  • check-changeset-protocol-scope passes; changeset status shows a minor bump.
  • Committed with --no-verify and pushed with ADCP_SKIP_STORYBOARD_MATRIX=1. This sandbox's node_modules predate the 10-23 lockfile change, so the local typecheck and storyboard matrix fail on unrelated server code. CI is authoritative.

🤖 Generated with Claude Code


Open workspace in Conductor

Sellers declare whether they sell guaranteed inventory, non_guaranteed
inventory, or both, mirroring supported_pricing_models, so buyers can filter
sellers before calling get_products. Like every capability declaration it is
a commitment: a declaring seller returns only products with a listed
delivery_type. When absent, buyers treat delivery types as unknown.

Split out of #8454, whose x-adcp-applies-when annotation stays on the RFC
track (#8452). Background: #8359.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
bokelley added a commit that referenced this pull request Oct 24, 2026
…-when

Adds the x-adcp-applies-when annotation. It names the capability
declarations (delivery_types, pricing_models, capabilities paths) that make
an optional property relevant, and never changes validation. Projections,
such as a non-guaranteed-only MCP tool surface, use it to drop optional
fields from one canonical schema, with no seller-specific SDKs.

Initial annotations: product.cancellation_policy (guaranteed); floor_price
and price_guidance on pricing options (non_guaranteed); the product's
conversion-tracking, vendor-metric-optimization, and Trusted Match fields
(their capability blocks). scripts/lint-applies-when.cjs checks every
annotation.

Builds on #8458 (supported_delivery_types). Refs #8452.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@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 requires human/CODEOWNERS approval.

This is a clean, additive PR: it adds media_buy.supported_delivery_types to get-adcp-capabilities-response.json, mirroring the existing supported_pricing_models shape ($ref to the delivery-type.json enum, array, minItems:1, uniqueItems). The reviewer confirmed schema↔docs coherence across capabilities-explorer.mdx, the 3-2-to-3-3 migration guide, and whats-new-in-3-3.mdx; the minor changeset is correct for a new optional field; no oneOf regression; no dist edits. No critical/high/medium findings.

However, static/schemas/source/protocol/get-adcp-capabilities-response.json matches the gated path glob static/schemas/source/** (gated_paths: true), and review_decision is REVIEW_REQUIRED — not APPROVED. Per decision rule row 2, the hard approval gate is not satisfied, so this cannot be approved without explicit human/CODEOWNERS review.

Escalation reasons

  • Modifies gated path static/schemas/source/protocol/get-adcp-capabilities-response.json (matches static/schemas/source/**); human/CODEOWNERS approval required before merge (review_decision: REVIEW_REQUIRED).

Once a human approval lands (review_decision: APPROVED), the clean diff can fall through to approve.

Why human review

  • Modifies gated path static/schemas/source/protocol/get-adcp-capabilities-response.json (matches static/schemas/source/**) while review_decision is REVIEW_REQUIRED — human/CODEOWNERS approval required.
  • This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matches static/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', 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 added the ladon/needs-human-review Ladon has escalated this PR for human review. label Oct 24, 2026
…g parameter

Review on #8458 found that display_tag's format parameter is also named
supported_delivery_types (creative serving modes such as inline_markup).
The description now names the product delivery_type enum and says the two
are unrelated.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
bokelley added a commit that referenced this pull request Oct 24, 2026
…-when

Adds the x-adcp-applies-when annotation. It names the capability
declarations (delivery_types, pricing_models, capabilities paths) that make
an optional property relevant, and never changes validation. Projections,
such as a non-guaranteed-only MCP tool surface, use it to drop optional
fields from one canonical schema, with no seller-specific SDKs.

Initial annotations: product.cancellation_policy (guaranteed); floor_price
and price_guidance on pricing options (non_guaranteed); the product's
conversion-tracking, vendor-metric-optimization, and Trusted Match fields
(their capability blocks). scripts/lint-applies-when.cjs checks every
annotation.

Builds on #8458 (supported_delivery_types). Refs #8452.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@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 requires human/CODEOWNERS approval.

This PR adds a description-only clarification to the new media_buy.supported_delivery_types field in static/schemas/source/protocol/get-adcp-capabilities-response.json (L1559), disambiguating it from the name-colliding supported_delivery_types parameter on display_tag.json. The reviewer verified both enums and the clarification is accurate and load-bearing. No critical/high/medium findings; schema↔docs coherence holds and the prior pass was clean.

However, gated_paths is true (the modified file matches static/schemas/source/**) and review_decision is REVIEW_REQUIRED, not APPROVED. Per the hard approval gate (decision row 2), Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is. This also matches the prior escalate decision.

Escalation reasons

  • Modifies gated path static/schemas/source/protocol/get-adcp-capabilities-response.json (matches static/schemas/source/**) while review_decision is REVIEW_REQUIRED — human/CODEOWNERS approval required.

Why human review

  • Modifies gated path static/schemas/source/protocol/get-adcp-capabilities-response.json (matches static/schemas/source/**) while review_decision is REVIEW_REQUIRED — human/CODEOWNERS approval required.
  • This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matches static/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', 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.

@KonstantinMirin

Copy link
Copy Markdown
Collaborator

Thanks, Brian. supported_delivery_types sits next to supported_pricing_models with the same shape, and its items $ref the same enums/delivery-type.json that the required product.delivery_type uses, so the capability and the product field share one vocabulary. The commitment rests on the existing "if declared, the seller MUST honor it" contract with no new normative rule, minItems: 1 keeps an empty declaration from being confused with an absent one, and the schema description, changeset, explorer, migration guide and what's-new all state the same rule.

Looks good to me.

@bokelley bokelley modified the milestones: 3.4.0, 3.3.0 Nov 7, 2026
@bokelley

bokelley commented Nov 8, 2026

Copy link
Copy Markdown
Contributor Author

Moved to the 3.3.0 milestone pending tomorrow's WG session (agenda item 5, addendum). The question is whether this optional capability declaration ships in 3.3 and joins the consent round closing Nov 13. If the group says no, it moves to 4.x.

@KonstantinMirin KonstantinMirin left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Hi Brian, the change itself looks right to me: an optional field on an open object, using the same enums/delivery-type.json as product.delivery_type, and mirroring supported_pricing_models. One thing to fix before merge, and one question.

  • The worst-case capabilities test fails after merging with main. tests/capabilities-structural-bounds.test.cjs was added in #8505 two days after this PR's base, and it pins the worst-case capabilities document at 99,100,981 bytes. With the new array it's 99,101,045, so the merged tree fails npm run test:contracts. The PR's green checks are from Oct 24, before the test existed. The fix is the usual re-pin: DOCUMENTED_WORST_CASE_BYTES = 99_101_045 at line 30, and the same number in docs/building/by-layer/L1/security.mdx:2560. The open-positions count stays 108, and the field needs no maxItems (the bounds script treats it as a closed enum, like supported_pricing_models).
  • Release. You moved it to 3.3 pending the Nov 9 session, and I can't find the outcome recorded anywhere. If it's 3.3, it can merge after the re-pin. If not, since there's no 3.4, x-added-in and the two release-doc bullets move to 4.0.

Integrate the once-pinned main df2446f. Focused/feature checks and typecheck pass. Broad local hooks were blocked by overloaded-host startup and worker timeouts. The named isolated replays still hit the unchanged hosted-compliance-echoed-release beforeAll timeout. Per the release coordinator, record with --no-verify and publish for exact-head GitHub CI; do not change budgets or merge automatically.
@bokelley

Copy link
Copy Markdown
Contributor Author

Updated from the once-pinned main df2446fb432e8acdc894d72e5cd02ba36800bfdf; new head is 5562fbc2c1b470b17d7b0ab14355681f0cd1d300.

Recomputed the capabilities worst case on the merged tree: 99,101,045 bytes, exactly Konstantin's figure. Both DOCUMENTED_WORST_CASE_BYTES and security.mdx now match it. The release target is 3.3. npm run test:contracts and typecheck pass.

The overloaded host's broad hook hit unrelated startup/worker timeouts. hosted-compliance-echoed-release.test.ts still times out in its unchanged 10-second beforeAll when run alone. Per the release manager, committed with --no-verify, retaining that local evidence so GitHub CI on this exact head decides. No test budgets changed; auto-merge remains off.

@bokelley

Copy link
Copy Markdown
Contributor Author

@KonstantinMirin — re-pinned on 5562fbc2c1b470b17d7b0ab14355681f0cd1d300 after merging main at df2446fb432e8acdc894d72e5cd02ba36800bfdf. The measured worst case is 99,101,045 bytes, matching your number; the test constant and security documentation agree. This ships in 3.3.

npm run test:contracts, typecheck, and all GitHub checks pass on this head (64 passed, 1 skipped). Please re-review the refreshed head for the Nov 16 RC. Brian performs the merge; auto-merge is off.

Merge main at 2dc672e after #8866.
The merged-tree measurement is 99,101,090 bytes and 190 open positions;
update the regression pins and both security.mdx figures accordingly.

Validation: capabilities-structural-bounds, full test:contracts, and typecheck.
Per the release coordinator's standing instruction, commit with --no-verify
after the focused checks rather than repeat overloaded-host full hooks;
GitHub CI on this exact head remains authoritative. No test budgets changed.
@bokelley

Copy link
Copy Markdown
Contributor Author

@KonstantinMirin merged current main (2dc672e316, including #8866) and re-measured/re-pinned both test constants and security figures to 99,101,090 bytes / 190 open positions on 05e1bf044d; capabilities-structural-bounds, full test:contracts, and typecheck pass in Docker—ready for re-review for 3.3.

@KonstantinMirin KonstantinMirin left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks, Brian. Both points are resolved. On 05e1bf044d, capabilities-structural-bounds passes with 99,101,090 bytes and 190 open positions. That's main's 99,101,026 plus the same 64 bytes as before #8866, and security.mdx states the same figure. With 3.3 confirmed as the release, x-added-in and the release-doc bullets are right as they are.

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

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.

2 participants