@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,526 @@
|
|
|
1
|
+
id: schema_validation
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Schema compliance and temporal validation"
|
|
4
|
+
category: schema_validation
|
|
5
|
+
summary: "Validates that agent responses conform to AdCP schemas and that temporal constraints are enforced."
|
|
6
|
+
track: core
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
Every AdCP agent must return responses that match the published JSON schemas. Fields defined
|
|
12
|
+
in the spec — product_id, delivery_type, pricing_options — must be present and correctly typed.
|
|
13
|
+
Agents must also enforce temporal constraints: flight dates must be logically consistent
|
|
14
|
+
(end after start) and start dates should not be in the past.
|
|
15
|
+
|
|
16
|
+
This storyboard checks schema compliance on get_products responses and enforces temporal
|
|
17
|
+
constraints on create_media_buy — reversed dates must always be rejected, and past
|
|
18
|
+
start_time must be either rejected or accepted-with-adjustment (never silently accepted).
|
|
19
|
+
These are foundational requirements that every agent must satisfy regardless of platform
|
|
20
|
+
type.
|
|
21
|
+
|
|
22
|
+
agent:
|
|
23
|
+
interaction_model: media_buy_seller
|
|
24
|
+
capabilities:
|
|
25
|
+
- sells_media
|
|
26
|
+
examples:
|
|
27
|
+
- "Any AdCP seller agent"
|
|
28
|
+
|
|
29
|
+
caller:
|
|
30
|
+
role: buyer_agent
|
|
31
|
+
example: "Compliance test harness"
|
|
32
|
+
|
|
33
|
+
prerequisites:
|
|
34
|
+
description: |
|
|
35
|
+
The caller needs a brand identity for product discovery requests.
|
|
36
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
37
|
+
|
|
38
|
+
phases:
|
|
39
|
+
- id: capability_discovery
|
|
40
|
+
title: "Capability discovery"
|
|
41
|
+
narrative: |
|
|
42
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports media buying before validating response schemas.
|
|
43
|
+
|
|
44
|
+
steps:
|
|
45
|
+
- id: get_capabilities
|
|
46
|
+
title: "Check agent capabilities"
|
|
47
|
+
narrative: |
|
|
48
|
+
Verify that the agent declares the expected protocol support before
|
|
49
|
+
proceeding with domain-specific operations.
|
|
50
|
+
task: get_adcp_capabilities
|
|
51
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
52
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
53
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
54
|
+
comply_scenario: capability_discovery
|
|
55
|
+
stateful: false
|
|
56
|
+
expected: |
|
|
57
|
+
Return capabilities declaring media_buy in supported_protocols, confirming the agent sells media.
|
|
58
|
+
sample_request:
|
|
59
|
+
context:
|
|
60
|
+
correlation_id: "schema_validation--get_capabilities"
|
|
61
|
+
validations:
|
|
62
|
+
- check: response_schema
|
|
63
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
64
|
+
- check: field_present
|
|
65
|
+
path: "supported_protocols"
|
|
66
|
+
description: "Agent declares supported protocols"
|
|
67
|
+
|
|
68
|
+
- check: field_present
|
|
69
|
+
path: "context"
|
|
70
|
+
description: "Response echoes back the context object"
|
|
71
|
+
- check: field_value
|
|
72
|
+
path: "context.correlation_id"
|
|
73
|
+
value: "schema_validation--get_capabilities"
|
|
74
|
+
description: "Context correlation_id returned unchanged"
|
|
75
|
+
- id: schema_compliance
|
|
76
|
+
title: "Response schema compliance"
|
|
77
|
+
narrative: |
|
|
78
|
+
The buyer sends a standard get_products request and validates that the response
|
|
79
|
+
matches the published schema. Each product must have the required fields defined
|
|
80
|
+
in the AdCP spec.
|
|
81
|
+
|
|
82
|
+
steps:
|
|
83
|
+
- id: get_products_schema
|
|
84
|
+
title: "Validate get_products response schema"
|
|
85
|
+
narrative: |
|
|
86
|
+
Send a brief and validate the response structure. Every product in the response
|
|
87
|
+
must conform to the get-products-response.json schema, with required v3 fields
|
|
88
|
+
present.
|
|
89
|
+
task: get_products
|
|
90
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
91
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
92
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
93
|
+
comply_scenario: schema_compliance
|
|
94
|
+
stateful: false
|
|
95
|
+
expected: |
|
|
96
|
+
Return products matching the brief. Each product must have all eight required fields:
|
|
97
|
+
- product_id: unique identifier for the product
|
|
98
|
+
- name: human-readable product name
|
|
99
|
+
- description: detailed description of the product and its inventory
|
|
100
|
+
- publisher_properties: array (minItems: 1) of publisher property selectors
|
|
101
|
+
- format_ids: array of format_id objects — each with agent_url (URI) and id
|
|
102
|
+
- delivery_type: "guaranteed" or "non_guaranteed"
|
|
103
|
+
- pricing_options: array (minItems: 1) — each with pricing_option_id, pricing_model, and currency
|
|
104
|
+
- reporting_capabilities: fully-formed object with required sub-fields:
|
|
105
|
+
available_reporting_frequencies, expected_delay_minutes, timezone,
|
|
106
|
+
supports_webhooks, available_metrics, date_range_support
|
|
107
|
+
|
|
108
|
+
Responses missing any of these fields fail schema validation regardless of
|
|
109
|
+
what other fields are present.
|
|
110
|
+
|
|
111
|
+
sample_request:
|
|
112
|
+
buying_mode: "brief"
|
|
113
|
+
brief: "Show all available advertising products"
|
|
114
|
+
account:
|
|
115
|
+
brand:
|
|
116
|
+
domain: "acmeoutdoor.example"
|
|
117
|
+
operator: "pinnacle-agency.example"
|
|
118
|
+
|
|
119
|
+
context:
|
|
120
|
+
correlation_id: "schema_validation--get_products_schema"
|
|
121
|
+
validations:
|
|
122
|
+
- check: response_schema
|
|
123
|
+
description: "Response matches get-products-response.json schema"
|
|
124
|
+
- check: field_present
|
|
125
|
+
path: "products"
|
|
126
|
+
description: "Response contains a products array"
|
|
127
|
+
- check: field_present
|
|
128
|
+
path: "products[0].product_id"
|
|
129
|
+
description: "Each product has a product_id"
|
|
130
|
+
- check: field_present
|
|
131
|
+
path: "products[0].delivery_type"
|
|
132
|
+
description: "Each product declares guaranteed or non_guaranteed delivery"
|
|
133
|
+
|
|
134
|
+
- check: field_present
|
|
135
|
+
path: "context"
|
|
136
|
+
description: "Response echoes back the context object"
|
|
137
|
+
- check: field_value
|
|
138
|
+
path: "context.correlation_id"
|
|
139
|
+
value: "schema_validation--get_products_schema"
|
|
140
|
+
description: "Context correlation_id returned unchanged"
|
|
141
|
+
- id: pricing_options_present
|
|
142
|
+
title: "Validate pricing options structure"
|
|
143
|
+
narrative: |
|
|
144
|
+
Verify that products include pricing_options with the required fields:
|
|
145
|
+
pricing_option_id and pricing_model. These are required for buyers to
|
|
146
|
+
construct valid create_media_buy requests.
|
|
147
|
+
task: get_products
|
|
148
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
149
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
150
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
151
|
+
comply_scenario: schema_compliance
|
|
152
|
+
stateful: false
|
|
153
|
+
expected: |
|
|
154
|
+
Products include pricing_options with:
|
|
155
|
+
- pricing_option_id: unique identifier for the pricing option
|
|
156
|
+
- pricing_model: CPM, CPC, flat_rate, etc.
|
|
157
|
+
|
|
158
|
+
sample_request:
|
|
159
|
+
buying_mode: "brief"
|
|
160
|
+
brief: "Premium display inventory with pricing details"
|
|
161
|
+
account:
|
|
162
|
+
brand:
|
|
163
|
+
domain: "acmeoutdoor.example"
|
|
164
|
+
operator: "pinnacle-agency.example"
|
|
165
|
+
|
|
166
|
+
context:
|
|
167
|
+
correlation_id: "schema_validation--pricing_options_present"
|
|
168
|
+
validations:
|
|
169
|
+
- check: field_present
|
|
170
|
+
path: "products[0].pricing_options[0].pricing_option_id"
|
|
171
|
+
description: "Pricing options have a pricing_option_id"
|
|
172
|
+
- check: field_present
|
|
173
|
+
path: "products[0].pricing_options[0].pricing_model"
|
|
174
|
+
description: "Pricing options declare a pricing_model"
|
|
175
|
+
|
|
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: "schema_validation--pricing_options_present"
|
|
182
|
+
description: "Context correlation_id returned unchanged"
|
|
183
|
+
- id: format_id_reconciliation
|
|
184
|
+
title: "Format ID and pricing option reconciliation"
|
|
185
|
+
narrative: |
|
|
186
|
+
Identifiers returned by get_products must be accepted back by the same agent in
|
|
187
|
+
subsequent calls. Two common reconciliation failures:
|
|
188
|
+
|
|
189
|
+
1. Format IDs: the seller returns format_id objects in products that their own
|
|
190
|
+
validation rejects when the buyer echoes them back in sync_creatives.
|
|
191
|
+
2. Pricing option IDs: the seller returns pricing_option_id values in products
|
|
192
|
+
that create_media_buy rejects when the buyer references them.
|
|
193
|
+
|
|
194
|
+
These validations confirm structural correctness — that required fields exist and
|
|
195
|
+
are well-formed. Full roundtrip verification (echoing a product's format_id into
|
|
196
|
+
sync_creatives and confirming acceptance) requires a stateful multi-step test,
|
|
197
|
+
which is covered by the media_buy_seller storyboard's creative_sync phase.
|
|
198
|
+
|
|
199
|
+
steps:
|
|
200
|
+
- id: get_products_for_formats
|
|
201
|
+
title: "Get products and verify identifiers"
|
|
202
|
+
narrative: |
|
|
203
|
+
Request products and verify that each product includes format_ids and
|
|
204
|
+
pricing_options with the required fields. These identifiers will be echoed
|
|
205
|
+
back in create_media_buy and sync_creatives — if they are malformed or
|
|
206
|
+
missing, the buyer cannot complete the purchase.
|
|
207
|
+
task: get_products
|
|
208
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
209
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
210
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
211
|
+
comply_scenario: schema_compliance
|
|
212
|
+
stateful: false
|
|
213
|
+
expected: |
|
|
214
|
+
Return products with format_ids and pricing_options. Each format_id must have:
|
|
215
|
+
- agent_url: URI of the agent that defines the format
|
|
216
|
+
- id: format identifier within that agent's namespace
|
|
217
|
+
- Optional: width, height, duration_ms for parameterized formats
|
|
218
|
+
|
|
219
|
+
Each pricing_option must have:
|
|
220
|
+
- pricing_option_id: unique identifier echoed in create_media_buy
|
|
221
|
+
- pricing_model: CPM, CPC, flat_rate, etc.
|
|
222
|
+
|
|
223
|
+
These identifiers must be accepted unchanged in subsequent requests.
|
|
224
|
+
|
|
225
|
+
sample_request:
|
|
226
|
+
buying_mode: "brief"
|
|
227
|
+
brief: "Show all available advertising products with creative format requirements"
|
|
228
|
+
account:
|
|
229
|
+
brand:
|
|
230
|
+
domain: "acmeoutdoor.example"
|
|
231
|
+
operator: "pinnacle-agency.example"
|
|
232
|
+
context:
|
|
233
|
+
correlation_id: "schema_validation--get_products_for_formats"
|
|
234
|
+
|
|
235
|
+
validations:
|
|
236
|
+
- check: response_schema
|
|
237
|
+
description: "Response matches get-products-response.json schema"
|
|
238
|
+
- check: field_present
|
|
239
|
+
path: "products[0].format_ids"
|
|
240
|
+
description: "Products include format_ids array"
|
|
241
|
+
- check: field_present
|
|
242
|
+
path: "products[0].format_ids[0].agent_url"
|
|
243
|
+
description: "Format IDs include agent_url"
|
|
244
|
+
- check: field_present
|
|
245
|
+
path: "products[0].format_ids[0].id"
|
|
246
|
+
description: "Format IDs include id"
|
|
247
|
+
- check: field_present
|
|
248
|
+
path: "products[0].pricing_options[0].pricing_option_id"
|
|
249
|
+
description: "Pricing options include pricing_option_id — must be accepted in create_media_buy"
|
|
250
|
+
- check: field_present
|
|
251
|
+
path: "products[0].pricing_options[0].pricing_model"
|
|
252
|
+
description: "Pricing options include pricing_model"
|
|
253
|
+
- check: field_present
|
|
254
|
+
path: "context"
|
|
255
|
+
description: "Response echoes back the context object"
|
|
256
|
+
- check: field_value
|
|
257
|
+
path: "context.correlation_id"
|
|
258
|
+
value: "schema_validation--get_products_for_formats"
|
|
259
|
+
description: "Context correlation_id returned unchanged"
|
|
260
|
+
|
|
261
|
+
- id: list_formats_match
|
|
262
|
+
title: "Verify format catalog includes product formats"
|
|
263
|
+
narrative: |
|
|
264
|
+
Call list_creative_formats and verify that the formats returned include
|
|
265
|
+
the same agent_url as the format_ids on products. The seller's format
|
|
266
|
+
catalog must cover every format referenced by its products.
|
|
267
|
+
task: list_creative_formats
|
|
268
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
269
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
270
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
271
|
+
comply_scenario: schema_compliance
|
|
272
|
+
stateful: false
|
|
273
|
+
expected: |
|
|
274
|
+
Return formats matching the agent's own product format_ids:
|
|
275
|
+
- format_id.agent_url must match the agent's own URL
|
|
276
|
+
- format_id.id values must include those referenced by products
|
|
277
|
+
- Each format must define asset requirements (types, dimensions, mime types)
|
|
278
|
+
|
|
279
|
+
If the agent returns format_ids in products that don't appear in
|
|
280
|
+
list_creative_formats, buyers cannot construct valid sync_creatives requests.
|
|
281
|
+
|
|
282
|
+
sample_request:
|
|
283
|
+
context:
|
|
284
|
+
correlation_id: "schema_validation--list_formats_match"
|
|
285
|
+
|
|
286
|
+
validations:
|
|
287
|
+
- check: response_schema
|
|
288
|
+
description: "Response matches list-creative-formats-response.json schema"
|
|
289
|
+
- check: field_present
|
|
290
|
+
path: "formats[0].format_id.agent_url"
|
|
291
|
+
description: "Formats include format_id with agent_url"
|
|
292
|
+
- check: field_present
|
|
293
|
+
path: "formats[0].format_id.id"
|
|
294
|
+
description: "Formats include format_id with id"
|
|
295
|
+
- check: field_present
|
|
296
|
+
path: "context"
|
|
297
|
+
description: "Response echoes back the context object"
|
|
298
|
+
- check: field_value
|
|
299
|
+
path: "context.correlation_id"
|
|
300
|
+
value: "schema_validation--list_formats_match"
|
|
301
|
+
description: "Context correlation_id returned unchanged"
|
|
302
|
+
|
|
303
|
+
- id: temporal_validation
|
|
304
|
+
title: "Temporal constraint enforcement"
|
|
305
|
+
narrative: |
|
|
306
|
+
The buyer sends media buy requests with invalid temporal constraints. The agent
|
|
307
|
+
must reject reversed dates (end before start) and handle past start dates
|
|
308
|
+
appropriately.
|
|
309
|
+
|
|
310
|
+
steps:
|
|
311
|
+
- id: reversed_dates
|
|
312
|
+
title: "Reject reversed flight dates"
|
|
313
|
+
narrative: |
|
|
314
|
+
Send a create_media_buy request where end_time is before start_time. The agent
|
|
315
|
+
must reject this with an INVALID_REQUEST error.
|
|
316
|
+
task: create_media_buy
|
|
317
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
318
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
319
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
320
|
+
comply_scenario: temporal_validation
|
|
321
|
+
expect_error: true
|
|
322
|
+
negative_path: payload_well_formed
|
|
323
|
+
stateful: false
|
|
324
|
+
expected: |
|
|
325
|
+
Reject the request with:
|
|
326
|
+
- Error code: INVALID_REQUEST
|
|
327
|
+
- Message indicating the date constraint violation
|
|
328
|
+
|
|
329
|
+
sample_request:
|
|
330
|
+
brand:
|
|
331
|
+
domain: "acmeoutdoor.example"
|
|
332
|
+
account:
|
|
333
|
+
brand:
|
|
334
|
+
domain: "acmeoutdoor.example"
|
|
335
|
+
operator: "pinnacle-agency.example"
|
|
336
|
+
idempotency_key: "schema-validation-reversed-dates-v1"
|
|
337
|
+
start_time: "2026-12-31T00:00:00Z"
|
|
338
|
+
end_time: "2026-01-01T00:00:00Z"
|
|
339
|
+
packages:
|
|
340
|
+
- product_id: "test-product"
|
|
341
|
+
budget: 10000
|
|
342
|
+
pricing_option_id: "test-pricing"
|
|
343
|
+
|
|
344
|
+
context:
|
|
345
|
+
correlation_id: "schema_validation--reversed_dates"
|
|
346
|
+
validations:
|
|
347
|
+
- check: field_present
|
|
348
|
+
path: "adcp_error"
|
|
349
|
+
description: "Response contains an error for reversed dates"
|
|
350
|
+
|
|
351
|
+
- check: field_present
|
|
352
|
+
path: "context"
|
|
353
|
+
description: "Response echoes back the context object"
|
|
354
|
+
- check: field_value
|
|
355
|
+
path: "context.correlation_id"
|
|
356
|
+
value: "schema_validation--reversed_dates"
|
|
357
|
+
description: "Context correlation_id returned unchanged"
|
|
358
|
+
- id: past_start_reject_path
|
|
359
|
+
title: "Past start date — reject path"
|
|
360
|
+
narrative: |
|
|
361
|
+
Some agents reject past start dates with INVALID_REQUEST. This phase
|
|
362
|
+
exercises that path. Passing agents that reject here contribute
|
|
363
|
+
`past_start_handled`; passing agents that accept-with-adjustment do so
|
|
364
|
+
in the parallel adjust path below. Either path satisfies the temporal
|
|
365
|
+
enforcement assertion at the end.
|
|
366
|
+
optional: true
|
|
367
|
+
branch_set:
|
|
368
|
+
id: past_start_handled
|
|
369
|
+
semantics: any_of
|
|
370
|
+
|
|
371
|
+
steps:
|
|
372
|
+
- id: create_buy_past_start_reject
|
|
373
|
+
title: "Submit a past-start create_media_buy — expect rejection"
|
|
374
|
+
narrative: |
|
|
375
|
+
Send a create_media_buy whose start_time is years in the past. An
|
|
376
|
+
agent on this path rejects with INVALID_REQUEST. The request
|
|
377
|
+
carries a valid `idempotency_key` so the rejection is
|
|
378
|
+
unambiguously about the temporal constraint — without a key the
|
|
379
|
+
agent could also legitimately reject for missing-key (per
|
|
380
|
+
universal/idempotency.yaml), and the storyboard couldn't tell
|
|
381
|
+
which rule fired.
|
|
382
|
+
task: create_media_buy
|
|
383
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
384
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
385
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
386
|
+
comply_scenario: temporal_validation
|
|
387
|
+
expect_error: true
|
|
388
|
+
negative_path: payload_well_formed
|
|
389
|
+
stateful: false
|
|
390
|
+
contributes: true
|
|
391
|
+
expected: |
|
|
392
|
+
Reject the request with:
|
|
393
|
+
- Error code: INVALID_REQUEST
|
|
394
|
+
- Message indicating the past start_time violation
|
|
395
|
+
|
|
396
|
+
sample_request:
|
|
397
|
+
brand:
|
|
398
|
+
domain: "acmeoutdoor.example"
|
|
399
|
+
account:
|
|
400
|
+
brand:
|
|
401
|
+
domain: "acmeoutdoor.example"
|
|
402
|
+
operator: "pinnacle-agency.example"
|
|
403
|
+
start_time: "2020-01-01T00:00:00Z"
|
|
404
|
+
end_time: "2026-12-31T23:59:59Z"
|
|
405
|
+
packages:
|
|
406
|
+
- product_id: "test-product"
|
|
407
|
+
budget: 10000
|
|
408
|
+
pricing_option_id: "test-pricing"
|
|
409
|
+
|
|
410
|
+
idempotency_key: "$generate:uuid_v4#schema_validation_past_start_reject"
|
|
411
|
+
context:
|
|
412
|
+
correlation_id: "schema_validation--past_start_date_reject"
|
|
413
|
+
validations:
|
|
414
|
+
- check: error_code
|
|
415
|
+
value: "INVALID_REQUEST"
|
|
416
|
+
description: "Past start_time rejected with INVALID_REQUEST"
|
|
417
|
+
|
|
418
|
+
- check: field_present
|
|
419
|
+
path: "context"
|
|
420
|
+
description: "Response echoes back the context object"
|
|
421
|
+
- check: field_value
|
|
422
|
+
path: "context.correlation_id"
|
|
423
|
+
value: "schema_validation--past_start_date_reject"
|
|
424
|
+
description: "Context correlation_id returned unchanged"
|
|
425
|
+
|
|
426
|
+
- id: past_start_adjust_path
|
|
427
|
+
title: "Past start date — adjust path"
|
|
428
|
+
narrative: |
|
|
429
|
+
Some agents accept past start dates and auto-adjust them forward to a
|
|
430
|
+
legal flight window. This phase exercises that path. Passing agents
|
|
431
|
+
contribute `past_start_handled`; the parallel reject path above covers
|
|
432
|
+
agents that chose rejection instead.
|
|
433
|
+
|
|
434
|
+
The response doesn't carry the adjusted start_time directly, so the
|
|
435
|
+
validation here is success-envelope + context echo — a conformant
|
|
436
|
+
accept-with-adjustment response returns a media_buy_id, and the agent
|
|
437
|
+
is trusted to have adjusted the date per its own policy.
|
|
438
|
+
optional: true
|
|
439
|
+
branch_set:
|
|
440
|
+
id: past_start_handled
|
|
441
|
+
semantics: any_of
|
|
442
|
+
|
|
443
|
+
steps:
|
|
444
|
+
- id: create_buy_past_start_adjust
|
|
445
|
+
title: "Submit a past-start create_media_buy — expect accept-and-adjust"
|
|
446
|
+
narrative: |
|
|
447
|
+
Same request as the reject path. An agent on this path accepts it,
|
|
448
|
+
auto-adjusts the start_time forward, and returns a media_buy_id.
|
|
449
|
+
idempotency_key is present because the request is a real mutation.
|
|
450
|
+
task: create_media_buy
|
|
451
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
452
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
453
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
454
|
+
comply_scenario: temporal_validation
|
|
455
|
+
stateful: false
|
|
456
|
+
contributes: true
|
|
457
|
+
expected: |
|
|
458
|
+
Accept the request with auto-adjusted dates:
|
|
459
|
+
- Response matches create-media-buy-response.json schema
|
|
460
|
+
- media_buy_id present
|
|
461
|
+
- context.correlation_id echoed
|
|
462
|
+
|
|
463
|
+
sample_request:
|
|
464
|
+
brand:
|
|
465
|
+
domain: "acmeoutdoor.example"
|
|
466
|
+
account:
|
|
467
|
+
brand:
|
|
468
|
+
domain: "acmeoutdoor.example"
|
|
469
|
+
operator: "pinnacle-agency.example"
|
|
470
|
+
start_time: "2020-01-01T00:00:00Z"
|
|
471
|
+
end_time: "2026-12-31T23:59:59Z"
|
|
472
|
+
packages:
|
|
473
|
+
- product_id: "test-product"
|
|
474
|
+
budget: 10000
|
|
475
|
+
pricing_option_id: "test-pricing"
|
|
476
|
+
|
|
477
|
+
idempotency_key: "$generate:uuid_v4#schema_validation_past_start_adjust"
|
|
478
|
+
context:
|
|
479
|
+
correlation_id: "schema_validation--past_start_date_adjust"
|
|
480
|
+
validations:
|
|
481
|
+
- check: response_schema
|
|
482
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
483
|
+
- check: field_present
|
|
484
|
+
path: "media_buy_id"
|
|
485
|
+
description: "Response carries a media_buy_id (accept branch)"
|
|
486
|
+
|
|
487
|
+
- check: field_present
|
|
488
|
+
path: "context"
|
|
489
|
+
description: "Response echoes back the context object"
|
|
490
|
+
- check: field_value
|
|
491
|
+
path: "context.correlation_id"
|
|
492
|
+
value: "schema_validation--past_start_date_adjust"
|
|
493
|
+
description: "Context correlation_id returned unchanged"
|
|
494
|
+
|
|
495
|
+
- id: past_start_enforcement
|
|
496
|
+
title: "Past start date — require handling"
|
|
497
|
+
narrative: |
|
|
498
|
+
An agent that silently accepts a past start_time without either
|
|
499
|
+
rejecting or acknowledging an adjustment is non-conformant. Either
|
|
500
|
+
optional path above must succeed. This phase asserts the
|
|
501
|
+
`past_start_handled` contribution was set by at least one of them.
|
|
502
|
+
|
|
503
|
+
Note: the spec (docs/media-buy/task-reference/create_media_buy.mdx,
|
|
504
|
+
§Flight date validation) explicitly mandates INVALID_REQUEST for
|
|
505
|
+
reversed/out-of-range dates but is silent on past start_time,
|
|
506
|
+
which is why either-or is the current conformant stance. If a
|
|
507
|
+
future spec revision commits to one behavior, this phase
|
|
508
|
+
collapses to a single required path.
|
|
509
|
+
|
|
510
|
+
steps:
|
|
511
|
+
- id: assert_past_start_handled
|
|
512
|
+
title: "Require past_start_handled from either path"
|
|
513
|
+
narrative: |
|
|
514
|
+
Synthetic assertion over accumulated flags from the two optional
|
|
515
|
+
phases. Fails only if neither path contributed past_start_handled.
|
|
516
|
+
task: assert_contribution
|
|
517
|
+
comply_scenario: temporal_validation
|
|
518
|
+
stateful: false
|
|
519
|
+
expected: |
|
|
520
|
+
At least one of past_start_reject_path or past_start_adjust_path
|
|
521
|
+
contributed `past_start_handled`.
|
|
522
|
+
|
|
523
|
+
validations:
|
|
524
|
+
- check: any_of
|
|
525
|
+
allowed_values: ["past_start_handled"]
|
|
526
|
+
description: "Agent must either reject the past start_time (reject path) or accept-and-adjust (adjust path). Silent acceptance without either outcome is non-conformant."
|