@adcp/sdk 6.9.0 → 6.11.0
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/bin/adcp.js +285 -5
- package/compliance/cache/3.0.6.previous/domains/brand/index.yaml +163 -0
- package/compliance/cache/3.0.6.previous/domains/creative/index.yaml +412 -0
- package/compliance/cache/3.0.6.previous/domains/governance/index.yaml +683 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.6.previous/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.0.6.previous/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.6.previous/index.json +324 -0
- package/compliance/cache/3.0.6.previous/protocols/brand/index.yaml +163 -0
- package/compliance/cache/3.0.6.previous/protocols/creative/index.yaml +412 -0
- package/compliance/cache/3.0.6.previous/protocols/governance/index.yaml +683 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.6.previous/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.0.6.previous/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.6.previous/specialisms/audience-sync/index.yaml +280 -0
- package/compliance/cache/3.0.6.previous/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.0.6.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.0.6.previous/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.0.6.previous/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-ad-server/index.yaml +383 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-generative/index.yaml +746 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-template/index.yaml +413 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-aware-seller/index.yaml +136 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.0.6.previous/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-guaranteed/index.yaml +504 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-social/index.yaml +584 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/index.yaml +415 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-owned/index.yaml +316 -0
- package/compliance/cache/3.0.6.previous/test-kits/acme-outdoor.yaml +210 -0
- package/compliance/cache/3.0.6.previous/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.0.6.previous/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.0.6.previous/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.0.6.previous/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.0.6.previous/test-kits/substitution-observer-runner.yaml +690 -0
- package/compliance/cache/3.0.6.previous/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.0.6.previous/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/README.md +219 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.0.6.previous/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.0.6.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.0.6.previous/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.0.6.previous/universal/deterministic-testing.yaml +1343 -0
- package/compliance/cache/3.0.6.previous/universal/error-compliance.yaml +474 -0
- package/compliance/cache/3.0.6.previous/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.0.6.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.0.6.previous/universal/get-signals-pagination-integrity.yaml +211 -0
- package/compliance/cache/3.0.6.previous/universal/idempotency.yaml +593 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.0.6.previous/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.0.6.previous/universal/runner-output-contract.yaml +358 -0
- package/compliance/cache/3.0.6.previous/universal/schema-validation.yaml +526 -0
- package/compliance/cache/3.0.6.previous/universal/security.yaml +431 -0
- package/compliance/cache/3.0.6.previous/universal/signed-requests.yaml +205 -0
- package/compliance/cache/3.0.6.previous/universal/storyboard-schema.yaml +1176 -0
- package/compliance/cache/3.0.6.previous/universal/v3-envelope-integrity.yaml +106 -0
- package/compliance/cache/3.0.6.previous/universal/webhook-emission.yaml +337 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/create-adcp-server.d.ts +33 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +127 -1
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/credential-policy.d.ts +221 -0
- package/dist/lib/server/credential-policy.d.ts.map +1 -0
- package/dist/lib/server/credential-policy.js +260 -0
- package/dist/lib/server/credential-policy.js.map +1 -0
- package/dist/lib/server/decisioning/async-outcome.d.ts +17 -0
- package/dist/lib/server/decisioning/async-outcome.d.ts.map +1 -1
- package/dist/lib/server/decisioning/async-outcome.js +23 -18
- package/dist/lib/server/decisioning/async-outcome.js.map +1 -1
- package/dist/lib/server/decisioning/context.d.ts +8 -2
- package/dist/lib/server/decisioning/context.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.d.ts +1 -0
- package/dist/lib/server/decisioning/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +6 -4
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.js +5 -2
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/task-registry.d.ts +5 -0
- package/dist/lib/server/decisioning/runtime/task-registry.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/task-registry.js +4 -1
- package/dist/lib/server/decisioning/runtime/task-registry.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.js +10 -2
- package/dist/lib/server/decisioning/runtime/to-context.js.map +1 -1
- package/dist/lib/server/dynamic-registry.d.ts +219 -0
- package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
- package/dist/lib/server/dynamic-registry.js +245 -0
- package/dist/lib/server/dynamic-registry.js.map +1 -0
- package/dist/lib/server/index.d.ts +8 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +15 -4
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/operational-platform.d.ts +239 -0
- package/dist/lib/server/operational-platform.d.ts.map +1 -0
- package/dist/lib/server/operational-platform.js +94 -0
- package/dist/lib/server/operational-platform.js.map +1 -0
- package/dist/lib/server/test-controller.d.ts +2 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -1
- package/dist/lib/server/test-controller.js +6 -11
- package/dist/lib/server/test-controller.js.map +1 -1
- package/dist/lib/server/wire-safe.d.ts +211 -0
- package/dist/lib/server/wire-safe.d.ts.map +1 -0
- package/dist/lib/server/wire-safe.js +231 -0
- package/dist/lib/server/wire-safe.js.map +1 -0
- package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
- package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
- package/dist/lib/server/wire-spec-fields.generated.js +172 -0
- package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
- package/dist/lib/testing/compliance/index.d.ts +2 -0
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js +6 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/summary.d.ts +77 -0
- package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
- package/dist/lib/testing/compliance/summary.js +176 -0
- package/dist/lib/testing/compliance/summary.js.map +1 -0
- package/dist/lib/testing/comply-controller.d.ts +2 -0
- package/dist/lib/testing/comply-controller.d.ts.map +1 -1
- package/dist/lib/testing/comply-controller.js.map +1 -1
- package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
- package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/compliance.js +51 -0
- package/dist/lib/testing/storyboard/compliance.js.map +1 -1
- package/dist/lib/testing/storyboard/index.d.ts +2 -2
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/index.js +4 -2
- package/dist/lib/testing/storyboard/index.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +58 -5
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,1343 @@
|
|
|
1
|
+
id: deterministic_testing
|
|
2
|
+
version: '1.0.0'
|
|
3
|
+
title: 'Deterministic testing'
|
|
4
|
+
category: core
|
|
5
|
+
summary: 'Uses comply_test_controller to force state transitions and simulate delivery/budget, verifying state machines and reporting.'
|
|
6
|
+
track: core
|
|
7
|
+
required_tools:
|
|
8
|
+
- comply_test_controller
|
|
9
|
+
platform_types:
|
|
10
|
+
- display_ad_server
|
|
11
|
+
- video_ad_server
|
|
12
|
+
- social_platform
|
|
13
|
+
- retail_media
|
|
14
|
+
- search_platform
|
|
15
|
+
- audio_platform
|
|
16
|
+
- linear_tv_platform
|
|
17
|
+
- dsp
|
|
18
|
+
- pmax_platform
|
|
19
|
+
- ai_ad_network
|
|
20
|
+
- ai_platform
|
|
21
|
+
- generative_dsp
|
|
22
|
+
|
|
23
|
+
narrative: |
|
|
24
|
+
Sellers that implement the comply_test_controller tool enable deterministic compliance
|
|
25
|
+
testing. The controller forces server-side state transitions without relying on real
|
|
26
|
+
async workflows, letting the test harness verify state machine behavior, operation
|
|
27
|
+
gating, and reporting accuracy.
|
|
28
|
+
|
|
29
|
+
This storyboard covers the full controller surface: scenario listing, account state
|
|
30
|
+
machines, media buy lifecycle, creative status transitions, SI session management,
|
|
31
|
+
delivery simulation, and budget spend simulation.
|
|
32
|
+
|
|
33
|
+
agent:
|
|
34
|
+
interaction_model: media_buy_seller
|
|
35
|
+
capabilities:
|
|
36
|
+
- sells_media
|
|
37
|
+
- supports_test_controller
|
|
38
|
+
examples:
|
|
39
|
+
- 'Any seller with comply_test_controller'
|
|
40
|
+
|
|
41
|
+
caller:
|
|
42
|
+
role: buyer_agent
|
|
43
|
+
example: 'Comply test harness'
|
|
44
|
+
|
|
45
|
+
prerequisites:
|
|
46
|
+
description: |
|
|
47
|
+
The seller must expose the comply_test_controller tool. The controller is detected
|
|
48
|
+
via list_scenarios before any state transitions are attempted. Phases that require
|
|
49
|
+
specific scenarios are skipped if the controller does not support them.
|
|
50
|
+
test_kit: 'test-kits/acme-outdoor.yaml'
|
|
51
|
+
|
|
52
|
+
phases:
|
|
53
|
+
- id: capability_discovery
|
|
54
|
+
title: "Capability discovery"
|
|
55
|
+
narrative: |
|
|
56
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports media buying before running deterministic test scenarios.
|
|
57
|
+
|
|
58
|
+
steps:
|
|
59
|
+
- id: get_capabilities
|
|
60
|
+
title: "Check agent capabilities"
|
|
61
|
+
narrative: |
|
|
62
|
+
Verify that the agent declares the expected protocol support before
|
|
63
|
+
proceeding with domain-specific operations.
|
|
64
|
+
task: get_adcp_capabilities
|
|
65
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
66
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
67
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
68
|
+
comply_scenario: capability_discovery
|
|
69
|
+
stateful: false
|
|
70
|
+
expected: |
|
|
71
|
+
Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
|
|
72
|
+
sample_request:
|
|
73
|
+
context:
|
|
74
|
+
correlation_id: "deterministic_testing--get_capabilities"
|
|
75
|
+
validations:
|
|
76
|
+
- check: response_schema
|
|
77
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
78
|
+
- check: field_present
|
|
79
|
+
path: "supported_protocols"
|
|
80
|
+
description: "Agent declares supported protocols"
|
|
81
|
+
|
|
82
|
+
- check: field_present
|
|
83
|
+
path: "context"
|
|
84
|
+
description: "Response echoes back the context object"
|
|
85
|
+
- check: field_value
|
|
86
|
+
path: "context.correlation_id"
|
|
87
|
+
value: "deterministic_testing--get_capabilities"
|
|
88
|
+
description: "Context correlation_id returned unchanged"
|
|
89
|
+
- id: controller_validation
|
|
90
|
+
title: 'Controller validation'
|
|
91
|
+
narrative: |
|
|
92
|
+
Validates that the comply_test_controller is functional and responds correctly
|
|
93
|
+
to scenario discovery, unknown scenarios, missing parameters, and nonexistent
|
|
94
|
+
entity references.
|
|
95
|
+
|
|
96
|
+
steps:
|
|
97
|
+
- id: list_scenarios
|
|
98
|
+
title: 'List supported scenarios'
|
|
99
|
+
requires_tool: comply_test_controller
|
|
100
|
+
narrative: |
|
|
101
|
+
Call the controller with scenario: list_scenarios to discover which
|
|
102
|
+
force_* and simulate_* scenarios the seller supports.
|
|
103
|
+
task: comply_test_controller
|
|
104
|
+
comply_scenario: controller_validation
|
|
105
|
+
stateful: false
|
|
106
|
+
context_outputs:
|
|
107
|
+
- name: supported_scenarios
|
|
108
|
+
path: 'scenarios'
|
|
109
|
+
expected: |
|
|
110
|
+
Return a list of supported scenarios. The response should include:
|
|
111
|
+
- success: true
|
|
112
|
+
- scenarios: array or object of scenario names
|
|
113
|
+
|
|
114
|
+
sample_request:
|
|
115
|
+
scenario: 'list_scenarios'
|
|
116
|
+
|
|
117
|
+
context:
|
|
118
|
+
correlation_id: "deterministic_testing--list_scenarios"
|
|
119
|
+
validations:
|
|
120
|
+
- check: field_present
|
|
121
|
+
path: 'scenarios'
|
|
122
|
+
description: 'Controller returns supported scenarios'
|
|
123
|
+
- check: field_value
|
|
124
|
+
path: 'success'
|
|
125
|
+
allowed_values:
|
|
126
|
+
- true
|
|
127
|
+
description: 'list_scenarios succeeds'
|
|
128
|
+
|
|
129
|
+
- check: field_present
|
|
130
|
+
path: "context"
|
|
131
|
+
description: "Response echoes back the context object"
|
|
132
|
+
- check: field_value
|
|
133
|
+
path: "context.correlation_id"
|
|
134
|
+
value: "deterministic_testing--list_scenarios"
|
|
135
|
+
description: "Context correlation_id returned unchanged"
|
|
136
|
+
- id: unknown_scenario
|
|
137
|
+
title: 'Unknown scenario returns error'
|
|
138
|
+
requires_tool: comply_test_controller
|
|
139
|
+
narrative: |
|
|
140
|
+
Send a nonexistent scenario name. The controller should return
|
|
141
|
+
UNKNOWN_SCENARIO error code.
|
|
142
|
+
task: comply_test_controller
|
|
143
|
+
comply_scenario: controller_validation
|
|
144
|
+
stateful: false
|
|
145
|
+
expect_error: true
|
|
146
|
+
negative_path: schema_invalid
|
|
147
|
+
expected: |
|
|
148
|
+
Return an error response with:
|
|
149
|
+
- success: false
|
|
150
|
+
- error: UNKNOWN_SCENARIO
|
|
151
|
+
|
|
152
|
+
sample_request:
|
|
153
|
+
scenario: 'nonexistent_scenario'
|
|
154
|
+
params: {}
|
|
155
|
+
|
|
156
|
+
context:
|
|
157
|
+
correlation_id: "deterministic_testing--unknown_scenario"
|
|
158
|
+
validations:
|
|
159
|
+
- check: field_value
|
|
160
|
+
path: 'success'
|
|
161
|
+
allowed_values:
|
|
162
|
+
- false
|
|
163
|
+
description: 'Unknown scenario fails'
|
|
164
|
+
- check: field_value
|
|
165
|
+
path: 'error'
|
|
166
|
+
allowed_values:
|
|
167
|
+
- 'UNKNOWN_SCENARIO'
|
|
168
|
+
description: 'Error code is UNKNOWN_SCENARIO'
|
|
169
|
+
|
|
170
|
+
- check: field_present
|
|
171
|
+
path: "context"
|
|
172
|
+
description: "Response echoes back the context object"
|
|
173
|
+
- check: field_value
|
|
174
|
+
path: "context.correlation_id"
|
|
175
|
+
value: "deterministic_testing--unknown_scenario"
|
|
176
|
+
description: "Context correlation_id returned unchanged"
|
|
177
|
+
- id: missing_params
|
|
178
|
+
title: 'Missing params returns error'
|
|
179
|
+
requires_tool: comply_test_controller
|
|
180
|
+
narrative: |
|
|
181
|
+
Call force_creative_status with empty params. The controller should
|
|
182
|
+
return INVALID_PARAMS error code.
|
|
183
|
+
task: comply_test_controller
|
|
184
|
+
comply_scenario: controller_validation
|
|
185
|
+
stateful: false
|
|
186
|
+
expect_error: true
|
|
187
|
+
negative_path: schema_invalid
|
|
188
|
+
expected: |
|
|
189
|
+
Return an error response with:
|
|
190
|
+
- success: false
|
|
191
|
+
- error: INVALID_PARAMS
|
|
192
|
+
|
|
193
|
+
sample_request:
|
|
194
|
+
scenario: 'force_creative_status'
|
|
195
|
+
params: {}
|
|
196
|
+
|
|
197
|
+
context:
|
|
198
|
+
correlation_id: "deterministic_testing--missing_params"
|
|
199
|
+
validations:
|
|
200
|
+
- check: field_value
|
|
201
|
+
path: 'success'
|
|
202
|
+
allowed_values:
|
|
203
|
+
- false
|
|
204
|
+
description: 'Missing params fails'
|
|
205
|
+
- check: field_value
|
|
206
|
+
path: 'error'
|
|
207
|
+
allowed_values:
|
|
208
|
+
- 'INVALID_PARAMS'
|
|
209
|
+
description: 'Error code is INVALID_PARAMS'
|
|
210
|
+
|
|
211
|
+
- check: field_present
|
|
212
|
+
path: "context"
|
|
213
|
+
description: "Response echoes back the context object"
|
|
214
|
+
- check: field_value
|
|
215
|
+
path: "context.correlation_id"
|
|
216
|
+
value: "deterministic_testing--missing_params"
|
|
217
|
+
description: "Context correlation_id returned unchanged"
|
|
218
|
+
- id: not_found_entity
|
|
219
|
+
title: 'Nonexistent entity returns NOT_FOUND'
|
|
220
|
+
requires_tool: comply_test_controller
|
|
221
|
+
narrative: |
|
|
222
|
+
Call force_creative_status with a nonexistent creative_id. The controller
|
|
223
|
+
should return NOT_FOUND error code.
|
|
224
|
+
task: comply_test_controller
|
|
225
|
+
comply_scenario: controller_validation
|
|
226
|
+
stateful: false
|
|
227
|
+
expect_error: true
|
|
228
|
+
negative_path: payload_well_formed
|
|
229
|
+
expected: |
|
|
230
|
+
Return an error response with:
|
|
231
|
+
- success: false
|
|
232
|
+
- error: NOT_FOUND
|
|
233
|
+
|
|
234
|
+
sample_request:
|
|
235
|
+
scenario: 'force_creative_status'
|
|
236
|
+
params:
|
|
237
|
+
creative_id: 'comply-test-nonexistent-000000000000'
|
|
238
|
+
status: 'approved'
|
|
239
|
+
|
|
240
|
+
context:
|
|
241
|
+
correlation_id: "deterministic_testing--not_found_entity"
|
|
242
|
+
validations:
|
|
243
|
+
- check: field_value
|
|
244
|
+
path: 'success'
|
|
245
|
+
allowed_values:
|
|
246
|
+
- false
|
|
247
|
+
description: 'Nonexistent entity fails'
|
|
248
|
+
- check: field_value
|
|
249
|
+
path: 'error'
|
|
250
|
+
allowed_values:
|
|
251
|
+
- 'NOT_FOUND'
|
|
252
|
+
description: 'Error code is NOT_FOUND'
|
|
253
|
+
|
|
254
|
+
- check: field_present
|
|
255
|
+
path: "context"
|
|
256
|
+
description: "Response echoes back the context object"
|
|
257
|
+
- check: field_value
|
|
258
|
+
path: "context.correlation_id"
|
|
259
|
+
value: "deterministic_testing--not_found_entity"
|
|
260
|
+
description: "Context correlation_id returned unchanged"
|
|
261
|
+
- id: deterministic_account
|
|
262
|
+
title: 'Deterministic account state machine'
|
|
263
|
+
narrative: |
|
|
264
|
+
Forces account status transitions via the controller and verifies them through
|
|
265
|
+
list_accounts. Tests suspension gating (operations blocked when suspended),
|
|
266
|
+
payment_required state, and reactivation.
|
|
267
|
+
|
|
268
|
+
steps:
|
|
269
|
+
- id: sync_accounts_for_state
|
|
270
|
+
title: 'Create sandbox account for state machine test'
|
|
271
|
+
requires_tool: comply_test_controller
|
|
272
|
+
narrative: |
|
|
273
|
+
Sync a sandbox account so the state machine has an entity to
|
|
274
|
+
force transitions on.
|
|
275
|
+
task: sync_accounts
|
|
276
|
+
schema_ref: 'account/sync-accounts-request.json'
|
|
277
|
+
response_schema_ref: 'account/sync-accounts-response.json'
|
|
278
|
+
comply_scenario: deterministic_account
|
|
279
|
+
stateful: true
|
|
280
|
+
|
|
281
|
+
sample_request:
|
|
282
|
+
accounts:
|
|
283
|
+
- brand:
|
|
284
|
+
domain: 'test.example'
|
|
285
|
+
operator: 'test.example'
|
|
286
|
+
billing: 'operator'
|
|
287
|
+
sandbox: true
|
|
288
|
+
|
|
289
|
+
idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_account_sync_accounts_for_state"
|
|
290
|
+
context:
|
|
291
|
+
correlation_id: "deterministic_testing--sync_accounts_for_state"
|
|
292
|
+
validations:
|
|
293
|
+
- check: field_present
|
|
294
|
+
path: 'accounts[0].account_id'
|
|
295
|
+
description: 'Account sync returns account_id'
|
|
296
|
+
|
|
297
|
+
- check: field_present
|
|
298
|
+
path: "context"
|
|
299
|
+
description: "Response echoes back the context object"
|
|
300
|
+
- check: field_value
|
|
301
|
+
path: "context.correlation_id"
|
|
302
|
+
value: "deterministic_testing--sync_accounts_for_state"
|
|
303
|
+
description: "Context correlation_id returned unchanged"
|
|
304
|
+
- id: list_accounts_for_state
|
|
305
|
+
title: 'Find account for state machine test'
|
|
306
|
+
requires_tool: comply_test_controller
|
|
307
|
+
narrative: |
|
|
308
|
+
List accounts to find an active account for state transitions.
|
|
309
|
+
task: list_accounts
|
|
310
|
+
comply_scenario: deterministic_account
|
|
311
|
+
stateful: false
|
|
312
|
+
context_outputs:
|
|
313
|
+
- name: account_id
|
|
314
|
+
path: 'accounts[0].account_id'
|
|
315
|
+
expected: |
|
|
316
|
+
Return at least one account with an account_id.
|
|
317
|
+
|
|
318
|
+
sample_request:
|
|
319
|
+
context:
|
|
320
|
+
correlation_id: "deterministic_testing--list_accounts_for_state"
|
|
321
|
+
|
|
322
|
+
validations:
|
|
323
|
+
- check: field_present
|
|
324
|
+
path: 'accounts[0].account_id'
|
|
325
|
+
description: 'At least one account exists'
|
|
326
|
+
|
|
327
|
+
- check: field_present
|
|
328
|
+
path: "context"
|
|
329
|
+
description: "Response echoes back the context object"
|
|
330
|
+
- check: field_value
|
|
331
|
+
path: "context.correlation_id"
|
|
332
|
+
value: "deterministic_testing--list_accounts_for_state"
|
|
333
|
+
description: "Context correlation_id returned unchanged"
|
|
334
|
+
- id: force_account_suspended
|
|
335
|
+
title: 'Force account to suspended'
|
|
336
|
+
requires_tool: comply_test_controller
|
|
337
|
+
narrative: |
|
|
338
|
+
Use the controller to force the account into suspended state. Operations
|
|
339
|
+
like create_media_buy should be blocked while the account is suspended.
|
|
340
|
+
task: comply_test_controller
|
|
341
|
+
comply_scenario: deterministic_account
|
|
342
|
+
stateful: true
|
|
343
|
+
expected: |
|
|
344
|
+
Return a successful state transition:
|
|
345
|
+
- success: true
|
|
346
|
+
- previous_state: the account's prior status
|
|
347
|
+
- current_state: suspended
|
|
348
|
+
|
|
349
|
+
sample_request:
|
|
350
|
+
scenario: 'force_account_status'
|
|
351
|
+
params:
|
|
352
|
+
account_id: '$context.account_id'
|
|
353
|
+
status: 'suspended'
|
|
354
|
+
|
|
355
|
+
context:
|
|
356
|
+
correlation_id: "deterministic_testing--force_account_suspended"
|
|
357
|
+
validations:
|
|
358
|
+
- check: field_value
|
|
359
|
+
path: 'success'
|
|
360
|
+
allowed_values:
|
|
361
|
+
- true
|
|
362
|
+
description: 'Account suspension succeeds'
|
|
363
|
+
- check: field_value
|
|
364
|
+
path: 'current_state'
|
|
365
|
+
allowed_values:
|
|
366
|
+
- 'suspended'
|
|
367
|
+
description: 'Account is now suspended'
|
|
368
|
+
|
|
369
|
+
- check: field_present
|
|
370
|
+
path: "context"
|
|
371
|
+
description: "Response echoes back the context object"
|
|
372
|
+
- check: field_value
|
|
373
|
+
path: "context.correlation_id"
|
|
374
|
+
value: "deterministic_testing--force_account_suspended"
|
|
375
|
+
description: "Context correlation_id returned unchanged"
|
|
376
|
+
- id: force_account_active
|
|
377
|
+
title: 'Reactivate account'
|
|
378
|
+
requires_tool: comply_test_controller
|
|
379
|
+
narrative: |
|
|
380
|
+
Restore the account to active state. Verify the transition from suspended
|
|
381
|
+
back to active succeeds.
|
|
382
|
+
task: comply_test_controller
|
|
383
|
+
comply_scenario: deterministic_account
|
|
384
|
+
stateful: true
|
|
385
|
+
expected: |
|
|
386
|
+
Return a successful state transition:
|
|
387
|
+
- success: true
|
|
388
|
+
- previous_state: suspended
|
|
389
|
+
- current_state: active
|
|
390
|
+
|
|
391
|
+
sample_request:
|
|
392
|
+
scenario: 'force_account_status'
|
|
393
|
+
params:
|
|
394
|
+
account_id: '$context.account_id'
|
|
395
|
+
status: 'active'
|
|
396
|
+
|
|
397
|
+
context:
|
|
398
|
+
correlation_id: "deterministic_testing--force_account_active"
|
|
399
|
+
validations:
|
|
400
|
+
- check: field_value
|
|
401
|
+
path: 'success'
|
|
402
|
+
allowed_values:
|
|
403
|
+
- true
|
|
404
|
+
description: 'Account reactivation succeeds'
|
|
405
|
+
- check: field_value
|
|
406
|
+
path: 'current_state'
|
|
407
|
+
allowed_values:
|
|
408
|
+
- 'active'
|
|
409
|
+
description: 'Account is now active'
|
|
410
|
+
|
|
411
|
+
- check: field_present
|
|
412
|
+
path: "context"
|
|
413
|
+
description: "Response echoes back the context object"
|
|
414
|
+
- check: field_value
|
|
415
|
+
path: "context.correlation_id"
|
|
416
|
+
value: "deterministic_testing--force_account_active"
|
|
417
|
+
description: "Context correlation_id returned unchanged"
|
|
418
|
+
- id: force_account_payment_required
|
|
419
|
+
title: 'Force account to payment_required'
|
|
420
|
+
requires_tool: comply_test_controller
|
|
421
|
+
narrative: |
|
|
422
|
+
Force the account into payment_required state. This tests a distinct
|
|
423
|
+
non-terminal blocked state.
|
|
424
|
+
task: comply_test_controller
|
|
425
|
+
comply_scenario: deterministic_account
|
|
426
|
+
stateful: true
|
|
427
|
+
expected: |
|
|
428
|
+
Return a successful state transition to payment_required.
|
|
429
|
+
|
|
430
|
+
sample_request:
|
|
431
|
+
scenario: 'force_account_status'
|
|
432
|
+
params:
|
|
433
|
+
account_id: '$context.account_id'
|
|
434
|
+
status: 'payment_required'
|
|
435
|
+
|
|
436
|
+
context:
|
|
437
|
+
correlation_id: "deterministic_testing--force_account_payment_required"
|
|
438
|
+
validations:
|
|
439
|
+
- check: field_value
|
|
440
|
+
path: 'success'
|
|
441
|
+
allowed_values:
|
|
442
|
+
- true
|
|
443
|
+
description: 'Transition to payment_required succeeds'
|
|
444
|
+
|
|
445
|
+
- check: field_present
|
|
446
|
+
path: "context"
|
|
447
|
+
description: "Response echoes back the context object"
|
|
448
|
+
- check: field_value
|
|
449
|
+
path: "context.correlation_id"
|
|
450
|
+
value: "deterministic_testing--force_account_payment_required"
|
|
451
|
+
description: "Context correlation_id returned unchanged"
|
|
452
|
+
- id: restore_account_active
|
|
453
|
+
title: 'Restore account to active'
|
|
454
|
+
requires_tool: comply_test_controller
|
|
455
|
+
narrative: |
|
|
456
|
+
Restore the account to active state after the payment_required test.
|
|
457
|
+
task: comply_test_controller
|
|
458
|
+
comply_scenario: deterministic_account
|
|
459
|
+
stateful: true
|
|
460
|
+
expected: |
|
|
461
|
+
Account restored to active state.
|
|
462
|
+
|
|
463
|
+
sample_request:
|
|
464
|
+
scenario: 'force_account_status'
|
|
465
|
+
params:
|
|
466
|
+
account_id: '$context.account_id'
|
|
467
|
+
status: 'active'
|
|
468
|
+
|
|
469
|
+
context:
|
|
470
|
+
correlation_id: "deterministic_testing--restore_account_active"
|
|
471
|
+
validations:
|
|
472
|
+
- check: field_value
|
|
473
|
+
path: 'success'
|
|
474
|
+
allowed_values:
|
|
475
|
+
- true
|
|
476
|
+
description: 'Account restored to active'
|
|
477
|
+
|
|
478
|
+
- check: field_present
|
|
479
|
+
path: "context"
|
|
480
|
+
description: "Response echoes back the context object"
|
|
481
|
+
- check: field_value
|
|
482
|
+
path: "context.correlation_id"
|
|
483
|
+
value: "deterministic_testing--restore_account_active"
|
|
484
|
+
description: "Context correlation_id returned unchanged"
|
|
485
|
+
- id: deterministic_media_buy
|
|
486
|
+
title: 'Deterministic media buy state machine'
|
|
487
|
+
narrative: |
|
|
488
|
+
Creates a media buy through the normal flow, then uses the controller to force
|
|
489
|
+
it through status transitions: active, completed (terminal). Verifies that
|
|
490
|
+
terminal states reject further transitions.
|
|
491
|
+
|
|
492
|
+
steps:
|
|
493
|
+
- id: create_media_buy
|
|
494
|
+
title: 'Create media buy for state machine test'
|
|
495
|
+
requires_tool: comply_test_controller
|
|
496
|
+
narrative: |
|
|
497
|
+
Create a media buy through the standard create_media_buy task. The resulting
|
|
498
|
+
media_buy_id is used for controller-driven state transitions.
|
|
499
|
+
task: create_media_buy
|
|
500
|
+
schema_ref: 'media-buy/create-media-buy-request.json'
|
|
501
|
+
response_schema_ref: 'media-buy/create-media-buy-response.json'
|
|
502
|
+
doc_ref: '/media-buy/task-reference/create_media_buy'
|
|
503
|
+
comply_scenario: deterministic_media_buy
|
|
504
|
+
stateful: true
|
|
505
|
+
context_outputs:
|
|
506
|
+
- name: media_buy_id
|
|
507
|
+
path: 'media_buy_id'
|
|
508
|
+
expected: |
|
|
509
|
+
Create a media buy and return a media_buy_id for state machine testing.
|
|
510
|
+
|
|
511
|
+
sample_request:
|
|
512
|
+
account:
|
|
513
|
+
brand:
|
|
514
|
+
domain: 'acmeoutdoor.example'
|
|
515
|
+
operator: 'pinnacle-agency.example'
|
|
516
|
+
brand:
|
|
517
|
+
domain: 'acmeoutdoor.example'
|
|
518
|
+
start_time: '2026-04-01T00:00:00Z'
|
|
519
|
+
end_time: '2026-06-30T23:59:59Z'
|
|
520
|
+
packages:
|
|
521
|
+
- product_id: 'test-product'
|
|
522
|
+
budget: 5000
|
|
523
|
+
pricing_option_id: 'test-pricing'
|
|
524
|
+
|
|
525
|
+
idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_media_buy_create_media_buy"
|
|
526
|
+
context:
|
|
527
|
+
correlation_id: "deterministic_testing--create_media_buy"
|
|
528
|
+
validations:
|
|
529
|
+
- check: response_schema
|
|
530
|
+
description: 'Response matches create-media-buy-response.json schema'
|
|
531
|
+
|
|
532
|
+
- check: field_present
|
|
533
|
+
path: "context"
|
|
534
|
+
description: "Response echoes back the context object"
|
|
535
|
+
- check: field_value
|
|
536
|
+
path: "context.correlation_id"
|
|
537
|
+
value: "deterministic_testing--create_media_buy"
|
|
538
|
+
description: "Context correlation_id returned unchanged"
|
|
539
|
+
- id: force_media_buy_active
|
|
540
|
+
title: 'Force media buy to active'
|
|
541
|
+
requires_tool: comply_test_controller
|
|
542
|
+
narrative: |
|
|
543
|
+
Use the controller to force the media buy into active state.
|
|
544
|
+
task: comply_test_controller
|
|
545
|
+
comply_scenario: deterministic_media_buy
|
|
546
|
+
stateful: true
|
|
547
|
+
expected: |
|
|
548
|
+
Return a successful state transition to active.
|
|
549
|
+
|
|
550
|
+
sample_request:
|
|
551
|
+
brand:
|
|
552
|
+
domain: 'acmeoutdoor.example'
|
|
553
|
+
scenario: 'force_media_buy_status'
|
|
554
|
+
params:
|
|
555
|
+
media_buy_id: '$context.media_buy_id'
|
|
556
|
+
status: 'active'
|
|
557
|
+
|
|
558
|
+
context:
|
|
559
|
+
correlation_id: "deterministic_testing--force_media_buy_active"
|
|
560
|
+
validations:
|
|
561
|
+
- check: field_value
|
|
562
|
+
path: 'success'
|
|
563
|
+
allowed_values:
|
|
564
|
+
- true
|
|
565
|
+
description: 'Media buy activation succeeds'
|
|
566
|
+
- check: field_value
|
|
567
|
+
path: 'current_state'
|
|
568
|
+
allowed_values:
|
|
569
|
+
- 'active'
|
|
570
|
+
description: 'Media buy is now active'
|
|
571
|
+
|
|
572
|
+
- check: field_present
|
|
573
|
+
path: "context"
|
|
574
|
+
description: "Response echoes back the context object"
|
|
575
|
+
- check: field_value
|
|
576
|
+
path: "context.correlation_id"
|
|
577
|
+
value: "deterministic_testing--force_media_buy_active"
|
|
578
|
+
description: "Context correlation_id returned unchanged"
|
|
579
|
+
- id: verify_media_buy_active
|
|
580
|
+
title: 'Verify media buy status via get_media_buys'
|
|
581
|
+
requires_tool: comply_test_controller
|
|
582
|
+
narrative: |
|
|
583
|
+
Call get_media_buys to confirm the controller-forced status is reflected
|
|
584
|
+
in the standard API.
|
|
585
|
+
task: get_media_buys
|
|
586
|
+
schema_ref: 'media-buy/get-media-buys-request.json'
|
|
587
|
+
response_schema_ref: 'media-buy/get-media-buys-response.json'
|
|
588
|
+
doc_ref: '/media-buy/task-reference/get_media_buys'
|
|
589
|
+
comply_scenario: deterministic_media_buy
|
|
590
|
+
stateful: true
|
|
591
|
+
expected: |
|
|
592
|
+
Return the media buy with status: active.
|
|
593
|
+
|
|
594
|
+
sample_request:
|
|
595
|
+
account:
|
|
596
|
+
brand:
|
|
597
|
+
domain: 'acmeoutdoor.example'
|
|
598
|
+
operator: 'pinnacle-agency.example'
|
|
599
|
+
media_buy_ids:
|
|
600
|
+
- '$context.media_buy_id'
|
|
601
|
+
|
|
602
|
+
context:
|
|
603
|
+
correlation_id: "deterministic_testing--verify_media_buy_active"
|
|
604
|
+
validations:
|
|
605
|
+
- check: response_schema
|
|
606
|
+
description: 'Response matches get-media-buys-response.json schema'
|
|
607
|
+
- check: field_present
|
|
608
|
+
path: 'media_buys[0].status'
|
|
609
|
+
description: 'Media buy has a status field'
|
|
610
|
+
|
|
611
|
+
- check: field_present
|
|
612
|
+
path: "context"
|
|
613
|
+
description: "Response echoes back the context object"
|
|
614
|
+
- check: field_value
|
|
615
|
+
path: "context.correlation_id"
|
|
616
|
+
value: "deterministic_testing--verify_media_buy_active"
|
|
617
|
+
description: "Context correlation_id returned unchanged"
|
|
618
|
+
- id: force_media_buy_completed
|
|
619
|
+
title: 'Force media buy to completed (terminal)'
|
|
620
|
+
requires_tool: comply_test_controller
|
|
621
|
+
narrative: |
|
|
622
|
+
Force the media buy to completed, a terminal state. No further transitions
|
|
623
|
+
should be allowed.
|
|
624
|
+
task: comply_test_controller
|
|
625
|
+
comply_scenario: deterministic_media_buy
|
|
626
|
+
stateful: true
|
|
627
|
+
expected: |
|
|
628
|
+
Return a successful transition to completed.
|
|
629
|
+
|
|
630
|
+
sample_request:
|
|
631
|
+
brand:
|
|
632
|
+
domain: 'acmeoutdoor.example'
|
|
633
|
+
scenario: 'force_media_buy_status'
|
|
634
|
+
params:
|
|
635
|
+
media_buy_id: '$context.media_buy_id'
|
|
636
|
+
status: 'completed'
|
|
637
|
+
|
|
638
|
+
context:
|
|
639
|
+
correlation_id: "deterministic_testing--force_media_buy_completed"
|
|
640
|
+
validations:
|
|
641
|
+
- check: field_value
|
|
642
|
+
path: 'success'
|
|
643
|
+
allowed_values:
|
|
644
|
+
- true
|
|
645
|
+
description: 'Transition to completed succeeds'
|
|
646
|
+
- check: field_value
|
|
647
|
+
path: 'current_state'
|
|
648
|
+
allowed_values:
|
|
649
|
+
- 'completed'
|
|
650
|
+
description: 'Media buy is now completed'
|
|
651
|
+
|
|
652
|
+
- check: field_present
|
|
653
|
+
path: "context"
|
|
654
|
+
description: "Response echoes back the context object"
|
|
655
|
+
- check: field_value
|
|
656
|
+
path: "context.correlation_id"
|
|
657
|
+
value: "deterministic_testing--force_media_buy_completed"
|
|
658
|
+
description: "Context correlation_id returned unchanged"
|
|
659
|
+
- id: invalid_transition_from_terminal
|
|
660
|
+
title: 'Reject transition from terminal state'
|
|
661
|
+
requires_tool: comply_test_controller
|
|
662
|
+
narrative: |
|
|
663
|
+
Attempt to force the completed media buy back to active. The controller
|
|
664
|
+
should reject this with INVALID_TRANSITION.
|
|
665
|
+
task: comply_test_controller
|
|
666
|
+
comply_scenario: deterministic_media_buy
|
|
667
|
+
stateful: true
|
|
668
|
+
expect_error: true
|
|
669
|
+
negative_path: payload_well_formed
|
|
670
|
+
expected: |
|
|
671
|
+
Return an error response:
|
|
672
|
+
- success: false
|
|
673
|
+
- error: INVALID_TRANSITION
|
|
674
|
+
|
|
675
|
+
sample_request:
|
|
676
|
+
brand:
|
|
677
|
+
domain: 'acmeoutdoor.example'
|
|
678
|
+
scenario: 'force_media_buy_status'
|
|
679
|
+
params:
|
|
680
|
+
media_buy_id: '$context.media_buy_id'
|
|
681
|
+
status: 'active'
|
|
682
|
+
|
|
683
|
+
context:
|
|
684
|
+
correlation_id: "deterministic_testing--invalid_transition_from_terminal"
|
|
685
|
+
validations:
|
|
686
|
+
- check: field_value
|
|
687
|
+
path: 'success'
|
|
688
|
+
allowed_values:
|
|
689
|
+
- false
|
|
690
|
+
description: 'Terminal state rejects transition'
|
|
691
|
+
- check: field_value
|
|
692
|
+
path: 'error'
|
|
693
|
+
allowed_values:
|
|
694
|
+
- 'INVALID_TRANSITION'
|
|
695
|
+
description: 'Error code is INVALID_TRANSITION'
|
|
696
|
+
|
|
697
|
+
- check: field_present
|
|
698
|
+
path: "context"
|
|
699
|
+
description: "Response echoes back the context object"
|
|
700
|
+
- check: field_value
|
|
701
|
+
path: "context.correlation_id"
|
|
702
|
+
value: "deterministic_testing--invalid_transition_from_terminal"
|
|
703
|
+
description: "Context correlation_id returned unchanged"
|
|
704
|
+
- id: deterministic_creative
|
|
705
|
+
title: 'Deterministic creative state machine'
|
|
706
|
+
narrative: |
|
|
707
|
+
Syncs a creative, then uses the controller to force it through status
|
|
708
|
+
transitions: approved, archived (terminal). Verifies terminal state rejection
|
|
709
|
+
and rejection with reason.
|
|
710
|
+
|
|
711
|
+
steps:
|
|
712
|
+
- id: sync_creative_for_state
|
|
713
|
+
title: 'Sync creative for state machine test'
|
|
714
|
+
requires_tool: comply_test_controller
|
|
715
|
+
narrative: |
|
|
716
|
+
Push a test creative via sync_creatives. The creative_id is captured
|
|
717
|
+
for controller-driven transitions.
|
|
718
|
+
task: sync_creatives
|
|
719
|
+
schema_ref: 'creative/sync-creatives-request.json'
|
|
720
|
+
response_schema_ref: 'creative/sync-creatives-response.json'
|
|
721
|
+
doc_ref: '/creative/task-reference/sync_creatives'
|
|
722
|
+
comply_scenario: deterministic_creative
|
|
723
|
+
stateful: true
|
|
724
|
+
context_outputs:
|
|
725
|
+
- name: creative_id
|
|
726
|
+
path: 'creatives[0].creative_id'
|
|
727
|
+
expected: |
|
|
728
|
+
Accept the creative and return a creative_id for state machine testing.
|
|
729
|
+
|
|
730
|
+
sample_request:
|
|
731
|
+
account:
|
|
732
|
+
brand:
|
|
733
|
+
domain: 'acmeoutdoor.example'
|
|
734
|
+
operator: 'pinnacle-agency.example'
|
|
735
|
+
creatives:
|
|
736
|
+
- creative_id: 'comply-state-test-creative'
|
|
737
|
+
name: 'Comply State Test Creative'
|
|
738
|
+
format_id:
|
|
739
|
+
agent_url: 'https://your-platform.example.com'
|
|
740
|
+
id: 'display_300x250'
|
|
741
|
+
assets:
|
|
742
|
+
image:
|
|
743
|
+
asset_type: 'image'
|
|
744
|
+
url: 'https://via.placeholder.com/300x250'
|
|
745
|
+
width: 300
|
|
746
|
+
height: 250
|
|
747
|
+
mime_type: 'image/png'
|
|
748
|
+
|
|
749
|
+
idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_creative_sync_creative_for_state"
|
|
750
|
+
context:
|
|
751
|
+
correlation_id: "deterministic_testing--sync_creative_for_state"
|
|
752
|
+
validations:
|
|
753
|
+
- check: response_schema
|
|
754
|
+
description: 'Response matches sync-creatives-response.json schema'
|
|
755
|
+
|
|
756
|
+
- check: field_present
|
|
757
|
+
path: "context"
|
|
758
|
+
description: "Response echoes back the context object"
|
|
759
|
+
- check: field_value
|
|
760
|
+
path: "context.correlation_id"
|
|
761
|
+
value: "deterministic_testing--sync_creative_for_state"
|
|
762
|
+
description: "Context correlation_id returned unchanged"
|
|
763
|
+
- id: force_creative_approved
|
|
764
|
+
title: 'Force creative to approved'
|
|
765
|
+
requires_tool: comply_test_controller
|
|
766
|
+
narrative: |
|
|
767
|
+
Use the controller to force the creative into approved state.
|
|
768
|
+
task: comply_test_controller
|
|
769
|
+
comply_scenario: deterministic_creative
|
|
770
|
+
stateful: true
|
|
771
|
+
expected: |
|
|
772
|
+
Successful transition to approved.
|
|
773
|
+
|
|
774
|
+
sample_request:
|
|
775
|
+
brand:
|
|
776
|
+
domain: 'acmeoutdoor.example'
|
|
777
|
+
scenario: 'force_creative_status'
|
|
778
|
+
params:
|
|
779
|
+
creative_id: '$context.creative_id'
|
|
780
|
+
status: 'approved'
|
|
781
|
+
|
|
782
|
+
context:
|
|
783
|
+
correlation_id: "deterministic_testing--force_creative_approved"
|
|
784
|
+
validations:
|
|
785
|
+
- check: field_value
|
|
786
|
+
path: 'success'
|
|
787
|
+
allowed_values:
|
|
788
|
+
- true
|
|
789
|
+
description: 'Creative approval succeeds'
|
|
790
|
+
- check: field_value
|
|
791
|
+
path: 'current_state'
|
|
792
|
+
allowed_values:
|
|
793
|
+
- 'approved'
|
|
794
|
+
description: 'Creative is now approved'
|
|
795
|
+
|
|
796
|
+
- check: field_present
|
|
797
|
+
path: "context"
|
|
798
|
+
description: "Response echoes back the context object"
|
|
799
|
+
- check: field_value
|
|
800
|
+
path: "context.correlation_id"
|
|
801
|
+
value: "deterministic_testing--force_creative_approved"
|
|
802
|
+
description: "Context correlation_id returned unchanged"
|
|
803
|
+
- id: force_creative_archived
|
|
804
|
+
title: 'Force creative to archived (terminal)'
|
|
805
|
+
requires_tool: comply_test_controller
|
|
806
|
+
narrative: |
|
|
807
|
+
Force the creative to archived, a terminal state.
|
|
808
|
+
task: comply_test_controller
|
|
809
|
+
comply_scenario: deterministic_creative
|
|
810
|
+
stateful: true
|
|
811
|
+
expected: |
|
|
812
|
+
Successful transition to archived.
|
|
813
|
+
|
|
814
|
+
sample_request:
|
|
815
|
+
brand:
|
|
816
|
+
domain: 'acmeoutdoor.example'
|
|
817
|
+
scenario: 'force_creative_status'
|
|
818
|
+
params:
|
|
819
|
+
creative_id: '$context.creative_id'
|
|
820
|
+
status: 'archived'
|
|
821
|
+
|
|
822
|
+
context:
|
|
823
|
+
correlation_id: "deterministic_testing--force_creative_archived"
|
|
824
|
+
validations:
|
|
825
|
+
- check: field_value
|
|
826
|
+
path: 'success'
|
|
827
|
+
allowed_values:
|
|
828
|
+
- true
|
|
829
|
+
description: 'Transition to archived succeeds'
|
|
830
|
+
|
|
831
|
+
- check: field_present
|
|
832
|
+
path: "context"
|
|
833
|
+
description: "Response echoes back the context object"
|
|
834
|
+
- check: field_value
|
|
835
|
+
path: "context.correlation_id"
|
|
836
|
+
value: "deterministic_testing--force_creative_archived"
|
|
837
|
+
description: "Context correlation_id returned unchanged"
|
|
838
|
+
- id: invalid_creative_transition
|
|
839
|
+
title: 'Reject archived to processing'
|
|
840
|
+
requires_tool: comply_test_controller
|
|
841
|
+
narrative: |
|
|
842
|
+
Attempt to force the archived creative back to processing. The controller
|
|
843
|
+
should reject this with INVALID_TRANSITION.
|
|
844
|
+
task: comply_test_controller
|
|
845
|
+
comply_scenario: deterministic_creative
|
|
846
|
+
stateful: true
|
|
847
|
+
expect_error: true
|
|
848
|
+
negative_path: payload_well_formed
|
|
849
|
+
expected: |
|
|
850
|
+
Return error with INVALID_TRANSITION.
|
|
851
|
+
|
|
852
|
+
sample_request:
|
|
853
|
+
brand:
|
|
854
|
+
domain: 'acmeoutdoor.example'
|
|
855
|
+
scenario: 'force_creative_status'
|
|
856
|
+
params:
|
|
857
|
+
creative_id: '$context.creative_id'
|
|
858
|
+
status: 'processing'
|
|
859
|
+
|
|
860
|
+
context:
|
|
861
|
+
correlation_id: "deterministic_testing--invalid_creative_transition"
|
|
862
|
+
validations:
|
|
863
|
+
- check: field_value
|
|
864
|
+
path: 'success'
|
|
865
|
+
allowed_values:
|
|
866
|
+
- false
|
|
867
|
+
description: 'Terminal state rejects transition'
|
|
868
|
+
- check: field_value
|
|
869
|
+
path: 'error'
|
|
870
|
+
allowed_values:
|
|
871
|
+
- 'INVALID_TRANSITION'
|
|
872
|
+
description: 'Error code is INVALID_TRANSITION'
|
|
873
|
+
|
|
874
|
+
- check: field_present
|
|
875
|
+
path: "context"
|
|
876
|
+
description: "Response echoes back the context object"
|
|
877
|
+
- check: field_value
|
|
878
|
+
path: "context.correlation_id"
|
|
879
|
+
value: "deterministic_testing--invalid_creative_transition"
|
|
880
|
+
description: "Context correlation_id returned unchanged"
|
|
881
|
+
- id: sync_fresh_creative_for_rejection
|
|
882
|
+
title: 'Sync a fresh creative to exercise rejection'
|
|
883
|
+
requires_tool: sync_creatives
|
|
884
|
+
narrative: |
|
|
885
|
+
The preceding phase archived the first creative — a terminal state
|
|
886
|
+
that cannot transition to rejected. Sync a second, fresh creative so
|
|
887
|
+
the rejection path starts from processing rather than archived.
|
|
888
|
+
task: sync_creatives
|
|
889
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
890
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
891
|
+
doc_ref: "/media-buy/task-reference/sync_creatives"
|
|
892
|
+
comply_scenario: deterministic_creative
|
|
893
|
+
stateful: true
|
|
894
|
+
expected: |
|
|
895
|
+
A new creative with a distinct creative_id, reusable by downstream
|
|
896
|
+
force_creative_status calls.
|
|
897
|
+
|
|
898
|
+
sample_request:
|
|
899
|
+
account:
|
|
900
|
+
brand:
|
|
901
|
+
domain: "acmeoutdoor.example"
|
|
902
|
+
operator: "pinnacle-agency.example"
|
|
903
|
+
creatives:
|
|
904
|
+
- creative_id: "deterministic-rejection-probe"
|
|
905
|
+
name: "Creative for rejection probe"
|
|
906
|
+
format_id:
|
|
907
|
+
agent_url: "https://your-platform.example.com"
|
|
908
|
+
id: "display_300x250"
|
|
909
|
+
assets:
|
|
910
|
+
image:
|
|
911
|
+
asset_type: "image"
|
|
912
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/banner_300x250.jpg"
|
|
913
|
+
width: 300
|
|
914
|
+
height: 250
|
|
915
|
+
idempotency_key: "$generate:uuid_v4#deterministic_testing_sync_fresh_creative_for_rejection"
|
|
916
|
+
context:
|
|
917
|
+
correlation_id: "deterministic_testing--sync_fresh_creative_for_rejection"
|
|
918
|
+
context_outputs:
|
|
919
|
+
- path: "creatives[0].creative_id"
|
|
920
|
+
name: "fresh_creative_id"
|
|
921
|
+
validations:
|
|
922
|
+
- check: response_schema
|
|
923
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
924
|
+
- check: field_present
|
|
925
|
+
path: "creatives[0].creative_id"
|
|
926
|
+
description: "Response includes the seller's creative_id for the fresh creative"
|
|
927
|
+
|
|
928
|
+
- id: force_creative_rejected
|
|
929
|
+
title: 'Force fresh creative to rejected with reason'
|
|
930
|
+
requires_tool: comply_test_controller
|
|
931
|
+
narrative: |
|
|
932
|
+
Reject the fresh creative (captured as $context.fresh_creative_id)
|
|
933
|
+
with a reason string. Verifies the controller supports rejection
|
|
934
|
+
reasons. Uses the fresh id — NOT the archived one from the prior
|
|
935
|
+
phase, since archived→rejected is not a valid creative-state
|
|
936
|
+
transition.
|
|
937
|
+
task: comply_test_controller
|
|
938
|
+
comply_scenario: deterministic_creative
|
|
939
|
+
stateful: true
|
|
940
|
+
expected: |
|
|
941
|
+
Successful transition to rejected with reason preserved.
|
|
942
|
+
|
|
943
|
+
sample_request:
|
|
944
|
+
brand:
|
|
945
|
+
domain: 'acmeoutdoor.example'
|
|
946
|
+
scenario: 'force_creative_status'
|
|
947
|
+
params:
|
|
948
|
+
creative_id: '$context.fresh_creative_id'
|
|
949
|
+
status: 'rejected'
|
|
950
|
+
rejection_reason: 'Brand safety policy violation (comply test)'
|
|
951
|
+
|
|
952
|
+
context:
|
|
953
|
+
correlation_id: "deterministic_testing--force_creative_rejected"
|
|
954
|
+
validations:
|
|
955
|
+
- check: field_value
|
|
956
|
+
path: 'success'
|
|
957
|
+
allowed_values:
|
|
958
|
+
- true
|
|
959
|
+
description: 'Creative rejection succeeds'
|
|
960
|
+
|
|
961
|
+
- check: field_present
|
|
962
|
+
path: "context"
|
|
963
|
+
description: "Response echoes back the context object"
|
|
964
|
+
- check: field_value
|
|
965
|
+
path: "context.correlation_id"
|
|
966
|
+
value: "deterministic_testing--force_creative_rejected"
|
|
967
|
+
description: "Context correlation_id returned unchanged"
|
|
968
|
+
- id: deterministic_session
|
|
969
|
+
title: 'Deterministic SI session state machine'
|
|
970
|
+
narrative: |
|
|
971
|
+
Initiates an SI session, then uses the controller to force session timeout.
|
|
972
|
+
Verifies that messaging on a terminated session fails appropriately.
|
|
973
|
+
|
|
974
|
+
steps:
|
|
975
|
+
- id: initiate_session
|
|
976
|
+
title: 'Initiate SI session'
|
|
977
|
+
requires_tool: si_initiate_session
|
|
978
|
+
narrative: |
|
|
979
|
+
Create an SI session via si_initiate_session. The session_id is captured
|
|
980
|
+
for controller-driven termination.
|
|
981
|
+
task: si_initiate_session
|
|
982
|
+
schema_ref: 'sponsored-intelligence/si-initiate-session-request.json'
|
|
983
|
+
response_schema_ref: 'sponsored-intelligence/si-initiate-session-response.json'
|
|
984
|
+
comply_scenario: deterministic_session
|
|
985
|
+
stateful: true
|
|
986
|
+
context_outputs:
|
|
987
|
+
- name: session_id
|
|
988
|
+
path: 'session_id'
|
|
989
|
+
expected: |
|
|
990
|
+
Return a session with a session_id.
|
|
991
|
+
|
|
992
|
+
sample_request:
|
|
993
|
+
intent: "comply test — initiate deterministic SI session"
|
|
994
|
+
identity:
|
|
995
|
+
consent_granted: true
|
|
996
|
+
user_type: 'consumer'
|
|
997
|
+
supported_capabilities:
|
|
998
|
+
response_formats:
|
|
999
|
+
- 'text'
|
|
1000
|
+
|
|
1001
|
+
idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_session_initiate_session"
|
|
1002
|
+
context:
|
|
1003
|
+
correlation_id: "deterministic_testing--initiate_session"
|
|
1004
|
+
validations:
|
|
1005
|
+
- check: field_present
|
|
1006
|
+
path: 'session_id'
|
|
1007
|
+
description: 'Session has a session_id'
|
|
1008
|
+
|
|
1009
|
+
- check: field_present
|
|
1010
|
+
path: "context"
|
|
1011
|
+
description: "Response echoes back the context object"
|
|
1012
|
+
- check: field_value
|
|
1013
|
+
path: "context.correlation_id"
|
|
1014
|
+
value: "deterministic_testing--initiate_session"
|
|
1015
|
+
description: "Context correlation_id returned unchanged"
|
|
1016
|
+
- id: force_session_terminated
|
|
1017
|
+
title: 'Force session timeout'
|
|
1018
|
+
requires_tool: comply_test_controller
|
|
1019
|
+
narrative: |
|
|
1020
|
+
Use the controller to force the session into terminated state with
|
|
1021
|
+
termination_reason: session_timeout.
|
|
1022
|
+
task: comply_test_controller
|
|
1023
|
+
comply_scenario: deterministic_session
|
|
1024
|
+
stateful: true
|
|
1025
|
+
expected: |
|
|
1026
|
+
Successful transition to terminated.
|
|
1027
|
+
|
|
1028
|
+
sample_request:
|
|
1029
|
+
scenario: 'force_session_status'
|
|
1030
|
+
params:
|
|
1031
|
+
session_id: '$context.session_id'
|
|
1032
|
+
status: 'terminated'
|
|
1033
|
+
termination_reason: 'session_timeout'
|
|
1034
|
+
|
|
1035
|
+
context:
|
|
1036
|
+
correlation_id: "deterministic_testing--force_session_terminated"
|
|
1037
|
+
validations:
|
|
1038
|
+
- check: field_value
|
|
1039
|
+
path: 'success'
|
|
1040
|
+
allowed_values:
|
|
1041
|
+
- true
|
|
1042
|
+
description: 'Session termination succeeds'
|
|
1043
|
+
|
|
1044
|
+
- check: field_present
|
|
1045
|
+
path: "context"
|
|
1046
|
+
description: "Response echoes back the context object"
|
|
1047
|
+
- check: field_value
|
|
1048
|
+
path: "context.correlation_id"
|
|
1049
|
+
value: "deterministic_testing--force_session_terminated"
|
|
1050
|
+
description: "Context correlation_id returned unchanged"
|
|
1051
|
+
- id: verify_terminated_session
|
|
1052
|
+
title: 'Verify messaging fails on terminated session'
|
|
1053
|
+
requires_tool: comply_test_controller
|
|
1054
|
+
narrative: |
|
|
1055
|
+
Attempt to send a message on the terminated session. The agent should
|
|
1056
|
+
return an error or terminated status.
|
|
1057
|
+
task: si_send_message
|
|
1058
|
+
schema_ref: 'sponsored-intelligence/si-send-message-request.json'
|
|
1059
|
+
response_schema_ref: 'sponsored-intelligence/si-send-message-response.json'
|
|
1060
|
+
comply_scenario: deterministic_session
|
|
1061
|
+
stateful: true
|
|
1062
|
+
expected: |
|
|
1063
|
+
The request should fail or return session_status: terminated. The agent
|
|
1064
|
+
must not accept messages on a terminated session.
|
|
1065
|
+
|
|
1066
|
+
sample_request:
|
|
1067
|
+
session_id: '$context.session_id'
|
|
1068
|
+
message: 'comply test — session should be terminated'
|
|
1069
|
+
|
|
1070
|
+
idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_session_verify_terminated_session"
|
|
1071
|
+
context:
|
|
1072
|
+
correlation_id: "deterministic_testing--verify_terminated_session"
|
|
1073
|
+
validations:
|
|
1074
|
+
- check: field_value
|
|
1075
|
+
path: 'success'
|
|
1076
|
+
allowed_values:
|
|
1077
|
+
- false
|
|
1078
|
+
description: 'Message on terminated session fails'
|
|
1079
|
+
|
|
1080
|
+
- check: field_present
|
|
1081
|
+
path: "context"
|
|
1082
|
+
description: "Response echoes back the context object"
|
|
1083
|
+
- check: field_value
|
|
1084
|
+
path: "context.correlation_id"
|
|
1085
|
+
value: "deterministic_testing--verify_terminated_session"
|
|
1086
|
+
description: "Context correlation_id returned unchanged"
|
|
1087
|
+
- id: deterministic_delivery
|
|
1088
|
+
title: 'Deterministic delivery simulation'
|
|
1089
|
+
narrative: |
|
|
1090
|
+
Creates a media buy, simulates delivery data via the controller, then verifies
|
|
1091
|
+
the simulated metrics are reflected in get_media_buy_delivery.
|
|
1092
|
+
|
|
1093
|
+
steps:
|
|
1094
|
+
- id: create_media_buy_for_delivery
|
|
1095
|
+
title: 'Create media buy for delivery test'
|
|
1096
|
+
requires_tool: comply_test_controller
|
|
1097
|
+
narrative: |
|
|
1098
|
+
Create a media buy to receive simulated delivery data.
|
|
1099
|
+
task: create_media_buy
|
|
1100
|
+
schema_ref: 'media-buy/create-media-buy-request.json'
|
|
1101
|
+
response_schema_ref: 'media-buy/create-media-buy-response.json'
|
|
1102
|
+
doc_ref: '/media-buy/task-reference/create_media_buy'
|
|
1103
|
+
comply_scenario: deterministic_delivery
|
|
1104
|
+
stateful: true
|
|
1105
|
+
context_outputs:
|
|
1106
|
+
- name: delivery_media_buy_id
|
|
1107
|
+
path: 'media_buy_id'
|
|
1108
|
+
expected: |
|
|
1109
|
+
Create a media buy and return a media_buy_id.
|
|
1110
|
+
|
|
1111
|
+
sample_request:
|
|
1112
|
+
account:
|
|
1113
|
+
brand:
|
|
1114
|
+
domain: 'acmeoutdoor.example'
|
|
1115
|
+
operator: 'pinnacle-agency.example'
|
|
1116
|
+
brand:
|
|
1117
|
+
domain: 'acmeoutdoor.example'
|
|
1118
|
+
start_time: '2026-04-01T00:00:00Z'
|
|
1119
|
+
end_time: '2026-06-30T23:59:59Z'
|
|
1120
|
+
packages:
|
|
1121
|
+
- product_id: 'test-product'
|
|
1122
|
+
budget: 5000
|
|
1123
|
+
pricing_option_id: 'test-pricing'
|
|
1124
|
+
|
|
1125
|
+
idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_delivery_create_media_buy_for_delivery"
|
|
1126
|
+
context:
|
|
1127
|
+
correlation_id: "deterministic_testing--create_media_buy_for_delivery"
|
|
1128
|
+
validations:
|
|
1129
|
+
- check: response_schema
|
|
1130
|
+
description: 'Response matches create-media-buy-response.json schema'
|
|
1131
|
+
|
|
1132
|
+
- check: field_present
|
|
1133
|
+
path: "context"
|
|
1134
|
+
description: "Response echoes back the context object"
|
|
1135
|
+
- check: field_value
|
|
1136
|
+
path: "context.correlation_id"
|
|
1137
|
+
value: "deterministic_testing--create_media_buy_for_delivery"
|
|
1138
|
+
description: "Context correlation_id returned unchanged"
|
|
1139
|
+
- id: simulate_delivery
|
|
1140
|
+
title: 'Simulate delivery data'
|
|
1141
|
+
requires_tool: comply_test_controller
|
|
1142
|
+
narrative: |
|
|
1143
|
+
Inject simulated delivery metrics (impressions, clicks, spend) into the
|
|
1144
|
+
media buy via the controller.
|
|
1145
|
+
task: comply_test_controller
|
|
1146
|
+
comply_scenario: deterministic_delivery
|
|
1147
|
+
stateful: true
|
|
1148
|
+
expected: |
|
|
1149
|
+
Return success with simulated delivery metrics acknowledged.
|
|
1150
|
+
|
|
1151
|
+
sample_request:
|
|
1152
|
+
brand:
|
|
1153
|
+
domain: 'acmeoutdoor.example'
|
|
1154
|
+
scenario: 'simulate_delivery'
|
|
1155
|
+
params:
|
|
1156
|
+
media_buy_id: '$context.delivery_media_buy_id'
|
|
1157
|
+
impressions: 10000
|
|
1158
|
+
clicks: 150
|
|
1159
|
+
reported_spend:
|
|
1160
|
+
amount: 150.00
|
|
1161
|
+
currency: 'USD'
|
|
1162
|
+
|
|
1163
|
+
context:
|
|
1164
|
+
correlation_id: "deterministic_testing--simulate_delivery"
|
|
1165
|
+
validations:
|
|
1166
|
+
- check: field_value
|
|
1167
|
+
path: 'success'
|
|
1168
|
+
allowed_values:
|
|
1169
|
+
- true
|
|
1170
|
+
description: 'Delivery simulation succeeds'
|
|
1171
|
+
|
|
1172
|
+
- check: field_present
|
|
1173
|
+
path: "context"
|
|
1174
|
+
description: "Response echoes back the context object"
|
|
1175
|
+
- check: field_value
|
|
1176
|
+
path: "context.correlation_id"
|
|
1177
|
+
value: "deterministic_testing--simulate_delivery"
|
|
1178
|
+
description: "Context correlation_id returned unchanged"
|
|
1179
|
+
- id: verify_delivery
|
|
1180
|
+
title: 'Verify delivery via get_media_buy_delivery'
|
|
1181
|
+
requires_tool: comply_test_controller
|
|
1182
|
+
narrative: |
|
|
1183
|
+
Call get_media_buy_delivery and verify the simulated metrics are reflected
|
|
1184
|
+
in the response. Expect at least 10000 impressions.
|
|
1185
|
+
task: get_media_buy_delivery
|
|
1186
|
+
schema_ref: 'media-buy/get-media-buy-delivery-request.json'
|
|
1187
|
+
response_schema_ref: 'media-buy/get-media-buy-delivery-response.json'
|
|
1188
|
+
doc_ref: '/media-buy/task-reference/get_media_buy_delivery'
|
|
1189
|
+
comply_scenario: deterministic_delivery
|
|
1190
|
+
stateful: true
|
|
1191
|
+
expected: |
|
|
1192
|
+
Return delivery metrics reflecting the simulated data:
|
|
1193
|
+
- impressions >= 10000
|
|
1194
|
+
- clicks and spend data present
|
|
1195
|
+
|
|
1196
|
+
sample_request:
|
|
1197
|
+
account:
|
|
1198
|
+
brand:
|
|
1199
|
+
domain: 'acmeoutdoor.example'
|
|
1200
|
+
operator: 'pinnacle-agency.example'
|
|
1201
|
+
media_buy_ids:
|
|
1202
|
+
- '$context.delivery_media_buy_id'
|
|
1203
|
+
|
|
1204
|
+
context:
|
|
1205
|
+
correlation_id: "deterministic_testing--verify_delivery"
|
|
1206
|
+
validations:
|
|
1207
|
+
- check: response_schema
|
|
1208
|
+
description: 'Response matches get-media-buy-delivery-response.json schema'
|
|
1209
|
+
- check: field_present
|
|
1210
|
+
path: 'media_buy_deliveries'
|
|
1211
|
+
description: 'Response contains delivery data'
|
|
1212
|
+
|
|
1213
|
+
- check: field_present
|
|
1214
|
+
path: "context"
|
|
1215
|
+
description: "Response echoes back the context object"
|
|
1216
|
+
- check: field_value
|
|
1217
|
+
path: "context.correlation_id"
|
|
1218
|
+
value: "deterministic_testing--verify_delivery"
|
|
1219
|
+
description: "Context correlation_id returned unchanged"
|
|
1220
|
+
- id: deterministic_budget
|
|
1221
|
+
title: 'Deterministic budget simulation'
|
|
1222
|
+
narrative: |
|
|
1223
|
+
Creates a media buy, then uses the controller to simulate budget spend at 95%
|
|
1224
|
+
and 100%. Verifies the agent handles near-depletion and full depletion.
|
|
1225
|
+
|
|
1226
|
+
steps:
|
|
1227
|
+
- id: create_media_buy_for_budget
|
|
1228
|
+
title: 'Create media buy for budget test'
|
|
1229
|
+
requires_tool: comply_test_controller
|
|
1230
|
+
narrative: |
|
|
1231
|
+
Create a media buy with a known budget for spend simulation.
|
|
1232
|
+
task: create_media_buy
|
|
1233
|
+
schema_ref: 'media-buy/create-media-buy-request.json'
|
|
1234
|
+
response_schema_ref: 'media-buy/create-media-buy-response.json'
|
|
1235
|
+
doc_ref: '/media-buy/task-reference/create_media_buy'
|
|
1236
|
+
comply_scenario: deterministic_budget
|
|
1237
|
+
stateful: true
|
|
1238
|
+
context_outputs:
|
|
1239
|
+
- name: budget_media_buy_id
|
|
1240
|
+
path: 'media_buy_id'
|
|
1241
|
+
expected: |
|
|
1242
|
+
Create a media buy and return a media_buy_id.
|
|
1243
|
+
|
|
1244
|
+
sample_request:
|
|
1245
|
+
account:
|
|
1246
|
+
brand:
|
|
1247
|
+
domain: 'acmeoutdoor.example'
|
|
1248
|
+
operator: 'pinnacle-agency.example'
|
|
1249
|
+
brand:
|
|
1250
|
+
domain: 'acmeoutdoor.example'
|
|
1251
|
+
start_time: '2026-04-01T00:00:00Z'
|
|
1252
|
+
end_time: '2026-06-30T23:59:59Z'
|
|
1253
|
+
packages:
|
|
1254
|
+
- product_id: 'test-product'
|
|
1255
|
+
budget: 10000
|
|
1256
|
+
pricing_option_id: 'test-pricing'
|
|
1257
|
+
|
|
1258
|
+
idempotency_key: "$generate:uuid_v4#deterministic_testing_deterministic_budget_create_media_buy_for_budget"
|
|
1259
|
+
context:
|
|
1260
|
+
correlation_id: "deterministic_testing--create_media_buy_for_budget"
|
|
1261
|
+
validations:
|
|
1262
|
+
- check: response_schema
|
|
1263
|
+
description: 'Response matches create-media-buy-response.json schema'
|
|
1264
|
+
|
|
1265
|
+
- check: field_present
|
|
1266
|
+
path: "context"
|
|
1267
|
+
description: "Response echoes back the context object"
|
|
1268
|
+
- check: field_value
|
|
1269
|
+
path: "context.correlation_id"
|
|
1270
|
+
value: "deterministic_testing--create_media_buy_for_budget"
|
|
1271
|
+
description: "Context correlation_id returned unchanged"
|
|
1272
|
+
- id: simulate_budget_95
|
|
1273
|
+
title: 'Simulate 95% budget spend'
|
|
1274
|
+
requires_tool: comply_test_controller
|
|
1275
|
+
narrative: |
|
|
1276
|
+
Simulate 95% of the media buy budget being spent. The agent should
|
|
1277
|
+
handle near-depletion state.
|
|
1278
|
+
task: comply_test_controller
|
|
1279
|
+
comply_scenario: deterministic_budget
|
|
1280
|
+
stateful: true
|
|
1281
|
+
expected: |
|
|
1282
|
+
Return success with budget spend simulated to 95%.
|
|
1283
|
+
|
|
1284
|
+
sample_request:
|
|
1285
|
+
brand:
|
|
1286
|
+
domain: 'acmeoutdoor.example'
|
|
1287
|
+
scenario: 'simulate_budget_spend'
|
|
1288
|
+
params:
|
|
1289
|
+
media_buy_id: '$context.budget_media_buy_id'
|
|
1290
|
+
spend_percentage: 95
|
|
1291
|
+
|
|
1292
|
+
context:
|
|
1293
|
+
correlation_id: "deterministic_testing--simulate_budget_95"
|
|
1294
|
+
validations:
|
|
1295
|
+
- check: field_value
|
|
1296
|
+
path: 'success'
|
|
1297
|
+
allowed_values:
|
|
1298
|
+
- true
|
|
1299
|
+
description: '95% budget simulation succeeds'
|
|
1300
|
+
|
|
1301
|
+
- check: field_present
|
|
1302
|
+
path: "context"
|
|
1303
|
+
description: "Response echoes back the context object"
|
|
1304
|
+
- check: field_value
|
|
1305
|
+
path: "context.correlation_id"
|
|
1306
|
+
value: "deterministic_testing--simulate_budget_95"
|
|
1307
|
+
description: "Context correlation_id returned unchanged"
|
|
1308
|
+
- id: simulate_budget_100
|
|
1309
|
+
title: 'Simulate 100% budget depletion'
|
|
1310
|
+
requires_tool: comply_test_controller
|
|
1311
|
+
narrative: |
|
|
1312
|
+
Simulate complete budget depletion. The agent should handle the fully
|
|
1313
|
+
spent state.
|
|
1314
|
+
task: comply_test_controller
|
|
1315
|
+
comply_scenario: deterministic_budget
|
|
1316
|
+
stateful: true
|
|
1317
|
+
expected: |
|
|
1318
|
+
Return success with budget fully depleted.
|
|
1319
|
+
|
|
1320
|
+
sample_request:
|
|
1321
|
+
brand:
|
|
1322
|
+
domain: 'acmeoutdoor.example'
|
|
1323
|
+
scenario: 'simulate_budget_spend'
|
|
1324
|
+
params:
|
|
1325
|
+
media_buy_id: '$context.budget_media_buy_id'
|
|
1326
|
+
spend_percentage: 100
|
|
1327
|
+
|
|
1328
|
+
context:
|
|
1329
|
+
correlation_id: "deterministic_testing--simulate_budget_100"
|
|
1330
|
+
validations:
|
|
1331
|
+
- check: field_value
|
|
1332
|
+
path: 'success'
|
|
1333
|
+
allowed_values:
|
|
1334
|
+
- true
|
|
1335
|
+
description: '100% budget depletion simulation succeeds'
|
|
1336
|
+
|
|
1337
|
+
- check: field_present
|
|
1338
|
+
path: "context"
|
|
1339
|
+
description: "Response echoes back the context object"
|
|
1340
|
+
- check: field_value
|
|
1341
|
+
path: "context.correlation_id"
|
|
1342
|
+
value: "deterministic_testing--simulate_budget_100"
|
|
1343
|
+
description: "Context correlation_id returned unchanged"
|