@adcp/sdk 7.11.0 → 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/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +23 -0
- 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/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
id: wholesale_feed_bulk_webhooks
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Wholesale feed bulk-change webhook registration"
|
|
4
|
+
category: account_lifecycle
|
|
5
|
+
summary: "Validates account-level notification_configs[] registration for agents that advertise wholesale_feed.bulk_change webhook events."
|
|
6
|
+
track: core
|
|
7
|
+
introduced_in: "3.1"
|
|
8
|
+
|
|
9
|
+
requires_capability:
|
|
10
|
+
path: wholesale_feed_webhooks.event_types
|
|
11
|
+
contains: "wholesale_feed.bulk_change"
|
|
12
|
+
|
|
13
|
+
required_tools:
|
|
14
|
+
- sync_accounts
|
|
15
|
+
|
|
16
|
+
narrative: |
|
|
17
|
+
Agents that advertise the bulk-change wholesale feed webhook event must accept
|
|
18
|
+
that account-level event type through `sync_accounts.accounts[].notification_configs[]`.
|
|
19
|
+
The event tells consumers to repair by re-reading the affected wholesale feed.
|
|
20
|
+
|
|
21
|
+
agent:
|
|
22
|
+
interaction_model: marketplace_catalog
|
|
23
|
+
capabilities:
|
|
24
|
+
- wholesale_feed_webhooks
|
|
25
|
+
|
|
26
|
+
caller:
|
|
27
|
+
role: buyer_agent
|
|
28
|
+
example: "Compliance test harness"
|
|
29
|
+
|
|
30
|
+
prerequisites:
|
|
31
|
+
description: |
|
|
32
|
+
The agent advertises `wholesale_feed.bulk_change` in
|
|
33
|
+
`wholesale_feed_webhooks.event_types`.
|
|
34
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
35
|
+
|
|
36
|
+
phases:
|
|
37
|
+
- id: register
|
|
38
|
+
title: "Register bulk-change webhook"
|
|
39
|
+
steps:
|
|
40
|
+
- id: register_bulk_change_webhook
|
|
41
|
+
title: "Register wholesale_feed.bulk_change subscriber"
|
|
42
|
+
task: sync_accounts
|
|
43
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
44
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
45
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
46
|
+
stateful: true
|
|
47
|
+
sample_request:
|
|
48
|
+
accounts:
|
|
49
|
+
- brand:
|
|
50
|
+
domain: "acmeoutdoor.example"
|
|
51
|
+
operator: "pinnacle-agency.example"
|
|
52
|
+
billing: "operator"
|
|
53
|
+
payment_terms: "net_60"
|
|
54
|
+
sandbox: true
|
|
55
|
+
notification_configs:
|
|
56
|
+
- subscriber_id: "bulk-feed-sync"
|
|
57
|
+
url: "https://example.com/webhooks/adcp/bulk-feed"
|
|
58
|
+
event_types:
|
|
59
|
+
- "wholesale_feed.bulk_change"
|
|
60
|
+
active: false
|
|
61
|
+
idempotency_key: "$generate:uuid_v4#wholesale_feed_bulk_webhooks"
|
|
62
|
+
context:
|
|
63
|
+
correlation_id: "wholesale_feed_bulk_webhooks--register"
|
|
64
|
+
validations:
|
|
65
|
+
- check: response_schema
|
|
66
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
67
|
+
- check: field_value
|
|
68
|
+
path: "accounts[0].notification_configs[0].subscriber_id"
|
|
69
|
+
value: "bulk-feed-sync"
|
|
70
|
+
description: "Subscriber key is echoed"
|
|
71
|
+
- check: field_value
|
|
72
|
+
path: "accounts[0].notification_configs[0].event_types[0]"
|
|
73
|
+
value: "wholesale_feed.bulk_change"
|
|
74
|
+
description: "Bulk-change event is persisted"
|
|
75
|
+
- check: field_value
|
|
76
|
+
path: "accounts[0].notification_configs[0].active"
|
|
77
|
+
value: false
|
|
78
|
+
description: "Paused subscriber can be persisted without activation proof"
|
|
79
|
+
- check: field_value
|
|
80
|
+
path: "context.correlation_id"
|
|
81
|
+
value: "wholesale_feed_bulk_webhooks--register"
|
|
82
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
id: wholesale_feed_product_webhooks
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Wholesale product feed webhook registration"
|
|
4
|
+
category: account_lifecycle
|
|
5
|
+
summary: "Validates account-level notification_configs[] registration for agents that advertise product wholesale feed webhook events."
|
|
6
|
+
track: media_buy
|
|
7
|
+
introduced_in: "3.1"
|
|
8
|
+
|
|
9
|
+
requires_capability:
|
|
10
|
+
path: wholesale_feed_webhooks.event_types
|
|
11
|
+
contains: "product.priced"
|
|
12
|
+
|
|
13
|
+
required_tools:
|
|
14
|
+
- sync_accounts
|
|
15
|
+
|
|
16
|
+
narrative: |
|
|
17
|
+
Agents that advertise product wholesale feed webhook events must accept those
|
|
18
|
+
account-level event types through `sync_accounts.accounts[].notification_configs[]`.
|
|
19
|
+
Delivery semantics are covered by webhook-emission; this storyboard checks the
|
|
20
|
+
durable registration surface.
|
|
21
|
+
|
|
22
|
+
agent:
|
|
23
|
+
interaction_model: media_buy_seller
|
|
24
|
+
capabilities:
|
|
25
|
+
- wholesale_feed_webhooks
|
|
26
|
+
|
|
27
|
+
caller:
|
|
28
|
+
role: buyer_agent
|
|
29
|
+
example: "Compliance test harness"
|
|
30
|
+
|
|
31
|
+
prerequisites:
|
|
32
|
+
description: |
|
|
33
|
+
The agent advertises `product.priced` in
|
|
34
|
+
`wholesale_feed_webhooks.event_types`.
|
|
35
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
36
|
+
|
|
37
|
+
phases:
|
|
38
|
+
- id: register
|
|
39
|
+
title: "Register product feed webhook"
|
|
40
|
+
steps:
|
|
41
|
+
- id: register_product_pricing_webhook
|
|
42
|
+
title: "Register product.priced subscriber"
|
|
43
|
+
task: sync_accounts
|
|
44
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
45
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
46
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
47
|
+
stateful: true
|
|
48
|
+
sample_request:
|
|
49
|
+
accounts:
|
|
50
|
+
- brand:
|
|
51
|
+
domain: "acmeoutdoor.example"
|
|
52
|
+
operator: "pinnacle-agency.example"
|
|
53
|
+
billing: "operator"
|
|
54
|
+
payment_terms: "net_60"
|
|
55
|
+
sandbox: true
|
|
56
|
+
notification_configs:
|
|
57
|
+
- subscriber_id: "product-feed-sync"
|
|
58
|
+
url: "https://example.com/webhooks/adcp/product-feed"
|
|
59
|
+
event_types:
|
|
60
|
+
- "product.priced"
|
|
61
|
+
active: false
|
|
62
|
+
idempotency_key: "$generate:uuid_v4#wholesale_feed_product_webhooks"
|
|
63
|
+
context:
|
|
64
|
+
correlation_id: "wholesale_feed_product_webhooks--register"
|
|
65
|
+
validations:
|
|
66
|
+
- check: response_schema
|
|
67
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
68
|
+
- check: field_value
|
|
69
|
+
path: "accounts[0].notification_configs[0].subscriber_id"
|
|
70
|
+
value: "product-feed-sync"
|
|
71
|
+
description: "Subscriber key is echoed"
|
|
72
|
+
- check: field_value
|
|
73
|
+
path: "accounts[0].notification_configs[0].event_types[0]"
|
|
74
|
+
value: "product.priced"
|
|
75
|
+
description: "Product pricing event is persisted"
|
|
76
|
+
- check: field_value
|
|
77
|
+
path: "accounts[0].notification_configs[0].active"
|
|
78
|
+
value: false
|
|
79
|
+
description: "Paused subscriber can be persisted without activation proof"
|
|
80
|
+
- check: field_value
|
|
81
|
+
path: "context.correlation_id"
|
|
82
|
+
value: "wholesale_feed_product_webhooks--register"
|
|
83
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
id: wholesale_feed_products
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Wholesale product feed versioning"
|
|
4
|
+
category: marketplace_catalog
|
|
5
|
+
summary: "Validates get_products wholesale feed versioning: bootstrap responses carry wholesale_feed_version/cache_scope and matching if_wholesale_feed_version probes return unchanged without product rows."
|
|
6
|
+
track: media_buy
|
|
7
|
+
introduced_in: "3.1"
|
|
8
|
+
|
|
9
|
+
requires_capability:
|
|
10
|
+
path: wholesale_feed_versioning.supported
|
|
11
|
+
equals: true
|
|
12
|
+
|
|
13
|
+
required_tools:
|
|
14
|
+
- get_products
|
|
15
|
+
|
|
16
|
+
narrative: |
|
|
17
|
+
Sellers that advertise wholesale feed versioning and expose `get_products`
|
|
18
|
+
must support the beta.4 conditional-fetch shape for wholesale product mirrors:
|
|
19
|
+
`wholesale_feed_version`, `if_wholesale_feed_version`, `cache_scope`, and
|
|
20
|
+
`unchanged: true`. This storyboard does not require the optional separate
|
|
21
|
+
`pricing_version` layer or account-specific cache overlays.
|
|
22
|
+
|
|
23
|
+
agent:
|
|
24
|
+
interaction_model: media_buy_seller
|
|
25
|
+
capabilities:
|
|
26
|
+
- wholesale_feed_versioning
|
|
27
|
+
examples:
|
|
28
|
+
- "Sales agents with a wholesale product feed"
|
|
29
|
+
|
|
30
|
+
caller:
|
|
31
|
+
role: buyer_agent
|
|
32
|
+
example: "Compliance test harness"
|
|
33
|
+
|
|
34
|
+
prerequisites:
|
|
35
|
+
description: |
|
|
36
|
+
The agent advertises `wholesale_feed_versioning.supported: true` and exposes
|
|
37
|
+
`get_products`.
|
|
38
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
39
|
+
controller_seeding: false
|
|
40
|
+
|
|
41
|
+
phases:
|
|
42
|
+
- id: conditional_fetch
|
|
43
|
+
title: "Bootstrap and probe product feed"
|
|
44
|
+
steps:
|
|
45
|
+
- id: bootstrap_products
|
|
46
|
+
title: "Bootstrap product feed"
|
|
47
|
+
task: get_products
|
|
48
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
49
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
50
|
+
doc_ref: "/media-buy/tasks/get_products"
|
|
51
|
+
stateful: true
|
|
52
|
+
context_outputs:
|
|
53
|
+
- name: product_wholesale_feed_version
|
|
54
|
+
path: "wholesale_feed_version"
|
|
55
|
+
expected: |
|
|
56
|
+
Return product rows with wholesale feed metadata.
|
|
57
|
+
sample_request:
|
|
58
|
+
buying_mode: "wholesale"
|
|
59
|
+
account:
|
|
60
|
+
brand:
|
|
61
|
+
domain: "acmeoutdoor.example"
|
|
62
|
+
operator: "pinnacle-agency.example"
|
|
63
|
+
context:
|
|
64
|
+
correlation_id: "wholesale_feed_products--bootstrap"
|
|
65
|
+
validations:
|
|
66
|
+
- check: response_schema
|
|
67
|
+
description: "Response matches get-products-response.json schema"
|
|
68
|
+
- check: field_present
|
|
69
|
+
path: "products[0].product_id"
|
|
70
|
+
description: "Bootstrap returns product rows"
|
|
71
|
+
- check: field_present
|
|
72
|
+
path: "wholesale_feed_version"
|
|
73
|
+
description: "Bootstrap returns an opaque feed token"
|
|
74
|
+
- check: field_value
|
|
75
|
+
path: "cache_scope"
|
|
76
|
+
value: "public"
|
|
77
|
+
description: "Ordinary account reads may use the public cache layer"
|
|
78
|
+
- check: field_absent
|
|
79
|
+
path: "proposals[0].proposal_id"
|
|
80
|
+
description: "Wholesale mode returns raw feed rows, not curated proposals"
|
|
81
|
+
- check: field_value
|
|
82
|
+
path: "context.correlation_id"
|
|
83
|
+
value: "wholesale_feed_products--bootstrap"
|
|
84
|
+
description: "Context correlation_id returned unchanged"
|
|
85
|
+
|
|
86
|
+
- id: unchanged_probe
|
|
87
|
+
title: "Probe unchanged product feed"
|
|
88
|
+
task: get_products
|
|
89
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
90
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
91
|
+
doc_ref: "/media-buy/tasks/get_products"
|
|
92
|
+
stateful: true
|
|
93
|
+
expected: |
|
|
94
|
+
Return unchanged without resending product rows when the feed token matches.
|
|
95
|
+
sample_request:
|
|
96
|
+
buying_mode: "wholesale"
|
|
97
|
+
account:
|
|
98
|
+
brand:
|
|
99
|
+
domain: "acmeoutdoor.example"
|
|
100
|
+
operator: "pinnacle-agency.example"
|
|
101
|
+
if_wholesale_feed_version: "$context.product_wholesale_feed_version"
|
|
102
|
+
context:
|
|
103
|
+
correlation_id: "wholesale_feed_products--unchanged"
|
|
104
|
+
validations:
|
|
105
|
+
- check: response_schema
|
|
106
|
+
description: "Response matches get-products-response.json schema"
|
|
107
|
+
- check: field_value
|
|
108
|
+
path: "unchanged"
|
|
109
|
+
value: true
|
|
110
|
+
description: "Matching token produces the cheap unchanged response"
|
|
111
|
+
- check: field_equals_context
|
|
112
|
+
path: "wholesale_feed_version"
|
|
113
|
+
context_key: "product_wholesale_feed_version"
|
|
114
|
+
description: "Unchanged response echoes the current product feed token"
|
|
115
|
+
- check: field_value
|
|
116
|
+
path: "cache_scope"
|
|
117
|
+
value: "public"
|
|
118
|
+
description: "Unchanged response carries cache scope"
|
|
119
|
+
- check: field_absent
|
|
120
|
+
path: "products[0].product_id"
|
|
121
|
+
description: "Unchanged response omits product rows"
|
|
122
|
+
- check: field_value
|
|
123
|
+
path: "context.correlation_id"
|
|
124
|
+
value: "wholesale_feed_products--unchanged"
|
|
125
|
+
description: "Context correlation_id returned unchanged"
|
|
126
|
+
|
|
127
|
+
- id: standalone_pricing_token_rejected
|
|
128
|
+
title: "Reject standalone product pricing token"
|
|
129
|
+
task: get_products
|
|
130
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
131
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
132
|
+
doc_ref: "/media-buy/tasks/get_products"
|
|
133
|
+
expect_error: true
|
|
134
|
+
negative_path: payload_well_formed
|
|
135
|
+
sample_request_skip_schema: true
|
|
136
|
+
stateful: true
|
|
137
|
+
expected: |
|
|
138
|
+
Reject if_pricing_version when if_wholesale_feed_version is absent.
|
|
139
|
+
sample_request:
|
|
140
|
+
buying_mode: "wholesale"
|
|
141
|
+
account:
|
|
142
|
+
brand:
|
|
143
|
+
domain: "acmeoutdoor.example"
|
|
144
|
+
operator: "pinnacle-agency.example"
|
|
145
|
+
if_pricing_version: "stale-pricing-token"
|
|
146
|
+
context:
|
|
147
|
+
correlation_id: "wholesale_feed_products--standalone_pricing"
|
|
148
|
+
validations:
|
|
149
|
+
- check: error_code
|
|
150
|
+
value: "INVALID_REQUEST"
|
|
151
|
+
description: "Standalone if_pricing_version is rejected"
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
id: wholesale_feed_signal_webhooks
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Wholesale signals feed webhook registration"
|
|
4
|
+
category: account_lifecycle
|
|
5
|
+
summary: "Validates account-level notification_configs[] registration for agents that advertise signal wholesale feed webhook events."
|
|
6
|
+
track: signals
|
|
7
|
+
introduced_in: "3.1"
|
|
8
|
+
|
|
9
|
+
requires_capability:
|
|
10
|
+
path: wholesale_feed_webhooks.event_types
|
|
11
|
+
contains: "signal.priced"
|
|
12
|
+
|
|
13
|
+
required_tools:
|
|
14
|
+
- sync_accounts
|
|
15
|
+
|
|
16
|
+
narrative: |
|
|
17
|
+
Agents that advertise signal wholesale feed webhook events must accept those
|
|
18
|
+
account-level event types through `sync_accounts.accounts[].notification_configs[]`.
|
|
19
|
+
Delivery semantics are covered by webhook-emission; this storyboard checks the
|
|
20
|
+
durable registration surface.
|
|
21
|
+
|
|
22
|
+
agent:
|
|
23
|
+
interaction_model: signals_agent
|
|
24
|
+
capabilities:
|
|
25
|
+
- wholesale_feed_webhooks
|
|
26
|
+
|
|
27
|
+
caller:
|
|
28
|
+
role: buyer_agent
|
|
29
|
+
example: "Compliance test harness"
|
|
30
|
+
|
|
31
|
+
prerequisites:
|
|
32
|
+
description: |
|
|
33
|
+
The agent advertises `signal.priced` in
|
|
34
|
+
`wholesale_feed_webhooks.event_types`.
|
|
35
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
36
|
+
|
|
37
|
+
phases:
|
|
38
|
+
- id: register
|
|
39
|
+
title: "Register signals feed webhook"
|
|
40
|
+
steps:
|
|
41
|
+
- id: register_signal_pricing_webhook
|
|
42
|
+
title: "Register signal.priced subscriber"
|
|
43
|
+
task: sync_accounts
|
|
44
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
45
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
46
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
47
|
+
stateful: true
|
|
48
|
+
sample_request:
|
|
49
|
+
accounts:
|
|
50
|
+
- brand:
|
|
51
|
+
domain: "acmeoutdoor.example"
|
|
52
|
+
operator: "pinnacle-agency.example"
|
|
53
|
+
billing: "operator"
|
|
54
|
+
payment_terms: "net_60"
|
|
55
|
+
sandbox: true
|
|
56
|
+
notification_configs:
|
|
57
|
+
- subscriber_id: "signal-feed-sync"
|
|
58
|
+
url: "https://example.com/webhooks/adcp/signal-feed"
|
|
59
|
+
event_types:
|
|
60
|
+
- "signal.priced"
|
|
61
|
+
active: false
|
|
62
|
+
idempotency_key: "$generate:uuid_v4#wholesale_feed_signal_webhooks"
|
|
63
|
+
context:
|
|
64
|
+
correlation_id: "wholesale_feed_signal_webhooks--register"
|
|
65
|
+
validations:
|
|
66
|
+
- check: response_schema
|
|
67
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
68
|
+
- check: field_value
|
|
69
|
+
path: "accounts[0].notification_configs[0].subscriber_id"
|
|
70
|
+
value: "signal-feed-sync"
|
|
71
|
+
description: "Subscriber key is echoed"
|
|
72
|
+
- check: field_value
|
|
73
|
+
path: "accounts[0].notification_configs[0].event_types[0]"
|
|
74
|
+
value: "signal.priced"
|
|
75
|
+
description: "Signal pricing event is persisted"
|
|
76
|
+
- check: field_value
|
|
77
|
+
path: "accounts[0].notification_configs[0].active"
|
|
78
|
+
value: false
|
|
79
|
+
description: "Paused subscriber can be persisted without activation proof"
|
|
80
|
+
- check: field_value
|
|
81
|
+
path: "context.correlation_id"
|
|
82
|
+
value: "wholesale_feed_signal_webhooks--register"
|
|
83
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
id: wholesale_feed_signals
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Wholesale signals feed versioning"
|
|
4
|
+
category: marketplace_catalog
|
|
5
|
+
summary: "Validates get_signals wholesale feed versioning: bootstrap responses carry wholesale_feed_version/cache_scope and matching if_wholesale_feed_version probes return unchanged without signal rows."
|
|
6
|
+
track: signals
|
|
7
|
+
introduced_in: "3.1"
|
|
8
|
+
|
|
9
|
+
requires_capability:
|
|
10
|
+
path: wholesale_feed_versioning.supported
|
|
11
|
+
equals: true
|
|
12
|
+
|
|
13
|
+
required_tools:
|
|
14
|
+
- get_signals
|
|
15
|
+
|
|
16
|
+
narrative: |
|
|
17
|
+
Signals agents that advertise wholesale feed versioning and expose
|
|
18
|
+
`get_signals` must support the beta.4 conditional-fetch shape for wholesale
|
|
19
|
+
signal mirrors:
|
|
20
|
+
`discovery_mode: wholesale`, `wholesale_feed_version`,
|
|
21
|
+
`if_wholesale_feed_version`, `cache_scope`, and `unchanged: true`. This
|
|
22
|
+
storyboard does not require the optional separate `pricing_version` layer.
|
|
23
|
+
|
|
24
|
+
agent:
|
|
25
|
+
interaction_model: signals_agent
|
|
26
|
+
capabilities:
|
|
27
|
+
- wholesale_feed_versioning
|
|
28
|
+
examples:
|
|
29
|
+
- "Signals agents with a wholesale signals feed"
|
|
30
|
+
|
|
31
|
+
caller:
|
|
32
|
+
role: buyer_agent
|
|
33
|
+
example: "Compliance test harness"
|
|
34
|
+
|
|
35
|
+
prerequisites:
|
|
36
|
+
description: |
|
|
37
|
+
The agent advertises `wholesale_feed_versioning.supported: true` and exposes
|
|
38
|
+
`get_signals`.
|
|
39
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
40
|
+
controller_seeding: false
|
|
41
|
+
|
|
42
|
+
phases:
|
|
43
|
+
- id: conditional_fetch
|
|
44
|
+
title: "Bootstrap and probe signals feed"
|
|
45
|
+
steps:
|
|
46
|
+
- id: bootstrap_signals
|
|
47
|
+
title: "Bootstrap signals feed"
|
|
48
|
+
task: get_signals
|
|
49
|
+
schema_ref: "signals/get-signals-request.json"
|
|
50
|
+
response_schema_ref: "signals/get-signals-response.json"
|
|
51
|
+
doc_ref: "/signals/tasks/get_signals"
|
|
52
|
+
stateful: true
|
|
53
|
+
context_outputs:
|
|
54
|
+
- name: signal_wholesale_feed_version
|
|
55
|
+
path: "wholesale_feed_version"
|
|
56
|
+
expected: |
|
|
57
|
+
Return signal rows with wholesale feed metadata.
|
|
58
|
+
sample_request:
|
|
59
|
+
discovery_mode: "wholesale"
|
|
60
|
+
account:
|
|
61
|
+
brand:
|
|
62
|
+
domain: "acmeoutdoor.example"
|
|
63
|
+
operator: "pinnacle-agency.example"
|
|
64
|
+
context:
|
|
65
|
+
correlation_id: "wholesale_feed_signals--bootstrap"
|
|
66
|
+
validations:
|
|
67
|
+
- check: response_schema
|
|
68
|
+
description: "Response matches get-signals-response.json schema"
|
|
69
|
+
- check: field_present
|
|
70
|
+
path: "signals[0].signal_agent_segment_id"
|
|
71
|
+
description: "Bootstrap returns signal rows"
|
|
72
|
+
- check: field_present
|
|
73
|
+
path: "wholesale_feed_version"
|
|
74
|
+
description: "Bootstrap returns an opaque feed token"
|
|
75
|
+
- check: field_value
|
|
76
|
+
path: "cache_scope"
|
|
77
|
+
value: "public"
|
|
78
|
+
description: "Ordinary account reads may use the public cache layer"
|
|
79
|
+
- check: field_value
|
|
80
|
+
path: "context.correlation_id"
|
|
81
|
+
value: "wholesale_feed_signals--bootstrap"
|
|
82
|
+
description: "Context correlation_id returned unchanged"
|
|
83
|
+
|
|
84
|
+
- id: unchanged_probe
|
|
85
|
+
title: "Probe unchanged signals feed"
|
|
86
|
+
task: get_signals
|
|
87
|
+
schema_ref: "signals/get-signals-request.json"
|
|
88
|
+
response_schema_ref: "signals/get-signals-response.json"
|
|
89
|
+
doc_ref: "/signals/tasks/get_signals"
|
|
90
|
+
stateful: true
|
|
91
|
+
expected: |
|
|
92
|
+
Return unchanged without resending signal rows when the feed token matches.
|
|
93
|
+
sample_request:
|
|
94
|
+
discovery_mode: "wholesale"
|
|
95
|
+
account:
|
|
96
|
+
brand:
|
|
97
|
+
domain: "acmeoutdoor.example"
|
|
98
|
+
operator: "pinnacle-agency.example"
|
|
99
|
+
if_wholesale_feed_version: "$context.signal_wholesale_feed_version"
|
|
100
|
+
context:
|
|
101
|
+
correlation_id: "wholesale_feed_signals--unchanged"
|
|
102
|
+
validations:
|
|
103
|
+
- check: response_schema
|
|
104
|
+
description: "Response matches get-signals-response.json schema"
|
|
105
|
+
- check: field_value
|
|
106
|
+
path: "unchanged"
|
|
107
|
+
value: true
|
|
108
|
+
description: "Matching token produces the cheap unchanged response"
|
|
109
|
+
- check: field_equals_context
|
|
110
|
+
path: "wholesale_feed_version"
|
|
111
|
+
context_key: "signal_wholesale_feed_version"
|
|
112
|
+
description: "Unchanged response echoes the current signal feed token"
|
|
113
|
+
- check: field_value
|
|
114
|
+
path: "cache_scope"
|
|
115
|
+
value: "public"
|
|
116
|
+
description: "Unchanged response carries cache scope"
|
|
117
|
+
- check: field_absent
|
|
118
|
+
path: "signals[0].signal_agent_segment_id"
|
|
119
|
+
description: "Unchanged response omits signal rows"
|
|
120
|
+
- check: field_value
|
|
121
|
+
path: "context.correlation_id"
|
|
122
|
+
value: "wholesale_feed_signals--unchanged"
|
|
123
|
+
description: "Context correlation_id returned unchanged"
|
|
124
|
+
|
|
125
|
+
- id: standalone_pricing_token_rejected
|
|
126
|
+
title: "Reject standalone signal pricing token"
|
|
127
|
+
task: get_signals
|
|
128
|
+
schema_ref: "signals/get-signals-request.json"
|
|
129
|
+
response_schema_ref: "signals/get-signals-response.json"
|
|
130
|
+
doc_ref: "/signals/tasks/get_signals"
|
|
131
|
+
expect_error: true
|
|
132
|
+
negative_path: payload_well_formed
|
|
133
|
+
sample_request_skip_schema: true
|
|
134
|
+
stateful: true
|
|
135
|
+
expected: |
|
|
136
|
+
Reject if_pricing_version when if_wholesale_feed_version is absent.
|
|
137
|
+
sample_request:
|
|
138
|
+
discovery_mode: "wholesale"
|
|
139
|
+
account:
|
|
140
|
+
brand:
|
|
141
|
+
domain: "acmeoutdoor.example"
|
|
142
|
+
operator: "pinnacle-agency.example"
|
|
143
|
+
if_pricing_version: "stale-pricing-token"
|
|
144
|
+
context:
|
|
145
|
+
correlation_id: "wholesale_feed_signals--standalone_pricing"
|
|
146
|
+
validations:
|
|
147
|
+
- check: error_code
|
|
148
|
+
value: "INVALID_REQUEST"
|
|
149
|
+
description: "Standalone if_pricing_version is rejected"
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
"source_sha": "4e553ad955f83b49c7d221ab5c3ff78237ad02e3",
|
|
5
5
|
"source_tarball_sha256": "580656d6466ef9f0d1119985e6726c2efea718dc671e2ad30957fcb2fd54af0f",
|
|
6
6
|
"upstream_adcp_version": "2.5.3",
|
|
7
|
-
"synced_at": "2026-05-
|
|
7
|
+
"synced_at": "2026-05-30T09:42:42.445Z"
|
|
8
8
|
}
|
|
@@ -132,6 +132,8 @@ registerOnce('context.no_secret_echo', {
|
|
|
132
132
|
for (const s of optAny.secrets ?? [])
|
|
133
133
|
addIfSecret(secrets, s);
|
|
134
134
|
addIfSecret(secrets, optAny.test_kit?.auth?.api_key);
|
|
135
|
+
for (const s of extractBasicSecrets(optAny.test_kit?.auth?.basic))
|
|
136
|
+
addIfSecret(secrets, s);
|
|
135
137
|
ctx.state.secrets = secrets;
|
|
136
138
|
},
|
|
137
139
|
onStep: (ctx, stepResult) => {
|
|
@@ -502,6 +504,27 @@ function extractAuthSecrets(auth) {
|
|
|
502
504
|
}
|
|
503
505
|
return out;
|
|
504
506
|
}
|
|
507
|
+
function extractBasicSecrets(basic) {
|
|
508
|
+
if (!basic || typeof basic !== 'object')
|
|
509
|
+
return [];
|
|
510
|
+
const b = basic;
|
|
511
|
+
const out = [];
|
|
512
|
+
if (typeof b.credentials === 'string' && b.credentials) {
|
|
513
|
+
const colonIndex = b.credentials.indexOf(':');
|
|
514
|
+
if (colonIndex > 0 && colonIndex < b.credentials.length - 1) {
|
|
515
|
+
out.push(b.credentials.slice(colonIndex + 1));
|
|
516
|
+
out.push(Buffer.from(b.credentials, 'utf8').toString('base64'));
|
|
517
|
+
}
|
|
518
|
+
return out;
|
|
519
|
+
}
|
|
520
|
+
if (typeof b.password === 'string' && b.password) {
|
|
521
|
+
out.push(b.password);
|
|
522
|
+
if (typeof b.username === 'string' && b.username) {
|
|
523
|
+
out.push(Buffer.from(`${b.username}:${b.password}`, 'utf8').toString('base64'));
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
return out;
|
|
527
|
+
}
|
|
505
528
|
const SCHEMA_URL_BASE = 'https://adcontextprotocol.org';
|
|
506
529
|
function buildEnumSchemaUrl(enumFile) {
|
|
507
530
|
return `${SCHEMA_URL_BASE}/schemas/${version_1.ADCP_VERSION}/enums/${enumFile}`;
|