@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,262 @@
|
|
|
1
|
+
# Nova Motors — Signal-Focused Advertiser Test Kit
|
|
2
|
+
#
|
|
3
|
+
# Entity definition: fictional-entities.yaml → advertisers[nova_motors]
|
|
4
|
+
# Data providers defined in this kit: see fictional-entities.yaml → data_providers
|
|
5
|
+
#
|
|
6
|
+
# This brand is registered as a sandbox brand in AgenticAdvertising.org (AAO).
|
|
7
|
+
# Agents resolve novamotors.example via the standard AAO brand resolution path.
|
|
8
|
+
# AAO returns the brand.json below but excludes sandbox brands from production
|
|
9
|
+
# brand discovery results.
|
|
10
|
+
|
|
11
|
+
id: nova_motors
|
|
12
|
+
name: "Nova Motors"
|
|
13
|
+
description: |
|
|
14
|
+
Signal-focused test kit for the Nova Motors Volta EV launch campaign.
|
|
15
|
+
Provides sample signal definitions, pricing options, and destination
|
|
16
|
+
configurations for testing signal agent storyboards.
|
|
17
|
+
sandbox: true
|
|
18
|
+
|
|
19
|
+
# security_baseline auth fixture — see acme-outdoor.yaml for semantics.
|
|
20
|
+
#
|
|
21
|
+
# probe_task is `get_signals` because this kit's primary consumers are
|
|
22
|
+
# signal agents (specialisms/signal-owned, specialisms/signal-marketplace)
|
|
23
|
+
# where list_creatives is not implemented. Non-signal storyboards that
|
|
24
|
+
# reuse this kit (collection-lists, sales-broadcast-tv, sponsored-
|
|
25
|
+
# intelligence) should select acme-outdoor for security_baseline, or
|
|
26
|
+
# override probe_task at the storyboard layer.
|
|
27
|
+
auth:
|
|
28
|
+
api_key: "demo-nova-motors-v1"
|
|
29
|
+
probe_task: get_signals
|
|
30
|
+
|
|
31
|
+
brand:
|
|
32
|
+
house:
|
|
33
|
+
domain: "novamotors.example"
|
|
34
|
+
name: "Nova Motors"
|
|
35
|
+
brand_id: "nova_motors"
|
|
36
|
+
names:
|
|
37
|
+
- en: "Nova Motors"
|
|
38
|
+
description: "Electric vehicles for the next generation. The Volta EV — performance meets sustainability."
|
|
39
|
+
industry: "automotive"
|
|
40
|
+
keller_type: "master"
|
|
41
|
+
logos:
|
|
42
|
+
- url: "https://test-assets.adcontextprotocol.org/nova-motors/logo-primary.png"
|
|
43
|
+
orientation: "horizontal"
|
|
44
|
+
background: "light-bg"
|
|
45
|
+
variant: "primary"
|
|
46
|
+
width: 400
|
|
47
|
+
height: 100
|
|
48
|
+
- url: "https://test-assets.adcontextprotocol.org/nova-motors/logo-icon.png"
|
|
49
|
+
orientation: "square"
|
|
50
|
+
background: "transparent-bg"
|
|
51
|
+
variant: "icon"
|
|
52
|
+
width: 200
|
|
53
|
+
height: 200
|
|
54
|
+
colors:
|
|
55
|
+
primary: "#0D47A1"
|
|
56
|
+
secondary: "#00BFA5"
|
|
57
|
+
accent: "#FF6D00"
|
|
58
|
+
background: "#F5F5F5"
|
|
59
|
+
text: "#1A1A1A"
|
|
60
|
+
fonts:
|
|
61
|
+
heading:
|
|
62
|
+
family: "Inter"
|
|
63
|
+
weight: 700
|
|
64
|
+
url: "https://fonts.googleapis.com/css2?family=Inter:wght@700"
|
|
65
|
+
body:
|
|
66
|
+
family: "Inter"
|
|
67
|
+
weight: 400
|
|
68
|
+
url: "https://fonts.googleapis.com/css2?family=Inter"
|
|
69
|
+
tone:
|
|
70
|
+
voice: "Forward-thinking and precise. We speak to drivers who care about engineering and the planet — no greenwashing, no hype."
|
|
71
|
+
attributes:
|
|
72
|
+
- "innovative"
|
|
73
|
+
- "precise"
|
|
74
|
+
- "optimistic"
|
|
75
|
+
dos:
|
|
76
|
+
- "Lead with performance specs"
|
|
77
|
+
- "Reference sustainability with evidence"
|
|
78
|
+
- "Use clean, modern language"
|
|
79
|
+
donts:
|
|
80
|
+
- "Greenwash or overstate environmental claims"
|
|
81
|
+
- "Use legacy automotive clichés"
|
|
82
|
+
- "Condescend about range anxiety"
|
|
83
|
+
|
|
84
|
+
campaign:
|
|
85
|
+
brand: "Nova Motors"
|
|
86
|
+
product: "Volta EV"
|
|
87
|
+
brief: "Reach in-market EV buyers with high purchase propensity, near dealerships, who haven't bought a Nova vehicle before."
|
|
88
|
+
budget: 250000
|
|
89
|
+
currency: "USD"
|
|
90
|
+
markets: ["US"]
|
|
91
|
+
|
|
92
|
+
signals:
|
|
93
|
+
marketplace:
|
|
94
|
+
- signal_agent_segment_id: "trident_likely_ev_buyers"
|
|
95
|
+
name: "Likely EV Buyers"
|
|
96
|
+
data_provider_domain: "tridentauto.example"
|
|
97
|
+
signal_id: "likely_ev_buyers"
|
|
98
|
+
value_type: "binary"
|
|
99
|
+
signal_type: "marketplace"
|
|
100
|
+
coverage_percentage: 8
|
|
101
|
+
pricing:
|
|
102
|
+
- pricing_option_id: "po_trident_ev_cpm"
|
|
103
|
+
model: "cpm"
|
|
104
|
+
cpm: 3.50
|
|
105
|
+
currency: "USD"
|
|
106
|
+
|
|
107
|
+
- signal_agent_segment_id: "trident_purchase_propensity"
|
|
108
|
+
name: "Purchase Propensity"
|
|
109
|
+
data_provider_domain: "tridentauto.example"
|
|
110
|
+
signal_id: "purchase_propensity"
|
|
111
|
+
value_type: "numeric"
|
|
112
|
+
signal_type: "marketplace"
|
|
113
|
+
range:
|
|
114
|
+
min: 0
|
|
115
|
+
max: 1
|
|
116
|
+
coverage_percentage: 55
|
|
117
|
+
pricing:
|
|
118
|
+
- pricing_option_id: "po_trident_propensity_cpm"
|
|
119
|
+
model: "cpm"
|
|
120
|
+
cpm: 4.00
|
|
121
|
+
currency: "USD"
|
|
122
|
+
|
|
123
|
+
- signal_agent_segment_id: "meridian_competitor_visitors"
|
|
124
|
+
name: "Competitor Visitors"
|
|
125
|
+
data_provider_domain: "meridiangeo.example"
|
|
126
|
+
signal_id: "competitor_visitors"
|
|
127
|
+
value_type: "binary"
|
|
128
|
+
signal_type: "marketplace"
|
|
129
|
+
coverage_percentage: 6
|
|
130
|
+
pricing:
|
|
131
|
+
- pricing_option_id: "po_meridian_visitors_cpm"
|
|
132
|
+
model: "cpm"
|
|
133
|
+
cpm: 5.00
|
|
134
|
+
currency: "USD"
|
|
135
|
+
|
|
136
|
+
- signal_agent_segment_id: "shopgrid_new_to_brand"
|
|
137
|
+
name: "New to Brand"
|
|
138
|
+
data_provider_domain: "shopgrid.example"
|
|
139
|
+
signal_id: "new_to_brand"
|
|
140
|
+
value_type: "binary"
|
|
141
|
+
signal_type: "marketplace"
|
|
142
|
+
coverage_percentage: 25
|
|
143
|
+
pricing:
|
|
144
|
+
- pricing_option_id: "po_shopgrid_retail_cpm"
|
|
145
|
+
model: "cpm"
|
|
146
|
+
cpm: 3.50
|
|
147
|
+
currency: "USD"
|
|
148
|
+
|
|
149
|
+
owned:
|
|
150
|
+
- signal_agent_segment_id: "prism_high_ltv"
|
|
151
|
+
name: "High LTV Customers"
|
|
152
|
+
value_type: "binary"
|
|
153
|
+
signal_type: "owned"
|
|
154
|
+
coverage_percentage: 12
|
|
155
|
+
pricing:
|
|
156
|
+
- pricing_option_id: "po_prism_flat_monthly"
|
|
157
|
+
model: "flat_fee"
|
|
158
|
+
amount: 5000
|
|
159
|
+
period: "monthly"
|
|
160
|
+
currency: "USD"
|
|
161
|
+
|
|
162
|
+
- signal_agent_segment_id: "prism_cart_abandoner"
|
|
163
|
+
name: "Cart Abandoners"
|
|
164
|
+
value_type: "binary"
|
|
165
|
+
signal_type: "owned"
|
|
166
|
+
coverage_percentage: 18
|
|
167
|
+
pricing:
|
|
168
|
+
- pricing_option_id: "po_prism_abandoner_cpm"
|
|
169
|
+
model: "cpm"
|
|
170
|
+
cpm: 8.00
|
|
171
|
+
currency: "USD"
|
|
172
|
+
|
|
173
|
+
- signal_agent_segment_id: "prism_engagement_score"
|
|
174
|
+
name: "Engagement Score"
|
|
175
|
+
value_type: "numeric"
|
|
176
|
+
signal_type: "owned"
|
|
177
|
+
range:
|
|
178
|
+
min: 0
|
|
179
|
+
max: 100
|
|
180
|
+
coverage_percentage: 65
|
|
181
|
+
pricing:
|
|
182
|
+
- pricing_option_id: "po_prism_engagement_cpm"
|
|
183
|
+
model: "cpm"
|
|
184
|
+
cpm: 2.50
|
|
185
|
+
currency: "USD"
|
|
186
|
+
|
|
187
|
+
- signal_agent_segment_id: "prism_churn_risk"
|
|
188
|
+
name: "Churn Risk"
|
|
189
|
+
value_type: "categorical"
|
|
190
|
+
signal_type: "owned"
|
|
191
|
+
categories: ["low_risk", "medium_risk", "high_risk", "churned"]
|
|
192
|
+
coverage_percentage: 70
|
|
193
|
+
pricing:
|
|
194
|
+
- pricing_option_id: "po_prism_churn_pom"
|
|
195
|
+
model: "percent_of_media"
|
|
196
|
+
percent: 12
|
|
197
|
+
max_cpm: 3.00
|
|
198
|
+
currency: "USD"
|
|
199
|
+
|
|
200
|
+
assets:
|
|
201
|
+
images:
|
|
202
|
+
- id: "hero_300x250"
|
|
203
|
+
url: "https://test-assets.adcontextprotocol.org/nova-motors/hero-300x250.jpg"
|
|
204
|
+
width: 300
|
|
205
|
+
height: 250
|
|
206
|
+
mime_type: "image/jpeg"
|
|
207
|
+
description: "Medium rectangle hero — Volta EV on coastal highway"
|
|
208
|
+
|
|
209
|
+
- id: "hero_728x90"
|
|
210
|
+
url: "https://test-assets.adcontextprotocol.org/nova-motors/hero-728x90.jpg"
|
|
211
|
+
width: 728
|
|
212
|
+
height: 90
|
|
213
|
+
mime_type: "image/jpeg"
|
|
214
|
+
description: "Leaderboard hero — Volta EV front profile with charging station"
|
|
215
|
+
|
|
216
|
+
- id: "hero_320x50"
|
|
217
|
+
url: "https://test-assets.adcontextprotocol.org/nova-motors/hero-320x50.jpg"
|
|
218
|
+
width: 320
|
|
219
|
+
height: 50
|
|
220
|
+
mime_type: "image/jpeg"
|
|
221
|
+
description: "Mobile banner hero — Volta EV dashboard detail"
|
|
222
|
+
|
|
223
|
+
- id: "hero_160x600"
|
|
224
|
+
url: "https://test-assets.adcontextprotocol.org/nova-motors/hero-160x600.jpg"
|
|
225
|
+
width: 160
|
|
226
|
+
height: 600
|
|
227
|
+
mime_type: "image/jpeg"
|
|
228
|
+
description: "Wide skyscraper hero — vertical Volta EV silhouette"
|
|
229
|
+
|
|
230
|
+
- id: "hero_master"
|
|
231
|
+
url: "https://test-assets.adcontextprotocol.org/nova-motors/hero-master.jpg"
|
|
232
|
+
width: 1200
|
|
233
|
+
height: 628
|
|
234
|
+
mime_type: "image/jpeg"
|
|
235
|
+
description: "Master hero image — high-res Volta EV in motion"
|
|
236
|
+
|
|
237
|
+
text:
|
|
238
|
+
headlines:
|
|
239
|
+
- "The Volta EV — 0 to 60 in 3.2s"
|
|
240
|
+
- "Performance Meets Sustainability"
|
|
241
|
+
- "Drive Electric. Drive Nova."
|
|
242
|
+
descriptions:
|
|
243
|
+
- "340 miles of range. 15-minute fast charge. The Volta EV is engineered for drivers who refuse to compromise."
|
|
244
|
+
- "Zero emissions, zero compromises. Test drive the Volta EV at your nearest Nova Motors dealer."
|
|
245
|
+
cta:
|
|
246
|
+
- "Reserve Yours"
|
|
247
|
+
- "Schedule a Test Drive"
|
|
248
|
+
- "Explore the Volta"
|
|
249
|
+
|
|
250
|
+
click_url: "https://novamotors.example/volta-ev"
|
|
251
|
+
|
|
252
|
+
destinations:
|
|
253
|
+
platforms:
|
|
254
|
+
- type: "platform"
|
|
255
|
+
platform: "the-trade-desk"
|
|
256
|
+
account: "agency-123-ttd"
|
|
257
|
+
- type: "platform"
|
|
258
|
+
platform: "streamhaus"
|
|
259
|
+
account: "agency-ctv-seat-456"
|
|
260
|
+
agents:
|
|
261
|
+
- type: "agent"
|
|
262
|
+
agent_url: "https://wonderstruck.salesagents.example"
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Osei Natural — Beauty Advertiser Test Kit
|
|
2
|
+
#
|
|
3
|
+
# Entity definition: fictional-entities.yaml → advertisers[osei_natural]
|
|
4
|
+
#
|
|
5
|
+
# 8-person natural skincare company based in Nairobi. Represents the small
|
|
6
|
+
# business that advertising should serve but currently doesn't.
|
|
7
|
+
#
|
|
8
|
+
# This brand is registered as a sandbox brand in AgenticAdvertising.org (AAO).
|
|
9
|
+
# Agents resolve oseinatural.example via the standard AAO brand resolution path.
|
|
10
|
+
# AAO returns the brand.json below but excludes sandbox brands from production
|
|
11
|
+
# brand discovery results.
|
|
12
|
+
|
|
13
|
+
id: osei_natural
|
|
14
|
+
name: "Osei Natural"
|
|
15
|
+
description: "Natural skincare brand for small-business advertiser storyboard testing"
|
|
16
|
+
sandbox: true
|
|
17
|
+
|
|
18
|
+
# security_baseline auth fixture — see acme-outdoor.yaml for semantics.
|
|
19
|
+
auth:
|
|
20
|
+
api_key: "demo-osei-natural-v1"
|
|
21
|
+
probe_task: list_creatives
|
|
22
|
+
|
|
23
|
+
brand:
|
|
24
|
+
house:
|
|
25
|
+
domain: "oseinatural.example"
|
|
26
|
+
name: "Osei Natural"
|
|
27
|
+
brand_id: "osei_natural"
|
|
28
|
+
names:
|
|
29
|
+
- en: "Osei Natural"
|
|
30
|
+
description: "Natural skincare rooted in East African botanicals. Small-batch, founder-led, and unapologetically simple."
|
|
31
|
+
industry: "beauty"
|
|
32
|
+
keller_type: "master"
|
|
33
|
+
logos:
|
|
34
|
+
- url: "https://test-assets.adcontextprotocol.org/osei-natural/logo-primary.png"
|
|
35
|
+
orientation: "horizontal"
|
|
36
|
+
background: "light-bg"
|
|
37
|
+
variant: "primary"
|
|
38
|
+
width: 400
|
|
39
|
+
height: 100
|
|
40
|
+
- url: "https://test-assets.adcontextprotocol.org/osei-natural/logo-icon.png"
|
|
41
|
+
orientation: "square"
|
|
42
|
+
background: "transparent-bg"
|
|
43
|
+
variant: "icon"
|
|
44
|
+
width: 200
|
|
45
|
+
height: 200
|
|
46
|
+
colors:
|
|
47
|
+
primary: "#5D4037"
|
|
48
|
+
secondary: "#C8E6C9"
|
|
49
|
+
accent: "#FF8F00"
|
|
50
|
+
background: "#FBF7F4"
|
|
51
|
+
text: "#2E2E2E"
|
|
52
|
+
fonts:
|
|
53
|
+
heading:
|
|
54
|
+
family: "Cormorant Garamond"
|
|
55
|
+
weight: 600
|
|
56
|
+
url: "https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@600"
|
|
57
|
+
body:
|
|
58
|
+
family: "Lato"
|
|
59
|
+
weight: 400
|
|
60
|
+
url: "https://fonts.googleapis.com/css2?family=Lato"
|
|
61
|
+
tone:
|
|
62
|
+
voice: "Calm, grounded, and personal. Amara speaks directly to customers like a trusted friend sharing what works."
|
|
63
|
+
attributes:
|
|
64
|
+
- "authentic"
|
|
65
|
+
- "gentle"
|
|
66
|
+
- "personal"
|
|
67
|
+
dos:
|
|
68
|
+
- "Name specific botanicals and their origins"
|
|
69
|
+
- "Use first-person when appropriate — the founder is the brand"
|
|
70
|
+
- "Keep it warm and conversational"
|
|
71
|
+
donts:
|
|
72
|
+
- "Use clinical or pharmaceutical language"
|
|
73
|
+
- "Make anti-aging claims — Osei Natural is about care, not correction"
|
|
74
|
+
- "Erase the brand's Kenyan identity — it's a feature, not a detail"
|
|
75
|
+
|
|
76
|
+
assets:
|
|
77
|
+
images:
|
|
78
|
+
- id: "hero_300x250"
|
|
79
|
+
url: "https://test-assets.adcontextprotocol.org/osei-natural/hero-300x250.jpg"
|
|
80
|
+
width: 300
|
|
81
|
+
height: 250
|
|
82
|
+
mime_type: "image/jpeg"
|
|
83
|
+
description: "Medium rectangle hero — product jars with botanical ingredients"
|
|
84
|
+
|
|
85
|
+
- id: "hero_728x90"
|
|
86
|
+
url: "https://test-assets.adcontextprotocol.org/osei-natural/hero-728x90.jpg"
|
|
87
|
+
width: 728
|
|
88
|
+
height: 90
|
|
89
|
+
mime_type: "image/jpeg"
|
|
90
|
+
description: "Leaderboard hero — Amara in workshop with shea butter"
|
|
91
|
+
|
|
92
|
+
- id: "hero_320x50"
|
|
93
|
+
url: "https://test-assets.adcontextprotocol.org/osei-natural/hero-320x50.jpg"
|
|
94
|
+
width: 320
|
|
95
|
+
height: 50
|
|
96
|
+
mime_type: "image/jpeg"
|
|
97
|
+
description: "Mobile banner hero — close-up of baobab oil serum"
|
|
98
|
+
|
|
99
|
+
- id: "hero_160x600"
|
|
100
|
+
url: "https://test-assets.adcontextprotocol.org/osei-natural/hero-160x600.jpg"
|
|
101
|
+
width: 160
|
|
102
|
+
height: 600
|
|
103
|
+
mime_type: "image/jpeg"
|
|
104
|
+
description: "Wide skyscraper hero — vertical product lineup on linen"
|
|
105
|
+
|
|
106
|
+
- id: "hero_master"
|
|
107
|
+
url: "https://test-assets.adcontextprotocol.org/osei-natural/hero-master.jpg"
|
|
108
|
+
width: 1200
|
|
109
|
+
height: 628
|
|
110
|
+
mime_type: "image/jpeg"
|
|
111
|
+
description: "Master hero image — high-res flat lay of full product range"
|
|
112
|
+
|
|
113
|
+
text:
|
|
114
|
+
headlines:
|
|
115
|
+
- "Your Skin Deserves Better Ingredients"
|
|
116
|
+
- "Small-Batch Skincare from Nairobi"
|
|
117
|
+
- "Rooted in East African Botanicals"
|
|
118
|
+
descriptions:
|
|
119
|
+
- "Shea butter, baobab oil, and aloe — sourced from East African growers, blended by hand in Nairobi. Osei Natural."
|
|
120
|
+
- "Eight people, twelve products, zero compromises. Natural skincare that actually works."
|
|
121
|
+
cta:
|
|
122
|
+
- "Shop the Collection"
|
|
123
|
+
- "Meet the Founder"
|
|
124
|
+
- "Try a Sample Kit"
|
|
125
|
+
|
|
126
|
+
click_url: "https://oseinatural.example/shop"
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# Parallel Dispatch Runner — Harness Contract Test Kit
|
|
2
|
+
#
|
|
3
|
+
# Applies to:
|
|
4
|
+
# - universal/idempotency.yaml (concurrent-retry phase — verifies the
|
|
5
|
+
# first-insert-wins rule under L1/security.mdx#idempotency rule 9 by firing
|
|
6
|
+
# two requests with the same idempotency_key in parallel and grading the
|
|
7
|
+
# outcome).
|
|
8
|
+
# - Any future storyboard that needs to verify behavior under concurrent
|
|
9
|
+
# dispatch (e.g., racing webhook deliveries, racing sync calls).
|
|
10
|
+
#
|
|
11
|
+
# Storyboards are sequential by default — steps run one after another in YAML
|
|
12
|
+
# order, with each step's response observed before the next is dispatched.
|
|
13
|
+
# That model cannot exercise rule 9 (concurrent retry / first-insert-wins),
|
|
14
|
+
# because the second request would always arrive after the first's response
|
|
15
|
+
# has been observed.
|
|
16
|
+
#
|
|
17
|
+
# This test-kit defines the coordination contract between a runner that
|
|
18
|
+
# supports firing N requests in parallel and storyboards that need that
|
|
19
|
+
# capability. The runner's parallel dispatch happens at the @adcp/client
|
|
20
|
+
# layer (or its Python/Go equivalents) using the SDK's batch-call primitive,
|
|
21
|
+
# NOT at the YAML-step boundary — the storyboard author MUST NOT try to
|
|
22
|
+
# express parallelism via separate sequential steps.
|
|
23
|
+
|
|
24
|
+
id: parallel_dispatch_runner
|
|
25
|
+
applies_to:
|
|
26
|
+
universals:
|
|
27
|
+
- idempotency
|
|
28
|
+
|
|
29
|
+
description: |
|
|
30
|
+
Coordination contract between a runner that supports parallel request
|
|
31
|
+
dispatch and a storyboard step that needs to exercise concurrent-retry
|
|
32
|
+
semantics. The runner fires N >= 2 logically-simultaneous requests (same
|
|
33
|
+
`idempotency_key`, same canonical payload) and observes all responses, then
|
|
34
|
+
asserts on the cross-response invariants the storyboard step declares.
|
|
35
|
+
|
|
36
|
+
endpoint_scope: sandbox
|
|
37
|
+
# Concurrent-retry tests on storyboards that drive spend-committing operations
|
|
38
|
+
# (create_media_buy in particular) would create real commitments on retry-
|
|
39
|
+
# replay-success paths. Graders MUST target a sandbox/staging endpoint. Agents
|
|
40
|
+
# claiming the specialism SHOULD expose a dedicated grading endpoint.
|
|
41
|
+
|
|
42
|
+
harness_mode: black_box
|
|
43
|
+
|
|
44
|
+
# --- Parallelism mechanism ---
|
|
45
|
+
#
|
|
46
|
+
# Two viable shapes with different observation properties. The runner selects
|
|
47
|
+
# per run mode; storyboard authors SHOULD NOT assume a specific mode.
|
|
48
|
+
#
|
|
49
|
+
# process_local (default for lint/fast runs):
|
|
50
|
+
# The runner calls the SDK's batch-call primitive (Promise.all in JS,
|
|
51
|
+
# asyncio.gather in Python, sync.WaitGroup in Go) to dispatch N requests
|
|
52
|
+
# from the same process before awaiting any of their responses.
|
|
53
|
+
# Inter-request scheduling is at the SDK/transport level, NOT at the YAML-
|
|
54
|
+
# step level. Sufficient to exercise the seller's INSERT race; not
|
|
55
|
+
# sufficient to exercise true network-level interleaving (the runner's
|
|
56
|
+
# event loop still drains in deterministic order under most schedulers).
|
|
57
|
+
#
|
|
58
|
+
# distributed (optional, full-conformance runs):
|
|
59
|
+
# The runner dispatches the N requests from N independent worker processes
|
|
60
|
+
# (or N independent CI shards) using a barrier-wait synchronization point.
|
|
61
|
+
# All workers block on the barrier and unblock simultaneously, producing
|
|
62
|
+
# true network-level concurrency. Materially more expensive operationally;
|
|
63
|
+
# reserved for AdCP Verified grading and rule-9-specific deep checks.
|
|
64
|
+
#
|
|
65
|
+
# The specialism grades observable seller behavior; the dispatch mechanism is
|
|
66
|
+
# an implementation detail below the conformance seam. A seller that passes
|
|
67
|
+
# under process_local MUST also pass under distributed for the same storyboard
|
|
68
|
+
# — any divergence is a conformance bug in the runner, not a legitimate
|
|
69
|
+
# seller-behavior difference.
|
|
70
|
+
|
|
71
|
+
# --- Step-level coordination keys ---
|
|
72
|
+
#
|
|
73
|
+
# A storyboard step requiring this contract declares:
|
|
74
|
+
#
|
|
75
|
+
# requires_contract: parallel_dispatch_runner
|
|
76
|
+
# parallel_dispatch:
|
|
77
|
+
# count: 2 # required, integer >= 2, <= 10
|
|
78
|
+
# same_idempotency_key: true # required for rule-9 tests; future
|
|
79
|
+
# # non-idempotency parallel tests MAY
|
|
80
|
+
# # set this false
|
|
81
|
+
# barrier_timeout_ms: 5000 # optional; default 5000ms — how long the
|
|
82
|
+
# # runner waits at the barrier before
|
|
83
|
+
# # firing requests anyway (covers slow
|
|
84
|
+
# # distributed workers)
|
|
85
|
+
#
|
|
86
|
+
# The runner injects identical sample_request bodies on all N dispatches —
|
|
87
|
+
# specifically including the same expansion of any `$generate:uuid_v4#alias`
|
|
88
|
+
# placeholder, so the seller sees the same canonical hash on every replica.
|
|
89
|
+
# Distinct correlation_ids per dispatch ARE allowed (and recommended) because
|
|
90
|
+
# `context` is excluded from the canonical hash (see L1/security.mdx Payload
|
|
91
|
+
# equivalence) — using distinct correlation_ids lets the runner trace which
|
|
92
|
+
# response came from which dispatch in its output.
|
|
93
|
+
|
|
94
|
+
parallel_dispatch_step_contract:
|
|
95
|
+
required_step_fields:
|
|
96
|
+
- parallel_dispatch.count
|
|
97
|
+
- parallel_dispatch.same_idempotency_key
|
|
98
|
+
optional_step_fields:
|
|
99
|
+
- parallel_dispatch.barrier_timeout_ms
|
|
100
|
+
count_min: 2
|
|
101
|
+
count_max: 10
|
|
102
|
+
# 10 is a soft ceiling: every runner mode (process_local, distributed) MUST
|
|
103
|
+
# support up to 10 parallel dispatches. Storyboards needing higher fan-out
|
|
104
|
+
# SHOULD justify it in a step comment; the runner MAY reject counts above
|
|
105
|
+
# 10 to bound test runtime.
|
|
106
|
+
|
|
107
|
+
# --- Validation primitives ---
|
|
108
|
+
#
|
|
109
|
+
# Steps requiring parallel dispatch declare validations against the array of
|
|
110
|
+
# responses, not a single response. The storyboard step's validations[] block
|
|
111
|
+
# acquires two cross-response check kinds that are not available in
|
|
112
|
+
# sequential-dispatch steps:
|
|
113
|
+
#
|
|
114
|
+
# - check: cross_response_field_equal
|
|
115
|
+
# path: "media_buy_id"
|
|
116
|
+
# description: |
|
|
117
|
+
# All N responses (including IDEMPOTENCY_IN_FLIGHT-then-retried
|
|
118
|
+
# responses, resolved to their eventual cached response) MUST carry the
|
|
119
|
+
# same value at the named path. A divergence is a rule-9 violation —
|
|
120
|
+
# the seller produced two distinct resources for the same key.
|
|
121
|
+
#
|
|
122
|
+
# - check: cross_response_count_distinct
|
|
123
|
+
# path: "media_buy_id"
|
|
124
|
+
# allowed_values: [1]
|
|
125
|
+
# description: |
|
|
126
|
+
# The set of distinct values observed at the named path across all N
|
|
127
|
+
# responses MUST have cardinality equal to one of allowed_values. For
|
|
128
|
+
# rule-9 tests, allowed_values: [1] — exactly one resource was created.
|
|
129
|
+
#
|
|
130
|
+
# Standard per-response checks (response_schema, field_present, error_code,
|
|
131
|
+
# etc.) apply to each response individually; the runner runs them N times
|
|
132
|
+
# and aggregates pass/fail per the storyboard's existing severity rules.
|
|
133
|
+
|
|
134
|
+
cross_response_check_kinds:
|
|
135
|
+
- cross_response_field_equal
|
|
136
|
+
- cross_response_count_distinct
|
|
137
|
+
|
|
138
|
+
# --- Resolution of IDEMPOTENCY_IN_FLIGHT in cross-response checks ---
|
|
139
|
+
#
|
|
140
|
+
# A seller adopting the reject-and-redirect policy under rule 9 may return
|
|
141
|
+
# IDEMPOTENCY_IN_FLIGHT on the second (or later) dispatched request rather
|
|
142
|
+
# than wait-and-replay. The runner MUST resolve IDEMPOTENCY_IN_FLIGHT
|
|
143
|
+
# responses to their eventual cached response before applying cross-response
|
|
144
|
+
# checks: when the runner observes IDEMPOTENCY_IN_FLIGHT, it waits the
|
|
145
|
+
# `error.details.retry_after` seconds and retries the SAME idempotency_key
|
|
146
|
+
# (per the buyer-side normative behavior). The cross-response check then
|
|
147
|
+
# operates on the resolved response set, not the raw initial set.
|
|
148
|
+
#
|
|
149
|
+
# Maximum total wall-time for one in-flight resolution is bounded by the
|
|
150
|
+
# runner's overall step-timeout budget. Sellers returning IDEMPOTENCY_IN_FLIGHT
|
|
151
|
+
# with a retry_after that exceeds the runner's budget will fail the step on
|
|
152
|
+
# timeout — graded as `step_timeout`, not `rule_9_violation`. Sellers tuning
|
|
153
|
+
# retry_after for production traffic SHOULD test their values against the
|
|
154
|
+
# runner's documented timeout (default 60s; CI configurable).
|
|
155
|
+
|
|
156
|
+
# --- What the contract does NOT cover ---
|
|
157
|
+
#
|
|
158
|
+
# Network-level packet timing / ordering. process_local mode delivers requests
|
|
159
|
+
# in deterministic event-loop order; distributed mode introduces real
|
|
160
|
+
# interleaving but does not synthesize adversarial packet schedules. Sellers
|
|
161
|
+
# whose correctness depends on adversarial network conditions need additional
|
|
162
|
+
# fault-injection harnesses outside this contract.
|
|
163
|
+
#
|
|
164
|
+
# Multi-account / multi-agent racing. The contract dispatches N requests
|
|
165
|
+
# within a single (authenticated_agent, account) scope — the same scope as
|
|
166
|
+
# the idempotency key itself. Storyboards needing to exercise cross-scope
|
|
167
|
+
# races (e.g., agency-vs-direct-buyer collisions on a shared natural key)
|
|
168
|
+
# require a separate contract.
|
|
169
|
+
#
|
|
170
|
+
# Crash injection. The contract does not interrupt the seller mid-request.
|
|
171
|
+
# Storyboards testing seller behavior under crashes / restarts / failovers
|
|
172
|
+
# need a separate fault-injection harness — out of scope here.
|
|
173
|
+
|
|
174
|
+
# --- Reviewer checks ---
|
|
175
|
+
#
|
|
176
|
+
# Some properties of rule 9 cannot be programmatically graded by this
|
|
177
|
+
# contract and MUST be confirmed by reviewer inspection of the seller's
|
|
178
|
+
# implementation and runbook:
|
|
179
|
+
#
|
|
180
|
+
# - The seller's claim-row / unique-constraint pattern actually backs the
|
|
181
|
+
# observed first-insert-wins behavior (not a happy-path race that
|
|
182
|
+
# coincidentally avoided the conflict in the test run).
|
|
183
|
+
# - The seller's downstream reconciliation pattern (rule 10) is documented
|
|
184
|
+
# in the operational runbook. The contract observes only the buyer-
|
|
185
|
+
# visible response surface; the downstream-side behavior is not directly
|
|
186
|
+
# observable from a black-box harness.
|
|
187
|
+
# - The seller's in-flight detection does NOT leak across scope boundaries
|
|
188
|
+
# — an attacker authenticated as agent B with a stolen key from agent A
|
|
189
|
+
# receives the same response shape and timing whether agent A's row is
|
|
190
|
+
# in flight, completed, or never existed. Verified by manual probing,
|
|
191
|
+
# not by this contract.
|
|
192
|
+
|
|
193
|
+
reviewer_checks:
|
|
194
|
+
- "Confirm the seller's claim-row / unique-constraint implementation backs the observed first-insert-wins behavior, rather than a happy-path race the test happened to avoid (review code or runbook describing the INSERT … ON CONFLICT pattern on the scope tuple)."
|
|
195
|
+
- "Confirm the seller's downstream-reconciliation pattern (rule 10) is documented in their operational runbook: which downstream calls use write-claim-before-invoke and which thread the buyer-key (or a derivative)."
|
|
196
|
+
- "Confirm the seller's in-flight state does NOT leak across (authenticated_agent, account_id) scope boundaries — probe with a stolen key from a different scope and verify the response shape and timing match the never-seen-key path."
|