Skip to content

compliance(media-buy): base media_buy_seller flow should be runnable by sales-non-guaranteed-only sellers#5703

Merged
bokelley merged 1 commit into
adcontextprotocol:mainfrom
fgranata:fix/base-media-buy-non-guaranteed-baseline
Jun 26, 2026
Merged

compliance(media-buy): base media_buy_seller flow should be runnable by sales-non-guaranteed-only sellers#5703
bokelley merged 1 commit into
adcontextprotocol:mainfrom
fgranata:fix/base-media-buy-non-guaranteed-baseline

Conversation

@fgranata

Copy link
Copy Markdown
Contributor

Problem

The base media_buy_seller flow (static/compliance/source/protocols/media-buy/index.yaml) is unrunnable by a seller that declares only specialisms: ["sales-non-guaranteed"].

  • Its fixtures.products are guaranteed-only (sports_preroll_q2, lifestyle_display_q2, both delivery_type: guaranteed), and
  • its create_buy step hardcodes a guaranteed buy (those products + cpm_guaranteed).

A non-guaranteed-only seller correctly rejects a guaranteed buy (per enums/delivery-type.json + enums/specialism.json, sales-non-guaranteed = "Non-guaranteed auction-based media buys") with a terminal DELIVERY_MODE_NOT_SUPPORTED. So create_buy fails and the dependent creative_sync / delivery_monitoring steps cascade as prerequisite_failed — the base lifecycle is unrunnable for that entire seller class, even though the lifecycle it tests (discover → create → deliver) is delivery-type-agnostic.

Change

Switch the base lifecycle to the universal non_guaranteed (auction) path: the fixtures + the create_buy packages now use delivery_type: non_guaranteed with floor-priced pricing options. Non-guaranteed is the lowest-common-denominator delivery type; the guaranteed lifecycle (human IO approval, proposal_finalize) is already covered by the sales-guaranteed specialism bundle, which carries its own guaranteed fixtures.

This is consistent with the existing pattern in specialisms/sales-guaranteed/index.yaml, whose fixtures already seed non-guaranteed products first for the shared seller scenarios, with the note that "a fixture set that contains only guaranteed products will fail those four shared scenarios." This PR applies the same reasoning to the base protocol flow.

Reproduction

Against any live sales-non-guaranteed seller: get_adcp_capabilitiesspecialisms includes sales-non-guaranteed; running the base media_buy_seller flow → create_buy returns DELIVERY_MODE_NOT_SUPPORTED (terminal) and creative_sync / delivery_monitoring cascade.

For maintainer review

  • Guaranteed-only sellers: if a strictly guaranteed-only seller relies on the base flow exercising a guaranteed create, this changes that. The intent here is that the base flow is the universal lifecycle and delivery-type-specific behavior lives in the specialism bundles — but flagging it explicitly for your call. Happy to instead gate fixture provisioning on the seller's declared specialism in the runner if you prefer that shape.
  • Packaged cache: dist/compliance/ is generated from this source; I wasn't able to run the workspace build standalone, so the cache regen is left for your build/CI.

Only the source YAML + a changeset are touched.

…le by sales-non-guaranteed-only sellers)

The base media_buy_seller flow (protocols/media-buy/index.yaml) seeded
guaranteed-only product fixtures and its create_buy step hardcoded a guaranteed
buy. A seller declaring only specialisms: ["sales-non-guaranteed"] correctly
rejects a guaranteed buy (DELIVERY_MODE_NOT_SUPPORTED), so create_buy failed and
the dependent creative_sync / delivery_monitoring steps cascaded — the base
lifecycle was unrunnable for the entire non-guaranteed-only seller class.

Switch the base lifecycle to the universal non-guaranteed (auction) path:
fixtures + the create_buy packages now use delivery_type=non_guaranteed with
floor-priced pricing options. The guaranteed lifecycle (human IO approval,
proposal_finalize) remains covered by the sales-guaranteed specialism bundle,
which carries its own guaranteed fixtures — consistent with that bundle's
existing pattern of seeding non-guaranteed products first for the shared
seller scenarios.

The packaged cache under dist/compliance/ is generated from this source and
should be regenerated by the build.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@aao-release-bot aao-release-bot 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.

⚠️ Argus review could not complete

The automated review encountered an issue (possibly reached max turns, timed out, or failed to post the final gh pr review). A human reviewer should take this PR.

View workflow run

This is an automated message from the Argus AI review workflow.

@bokelley bokelley 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.

Reviewed for triage cleanup: green, scoped, and no 3.2-triggering changeset.

@bokelley bokelley merged commit 4ebf452 into adcontextprotocol:main Jun 26, 2026
4 checks passed
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.

2 participants