Skip to content

fix(schema): withdraw 3.3 additions from get_products and sync_creatives assignments (#8501) - #8758

Merged
bokelley merged 3 commits into
mainfrom
fix/8501-get-products-sync-creatives-withdrawals
Nov 12, 2026
Merged

bokelley merged 3 commits into
mainfrom
fix/8501-get-products-sync-creatives-withdrawals

Conversation

@bokelley

@bokelley bokelley commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Refs #8501. This PR covers entries 20–25 of the disposition table and the get_products rows of the "Deprecated-task fields outside the 26" table.

Merge only after the consent window closes (Fri 2026-11-13), before the 3.3 RC. static/schemas/source/** is Ladon-gated, so a human merges it. Merge order: this PR first, then #8767, which is stacked on it. #8762 covers entries 11 and 12.

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 main after #8866

#8866 opened most of the rows this PR edits. Three changes follow, per the #8501 re-triage and the release coordinator's rulings:

  1. No baseline hunk. fix(schemas): open the 3.3 schemas that were meant to be open #8866 already removed the entry 20–25 rows from scripts/lint-additive-minor-baseline.json, so this PR no longer touches it.
  2. The withdrawn request fields are rejected by name, not by closure.
    • The deprecated sync_creatives assignments[] row is open now. It gets not: { anyOf: [{ required: ["trackers"] }, { required: ["landing_page_url"] }] } and a description sentence, matching unassign, replace and merge. The schema and the training agent's INVALID_REQUEST agree.
    • The get_products refine[] product entry is open now too. It gets not: { required: ["package"] }, so every scope rejects package (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.
    • The response-side refinement_applied[] fields are just undefined: readers ignore unknown fields.
  3. Release docs belong to docs(reference): bring the 3.3 release docs to 3.3.0-rc.0 #8883. This PR no longer edits 3-3-beta.mdx, the 3.2→3.3 migration guide, release-notes.mdx or whats-new-in-3-3.mdx.

Text this PR adds now says 3.3.0-beta.5 where 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 define target_audiences, and canonical-pricing-option.json and product-purchase.json are held closed with the commercial terms until 4.0.

Field → disposition

# / row Field Disposition What this PR does
20 sync_creatives assignments[] landing_page_url Withdraw Removed from the deprecated row, which rejects it by name. The assign operation keeps it (entries 18–19 untouched).
21 sync_creatives assignments[] trackers Withdraw Same as 20.
22 get_products refine[].package Withdraw Removed, along with its buying_mode/finalize rule, and rejected by name on every scope. media-buy/package-forecast-input.json is deleted because nothing else references it.
23 refinement_applied[].result_product_id Withdraw with 22 Removed, along with the applied rule.
24 refinement_applied[].resolved_start_time Withdraw with 22 Removed.
25 refinement_applied[].resolved_end_time Withdraw with 22 Removed.
row get_products filters.target_audiences Withdraw, 4.0 list Removed from core/product-filters.json. The existing purchase_target_audiences_required_in_4_0 check now records the withdrawal. It is not added to list_products offer_filters in 3.3.
row get_products include_collections / collections Withdraw Removed from the request, the response and the get-products-rejected.json branch, and dropped from the wholesale_feed_version scope. list_products, request_proposals and refine_proposals keep them.
row get_products include_execution_readiness / execution_readiness Move Moved onto the open list_products request and response. The map is absent on unchanged; the storyboard now drives list_products.
row price_adjustments on get_products pricing options (experimental) Withdraw, 4.0 list Removed from the 7 fixed-price options. Also removed: pricing-options/price-adjustments.json, error-details/price-adjustments-mismatch.json, the product allOf rule, the product-purchase.json verifier constraint, and the vectors and their test. New registry check: canonical_price_adjustments_required_in_4_0.
row counting_mechanisms (experimental) Withdraw Not in this PR. It is one property on the shared 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

  • Training agent:
    • get_products ignores include_collections: no collections array and no cards-scoped feed token. It still projects sample_content.
    • The tenant tool listing drops include_collections from get_products at every version.
    • sync_creatives rejects trackers/landing_page_url on a legacy assignments[] row with INVALID_REQUEST, as the schema now does by name.
    • The unsupported-package-forecast path is removed. A refine[] entry with package fails source validation.
  • Baselines: scripts/oneof-discriminators.baseline.json drops the three price-adjustments rows.
  • v4 registry and guide:
    • Adds canonical_price_adjustments_required_in_4_0, with its design and the preserving commit 4c35f8ce1.
    • Updates the purchase_target_audiences_required_in_4_0 text.
    • Removes the package-forecast-input.json format_ids site.
  • Docs: 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 on get_products.mdx, under the withdrawn heading with an explicit target-audiences-experimental anchor, 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.
  • Changeset: minor. It lists every withdrawn or moved field, following withdraw-commercial-terms-features-to-4-0.md.

For reviewers

  • Discovery budget. Moving readiness onto list_products pushed the compact-discovery tools/list input schemas over the 162 KiB budget. I kept the budget and shortened the flag's description instead, dropping "default": false; the docs say "absent means false". product-discovery-schema-parity passes on the rebased tree.

Open WG question

Where does the exact-package forecast (#8468) live? This PR removes it from get_products and 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 at 163ba7e7e9 (#8468).

Tests

On the rebased tree (main 2dc672e316 + 67bb4b87dc + db09bd59e8), run sequentially. A third commit, 8ff88b15f0, fixes the beta range in the 4.0 page's price_adjustments section. The Ladon review found it. That commit passes the registry tests, the docs validation and the hand-run hook steps (test:unit included).

Refreshed after #8762 and #8957 merged. The three commits are rebased onto main 7dd93fe024, with no conflicts: 315c288c1f, 9b3369f375 and d2d905a547. On the stacked #8767 tree (a superset of this one), build:schemas, lint:additive-minor (2 recorded, 0 new), test:mcp-schema-projection 41/41 (the controller stays under the 1,388,000 bound), capabilities-structural-bounds 25/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 includes tests/get-products-deprecated-withdrawals.test.cjs with the new "refine[].package is rejected by name on every scope" test (one accept and one reject probe), and assignment-trackers and assignment-landing-page, which now probe the row's named rejection and that the row accepts an unrelated key.
  • npm run test:mcp-schema-projection 41/41, npm run test:examples, npm run test:contracts 464/464, npm run test:audience-evidence 40/40, npm run test:v4-compatibility-registry 19/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.
  • Server vitest, the files this PR touches: assignment-operations 19/19, training-agent-collections 10/10, served-release-shape 11/11, product-discovery-schema-parity 4/4.
  • Pre-push: version sync, changeset policy and docs validation (58/58) pass. The local storyboard matrix was skipped with ADCP_SKIP_STORYBOARD_MATRIX=1 for load, as the playbook allows. CI's training-agent-storyboards job 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 typecheck and the image check pass. npm run test:unit had 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, the get_products readiness and collections fields, and the list_products readiness fields). Not fixed here.

🤖 Generated with Claude Code

bokelley added a commit that referenced this pull request Nov 6, 2026
…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>
bokelley added a commit that referenced this pull request Nov 7, 2026
…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>
bokelley added a commit that referenced this pull request Nov 7, 2026
…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>
bokelley added a commit that referenced this pull request Nov 8, 2026
…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>
bokelley added a commit that referenced this pull request Nov 8, 2026
…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>
bokelley added a commit that referenced this pull request Nov 8, 2026
…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>
@bokelley
bokelley force-pushed the fix/8501-get-products-sync-creatives-withdrawals branch from 58e0269 to db09bd5 Compare November 12, 2026 16:42
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>
@bokelley
bokelley marked this pull request as ready for review November 12, 2026 17:04

@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 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 and review_decision is REVIEW_REQUIRED (not APPROVED) — 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) matches static/schemas/source/**; static/schemas/source/core/product-execution-requirement.json (modified) matches static/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matches static/schemas/source/**; static/schemas/source/core/product.json (modified) matches static/schemas/source/**; static/schemas/source/core/targeting-overlay-support.json (modified) matches static/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matches static/schemas/source/**; static/schemas/source/error-details/price-adjustments-mismatch.json (deleted) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-rejected.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/list-products-request.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/list-products-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/package-forecast-input.json (delet

…(truncated)…

@aao-secretariat aao-secretariat Bot added the ladon/needs-human-review Ladon has escalated this PR for human review. label Nov 12, 2026
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>

@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 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 and review_decision is REVIEW_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_decision is 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) matches static/schemas/source/**; static/schemas/source/core/product-execution-requirement.json (modified) matches static/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matches static/schemas/source/**; static/schemas/source/core/product.json (modified) matches static/schemas/source/**; static/schemas/source/core/targeting-overlay-support.json (modified) matches static/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matches static/schemas/source/**; static/schemas/source/error-details/price-adjustments-mismatch.json (deleted) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-rejected.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/list-products-request.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/list-products-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/package-forecast-input.json (deleted) matches static/schemas/source/**; static/schemas/source/media-buy/product-purchase.json (modified) matches static/schemas/source/**; static/schemas/source/pricing-options/cpc-option.json (modified) matches static/schemas/source/**; static/schemas/source/pricing-options/cpcv-option.json (modified) matches static/schemas/source/**; static/schemas/source/pri

…(truncated)…

bokelley and others added 3 commits November 12, 2026 19:05
…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>
@bokelley
bokelley force-pushed the fix/8501-get-products-sync-creatives-withdrawals branch from 8ff88b1 to d2d905a Compare November 12, 2026 19:07
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>

@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 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) and review_decision is REVIEW_REQUIRED, not APPROVED — the hard, non-overridable approval gate requires a human/CODEOWNERS approval. Affected files include static/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, and static/schemas/source/pricing-options/price-adjustments.json (row 3, (deleted) in high-risk reasons). Deletions in static/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_decision is APPROVED.

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) matches static/schemas/source/**; static/schemas/source/core/product-execution-requirement.json (modified) matches static/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matches static/schemas/source/**; static/schemas/source/core/product.json (modified) matches static/schemas/source/**; static/schemas/source/core/targeting-overlay-support.json (modified) matches static/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matches static/schemas/source/**; static/schemas/source/error-details/price-adjustments-mismatch.json (deleted) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-rejected.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/list-products-request.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/list-products-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/package-forecast-input.json (deleted) matches static/schemas/source/**; static/schemas/source/media-buy/product-purchase.json (modified) matches static/schemas/source/**; static/schemas/source/pricing-options/cpc-option.json (modified) matches static/schemas/source/**; static/schemas/sour

…(truncated)…

@bokelley
bokelley merged commit 18da1a4 into main Nov 12, 2026
68 checks passed
@bokelley
bokelley deleted the fix/8501-get-products-sync-creatives-withdrawals branch November 12, 2026 19:59
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>
bokelley added a commit that referenced this pull request Nov 12, 2026
#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>
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>
bokelley added a commit that referenced this pull request Nov 12, 2026
#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>
bokelley added a commit that referenced this pull request Nov 12, 2026
…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>
bokelley added a commit that referenced this pull request Nov 12, 2026
… 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>
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.

1 participant