@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,265 @@
|
|
|
1
|
+
id: pagination_integrity_creative_formats
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Pagination cursor integrity — list_creative_formats"
|
|
4
|
+
category: schema_validation
|
|
5
|
+
summary: "Validates the cursor↔has_more invariant on list_creative_formats by seeding two formats and walking pages with max_results=1."
|
|
6
|
+
track: core
|
|
7
|
+
required_tools:
|
|
8
|
+
- list_creative_formats
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
Pagination is cursor-based across AdCP. Every response carrying a
|
|
12
|
+
`pagination` block satisfies one invariant: when `has_more` is true the
|
|
13
|
+
`cursor` MUST be present; when `has_more` is false the `cursor` MUST be
|
|
14
|
+
absent. This storyboard exercises both sides of the invariant on
|
|
15
|
+
`list_creative_formats`, mirroring the approach used by
|
|
16
|
+
`pagination-integrity.yaml` for `list_creatives`.
|
|
17
|
+
|
|
18
|
+
The runner seeds two creative formats into the agent's session ahead of
|
|
19
|
+
time so the result set has a knowable size at storyboard-author time. A
|
|
20
|
+
request filtered to those seeded names with `max_results=1` MUST trigger a
|
|
21
|
+
continuation page on the first call (`has_more=true` with a cursor).
|
|
22
|
+
Following that cursor MUST produce a terminal page (`has_more=false` with
|
|
23
|
+
no cursor). The unique name prefix narrows the result set to the seeded
|
|
24
|
+
fixtures so production catalogs are not swept during the pagination check.
|
|
25
|
+
|
|
26
|
+
The `list-creative-formats-response.json` schema does not define a
|
|
27
|
+
`query_summary` field, so this storyboard only asserts the
|
|
28
|
+
`pagination` block fields (`has_more`, `cursor`, `total_count`).
|
|
29
|
+
|
|
30
|
+
agent:
|
|
31
|
+
interaction_model: stateful_preloaded
|
|
32
|
+
capabilities:
|
|
33
|
+
- has_creative_formats
|
|
34
|
+
examples:
|
|
35
|
+
- "Any AdCP agent that exposes a paginated list_creative_formats"
|
|
36
|
+
|
|
37
|
+
caller:
|
|
38
|
+
role: buyer_agent
|
|
39
|
+
example: "Compliance test harness"
|
|
40
|
+
|
|
41
|
+
prerequisites:
|
|
42
|
+
description: |
|
|
43
|
+
The runner seeds two creative formats ahead of time so a max_results=1
|
|
44
|
+
request reliably triggers a continuation page on the first call.
|
|
45
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
46
|
+
controller_seeding: true
|
|
47
|
+
|
|
48
|
+
fixtures:
|
|
49
|
+
creative_formats:
|
|
50
|
+
- format_id: "pagination_integrity_format_1"
|
|
51
|
+
fixture:
|
|
52
|
+
name: "Pagination Integrity Format A"
|
|
53
|
+
type: "display"
|
|
54
|
+
- format_id: "pagination_integrity_format_2"
|
|
55
|
+
fixture:
|
|
56
|
+
name: "Pagination Integrity Format B"
|
|
57
|
+
type: "display"
|
|
58
|
+
|
|
59
|
+
phases:
|
|
60
|
+
- id: capability_discovery
|
|
61
|
+
title: "Capability discovery"
|
|
62
|
+
narrative: |
|
|
63
|
+
Confirm the agent supports list_creative_formats before exercising
|
|
64
|
+
pagination.
|
|
65
|
+
steps:
|
|
66
|
+
- id: get_capabilities
|
|
67
|
+
title: "Check agent capabilities"
|
|
68
|
+
narrative: |
|
|
69
|
+
Verify that the agent declares creative in supported_protocols
|
|
70
|
+
before driving paginated list_creative_formats.
|
|
71
|
+
task: get_adcp_capabilities
|
|
72
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
73
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
74
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
75
|
+
comply_scenario: capability_discovery
|
|
76
|
+
stateful: false
|
|
77
|
+
expected: |
|
|
78
|
+
Return capabilities declaring creative in supported_protocols.
|
|
79
|
+
|
|
80
|
+
sample_request:
|
|
81
|
+
context:
|
|
82
|
+
correlation_id: "pagination_integrity_creative_formats--get_capabilities"
|
|
83
|
+
validations:
|
|
84
|
+
- check: response_schema
|
|
85
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
86
|
+
- check: field_present
|
|
87
|
+
path: "supported_protocols"
|
|
88
|
+
description: "Agent declares supported protocols"
|
|
89
|
+
- check: field_present
|
|
90
|
+
path: "context"
|
|
91
|
+
description: "Response echoes back the context object"
|
|
92
|
+
- check: field_value
|
|
93
|
+
path: "context.correlation_id"
|
|
94
|
+
value: "pagination_integrity_creative_formats--get_capabilities"
|
|
95
|
+
description: "Context correlation_id returned unchanged"
|
|
96
|
+
|
|
97
|
+
- id: seed_formats
|
|
98
|
+
title: "Seed two creative formats"
|
|
99
|
+
narrative: |
|
|
100
|
+
Pre-populate exactly two creative formats via comply_test_controller
|
|
101
|
+
so the result set has a knowable size for the pagination walk.
|
|
102
|
+
steps:
|
|
103
|
+
- id: seed_format_1
|
|
104
|
+
title: "Seed first format fixture"
|
|
105
|
+
task: comply_test_controller
|
|
106
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
107
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
108
|
+
comply_scenario: seed_creative_format
|
|
109
|
+
stateful: true
|
|
110
|
+
expected: |
|
|
111
|
+
Return success: true.
|
|
112
|
+
sample_request:
|
|
113
|
+
account:
|
|
114
|
+
sandbox: true
|
|
115
|
+
account_id: "acct_pagination_integrity_formats"
|
|
116
|
+
scenario: "seed_creative_format"
|
|
117
|
+
params:
|
|
118
|
+
format_id: "pagination_integrity_format_1"
|
|
119
|
+
fixture:
|
|
120
|
+
name: "Pagination Integrity Format A"
|
|
121
|
+
type: "display"
|
|
122
|
+
context:
|
|
123
|
+
correlation_id: "pagination_integrity_creative_formats--seed_1"
|
|
124
|
+
validations:
|
|
125
|
+
- check: field_value
|
|
126
|
+
path: "success"
|
|
127
|
+
value: true
|
|
128
|
+
description: "Seed acknowledged"
|
|
129
|
+
|
|
130
|
+
- id: seed_format_2
|
|
131
|
+
title: "Seed second format fixture"
|
|
132
|
+
task: comply_test_controller
|
|
133
|
+
schema_ref: "compliance/comply-test-controller-request.json"
|
|
134
|
+
response_schema_ref: "compliance/comply-test-controller-response.json"
|
|
135
|
+
comply_scenario: seed_creative_format
|
|
136
|
+
stateful: true
|
|
137
|
+
expected: |
|
|
138
|
+
Return success: true.
|
|
139
|
+
sample_request:
|
|
140
|
+
account:
|
|
141
|
+
sandbox: true
|
|
142
|
+
account_id: "acct_pagination_integrity_formats"
|
|
143
|
+
scenario: "seed_creative_format"
|
|
144
|
+
params:
|
|
145
|
+
format_id: "pagination_integrity_format_2"
|
|
146
|
+
fixture:
|
|
147
|
+
name: "Pagination Integrity Format B"
|
|
148
|
+
type: "display"
|
|
149
|
+
context:
|
|
150
|
+
correlation_id: "pagination_integrity_creative_formats--seed_2"
|
|
151
|
+
validations:
|
|
152
|
+
- check: field_value
|
|
153
|
+
path: "success"
|
|
154
|
+
value: true
|
|
155
|
+
description: "Seed acknowledged"
|
|
156
|
+
|
|
157
|
+
- id: pagination_walk
|
|
158
|
+
title: "Walk pages with max_results=1"
|
|
159
|
+
narrative: |
|
|
160
|
+
With two matching seeded formats and `max_results: 1`, the first call
|
|
161
|
+
MUST return a continuation page (has_more=true with a cursor). The
|
|
162
|
+
runner then follows the cursor; the second call MUST return a terminal
|
|
163
|
+
page (has_more=false with no cursor).
|
|
164
|
+
|
|
165
|
+
steps:
|
|
166
|
+
- id: first_page
|
|
167
|
+
title: "Request the first page with max_results=1"
|
|
168
|
+
narrative: |
|
|
169
|
+
The buyer asks for one matching test format at a time. The agent has
|
|
170
|
+
two seeded formats matching the name search, so the first page is
|
|
171
|
+
non-terminal. The runner captures `pagination.cursor` for the
|
|
172
|
+
follow-up step.
|
|
173
|
+
task: list_creative_formats
|
|
174
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
175
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
176
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
177
|
+
comply_scenario: pagination_integrity
|
|
178
|
+
stateful: true
|
|
179
|
+
context_outputs:
|
|
180
|
+
- name: next_cursor
|
|
181
|
+
path: "pagination.cursor"
|
|
182
|
+
expected: |
|
|
183
|
+
Return one format with:
|
|
184
|
+
- pagination.has_more = true
|
|
185
|
+
- pagination.cursor present (an opaque continuation token)
|
|
186
|
+
|
|
187
|
+
sample_request:
|
|
188
|
+
account:
|
|
189
|
+
account_id: "acct_pagination_integrity_formats"
|
|
190
|
+
name_search: "Pagination Integrity Format"
|
|
191
|
+
pagination:
|
|
192
|
+
max_results: 1
|
|
193
|
+
context:
|
|
194
|
+
correlation_id: "pagination_integrity_creative_formats--first_page"
|
|
195
|
+
validations:
|
|
196
|
+
- check: response_schema
|
|
197
|
+
description: "Response matches list-creative-formats-response.json schema"
|
|
198
|
+
- check: field_value
|
|
199
|
+
path: "pagination.has_more"
|
|
200
|
+
value: true
|
|
201
|
+
description: "Two formats seeded with max_results=1 → first page is non-terminal"
|
|
202
|
+
- check: field_present
|
|
203
|
+
path: "pagination.cursor"
|
|
204
|
+
description: "has_more=true requires a cursor — without one the caller cannot continue"
|
|
205
|
+
- check: field_value_or_absent
|
|
206
|
+
path: "pagination.total_count"
|
|
207
|
+
allowed_values: [2]
|
|
208
|
+
description: "If volunteered, total_count MUST equal the seeded set size of two"
|
|
209
|
+
- check: field_present
|
|
210
|
+
path: "context"
|
|
211
|
+
description: "Response echoes back the context object"
|
|
212
|
+
- check: field_value
|
|
213
|
+
path: "context.correlation_id"
|
|
214
|
+
value: "pagination_integrity_creative_formats--first_page"
|
|
215
|
+
description: "Context correlation_id returned unchanged"
|
|
216
|
+
|
|
217
|
+
- id: terminal_page
|
|
218
|
+
title: "Follow the cursor to the terminal page"
|
|
219
|
+
narrative: |
|
|
220
|
+
The buyer follows the captured cursor. With one format remaining
|
|
221
|
+
the agent MUST return a terminal page: `has_more=false` with no
|
|
222
|
+
`cursor` field. A cursor on `has_more=false` is a stale token
|
|
223
|
+
that invites callers to follow it past the end of results.
|
|
224
|
+
task: list_creative_formats
|
|
225
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
226
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
227
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
228
|
+
comply_scenario: pagination_integrity
|
|
229
|
+
stateful: true
|
|
230
|
+
expected: |
|
|
231
|
+
Return the remaining format with:
|
|
232
|
+
- pagination.has_more = false
|
|
233
|
+
- pagination.cursor absent
|
|
234
|
+
|
|
235
|
+
sample_request:
|
|
236
|
+
account:
|
|
237
|
+
account_id: "acct_pagination_integrity_formats"
|
|
238
|
+
name_search: "Pagination Integrity Format"
|
|
239
|
+
pagination:
|
|
240
|
+
cursor: "$context.next_cursor"
|
|
241
|
+
max_results: 1
|
|
242
|
+
context:
|
|
243
|
+
correlation_id: "pagination_integrity_creative_formats--terminal_page"
|
|
244
|
+
validations:
|
|
245
|
+
- check: response_schema
|
|
246
|
+
description: "Response matches list-creative-formats-response.json schema"
|
|
247
|
+
- check: field_value
|
|
248
|
+
path: "pagination.has_more"
|
|
249
|
+
value: false
|
|
250
|
+
description: "After two pages of one item the seeded set is exhausted"
|
|
251
|
+
- check: field_value_or_absent
|
|
252
|
+
path: "pagination.cursor"
|
|
253
|
+
allowed_values: [null]
|
|
254
|
+
description: "Terminal page MUST omit cursor (null also accepted for clients that explicitly clear the field)"
|
|
255
|
+
- check: field_value_or_absent
|
|
256
|
+
path: "pagination.total_count"
|
|
257
|
+
allowed_values: [2]
|
|
258
|
+
description: "total_count (when volunteered) MUST stay stable across pages and equal the seeded set size"
|
|
259
|
+
- check: field_present
|
|
260
|
+
path: "context"
|
|
261
|
+
description: "Response echoes back the context object"
|
|
262
|
+
- check: field_value
|
|
263
|
+
path: "context.correlation_id"
|
|
264
|
+
value: "pagination_integrity_creative_formats--terminal_page"
|
|
265
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
id: pagination_integrity_list_accounts
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Pagination continuation integrity — list_accounts"
|
|
4
|
+
category: schema_validation
|
|
5
|
+
summary: "Validates the has_more=true continuation side of list_accounts pagination by creating sandbox accounts, requesting a small first page, and following its cursor once."
|
|
6
|
+
track: core
|
|
7
|
+
required_tools:
|
|
8
|
+
- list_accounts
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
Pagination is cursor-based across AdCP. Every response carrying a
|
|
12
|
+
`pagination` block satisfies a single invariant: when `has_more` is true the
|
|
13
|
+
`cursor` MUST be present (callers need it to fetch the next page); when
|
|
14
|
+
`has_more` is false the `cursor` MUST be absent (a stale token on a terminal
|
|
15
|
+
page invites callers to follow it into undefined behavior).
|
|
16
|
+
|
|
17
|
+
The invariant is documented in prose on
|
|
18
|
+
`static/schemas/source/core/pagination-response.json` but JSON Schema does
|
|
19
|
+
not gate the two fields against each other. This storyboard exercises the
|
|
20
|
+
continuation side on `list_accounts`: when `has_more=true`, `cursor` must be
|
|
21
|
+
present and usable.
|
|
22
|
+
|
|
23
|
+
The runner bootstraps three sandbox accounts via `sync_accounts`, then
|
|
24
|
+
lists sandbox accounts back with `max_results=2`. The first page MUST cap
|
|
25
|
+
at two accounts and signal continuation with `has_more=true` plus a cursor.
|
|
26
|
+
The runner then follows that cursor to prove the continuation token is usable.
|
|
27
|
+
Agents may have pre-existing sandbox accounts, so this storyboard deliberately
|
|
28
|
+
does not assert that the second observed page is terminal or that
|
|
29
|
+
`total_count` equals exactly three. The terminal side of the invariant is
|
|
30
|
+
covered by pagination storyboards with isolated seeded result sets; adding
|
|
31
|
+
equivalent account seeding with isolated lookup semantics is tracked
|
|
32
|
+
separately.
|
|
33
|
+
|
|
34
|
+
agent:
|
|
35
|
+
interaction_model: stateful_preloaded
|
|
36
|
+
capabilities: []
|
|
37
|
+
examples:
|
|
38
|
+
- "Any AdCP agent that exposes a paginated list_accounts"
|
|
39
|
+
|
|
40
|
+
caller:
|
|
41
|
+
role: buyer_agent
|
|
42
|
+
example: "Compliance test harness"
|
|
43
|
+
|
|
44
|
+
prerequisites:
|
|
45
|
+
description: |
|
|
46
|
+
The storyboard bootstraps three accounts in the setup phase via
|
|
47
|
+
`sync_accounts`. The seed-DAG documented at
|
|
48
|
+
`static/compliance/source/universal/storyboard-schema.yaml` does not
|
|
49
|
+
include accounts (today's seed kinds are products, pricing_options,
|
|
50
|
+
creatives, plans, media_buys), so this storyboard deliberately
|
|
51
|
+
departs from the `controller_seeding: true` precedent used by
|
|
52
|
+
`pagination-integrity.yaml` (list_creatives) and bootstraps via
|
|
53
|
+
real protocol calls. Adding `seed_account` to the controller is
|
|
54
|
+
tracked separately; until then the create-then-list pattern keeps
|
|
55
|
+
the storyboard self-contained without extending the seed taxonomy.
|
|
56
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
57
|
+
controller_seeding: false
|
|
58
|
+
|
|
59
|
+
phases:
|
|
60
|
+
- id: capability_discovery
|
|
61
|
+
title: "Capability discovery"
|
|
62
|
+
narrative: |
|
|
63
|
+
Confirm the agent responds to get_adcp_capabilities before
|
|
64
|
+
exercising list_accounts.
|
|
65
|
+
steps:
|
|
66
|
+
- id: get_capabilities
|
|
67
|
+
title: "Check agent capabilities"
|
|
68
|
+
narrative: |
|
|
69
|
+
Verify that the agent declares supported protocols before
|
|
70
|
+
driving paginated list_accounts.
|
|
71
|
+
task: get_adcp_capabilities
|
|
72
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
73
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
74
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
75
|
+
comply_scenario: capability_discovery
|
|
76
|
+
stateful: false
|
|
77
|
+
expected: |
|
|
78
|
+
Return capabilities declaring supported protocols.
|
|
79
|
+
|
|
80
|
+
sample_request:
|
|
81
|
+
context:
|
|
82
|
+
correlation_id: "pagination_integrity_list_accounts--get_capabilities"
|
|
83
|
+
validations:
|
|
84
|
+
- check: response_schema
|
|
85
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
86
|
+
- check: field_present
|
|
87
|
+
path: "supported_protocols"
|
|
88
|
+
description: "Agent declares supported protocols"
|
|
89
|
+
|
|
90
|
+
- check: field_present
|
|
91
|
+
path: "context"
|
|
92
|
+
description: "Response echoes back the context object"
|
|
93
|
+
- check: field_value
|
|
94
|
+
path: "context.correlation_id"
|
|
95
|
+
value: "pagination_integrity_list_accounts--get_capabilities"
|
|
96
|
+
description: "Context correlation_id returned unchanged"
|
|
97
|
+
|
|
98
|
+
- id: setup
|
|
99
|
+
title: "Bootstrap three test accounts"
|
|
100
|
+
narrative: |
|
|
101
|
+
Sync three sandbox accounts so the pagination walk has at least three
|
|
102
|
+
sandbox items to page through with max_results=2.
|
|
103
|
+
steps:
|
|
104
|
+
- id: sync_three_accounts
|
|
105
|
+
title: "Sync three sandbox accounts"
|
|
106
|
+
narrative: |
|
|
107
|
+
Create three sandbox accounts — Acme c/o Pinnacle, Nova c/o Pinnacle,
|
|
108
|
+
and Pinnacle Direct. The agent MUST accept all three and respond with
|
|
109
|
+
account_id values that subsequent list_accounts calls surface.
|
|
110
|
+
task: sync_accounts
|
|
111
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
112
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
113
|
+
doc_ref: "/accounts/task-reference/sync_accounts"
|
|
114
|
+
comply_scenario: pagination_integrity_list_accounts
|
|
115
|
+
stateful: true
|
|
116
|
+
expected: |
|
|
117
|
+
Accept all three accounts and return account_id for each.
|
|
118
|
+
|
|
119
|
+
sample_request:
|
|
120
|
+
accounts:
|
|
121
|
+
- brand:
|
|
122
|
+
domain: acme-corp.com
|
|
123
|
+
operator: pinnacle-media.com
|
|
124
|
+
billing: operator
|
|
125
|
+
sandbox: true
|
|
126
|
+
- brand:
|
|
127
|
+
domain: nova-brands.com
|
|
128
|
+
operator: pinnacle-media.com
|
|
129
|
+
billing: operator
|
|
130
|
+
sandbox: true
|
|
131
|
+
- brand:
|
|
132
|
+
domain: pinnacle-media.com
|
|
133
|
+
operator: pinnacle-media.com
|
|
134
|
+
billing: operator
|
|
135
|
+
sandbox: true
|
|
136
|
+
|
|
137
|
+
idempotency_key: "$generate:uuid_v4#pagination_integrity_list_accounts_setup_sync_three_accounts"
|
|
138
|
+
context:
|
|
139
|
+
correlation_id: "pagination_integrity_list_accounts--setup"
|
|
140
|
+
validations:
|
|
141
|
+
- check: response_schema
|
|
142
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
143
|
+
- check: field_present
|
|
144
|
+
path: "accounts"
|
|
145
|
+
description: "Response contains accounts array"
|
|
146
|
+
|
|
147
|
+
- id: pagination_walk
|
|
148
|
+
title: "Walk pages with a small max_results"
|
|
149
|
+
narrative: |
|
|
150
|
+
With at least three sandbox accounts and `max_results: 2`, the first call
|
|
151
|
+
MUST return a continuation page (has_more=true with a cursor). The
|
|
152
|
+
runner then follows the cursor and validates the next page response shape.
|
|
153
|
+
|
|
154
|
+
steps:
|
|
155
|
+
- id: first_page
|
|
156
|
+
title: "Request the first page with max_results=2"
|
|
157
|
+
narrative: |
|
|
158
|
+
The buyer asks for up to two sandbox accounts. The agent has at least
|
|
159
|
+
three matching accounts, so the request is non-terminal: callers expect
|
|
160
|
+
`has_more=true` and a `cursor` they can follow to retrieve the
|
|
161
|
+
remaining account.
|
|
162
|
+
|
|
163
|
+
The runner captures `pagination.cursor` into `$context.next_cursor`
|
|
164
|
+
for the follow-up step. If the agent reports `has_more=false` on
|
|
165
|
+
this page (hiding the seeded third sandbox account behind a dishonest
|
|
166
|
+
terminal signal), the field_value check on `pagination.has_more`
|
|
167
|
+
fails — surfacing exactly the bug class this storyboard exists to
|
|
168
|
+
catch.
|
|
169
|
+
task: list_accounts
|
|
170
|
+
schema_ref: "account/list-accounts-request.json"
|
|
171
|
+
response_schema_ref: "account/list-accounts-response.json"
|
|
172
|
+
doc_ref: "/accounts/task-reference/list_accounts"
|
|
173
|
+
comply_scenario: pagination_integrity_list_accounts
|
|
174
|
+
stateful: true
|
|
175
|
+
context_outputs:
|
|
176
|
+
- name: next_cursor
|
|
177
|
+
path: "pagination.cursor"
|
|
178
|
+
expected: |
|
|
179
|
+
Return up to two accounts with:
|
|
180
|
+
- pagination.has_more = true
|
|
181
|
+
- pagination.cursor present (an opaque continuation token)
|
|
182
|
+
|
|
183
|
+
sample_request:
|
|
184
|
+
sandbox: true
|
|
185
|
+
pagination:
|
|
186
|
+
max_results: 2
|
|
187
|
+
|
|
188
|
+
context:
|
|
189
|
+
correlation_id: "pagination_integrity_list_accounts--first_page"
|
|
190
|
+
validations:
|
|
191
|
+
- check: response_schema
|
|
192
|
+
description: "Response matches list-accounts-response.json schema"
|
|
193
|
+
- check: field_value
|
|
194
|
+
path: "pagination.has_more"
|
|
195
|
+
value: true
|
|
196
|
+
description: "At least three sandbox accounts exist with max_results=2 → first page is non-terminal"
|
|
197
|
+
- check: field_present
|
|
198
|
+
path: "pagination.cursor"
|
|
199
|
+
description: "has_more=true requires a cursor — without one the caller cannot continue"
|
|
200
|
+
- check: field_present
|
|
201
|
+
path: "context"
|
|
202
|
+
description: "Response echoes back the context object"
|
|
203
|
+
- check: field_value
|
|
204
|
+
path: "context.correlation_id"
|
|
205
|
+
value: "pagination_integrity_list_accounts--first_page"
|
|
206
|
+
description: "Context correlation_id returned unchanged"
|
|
207
|
+
|
|
208
|
+
- id: next_page
|
|
209
|
+
title: "Follow the cursor to the next page"
|
|
210
|
+
narrative: |
|
|
211
|
+
The buyer follows the captured cursor. The response MUST remain
|
|
212
|
+
schema-valid and echo context. The runner does not require this page
|
|
213
|
+
to be terminal because sellers may already have more than the three
|
|
214
|
+
sandbox accounts created during setup.
|
|
215
|
+
task: list_accounts
|
|
216
|
+
schema_ref: "account/list-accounts-request.json"
|
|
217
|
+
response_schema_ref: "account/list-accounts-response.json"
|
|
218
|
+
doc_ref: "/accounts/task-reference/list_accounts"
|
|
219
|
+
comply_scenario: pagination_integrity_list_accounts
|
|
220
|
+
stateful: true
|
|
221
|
+
expected: |
|
|
222
|
+
Return the next page of sandbox accounts with a valid pagination block.
|
|
223
|
+
|
|
224
|
+
sample_request:
|
|
225
|
+
sandbox: true
|
|
226
|
+
pagination:
|
|
227
|
+
cursor: "$context.next_cursor"
|
|
228
|
+
max_results: 2
|
|
229
|
+
|
|
230
|
+
context:
|
|
231
|
+
correlation_id: "pagination_integrity_list_accounts--next_page"
|
|
232
|
+
validations:
|
|
233
|
+
- check: response_schema
|
|
234
|
+
description: "Response matches list-accounts-response.json schema"
|
|
235
|
+
- check: field_present
|
|
236
|
+
path: "pagination.has_more"
|
|
237
|
+
description: "Pagination response declares whether more sandbox accounts remain"
|
|
238
|
+
|
|
239
|
+
- check: field_present
|
|
240
|
+
path: "context"
|
|
241
|
+
description: "Response echoes back the context object"
|
|
242
|
+
- check: field_value
|
|
243
|
+
path: "context.correlation_id"
|
|
244
|
+
value: "pagination_integrity_list_accounts--next_page"
|
|
245
|
+
description: "Context correlation_id returned unchanged"
|