@adcp/sdk 6.9.0 → 6.10.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/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/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/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,415 @@
|
|
|
1
|
+
id: signal_marketplace
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Marketplace signal agent"
|
|
4
|
+
protocol: signals
|
|
5
|
+
category: signal_marketplace
|
|
6
|
+
summary: "Signal agent that resells third-party data provider signals with verifiable catalog provenance."
|
|
7
|
+
track: signals
|
|
8
|
+
required_tools:
|
|
9
|
+
- get_signals
|
|
10
|
+
requires_scenarios:
|
|
11
|
+
- signal_marketplace/governance_denied
|
|
12
|
+
|
|
13
|
+
narrative: |
|
|
14
|
+
You operate a signal marketplace — an intermediary that aggregates audience data from
|
|
15
|
+
multiple third-party providers and makes it available to buyers through a single interface.
|
|
16
|
+
Think LiveRamp Data Marketplace, Oracle Data Cloud, or Lotame.
|
|
17
|
+
|
|
18
|
+
Your agent searches across catalogs published by data providers in their adagents.json
|
|
19
|
+
files. Buyers discover signals through natural language queries, verify provenance by
|
|
20
|
+
checking the data provider's catalog directly, and activate signals on DSPs or sales
|
|
21
|
+
agents for campaign targeting.
|
|
22
|
+
|
|
23
|
+
The key property of marketplace signals: provenance is independently verifiable. Each
|
|
24
|
+
signal traces back to a data_provider_domain whose adagents.json lists your agent as
|
|
25
|
+
authorized. Buyers can (and should) verify this before spending.
|
|
26
|
+
|
|
27
|
+
This storyboard walks through discovery, verification, and both activation patterns —
|
|
28
|
+
activating directly on a DSP (buyer manages targeting) and activating on a sales agent
|
|
29
|
+
(SA handles downstream coordination).
|
|
30
|
+
|
|
31
|
+
Pricing is hard-required for signal marketplaces. Signals are rate-carded goods by
|
|
32
|
+
definition — the value exchange is paying for access to audience data. Unlike creative
|
|
33
|
+
ad servers (where billing can be handled via out-of-band enterprise contracts), a signal
|
|
34
|
+
marketplace without pricing_options is either non-commercial or misconfigured; buyers
|
|
35
|
+
cannot activate without a pricing_option_id to anchor billing.
|
|
36
|
+
|
|
37
|
+
agent:
|
|
38
|
+
interaction_model: marketplace_catalog
|
|
39
|
+
capabilities:
|
|
40
|
+
- catalog_signals
|
|
41
|
+
examples:
|
|
42
|
+
- "LiveRamp Data Marketplace"
|
|
43
|
+
- "Oracle Data Cloud"
|
|
44
|
+
- "Lotame"
|
|
45
|
+
|
|
46
|
+
caller:
|
|
47
|
+
role: buyer_agent
|
|
48
|
+
example: "Pinnacle Agency (buyer)"
|
|
49
|
+
|
|
50
|
+
prerequisites:
|
|
51
|
+
description: |
|
|
52
|
+
The buyer has a campaign brief with targeting objectives. The test kit provides
|
|
53
|
+
sample signal definitions, pricing options, and destination configurations that
|
|
54
|
+
match the training agent's signal providers.
|
|
55
|
+
test_kit: "test-kits/nova-motors.yaml"
|
|
56
|
+
|
|
57
|
+
phases:
|
|
58
|
+
- id: capability_discovery
|
|
59
|
+
title: "Capability discovery"
|
|
60
|
+
narrative: |
|
|
61
|
+
The buyer calls get_adcp_capabilities to confirm the agent supports signals before discovering or activating audience data.
|
|
62
|
+
|
|
63
|
+
steps:
|
|
64
|
+
- id: get_capabilities
|
|
65
|
+
title: "Check agent capabilities"
|
|
66
|
+
narrative: |
|
|
67
|
+
Verify that the agent declares the expected protocol support before
|
|
68
|
+
proceeding with domain-specific operations.
|
|
69
|
+
task: get_adcp_capabilities
|
|
70
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
71
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
72
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
73
|
+
comply_scenario: capability_discovery
|
|
74
|
+
stateful: false
|
|
75
|
+
expected: |
|
|
76
|
+
Return capabilities declaring signals in supported_protocols, confirming the agent serves audience signals.
|
|
77
|
+
sample_request:
|
|
78
|
+
context:
|
|
79
|
+
correlation_id: "signal_marketplace--get_capabilities"
|
|
80
|
+
validations:
|
|
81
|
+
- check: response_schema
|
|
82
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
83
|
+
- check: field_present
|
|
84
|
+
path: "supported_protocols"
|
|
85
|
+
description: "Agent declares supported protocols"
|
|
86
|
+
|
|
87
|
+
- check: field_present
|
|
88
|
+
path: "context"
|
|
89
|
+
description: "Response echoes back the context object"
|
|
90
|
+
- check: field_value
|
|
91
|
+
path: "context.correlation_id"
|
|
92
|
+
value: "signal_marketplace--get_capabilities"
|
|
93
|
+
description: "Context correlation_id returned unchanged"
|
|
94
|
+
- id: discovery
|
|
95
|
+
title: "Signal discovery"
|
|
96
|
+
narrative: |
|
|
97
|
+
The buyer describes what they need in natural language. Your agent searches
|
|
98
|
+
across all authorized data provider catalogs and returns matching signals with
|
|
99
|
+
pricing, coverage estimates, and value types.
|
|
100
|
+
|
|
101
|
+
This is where marketplace agents earn their keep — the buyer doesn't need to
|
|
102
|
+
know which providers exist or what taxonomies they use. One query, many sources.
|
|
103
|
+
|
|
104
|
+
steps:
|
|
105
|
+
- id: search_by_spec
|
|
106
|
+
title: "Discover signals from a campaign brief"
|
|
107
|
+
narrative: |
|
|
108
|
+
The buyer's platform translates a campaign brief into a get_signals call.
|
|
109
|
+
Your agent searches catalogs from every authorized data provider and returns
|
|
110
|
+
what matches — automotive intent from one provider, geo data from another,
|
|
111
|
+
retail purchase history from a third.
|
|
112
|
+
task: get_signals
|
|
113
|
+
schema_ref: "signals/get-signals-request.json"
|
|
114
|
+
response_schema_ref: "signals/get-signals-response.json"
|
|
115
|
+
doc_ref: "/signals/tasks/get_signals"
|
|
116
|
+
comply_scenario: signals_flow
|
|
117
|
+
stateful: false
|
|
118
|
+
expected: |
|
|
119
|
+
Return matching signals from multiple data providers. Each signal must include:
|
|
120
|
+
- signal_agent_segment_id for activation
|
|
121
|
+
- signal_id with source, data_provider_domain, and id
|
|
122
|
+
- name, description, and value_type (binary, categorical, or numeric)
|
|
123
|
+
- coverage_percentage (audience reach estimate)
|
|
124
|
+
- pricing_options with at least one pricing model
|
|
125
|
+
- signal_type: "marketplace"
|
|
126
|
+
|
|
127
|
+
sample_request:
|
|
128
|
+
account:
|
|
129
|
+
brand:
|
|
130
|
+
domain: "novamotors.example"
|
|
131
|
+
operator: "pinnacle-agency.example"
|
|
132
|
+
signal_spec: "In-market EV buyers with high purchase propensity, near auto dealerships"
|
|
133
|
+
|
|
134
|
+
context:
|
|
135
|
+
correlation_id: "signal_marketplace--search_by_spec"
|
|
136
|
+
|
|
137
|
+
context_outputs:
|
|
138
|
+
- name: first_signal_id
|
|
139
|
+
path: "signals[0].signal_id"
|
|
140
|
+
- name: first_signal_agent_segment_id
|
|
141
|
+
path: "signals[0].signal_agent_segment_id"
|
|
142
|
+
- name: first_signal_pricing_option_id
|
|
143
|
+
path: "signals[0].pricing_options[0].pricing_option_id"
|
|
144
|
+
- name: second_signal_id
|
|
145
|
+
path: "signals[1].signal_id"
|
|
146
|
+
validations:
|
|
147
|
+
- check: response_schema
|
|
148
|
+
description: "Response matches get-signals-response.json schema"
|
|
149
|
+
- check: field_present
|
|
150
|
+
path: "signals[0].signal_agent_segment_id"
|
|
151
|
+
description: "Each signal has a signal_agent_segment_id"
|
|
152
|
+
- check: field_present
|
|
153
|
+
path: "signals[0].signal_id.data_provider_domain"
|
|
154
|
+
description: "Each signal traces to a data provider domain"
|
|
155
|
+
- check: field_present
|
|
156
|
+
path: "signals[0].pricing_options"
|
|
157
|
+
description: "Each signal has pricing options"
|
|
158
|
+
- check: field_present
|
|
159
|
+
path: "signals[0].coverage_percentage"
|
|
160
|
+
description: "Each signal has a coverage estimate"
|
|
161
|
+
|
|
162
|
+
- check: field_present
|
|
163
|
+
path: "context"
|
|
164
|
+
description: "Response echoes back the context object"
|
|
165
|
+
- check: field_value
|
|
166
|
+
path: "context.correlation_id"
|
|
167
|
+
value: "signal_marketplace--search_by_spec"
|
|
168
|
+
description: "Context correlation_id returned unchanged"
|
|
169
|
+
- check: field_present
|
|
170
|
+
path: "signals[0].signal_id.source"
|
|
171
|
+
description: "Signal ID includes source discriminator"
|
|
172
|
+
- check: field_present
|
|
173
|
+
path: "signals[0].signal_id.data_provider_domain"
|
|
174
|
+
description: "Signal ID includes data_provider_domain for provenance"
|
|
175
|
+
- id: search_by_ids
|
|
176
|
+
title: "Look up specific signals by ID"
|
|
177
|
+
narrative: |
|
|
178
|
+
The buyer already knows which signals they want — discovered in the prior
|
|
179
|
+
step. They pass signal_ids directly instead of a natural language query.
|
|
180
|
+
task: get_signals
|
|
181
|
+
schema_ref: "signals/get-signals-request.json"
|
|
182
|
+
response_schema_ref: "signals/get-signals-response.json"
|
|
183
|
+
doc_ref: "/signals/tasks/get_signals"
|
|
184
|
+
comply_scenario: signals_flow
|
|
185
|
+
stateful: true
|
|
186
|
+
expected: |
|
|
187
|
+
Return the exact signals requested, with full metadata and pricing.
|
|
188
|
+
If a signal_id doesn't exist, omit it from results — don't error.
|
|
189
|
+
|
|
190
|
+
sample_request:
|
|
191
|
+
account:
|
|
192
|
+
brand:
|
|
193
|
+
domain: "novamotors.example"
|
|
194
|
+
operator: "pinnacle-agency.example"
|
|
195
|
+
signal_ids:
|
|
196
|
+
- "$context.first_signal_id"
|
|
197
|
+
|
|
198
|
+
context:
|
|
199
|
+
correlation_id: "signal_marketplace--search_by_ids"
|
|
200
|
+
validations:
|
|
201
|
+
- check: response_schema
|
|
202
|
+
description: "Response matches schema"
|
|
203
|
+
- check: field_present
|
|
204
|
+
path: "signals"
|
|
205
|
+
description: "Response contains a signals array"
|
|
206
|
+
|
|
207
|
+
- check: field_present
|
|
208
|
+
path: "context"
|
|
209
|
+
description: "Response echoes back the context object"
|
|
210
|
+
- check: field_value
|
|
211
|
+
path: "context.correlation_id"
|
|
212
|
+
value: "signal_marketplace--search_by_ids"
|
|
213
|
+
description: "Context correlation_id returned unchanged"
|
|
214
|
+
- id: verification
|
|
215
|
+
title: "Catalog verification"
|
|
216
|
+
narrative: |
|
|
217
|
+
Before activating third-party data, the buyer verifies provenance. They fetch
|
|
218
|
+
the data provider's adagents.json directly and confirm the signal exists and
|
|
219
|
+
your agent is authorized. This independent check is outside the AdCP protocol —
|
|
220
|
+
but your agent must return the metadata that makes it possible.
|
|
221
|
+
|
|
222
|
+
This phase tests that your get_signals responses include verifiable provenance
|
|
223
|
+
data: signal_id.source is "catalog" and signal_id.data_provider_domain points
|
|
224
|
+
to a real domain whose adagents.json the buyer can fetch independently.
|
|
225
|
+
|
|
226
|
+
steps:
|
|
227
|
+
- id: verify_provenance_metadata
|
|
228
|
+
title: "Confirm signals carry verifiable provenance"
|
|
229
|
+
narrative: |
|
|
230
|
+
The buyer looks up a specific signal by ID (discovered earlier) and checks
|
|
231
|
+
that the response includes the metadata needed for independent verification —
|
|
232
|
+
source is "catalog" and data_provider_domain points to a fetchable adagents.json.
|
|
233
|
+
The actual HTTP fetch of adagents.json is the buyer's responsibility, but
|
|
234
|
+
your agent must provide the domain to fetch from.
|
|
235
|
+
task: get_signals
|
|
236
|
+
schema_ref: "signals/get-signals-request.json"
|
|
237
|
+
response_schema_ref: "signals/get-signals-response.json"
|
|
238
|
+
doc_ref: "/signals/data-providers"
|
|
239
|
+
comply_scenario: signals_flow
|
|
240
|
+
stateful: true
|
|
241
|
+
expected: |
|
|
242
|
+
Return the requested signal with verifiable provenance metadata:
|
|
243
|
+
- signal_id.source is "catalog"
|
|
244
|
+
- signal_id.data_provider_domain matches a real domain
|
|
245
|
+
The buyer will independently fetch that domain's adagents.json to confirm
|
|
246
|
+
your agent is listed in authorized_agents.
|
|
247
|
+
|
|
248
|
+
sample_request:
|
|
249
|
+
account:
|
|
250
|
+
brand:
|
|
251
|
+
domain: "novamotors.example"
|
|
252
|
+
operator: "pinnacle-agency.example"
|
|
253
|
+
signal_ids:
|
|
254
|
+
- "$context.first_signal_id"
|
|
255
|
+
|
|
256
|
+
context:
|
|
257
|
+
correlation_id: "signal_marketplace--verify_provenance_metadata"
|
|
258
|
+
validations:
|
|
259
|
+
- check: field_value
|
|
260
|
+
path: "signals[0].signal_id.source"
|
|
261
|
+
value: "catalog"
|
|
262
|
+
description: "Signal source is 'catalog' (verifiable via adagents.json)"
|
|
263
|
+
- check: field_present
|
|
264
|
+
path: "signals[0].signal_id.data_provider_domain"
|
|
265
|
+
description: "Data provider domain is present for independent verification"
|
|
266
|
+
|
|
267
|
+
- check: field_present
|
|
268
|
+
path: "context"
|
|
269
|
+
description: "Response echoes back the context object"
|
|
270
|
+
- check: field_value
|
|
271
|
+
path: "context.correlation_id"
|
|
272
|
+
value: "signal_marketplace--verify_provenance_metadata"
|
|
273
|
+
description: "Context correlation_id returned unchanged"
|
|
274
|
+
- id: platform_activation
|
|
275
|
+
title: "Activate on a DSP"
|
|
276
|
+
narrative: |
|
|
277
|
+
The buyer activates a signal directly on a DSP platform. The signal agent pushes
|
|
278
|
+
segment data to the platform, and the buyer gets back a segment_id they can
|
|
279
|
+
reference when configuring campaign targeting.
|
|
280
|
+
|
|
281
|
+
Use platform destinations when the buyer is managing DSP campaigns directly —
|
|
282
|
+
not through a sales agent.
|
|
283
|
+
|
|
284
|
+
steps:
|
|
285
|
+
- id: activate_on_platform
|
|
286
|
+
title: "Activate signal on a DSP"
|
|
287
|
+
narrative: |
|
|
288
|
+
The buyer selects a signal and a DSP destination. The signal agent pushes
|
|
289
|
+
the segment to the platform. This is typically asynchronous — the initial
|
|
290
|
+
response shows is_live: false with an estimated duration, and the buyer
|
|
291
|
+
polls for completion.
|
|
292
|
+
task: activate_signal
|
|
293
|
+
schema_ref: "signals/activate-signal-request.json"
|
|
294
|
+
response_schema_ref: "signals/activate-signal-response.json"
|
|
295
|
+
doc_ref: "/signals/tasks/activate_signal"
|
|
296
|
+
comply_scenario: signals_flow
|
|
297
|
+
stateful: true
|
|
298
|
+
expected: |
|
|
299
|
+
Return a deployment with:
|
|
300
|
+
- type: "platform" matching the requested destination
|
|
301
|
+
- is_live: false initially (async activation)
|
|
302
|
+
- estimated_activation_duration_minutes
|
|
303
|
+
After polling, the deployment should show:
|
|
304
|
+
- is_live: true
|
|
305
|
+
- activation_key with type: "segment_id" and a platform-native segment ID
|
|
306
|
+
- deployed_at timestamp
|
|
307
|
+
|
|
308
|
+
sample_request:
|
|
309
|
+
account:
|
|
310
|
+
brand:
|
|
311
|
+
domain: "novamotors.example"
|
|
312
|
+
operator: "pinnacle-agency.example"
|
|
313
|
+
signal_agent_segment_id: "$context.first_signal_agent_segment_id"
|
|
314
|
+
pricing_option_id: "$context.first_signal_pricing_option_id"
|
|
315
|
+
destinations:
|
|
316
|
+
- type: "platform"
|
|
317
|
+
platform: "the-trade-desk"
|
|
318
|
+
account: "agency-123-ttd"
|
|
319
|
+
idempotency_key: "$generate:uuid_v4#signal_marketplace_activate_platform"
|
|
320
|
+
context:
|
|
321
|
+
correlation_id: "signal_marketplace--activate_on_platform"
|
|
322
|
+
ext:
|
|
323
|
+
test_platform:
|
|
324
|
+
test_run: true
|
|
325
|
+
validations:
|
|
326
|
+
- check: response_schema
|
|
327
|
+
description: "Response matches activate-signal-response.json schema"
|
|
328
|
+
- check: field_present
|
|
329
|
+
path: "deployments[0].type"
|
|
330
|
+
description: "Deployment includes type"
|
|
331
|
+
- check: field_value
|
|
332
|
+
path: "deployments[0].type"
|
|
333
|
+
value: "platform"
|
|
334
|
+
description: "Deployment type is 'platform'"
|
|
335
|
+
|
|
336
|
+
- check: field_present
|
|
337
|
+
path: "context"
|
|
338
|
+
description: "Response echoes back the context object"
|
|
339
|
+
- check: field_value
|
|
340
|
+
path: "context.correlation_id"
|
|
341
|
+
value: "signal_marketplace--activate_on_platform"
|
|
342
|
+
description: "Context correlation_id returned unchanged"
|
|
343
|
+
- check: field_present
|
|
344
|
+
path: "deployments[0].activation_key"
|
|
345
|
+
description: "Deployment includes activation_key for targeting"
|
|
346
|
+
- id: agent_activation
|
|
347
|
+
title: "Activate on a sales agent"
|
|
348
|
+
narrative: |
|
|
349
|
+
The buyer activates a signal on a sales agent instead of a DSP. This is the
|
|
350
|
+
right pattern when the buyer is purchasing media through the SA — the SA handles
|
|
351
|
+
its own DSP coordination.
|
|
352
|
+
|
|
353
|
+
The buyer doesn't need to know which DSP the SA uses. The activation key confirms
|
|
354
|
+
the signal is live on the SA, and the SA applies targeting when fulfilling media
|
|
355
|
+
buys through create_media_buy.
|
|
356
|
+
|
|
357
|
+
steps:
|
|
358
|
+
- id: activate_on_agent
|
|
359
|
+
title: "Activate signal on a sales agent"
|
|
360
|
+
narrative: |
|
|
361
|
+
The buyer activates a signal with the sales agent's URL as the destination.
|
|
362
|
+
Agent activations are typically synchronous — the SA records the activation
|
|
363
|
+
immediately and returns a key_value activation key.
|
|
364
|
+
task: activate_signal
|
|
365
|
+
schema_ref: "signals/activate-signal-request.json"
|
|
366
|
+
response_schema_ref: "signals/activate-signal-response.json"
|
|
367
|
+
doc_ref: "/signals/tasks/activate_signal"
|
|
368
|
+
comply_scenario: signals_flow
|
|
369
|
+
stateful: true
|
|
370
|
+
expected: |
|
|
371
|
+
Return a deployment with:
|
|
372
|
+
- type: "agent" matching the requested destination
|
|
373
|
+
- agent_url matching the SA's URL
|
|
374
|
+
- is_live: true (sync activation)
|
|
375
|
+
- activation_key with type: "key_value"
|
|
376
|
+
- deployed_at timestamp
|
|
377
|
+
|
|
378
|
+
The SA records the activation internally. When the buyer later calls
|
|
379
|
+
create_media_buy through this SA, signal-based targeting is already
|
|
380
|
+
in place.
|
|
381
|
+
|
|
382
|
+
sample_request:
|
|
383
|
+
account:
|
|
384
|
+
brand:
|
|
385
|
+
domain: "novamotors.example"
|
|
386
|
+
operator: "pinnacle-agency.example"
|
|
387
|
+
signal_agent_segment_id: "$context.first_signal_agent_segment_id"
|
|
388
|
+
pricing_option_id: "$context.first_signal_pricing_option_id"
|
|
389
|
+
destinations:
|
|
390
|
+
- type: "agent"
|
|
391
|
+
agent_url: "https://wonderstruck.salesagents.example"
|
|
392
|
+
idempotency_key: "$generate:uuid_v4#signal_marketplace_activate_agent"
|
|
393
|
+
context:
|
|
394
|
+
correlation_id: "signal_marketplace--activate_on_agent"
|
|
395
|
+
ext:
|
|
396
|
+
test_platform:
|
|
397
|
+
test_run: true
|
|
398
|
+
validations:
|
|
399
|
+
- check: response_schema
|
|
400
|
+
description: "Response matches activate-signal-response.json schema"
|
|
401
|
+
- check: field_present
|
|
402
|
+
path: "deployments[0].activation_key"
|
|
403
|
+
description: "Deployment includes activation key"
|
|
404
|
+
- check: field_value
|
|
405
|
+
path: "deployments[0].type"
|
|
406
|
+
value: "agent"
|
|
407
|
+
description: "Deployment type is 'agent'"
|
|
408
|
+
|
|
409
|
+
- check: field_present
|
|
410
|
+
path: "context"
|
|
411
|
+
description: "Response echoes back the context object"
|
|
412
|
+
- check: field_value
|
|
413
|
+
path: "context.correlation_id"
|
|
414
|
+
value: "signal_marketplace--activate_on_agent"
|
|
415
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
id: signal_marketplace/governance_denied
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Signal agent rejects activation when governance denies"
|
|
4
|
+
category: signal_marketplace
|
|
5
|
+
summary: "Verifies that a signal agent propagates GOVERNANCE_DENIED when the buyer's governance plan denies activation."
|
|
6
|
+
track: signals
|
|
7
|
+
required_tools:
|
|
8
|
+
- sync_governance
|
|
9
|
+
- get_signals
|
|
10
|
+
- activate_signal
|
|
11
|
+
|
|
12
|
+
narrative: |
|
|
13
|
+
Signal activation is a spending event: activating a third-party segment costs per-user
|
|
14
|
+
or per-activation fees that must be authorized against the buyer's governance plan. The
|
|
15
|
+
signal agent must consult the registered governance agent before activation and deny
|
|
16
|
+
the request when governance returns denied.
|
|
17
|
+
|
|
18
|
+
This scenario sets up a strict $100 plan, registers that governance with the signal
|
|
19
|
+
agent via sync_governance, then attempts to activate a signal whose pricing exceeds
|
|
20
|
+
the plan. The signal agent must return GOVERNANCE_DENIED with findings propagated
|
|
21
|
+
from the governance agent.
|
|
22
|
+
|
|
23
|
+
By default, the governance agent is the training agent at test-agent.adcontextprotocol.org.
|
|
24
|
+
Override with --governance-agent-url to use a custom governance agent.
|
|
25
|
+
|
|
26
|
+
agent:
|
|
27
|
+
interaction_model: marketplace_catalog
|
|
28
|
+
capabilities:
|
|
29
|
+
- catalog_signals
|
|
30
|
+
- governance_aware
|
|
31
|
+
examples:
|
|
32
|
+
- "Any signal agent that honors governance before activation"
|
|
33
|
+
|
|
34
|
+
caller:
|
|
35
|
+
role: buyer_agent
|
|
36
|
+
example: "Pinnacle Agency (buyer)"
|
|
37
|
+
|
|
38
|
+
prerequisites:
|
|
39
|
+
description: |
|
|
40
|
+
A governance agent that supports sync_plans and check_governance, and a signal
|
|
41
|
+
agent that supports sync_governance + activate_signal.
|
|
42
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
43
|
+
|
|
44
|
+
phases:
|
|
45
|
+
- id: governance_plan_setup
|
|
46
|
+
title: "Set up strict governance plan"
|
|
47
|
+
narrative: |
|
|
48
|
+
Create a governance plan with a $100 budget — enough to block even a single
|
|
49
|
+
activation at typical CPM-for-segment pricing.
|
|
50
|
+
|
|
51
|
+
steps:
|
|
52
|
+
- id: sync_plans
|
|
53
|
+
title: "Create strict governance plan"
|
|
54
|
+
task: sync_plans
|
|
55
|
+
schema_ref: "governance/sync-plans-request.json"
|
|
56
|
+
response_schema_ref: "governance/sync-plans-response.json"
|
|
57
|
+
doc_ref: "/governance/campaign/tasks/sync_plans"
|
|
58
|
+
stateful: true
|
|
59
|
+
expected: |
|
|
60
|
+
The governance agent acknowledges the plan.
|
|
61
|
+
sample_request:
|
|
62
|
+
plans:
|
|
63
|
+
- plan_id: "comply-signal-gov-denied"
|
|
64
|
+
brand:
|
|
65
|
+
domain: "acmeoutdoor.example"
|
|
66
|
+
objectives: "Restricted plan — signals activation test"
|
|
67
|
+
budget:
|
|
68
|
+
total: 100
|
|
69
|
+
currency: "USD"
|
|
70
|
+
reallocation_threshold: 50
|
|
71
|
+
flight:
|
|
72
|
+
start: "2026-04-01T00:00:00Z"
|
|
73
|
+
end: "2026-06-30T23:59:59Z"
|
|
74
|
+
countries: ["US"]
|
|
75
|
+
idempotency_key: "$generate:uuid_v4#signal_marketplace_governance_denied_governance_plan_setup_sync_plans"
|
|
76
|
+
validations:
|
|
77
|
+
- check: response_schema
|
|
78
|
+
description: "Response matches sync-plans-response.json schema"
|
|
79
|
+
|
|
80
|
+
- id: signal_agent_setup
|
|
81
|
+
title: "Register account and governance with the signal agent"
|
|
82
|
+
steps:
|
|
83
|
+
- id: sync_accounts
|
|
84
|
+
title: "Establish account with signal agent"
|
|
85
|
+
task: sync_accounts
|
|
86
|
+
schema_ref: "account/sync-accounts-request.json"
|
|
87
|
+
response_schema_ref: "account/sync-accounts-response.json"
|
|
88
|
+
doc_ref: "/accounts/tasks/sync_accounts"
|
|
89
|
+
stateful: true
|
|
90
|
+
expected: |
|
|
91
|
+
Signal agent returns the account with account_id active.
|
|
92
|
+
sample_request:
|
|
93
|
+
accounts:
|
|
94
|
+
- brand:
|
|
95
|
+
domain: "acmeoutdoor.example"
|
|
96
|
+
operator: "pinnacle-agency.example"
|
|
97
|
+
billing: "operator"
|
|
98
|
+
payment_terms: "net_30"
|
|
99
|
+
idempotency_key: "$generate:uuid_v4#signal_marketplace_governance_denied_signal_agent_setup_sync_accounts"
|
|
100
|
+
validations:
|
|
101
|
+
- check: response_schema
|
|
102
|
+
description: "Response matches sync-accounts-response.json schema"
|
|
103
|
+
- check: field_present
|
|
104
|
+
path: "accounts[0].account_id"
|
|
105
|
+
description: "Account has a platform-assigned ID"
|
|
106
|
+
|
|
107
|
+
- id: sync_governance
|
|
108
|
+
title: "Register governance agent with signal agent"
|
|
109
|
+
task: sync_governance
|
|
110
|
+
schema_ref: "account/sync-governance-request.json"
|
|
111
|
+
response_schema_ref: "account/sync-governance-response.json"
|
|
112
|
+
doc_ref: "/accounts/tasks/sync_governance"
|
|
113
|
+
stateful: true
|
|
114
|
+
expected: |
|
|
115
|
+
Signal agent acknowledges governance registration.
|
|
116
|
+
sample_request:
|
|
117
|
+
accounts:
|
|
118
|
+
- account:
|
|
119
|
+
brand:
|
|
120
|
+
domain: "acmeoutdoor.example"
|
|
121
|
+
operator: "pinnacle-agency.example"
|
|
122
|
+
governance_agents:
|
|
123
|
+
- url: "$context.governance_agent_url"
|
|
124
|
+
authentication:
|
|
125
|
+
schemes: ["Bearer"]
|
|
126
|
+
credentials: "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
127
|
+
categories: ["budget_authority"]
|
|
128
|
+
idempotency_key: "$generate:uuid_v4#signal_marketplace_governance_denied_signal_agent_setup_sync_governance"
|
|
129
|
+
validations:
|
|
130
|
+
- check: response_schema
|
|
131
|
+
description: "Response matches sync-governance-response.json schema"
|
|
132
|
+
|
|
133
|
+
- id: activation_denied
|
|
134
|
+
title: "Attempt activation — governance denies"
|
|
135
|
+
steps:
|
|
136
|
+
- id: get_signals_list
|
|
137
|
+
title: "Discover a signal to activate"
|
|
138
|
+
task: get_signals
|
|
139
|
+
schema_ref: "signals/get-signals-request.json"
|
|
140
|
+
response_schema_ref: "signals/get-signals-response.json"
|
|
141
|
+
doc_ref: "/signals/task-reference/get_signals"
|
|
142
|
+
comply_scenario: signal_discovery
|
|
143
|
+
stateful: false
|
|
144
|
+
expected: |
|
|
145
|
+
Return at least one signal with a signal_agent_segment_id and pricing.
|
|
146
|
+
sample_request:
|
|
147
|
+
signal_spec: "outdoor enthusiasts, age 25-54, US"
|
|
148
|
+
account:
|
|
149
|
+
brand:
|
|
150
|
+
domain: "acmeoutdoor.example"
|
|
151
|
+
operator: "pinnacle-agency.example"
|
|
152
|
+
context_outputs:
|
|
153
|
+
- path: "signals[0].signal_agent_segment_id"
|
|
154
|
+
key: "signal_agent_segment_id"
|
|
155
|
+
validations:
|
|
156
|
+
- check: response_schema
|
|
157
|
+
description: "Response matches get-signals-response.json schema"
|
|
158
|
+
- check: field_present
|
|
159
|
+
path: "signals[0].signal_agent_segment_id"
|
|
160
|
+
description: "Signal has an activation identifier"
|
|
161
|
+
|
|
162
|
+
- id: activate_signal_denied
|
|
163
|
+
title: "activate_signal — governance denies"
|
|
164
|
+
task: activate_signal
|
|
165
|
+
schema_ref: "signals/activate-signal-request.json"
|
|
166
|
+
response_schema_ref: "signals/activate-signal-response.json"
|
|
167
|
+
doc_ref: "/signals/task-reference/activate_signal"
|
|
168
|
+
comply_scenario: signal_activation
|
|
169
|
+
expect_error: true
|
|
170
|
+
negative_path: payload_well_formed
|
|
171
|
+
stateful: true
|
|
172
|
+
expected: |
|
|
173
|
+
Signal agent rejects with:
|
|
174
|
+
- code: GOVERNANCE_DENIED
|
|
175
|
+
- findings propagated from the governance agent
|
|
176
|
+
|
|
177
|
+
sample_request:
|
|
178
|
+
signal_agent_segment_id: "$context.signal_agent_segment_id"
|
|
179
|
+
destinations:
|
|
180
|
+
- type: "platform"
|
|
181
|
+
platform: "the-trade-desk"
|
|
182
|
+
account: "acmeoutdoor-ttd-seat"
|
|
183
|
+
account:
|
|
184
|
+
brand:
|
|
185
|
+
domain: "acmeoutdoor.example"
|
|
186
|
+
operator: "pinnacle-agency.example"
|
|
187
|
+
idempotency_key: "signal-gov-denied-v1"
|
|
188
|
+
|
|
189
|
+
context:
|
|
190
|
+
correlation_id: "signal_marketplace--governance_denied--activate"
|
|
191
|
+
sample_response:
|
|
192
|
+
errors:
|
|
193
|
+
- code: "GOVERNANCE_DENIED"
|
|
194
|
+
message: "Signal activation requires governance approval. Call check_governance first — a governance plan is registered for this account."
|
|
195
|
+
details:
|
|
196
|
+
findings:
|
|
197
|
+
- category_id: "budget_authority"
|
|
198
|
+
severity: "critical"
|
|
199
|
+
explanation: "Signal activation requires governance approval. Call check_governance first — a governance plan is registered for this account."
|
|
200
|
+
plan_id: "comply-signal-gov-denied"
|
|
201
|
+
validations:
|
|
202
|
+
- check: error_code
|
|
203
|
+
value: "GOVERNANCE_DENIED"
|
|
204
|
+
description: "Error code is GOVERNANCE_DENIED"
|
|
205
|
+
- check: field_present
|
|
206
|
+
path: "context"
|
|
207
|
+
description: "Response echoes back the context object even on errors"
|