@adcp/sdk 7.10.2 → 7.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/index.json +356 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
- package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
- package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
- package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
- package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
- package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
- package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
- package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
- package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
- package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
- package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
- package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +9 -5
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +30 -1
- package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +84 -21
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +21 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/types.d.ts +9 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.d.ts +6707 -12040
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +1 -1
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/utils/signal-id-builders.d.ts +19 -0
- package/dist/lib/utils/signal-id-builders.d.ts.map +1 -1
- package/dist/lib/utils/signal-id-builders.js +30 -0
- package/dist/lib/utils/signal-id-builders.js.map +1 -1
- package/dist/lib/utils/tool-request-schemas.d.ts.map +1 -1
- package/dist/lib/utils/tool-request-schemas.js +3 -0
- package/dist/lib/utils/tool-request-schemas.js.map +1 -1
- package/dist/lib/v2/projection/constants.d.ts +28 -0
- package/dist/lib/v2/projection/constants.d.ts.map +1 -0
- package/dist/lib/v2/projection/constants.js +31 -0
- package/dist/lib/v2/projection/constants.js.map +1 -0
- package/dist/lib/v2/projection/registry.d.ts.map +1 -1
- package/dist/lib/v2/projection/registry.js +9 -4
- package/dist/lib/v2/projection/registry.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
- package/skills/SHAPE-GOTCHAS.md +5 -0
|
@@ -0,0 +1,800 @@
|
|
|
1
|
+
id: media_buy_seller/dependency_impairment_cardinality
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Dependency impairment cardinality — impairments[] tracks each offline resource independently"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Two creatives on two packages of the same buy. Rejects them sequentially and verifies impairments[] grows 0 → 1 → 2; recovers them sequentially via swap-assignment and verifies impairments[] shrinks 2 → 1 → 0. Pressure-tests the inverse rule under cardinality — a seller emitting any impairment entry rather than the right one fails."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
- get_media_buys
|
|
11
|
+
- sync_creatives
|
|
12
|
+
- update_media_buy
|
|
13
|
+
- comply_test_controller
|
|
14
|
+
|
|
15
|
+
narrative: |
|
|
16
|
+
The base dependency_impairment scenario tests forward + inverse + health-iff
|
|
17
|
+
with one creative on one package — a malicious or buggy seller can pass the
|
|
18
|
+
inverse rule there by emitting any impairment entry whose resource_id
|
|
19
|
+
happens to match a known-rejected creative. This scenario pressure-tests
|
|
20
|
+
inverse-rule **cardinality**: the seller MUST emit the right number of
|
|
21
|
+
entries, each pointing at the right resource.
|
|
22
|
+
|
|
23
|
+
Five phases:
|
|
24
|
+
|
|
25
|
+
1. **setup** — discover a product, create a buy with TWO packages, sync two
|
|
26
|
+
creatives (A bound to package_a, B bound to package_b), force both to
|
|
27
|
+
approved baseline. `impairments[]` is empty; `health: ok`.
|
|
28
|
+
2. **reject_first** — force creative A to rejected. Read the buy: exactly
|
|
29
|
+
ONE impairment entry, resource_id A, package_ids contains package_a (NOT
|
|
30
|
+
package_b — the assertion fails if the seller incorrectly inflates the
|
|
31
|
+
scope).
|
|
32
|
+
3. **reject_second** — force creative B to rejected. Read the buy: TWO
|
|
33
|
+
impairment entries (one per creative), each pointing at its own package.
|
|
34
|
+
The assertion fails if the seller emits one merged entry or a single
|
|
35
|
+
entry with both package_ids — package scope is per-resource, not
|
|
36
|
+
per-buy.
|
|
37
|
+
4. **recover_first** — swap package_a's binding from A to a fresh
|
|
38
|
+
replacement C. Read the buy: ONE impairment entry remaining (B on
|
|
39
|
+
package_b only). Verifies the seller decrements correctly when an
|
|
40
|
+
impairment clears partially.
|
|
41
|
+
5. **recover_second** — swap package_b's binding from B to a fresh
|
|
42
|
+
replacement D. Read the buy: impairments[] empty, health: ok.
|
|
43
|
+
Cardinality returns to zero.
|
|
44
|
+
|
|
45
|
+
Failure modes this catches that the single-creative scenario can't:
|
|
46
|
+
|
|
47
|
+
- Seller emits an impairment for A when only B is rejected (wrong
|
|
48
|
+
resource_id, right cardinality) — caught in phase 2 (asserts resource_id).
|
|
49
|
+
- Seller emits ONE impairment entry with package_ids: [package_a,
|
|
50
|
+
package_b] when both creatives are rejected — caught in phase 3 (asserts
|
|
51
|
+
exactly two entries).
|
|
52
|
+
- Seller decrements impairments[] all the way to empty when only ONE
|
|
53
|
+
creative recovers — caught in phase 4 (asserts one entry remains).
|
|
54
|
+
- Seller never decrements impairments[] on swap recovery — caught in both
|
|
55
|
+
recovery phases.
|
|
56
|
+
|
|
57
|
+
Capability gating mirrors the base scenario: sellers whose
|
|
58
|
+
`capabilities.media_buy.propagation_surfaces` does NOT include
|
|
59
|
+
`"snapshot"` grade this scenario not_applicable. Sellers declaring
|
|
60
|
+
`["snapshot", "webhook"]` are graded here on the snapshot surface.
|
|
61
|
+
|
|
62
|
+
agent:
|
|
63
|
+
interaction_model: media_buy_seller
|
|
64
|
+
capabilities:
|
|
65
|
+
- sells_media
|
|
66
|
+
- has_creative_library
|
|
67
|
+
examples:
|
|
68
|
+
- "Any media buy seller that exposes comply_test_controller and propagates per-resource impairments independently"
|
|
69
|
+
|
|
70
|
+
caller:
|
|
71
|
+
role: buyer_agent
|
|
72
|
+
example: "Pinnacle Agency (buyer)"
|
|
73
|
+
|
|
74
|
+
prerequisites:
|
|
75
|
+
description: |
|
|
76
|
+
Seller MUST expose comply_test_controller with force_creative_status,
|
|
77
|
+
accept buys with multiple packages, and support update_media_buy with
|
|
78
|
+
packages[].creative_assignments (replacement semantics). Sellers
|
|
79
|
+
without per-resource impairment cardinality (e.g., bundles all rejected
|
|
80
|
+
creatives into one impairment entry) fail this scenario — that's the
|
|
81
|
+
point.
|
|
82
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
83
|
+
|
|
84
|
+
phases:
|
|
85
|
+
- id: setup
|
|
86
|
+
title: "Create a buy with two packages, two creatives, two assignments"
|
|
87
|
+
narrative: |
|
|
88
|
+
Discover a product, create a buy with two packages (same product is
|
|
89
|
+
fine — packages are independent line items), sync two creatives each
|
|
90
|
+
assigned to its own package, and force both to approved baseline.
|
|
91
|
+
|
|
92
|
+
steps:
|
|
93
|
+
- id: get_products_brief
|
|
94
|
+
title: "Discover a product"
|
|
95
|
+
task: get_products
|
|
96
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
97
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
98
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
99
|
+
comply_scenario: full_sales_flow
|
|
100
|
+
stateful: false
|
|
101
|
+
expected: |
|
|
102
|
+
Return at least one product with a pricing option and at least one format_id.
|
|
103
|
+
sample_request:
|
|
104
|
+
buying_mode: "brief"
|
|
105
|
+
brief: "Display inventory on outdoor lifestyle content for dependency-impairment cardinality testing."
|
|
106
|
+
filters:
|
|
107
|
+
is_fixed_price: true
|
|
108
|
+
account:
|
|
109
|
+
brand:
|
|
110
|
+
domain: "acmeoutdoor.example"
|
|
111
|
+
operator: "pinnacle-agency.example"
|
|
112
|
+
context:
|
|
113
|
+
correlation_id: "dependency_impairment_cardinality--get_products"
|
|
114
|
+
context_outputs:
|
|
115
|
+
- path: "products[0].product_id"
|
|
116
|
+
key: "product_id"
|
|
117
|
+
- path: "products[0].pricing_options[0].pricing_option_id"
|
|
118
|
+
key: "pricing_option_id"
|
|
119
|
+
- path: "products[0].format_ids[0].agent_url"
|
|
120
|
+
key: "format_agent_url"
|
|
121
|
+
- path: "products[0].format_ids[0].id"
|
|
122
|
+
key: "format_id"
|
|
123
|
+
validations:
|
|
124
|
+
- check: response_schema
|
|
125
|
+
description: "Response matches get-products-response.json schema"
|
|
126
|
+
- check: field_present
|
|
127
|
+
path: "products[0].format_ids[0].id"
|
|
128
|
+
description: "Product exposes at least one format_id for creative sync"
|
|
129
|
+
- check: field_present
|
|
130
|
+
path: "products[0].pricing_options[0].fixed_price"
|
|
131
|
+
description: "The captured pricing option is fixed-price; fixed-price storyboards do not send bid_price"
|
|
132
|
+
|
|
133
|
+
- id: create_buy_two_packages
|
|
134
|
+
title: "Create a media buy with two packages"
|
|
135
|
+
task: create_media_buy
|
|
136
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
137
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
138
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
139
|
+
comply_scenario: create_media_buy
|
|
140
|
+
stateful: true
|
|
141
|
+
expected: |
|
|
142
|
+
Buy created with media_buy_id and two distinct packages. Both
|
|
143
|
+
package_ids captured for the impairment-per-package assertions.
|
|
144
|
+
|
|
145
|
+
sample_request:
|
|
146
|
+
brand:
|
|
147
|
+
domain: "acmeoutdoor.example"
|
|
148
|
+
account:
|
|
149
|
+
brand:
|
|
150
|
+
domain: "acmeoutdoor.example"
|
|
151
|
+
operator: "pinnacle-agency.example"
|
|
152
|
+
idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_create_buy"
|
|
153
|
+
start_time: "2026-11-01T00:00:00Z"
|
|
154
|
+
end_time: "2026-11-30T23:59:59Z"
|
|
155
|
+
packages:
|
|
156
|
+
- product_id: "$context.product_id"
|
|
157
|
+
budget: 3000
|
|
158
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
159
|
+
- product_id: "$context.product_id"
|
|
160
|
+
budget: 3000
|
|
161
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
162
|
+
context:
|
|
163
|
+
correlation_id: "dependency_impairment_cardinality--create_buy"
|
|
164
|
+
context_outputs:
|
|
165
|
+
- path: "media_buy_id"
|
|
166
|
+
key: "media_buy_id"
|
|
167
|
+
- path: "packages[0].package_id"
|
|
168
|
+
key: "package_a_id"
|
|
169
|
+
- path: "packages[1].package_id"
|
|
170
|
+
key: "package_b_id"
|
|
171
|
+
validations:
|
|
172
|
+
- check: response_schema
|
|
173
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
174
|
+
- check: field_present
|
|
175
|
+
path: "media_buy_id"
|
|
176
|
+
description: "Seller returns media_buy_id"
|
|
177
|
+
- check: field_present
|
|
178
|
+
path: "packages[0].package_id"
|
|
179
|
+
description: "First package_id returned"
|
|
180
|
+
- check: field_present
|
|
181
|
+
path: "packages[1].package_id"
|
|
182
|
+
description: "Second package_id returned (multi-package buy is supported)"
|
|
183
|
+
|
|
184
|
+
- id: sync_two_creatives
|
|
185
|
+
title: "Sync creatives A and B into the library"
|
|
186
|
+
task: sync_creatives
|
|
187
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
188
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
189
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
190
|
+
comply_scenario: creative_sync
|
|
191
|
+
stateful: true
|
|
192
|
+
expected: |
|
|
193
|
+
Both creatives accepted (action: created). Assignments are done in
|
|
194
|
+
the next step via update_media_buy.
|
|
195
|
+
|
|
196
|
+
sample_request:
|
|
197
|
+
account:
|
|
198
|
+
brand:
|
|
199
|
+
domain: "acmeoutdoor.example"
|
|
200
|
+
operator: "pinnacle-agency.example"
|
|
201
|
+
creatives:
|
|
202
|
+
- creative_id: "acme_card_banner_a"
|
|
203
|
+
name: "Acme Outdoor cardinality A"
|
|
204
|
+
format_id:
|
|
205
|
+
agent_url: "$context.format_agent_url"
|
|
206
|
+
id: "$context.format_id"
|
|
207
|
+
assets:
|
|
208
|
+
image:
|
|
209
|
+
asset_type: "image"
|
|
210
|
+
url: "https://cdn.pinnacle-agency.example/acme-card-a.png"
|
|
211
|
+
width: 300
|
|
212
|
+
height: 250
|
|
213
|
+
mime_type: "image/png"
|
|
214
|
+
- creative_id: "acme_card_banner_b"
|
|
215
|
+
name: "Acme Outdoor cardinality B"
|
|
216
|
+
format_id:
|
|
217
|
+
agent_url: "$context.format_agent_url"
|
|
218
|
+
id: "$context.format_id"
|
|
219
|
+
assets:
|
|
220
|
+
image:
|
|
221
|
+
asset_type: "image"
|
|
222
|
+
url: "https://cdn.pinnacle-agency.example/acme-card-b.png"
|
|
223
|
+
width: 300
|
|
224
|
+
height: 250
|
|
225
|
+
mime_type: "image/png"
|
|
226
|
+
idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_sync_creatives"
|
|
227
|
+
context:
|
|
228
|
+
correlation_id: "dependency_impairment_cardinality--sync_creatives"
|
|
229
|
+
validations:
|
|
230
|
+
- check: response_schema
|
|
231
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
232
|
+
- check: field_present
|
|
233
|
+
path: "creatives[0].creative_id"
|
|
234
|
+
description: "Creative A returned"
|
|
235
|
+
- check: field_present
|
|
236
|
+
path: "creatives[1].creative_id"
|
|
237
|
+
description: "Creative B returned"
|
|
238
|
+
|
|
239
|
+
- id: assign_creatives_to_packages
|
|
240
|
+
title: "Bind creative A → package_a and creative B → package_b"
|
|
241
|
+
narrative: |
|
|
242
|
+
The spec defines two equal canonical surfaces for the creative ↔
|
|
243
|
+
package binding: inline `sync_creatives.assignments[]` and
|
|
244
|
+
`update_media_buy.packages[].creative_assignments` (replacement
|
|
245
|
+
semantics). This scenario uses the update_media_buy surface; the
|
|
246
|
+
per-package impairment cardinality contract is identical regardless
|
|
247
|
+
of which path the buyer chose.
|
|
248
|
+
task: update_media_buy
|
|
249
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
250
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
251
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
252
|
+
stateful: true
|
|
253
|
+
expected: |
|
|
254
|
+
Update accepted. Each package's creative_assignments now contains
|
|
255
|
+
its respective creative.
|
|
256
|
+
|
|
257
|
+
sample_request:
|
|
258
|
+
account:
|
|
259
|
+
brand:
|
|
260
|
+
domain: "acmeoutdoor.example"
|
|
261
|
+
operator: "pinnacle-agency.example"
|
|
262
|
+
media_buy_id: "$context.media_buy_id"
|
|
263
|
+
packages:
|
|
264
|
+
- package_id: "$context.package_a_id"
|
|
265
|
+
creative_assignments:
|
|
266
|
+
- creative_id: "acme_card_banner_a"
|
|
267
|
+
- package_id: "$context.package_b_id"
|
|
268
|
+
creative_assignments:
|
|
269
|
+
- creative_id: "acme_card_banner_b"
|
|
270
|
+
idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_assign_creatives"
|
|
271
|
+
context:
|
|
272
|
+
correlation_id: "dependency_impairment_cardinality--assign_creatives"
|
|
273
|
+
validations:
|
|
274
|
+
- check: response_schema
|
|
275
|
+
description: "Response matches update-media-buy-response.json schema"
|
|
276
|
+
|
|
277
|
+
- id: force_both_approved
|
|
278
|
+
title: "Baseline: force both creatives to approved"
|
|
279
|
+
task: comply_test_controller
|
|
280
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
281
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
282
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
283
|
+
comply_scenario: full_sales_flow
|
|
284
|
+
stateful: true
|
|
285
|
+
expected: |
|
|
286
|
+
success: true. Creative A is at status: approved.
|
|
287
|
+
sample_request:
|
|
288
|
+
account:
|
|
289
|
+
sandbox: true
|
|
290
|
+
scenario: "force_creative_status"
|
|
291
|
+
params:
|
|
292
|
+
creative_id: "acme_card_banner_a"
|
|
293
|
+
status: "approved"
|
|
294
|
+
context:
|
|
295
|
+
correlation_id: "dependency_impairment_cardinality--force_a_approved"
|
|
296
|
+
validations:
|
|
297
|
+
- check: response_schema
|
|
298
|
+
description: "Response matches comply-test-controller-response.json schema"
|
|
299
|
+
- check: field_value
|
|
300
|
+
path: "success"
|
|
301
|
+
allowed_values: [true]
|
|
302
|
+
description: "Controller acknowledged the directive for creative A"
|
|
303
|
+
|
|
304
|
+
- id: force_b_approved
|
|
305
|
+
title: "Baseline (cont'd): force creative B to approved"
|
|
306
|
+
task: comply_test_controller
|
|
307
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
308
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
309
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
310
|
+
comply_scenario: full_sales_flow
|
|
311
|
+
stateful: true
|
|
312
|
+
expected: |
|
|
313
|
+
success: true. Creative B is at status: approved.
|
|
314
|
+
sample_request:
|
|
315
|
+
account:
|
|
316
|
+
sandbox: true
|
|
317
|
+
scenario: "force_creative_status"
|
|
318
|
+
params:
|
|
319
|
+
creative_id: "acme_card_banner_b"
|
|
320
|
+
status: "approved"
|
|
321
|
+
context:
|
|
322
|
+
correlation_id: "dependency_impairment_cardinality--force_b_approved"
|
|
323
|
+
validations:
|
|
324
|
+
- check: response_schema
|
|
325
|
+
description: "Response matches comply-test-controller-response.json schema"
|
|
326
|
+
- check: field_value
|
|
327
|
+
path: "success"
|
|
328
|
+
allowed_values: [true]
|
|
329
|
+
description: "Controller acknowledged the directive for creative B"
|
|
330
|
+
|
|
331
|
+
- id: baseline_healthy
|
|
332
|
+
title: "Read the buy — health: ok, impairments[] empty"
|
|
333
|
+
task: get_media_buys
|
|
334
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
335
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
336
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
337
|
+
comply_scenario: media_buy_lifecycle
|
|
338
|
+
stateful: true
|
|
339
|
+
expected: |
|
|
340
|
+
health: ok, impairments[] empty. Baseline cardinality is zero.
|
|
341
|
+
sample_request:
|
|
342
|
+
account:
|
|
343
|
+
brand:
|
|
344
|
+
domain: "acmeoutdoor.example"
|
|
345
|
+
operator: "pinnacle-agency.example"
|
|
346
|
+
media_buy_ids:
|
|
347
|
+
- "$context.media_buy_id"
|
|
348
|
+
context:
|
|
349
|
+
correlation_id: "dependency_impairment_cardinality--baseline_healthy"
|
|
350
|
+
validations:
|
|
351
|
+
- check: response_schema
|
|
352
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
353
|
+
- check: field_value
|
|
354
|
+
path: "media_buys[0].health"
|
|
355
|
+
allowed_values: ["ok"]
|
|
356
|
+
description: "Buy health is ok with both creatives approved"
|
|
357
|
+
- check: field_value_or_absent
|
|
358
|
+
path: "media_buys[0].impairments"
|
|
359
|
+
value: []
|
|
360
|
+
description: "impairments[] is empty (cardinality zero baseline)"
|
|
361
|
+
|
|
362
|
+
- id: reject_first_cardinality_one
|
|
363
|
+
title: "Reject creative A — impairments[] cardinality 1, scoped to package_a"
|
|
364
|
+
narrative: |
|
|
365
|
+
Force creative A to rejected. The buy MUST report exactly ONE
|
|
366
|
+
impairment entry, with resource_id matching A and package_ids
|
|
367
|
+
containing package_a only. A seller that inflates the impairment to
|
|
368
|
+
both packages (or emits an extra impairment for B) fails here.
|
|
369
|
+
|
|
370
|
+
steps:
|
|
371
|
+
- id: force_a_rejected
|
|
372
|
+
title: "Force creative A to rejected"
|
|
373
|
+
task: comply_test_controller
|
|
374
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
375
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
376
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
377
|
+
comply_scenario: creative_lifecycle
|
|
378
|
+
stateful: true
|
|
379
|
+
expected: |
|
|
380
|
+
success: true. Creative A is at status: rejected.
|
|
381
|
+
sample_request:
|
|
382
|
+
account:
|
|
383
|
+
sandbox: true
|
|
384
|
+
scenario: "force_creative_status"
|
|
385
|
+
params:
|
|
386
|
+
creative_id: "acme_card_banner_a"
|
|
387
|
+
status: "rejected"
|
|
388
|
+
rejection_reason: "Cardinality scenario: first rejection."
|
|
389
|
+
context:
|
|
390
|
+
correlation_id: "dependency_impairment_cardinality--force_a_rejected"
|
|
391
|
+
validations:
|
|
392
|
+
- check: response_schema
|
|
393
|
+
description: "Response matches comply-test-controller-response.json schema"
|
|
394
|
+
- check: field_value
|
|
395
|
+
path: "success"
|
|
396
|
+
allowed_values: [true]
|
|
397
|
+
description: "Controller acknowledged the rejection directive"
|
|
398
|
+
|
|
399
|
+
- id: verify_cardinality_one
|
|
400
|
+
title: "Read the buy — exactly one impairment, scoped to package_a"
|
|
401
|
+
task: get_media_buys
|
|
402
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
403
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
404
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
405
|
+
comply_scenario: media_buy_lifecycle
|
|
406
|
+
stateful: true
|
|
407
|
+
expected: |
|
|
408
|
+
health: impaired. impairments[0] present, resource_type creative,
|
|
409
|
+
resource_id acme_card_banner_a, package_ids contains package_a
|
|
410
|
+
only. impairments[1] MUST NOT be present — only one creative is
|
|
411
|
+
rejected.
|
|
412
|
+
sample_request:
|
|
413
|
+
account:
|
|
414
|
+
brand:
|
|
415
|
+
domain: "acmeoutdoor.example"
|
|
416
|
+
operator: "pinnacle-agency.example"
|
|
417
|
+
media_buy_ids:
|
|
418
|
+
- "$context.media_buy_id"
|
|
419
|
+
context:
|
|
420
|
+
correlation_id: "dependency_impairment_cardinality--verify_cardinality_one"
|
|
421
|
+
validations:
|
|
422
|
+
- check: response_schema
|
|
423
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
424
|
+
- check: field_value
|
|
425
|
+
path: "media_buys[0].health"
|
|
426
|
+
allowed_values: ["impaired"]
|
|
427
|
+
description: "Buy health flipped to impaired"
|
|
428
|
+
- check: field_present
|
|
429
|
+
path: "media_buys[0].impairments[0]"
|
|
430
|
+
description: "First impairment entry present"
|
|
431
|
+
- check: field_value
|
|
432
|
+
path: "media_buys[0].impairments[0].resource_id"
|
|
433
|
+
value: "acme_card_banner_a"
|
|
434
|
+
description: "Impairment[0] points at creative A (not B)"
|
|
435
|
+
- check: field_value
|
|
436
|
+
path: "media_buys[0].impairments[0].package_ids[0]"
|
|
437
|
+
value: "$context.package_a_id"
|
|
438
|
+
description: "Impairment[0].package_ids contains package_a — scope is per-resource, not per-buy. A seller emitting [package_a, package_b] when only A is rejected fails here."
|
|
439
|
+
# Cardinality enforcement note (adcp#4685 expert review): the
|
|
440
|
+
# exact-count assertion (no second entry) is not directly checkable
|
|
441
|
+
# with the current check vocabulary — `field_value_or_absent value:
|
|
442
|
+
# null` would pass on a seller emitting a literal-null padding,
|
|
443
|
+
# which is unsound. Exact cardinality is enforced by the
|
|
444
|
+
# cross-resource invariant (over-emission produces an impairment
|
|
445
|
+
# whose referenced resource is not offline, failing the forward
|
|
446
|
+
# rule). Direct array-length assertion lands when the runner adds
|
|
447
|
+
# an `array_length` check kind — tracked in a follow-up.
|
|
448
|
+
|
|
449
|
+
- id: reject_second_cardinality_two
|
|
450
|
+
title: "Reject creative B — impairments[] grows to cardinality 2"
|
|
451
|
+
narrative: |
|
|
452
|
+
Force creative B to rejected. The buy MUST report exactly TWO
|
|
453
|
+
impairment entries, one per creative, each scoped to its own package.
|
|
454
|
+
The assertion fails if the seller merges them, drops one, or
|
|
455
|
+
inflates either's package scope.
|
|
456
|
+
|
|
457
|
+
steps:
|
|
458
|
+
- id: force_b_rejected
|
|
459
|
+
title: "Force creative B to rejected"
|
|
460
|
+
task: comply_test_controller
|
|
461
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
462
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
463
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
464
|
+
comply_scenario: creative_lifecycle
|
|
465
|
+
stateful: true
|
|
466
|
+
expected: |
|
|
467
|
+
success: true. Creative B is at status: rejected.
|
|
468
|
+
sample_request:
|
|
469
|
+
account:
|
|
470
|
+
sandbox: true
|
|
471
|
+
scenario: "force_creative_status"
|
|
472
|
+
params:
|
|
473
|
+
creative_id: "acme_card_banner_b"
|
|
474
|
+
status: "rejected"
|
|
475
|
+
rejection_reason: "Cardinality scenario: second rejection."
|
|
476
|
+
context:
|
|
477
|
+
correlation_id: "dependency_impairment_cardinality--force_b_rejected"
|
|
478
|
+
validations:
|
|
479
|
+
- check: response_schema
|
|
480
|
+
description: "Response matches comply-test-controller-response.json schema"
|
|
481
|
+
- check: field_value
|
|
482
|
+
path: "success"
|
|
483
|
+
allowed_values: [true]
|
|
484
|
+
description: "Controller acknowledged the rejection directive"
|
|
485
|
+
|
|
486
|
+
- id: verify_cardinality_two
|
|
487
|
+
title: "Read the buy — exactly two impairments, one per creative"
|
|
488
|
+
task: get_media_buys
|
|
489
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
490
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
491
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
492
|
+
comply_scenario: media_buy_lifecycle
|
|
493
|
+
stateful: true
|
|
494
|
+
expected: |
|
|
495
|
+
health: impaired. impairments[] has exactly two entries — one for
|
|
496
|
+
A on package_a, one for B on package_b. Order is unspecified but
|
|
497
|
+
both entries MUST be present and correctly scoped.
|
|
498
|
+
sample_request:
|
|
499
|
+
account:
|
|
500
|
+
brand:
|
|
501
|
+
domain: "acmeoutdoor.example"
|
|
502
|
+
operator: "pinnacle-agency.example"
|
|
503
|
+
media_buy_ids:
|
|
504
|
+
- "$context.media_buy_id"
|
|
505
|
+
context:
|
|
506
|
+
correlation_id: "dependency_impairment_cardinality--verify_cardinality_two"
|
|
507
|
+
validations:
|
|
508
|
+
- check: response_schema
|
|
509
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
510
|
+
- check: field_value
|
|
511
|
+
path: "media_buys[0].health"
|
|
512
|
+
allowed_values: ["impaired"]
|
|
513
|
+
description: "Buy health remains impaired with both creatives rejected"
|
|
514
|
+
- check: field_present
|
|
515
|
+
path: "media_buys[0].impairments[0]"
|
|
516
|
+
description: "First impairment entry present"
|
|
517
|
+
- check: field_present
|
|
518
|
+
path: "media_buys[0].impairments[1]"
|
|
519
|
+
description: "Second impairment entry present — cardinality 2"
|
|
520
|
+
# Cardinality at 2: same enforcement story as the prior phase —
|
|
521
|
+
# exact-count enforcement comes from the cross-resource invariant
|
|
522
|
+
# via the forward rule. Over-emitting a third entry would point at
|
|
523
|
+
# a creative that isn't offline, failing the invariant.
|
|
524
|
+
|
|
525
|
+
- id: recover_first_via_swap
|
|
526
|
+
title: "Swap package_a's binding to a fresh creative C — cardinality back to 1"
|
|
527
|
+
narrative: |
|
|
528
|
+
Sync creative C (approved), then update_media_buy to swap
|
|
529
|
+
package_a's creative_assignments from A → C. Creative A stays rejected
|
|
530
|
+
in the library but is no longer a dependency of package_a. Read the
|
|
531
|
+
buy: impairments[] shrinks to exactly one entry (B on package_b);
|
|
532
|
+
A's impairment cleared.
|
|
533
|
+
|
|
534
|
+
steps:
|
|
535
|
+
- id: sync_replacement_c
|
|
536
|
+
title: "Sync replacement creative C"
|
|
537
|
+
task: sync_creatives
|
|
538
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
539
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
540
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
541
|
+
comply_scenario: creative_sync
|
|
542
|
+
stateful: true
|
|
543
|
+
expected: |
|
|
544
|
+
Replacement creative C accepted into the library.
|
|
545
|
+
sample_request:
|
|
546
|
+
account:
|
|
547
|
+
brand:
|
|
548
|
+
domain: "acmeoutdoor.example"
|
|
549
|
+
operator: "pinnacle-agency.example"
|
|
550
|
+
creatives:
|
|
551
|
+
- creative_id: "acme_card_banner_c"
|
|
552
|
+
name: "Acme Outdoor cardinality C"
|
|
553
|
+
format_id:
|
|
554
|
+
agent_url: "$context.format_agent_url"
|
|
555
|
+
id: "$context.format_id"
|
|
556
|
+
assets:
|
|
557
|
+
image:
|
|
558
|
+
asset_type: "image"
|
|
559
|
+
url: "https://cdn.pinnacle-agency.example/acme-card-c.png"
|
|
560
|
+
width: 300
|
|
561
|
+
height: 250
|
|
562
|
+
mime_type: "image/png"
|
|
563
|
+
idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_sync_c"
|
|
564
|
+
context:
|
|
565
|
+
correlation_id: "dependency_impairment_cardinality--sync_replacement_c"
|
|
566
|
+
validations:
|
|
567
|
+
- check: response_schema
|
|
568
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
569
|
+
- check: field_present
|
|
570
|
+
path: "creatives[0].creative_id"
|
|
571
|
+
description: "Replacement creative C returned"
|
|
572
|
+
|
|
573
|
+
- id: force_c_approved
|
|
574
|
+
title: "Force creative C to approved"
|
|
575
|
+
task: comply_test_controller
|
|
576
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
577
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
578
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
579
|
+
comply_scenario: full_sales_flow
|
|
580
|
+
stateful: true
|
|
581
|
+
expected: |
|
|
582
|
+
success: true.
|
|
583
|
+
sample_request:
|
|
584
|
+
account:
|
|
585
|
+
sandbox: true
|
|
586
|
+
scenario: "force_creative_status"
|
|
587
|
+
params:
|
|
588
|
+
creative_id: "acme_card_banner_c"
|
|
589
|
+
status: "approved"
|
|
590
|
+
context:
|
|
591
|
+
correlation_id: "dependency_impairment_cardinality--force_c_approved"
|
|
592
|
+
validations:
|
|
593
|
+
- check: response_schema
|
|
594
|
+
description: "Response matches comply-test-controller-response.json schema"
|
|
595
|
+
- check: field_value
|
|
596
|
+
path: "success"
|
|
597
|
+
allowed_values: [true]
|
|
598
|
+
description: "Controller acknowledged the directive"
|
|
599
|
+
|
|
600
|
+
- id: swap_package_a
|
|
601
|
+
title: "update_media_buy — swap package_a's creative_assignments to C"
|
|
602
|
+
task: update_media_buy
|
|
603
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
604
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
605
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
606
|
+
comply_scenario: media_buy_lifecycle
|
|
607
|
+
stateful: true
|
|
608
|
+
expected: |
|
|
609
|
+
The seller accepts the package update. Replacement semantics: the
|
|
610
|
+
new list (just C) fully replaces the old (just A) for package_a.
|
|
611
|
+
sample_request:
|
|
612
|
+
account:
|
|
613
|
+
brand:
|
|
614
|
+
domain: "acmeoutdoor.example"
|
|
615
|
+
operator: "pinnacle-agency.example"
|
|
616
|
+
media_buy_id: "$context.media_buy_id"
|
|
617
|
+
packages:
|
|
618
|
+
- package_id: "$context.package_a_id"
|
|
619
|
+
creative_assignments:
|
|
620
|
+
- creative_id: "acme_card_banner_c"
|
|
621
|
+
idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_swap_a"
|
|
622
|
+
context:
|
|
623
|
+
correlation_id: "dependency_impairment_cardinality--swap_package_a"
|
|
624
|
+
validations:
|
|
625
|
+
- check: response_schema
|
|
626
|
+
description: "Response matches update-media-buy-response.json schema"
|
|
627
|
+
|
|
628
|
+
- id: verify_cardinality_back_to_one
|
|
629
|
+
title: "Read the buy — exactly one impairment remaining (B on package_b)"
|
|
630
|
+
task: get_media_buys
|
|
631
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
632
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
633
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
634
|
+
comply_scenario: media_buy_lifecycle
|
|
635
|
+
stateful: true
|
|
636
|
+
expected: |
|
|
637
|
+
health: impaired (B still rejected and assigned to package_b).
|
|
638
|
+
impairments[0] present, resource_id B, package_ids contains
|
|
639
|
+
package_b. impairments[1] MUST NOT exist — the swap cleared A's
|
|
640
|
+
impairment. A seller that holds both entries fails the inverse
|
|
641
|
+
rule's decrement direction.
|
|
642
|
+
sample_request:
|
|
643
|
+
account:
|
|
644
|
+
brand:
|
|
645
|
+
domain: "acmeoutdoor.example"
|
|
646
|
+
operator: "pinnacle-agency.example"
|
|
647
|
+
media_buy_ids:
|
|
648
|
+
- "$context.media_buy_id"
|
|
649
|
+
context:
|
|
650
|
+
correlation_id: "dependency_impairment_cardinality--verify_back_to_one"
|
|
651
|
+
validations:
|
|
652
|
+
- check: response_schema
|
|
653
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
654
|
+
- check: field_value
|
|
655
|
+
path: "media_buys[0].health"
|
|
656
|
+
allowed_values: ["impaired"]
|
|
657
|
+
description: "Buy health is still impaired — B remains rejected and assigned to package_b"
|
|
658
|
+
- check: field_present
|
|
659
|
+
path: "media_buys[0].impairments[0]"
|
|
660
|
+
description: "Exactly one impairment entry remains"
|
|
661
|
+
- check: field_value
|
|
662
|
+
path: "media_buys[0].impairments[0].resource_id"
|
|
663
|
+
value: "acme_card_banner_b"
|
|
664
|
+
description: "Remaining impairment points at creative B (not A — A is no longer a dependency after the swap)"
|
|
665
|
+
- check: field_value_or_absent
|
|
666
|
+
path: "media_buys[0].impairments[1]"
|
|
667
|
+
value: null
|
|
668
|
+
description: "impairments[1] MUST NOT exist — the swap recovered A's dependency; only B remains rejected. Cardinality decrement check."
|
|
669
|
+
|
|
670
|
+
- id: recover_second_via_swap
|
|
671
|
+
title: "Swap package_b's binding to a fresh creative D — cardinality back to 0"
|
|
672
|
+
narrative: |
|
|
673
|
+
Sync creative D (approved), swap package_b's binding from B → D, read
|
|
674
|
+
the buy: impairments[] empty, health: ok. Full cardinality round-trip
|
|
675
|
+
0 → 1 → 2 → 1 → 0.
|
|
676
|
+
|
|
677
|
+
steps:
|
|
678
|
+
- id: sync_replacement_d
|
|
679
|
+
title: "Sync replacement creative D"
|
|
680
|
+
task: sync_creatives
|
|
681
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
682
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
683
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
684
|
+
comply_scenario: creative_sync
|
|
685
|
+
stateful: true
|
|
686
|
+
expected: |
|
|
687
|
+
Replacement creative D accepted into the library.
|
|
688
|
+
sample_request:
|
|
689
|
+
account:
|
|
690
|
+
brand:
|
|
691
|
+
domain: "acmeoutdoor.example"
|
|
692
|
+
operator: "pinnacle-agency.example"
|
|
693
|
+
creatives:
|
|
694
|
+
- creative_id: "acme_card_banner_d"
|
|
695
|
+
name: "Acme Outdoor cardinality D"
|
|
696
|
+
format_id:
|
|
697
|
+
agent_url: "$context.format_agent_url"
|
|
698
|
+
id: "$context.format_id"
|
|
699
|
+
assets:
|
|
700
|
+
image:
|
|
701
|
+
asset_type: "image"
|
|
702
|
+
url: "https://cdn.pinnacle-agency.example/acme-card-d.png"
|
|
703
|
+
width: 300
|
|
704
|
+
height: 250
|
|
705
|
+
mime_type: "image/png"
|
|
706
|
+
idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_sync_d"
|
|
707
|
+
context:
|
|
708
|
+
correlation_id: "dependency_impairment_cardinality--sync_replacement_d"
|
|
709
|
+
validations:
|
|
710
|
+
- check: response_schema
|
|
711
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
712
|
+
- check: field_present
|
|
713
|
+
path: "creatives[0].creative_id"
|
|
714
|
+
description: "Replacement creative D returned"
|
|
715
|
+
|
|
716
|
+
- id: force_d_approved
|
|
717
|
+
title: "Force creative D to approved"
|
|
718
|
+
task: comply_test_controller
|
|
719
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
720
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
721
|
+
doc_ref: "/building/implementation/comply-test-controller"
|
|
722
|
+
comply_scenario: full_sales_flow
|
|
723
|
+
stateful: true
|
|
724
|
+
expected: |
|
|
725
|
+
success: true.
|
|
726
|
+
sample_request:
|
|
727
|
+
account:
|
|
728
|
+
sandbox: true
|
|
729
|
+
scenario: "force_creative_status"
|
|
730
|
+
params:
|
|
731
|
+
creative_id: "acme_card_banner_d"
|
|
732
|
+
status: "approved"
|
|
733
|
+
context:
|
|
734
|
+
correlation_id: "dependency_impairment_cardinality--force_d_approved"
|
|
735
|
+
validations:
|
|
736
|
+
- check: response_schema
|
|
737
|
+
description: "Response matches comply-test-controller-response.json schema"
|
|
738
|
+
- check: field_value
|
|
739
|
+
path: "success"
|
|
740
|
+
allowed_values: [true]
|
|
741
|
+
description: "Controller acknowledged the directive"
|
|
742
|
+
|
|
743
|
+
- id: swap_package_b
|
|
744
|
+
title: "update_media_buy — swap package_b's creative_assignments to D"
|
|
745
|
+
task: update_media_buy
|
|
746
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
747
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
748
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
749
|
+
comply_scenario: media_buy_lifecycle
|
|
750
|
+
stateful: true
|
|
751
|
+
expected: |
|
|
752
|
+
The seller accepts the swap.
|
|
753
|
+
sample_request:
|
|
754
|
+
account:
|
|
755
|
+
brand:
|
|
756
|
+
domain: "acmeoutdoor.example"
|
|
757
|
+
operator: "pinnacle-agency.example"
|
|
758
|
+
media_buy_id: "$context.media_buy_id"
|
|
759
|
+
packages:
|
|
760
|
+
- package_id: "$context.package_b_id"
|
|
761
|
+
creative_assignments:
|
|
762
|
+
- creative_id: "acme_card_banner_d"
|
|
763
|
+
idempotency_key: "$generate:uuid_v4#dependency_impairment_cardinality_swap_b"
|
|
764
|
+
context:
|
|
765
|
+
correlation_id: "dependency_impairment_cardinality--swap_package_b"
|
|
766
|
+
validations:
|
|
767
|
+
- check: response_schema
|
|
768
|
+
description: "Response matches update-media-buy-response.json schema"
|
|
769
|
+
|
|
770
|
+
- id: verify_cardinality_zero
|
|
771
|
+
title: "Read the buy — impairments[] cleared, health: ok"
|
|
772
|
+
task: get_media_buys
|
|
773
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
774
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
775
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
776
|
+
comply_scenario: media_buy_lifecycle
|
|
777
|
+
stateful: true
|
|
778
|
+
expected: |
|
|
779
|
+
health: ok (both rejected creatives no longer dependencies of the
|
|
780
|
+
buy). impairments[] empty. Cardinality back to zero.
|
|
781
|
+
sample_request:
|
|
782
|
+
account:
|
|
783
|
+
brand:
|
|
784
|
+
domain: "acmeoutdoor.example"
|
|
785
|
+
operator: "pinnacle-agency.example"
|
|
786
|
+
media_buy_ids:
|
|
787
|
+
- "$context.media_buy_id"
|
|
788
|
+
context:
|
|
789
|
+
correlation_id: "dependency_impairment_cardinality--verify_cardinality_zero"
|
|
790
|
+
validations:
|
|
791
|
+
- check: response_schema
|
|
792
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
793
|
+
- check: field_value
|
|
794
|
+
path: "media_buys[0].health"
|
|
795
|
+
allowed_values: ["ok"]
|
|
796
|
+
description: "Buy health returned to ok after both creatives swapped out"
|
|
797
|
+
- check: field_value_or_absent
|
|
798
|
+
path: "media_buys[0].impairments"
|
|
799
|
+
value: []
|
|
800
|
+
description: "impairments[] empty — cardinality back to zero"
|