@adcp/sdk 7.11.0 → 7.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compliance/cache/3.1.0-rc.2/domains/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/domains/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/domains/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/domains/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/index.json +356 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/index.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/distributed_brand_resolution.yaml +415 -0
- package/compliance/cache/3.1.0-rc.2/protocols/brand/scenarios/single_side_trust_extension.yaml +454 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/index.yaml +339 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/billing_out_of_band.yaml +153 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/canonical_supported_formats.yaml +212 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/creative_lifecycle_webhooks.yaml +389 -0
- package/compliance/cache/3.1.0-rc.2/protocols/creative/scenarios/native_in_feed.yaml +543 -0
- package/compliance/cache/3.1.0-rc.2/protocols/governance/index.yaml +682 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/index.yaml +789 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/audience_buy_flow.yaml +380 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/available_actions.yaml +565 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/billing_finality_delivery.yaml +354 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/canonical_formats.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/clicks_buy_flow.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/completed_views_buy_flow.yaml +344 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/create_media_buy_async.yaml +234 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +419 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/creative_reception.yaml +247 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/delivery_reporting.yaml +357 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment.yaml +633 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/dependency_impairment_cardinality.yaml +800 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/event_dedup_flow.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/frequency_cap_enforcement.yaml +309 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_approved.yaml +214 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_conditions.yaml +199 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/governance_denied_recovery.yaml +252 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/invalid_transitions.yaml +289 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_no_match.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/inventory_list_targeting.yaml +276 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_accountability.yaml +244 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +203 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/package_correlation_legacy_fallback.yaml +113 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +292 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/per_creative_conversion_attribution.yaml +500 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow.yaml +428 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/performance_buy_flow_roas.yaml +470 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/product_signal_targeting.yaml +373 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize.yaml +399 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_finalize_asap_timing.yaml +264 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/proposal_not_found_errors.yaml +257 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_audit_observation.yaml +333 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_enforcement.yaml +517 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/provenance_truth_of_claim.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/reach_buy_flow.yaml +823 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_finalize_exclusivity.yaml +360 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_accountability.yaml +293 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_catalog_precondition.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/scenarios/vendor_metric_optimization_flow.yaml +576 -0
- package/compliance/cache/3.1.0-rc.2/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.1.0-rc.2/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.1.0-rc.2/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/audience-sync/index.yaml +313 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/brand-rights/scenarios/governance_denied.yaml +226 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-ad-server/index.yaml +409 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/generative-seller.yaml +807 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-generative/index.yaml +758 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/creative-template/index.yaml +510 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/index.yaml +143 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-aware-seller/scenarios/governance_multi_agent_rejected.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-broadcast-tv/index.yaml +738 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-catalog-driven/index.yaml +840 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-guaranteed/index.yaml +601 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-non-guaranteed/index.yaml +546 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-proposal-mode/index.yaml +586 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sales-social/index.yaml +919 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/index.yaml +424 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-marketplace/scenarios/governance_denied.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/signal-owned/index.yaml +317 -0
- package/compliance/cache/3.1.0-rc.2/specialisms/sponsored-intelligence/index.yaml +59 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor-live.yaml +78 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/acme-outdoor.yaml +223 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/billing-gate-runner.yaml +115 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/distributed-brand-runner.yaml +281 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/parallel-dispatch-runner.yaml +196 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/rate-limit-trip-runner.yaml +172 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/single-side-trust-runner.yaml +294 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/substitution-observer-runner.yaml +688 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/README.md +220 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/negative/028-unsigned-protocol-method-required.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.1.0-rc.2/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.1.0-rc.2/universal/billing-gate-dispatch.yaml +450 -0
- package/compliance/cache/3.1.0-rc.2/universal/canonical-format-validate-input.yaml +640 -0
- package/compliance/cache/3.1.0-rc.2/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.1.0-rc.2/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.1.0-rc.2/universal/comply-controller-mode-gate.yaml +141 -0
- package/compliance/cache/3.1.0-rc.2/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.1.0-rc.2/universal/deterministic-testing.yaml +1430 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance-signals.yaml +377 -0
- package/compliance/cache/3.1.0-rc.2/universal/error-compliance.yaml +528 -0
- package/compliance/cache/3.1.0-rc.2/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.1.0-rc.2/universal/get-signals-pagination-integrity.yaml +210 -0
- package/compliance/cache/3.1.0-rc.2/universal/idempotency.yaml +861 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-event-scope.yaml +119 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-lifecycle.yaml +337 -0
- package/compliance/cache/3.1.0-rc.2/universal/notification-config-rejections.yaml +107 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-creative-formats.yaml +265 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity-list-accounts.yaml +245 -0
- package/compliance/cache/3.1.0-rc.2/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.1.0-rc.2/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.1.0-rc.2/universal/read-tool-idempotency.yaml +405 -0
- package/compliance/cache/3.1.0-rc.2/universal/runner-output-contract.yaml +1285 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation-signals.yaml +181 -0
- package/compliance/cache/3.1.0-rc.2/universal/schema-validation.yaml +548 -0
- package/compliance/cache/3.1.0-rc.2/universal/security.yaml +539 -0
- package/compliance/cache/3.1.0-rc.2/universal/signed-requests.yaml +217 -0
- package/compliance/cache/3.1.0-rc.2/universal/stale-response-advisory.yaml +295 -0
- package/compliance/cache/3.1.0-rc.2/universal/storyboard-schema.yaml +2194 -0
- package/compliance/cache/3.1.0-rc.2/universal/v3-envelope-integrity.yaml +117 -0
- package/compliance/cache/3.1.0-rc.2/universal/version-negotiation.yaml +130 -0
- package/compliance/cache/3.1.0-rc.2/universal/webhook-emission.yaml +411 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-bulk-webhooks.yaml +82 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-product-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-products.yaml +151 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signal-webhooks.yaml +83 -0
- package/compliance/cache/3.1.0-rc.2/universal/wholesale-feed-signals.yaml +149 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/testing/storyboard/default-invariants.js +23 -0
- package/dist/lib/testing/storyboard/default-invariants.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +84 -21
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +21 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/types.js.map +1 -1
- package/dist/lib/testing/types.d.ts +9 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
id: billing_gate_dispatch
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Billing-gate dispatch — sync_accounts capability vs per-buyer-agent gate"
|
|
4
|
+
category: error_compliance
|
|
5
|
+
summary: "Validates the two distinct billing-rejection paths on sync_accounts — seller-wide capability gate (BILLING_NOT_SUPPORTED) and per-buyer-agent commercial-relationship gate (BILLING_NOT_PERMITTED_FOR_AGENT) — and the clamped error.details shape that prevents the per-agent code from acting as a commercial-state oracle."
|
|
6
|
+
track: error_handling
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_adcp_capabilities
|
|
9
|
+
- sync_accounts
|
|
10
|
+
|
|
11
|
+
narrative: |
|
|
12
|
+
Two distinct gates can reject `sync_accounts.billing`, and SDKs MUST
|
|
13
|
+
dispatch on the right code so recovery is autonomous-precise rather
|
|
14
|
+
than collapse-to-a-single-retry-loop:
|
|
15
|
+
|
|
16
|
+
- **`BILLING_NOT_SUPPORTED`** — seller-wide capability gate. The seller's
|
|
17
|
+
`supported_billing` capability does not include the requested value,
|
|
18
|
+
or the seller has no direct billing relationship with the operator on
|
|
19
|
+
this specific account. Recovery: pick a value from `supported_billing`
|
|
20
|
+
and retry. `error.details.scope` ∈ `{"capability", "account"}`
|
|
21
|
+
disambiguates which sub-gate fired (per
|
|
22
|
+
`error-details/billing-not-supported.json`).
|
|
23
|
+
|
|
24
|
+
- **`BILLING_NOT_PERMITTED_FOR_AGENT`** — per-buyer-agent commercial
|
|
25
|
+
gate. The seller's capability accepts the value, but the calling
|
|
26
|
+
buyer agent's commercial relationship does not — e.g., the agent is
|
|
27
|
+
onboarded as passthrough-only (no payments relationship — only the
|
|
28
|
+
operator can be invoiced). Recovery: submit a new request with the
|
|
29
|
+
seller's `error.details.suggested_billing` value (typically
|
|
30
|
+
`operator`) under a fresh `idempotency_key` — same key + different
|
|
31
|
+
payload would produce IDEMPOTENCY_CONFLICT per error-handling.mdx.
|
|
32
|
+
Surface to a human when `suggested_billing` is absent — the agent cannot extend
|
|
33
|
+
its own commercial relationship. `error.details` MUST conform to
|
|
34
|
+
`error-details/billing-not-permitted-for-agent.json` —
|
|
35
|
+
`additionalProperties: false`, `rejected_billing` plus optional
|
|
36
|
+
`suggested_billing`. The shape MUST NOT carry the agent's full
|
|
37
|
+
permitted-billing subset, rate cards, payment terms, credit limit,
|
|
38
|
+
billing entity, or any other per-agent commercial state.
|
|
39
|
+
|
|
40
|
+
Critical security invariant: sellers MUST emit
|
|
41
|
+
`BILLING_NOT_PERMITTED_FOR_AGENT` only after agent identity has been
|
|
42
|
+
established via signed-request derivation or a credential-to-agent
|
|
43
|
+
mapping in the seller's onboarding record. Callers without
|
|
44
|
+
established identity MUST receive `BILLING_NOT_SUPPORTED` instead —
|
|
45
|
+
emitting the per-agent code without established identity is a
|
|
46
|
+
cross-tenant onboarding oracle (same uniform-response shape required
|
|
47
|
+
by the `*_NOT_FOUND` family). This storyboard does not attempt to
|
|
48
|
+
exercise that branch directly because the runner authenticates with
|
|
49
|
+
the agent under test via `test_kit.auth.api_key` before the
|
|
50
|
+
per-agent phases run, so by construction it always operates under
|
|
51
|
+
established identity. The authenticated-vs-unauthenticated branch is
|
|
52
|
+
exercised by the universal `error_compliance` storyboard's
|
|
53
|
+
cross-tenant uniform-response phases.
|
|
54
|
+
|
|
55
|
+
Phase structure:
|
|
56
|
+
|
|
57
|
+
- **`capability_discovery`** reads `account.supported_billing` from
|
|
58
|
+
`get_adcp_capabilities` so subsequent phases can dispatch.
|
|
59
|
+
|
|
60
|
+
- **`capability_gate`** runs only when the test kit declares
|
|
61
|
+
`account.unsupported_billing_probe` (a value the seller does NOT
|
|
62
|
+
support at the capability level). The runner submits that value
|
|
63
|
+
and asserts `BILLING_NOT_SUPPORTED` with `error.details.scope:
|
|
64
|
+
"capability"` and `error.details.supported_billing` echoing the
|
|
65
|
+
seller's capability. Skipped when the field is absent (sellers
|
|
66
|
+
whose `supported_billing` is the full three-value set leave the
|
|
67
|
+
field unset).
|
|
68
|
+
|
|
69
|
+
- **`per_agent_gate_reject`** runs only when the test kit declares
|
|
70
|
+
`commercial_relationship: "passthrough_only"`. The runner submits
|
|
71
|
+
`billing: "agent"` (a value `supported_billing` accepts but the
|
|
72
|
+
per-agent record does not), and asserts
|
|
73
|
+
`BILLING_NOT_PERMITTED_FOR_AGENT` with the clamped
|
|
74
|
+
`error.details` shape. The seller's `suggested_billing` value is
|
|
75
|
+
captured into context for the recover phase.
|
|
76
|
+
|
|
77
|
+
- **`per_agent_gate_recover`** chains off the previous phase and
|
|
78
|
+
submits a NEW request — using the seller's nominated
|
|
79
|
+
`suggested_billing` as the `billing` value, under a fresh
|
|
80
|
+
`idempotency_key` — and asserts a successful provisioning. The
|
|
81
|
+
recover phase is NOT a replay; it's a separate request with a
|
|
82
|
+
different payload, so a fresh idempotency_key is required (same
|
|
83
|
+
key + different payload yields IDEMPOTENCY_CONFLICT per
|
|
84
|
+
error-handling.mdx). Skipped when the test kit does not declare
|
|
85
|
+
`commercial_relationship: "passthrough_only"`. Failure of the
|
|
86
|
+
reject phase cascades: recover does not assert on its own.
|
|
87
|
+
|
|
88
|
+
Storyboards-as-fixtures: a single specification artifact ratifies
|
|
89
|
+
the dispatch contract once for every SDK. Ahead of full controller
|
|
90
|
+
support for toggling per-agent commercial state programmatically
|
|
91
|
+
(out of scope for this storyboard — see "Follow-ups" below), the
|
|
92
|
+
per-agent phases are gated on a static test-kit declaration so
|
|
93
|
+
conformance can be measured against any seller whose test kit makes
|
|
94
|
+
the precondition explicit.
|
|
95
|
+
|
|
96
|
+
agent:
|
|
97
|
+
interaction_model: media_buy_seller
|
|
98
|
+
capabilities: []
|
|
99
|
+
examples:
|
|
100
|
+
- "Any AdCP agent that accepts sync_accounts"
|
|
101
|
+
|
|
102
|
+
caller:
|
|
103
|
+
role: buyer_agent
|
|
104
|
+
example: "Compliance test harness"
|
|
105
|
+
|
|
106
|
+
prerequisites:
|
|
107
|
+
description: |
|
|
108
|
+
The agent under test exposes `sync_accounts` and advertises an
|
|
109
|
+
`account` capability block in `get_adcp_capabilities` populated with
|
|
110
|
+
`supported_billing`.
|
|
111
|
+
|
|
112
|
+
Test-kit precondition fields (see `test-kits/billing-gate-runner.yaml`
|
|
113
|
+
for the canonical example):
|
|
114
|
+
|
|
115
|
+
account.unsupported_billing_probe — (optional) value the runner
|
|
116
|
+
submits on the capability-gate phase. MUST be absent from the
|
|
117
|
+
seller's `supported_billing`. When unset, capability_gate grades
|
|
118
|
+
`not_applicable`.
|
|
119
|
+
|
|
120
|
+
commercial_relationship — (optional) declares whether the calling
|
|
121
|
+
buyer agent is registered with the seller as passthrough-only.
|
|
122
|
+
When set to "passthrough_only", per_agent_gate_reject and
|
|
123
|
+
per_agent_gate_recover run. When unset or set to anything else,
|
|
124
|
+
both per-agent phases grade `not_applicable`.
|
|
125
|
+
|
|
126
|
+
Establishing the commercial relationship is offline — the
|
|
127
|
+
seller-under-test records the test caller's commercial state in its
|
|
128
|
+
onboarding system before the storyboard runs. A future extension
|
|
129
|
+
(`comply_test_controller` `seed_buyer_agent`) MAY let runners
|
|
130
|
+
establish the precondition programmatically; until then the test
|
|
131
|
+
kit declares it.
|
|
132
|
+
test_kit: "test-kits/billing-gate-runner.yaml"
|
|
133
|
+
controller_seeding: false
|
|
134
|
+
|
|
135
|
+
phases:
|
|
136
|
+
- id: capability_discovery
|
|
137
|
+
title: "Capability discovery"
|
|
138
|
+
narrative: |
|
|
139
|
+
Read `account.supported_billing` so subsequent phases can dispatch
|
|
140
|
+
on which gate is testable for this seller.
|
|
141
|
+
|
|
142
|
+
steps:
|
|
143
|
+
- id: get_capabilities
|
|
144
|
+
title: "Read supported_billing"
|
|
145
|
+
narrative: |
|
|
146
|
+
The runner inspects `account.supported_billing` to confirm the
|
|
147
|
+
seller advertises billing capabilities at all and to provide
|
|
148
|
+
context for downstream validators (e.g., the capability-gate
|
|
149
|
+
phase echoes the seller's capability list back in the error
|
|
150
|
+
response).
|
|
151
|
+
task: get_adcp_capabilities
|
|
152
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
153
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
154
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
155
|
+
comply_scenario: capability_discovery
|
|
156
|
+
stateful: false
|
|
157
|
+
expected: |
|
|
158
|
+
Return capabilities including `account.supported_billing` listing
|
|
159
|
+
which `billing` values the seller accepts at the wire-capability
|
|
160
|
+
level.
|
|
161
|
+
|
|
162
|
+
sample_request:
|
|
163
|
+
context:
|
|
164
|
+
correlation_id: "billing_gate_dispatch--get_capabilities"
|
|
165
|
+
|
|
166
|
+
context_outputs:
|
|
167
|
+
- path: "account.supported_billing"
|
|
168
|
+
key: "supported_billing"
|
|
169
|
+
|
|
170
|
+
validations:
|
|
171
|
+
- check: response_schema
|
|
172
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
173
|
+
- check: field_present
|
|
174
|
+
path: "account.supported_billing"
|
|
175
|
+
description: "Seller declares supported_billing"
|
|
176
|
+
- check: field_present
|
|
177
|
+
path: "context"
|
|
178
|
+
description: "Response echoes back the context object"
|
|
179
|
+
- check: field_value
|
|
180
|
+
path: "context.correlation_id"
|
|
181
|
+
value: "billing_gate_dispatch--get_capabilities"
|
|
182
|
+
description: "Context correlation_id returned unchanged"
|
|
183
|
+
|
|
184
|
+
- id: capability_gate
|
|
185
|
+
title: "Capability gate — BILLING_NOT_SUPPORTED"
|
|
186
|
+
optional: true
|
|
187
|
+
skip_if: "!test_kit.account.unsupported_billing_probe"
|
|
188
|
+
narrative: |
|
|
189
|
+
When the test kit declares `account.unsupported_billing_probe` (a
|
|
190
|
+
value the seller does NOT support at the capability level), the
|
|
191
|
+
runner submits that value and asserts the seller-wide capability
|
|
192
|
+
gate fires with structured `error.details`. Skipped when the field
|
|
193
|
+
is absent (sellers whose `supported_billing` is the full
|
|
194
|
+
three-value set leave the kit field unset).
|
|
195
|
+
|
|
196
|
+
steps:
|
|
197
|
+
- id: sync_accounts_unsupported_billing
|
|
198
|
+
title: "Submit a billing value the seller does not support"
|
|
199
|
+
task: sync_accounts
|
|
200
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
201
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
202
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
203
|
+
# sync_accounts returns transport-level success with per-account
|
|
204
|
+
# errors in accounts[].errors[] — this is the per-account-error
|
|
205
|
+
# envelope, not a transport-layer failure. expect_error: true would
|
|
206
|
+
# incorrectly require an MCP isError / A2A failed marker.
|
|
207
|
+
stateful: false
|
|
208
|
+
expected: |
|
|
209
|
+
Reject the per-account upsert with:
|
|
210
|
+
- accounts[0].action: "failed"
|
|
211
|
+
- accounts[0].status: "rejected"
|
|
212
|
+
- accounts[0].errors[0].code: BILLING_NOT_SUPPORTED
|
|
213
|
+
- accounts[0].errors[0].recovery: "correctable"
|
|
214
|
+
- accounts[0].errors[0].details.scope: "capability"
|
|
215
|
+
- accounts[0].errors[0].details.supported_billing: echoes the seller's capability list
|
|
216
|
+
|
|
217
|
+
sample_request:
|
|
218
|
+
accounts:
|
|
219
|
+
- brand:
|
|
220
|
+
domain: "acmeoutdoor.example"
|
|
221
|
+
operator: "pinnacle-agency.example"
|
|
222
|
+
billing: "$test_kit.account.unsupported_billing_probe"
|
|
223
|
+
idempotency_key: "$generate:uuid_v4#billing_gate_dispatch_capability_probe"
|
|
224
|
+
context:
|
|
225
|
+
correlation_id: "billing_gate_dispatch--capability_gate"
|
|
226
|
+
|
|
227
|
+
validations:
|
|
228
|
+
- check: response_schema
|
|
229
|
+
description: "Response matches sync-accounts-response.json schema even on per-account failure"
|
|
230
|
+
- check: field_value
|
|
231
|
+
path: "accounts[0].action"
|
|
232
|
+
value: "failed"
|
|
233
|
+
description: "Per-account action is failed"
|
|
234
|
+
- check: field_value
|
|
235
|
+
path: "accounts[0].status"
|
|
236
|
+
value: "rejected"
|
|
237
|
+
description: "Per-account status is rejected"
|
|
238
|
+
- check: field_value
|
|
239
|
+
value: "BILLING_NOT_SUPPORTED"
|
|
240
|
+
path: "accounts[0].errors[0].code"
|
|
241
|
+
description: "Per-account error code is BILLING_NOT_SUPPORTED"
|
|
242
|
+
- check: field_value
|
|
243
|
+
path: "accounts[0].errors[0].recovery"
|
|
244
|
+
value: "correctable"
|
|
245
|
+
description: "error.recovery is correctable per the enum metadata for BILLING_NOT_SUPPORTED"
|
|
246
|
+
- check: field_value
|
|
247
|
+
path: "accounts[0].errors[0].details.scope"
|
|
248
|
+
value: "capability"
|
|
249
|
+
description: "error.details.scope identifies the capability gate"
|
|
250
|
+
- check: field_present
|
|
251
|
+
path: "accounts[0].errors[0].details.supported_billing"
|
|
252
|
+
description: "error.details.supported_billing echoes the seller's capability"
|
|
253
|
+
- check: field_value
|
|
254
|
+
path: "context.correlation_id"
|
|
255
|
+
value: "billing_gate_dispatch--capability_gate"
|
|
256
|
+
description: "Context correlation_id returned unchanged on error response"
|
|
257
|
+
|
|
258
|
+
- id: per_agent_gate_reject
|
|
259
|
+
title: "Per-agent gate — BILLING_NOT_PERMITTED_FOR_AGENT (reject)"
|
|
260
|
+
optional: true
|
|
261
|
+
skip_if: "test_kit.commercial_relationship != 'passthrough_only'"
|
|
262
|
+
narrative: |
|
|
263
|
+
The test kit declares the calling buyer agent is registered with
|
|
264
|
+
the seller as passthrough-only. The runner submits `billing:
|
|
265
|
+
"agent"` (which `supported_billing` accepts but the per-agent
|
|
266
|
+
record does not) and asserts the per-buyer-agent gate fires with
|
|
267
|
+
the clamped `error.details` shape. The seller's `suggested_billing`
|
|
268
|
+
value is captured into context for the recover phase, which
|
|
269
|
+
submits a new request (with a fresh idempotency_key) using the
|
|
270
|
+
suggested value.
|
|
271
|
+
|
|
272
|
+
steps:
|
|
273
|
+
- id: sync_accounts_passthrough_rejects_agent
|
|
274
|
+
title: "Passthrough-only buyer agent submits billing: agent"
|
|
275
|
+
task: sync_accounts
|
|
276
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
277
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
278
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
279
|
+
# sync_accounts returns transport-level success with per-account
|
|
280
|
+
# errors in accounts[].errors[] — this is the per-account-error
|
|
281
|
+
# envelope, not a transport-layer failure. expect_error: true would
|
|
282
|
+
# incorrectly require an MCP isError / A2A failed marker.
|
|
283
|
+
stateful: false
|
|
284
|
+
expected: |
|
|
285
|
+
Reject the per-account upsert with:
|
|
286
|
+
- accounts[0].action: "failed"
|
|
287
|
+
- accounts[0].status: "rejected"
|
|
288
|
+
- accounts[0].errors[0].code: BILLING_NOT_PERMITTED_FOR_AGENT
|
|
289
|
+
- accounts[0].errors[0].recovery: "correctable"
|
|
290
|
+
- accounts[0].errors[0].details.rejected_billing: "agent"
|
|
291
|
+
- accounts[0].errors[0].details.suggested_billing: a single value drawn from the billing-party enum
|
|
292
|
+
- accounts[0].errors[0].details MUST NOT carry permitted_billing,
|
|
293
|
+
rate_card, payment_terms, credit_limit, billing_entity, or any
|
|
294
|
+
other per-agent commercial state (additionalProperties: false on
|
|
295
|
+
error-details/billing-not-permitted-for-agent.json).
|
|
296
|
+
|
|
297
|
+
sample_request:
|
|
298
|
+
accounts:
|
|
299
|
+
- brand:
|
|
300
|
+
domain: "acmeoutdoor.example"
|
|
301
|
+
operator: "pinnacle-agency.example"
|
|
302
|
+
billing: "agent"
|
|
303
|
+
idempotency_key: "$generate:uuid_v4#billing_gate_dispatch_passthrough_retry"
|
|
304
|
+
context:
|
|
305
|
+
correlation_id: "billing_gate_dispatch--per_agent_reject"
|
|
306
|
+
|
|
307
|
+
context_outputs:
|
|
308
|
+
- path: "accounts[0].errors[0].details.suggested_billing"
|
|
309
|
+
key: "suggested_billing"
|
|
310
|
+
|
|
311
|
+
validations:
|
|
312
|
+
- check: response_schema
|
|
313
|
+
description: "Response matches sync-accounts-response.json schema even on per-account failure"
|
|
314
|
+
- check: field_value
|
|
315
|
+
path: "accounts[0].action"
|
|
316
|
+
value: "failed"
|
|
317
|
+
description: "Per-account action is failed"
|
|
318
|
+
- check: field_value
|
|
319
|
+
path: "accounts[0].status"
|
|
320
|
+
value: "rejected"
|
|
321
|
+
description: "Per-account status is rejected"
|
|
322
|
+
- check: field_value
|
|
323
|
+
value: "BILLING_NOT_PERMITTED_FOR_AGENT"
|
|
324
|
+
path: "accounts[0].errors[0].code"
|
|
325
|
+
description: "Per-account error code is BILLING_NOT_PERMITTED_FOR_AGENT"
|
|
326
|
+
- check: field_value
|
|
327
|
+
path: "accounts[0].errors[0].recovery"
|
|
328
|
+
value: "correctable"
|
|
329
|
+
description: "error.recovery is correctable per the enum metadata for BILLING_NOT_PERMITTED_FOR_AGENT"
|
|
330
|
+
- check: field_value
|
|
331
|
+
path: "accounts[0].errors[0].details.rejected_billing"
|
|
332
|
+
value: "agent"
|
|
333
|
+
description: "error.details.rejected_billing echoes the submitted value"
|
|
334
|
+
- check: field_present
|
|
335
|
+
path: "accounts[0].errors[0].details.suggested_billing"
|
|
336
|
+
description: "error.details.suggested_billing names a value the agent can retry with (typically operator). Recovery is asserted by the per_agent_gate_recover phase succeeding under the suggested value."
|
|
337
|
+
- check: field_absent
|
|
338
|
+
path: "accounts[0].errors[0].details.permitted_billing"
|
|
339
|
+
description: "Full permitted_billing subset MUST NOT be returned (commercial-state oracle)"
|
|
340
|
+
- check: field_absent
|
|
341
|
+
path: "accounts[0].errors[0].details.rate_card"
|
|
342
|
+
description: "rate_card MUST NOT leak through error.details"
|
|
343
|
+
- check: field_absent
|
|
344
|
+
path: "accounts[0].errors[0].details.payment_terms"
|
|
345
|
+
description: "payment_terms MUST NOT leak through error.details"
|
|
346
|
+
- check: field_absent
|
|
347
|
+
path: "accounts[0].errors[0].details.credit_limit"
|
|
348
|
+
description: "credit_limit MUST NOT leak through error.details"
|
|
349
|
+
- check: field_absent
|
|
350
|
+
path: "accounts[0].errors[0].details.billing_entity"
|
|
351
|
+
description: "billing_entity MUST NOT leak through error.details"
|
|
352
|
+
- check: field_absent
|
|
353
|
+
path: "accounts[0].errors[0].details.account_id"
|
|
354
|
+
description: "Per-account state MUST NOT leak through error.details"
|
|
355
|
+
- check: field_value
|
|
356
|
+
path: "context.correlation_id"
|
|
357
|
+
value: "billing_gate_dispatch--per_agent_reject"
|
|
358
|
+
description: "Context correlation_id returned unchanged on error response"
|
|
359
|
+
|
|
360
|
+
- id: per_agent_gate_recover
|
|
361
|
+
title: "Per-agent gate — autonomous recovery via suggested_billing"
|
|
362
|
+
optional: true
|
|
363
|
+
skip_if: "test_kit.commercial_relationship != 'passthrough_only'"
|
|
364
|
+
narrative: |
|
|
365
|
+
The runner submits a new request with the `billing` value the
|
|
366
|
+
seller suggested via `error.details.suggested_billing`, under a
|
|
367
|
+
fresh idempotency_key. The recover phase is NOT a replay of the
|
|
368
|
+
reject phase — same key + different payload would produce
|
|
369
|
+
IDEMPOTENCY_CONFLICT per error-handling.mdx semantics. A successful
|
|
370
|
+
provisioning validates two things: the seller's nominated fallback
|
|
371
|
+
genuinely works on retry (without it, the autonomous-recovery
|
|
372
|
+
branch is dead), and the per-agent gate's recovery is autonomous —
|
|
373
|
+
pivoting on `suggested_billing` produces a working retry without
|
|
374
|
+
human intervention. The recover phase passes only when the
|
|
375
|
+
reject phase passed; if the reject phase fails for a non-
|
|
376
|
+
precondition reason (e.g., 5xx from the agent), this phase's
|
|
377
|
+
assertions are still meaningful but the overall storyboard
|
|
378
|
+
surfaces the upstream failure first.
|
|
379
|
+
|
|
380
|
+
steps:
|
|
381
|
+
- id: sync_accounts_recover_with_suggested
|
|
382
|
+
title: "Retry with the seller's suggested_billing value"
|
|
383
|
+
task: sync_accounts
|
|
384
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
385
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
386
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
387
|
+
stateful: true
|
|
388
|
+
expected: |
|
|
389
|
+
Provision the account using `billing: $context.suggested_billing`.
|
|
390
|
+
accounts[0].action is `created` or `updated`; accounts[0].status
|
|
391
|
+
is `active` or `pending_approval`. The autonomous-retry branch of
|
|
392
|
+
BILLING_NOT_PERMITTED_FOR_AGENT recovery completes here. The
|
|
393
|
+
response echoes back the requested `billing` value so the runner
|
|
394
|
+
can confirm the seller honored the suggested fallback.
|
|
395
|
+
|
|
396
|
+
sample_request:
|
|
397
|
+
accounts:
|
|
398
|
+
- brand:
|
|
399
|
+
domain: "acmeoutdoor.example"
|
|
400
|
+
operator: "pinnacle-agency.example"
|
|
401
|
+
billing: "$context.suggested_billing"
|
|
402
|
+
# Fresh idempotency_key — the recover phase is a new request
|
|
403
|
+
# carrying a different payload (different `billing` value), not
|
|
404
|
+
# a replay. Reusing the reject phase's key would produce
|
|
405
|
+
# IDEMPOTENCY_CONFLICT per error-handling.mdx (same key + different
|
|
406
|
+
# payload within the replay window). Validated end-to-end against
|
|
407
|
+
# the training-agent reference implementation in #3851.
|
|
408
|
+
idempotency_key: "$generate:uuid_v4#billing_gate_dispatch_passthrough_recover"
|
|
409
|
+
context:
|
|
410
|
+
correlation_id: "billing_gate_dispatch--per_agent_recover"
|
|
411
|
+
|
|
412
|
+
validations:
|
|
413
|
+
- check: response_schema
|
|
414
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
415
|
+
- check: field_present
|
|
416
|
+
path: "accounts[0].account_id"
|
|
417
|
+
description: "Account has a platform-assigned ID"
|
|
418
|
+
- check: field_value
|
|
419
|
+
path: "accounts[0].billing"
|
|
420
|
+
value: "$context.suggested_billing"
|
|
421
|
+
description: "Account is provisioned with the seller's suggested_billing value"
|
|
422
|
+
- check: field_value
|
|
423
|
+
path: "context.correlation_id"
|
|
424
|
+
value: "billing_gate_dispatch--per_agent_recover"
|
|
425
|
+
description: "Context correlation_id returned unchanged"
|
|
426
|
+
|
|
427
|
+
# Follow-ups (out of scope for this storyboard, tracked separately):
|
|
428
|
+
#
|
|
429
|
+
# 1. comply_test_controller `seed_buyer_agent` extension — toggling the
|
|
430
|
+
# test caller's commercial_relationship programmatically rather than
|
|
431
|
+
# via static test-kit declaration. Would let any seller exercise both
|
|
432
|
+
# branches of the per-agent gate without a manually-curated test
|
|
433
|
+
# kit. Requires extending the seed-DAG documented in the storyboard
|
|
434
|
+
# schema.
|
|
435
|
+
#
|
|
436
|
+
# 2. Account-scope sub-gate (BILLING_NOT_SUPPORTED with
|
|
437
|
+
# error.details.scope: "account") — tests that the seller-wide
|
|
438
|
+
# capability accepts a value but the seller has no direct billing
|
|
439
|
+
# relationship with the operator on the specific account. Out of
|
|
440
|
+
# scope here because it requires a test kit that declares both an
|
|
441
|
+
# operator the seller has no direct relationship with AND a
|
|
442
|
+
# seller-side onboarding state to that effect — a heavier
|
|
443
|
+
# coordination contract than this kit. Track when the test kit grows
|
|
444
|
+
# multi-operator support.
|
|
445
|
+
#
|
|
446
|
+
# 3. Cross-language naming alignment for BrandAuthorizationResolver
|
|
447
|
+
# (Python v3-identity-bundle-design.md). The Python SDK's in-flight
|
|
448
|
+
# Protocol uses `AdagentsResolver`, which names the wrong file
|
|
449
|
+
# (adagents.json is publisher-side). Coordination filed as
|
|
450
|
+
# adcp-client-python#346.
|