Skip to content

fix(compliance): restore available actions patch changeset - #5906

Merged
bokelley merged 1 commit into
mainfrom
fix-available-actions-changeset
Jul 20, 2026
Merged

fix(compliance): restore available actions patch changeset#5906
bokelley merged 1 commit into
mainfrom
fix-available-actions-changeset

Conversation

@bokelley

Copy link
Copy Markdown
Contributor

Summary

#5731 correctly fixed the false compliance failure, but its changeset frontmatter remained empty. Empty padding changesets are disallowed by the repository playbook and would omit the fix from the next protocol patch release; this follow-up repairs that release metadata immediately.

Validation

@bokelley
bokelley enabled auto-merge (squash) July 18, 2026 19:56

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

Argus is not auto-reviewing this PR because it modifies protected paths that require human review (.changeset/available-actions-non-guaranteed.md). A human reviewer should review and merge this PR; Argus will resume on subsequent PRs once these changes land on main.

@bokelley
bokelley merged commit 2f4a5a3 into main Jul 20, 2026
27 checks passed
@bokelley
bokelley deleted the fix-available-actions-changeset branch July 20, 2026 10:37
bokelley added a commit that referenced this pull request Jul 24, 2026
* fix(creative): clarify preflight dry-run validation (#5791)

* Clarify creative preflight semantics

* chore: refresh PR checks

* docs(get_media_buy_delivery): correct misleading "Buyer Reference Query" example (#5807)

Fix a misleading get_media_buy_delivery example that implied buyers can look up delivery by their own reference. media_buy_ids are seller-assigned, so the example now uses seller-assigned mb_... IDs and points buyers to reconcile their own reference through opaque context echoed by create_media_buy / get_media_buys.

* docs(compliance): document branch-set any_of peer cascade exemption (#5783)

Adds `branch_set_cascade_exemption` to `cascade_rules` in
runner-output-contract.yaml (parallel to `sole_stateful_step_exemption`):
a stateful peer's genuine failure or `peer_branch_taken` skip MUST NOT
cascade `prerequisite_failed` onto a sibling phase sharing the same
`branch_set.id` under `any_of` semantics. Branch-set peers are
mutually-exclusive alternatives, not a dependency chain. Scoped to
`any_of`, N-ary-safe, cross-set and within-phase cascade unchanged, and
explicitly `depends_on`-agnostic (fires whether the sibling's dependency
is the implicit default or an explicit depends_on naming the peer).

`default_cascade` gains a pointer to the new exemption; storyboard-
schema.yaml's `depends_on` section gains a cross-reference.

Documents-only: codifies the runner behavior shipped in adcp-client#2306
(closing adcp-client#2305), root-caused in #5337. No schema or wire change.

Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* compliance(media-buy): available_actions uses a non-guaranteed fixture (runnable by sales-non-guaranteed-only sellers) (#5731)

The available_actions scenario seeded a guaranteed-only product fixture, so its
create_buy_from_product step failed with a terminal DELIVERY_MODE_NOT_SUPPORTED
for sellers declaring only specialisms: ["sales-non-guaranteed"], cascading the
whole available-actions enforcement flow (read_persisted_buy_actions +
enforce_available_actions all prerequisite_failed).

The allowed_actions behavior this scenario grades is delivery-type-agnostic, so
the fixture switches to non_guaranteed (fixed_price → floor_price). Same fix as
the base media_buy_seller flow; the create steps reference the product/pricing by
id, unchanged.

The packaged dist/compliance/ cache is generated from this source.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* chore(changeset): mark available actions fix as patch (#5906)

* fix(compliance): correct creative storyboard capability assertions (#5847)

- canonical_supported_formats: change hardcoded field_value for
  capability_id ("training_image_generation") to field_present, since
  capability_id is agent-local; remove field_absent on supported_formats[1]
  which incorrectly capped to a single advertised format; rename key: to
  name: in context_outputs per storyboard schema. Bump to 1.0.1.

- evaluator_auth: add requires_capability guards to all six optional
  phases so agents declaring creative.supports_evaluator: false receive
  not_applicable instead of false failures; guards evaluate against the
  raw capabilities response, bypassing a runner-side boolean-false context
  accumulator bug (adcp-client); rename key: to name: in context_outputs.
  Bump to 1.0.1.

Closes #5843. Refs #5844 (runner fix in adcp-client still required;
storyboard fix stops the false failures).


Claude-Session: https://claude.ai/code/session_011iWNWasRVCisU8sMy688Qx

Co-authored-by: Claude <noreply@anthropic.com>

* fix(compliance): correct privacy and inventory guidance (#5904)

* fix(release): preserve schema release status (#5913)

* fix(docs): replace phantom creative and governance error codes with canonical enum members (#5819)

sync_creatives, build_creative, the creative specification, check_governance,
and sync_plans documented 13 errors[].code values that do not exist in
enums/error-code.json. Remap each to the existing code with matching
semantics (UNSUPPORTED_FEATURE, VALIDATION_ERROR, CREATIVE_REJECTED,
INVALID_STATE, INVALID_REQUEST, PERMISSION_DENIED); replace GENERATION_FAILED
with task-failure guidance per the open-vocabulary rule. Also fix the one
live INVALID_FORMAT emission in the training-agent reference implementation.
Same failure mode as #4852 / #5307.

* docs: add creative agent setup verification (#5881)

Co-authored-by: Brian O'Kelley <bokelley@scope3.com>

* docs(media-buy): add Budget & Pacing Controls reference to create_media_buy (#5984)

Enumerates every budget-constraint field (total_budget, package budget,
impressions, pacing, bid_price, flight window) in one place, documents the
three pacing modes, and marks the missing daily-cap field as a known gap
with the pacing-based workaround. Cross-links from update_media_buy.

Closes #4429

* fix(schema): require cancellation_fee rate/amount by fee type (#5987)

cancellation-policy.json documents cancellation_fee.rate as "Required when
type is 'percent_remaining'" and .amount as "Required when type is
'fixed_fee'" — restated in the pricing-models reference — but cancellation_fee
listed only ["type"] in required[]. A validator accepted a percent_remaining
or fixed_fee cancellation term with no fee value, leaving the cancellation
cost undefined for a buyer accepting the product's terms.

Adds if/then conditionals enforcing the documented contract; full_commitment
and none are unaffected. No prose change. Regression coverage added.

Closes #5986

* fix: align retry_after with the canonical error shape (#5954)

* fix(ci): preserve forward-merge branches when opening PRs (#5978)

* docs: expand AgenticAdvertising.org name in backports

---------

Co-authored-by: Steven Liss <stevenliss45@gmail.com>
Co-authored-by: fgranata <220887501+fgranata@users.noreply.github.com>
Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Aleksander Sekowski <aleksander@uixlimited.com>
Co-authored-by: Bill Jung <56685007+sangilish@users.noreply.github.com>
Co-authored-by: Garvit kaushik <77023388+garvitkaushik-123@users.noreply.github.com>
bokelley added a commit that referenced this pull request Jul 24, 2026
* fix(delivery-metrics): allow null for video-only metrics (quartile_data, completion_rate) (#5837)

* fix(delivery-metrics): allow null for video-only metrics (quartile_data, completion_rate)

Sellers running non-video inventory (display, audio-only, DOOH-without-video)
legitimately return null for video-only metrics — the correct "not applicable"
signal. The schema required type:"number"/"object" and rejected null, so
receivers throw a validation error on every valid display-inventory delivery
report.

- delivery-metrics.json: completion_rate -> ["number","null"], quartile_data
  -> ["object","null"] (min/max on completion_rate still apply to non-null).
- get-media-buy-delivery-response.json: aggregated_totals.completion_rate gets
  the same loosening so the aggregate path can't re-trigger the failure.
- Docs: scope the null convention to these two fields; omission remains the
  canonical "not applicable" signal for every other metric.

Refs Sentry AGENTIC-API-9P (87 events/5 days; PubX, BidMachine, Ozone, Vox).

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

* fix(docs): escape bare < in spec-guardian so Mintlify link check parses it

'overturn <5%' parsed as a JSX tag open (< before a digit), failing the
Mintlify broken-links check that runs on any docs change. Escape to &lt;5%.

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

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
#	specs/spec-guardian.md

* chore(ci): add 3.1.x to release and CI workflow branch filters

Enables the Release workflow, Build Check, Changeset Check, and CodeQL
to fire on pushes and PRs targeting the 3.1.x maintenance branch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(storyboards): port governance approval and stale date fixes to 3.1.x

Cherry-picks two patch fixes from main needed for storyboard coverage to
pass on 3.1.x:
- Fix brand-handlers to always return REFERENCE_NOT_FOUND (removing 3.0
  compat path that returned BRAND_NOT_FOUND), fixing brand_baseline failure
- Move stale exclusivity/rights window dates in brand-handlers from
  2026-2027 to 2099 to prevent date-expiry storyboard failures
- Fix governance compliance storyboards for human approval and signal
  activation enforcement

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(signals): port signal governance enforcement fix to 3.1.x

Cherry-picks a335070 from main: signal agents now fail closed on governed
accounts without a valid approval context, and governance compliance checks
no longer require the signals tenant to own sync_plans. Fixes the
activate_signal_denied storyboard floor failure on 3.1.x.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore(deps): bump @adcp/sdk to 9.6.2 on 3.1.x

The signal governance enforcement fix cherry-picked in da636b4 was
validated on main under @adcp/sdk 9.6.2 (bumped there in 7a27263 the
day before the fix landed). Under 9.3.0 the storyboard runner skips
sync_accounts as not_applicable when require_operator_auth is true, so
the governance_denied storyboard never registers a governance agent and
activate_signal returns success instead of PERMISSION_DENIED, leaving
the signals 3.0-compat leg at 64 clean vs the 65 floor.

Verified locally: 3.0-compat matrix passes all tenants (signals 65
clean, 108 steps, matching main) and current matrix passes (signals
113 clean, 137 steps).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(deps): regenerate lockfile with npm 10 for CI compatibility

The previous lockfile was regenerated by a locally wrapped npm 11 that
pruned nested proxy-agent@8.0.2 entries, so npm ci on CI (node 22,
npm 10) failed with a lock sync error. Restore the prior lockfile and
apply only the @adcp/sdk 9.6.2 bump via npm 10, matching CI. Verified
with npm@10 ci --dry-run plus a rerun of typecheck and the 3.0-compat
storyboard matrix (all tenants meet floors).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Version Packages (#5842)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(training-agent): backport publisher_domain filter to 3.1.x (#5868)

* feat(training-agent): add publisher_domain filter to get_products (#5867)

* feat(discovery): add publisher_domain filter to get_products

Adds a publisher_domain filter to product-filters.json so buyers can
discover which products from a seller cover a given publisher domain.
A product matches when at least one publisher_properties entry targets
the specified domain exactly. Implements the training-agent filter
alongside schema and tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(training-agent): add publisher_domain filter to get_products

Adds publisher_domain as a filter on get_products so buyers can narrow
results to products whose publisher_properties cover a specific domain.

- Adds publisher_domain to the source schema (static/schemas/source)
  so it survives schema rebuilds
- Handles both publisher_domain (singular) and publisher_domains[]
  (plural array) forms of PublisherPropertySelector, matching the logic
  in adagents-manager.ts
- Canonicalizes the filter value and stored values via
  canonicalizePublisherDomain so BBC.com / bbc.com/ / bbc.com all match
- Adds typeof guard to reject non-string values passed as the filter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(ci): revert immutable dist artifact edit

The dist/schemas/3.1.0/ artifacts are released and immutable. The
publisher_domain field belongs in the source schema only; the versioned
dist is generated by npm run version when the changeset is processed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore(changeset): downgrade to patch for 3.1.x backport

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Version Packages (#5869)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(protocol): restore the supported 3.1 contract (#5908)

* Version Packages (#5909)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix: prepare 3.1.5 patch release (#6001)

* fix(creative): clarify preflight dry-run validation (#5791)

* Clarify creative preflight semantics

* chore: refresh PR checks

* docs(get_media_buy_delivery): correct misleading "Buyer Reference Query" example (#5807)

Fix a misleading get_media_buy_delivery example that implied buyers can look up delivery by their own reference. media_buy_ids are seller-assigned, so the example now uses seller-assigned mb_... IDs and points buyers to reconcile their own reference through opaque context echoed by create_media_buy / get_media_buys.

* docs(compliance): document branch-set any_of peer cascade exemption (#5783)

Adds `branch_set_cascade_exemption` to `cascade_rules` in
runner-output-contract.yaml (parallel to `sole_stateful_step_exemption`):
a stateful peer's genuine failure or `peer_branch_taken` skip MUST NOT
cascade `prerequisite_failed` onto a sibling phase sharing the same
`branch_set.id` under `any_of` semantics. Branch-set peers are
mutually-exclusive alternatives, not a dependency chain. Scoped to
`any_of`, N-ary-safe, cross-set and within-phase cascade unchanged, and
explicitly `depends_on`-agnostic (fires whether the sibling's dependency
is the implicit default or an explicit depends_on naming the peer).

`default_cascade` gains a pointer to the new exemption; storyboard-
schema.yaml's `depends_on` section gains a cross-reference.

Documents-only: codifies the runner behavior shipped in adcp-client#2306
(closing adcp-client#2305), root-caused in #5337. No schema or wire change.

Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* compliance(media-buy): available_actions uses a non-guaranteed fixture (runnable by sales-non-guaranteed-only sellers) (#5731)

The available_actions scenario seeded a guaranteed-only product fixture, so its
create_buy_from_product step failed with a terminal DELIVERY_MODE_NOT_SUPPORTED
for sellers declaring only specialisms: ["sales-non-guaranteed"], cascading the
whole available-actions enforcement flow (read_persisted_buy_actions +
enforce_available_actions all prerequisite_failed).

The allowed_actions behavior this scenario grades is delivery-type-agnostic, so
the fixture switches to non_guaranteed (fixed_price → floor_price). Same fix as
the base media_buy_seller flow; the create steps reference the product/pricing by
id, unchanged.

The packaged dist/compliance/ cache is generated from this source.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* chore(changeset): mark available actions fix as patch (#5906)

* fix(compliance): correct creative storyboard capability assertions (#5847)

- canonical_supported_formats: change hardcoded field_value for
  capability_id ("training_image_generation") to field_present, since
  capability_id is agent-local; remove field_absent on supported_formats[1]
  which incorrectly capped to a single advertised format; rename key: to
  name: in context_outputs per storyboard schema. Bump to 1.0.1.

- evaluator_auth: add requires_capability guards to all six optional
  phases so agents declaring creative.supports_evaluator: false receive
  not_applicable instead of false failures; guards evaluate against the
  raw capabilities response, bypassing a runner-side boolean-false context
  accumulator bug (adcp-client); rename key: to name: in context_outputs.
  Bump to 1.0.1.

Closes #5843. Refs #5844 (runner fix in adcp-client still required;
storyboard fix stops the false failures).


Claude-Session: https://claude.ai/code/session_011iWNWasRVCisU8sMy688Qx

Co-authored-by: Claude <noreply@anthropic.com>

* fix(compliance): correct privacy and inventory guidance (#5904)

* fix(release): preserve schema release status (#5913)

* fix(docs): replace phantom creative and governance error codes with canonical enum members (#5819)

sync_creatives, build_creative, the creative specification, check_governance,
and sync_plans documented 13 errors[].code values that do not exist in
enums/error-code.json. Remap each to the existing code with matching
semantics (UNSUPPORTED_FEATURE, VALIDATION_ERROR, CREATIVE_REJECTED,
INVALID_STATE, INVALID_REQUEST, PERMISSION_DENIED); replace GENERATION_FAILED
with task-failure guidance per the open-vocabulary rule. Also fix the one
live INVALID_FORMAT emission in the training-agent reference implementation.
Same failure mode as #4852 / #5307.

* docs: add creative agent setup verification (#5881)

Co-authored-by: Brian O'Kelley <bokelley@scope3.com>

* docs(media-buy): add Budget & Pacing Controls reference to create_media_buy (#5984)

Enumerates every budget-constraint field (total_budget, package budget,
impressions, pacing, bid_price, flight window) in one place, documents the
three pacing modes, and marks the missing daily-cap field as a known gap
with the pacing-based workaround. Cross-links from update_media_buy.

Closes #4429

* fix(schema): require cancellation_fee rate/amount by fee type (#5987)

cancellation-policy.json documents cancellation_fee.rate as "Required when
type is 'percent_remaining'" and .amount as "Required when type is
'fixed_fee'" — restated in the pricing-models reference — but cancellation_fee
listed only ["type"] in required[]. A validator accepted a percent_remaining
or fixed_fee cancellation term with no fee value, leaving the cancellation
cost undefined for a buyer accepting the product's terms.

Adds if/then conditionals enforcing the documented contract; full_commitment
and none are unaffected. No prose change. Regression coverage added.

Closes #5986

* fix: align retry_after with the canonical error shape (#5954)

* fix(ci): preserve forward-merge branches when opening PRs (#5978)

* docs: expand AgenticAdvertising.org name in backports

---------

Co-authored-by: Steven Liss <stevenliss45@gmail.com>
Co-authored-by: fgranata <220887501+fgranata@users.noreply.github.com>
Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Aleksander Sekowski <aleksander@uixlimited.com>
Co-authored-by: Bill Jung <56685007+sangilish@users.noreply.github.com>
Co-authored-by: Garvit kaushik <77023388+garvitkaushik-123@users.noreply.github.com>

* Version Packages (#6003)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: Rachit <43431004+rachitm022@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Nastassia Fulconis <nfulconis@scope3.com>
Co-authored-by: aao-release-bot[bot] <280565558+aao-release-bot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Nastassia Fulconis <nastassia.fulconis@gmail.com>
Co-authored-by: Steven Liss <stevenliss45@gmail.com>
Co-authored-by: fgranata <220887501+fgranata@users.noreply.github.com>
Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Aleksander Sekowski <aleksander@uixlimited.com>
Co-authored-by: Bill Jung <56685007+sangilish@users.noreply.github.com>
Co-authored-by: Garvit kaushik <77023388+garvitkaushik-123@users.noreply.github.com>
bokelley added a commit that referenced this pull request Jul 28, 2026
* fix(delivery-metrics): allow null for video-only metrics (quartile_data, completion_rate) (#5837)

* fix(delivery-metrics): allow null for video-only metrics (quartile_data, completion_rate)

Sellers running non-video inventory (display, audio-only, DOOH-without-video)
legitimately return null for video-only metrics — the correct "not applicable"
signal. The schema required type:"number"/"object" and rejected null, so
receivers throw a validation error on every valid display-inventory delivery
report.

- delivery-metrics.json: completion_rate -> ["number","null"], quartile_data
  -> ["object","null"] (min/max on completion_rate still apply to non-null).
- get-media-buy-delivery-response.json: aggregated_totals.completion_rate gets
  the same loosening so the aggregate path can't re-trigger the failure.
- Docs: scope the null convention to these two fields; omission remains the
  canonical "not applicable" signal for every other metric.

Refs Sentry AGENTIC-API-9P (87 events/5 days; PubX, BidMachine, Ozone, Vox).

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

* fix(docs): escape bare < in spec-guardian so Mintlify link check parses it

'overturn <5%' parsed as a JSX tag open (< before a digit), failing the
Mintlify broken-links check that runs on any docs change. Escape to &lt;5%.

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

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
#	specs/spec-guardian.md

* chore(ci): add 3.1.x to release and CI workflow branch filters

Enables the Release workflow, Build Check, Changeset Check, and CodeQL
to fire on pushes and PRs targeting the 3.1.x maintenance branch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(storyboards): port governance approval and stale date fixes to 3.1.x

Cherry-picks two patch fixes from main needed for storyboard coverage to
pass on 3.1.x:
- Fix brand-handlers to always return REFERENCE_NOT_FOUND (removing 3.0
  compat path that returned BRAND_NOT_FOUND), fixing brand_baseline failure
- Move stale exclusivity/rights window dates in brand-handlers from
  2026-2027 to 2099 to prevent date-expiry storyboard failures
- Fix governance compliance storyboards for human approval and signal
  activation enforcement

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(signals): port signal governance enforcement fix to 3.1.x

Cherry-picks a335070 from main: signal agents now fail closed on governed
accounts without a valid approval context, and governance compliance checks
no longer require the signals tenant to own sync_plans. Fixes the
activate_signal_denied storyboard floor failure on 3.1.x.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore(deps): bump @adcp/sdk to 9.6.2 on 3.1.x

The signal governance enforcement fix cherry-picked in da636b4 was
validated on main under @adcp/sdk 9.6.2 (bumped there in 7a27263 the
day before the fix landed). Under 9.3.0 the storyboard runner skips
sync_accounts as not_applicable when require_operator_auth is true, so
the governance_denied storyboard never registers a governance agent and
activate_signal returns success instead of PERMISSION_DENIED, leaving
the signals 3.0-compat leg at 64 clean vs the 65 floor.

Verified locally: 3.0-compat matrix passes all tenants (signals 65
clean, 108 steps, matching main) and current matrix passes (signals
113 clean, 137 steps).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(deps): regenerate lockfile with npm 10 for CI compatibility

The previous lockfile was regenerated by a locally wrapped npm 11 that
pruned nested proxy-agent@8.0.2 entries, so npm ci on CI (node 22,
npm 10) failed with a lock sync error. Restore the prior lockfile and
apply only the @adcp/sdk 9.6.2 bump via npm 10, matching CI. Verified
with npm@10 ci --dry-run plus a rerun of typecheck and the 3.0-compat
storyboard matrix (all tenants meet floors).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Version Packages (#5842)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(training-agent): backport publisher_domain filter to 3.1.x (#5868)

* feat(training-agent): add publisher_domain filter to get_products (#5867)

* feat(discovery): add publisher_domain filter to get_products

Adds a publisher_domain filter to product-filters.json so buyers can
discover which products from a seller cover a given publisher domain.
A product matches when at least one publisher_properties entry targets
the specified domain exactly. Implements the training-agent filter
alongside schema and tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(training-agent): add publisher_domain filter to get_products

Adds publisher_domain as a filter on get_products so buyers can narrow
results to products whose publisher_properties cover a specific domain.

- Adds publisher_domain to the source schema (static/schemas/source)
  so it survives schema rebuilds
- Handles both publisher_domain (singular) and publisher_domains[]
  (plural array) forms of PublisherPropertySelector, matching the logic
  in adagents-manager.ts
- Canonicalizes the filter value and stored values via
  canonicalizePublisherDomain so BBC.com / bbc.com/ / bbc.com all match
- Adds typeof guard to reject non-string values passed as the filter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(ci): revert immutable dist artifact edit

The dist/schemas/3.1.0/ artifacts are released and immutable. The
publisher_domain field belongs in the source schema only; the versioned
dist is generated by npm run version when the changeset is processed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore(changeset): downgrade to patch for 3.1.x backport

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Version Packages (#5869)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(protocol): restore the supported 3.1 contract (#5908)

* Version Packages (#5909)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix: prepare 3.1.5 patch release (#6001)

* fix(creative): clarify preflight dry-run validation (#5791)

* Clarify creative preflight semantics

* chore: refresh PR checks

* docs(get_media_buy_delivery): correct misleading "Buyer Reference Query" example (#5807)

Fix a misleading get_media_buy_delivery example that implied buyers can look up delivery by their own reference. media_buy_ids are seller-assigned, so the example now uses seller-assigned mb_... IDs and points buyers to reconcile their own reference through opaque context echoed by create_media_buy / get_media_buys.

* docs(compliance): document branch-set any_of peer cascade exemption (#5783)

Adds `branch_set_cascade_exemption` to `cascade_rules` in
runner-output-contract.yaml (parallel to `sole_stateful_step_exemption`):
a stateful peer's genuine failure or `peer_branch_taken` skip MUST NOT
cascade `prerequisite_failed` onto a sibling phase sharing the same
`branch_set.id` under `any_of` semantics. Branch-set peers are
mutually-exclusive alternatives, not a dependency chain. Scoped to
`any_of`, N-ary-safe, cross-set and within-phase cascade unchanged, and
explicitly `depends_on`-agnostic (fires whether the sibling's dependency
is the implicit default or an explicit depends_on naming the peer).

`default_cascade` gains a pointer to the new exemption; storyboard-
schema.yaml's `depends_on` section gains a cross-reference.

Documents-only: codifies the runner behavior shipped in adcp-client#2306
(closing adcp-client#2305), root-caused in #5337. No schema or wire change.

Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* compliance(media-buy): available_actions uses a non-guaranteed fixture (runnable by sales-non-guaranteed-only sellers) (#5731)

The available_actions scenario seeded a guaranteed-only product fixture, so its
create_buy_from_product step failed with a terminal DELIVERY_MODE_NOT_SUPPORTED
for sellers declaring only specialisms: ["sales-non-guaranteed"], cascading the
whole available-actions enforcement flow (read_persisted_buy_actions +
enforce_available_actions all prerequisite_failed).

The allowed_actions behavior this scenario grades is delivery-type-agnostic, so
the fixture switches to non_guaranteed (fixed_price → floor_price). Same fix as
the base media_buy_seller flow; the create steps reference the product/pricing by
id, unchanged.

The packaged dist/compliance/ cache is generated from this source.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* chore(changeset): mark available actions fix as patch (#5906)

* fix(compliance): correct creative storyboard capability assertions (#5847)

- canonical_supported_formats: change hardcoded field_value for
  capability_id ("training_image_generation") to field_present, since
  capability_id is agent-local; remove field_absent on supported_formats[1]
  which incorrectly capped to a single advertised format; rename key: to
  name: in context_outputs per storyboard schema. Bump to 1.0.1.

- evaluator_auth: add requires_capability guards to all six optional
  phases so agents declaring creative.supports_evaluator: false receive
  not_applicable instead of false failures; guards evaluate against the
  raw capabilities response, bypassing a runner-side boolean-false context
  accumulator bug (adcp-client); rename key: to name: in context_outputs.
  Bump to 1.0.1.

Closes #5843. Refs #5844 (runner fix in adcp-client still required;
storyboard fix stops the false failures).


Claude-Session: https://claude.ai/code/session_011iWNWasRVCisU8sMy688Qx

Co-authored-by: Claude <noreply@anthropic.com>

* fix(compliance): correct privacy and inventory guidance (#5904)

* fix(release): preserve schema release status (#5913)

* fix(docs): replace phantom creative and governance error codes with canonical enum members (#5819)

sync_creatives, build_creative, the creative specification, check_governance,
and sync_plans documented 13 errors[].code values that do not exist in
enums/error-code.json. Remap each to the existing code with matching
semantics (UNSUPPORTED_FEATURE, VALIDATION_ERROR, CREATIVE_REJECTED,
INVALID_STATE, INVALID_REQUEST, PERMISSION_DENIED); replace GENERATION_FAILED
with task-failure guidance per the open-vocabulary rule. Also fix the one
live INVALID_FORMAT emission in the training-agent reference implementation.
Same failure mode as #4852 / #5307.

* docs: add creative agent setup verification (#5881)

Co-authored-by: Brian O'Kelley <bokelley@scope3.com>

* docs(media-buy): add Budget & Pacing Controls reference to create_media_buy (#5984)

Enumerates every budget-constraint field (total_budget, package budget,
impressions, pacing, bid_price, flight window) in one place, documents the
three pacing modes, and marks the missing daily-cap field as a known gap
with the pacing-based workaround. Cross-links from update_media_buy.

Closes #4429

* fix(schema): require cancellation_fee rate/amount by fee type (#5987)

cancellation-policy.json documents cancellation_fee.rate as "Required when
type is 'percent_remaining'" and .amount as "Required when type is
'fixed_fee'" — restated in the pricing-models reference — but cancellation_fee
listed only ["type"] in required[]. A validator accepted a percent_remaining
or fixed_fee cancellation term with no fee value, leaving the cancellation
cost undefined for a buyer accepting the product's terms.

Adds if/then conditionals enforcing the documented contract; full_commitment
and none are unaffected. No prose change. Regression coverage added.

Closes #5986

* fix: align retry_after with the canonical error shape (#5954)

* fix(ci): preserve forward-merge branches when opening PRs (#5978)

* docs: expand AgenticAdvertising.org name in backports

---------

Co-authored-by: Steven Liss <stevenliss45@gmail.com>
Co-authored-by: fgranata <220887501+fgranata@users.noreply.github.com>
Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Aleksander Sekowski <aleksander@uixlimited.com>
Co-authored-by: Bill Jung <56685007+sangilish@users.noreply.github.com>
Co-authored-by: Garvit kaushik <77023388+garvitkaushik-123@users.noreply.github.com>

* Version Packages (#6003)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(schema): backport legacy format mappings to 3.1.x (#6040)

Backport the patch-eligible literal v1 canonical format mappings from #6037 for the 3.1.6 maintenance release.

* fix(release): backport schema discovery status test correction (#6044)

Backport #6043 so the 3.1.6 release audit accepts exact withdrawn artifacts while continuing to reject non-selectable alias targets.

* Version Packages (#6041)

Release adcontextprotocol 3.1.6.

* fix(schema): allow canonical list_creatives identities (#6047) (#6057)

* fix(schema): allow canonical list_creatives identities

* chore(schema): update oneOf discriminator baseline

* Version Packages (#6059)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(schema): correct legacy canonical mappings (#6061) (#6066)

* fix(schema): preserve video aspect ratio mapping

* fix(schema): publish AAO display mappings

* Version Packages (#6067)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

---------

Co-authored-by: Rachit <43431004+rachitm022@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Nastassia Fulconis <nfulconis@scope3.com>
Co-authored-by: aao-release-bot[bot] <280565558+aao-release-bot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Nastassia Fulconis <nastassia.fulconis@gmail.com>
Co-authored-by: Steven Liss <stevenliss45@gmail.com>
Co-authored-by: fgranata <220887501+fgranata@users.noreply.github.com>
Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Aleksander Sekowski <aleksander@uixlimited.com>
Co-authored-by: Bill Jung <56685007+sangilish@users.noreply.github.com>
Co-authored-by: Garvit kaushik <77023388+garvitkaushik-123@users.noreply.github.com>
bokelley added a commit that referenced this pull request Aug 4, 2026
* fix(delivery-metrics): allow null for video-only metrics (quartile_data, completion_rate) (#5837)

* fix(delivery-metrics): allow null for video-only metrics (quartile_data, completion_rate)

Sellers running non-video inventory (display, audio-only, DOOH-without-video)
legitimately return null for video-only metrics — the correct "not applicable"
signal. The schema required type:"number"/"object" and rejected null, so
receivers throw a validation error on every valid display-inventory delivery
report.

- delivery-metrics.json: completion_rate -> ["number","null"], quartile_data
  -> ["object","null"] (min/max on completion_rate still apply to non-null).
- get-media-buy-delivery-response.json: aggregated_totals.completion_rate gets
  the same loosening so the aggregate path can't re-trigger the failure.
- Docs: scope the null convention to these two fields; omission remains the
  canonical "not applicable" signal for every other metric.

Refs Sentry AGENTIC-API-9P (87 events/5 days; PubX, BidMachine, Ozone, Vox).

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

* fix(docs): escape bare < in spec-guardian so Mintlify link check parses it

'overturn <5%' parsed as a JSX tag open (< before a digit), failing the
Mintlify broken-links check that runs on any docs change. Escape to &lt;5%.

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

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
#	specs/spec-guardian.md

* chore(ci): add 3.1.x to release and CI workflow branch filters

Enables the Release workflow, Build Check, Changeset Check, and CodeQL
to fire on pushes and PRs targeting the 3.1.x maintenance branch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(storyboards): port governance approval and stale date fixes to 3.1.x

Cherry-picks two patch fixes from main needed for storyboard coverage to
pass on 3.1.x:
- Fix brand-handlers to always return REFERENCE_NOT_FOUND (removing 3.0
  compat path that returned BRAND_NOT_FOUND), fixing brand_baseline failure
- Move stale exclusivity/rights window dates in brand-handlers from
  2026-2027 to 2099 to prevent date-expiry storyboard failures
- Fix governance compliance storyboards for human approval and signal
  activation enforcement

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(signals): port signal governance enforcement fix to 3.1.x

Cherry-picks a335070 from main: signal agents now fail closed on governed
accounts without a valid approval context, and governance compliance checks
no longer require the signals tenant to own sync_plans. Fixes the
activate_signal_denied storyboard floor failure on 3.1.x.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore(deps): bump @adcp/sdk to 9.6.2 on 3.1.x

The signal governance enforcement fix cherry-picked in da636b4 was
validated on main under @adcp/sdk 9.6.2 (bumped there in 7a27263 the
day before the fix landed). Under 9.3.0 the storyboard runner skips
sync_accounts as not_applicable when require_operator_auth is true, so
the governance_denied storyboard never registers a governance agent and
activate_signal returns success instead of PERMISSION_DENIED, leaving
the signals 3.0-compat leg at 64 clean vs the 65 floor.

Verified locally: 3.0-compat matrix passes all tenants (signals 65
clean, 108 steps, matching main) and current matrix passes (signals
113 clean, 137 steps).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(deps): regenerate lockfile with npm 10 for CI compatibility

The previous lockfile was regenerated by a locally wrapped npm 11 that
pruned nested proxy-agent@8.0.2 entries, so npm ci on CI (node 22,
npm 10) failed with a lock sync error. Restore the prior lockfile and
apply only the @adcp/sdk 9.6.2 bump via npm 10, matching CI. Verified
with npm@10 ci --dry-run plus a rerun of typecheck and the 3.0-compat
storyboard matrix (all tenants meet floors).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Version Packages (#5842)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(training-agent): backport publisher_domain filter to 3.1.x (#5868)

* feat(training-agent): add publisher_domain filter to get_products (#5867)

* feat(discovery): add publisher_domain filter to get_products

Adds a publisher_domain filter to product-filters.json so buyers can
discover which products from a seller cover a given publisher domain.
A product matches when at least one publisher_properties entry targets
the specified domain exactly. Implements the training-agent filter
alongside schema and tests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(training-agent): add publisher_domain filter to get_products

Adds publisher_domain as a filter on get_products so buyers can narrow
results to products whose publisher_properties cover a specific domain.

- Adds publisher_domain to the source schema (static/schemas/source)
  so it survives schema rebuilds
- Handles both publisher_domain (singular) and publisher_domains[]
  (plural array) forms of PublisherPropertySelector, matching the logic
  in adagents-manager.ts
- Canonicalizes the filter value and stored values via
  canonicalizePublisherDomain so BBC.com / bbc.com/ / bbc.com all match
- Adds typeof guard to reject non-string values passed as the filter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(ci): revert immutable dist artifact edit

The dist/schemas/3.1.0/ artifacts are released and immutable. The
publisher_domain field belongs in the source schema only; the versioned
dist is generated by npm run version when the changeset is processed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* chore(changeset): downgrade to patch for 3.1.x backport

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Version Packages (#5869)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(protocol): restore the supported 3.1 contract (#5908)

* Version Packages (#5909)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix: prepare 3.1.5 patch release (#6001)

* fix(creative): clarify preflight dry-run validation (#5791)

* Clarify creative preflight semantics

* chore: refresh PR checks

* docs(get_media_buy_delivery): correct misleading "Buyer Reference Query" example (#5807)

Fix a misleading get_media_buy_delivery example that implied buyers can look up delivery by their own reference. media_buy_ids are seller-assigned, so the example now uses seller-assigned mb_... IDs and points buyers to reconcile their own reference through opaque context echoed by create_media_buy / get_media_buys.

* docs(compliance): document branch-set any_of peer cascade exemption (#5783)

Adds `branch_set_cascade_exemption` to `cascade_rules` in
runner-output-contract.yaml (parallel to `sole_stateful_step_exemption`):
a stateful peer's genuine failure or `peer_branch_taken` skip MUST NOT
cascade `prerequisite_failed` onto a sibling phase sharing the same
`branch_set.id` under `any_of` semantics. Branch-set peers are
mutually-exclusive alternatives, not a dependency chain. Scoped to
`any_of`, N-ary-safe, cross-set and within-phase cascade unchanged, and
explicitly `depends_on`-agnostic (fires whether the sibling's dependency
is the implicit default or an explicit depends_on naming the peer).

`default_cascade` gains a pointer to the new exemption; storyboard-
schema.yaml's `depends_on` section gains a cross-reference.

Documents-only: codifies the runner behavior shipped in adcp-client#2306
(closing adcp-client#2305), root-caused in #5337. No schema or wire change.

Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* compliance(media-buy): available_actions uses a non-guaranteed fixture (runnable by sales-non-guaranteed-only sellers) (#5731)

The available_actions scenario seeded a guaranteed-only product fixture, so its
create_buy_from_product step failed with a terminal DELIVERY_MODE_NOT_SUPPORTED
for sellers declaring only specialisms: ["sales-non-guaranteed"], cascading the
whole available-actions enforcement flow (read_persisted_buy_actions +
enforce_available_actions all prerequisite_failed).

The allowed_actions behavior this scenario grades is delivery-type-agnostic, so
the fixture switches to non_guaranteed (fixed_price → floor_price). Same fix as
the base media_buy_seller flow; the create steps reference the product/pricing by
id, unchanged.

The packaged dist/compliance/ cache is generated from this source.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* chore(changeset): mark available actions fix as patch (#5906)

* fix(compliance): correct creative storyboard capability assertions (#5847)

- canonical_supported_formats: change hardcoded field_value for
  capability_id ("training_image_generation") to field_present, since
  capability_id is agent-local; remove field_absent on supported_formats[1]
  which incorrectly capped to a single advertised format; rename key: to
  name: in context_outputs per storyboard schema. Bump to 1.0.1.

- evaluator_auth: add requires_capability guards to all six optional
  phases so agents declaring creative.supports_evaluator: false receive
  not_applicable instead of false failures; guards evaluate against the
  raw capabilities response, bypassing a runner-side boolean-false context
  accumulator bug (adcp-client); rename key: to name: in context_outputs.
  Bump to 1.0.1.

Closes #5843. Refs #5844 (runner fix in adcp-client still required;
storyboard fix stops the false failures).


Claude-Session: https://claude.ai/code/session_011iWNWasRVCisU8sMy688Qx

Co-authored-by: Claude <noreply@anthropic.com>

* fix(compliance): correct privacy and inventory guidance (#5904)

* fix(release): preserve schema release status (#5913)

* fix(docs): replace phantom creative and governance error codes with canonical enum members (#5819)

sync_creatives, build_creative, the creative specification, check_governance,
and sync_plans documented 13 errors[].code values that do not exist in
enums/error-code.json. Remap each to the existing code with matching
semantics (UNSUPPORTED_FEATURE, VALIDATION_ERROR, CREATIVE_REJECTED,
INVALID_STATE, INVALID_REQUEST, PERMISSION_DENIED); replace GENERATION_FAILED
with task-failure guidance per the open-vocabulary rule. Also fix the one
live INVALID_FORMAT emission in the training-agent reference implementation.
Same failure mode as #4852 / #5307.

* docs: add creative agent setup verification (#5881)

Co-authored-by: Brian O'Kelley <bokelley@scope3.com>

* docs(media-buy): add Budget & Pacing Controls reference to create_media_buy (#5984)

Enumerates every budget-constraint field (total_budget, package budget,
impressions, pacing, bid_price, flight window) in one place, documents the
three pacing modes, and marks the missing daily-cap field as a known gap
with the pacing-based workaround. Cross-links from update_media_buy.

Closes #4429

* fix(schema): require cancellation_fee rate/amount by fee type (#5987)

cancellation-policy.json documents cancellation_fee.rate as "Required when
type is 'percent_remaining'" and .amount as "Required when type is
'fixed_fee'" — restated in the pricing-models reference — but cancellation_fee
listed only ["type"] in required[]. A validator accepted a percent_remaining
or fixed_fee cancellation term with no fee value, leaving the cancellation
cost undefined for a buyer accepting the product's terms.

Adds if/then conditionals enforcing the documented contract; full_commitment
and none are unaffected. No prose change. Regression coverage added.

Closes #5986

* fix: align retry_after with the canonical error shape (#5954)

* fix(ci): preserve forward-merge branches when opening PRs (#5978)

* docs: expand AgenticAdvertising.org name in backports

---------

Co-authored-by: Steven Liss <stevenliss45@gmail.com>
Co-authored-by: fgranata <220887501+fgranata@users.noreply.github.com>
Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Aleksander Sekowski <aleksander@uixlimited.com>
Co-authored-by: Bill Jung <56685007+sangilish@users.noreply.github.com>
Co-authored-by: Garvit kaushik <77023388+garvitkaushik-123@users.noreply.github.com>

* Version Packages (#6003)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(schema): backport legacy format mappings to 3.1.x (#6040)

Backport the patch-eligible literal v1 canonical format mappings from #6037 for the 3.1.6 maintenance release.

* fix(release): backport schema discovery status test correction (#6044)

Backport #6043 so the 3.1.6 release audit accepts exact withdrawn artifacts while continuing to reject non-selectable alias targets.

* Version Packages (#6041)

Release adcontextprotocol 3.1.6.

* fix(schema): allow canonical list_creatives identities (#6047) (#6057)

* fix(schema): allow canonical list_creatives identities

* chore(schema): update oneOf discriminator baseline

* Version Packages (#6059)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(schema): correct legacy canonical mappings (#6061) (#6066)

* fix(schema): preserve video aspect ratio mapping

* fix(schema): publish AAO display mappings

* Version Packages (#6067)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(compliance): remove tab character from runner-output-contract.yaml (#6042) (#6065)

A literal tab at line 303 (a pure comment line) makes the file
unparseable by strict YAML parsers — tabs cannot start a token — so
consumers of the packaged 3.1.4/3.1.5 compliance caches fail to load
the runner output contract. Replace the leading tab with spaces;
comment text and semantic content unchanged.

Verified: yaml.safe_load parses the file clean after the change, and
`grep -rP '^\t' static/compliance/source/` reports zero remaining
tab-leading lines (this was the only occurrence).

Refs #6038

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* feat(trusted-match): publisher-owned TMPX macro mapping (#5971)

* feat(trusted-match): publisher-owned TMPX macro mapping

Splits the Identity Match response into two schemas so each hop's
obligations are expressible in JSON Schema:

- provider-identity-match-response.json — provider→router, carries
  tmpx_values: [string] (ordered opaque chunks; no publisher-local names
  on the wire).
- identity-match-response.json — router→publisher, carries
  tmpx_providers[provider_id].values: [string].

Adds publisher-tmpx-config.json capturing the publisher-owned
tmpx_macro_mapping (provider_id → ordered ad-server destinations for the
surface). Drops the provider-declared tmpx_macros list from
provider-registration.json — naming is a publisher deployment concern.

Ordered position is sufficient for chunk identity. The router never
accepts destination names from an untrusted provider, closing the
cross-provider name-hijack surface (#5945) by construction.

Addresses #5947.

* changeset: strengthen why-3.1.x justification

Cites the experimental-status.mdx relaxation and the #5729 precedent
(same shape, same experimental-surface rule, patched onto 3.1.x weeks
ago) so the reshape stays symmetric with how the surface was introduced.

* address review: slot IDs, hop-split enforcement, key constraints

Replaces the ordinal design with provider-declared slot IDs (Brian's
preference) and hardens the split schemas so wrong-hop, envelope-
extension, and out-of-charset inputs are rejected by validation rather
than left to convention.

Registration:
- provider-registration.json declares tmpx_slots: [string] — provider-
  local opaque IDs (not ad-server macro names). Publishers key on
  (provider_id, slot_id); distinct providers may reuse the same slot_id.

Response schemas:
- New tmpx-chunk.json ({slot_id, value}) shared between both hops.
- Provider→router carries tmpx_chunks: [TmpxChunk].
- Router→publisher carries tmpx_providers[provider_id].chunks: [TmpxChunk].
- Both hops add `not: {anyOf: [...]}` clauses that reject the other
  hop's fields, legacy carriers (tmpx_values, tmpx_macros), and
  envelope-extension fields (context, ext) that would otherwise slip
  through additionalProperties: true.
- tmpx_providers keys carry propertyNames matching the provider_id
  charset.

Publisher config:
- tmpx_macro_mapping becomes {provider_id: {slot_id: destination}}.
- propertyNames constrain both outer (provider_id) and inner (slot_id)
  key charsets.
- Serve-time fail-closed rule and startup validation are described as
  two stages of one rule so adopters cannot diverge on missing-slot
  handling.

Fixtures:
- Seventeen new fixtures in example-validation-simple.test.cjs cover
  wrong-hop fields on both schemas, context/ext bleed-through on both
  hops, provider_id and slot_id charset violations on both maps, and
  tmpx_slots duplicate detection.

Changeset reframed as a bounded pre-production correction — TMP has no
production use yet and the corrected shape ships before any 3.1 TMP
production deployment.

* fix(trusted-match): router slot-contract enforcement + legacy-carrier fixture parity

- Strengthen `tmpx_chunks` description in provider-identity-match-response.json
  to normative MUST: router MUST validate slot contract before forwarding and
  MUST drop that provider's chunks atomically on any violation (no registration,
  duplicate, reordered, sparse, or unregistered slot IDs).
- Add the same normative enforcement requirement to router-architecture.mdx
  TMPX collection paragraph, before the publisher-local destination names note.
- Add 4 missing legacy-carrier negative fixtures to example-validation-simple.test.cjs:
  tmpx_values and tmpx_macros rejected on both hop schemas (provider→router and
  router→publisher), completing the not-clause coverage for all 6 forbidden fields.
  Total test count: 75 (was 71 before this PR's fixture additions).
- Update changeset fixture count from thirteen to twenty and add router
  slot-contract enforcement paragraph.

---------

Co-authored-by: Brian O'Kelley <cokelley@alumni.princeton.edu>

* Version Packages (#6160)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* feat(creative): backport retina catalog formats to 3.1 (#6195)

* fix(spec): complete 3.1.x maintenance milestone (#6198) (#6200)

(cherry picked from commit a2e7888)

* Version Packages (#6197)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(release): preserve canonical schema discovery id

---------

Co-authored-by: Rachit <43431004+rachitm022@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Nastassia Fulconis <nfulconis@scope3.com>
Co-authored-by: aao-release-bot[bot] <280565558+aao-release-bot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Nastassia Fulconis <nastassia.fulconis@gmail.com>
Co-authored-by: Steven Liss <stevenliss45@gmail.com>
Co-authored-by: fgranata <220887501+fgranata@users.noreply.github.com>
Co-authored-by: Fernando Granata <fernandogranata@Host-001.homenet.telecomitalia.it>
Co-authored-by: Aleksander Sekowski <aleksander@uixlimited.com>
Co-authored-by: Bill Jung <56685007+sangilish@users.noreply.github.com>
Co-authored-by: Garvit kaushik <77023388+garvitkaushik-123@users.noreply.github.com>
Co-authored-by: Oleksandr Halushchak <37289463+ohalushchak-exadel@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant