Repository navigation
fix(schema): withdraw 3.3 additions from get_products and sync_creatives assignments (#8501) - #8758
Conversation
…rm remains (#8501) With filters.target_audiences withdrawn from get_products (#8758) and the package copy withdrawn from create_media_buy and update_media_buy, the experimental media_buy.audience_evidence_targets has no 3.3 wire form. - Delete core/audience-evidence-target.json and enums/audience-evidence-relationship.json and their index.json entries. The stable inline relationship enums on audience evidence stay. - Drop the feature from the active inventories and publication claims: experimental status, release notes, What's new, the migration guide's experiments paragraph, and the changeset. - Move the target-matching rules from get_products.mdx into the preserved 4.0 design under purchase_target_audiences_required_in_4_0, keeping a short withdrawal notice at the old anchor; the check keeps its id and its detection no longer keys off the retired feature id. - Retire tests/audience-evidence-targets.test.cjs (preserved at d9b5417) and stop reading the deleted package-forecast-input.json in tests/creative-start-policy.test.cjs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 646 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The MCP parity compile limit moves from 1,376,000 to 1,378,000 bytes (the controller closure measures 1,377,055). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 646 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The MCP parity compile limit moves from 1,376,000 to 1,378,000 bytes (the controller closure measures 1,377,055). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 648 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The match_keys arrays #8446 added on product identity and TMP provider registration get maxItems 64, the cap media_buy.supported_match_keys already carries. The MCP parity compile limit moves from 1,384,000 to 1,386,000 bytes (the controller closure measures 1,385,040). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 648 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The match_keys arrays #8446 added on product identity and TMP provider registration get maxItems 64, the cap media_buy.supported_match_keys already carries. The MCP parity compile limit moves from 1,384,000 to 1,386,000 bytes (the controller closure measures 1,385,040). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erimental, and inventory the rest Adds scripts/audit-schema-bounds.cjs and its inventory: every unbounded array and string in the schema source, by stability, request or response side and proposed limit, plus every property or collection list carried inline. Bounds the arrays and strings that are new in 3.3 or experimental: 648 maxItems/maxLength keywords in 152 schemas, written by `node scripts/audit-schema-bounds.cjs --apply`, which is idempotent and is the one command for regenerating the slice after a conflict. Stable fields are proposed for 4.0 in specs/collection-bounds-proposal.md and registered as schema_bounds_required_in_4_0. Not bounded: get_adcp_capabilities and its referenced types (#8198), inline property and collection lists, five nodes the SDK generators cannot carry a bound on, and seven 3.3 beta fields that the #8501 withdrawal PRs (#8765, #8762, #8758, #8767) remove. The script now compares with the highest 3.2.x release (3.2.8), the base lint-additive-minor uses. Build Check runs its --check-unreleased guard as npm run lint:schema-bounds, so every new 3.3 or experimental array or string arrives with a bound. The match_keys arrays #8446 added on product identity and TMP provider registration get maxItems 64, the cap media_buy.supported_match_keys already carries. The MCP parity compile limit moves from 1,384,000 to 1,386,000 bytes (the controller closure measures 1,385,040). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
58e0269 to
db09bd5
Compare
…nd update_media_buy (#8501) create_media_buy and update_media_buy are deprecated compatibility tasks, so 3.3 adds nothing to them. Six fields the 3.3 betas added to them are removed; the live tasks keep every one they also carry. - predecessor_media_buy_id, lineage_reason: off create_media_buy; stay on buy_products, accept_proposal and get_media_buys. - artifact_webhook.signing_profile: off create_media_buy; no live task has artifact_webhook, so it is signed with adcp/webhook-signing/v1. - start_requires_all_creatives_approved: off package-request, package-update and core/package.json; stays on control_media_buy and get_media_buys. - target_audiences: off package-request; with #8758 withdrawing the get_products copy, no 3.3 wire form remains. - trackers, landing_page_url: off core/creative-assignment.json; stay on sync_creatives assign, list_creatives and get_media_buys. - billing_measurement.counting_mechanisms: off core/measurement-terms.json (create, update and get_products); the canonical terms gain it in 4.0. The training agent ignores the withdrawn fields on create/update, as the versioning rules require for unknown fields, and no longer echoes them in create/update responses; get_media_buys still reads back what assign set. The 4.0 registry and the task references say where each field lives; the 3.3 release pages are left to #8883. Text that called the purchase, offer-filter or canonical measurement schemas closed now says what #8866 left: the first two are open but don't define the field, and the canonical terms are held closed with the commercial terms until 4.0. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rm remains (#8501) With filters.target_audiences withdrawn from get_products (#8758) and the package copy withdrawn from create_media_buy and update_media_buy, the experimental media_buy.audience_evidence_targets has no 3.3 wire form. - Delete core/audience-evidence-target.json and enums/audience-evidence-relationship.json and their index.json entries. The stable inline relationship enums on audience evidence stay. - Drop the feature from the changeset. Its experimental-status row went with the previous commit, and the 3.3 release pages are left to #8883. - Move the target-matching rules from get_products.mdx into the preserved 4.0 design under purchase_target_audiences_required_in_4_0, keeping a short withdrawal notice at the old anchor; the check keeps its id and its detection no longer keys off the retired feature id. - Retire tests/audience-evidence-targets.test.cjs (preserved at d9b5417) and stop reading the deleted package-forecast-input.json in tests/creative-start-policy.test.cjs. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated schema paths require human/CODEOWNERS approval, plus a breaking-class protocol withdrawal.
This PR touches the published protocol surface under static/schemas/source/** (the hard, path-based approval gate), and review_decision is REVIEW_REQUIRED — not APPROVED. Per decision-table row 2, the gate is not satisfied, so this cannot be approved or plain-commented. Independently, the change withdraws 3.3-beta additions (deletes price-adjustments.json, price-adjustments-mismatch.json, package-forecast-input.json and removes pricing-option/product rules), which is a Breaking-class protocol change — ratification is a human act and is never auto-approved unless review_decision is APPROVED.
Reviewer confirms schema↔docs coherence holds across all 62 files (no dangling $refs, clean oneof-baseline removal, consistent training-agent/compliance migration, withdrawals test present). No critical/high findings. One medium finding remains (a beta.4 vs beta.5 inconsistency in the migration doc) but it is not the driver here.
Escalation reasons
static/schemas/source/**is a gated path andreview_decisionisREVIEW_REQUIRED(notAPPROVED) — human/CODEOWNERS review required.- Deleted protocol schema files (
static/schemas/source/error-details/price-adjustments-mismatch.json,static/schemas/source/media-buy/package-forecast-input.json,static/schemas/source/pricing-options/price-adjustments.json) — deletions in a sensitive path. - Breaking-class protocol withdrawal — ratification requires human sign-off.
Medium findings
- docs/reference/migration/v4-compatibility.mdx:229 — states price_adjustments beta.4 twice; changeset, v4-compatibility.yaml, and pricing-models.mdx all say beta.5. Please reconcile.
Medium findings
- docs/reference/migration/v4-compatibility.mdx:229 — v4-compatibility.mdx says price_adjustments beta.4; changeset/registry/pricing-models say beta.5
Why human review
- static/schemas/source/** is a gated path and review_decision is REVIEW_REQUIRED (not APPROVED) — human/CODEOWNERS review required
- Deletes protocol schema files (price-adjustments-mismatch.json, package-forecast-input.json, price-adjustments.json) in static/schemas/source/** — deletion in sensitive path
- Breaking-class protocol withdrawal — ratification requires human sign-off; never auto-approved unless review_decision is APPROVED
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/execution-requirement-readiness.json (modified) matches
static/schemas/source/**; static/schemas/source/core/product-execution-readiness.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-execution-requirement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/targeting-overlay-support.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/error-details/price-adjustments-mismatch.json (deleted) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-rejected.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/list-products-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/list-products-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/package-forecast-input.json (delet
…(truncated)…
…nd update_media_buy (#8501) create_media_buy and update_media_buy are deprecated compatibility tasks, so 3.3 adds nothing to them. Six fields the 3.3 betas added to them are removed; the live tasks keep every one they also carry. - predecessor_media_buy_id, lineage_reason: off create_media_buy; stay on buy_products, accept_proposal and get_media_buys. - artifact_webhook.signing_profile: off create_media_buy; no live task has artifact_webhook, so it is signed with adcp/webhook-signing/v1. - start_requires_all_creatives_approved: off package-request, package-update and core/package.json; stays on control_media_buy and get_media_buys. - target_audiences: off package-request; with #8758 withdrawing the get_products copy, no 3.3 wire form remains. - trackers, landing_page_url: off core/creative-assignment.json; stay on sync_creatives assign, list_creatives and get_media_buys. - billing_measurement.counting_mechanisms: off core/measurement-terms.json (create, update and get_products); the canonical terms gain it in 4.0. The training agent ignores the withdrawn fields on create/update, as the versioning rules require for unknown fields, and no longer echoes them in create/update responses; get_media_buys still reads back what assign set. The 4.0 registry and the task references say where each field lives; the 3.3 release pages are left to #8883. Text that called the purchase, offer-filter or canonical measurement schemas closed now says what #8866 left: the first two are open but don't define the field, and the canonical terms are held closed with the commercial terms until 4.0. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rm remains (#8501) With filters.target_audiences withdrawn from get_products (#8758) and the package copy withdrawn from create_media_buy and update_media_buy, the experimental media_buy.audience_evidence_targets has no 3.3 wire form. - Delete core/audience-evidence-target.json and enums/audience-evidence-relationship.json and their index.json entries. The stable inline relationship enums on audience evidence stay. - Drop the feature from the changeset. Its experimental-status row went with the previous commit, and the 3.3 release pages are left to #8883. - Move the target-matching rules from get_products.mdx into the preserved 4.0 design under purchase_target_audiences_required_in_4_0, keeping a short withdrawal notice at the old anchor; the check keeps its id and its detection no longer keys off the retired feature id. - Retire tests/audience-evidence-targets.test.cjs (preserved at d9b5417) and stop reading the deleted package-forecast-input.json in tests/creative-start-policy.test.cjs. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated paths under static/schemas/source/** with no human/CODEOWNERS approval, plus a breaking-class protocol withdrawal and sensitive-path deletions.
This PR touches the published protocol surface (static/schemas/source/**) which is a hard, deterministic approval gate (gated_paths: true), and the current review_decision is REVIEW_REQUIRED, not APPROVED. Decision-table row 2 therefore forces escalate — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is. The prose hard gate on breaking-class changes applies the same posture.
Escalation reasons
static/schemas/source/**is a gated path andreview_decisionisREVIEW_REQUIRED(not APPROVED) — human/CODEOWNERS review required.- Deletes protocol schema files (
static/schemas/source/error-details/price-adjustments-mismatch.json,static/schemas/source/media-buy/package-forecast-input.json,static/schemas/source/pricing-options/price-adjustments.json) — deletions in a sensitive path (row 3). - Breaking-class protocol withdrawal (price_adjustments / deprecated field removal) — ratification is a human act; never auto-approved unless
review_decisionis APPROVED.
Net improvement since prior run: The sole prior Medium finding (v4-compatibility.mdx beta.4 vs beta.5 inconsistency) has been resolved — the doc now reads beta.5 consistently with the changeset, registry, and pricing-models. No new findings in the delta. The escalation persists solely on the deterministic gate and the sensitive deletions, not on any unresolved reviewer finding.
Why human review
- static/schemas/source/** is a gated path and review_decision is REVIEW_REQUIRED (not APPROVED) — human/CODEOWNERS review required
- Deletes protocol schema files (price-adjustments-mismatch.json, package-forecast-input.json, price-adjustments.json) in static/schemas/source/** — deletion in sensitive path
- Breaking-class protocol withdrawal — ratification requires human sign-off; never auto-approved unless review_decision is APPROVED
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/execution-requirement-readiness.json (modified) matches
static/schemas/source/**; static/schemas/source/core/product-execution-readiness.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-execution-requirement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/targeting-overlay-support.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/error-details/price-adjustments-mismatch.json (deleted) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-rejected.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/list-products-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/list-products-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/package-forecast-input.json (deleted) matchesstatic/schemas/source/**; static/schemas/source/media-buy/product-purchase.json (modified) matchesstatic/schemas/source/**; static/schemas/source/pricing-options/cpc-option.json (modified) matchesstatic/schemas/source/**; static/schemas/source/pricing-options/cpcv-option.json (modified) matchesstatic/schemas/source/**; static/schemas/source/pri
…(truncated)…
…ves assignments (#8501) 3.3 adds no field that exists only on a deprecated task. Withdraw from get_products: refine[].package (and package-forecast-input.json), refinement_applied[] result_product_id / resolved_start_time / resolved_end_time, filters.target_audiences, include_collections and collections, and experimental price_adjustments on pricing options (with price-adjustments.json, the mismatch error details, and the vectors). Move include_execution_readiness / execution_readiness to list_products. Withdraw landing_page_url and trackers from the deprecated sync_creatives assignments[] row; the assign operation keeps them. #8866 opened the assignments[] row and the refine[] product entry, so both now reject the withdrawn request fields by name (not: required), with a description sentence: the row rejects trackers and landing_page_url, and every refine[] scope rejects package. The schema and the training agent's INVALID_REQUEST agree. The response-side refinement_applied fields are just undefined. Updates the training agent, the execution readiness storyboard, the v4 registry (canonical_price_adjustments_required_in_4_0), the oneOf discriminator baseline, docs, and tests. #8866 already removed the additive-minor baseline rows, and the 3.3 release pages are left to #8883. counting_mechanisms is left to the create/update_media_buy PR, which removes it from the shared measurement-terms.json. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ckages (#8501) execution_readiness moved to list_products, whose next step is buy_products, but binding_field examples still taught the legacy create_media_buy paths, including packages[].catalogs[], which a purchase does not define. Teach purchases[].optimization_goals[].event_sources[].event_source_id and purchases[].catalog_ids[] in the spec, list_products docs, the readiness and requirement schemas, and the readiness fixtures; label the remaining packages[] paths as legacy. The readiness text no longer claims buy_products rejects unmet purchases: only create_media_buy's rule is specified, and the purchase-side rule stays with adcp#7763. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The canonical_price_adjustments_required_in_4_0 section of the 4.0 page still said the table shipped in 3.3.0-beta.1 through beta.4 and that the beta.1 to beta.4 bundles keep the schemas. beta.5 shipped with it too, and the changeset, the registry entry and pricing-models.mdx already say so. The section now also says canonical-pricing-option.json is held closed with the commercial terms until 4.0, matching the registry entry, rather than "closed in 3.x". Found by the Ladon review. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8ff88b1 to
d2d905a
Compare
…nd update_media_buy (#8501) create_media_buy and update_media_buy are deprecated compatibility tasks, so 3.3 adds nothing to them. Six fields the 3.3 betas added to them are removed; the live tasks keep every one they also carry. - predecessor_media_buy_id, lineage_reason: off create_media_buy; stay on buy_products, accept_proposal and get_media_buys. - artifact_webhook.signing_profile: off create_media_buy; no live task has artifact_webhook, so it is signed with adcp/webhook-signing/v1. - start_requires_all_creatives_approved: off package-request, package-update and core/package.json; stays on control_media_buy and get_media_buys. - target_audiences: off package-request; with #8758 withdrawing the get_products copy, no 3.3 wire form remains. - trackers, landing_page_url: off core/creative-assignment.json; stay on sync_creatives assign, list_creatives and get_media_buys. - billing_measurement.counting_mechanisms: off core/measurement-terms.json (create, update and get_products); the canonical terms gain it in 4.0. The training agent ignores the withdrawn fields on create/update, as the versioning rules require for unknown fields, and no longer echoes them in create/update responses; get_media_buys still reads back what assign set. The 4.0 registry and the task references say where each field lives; the 3.3 release pages are left to #8883. Text that called the purchase, offer-filter or canonical measurement schemas closed now says what #8866 left: the first two are open but don't define the field, and the canonical terms are held closed with the commercial terms until 4.0. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rm remains (#8501) With filters.target_audiences withdrawn from get_products (#8758) and the package copy withdrawn from create_media_buy and update_media_buy, the experimental media_buy.audience_evidence_targets has no 3.3 wire form. - Delete core/audience-evidence-target.json and enums/audience-evidence-relationship.json and their index.json entries. The stable inline relationship enums on audience evidence stay. - Drop the feature from the changeset. Its experimental-status row went with the previous commit, and the 3.3 release pages are left to #8883. - Move the target-matching rules from get_products.mdx into the preserved 4.0 design under purchase_target_audiences_required_in_4_0, keeping a short withdrawal notice at the old anchor; the check keeps its id and its detection no longer keys off the retired feature id. - Retire tests/audience-evidence-targets.test.cjs (preserved at d9b5417) and stop reading the deleted package-forecast-input.json in tests/creative-start-policy.test.cjs. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated-path hard gate unsatisfied + breaking-class protocol withdrawal + sensitive-path deletions.
No blocking (critical/high) or medium findings were raised by the reviewer — the diff is mechanically clean: schema↔docs coherence verified, no dangling $ref after the three schema deletions, oneOf baseline entries match deleted files, dist/** untouched, and the minor changeset is appropriate for a pre-GA beta-to-beta withdrawal.
However, this PR cannot auto-approve for deterministic + governance reasons:
Escalation reasons
static/schemas/source/**is a gated path (row 2) andreview_decisionisREVIEW_REQUIRED, notAPPROVED— the hard, non-overridable approval gate requires a human/CODEOWNERS approval. Affected files includestatic/schemas/source/core/product.json, the media-buy get/list-products schemas, all pricing-options, and others.- Deletes protocol schema files in a sensitive path —
static/schemas/source/error-details/price-adjustments-mismatch.json,static/schemas/source/media-buy/package-forecast-input.json, andstatic/schemas/source/pricing-options/price-adjustments.json(row 3,(deleted)in high-risk reasons). Deletions instatic/schemas/source/**merit human review. - Breaking-class protocol withdrawal (removal of published experimental fields/schemas) — per the repo's hard gate, ratification is a human act and is never auto-approved unless
review_decisionisAPPROVED.
This mirrors the prior escalate decision; the gate remains unsatisfied (review_decision still REVIEW_REQUIRED). Once a human/CODEOWNERS approval is recorded, this clean diff can fall through to approval.
Why human review
- static/schemas/source/** is a gated path and review_decision is REVIEW_REQUIRED (not APPROVED) — human/CODEOWNERS review required before merge
- Deletes protocol schema files (price-adjustments-mismatch.json, package-forecast-input.json, price-adjustments.json) under static/schemas/source/** — deletion in sensitive path
- Breaking-class protocol withdrawal of published experimental surfaces — ratification requires human sign-off; never auto-approved unless review_decision is APPROVED
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/execution-requirement-readiness.json (modified) matches
static/schemas/source/**; static/schemas/source/core/product-execution-readiness.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-execution-requirement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/targeting-overlay-support.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/error-details/price-adjustments-mismatch.json (deleted) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-rejected.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/list-products-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/list-products-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/package-forecast-input.json (deleted) matchesstatic/schemas/source/**; static/schemas/source/media-buy/product-purchase.json (modified) matchesstatic/schemas/source/**; static/schemas/source/pricing-options/cpc-option.json (modified) matchesstatic/schemas/source/**; static/schemas/sour
…(truncated)…
…nd update_media_buy (#8501) create_media_buy and update_media_buy are deprecated compatibility tasks, so 3.3 adds nothing to them. Six fields the 3.3 betas added to them are removed; the live tasks keep every one they also carry. - predecessor_media_buy_id, lineage_reason: off create_media_buy; stay on buy_products, accept_proposal and get_media_buys. - artifact_webhook.signing_profile: off create_media_buy; no live task has artifact_webhook, so it is signed with adcp/webhook-signing/v1. - start_requires_all_creatives_approved: off package-request, package-update and core/package.json; stays on control_media_buy and get_media_buys. - target_audiences: off package-request; with #8758 withdrawing the get_products copy, no 3.3 wire form remains. - trackers, landing_page_url: off core/creative-assignment.json; stay on sync_creatives assign, list_creatives and get_media_buys. - billing_measurement.counting_mechanisms: off core/measurement-terms.json (create, update and get_products); the canonical terms gain it in 4.0. The training agent ignores the withdrawn fields on create/update, as the versioning rules require for unknown fields, and no longer echoes them in create/update responses; get_media_buys still reads back what assign set. The 4.0 registry and the task references say where each field lives; the 3.3 release pages are left to #8883. Text that called the purchase, offer-filter or canonical measurement schemas closed now says what #8866 left: the first two are open but don't define the field, and the canonical terms are held closed with the commercial terms until 4.0. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rm remains (#8501) With filters.target_audiences withdrawn from get_products (#8758) and the package copy withdrawn from create_media_buy and update_media_buy, the experimental media_buy.audience_evidence_targets has no 3.3 wire form. - Delete core/audience-evidence-target.json and enums/audience-evidence-relationship.json and their index.json entries. The stable inline relationship enums on audience evidence stay. - Drop the feature from the changeset. Its experimental-status row went with the previous commit, and the 3.3 release pages are left to #8883. - Move the target-matching rules from get_products.mdx into the preserved 4.0 design under purchase_target_audiences_required_in_4_0, keeping a short withdrawal notice at the old anchor; the check keeps its id and its detection no longer keys off the retired feature id. - Retire tests/audience-evidence-targets.test.cjs (preserved at d9b5417) and stop reading the deleted package-forecast-input.json in tests/creative-start-policy.test.cjs. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#8758 merged: the get_products and sync_creatives assignments[] withdrawals and the execution_readiness move to list_products are in main. Drop it from the dependency markers, remove the #7659 note's marker, move it to merged in the in-review table, and say that the deprecated assignments[] row rejects trackers and landing_page_url by name, so a stale sender is rejected there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ge section Its last line named a "Withdrawn from the deprecated tasks" section that #8758 dropped in favor of the migration guide's closed-schema triage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd update_media_buy (#8501) (#8767) * fix(schema): keep 3.3 additions off the deprecated create_media_buy and update_media_buy (#8501) create_media_buy and update_media_buy are deprecated compatibility tasks, so 3.3 adds nothing to them. Six fields the 3.3 betas added to them are removed; the live tasks keep every one they also carry. - predecessor_media_buy_id, lineage_reason: off create_media_buy; stay on buy_products, accept_proposal and get_media_buys. - artifact_webhook.signing_profile: off create_media_buy; no live task has artifact_webhook, so it is signed with adcp/webhook-signing/v1. - start_requires_all_creatives_approved: off package-request, package-update and core/package.json; stays on control_media_buy and get_media_buys. - target_audiences: off package-request; with #8758 withdrawing the get_products copy, no 3.3 wire form remains. - trackers, landing_page_url: off core/creative-assignment.json; stay on sync_creatives assign, list_creatives and get_media_buys. - billing_measurement.counting_mechanisms: off core/measurement-terms.json (create, update and get_products); the canonical terms gain it in 4.0. The training agent ignores the withdrawn fields on create/update, as the versioning rules require for unknown fields, and no longer echoes them in create/update responses; get_media_buys still reads back what assign set. The 4.0 registry and the task references say where each field lives; the 3.3 release pages are left to #8883. Text that called the purchase, offer-filter or canonical measurement schemas closed now says what #8866 left: the first two are open but don't define the field, and the canonical terms are held closed with the commercial terms until 4.0. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(schema): retire audience evidence targets now that no 3.3 wire form remains (#8501) With filters.target_audiences withdrawn from get_products (#8758) and the package copy withdrawn from create_media_buy and update_media_buy, the experimental media_buy.audience_evidence_targets has no 3.3 wire form. - Delete core/audience-evidence-target.json and enums/audience-evidence-relationship.json and their index.json entries. The stable inline relationship enums on audience evidence stay. - Drop the feature from the changeset. Its experimental-status row went with the previous commit, and the 3.3 release pages are left to #8883. - Move the target-matching rules from get_products.mdx into the preserved 4.0 design under purchase_target_audiences_required_in_4_0, keeping a short withdrawal notice at the old anchor; the check keeps its id and its detection no longer keys off the retired feature id. - Retire tests/audience-evidence-targets.test.cjs (preserved at d9b5417) and stop reading the deleted package-forecast-input.json in tests/creative-start-policy.test.cjs. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(schema): leave the 3.3 release pages to #8883 The release notes, What's new, the 3.2 to 3.3 migration guide and the 3.3 beta page belong to #8883. This PR no longer edits them, so its test stops asserting their "Withdrawn from the deprecated tasks" heading. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
#8758 merged: the get_products and sync_creatives assignments[] withdrawals and the execution_readiness move to list_products are in main. Drop it from the dependency markers, remove the #7659 note's marker, move it to merged in the in-review table, and say that the deprecated assignments[] row rejects trackers and landing_page_url by name, so a stale sender is rejected there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ge section Its last line named a "Withdrawn from the deprecated tasks" section that #8758 dropped in favor of the migration guide's closed-schema triage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… surfaces #8758 and #8767 merged and handed their release-doc text to #8883. Drop #8767 from the dependency markers, and bring the lines that still described withdrawn surfaces as current in line with main: - media_buy.price_adjustments and media_buy.audience_evidence_targets are withdrawn at rc.0 and no longer registered (experimental table, feature index, What's new, migration guide). - execution_readiness is on list_products; lineage is on buy_products and accept_proposal; collection cards leave get_products; the creative start gate is set through control_media_buy; counting_mechanisms leaves measurement_terms; assignment trackers and landing pages stay only on sync_creatives assign operations. - Point the price-adjustment and target-audience links at the withdrawn sections; refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #8501. This PR covers entries 20–25 of the disposition table and the
get_productsrows of the "Deprecated-task fields outside the 26" table.3.3 adds no field that exists only on a deprecated task. Every field below shipped in a 3.3 beta (through
3.3.0-beta.5), so this is a beta-to-beta change and breaks no stable release.Rebased onto
mainafter #8866#8866 opened most of the rows this PR edits. Three changes follow, per the #8501 re-triage and the release coordinator's rulings:
scripts/lint-additive-minor-baseline.json, so this PR no longer touches it.sync_creativesassignments[]row is open now. It getsnot: { anyOf: [{ required: ["trackers"] }, { required: ["landing_page_url"] }] }and a description sentence, matchingunassign,replaceandmerge. The schema and the training agent'sINVALID_REQUESTagree.get_productsrefine[]product entry is open now too. It getsnot: { required: ["package"] }, so every scope rejectspackage(fix(schemas): open the 3.3 schemas that were meant to be open #8866 already named it on the request and proposal scopes), and the union description says why. This keeps the training agent's "reject what a facade can't honor" rule true.refinement_applied[]fields are just undefined: readers ignore unknown fields.3-3-beta.mdx, the 3.2→3.3 migration guide,release-notes.mdxorwhats-new-in-3-3.mdx.Text this PR adds now says
3.3.0-beta.5where it said beta.4. Where it said a schema was closed, it now says what #8866 left: the purchase input and offer filters are open but don't definetarget_audiences, andcanonical-pricing-option.jsonandproduct-purchase.jsonare held closed with the commercial terms until 4.0.Field → disposition
sync_creativesassignments[]landing_page_urlassignoperation keeps it (entries 18–19 untouched).sync_creativesassignments[]trackersget_productsrefine[].packagebuying_mode/finalize rule, and rejected by name on every scope.media-buy/package-forecast-input.jsonis deleted because nothing else references it.refinement_applied[].result_product_idappliedrule.refinement_applied[].resolved_start_timerefinement_applied[].resolved_end_timeget_productsfilters.target_audiencescore/product-filters.json. The existingpurchase_target_audiences_required_in_4_0check now records the withdrawal. It is not added tolist_productsoffer_filtersin 3.3.get_productsinclude_collections/collectionsget-products-rejected.jsonbranch, and dropped from thewholesale_feed_versionscope.list_products,request_proposalsandrefine_proposalskeep them.get_productsinclude_execution_readiness/execution_readinesslist_productsrequest and response. The map is absent onunchanged; the storyboard now driveslist_products.price_adjustmentsonget_productspricing options (experimental)pricing-options/price-adjustments.json,error-details/price-adjustments-mismatch.json, the productallOfrule, theproduct-purchase.jsonverifier constraint, and the vectors and their test. New registry check:canonical_price_adjustments_required_in_4_0.counting_mechanisms(experimental)core/measurement-terms.json, which #8767 removes.Not touched:
metric_id(entry 6),available_installment_statuses, entries 1 and 11–12, and the create/update rows.Also updated
get_productsignoresinclude_collections: nocollectionsarray and no cards-scoped feed token. It still projectssample_content.include_collectionsfromget_productsat every version.sync_creativesrejectstrackers/landing_page_urlon a legacyassignments[]row withINVALID_REQUEST, as the schema now does by name.refine[]entry withpackagefails source validation.scripts/oneof-discriminators.baseline.jsondrops the threeprice-adjustmentsrows.canonical_price_adjustments_required_in_4_0, with its design and the preserving commit4c35f8ce1.purchase_target_audiences_required_in_4_0text.package-forecast-input.jsonformat_idssite.get_products,list_products(new per-account readiness section),specification,refinement,sync_creatives,pricing-models,collections-and-installments,media-products,targeting,broadcast,error-handling,experimental-status, and the test-vectors index. The target-audience matching rules stay onget_products.mdx, under the withdrawn heading with an explicittarget-audiences-experimentalanchor, until fix(schema): keep 3.3 additions off the deprecated create_media_buy and update_media_buy (#8501) #8767 moves them into the 4.0 design.minor. It lists every withdrawn or moved field, followingwithdraw-commercial-terms-features-to-4-0.md.For reviewers
list_productspushed the compact-discoverytools/listinput schemas over the 162 KiB budget. I kept the budget and shortened the flag's description instead, dropping"default": false; the docs say "absent meansfalse".product-discovery-schema-paritypasses on the rebased tree.Open WG question
Where does the exact-package forecast (#8468) live? This PR removes it from
get_productsand does not invent a new home. Konstantin flagged it as the one field he couldn't place. Wherever it lands has to carry the goal, because #8448 says "A guaranteed forecast depends on the goal". The design is preserved at163ba7e7e9(#8468).Tests
On the rebased tree (
main2dc672e316+67bb4b87dc+db09bd59e8), run sequentially. A third commit,8ff88b15f0, fixes the beta range in the 4.0 page'sprice_adjustmentssection. The Ladon review found it. That commit passes the registry tests, the docs validation and the hand-run hook steps (test:unitincluded).Refreshed after #8762 and #8957 merged. The three commits are rebased onto
main7dd93fe024, with no conflicts:315c288c1f,9b3369f375andd2d905a547. On the stacked #8767 tree (a superset of this one),build:schemas,lint:additive-minor(2 recorded, 0 new),test:mcp-schema-projection41/41 (the controller stays under the 1,388,000 bound),capabilities-structural-bounds25/25 and the withdrawal, installment and service-commitment suites (50/50) pass. CI is the gate for the rest.npm run build:schemas: pass.npm run test:schemas: 1181/1181, plus premium-display 10/10 and geo-region 6/6. That includestests/get-products-deprecated-withdrawals.test.cjswith the new "refine[].package is rejected by name on every scope" test (one accept and one reject probe), andassignment-trackersandassignment-landing-page, which now probe the row's named rejection and that the row accepts an unrelated key.npm run test:mcp-schema-projection41/41,npm run test:examples,npm run test:contracts464/464,npm run test:audience-evidence40/40,npm run test:v4-compatibility-registry19/19: pass.npm run lint:additive-minor(4 recorded, 0 new),test:additive-minor,scripts/lint-v4-compatibility-registry.cjs,scripts/audit-oneof.mjs --check,npm run build:compliance -- --check(1882 references current), and the changeset scope check: pass.assignment-operations19/19,training-agent-collections10/10,served-release-shape11/11,product-discovery-schema-parity4/4.training-agent-served-release-fields(a 10s hook) and onetenant-smokecase (15s). Both fail identically onmain's server code, on the fix(schema): keep sla-window at its 3.2 shape; business time moves to the creative review SLA (#8501 entries 11, 12) #8762 tree at the same load, so they are environmental.ADCP_SKIP_STORYBOARD_MATRIX=1for load, as the playbook allows. CI'straining-agent-storyboardsjob is the gate.Local hook
Both rebased commits were made with
HUSKY=0, with the release coordinator's approval. The hook's server-unit stage (precommit:server-unit) times out at this load (1500s budget, no assertion failures in the earlier #8762 run), so it was skipped for load. CI is the gate.I ran the other hook steps by hand on the final tree. The dynamic-import, format-identity and callApi guards,
npm run typecheckand the image check pass.npm run test:unithad 6 timeout failures in 3 files this PR doesn't touch (addie/billing-tools,billing/organization-db,billing/stripe-client), and those 3 files pass 141/141 on their own.SDK generation: the SDK repos may need a regen for the removed and moved types (
PackageForecastInput,PriceAdjustments, theget_productsreadiness and collections fields, and thelist_productsreadiness fields). Not fixed here.🤖 Generated with Claude Code