@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
package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
id: media_buy_seller/pending_creatives_to_start
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Creative sync unblocks pending_creatives → pending_start"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that a media buy created without creatives sits in pending_creatives until sync_creatives completes, then transitions to pending_start."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
- sync_creatives
|
|
11
|
+
- get_media_buys
|
|
12
|
+
|
|
13
|
+
narrative: |
|
|
14
|
+
When a buyer creates a media buy without creative_assignments, the seller cannot start
|
|
15
|
+
delivery until creatives are supplied. The seller must report status: pending_creatives
|
|
16
|
+
and, after sync_creatives attaches the required assets, transition the buy to
|
|
17
|
+
pending_start (awaiting flight start) or active (if already in flight).
|
|
18
|
+
|
|
19
|
+
This scenario walks the transition end-to-end: create the buy, confirm pending_creatives,
|
|
20
|
+
sync a creative, and confirm the status advances to pending_start. The transition
|
|
21
|
+
proves that the creative pipeline and the buy state machine are wired together — a
|
|
22
|
+
common integration gap when creative and media buy systems live on different backends.
|
|
23
|
+
|
|
24
|
+
agent:
|
|
25
|
+
interaction_model: media_buy_seller
|
|
26
|
+
capabilities:
|
|
27
|
+
- sells_media
|
|
28
|
+
- accepts_creatives
|
|
29
|
+
examples:
|
|
30
|
+
- "Any seller that requires creatives before starting delivery"
|
|
31
|
+
|
|
32
|
+
caller:
|
|
33
|
+
role: buyer_agent
|
|
34
|
+
example: "Pinnacle Agency (buyer)"
|
|
35
|
+
|
|
36
|
+
prerequisites:
|
|
37
|
+
description: |
|
|
38
|
+
Seller supports create_media_buy without creative_assignments and honors the
|
|
39
|
+
pending_creatives → pending_start transition when creatives are synced.
|
|
40
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
41
|
+
|
|
42
|
+
phases:
|
|
43
|
+
- id: setup
|
|
44
|
+
title: "Discover products and formats"
|
|
45
|
+
steps:
|
|
46
|
+
- id: get_products_brief
|
|
47
|
+
title: "Discover a product"
|
|
48
|
+
task: get_products
|
|
49
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
50
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
51
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
52
|
+
comply_scenario: full_sales_flow
|
|
53
|
+
stateful: false
|
|
54
|
+
expected: |
|
|
55
|
+
Return at least one product with format_ids and pricing options.
|
|
56
|
+
sample_request:
|
|
57
|
+
buying_mode: "brief"
|
|
58
|
+
brief: "Display inventory on outdoor lifestyle content. Q3 flight."
|
|
59
|
+
account:
|
|
60
|
+
brand:
|
|
61
|
+
domain: "acmeoutdoor.example"
|
|
62
|
+
operator: "pinnacle-agency.example"
|
|
63
|
+
context_outputs:
|
|
64
|
+
- path: "products[0].product_id"
|
|
65
|
+
key: "product_id"
|
|
66
|
+
- path: "products[0].pricing_options[0].pricing_option_id"
|
|
67
|
+
key: "pricing_option_id"
|
|
68
|
+
- path: "products[0].format_ids[0]"
|
|
69
|
+
key: "format_id"
|
|
70
|
+
validations:
|
|
71
|
+
- check: response_schema
|
|
72
|
+
description: "Response matches get-products-response.json schema"
|
|
73
|
+
- check: field_present
|
|
74
|
+
path: "products[0].format_ids[0].id"
|
|
75
|
+
description: "Product declares a format_id for creative sync"
|
|
76
|
+
|
|
77
|
+
- id: create_without_creatives
|
|
78
|
+
title: "Create media buy without creative_assignments"
|
|
79
|
+
narrative: |
|
|
80
|
+
The buyer intentionally omits creative_assignments. The seller must accept the
|
|
81
|
+
buy, persist it, and return status: pending_creatives with valid_actions
|
|
82
|
+
including sync_creatives.
|
|
83
|
+
|
|
84
|
+
steps:
|
|
85
|
+
- id: create_buy_no_creatives
|
|
86
|
+
title: "Create buy in pending_creatives"
|
|
87
|
+
task: create_media_buy
|
|
88
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
89
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
90
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
91
|
+
comply_scenario: create_media_buy
|
|
92
|
+
stateful: true
|
|
93
|
+
expected: |
|
|
94
|
+
Media buy created with:
|
|
95
|
+
- media_buy_id assigned
|
|
96
|
+
- status: pending_creatives
|
|
97
|
+
- valid_actions including sync_creatives
|
|
98
|
+
|
|
99
|
+
sample_request:
|
|
100
|
+
brand:
|
|
101
|
+
domain: "acmeoutdoor.example"
|
|
102
|
+
account:
|
|
103
|
+
brand:
|
|
104
|
+
domain: "acmeoutdoor.example"
|
|
105
|
+
operator: "pinnacle-agency.example"
|
|
106
|
+
idempotency_key: "pending-creatives-transition-v1"
|
|
107
|
+
start_time: "2026-08-01T00:00:00Z"
|
|
108
|
+
end_time: "2026-08-31T23:59:59Z"
|
|
109
|
+
packages:
|
|
110
|
+
- product_id: "$context.product_id"
|
|
111
|
+
budget: 10000
|
|
112
|
+
pricing_option_id: "$context.pricing_option_id"
|
|
113
|
+
|
|
114
|
+
context:
|
|
115
|
+
correlation_id: "pending_creatives_to_start--create_buy_no_creatives"
|
|
116
|
+
context_outputs:
|
|
117
|
+
- path: "media_buy_id"
|
|
118
|
+
key: "media_buy_id"
|
|
119
|
+
- path: "packages[0].package_id"
|
|
120
|
+
key: "package_id"
|
|
121
|
+
validations:
|
|
122
|
+
- check: response_schema
|
|
123
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
124
|
+
- check: field_present
|
|
125
|
+
path: "media_buy_id"
|
|
126
|
+
description: "Seller assigns a media_buy_id"
|
|
127
|
+
- check: field_value
|
|
128
|
+
path: "status"
|
|
129
|
+
value: "pending_creatives"
|
|
130
|
+
description: "Status is pending_creatives because no creatives supplied"
|
|
131
|
+
- check: field_present
|
|
132
|
+
path: "context"
|
|
133
|
+
description: "Response echoes back the context object"
|
|
134
|
+
- check: field_value
|
|
135
|
+
path: "context.correlation_id"
|
|
136
|
+
value: "pending_creatives_to_start--create_buy_no_creatives"
|
|
137
|
+
description: "Context correlation_id returned unchanged"
|
|
138
|
+
|
|
139
|
+
- id: supply_creatives
|
|
140
|
+
title: "Supply creatives and assign to the package"
|
|
141
|
+
narrative: |
|
|
142
|
+
The buyer syncs a creative with the format the product requires, then updates the
|
|
143
|
+
media buy with creative_assignments so the seller can attach the asset to the
|
|
144
|
+
package and advance state.
|
|
145
|
+
|
|
146
|
+
steps:
|
|
147
|
+
- id: sync_creative
|
|
148
|
+
title: "Sync the creative asset"
|
|
149
|
+
task: sync_creatives
|
|
150
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
151
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
152
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
153
|
+
comply_scenario: creative_lifecycle
|
|
154
|
+
stateful: true
|
|
155
|
+
expected: |
|
|
156
|
+
The seller ingests the creative and returns status active (or approved).
|
|
157
|
+
sample_request:
|
|
158
|
+
account:
|
|
159
|
+
brand:
|
|
160
|
+
domain: "acmeoutdoor.example"
|
|
161
|
+
operator: "pinnacle-agency.example"
|
|
162
|
+
creatives:
|
|
163
|
+
- creative_id: "acme-outdoor-display-q3"
|
|
164
|
+
name: "Acme Outdoor Q3 display"
|
|
165
|
+
format_id: "$context.format_id"
|
|
166
|
+
assets:
|
|
167
|
+
image:
|
|
168
|
+
asset_type: "image"
|
|
169
|
+
url: "https://creative.acmeoutdoor.example/q3/display-300x250.jpg"
|
|
170
|
+
width: 300
|
|
171
|
+
height: 250
|
|
172
|
+
mime_type: "image/jpeg"
|
|
173
|
+
|
|
174
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_pending_creatives_to_start_supply_creatives_sync_creative"
|
|
175
|
+
context:
|
|
176
|
+
correlation_id: "pending_creatives_to_start--sync_creative"
|
|
177
|
+
validations:
|
|
178
|
+
- check: response_schema
|
|
179
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
180
|
+
|
|
181
|
+
- id: assign_creative_to_package
|
|
182
|
+
title: "Assign the creative to the package"
|
|
183
|
+
task: update_media_buy
|
|
184
|
+
schema_ref: "media-buy/update-media-buy-request.json"
|
|
185
|
+
response_schema_ref: "media-buy/update-media-buy-response.json"
|
|
186
|
+
doc_ref: "/media-buy/task-reference/update_media_buy"
|
|
187
|
+
comply_scenario: media_buy_lifecycle
|
|
188
|
+
stateful: true
|
|
189
|
+
expected: |
|
|
190
|
+
The seller acknowledges the assignment and advances the buy state. The response
|
|
191
|
+
status should be pending_start (or active if the flight has started).
|
|
192
|
+
|
|
193
|
+
sample_request:
|
|
194
|
+
account:
|
|
195
|
+
brand:
|
|
196
|
+
domain: "acmeoutdoor.example"
|
|
197
|
+
operator: "pinnacle-agency.example"
|
|
198
|
+
media_buy_id: "$context.media_buy_id"
|
|
199
|
+
packages:
|
|
200
|
+
- package_id: "$context.package_id"
|
|
201
|
+
creative_assignments:
|
|
202
|
+
- creative_id: "acme-outdoor-display-q3"
|
|
203
|
+
|
|
204
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_pending_creatives_to_start_supply_creatives_assign_creative_to_package"
|
|
205
|
+
context:
|
|
206
|
+
correlation_id: "pending_creatives_to_start--assign_creative_to_package"
|
|
207
|
+
validations:
|
|
208
|
+
- check: response_schema
|
|
209
|
+
description: "Response matches update-media-buy-response.json schema"
|
|
210
|
+
- check: field_value
|
|
211
|
+
path: "status"
|
|
212
|
+
allowed_values: ["pending_start", "active"]
|
|
213
|
+
description: "Status advances out of pending_creatives once creatives attached"
|
|
214
|
+
|
|
215
|
+
- id: verify_transition
|
|
216
|
+
title: "Verify the status transition"
|
|
217
|
+
narrative: |
|
|
218
|
+
Independently of the update_media_buy response, call get_media_buys to confirm the
|
|
219
|
+
seller's stored state has advanced. This protects against sellers that return the
|
|
220
|
+
updated status in response but do not persist it.
|
|
221
|
+
|
|
222
|
+
steps:
|
|
223
|
+
- id: get_media_buy_after_sync
|
|
224
|
+
title: "Confirm pending_start after creative sync"
|
|
225
|
+
task: get_media_buys
|
|
226
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
227
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
228
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
229
|
+
comply_scenario: media_buy_lifecycle
|
|
230
|
+
stateful: true
|
|
231
|
+
expected: |
|
|
232
|
+
The media buy's persisted status is pending_start (or active). valid_actions
|
|
233
|
+
no longer includes sync_creatives as a required next step.
|
|
234
|
+
sample_request:
|
|
235
|
+
account:
|
|
236
|
+
brand:
|
|
237
|
+
domain: "acmeoutdoor.example"
|
|
238
|
+
operator: "pinnacle-agency.example"
|
|
239
|
+
media_buy_ids:
|
|
240
|
+
- "$context.media_buy_id"
|
|
241
|
+
|
|
242
|
+
context:
|
|
243
|
+
correlation_id: "pending_creatives_to_start--get_media_buy_after_sync"
|
|
244
|
+
validations:
|
|
245
|
+
- check: response_schema
|
|
246
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
247
|
+
- check: field_value
|
|
248
|
+
path: "media_buys[0].status"
|
|
249
|
+
allowed_values: ["pending_start", "active"]
|
|
250
|
+
description: "Persisted status is past pending_creatives"
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
id: media_buy_seller/proposal_finalize
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller handles proposal refinement and finalize"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies the full proposal lifecycle: brief with proposals, refine a proposal, finalize to committed, and accept via create_media_buy."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
- create_media_buy
|
|
10
|
+
|
|
11
|
+
narrative: |
|
|
12
|
+
Proposals are curated media plans that the seller generates alongside products. The buyer
|
|
13
|
+
reviews proposals, refines them (adjust budget splits, swap products, add constraints),
|
|
14
|
+
and then finalizes a proposal to get firm pricing and an inventory hold. Once committed,
|
|
15
|
+
the buyer accepts the proposal via create_media_buy.
|
|
16
|
+
|
|
17
|
+
The proposal lifecycle is: draft (indicative pricing) -> refine -> finalize (firm pricing,
|
|
18
|
+
inventory hold) -> create_media_buy (accept and go live).
|
|
19
|
+
|
|
20
|
+
This scenario exercises the complete proposal flow including the finalize action, which
|
|
21
|
+
transitions a proposal from draft to committed status with an expires_at hold window.
|
|
22
|
+
|
|
23
|
+
agent:
|
|
24
|
+
interaction_model: media_buy_seller
|
|
25
|
+
capabilities:
|
|
26
|
+
- sells_media
|
|
27
|
+
- accepts_briefs
|
|
28
|
+
- generates_proposals
|
|
29
|
+
examples:
|
|
30
|
+
- "Full-service publisher with proposal engine"
|
|
31
|
+
- "Retail media network with curated packages"
|
|
32
|
+
|
|
33
|
+
caller:
|
|
34
|
+
role: buyer_agent
|
|
35
|
+
example: "Pinnacle Agency (buyer)"
|
|
36
|
+
|
|
37
|
+
prerequisites:
|
|
38
|
+
description: |
|
|
39
|
+
The caller needs a brand identity and operator credentials. The seller must support
|
|
40
|
+
proposal generation (return proposals alongside products in get_products responses).
|
|
41
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
42
|
+
|
|
43
|
+
phases:
|
|
44
|
+
- id: setup
|
|
45
|
+
title: "Account setup"
|
|
46
|
+
steps:
|
|
47
|
+
- id: sync_accounts
|
|
48
|
+
title: "Establish account"
|
|
49
|
+
task: sync_accounts
|
|
50
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
51
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
52
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
53
|
+
stateful: true
|
|
54
|
+
expected: |
|
|
55
|
+
Return the account with account_id and status active.
|
|
56
|
+
|
|
57
|
+
sample_request:
|
|
58
|
+
accounts:
|
|
59
|
+
- brand:
|
|
60
|
+
domain: "acmeoutdoor.example"
|
|
61
|
+
operator: "pinnacle-agency.example"
|
|
62
|
+
billing: "operator"
|
|
63
|
+
payment_terms: "net_30"
|
|
64
|
+
|
|
65
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_setup_sync_accounts"
|
|
66
|
+
validations:
|
|
67
|
+
- check: response_schema
|
|
68
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
69
|
+
- check: field_present
|
|
70
|
+
path: "accounts[0].account_id"
|
|
71
|
+
description: "Account has a platform-assigned ID"
|
|
72
|
+
|
|
73
|
+
- id: brief_with_proposals
|
|
74
|
+
title: "Brief with proposals"
|
|
75
|
+
narrative: |
|
|
76
|
+
Send a brief and receive proposals alongside products. Proposals are curated
|
|
77
|
+
media plans with budget allocations the buyer can review and refine.
|
|
78
|
+
|
|
79
|
+
steps:
|
|
80
|
+
- id: get_products_brief
|
|
81
|
+
title: "Send a brief and receive proposals"
|
|
82
|
+
task: get_products
|
|
83
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
84
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
85
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
86
|
+
comply_scenario: full_sales_flow
|
|
87
|
+
stateful: false
|
|
88
|
+
expected: |
|
|
89
|
+
Return products and proposals matching the brief:
|
|
90
|
+
- products: individual products with pricing and forecasts
|
|
91
|
+
- proposals: curated media plans with proposal_id, budget_allocations, rationale
|
|
92
|
+
|
|
93
|
+
sample_request:
|
|
94
|
+
buying_mode: "brief"
|
|
95
|
+
brief: "Premium video and display across outdoor lifestyle and sports. Q2 flight, $50K budget. Adults 25-54, US and Canada."
|
|
96
|
+
account:
|
|
97
|
+
brand:
|
|
98
|
+
domain: "acmeoutdoor.example"
|
|
99
|
+
operator: "pinnacle-agency.example"
|
|
100
|
+
|
|
101
|
+
validations:
|
|
102
|
+
- check: response_schema
|
|
103
|
+
description: "Response matches get-products-response.json schema"
|
|
104
|
+
- check: field_present
|
|
105
|
+
path: "products"
|
|
106
|
+
description: "Response contains products"
|
|
107
|
+
- check: field_present
|
|
108
|
+
path: "proposals"
|
|
109
|
+
description: "Response contains proposals"
|
|
110
|
+
- check: field_present
|
|
111
|
+
path: "proposals[0].proposal_id"
|
|
112
|
+
description: "Proposals have IDs"
|
|
113
|
+
|
|
114
|
+
- id: refine_proposal
|
|
115
|
+
title: "Refine the proposal"
|
|
116
|
+
narrative: |
|
|
117
|
+
The buyer reviews the proposals and wants to adjust one. They call get_products in
|
|
118
|
+
refine mode targeting a specific proposal_id with changes. The seller applies the
|
|
119
|
+
refinements and returns the updated proposal.
|
|
120
|
+
|
|
121
|
+
steps:
|
|
122
|
+
- id: get_products_refine
|
|
123
|
+
title: "Refine a specific proposal"
|
|
124
|
+
task: get_products
|
|
125
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
126
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
127
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
128
|
+
comply_scenario: full_sales_flow
|
|
129
|
+
stateful: true
|
|
130
|
+
expected: |
|
|
131
|
+
Return the refined proposal:
|
|
132
|
+
- proposals: updated proposal reflecting the requested changes
|
|
133
|
+
- refinement_applied: how each refinement was handled
|
|
134
|
+
- Updated budget allocations, product selections, and forecasts
|
|
135
|
+
|
|
136
|
+
sample_request:
|
|
137
|
+
buying_mode: "refine"
|
|
138
|
+
refine:
|
|
139
|
+
- scope: "proposal"
|
|
140
|
+
proposal_id: "balanced_reach_q2"
|
|
141
|
+
ask: "Shift 60% of budget to CTV. Drop the display product and redistribute that budget to video."
|
|
142
|
+
- scope: "request"
|
|
143
|
+
ask: "All products must support frequency capping at 3 per day."
|
|
144
|
+
account:
|
|
145
|
+
brand:
|
|
146
|
+
domain: "acmeoutdoor.example"
|
|
147
|
+
operator: "pinnacle-agency.example"
|
|
148
|
+
|
|
149
|
+
validations:
|
|
150
|
+
- check: response_schema
|
|
151
|
+
description: "Response matches get-products-response.json schema"
|
|
152
|
+
- check: field_present
|
|
153
|
+
path: "proposals"
|
|
154
|
+
description: "Response contains updated proposals"
|
|
155
|
+
|
|
156
|
+
- id: finalize_proposal
|
|
157
|
+
title: "Finalize the proposal"
|
|
158
|
+
narrative: |
|
|
159
|
+
The buyer is satisfied with the refined proposal and requests finalization. This
|
|
160
|
+
triggers the transition from draft (indicative pricing) to committed (firm pricing
|
|
161
|
+
with inventory hold). The seller may need time to process this — the buyer should
|
|
162
|
+
not set a time_budget to signal willingness to wait.
|
|
163
|
+
|
|
164
|
+
After finalization, the proposal has firm pricing and an expires_at timestamp.
|
|
165
|
+
The buyer must create the media buy before the hold expires.
|
|
166
|
+
|
|
167
|
+
steps:
|
|
168
|
+
- id: get_products_finalize
|
|
169
|
+
title: "Finalize the proposal"
|
|
170
|
+
task: get_products
|
|
171
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
172
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
173
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
174
|
+
comply_scenario: full_sales_flow
|
|
175
|
+
stateful: true
|
|
176
|
+
expected: |
|
|
177
|
+
Return the finalized proposal with committed status:
|
|
178
|
+
- proposals[0].proposal_status: committed
|
|
179
|
+
- proposals[0].expires_at: timestamp for the inventory hold window
|
|
180
|
+
- Firm pricing (not indicative)
|
|
181
|
+
- The proposal is ready to accept via create_media_buy
|
|
182
|
+
|
|
183
|
+
sample_request:
|
|
184
|
+
buying_mode: "refine"
|
|
185
|
+
refine:
|
|
186
|
+
- scope: "proposal"
|
|
187
|
+
proposal_id: "balanced_reach_q2"
|
|
188
|
+
action: "finalize"
|
|
189
|
+
account:
|
|
190
|
+
brand:
|
|
191
|
+
domain: "acmeoutdoor.example"
|
|
192
|
+
operator: "pinnacle-agency.example"
|
|
193
|
+
|
|
194
|
+
validations:
|
|
195
|
+
- check: response_schema
|
|
196
|
+
description: "Response matches get-products-response.json schema"
|
|
197
|
+
- check: field_present
|
|
198
|
+
path: "proposals"
|
|
199
|
+
description: "Response contains the finalized proposal"
|
|
200
|
+
|
|
201
|
+
- id: accept_proposal
|
|
202
|
+
title: "Accept the committed proposal"
|
|
203
|
+
narrative: |
|
|
204
|
+
The buyer accepts the committed proposal by creating a media buy with the
|
|
205
|
+
proposal_id. The seller converts the proposal's product selections and budget
|
|
206
|
+
allocations into active packages.
|
|
207
|
+
|
|
208
|
+
steps:
|
|
209
|
+
- id: create_media_buy
|
|
210
|
+
title: "Create media buy from proposal"
|
|
211
|
+
task: create_media_buy
|
|
212
|
+
schema_ref: "media-buy/create-media-buy-request.json"
|
|
213
|
+
response_schema_ref: "media-buy/create-media-buy-response.json"
|
|
214
|
+
doc_ref: "/media-buy/task-reference/create_media_buy"
|
|
215
|
+
comply_scenario: create_media_buy
|
|
216
|
+
stateful: true
|
|
217
|
+
expected: |
|
|
218
|
+
Convert the committed proposal into an active media buy:
|
|
219
|
+
- media_buy_id: the seller's identifier
|
|
220
|
+
- status: active
|
|
221
|
+
- confirmed_at: timestamp
|
|
222
|
+
- packages: line items derived from the proposal's budget allocations
|
|
223
|
+
- proposal_id: echoed back to confirm which proposal was accepted
|
|
224
|
+
|
|
225
|
+
sample_request:
|
|
226
|
+
brand:
|
|
227
|
+
domain: "acmeoutdoor.example"
|
|
228
|
+
account:
|
|
229
|
+
brand:
|
|
230
|
+
domain: "acmeoutdoor.example"
|
|
231
|
+
operator: "pinnacle-agency.example"
|
|
232
|
+
sandbox: true
|
|
233
|
+
proposal_id: "balanced_reach_q2"
|
|
234
|
+
total_budget:
|
|
235
|
+
amount: 50000
|
|
236
|
+
currency: "USD"
|
|
237
|
+
start_time: "2026-04-01T00:00:00Z"
|
|
238
|
+
end_time: "2026-06-30T23:59:59Z"
|
|
239
|
+
|
|
240
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_proposal_finalize_accept_proposal_create_media_buy"
|
|
241
|
+
validations:
|
|
242
|
+
- check: response_schema
|
|
243
|
+
description: "Response matches create-media-buy-response.json schema"
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
id: media_buy_seller/refine_products
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Seller handles product refinement"
|
|
4
|
+
category: media_buy_seller
|
|
5
|
+
summary: "Verifies that a media buy seller supports buying_mode: refine with product-level and request-level changes."
|
|
6
|
+
track: media_buy
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_products
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
After a buyer receives products from a brief, they refine the results without starting
|
|
12
|
+
over. The buyer calls get_products with buying_mode: refine and a refine array describing
|
|
13
|
+
changes at the request level ("only guaranteed") or product level ("increase this product's
|
|
14
|
+
budget").
|
|
15
|
+
|
|
16
|
+
The seller must apply each refinement, return updated products, and include
|
|
17
|
+
refinement_applied showing how each request was handled. This is the standard negotiation
|
|
18
|
+
loop — brief, review, refine, repeat until satisfied.
|
|
19
|
+
|
|
20
|
+
Every media buy seller that supports negotiation (not just wholesale) must handle
|
|
21
|
+
product-level refinement.
|
|
22
|
+
|
|
23
|
+
agent:
|
|
24
|
+
interaction_model: media_buy_seller
|
|
25
|
+
capabilities:
|
|
26
|
+
- sells_media
|
|
27
|
+
- accepts_briefs
|
|
28
|
+
examples:
|
|
29
|
+
- "Any media buy seller that accepts briefs"
|
|
30
|
+
|
|
31
|
+
caller:
|
|
32
|
+
role: buyer_agent
|
|
33
|
+
example: "Pinnacle Agency (buyer)"
|
|
34
|
+
|
|
35
|
+
prerequisites:
|
|
36
|
+
description: |
|
|
37
|
+
The caller needs a brand identity and operator credentials.
|
|
38
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
39
|
+
|
|
40
|
+
phases:
|
|
41
|
+
- id: setup
|
|
42
|
+
title: "Account setup"
|
|
43
|
+
steps:
|
|
44
|
+
- id: sync_accounts
|
|
45
|
+
title: "Establish account"
|
|
46
|
+
task: sync_accounts
|
|
47
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
48
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
49
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
50
|
+
stateful: true
|
|
51
|
+
expected: |
|
|
52
|
+
Return the account with account_id and status active.
|
|
53
|
+
|
|
54
|
+
sample_request:
|
|
55
|
+
accounts:
|
|
56
|
+
- brand:
|
|
57
|
+
domain: "acmeoutdoor.example"
|
|
58
|
+
operator: "pinnacle-agency.example"
|
|
59
|
+
billing: "operator"
|
|
60
|
+
payment_terms: "net_30"
|
|
61
|
+
|
|
62
|
+
idempotency_key: "$generate:uuid_v4#media_buy_seller_refine_products_setup_sync_accounts"
|
|
63
|
+
validations:
|
|
64
|
+
- check: response_schema
|
|
65
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
66
|
+
- check: field_present
|
|
67
|
+
path: "accounts[0].account_id"
|
|
68
|
+
description: "Account has a platform-assigned ID"
|
|
69
|
+
|
|
70
|
+
- id: brief
|
|
71
|
+
title: "Initial brief"
|
|
72
|
+
narrative: |
|
|
73
|
+
Send a brief to get the initial product set that the buyer will refine.
|
|
74
|
+
|
|
75
|
+
steps:
|
|
76
|
+
- id: get_products_brief
|
|
77
|
+
title: "Send a brief"
|
|
78
|
+
task: get_products
|
|
79
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
80
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
81
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
82
|
+
comply_scenario: full_sales_flow
|
|
83
|
+
stateful: false
|
|
84
|
+
expected: |
|
|
85
|
+
Return products matching the brief. Each product should include product_id,
|
|
86
|
+
delivery_type, pricing_models, and forecast.
|
|
87
|
+
|
|
88
|
+
sample_request:
|
|
89
|
+
buying_mode: "brief"
|
|
90
|
+
brief: "Premium video and display on sports and outdoor lifestyle. Q2 flight, $50K budget. Adults 25-54, US and Canada."
|
|
91
|
+
account:
|
|
92
|
+
brand:
|
|
93
|
+
domain: "acmeoutdoor.example"
|
|
94
|
+
operator: "pinnacle-agency.example"
|
|
95
|
+
|
|
96
|
+
validations:
|
|
97
|
+
- check: response_schema
|
|
98
|
+
description: "Response matches get-products-response.json schema"
|
|
99
|
+
- check: field_present
|
|
100
|
+
path: "products"
|
|
101
|
+
description: "Response contains products"
|
|
102
|
+
- check: field_present
|
|
103
|
+
path: "products[0].product_id"
|
|
104
|
+
description: "Products have IDs"
|
|
105
|
+
|
|
106
|
+
- id: refine
|
|
107
|
+
title: "Refine products"
|
|
108
|
+
narrative: |
|
|
109
|
+
The buyer has reviewed the initial products and wants to narrow down. They call
|
|
110
|
+
get_products with buying_mode: refine and a refine array with request-level and
|
|
111
|
+
product-level changes. The seller applies each refinement and returns the updated
|
|
112
|
+
product set.
|
|
113
|
+
|
|
114
|
+
steps:
|
|
115
|
+
- id: get_products_refine
|
|
116
|
+
title: "Refine with request-level and product-level changes"
|
|
117
|
+
task: get_products
|
|
118
|
+
schema_ref: "media-buy/get-products-request.json"
|
|
119
|
+
response_schema_ref: "media-buy/get-products-response.json"
|
|
120
|
+
doc_ref: "/media-buy/task-reference/get_products"
|
|
121
|
+
comply_scenario: full_sales_flow
|
|
122
|
+
stateful: true
|
|
123
|
+
expected: |
|
|
124
|
+
Return updated products reflecting the refinements:
|
|
125
|
+
- Apply each refinement to the relevant scope (request or product)
|
|
126
|
+
- Include refinement_applied showing how each request was handled
|
|
127
|
+
- Preserve products that weren't targeted by refinements
|
|
128
|
+
- Update pricing and forecasts to reflect the changes
|
|
129
|
+
|
|
130
|
+
sample_request:
|
|
131
|
+
buying_mode: "refine"
|
|
132
|
+
refine:
|
|
133
|
+
- scope: "request"
|
|
134
|
+
ask: "Only guaranteed packages. Must include completion rate SLA above 80%."
|
|
135
|
+
- scope: "product"
|
|
136
|
+
product_id: "sports_preroll_q2"
|
|
137
|
+
ask: "Increase budget allocation to $30K"
|
|
138
|
+
account:
|
|
139
|
+
brand:
|
|
140
|
+
domain: "acmeoutdoor.example"
|
|
141
|
+
operator: "pinnacle-agency.example"
|
|
142
|
+
|
|
143
|
+
validations:
|
|
144
|
+
- check: response_schema
|
|
145
|
+
description: "Response matches get-products-response.json schema"
|
|
146
|
+
- check: field_present
|
|
147
|
+
path: "products"
|
|
148
|
+
description: "Response contains updated products"
|