@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,307 @@
|
|
|
1
|
+
# Fictional Entities for AdCP Storyboards & Training
|
|
2
|
+
#
|
|
3
|
+
# Canonical source: specs/character-bible.md at docs.adcontextprotocol.org
|
|
4
|
+
#
|
|
5
|
+
# This file mirrors the character bible's fictional companies for use in
|
|
6
|
+
# storyboards, test kits, and client-side testing. All entities use the
|
|
7
|
+
# IANA-reserved .example TLD.
|
|
8
|
+
#
|
|
9
|
+
# Rules:
|
|
10
|
+
# - Every fictional company MUST match the character bible
|
|
11
|
+
# - Do not invent new entities here — add them to the bible first
|
|
12
|
+
# - Test kits in test-kits/ expand on entities with full brand identity,
|
|
13
|
+
# sample assets, and signal definitions
|
|
14
|
+
# - Sandbox brands (advertisers) are resolvable via AgenticAdvertising.org
|
|
15
|
+
# because the registry imports getSandboxEntities() from @adcp/client
|
|
16
|
+
# directly — no seeding needed, these files are the single source of truth
|
|
17
|
+
#
|
|
18
|
+
# Adding a new entity:
|
|
19
|
+
# 1. Add it to specs/character-bible.md in the adcp docs repo
|
|
20
|
+
# 2. Mirror it here with domain and role
|
|
21
|
+
# 3. If it's an advertiser, create a test kit in test-kits/ with sandbox: true
|
|
22
|
+
# 4. Reference by id in storyboards
|
|
23
|
+
|
|
24
|
+
# ============================================================
|
|
25
|
+
# ADVERTISERS — brands that buy media through the protocol
|
|
26
|
+
# ============================================================
|
|
27
|
+
|
|
28
|
+
advertisers:
|
|
29
|
+
- id: acme_outdoor
|
|
30
|
+
name: "Acme Outdoor"
|
|
31
|
+
domain: "acmeoutdoor.example"
|
|
32
|
+
industry: retail
|
|
33
|
+
sandbox_brand: true
|
|
34
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
35
|
+
description: >
|
|
36
|
+
Premium outdoor gear company. The default advertiser for most storyboards.
|
|
37
|
+
Used in media buy, creative, governance, and compliance scenarios.
|
|
38
|
+
characters:
|
|
39
|
+
- "Sam Adeyemi (campaigns)"
|
|
40
|
+
- "Jordan Ochoa (governance)"
|
|
41
|
+
|
|
42
|
+
- id: nova_motors
|
|
43
|
+
name: "Nova Motors"
|
|
44
|
+
domain: "novamotors.example"
|
|
45
|
+
industry: automotive
|
|
46
|
+
sandbox_brand: true
|
|
47
|
+
test_kit: "test-kits/nova-motors.yaml"
|
|
48
|
+
description: >
|
|
49
|
+
Electric vehicle manufacturer launching the Volta EV. Used for signal,
|
|
50
|
+
brand protocol, and sponsored intelligence storyboards.
|
|
51
|
+
characters:
|
|
52
|
+
- "Tomoko Hara (brand operations)"
|
|
53
|
+
- "Sam Adeyemi (buyer)"
|
|
54
|
+
|
|
55
|
+
- id: bistro_oranje
|
|
56
|
+
name: "Bistro Oranje"
|
|
57
|
+
domain: "bistro-oranje.example"
|
|
58
|
+
industry: hospitality
|
|
59
|
+
sandbox_brand: true
|
|
60
|
+
test_kit: "test-kits/bistro-oranje.yaml"
|
|
61
|
+
description: >
|
|
62
|
+
Dutch restaurant chain. Used in rights licensing scenarios where
|
|
63
|
+
Carlos manages programmatic rights for ad campaigns.
|
|
64
|
+
characters:
|
|
65
|
+
- "Carlos (rights licensing)"
|
|
66
|
+
|
|
67
|
+
- id: summit_foods
|
|
68
|
+
name: "Summit Foods"
|
|
69
|
+
domain: "summitfoods.example"
|
|
70
|
+
industry: cpg
|
|
71
|
+
sandbox_brand: true
|
|
72
|
+
test_kit: "test-kits/summit-foods.yaml"
|
|
73
|
+
description: >
|
|
74
|
+
Organic food / CPG brand. Buys retail media inventory on ShopGrid
|
|
75
|
+
in commerce media scenarios.
|
|
76
|
+
characters: []
|
|
77
|
+
|
|
78
|
+
- id: osei_natural
|
|
79
|
+
name: "Osei Natural"
|
|
80
|
+
domain: "oseinatural.example"
|
|
81
|
+
industry: beauty
|
|
82
|
+
sandbox_brand: true
|
|
83
|
+
test_kit: "test-kits/osei-natural.yaml"
|
|
84
|
+
description: >
|
|
85
|
+
8-person natural skincare company based in Nairobi. Represents the
|
|
86
|
+
small business that advertising should serve but currently doesn't.
|
|
87
|
+
characters:
|
|
88
|
+
- "Amara Osei (founder)"
|
|
89
|
+
|
|
90
|
+
# ============================================================
|
|
91
|
+
# AGENCIES — media buying agencies that operate on behalf of advertisers
|
|
92
|
+
# ============================================================
|
|
93
|
+
|
|
94
|
+
agencies:
|
|
95
|
+
- id: pinnacle_agency
|
|
96
|
+
name: "Pinnacle Agency"
|
|
97
|
+
domain: "pinnacle-agency.example"
|
|
98
|
+
size: "~200 employees"
|
|
99
|
+
description: >
|
|
100
|
+
Full-service mid-size media buying agency. Acts as the operator (buyer)
|
|
101
|
+
in most storyboards, executing campaigns on behalf of Acme Outdoor and
|
|
102
|
+
other clients. Runs its own governance agent and hosts creative assets
|
|
103
|
+
on its CDN.
|
|
104
|
+
services:
|
|
105
|
+
cdn: "cdn.pinnacle-agency.example"
|
|
106
|
+
governance_agent: "governance.pinnacle-agency.example"
|
|
107
|
+
characters:
|
|
108
|
+
- "Alex Reeves (VP of media operations)"
|
|
109
|
+
- "Sam Adeyemi (senior media buyer)"
|
|
110
|
+
- "Jordan Ochoa (campaign operations manager)"
|
|
111
|
+
- "Maya Johal (creative strategist)"
|
|
112
|
+
- "Dayo Mensah (ad tech fellow)"
|
|
113
|
+
- "Carlos (programmatic buyer, Amsterdam office)"
|
|
114
|
+
|
|
115
|
+
# ============================================================
|
|
116
|
+
# PUBLISHERS & PLATFORMS — sell inventory or serve ads
|
|
117
|
+
# ============================================================
|
|
118
|
+
|
|
119
|
+
publishers:
|
|
120
|
+
- id: streamhaus
|
|
121
|
+
name: "StreamHaus"
|
|
122
|
+
domain: "streamhaus.example"
|
|
123
|
+
type: "CTV publisher / SSP"
|
|
124
|
+
size: "~80 employees"
|
|
125
|
+
description: >
|
|
126
|
+
Mid-size streaming video platform. Exposes inventory to buyer agents
|
|
127
|
+
through AdCP rather than building a self-serve dashboard. Validates
|
|
128
|
+
creatives and fulfills media buys.
|
|
129
|
+
characters:
|
|
130
|
+
- "Priya Nair (director of ad products)"
|
|
131
|
+
|
|
132
|
+
- id: outdoornet
|
|
133
|
+
name: "OutdoorNet"
|
|
134
|
+
domain: "outdoornet.example"
|
|
135
|
+
type: "Display ad network"
|
|
136
|
+
description: >
|
|
137
|
+
Display advertising network. One of Sam's multiple sellers in
|
|
138
|
+
multi-platform media buying scenarios.
|
|
139
|
+
|
|
140
|
+
- id: podtrail
|
|
141
|
+
name: "PodTrail"
|
|
142
|
+
domain: "podtrail.example"
|
|
143
|
+
type: "Podcast ad platform"
|
|
144
|
+
description: >
|
|
145
|
+
Podcast-specific seller platform. One of Sam's distribution partners
|
|
146
|
+
in multi-platform campaigns.
|
|
147
|
+
|
|
148
|
+
- id: commhub
|
|
149
|
+
name: "CommHub"
|
|
150
|
+
domain: "commhub.example"
|
|
151
|
+
type: "Social platform"
|
|
152
|
+
description: >
|
|
153
|
+
Social media network used in creative strategy and distribution
|
|
154
|
+
scenarios. Maya's creative channel.
|
|
155
|
+
characters:
|
|
156
|
+
- "Maya Johal (creative strategist)"
|
|
157
|
+
|
|
158
|
+
- id: shopgrid
|
|
159
|
+
name: "ShopGrid"
|
|
160
|
+
domain: "shopgrid.example"
|
|
161
|
+
type: "Retail marketplace + media network"
|
|
162
|
+
size: "~3,000 employees"
|
|
163
|
+
description: >
|
|
164
|
+
E-commerce marketplace that also operates a retail media network.
|
|
165
|
+
Summit Foods buys inventory here. Also provides retail purchase
|
|
166
|
+
data signals (new-to-brand identification).
|
|
167
|
+
characters:
|
|
168
|
+
- "Daniel Park (VP of retail media)"
|
|
169
|
+
|
|
170
|
+
# --- Property governance fixtures ---
|
|
171
|
+
# These publishers appear in property governance storyboards as
|
|
172
|
+
# allow/block list entries. They are thematically consistent with
|
|
173
|
+
# Acme Outdoor's target audience.
|
|
174
|
+
|
|
175
|
+
- id: outdoor_magazine
|
|
176
|
+
name: "Outdoor Magazine"
|
|
177
|
+
domain: "outdoormagazine.example"
|
|
178
|
+
type: "Publisher property"
|
|
179
|
+
description: "Outdoor lifestyle publication. Allow-listed in property governance."
|
|
180
|
+
|
|
181
|
+
- id: hiking_trails
|
|
182
|
+
name: "Hiking Trails"
|
|
183
|
+
domain: "hikingtrails.example"
|
|
184
|
+
type: "Publisher property"
|
|
185
|
+
description: "Hiking trail guide and community site. Allow-listed in property governance."
|
|
186
|
+
|
|
187
|
+
- id: camping_gear
|
|
188
|
+
name: "Camping Gear Reviews"
|
|
189
|
+
domain: "campinggear.example"
|
|
190
|
+
type: "Publisher property"
|
|
191
|
+
description: "Camping equipment review site. Used in property governance."
|
|
192
|
+
|
|
193
|
+
- id: mountaineering
|
|
194
|
+
name: "Mountaineering Weekly"
|
|
195
|
+
domain: "mountaineering.example"
|
|
196
|
+
type: "Publisher property"
|
|
197
|
+
description: "Mountaineering news and community. Used in property governance."
|
|
198
|
+
|
|
199
|
+
- id: test_publisher
|
|
200
|
+
name: "Test Publisher"
|
|
201
|
+
domain: "test-publisher.example"
|
|
202
|
+
type: "Publisher property"
|
|
203
|
+
description: "Generic publisher for content standards validation."
|
|
204
|
+
|
|
205
|
+
# ============================================================
|
|
206
|
+
# DATA PROVIDERS — companies that sell audience/signal data
|
|
207
|
+
# ============================================================
|
|
208
|
+
|
|
209
|
+
data_providers:
|
|
210
|
+
- id: trident_auto
|
|
211
|
+
name: "Trident Auto Data"
|
|
212
|
+
domain: "tridentauto.example"
|
|
213
|
+
description: >
|
|
214
|
+
Automotive purchase intent data provider. Supplies EV buyer likelihood
|
|
215
|
+
and purchase propensity signals for the Nova Motors campaign.
|
|
216
|
+
characters:
|
|
217
|
+
- "Kai Lindgren (signals walkthrough)"
|
|
218
|
+
|
|
219
|
+
- id: meridian_geo
|
|
220
|
+
name: "Meridian Geo"
|
|
221
|
+
domain: "meridiangeo.example"
|
|
222
|
+
size: "~25 employees"
|
|
223
|
+
description: >
|
|
224
|
+
Geolocation data startup. Supplies competitor visitor signals
|
|
225
|
+
based on physical location data.
|
|
226
|
+
characters:
|
|
227
|
+
- "Kai Lindgren (head of partnerships)"
|
|
228
|
+
|
|
229
|
+
- id: prism
|
|
230
|
+
name: "Prism"
|
|
231
|
+
domain: "prism.example"
|
|
232
|
+
description: >
|
|
233
|
+
Nova Motors' first-party data platform. Provides owned signals from
|
|
234
|
+
CRM and behavioral data: customer lifetime value, cart abandonment,
|
|
235
|
+
engagement scoring, and churn risk.
|
|
236
|
+
|
|
237
|
+
# ============================================================
|
|
238
|
+
# RIGHTS & LICENSING
|
|
239
|
+
# ============================================================
|
|
240
|
+
|
|
241
|
+
rights:
|
|
242
|
+
- id: loti_entertainment
|
|
243
|
+
name: "Loti Entertainment"
|
|
244
|
+
domain: "loti-entertainment.example"
|
|
245
|
+
type: "Talent agency"
|
|
246
|
+
description: >
|
|
247
|
+
Represents talent and manages rights in the licensing ecosystem.
|
|
248
|
+
Used in rights licensing scenarios alongside Bistro Oranje.
|
|
249
|
+
|
|
250
|
+
# ============================================================
|
|
251
|
+
# COLLECTIONS — addressable content catalogs for collection_list targeting
|
|
252
|
+
# ============================================================
|
|
253
|
+
#
|
|
254
|
+
# These collections back the CollectionListReference fixtures used in
|
|
255
|
+
# media buy targeting scenarios. Thematically consistent with the
|
|
256
|
+
# advertisers above: outdoor programming for Acme Outdoor, automotive
|
|
257
|
+
# content for Nova Motors.
|
|
258
|
+
#
|
|
259
|
+
# distribution_ids use realistic identifier types (imdb_id, gracenote_id)
|
|
260
|
+
# so matching logic can be exercised against the same shapes a production
|
|
261
|
+
# collection agent would return.
|
|
262
|
+
|
|
263
|
+
collections:
|
|
264
|
+
# --- Outdoor programming (matches Acme Outdoor campaigns) ---
|
|
265
|
+
- id: trail_life_series
|
|
266
|
+
name: "Trail Life"
|
|
267
|
+
kind: "series"
|
|
268
|
+
genre: "outdoor"
|
|
269
|
+
collection_rid: "rid:outdoor:trail_life"
|
|
270
|
+
distribution_ids:
|
|
271
|
+
- type: imdb_id
|
|
272
|
+
value: "tt9100001"
|
|
273
|
+
- type: gracenote_id
|
|
274
|
+
value: "SH_OUTDOOR_TRAIL_LIFE"
|
|
275
|
+
description: "Multi-part outdoor adventure series. Used as matching inventory for outdoor campaigns."
|
|
276
|
+
|
|
277
|
+
- id: summit_stories_series
|
|
278
|
+
name: "Summit Stories"
|
|
279
|
+
kind: "series"
|
|
280
|
+
genre: "outdoor"
|
|
281
|
+
collection_rid: "rid:outdoor:summit_stories"
|
|
282
|
+
distribution_ids:
|
|
283
|
+
- type: imdb_id
|
|
284
|
+
value: "tt9100002"
|
|
285
|
+
description: "Mountaineering documentary series. Used as matching inventory for outdoor campaigns."
|
|
286
|
+
|
|
287
|
+
# --- Automotive programming (matches Nova Motors campaigns) ---
|
|
288
|
+
- id: ev_insider_series
|
|
289
|
+
name: "EV Insider"
|
|
290
|
+
kind: "series"
|
|
291
|
+
genre: "automotive"
|
|
292
|
+
collection_rid: "rid:auto:ev_insider"
|
|
293
|
+
distribution_ids:
|
|
294
|
+
- type: gracenote_id
|
|
295
|
+
value: "SH_AUTO_EV_INSIDER"
|
|
296
|
+
description: "Electric vehicle review series. Used as matching inventory for Nova Motors campaigns."
|
|
297
|
+
|
|
298
|
+
# --- Unrelated programming (used to validate no-match scenarios) ---
|
|
299
|
+
- id: cooking_bistros_series
|
|
300
|
+
name: "Bistro Kitchen"
|
|
301
|
+
kind: "series"
|
|
302
|
+
genre: "food"
|
|
303
|
+
collection_rid: "rid:food:bistro_kitchen"
|
|
304
|
+
distribution_ids:
|
|
305
|
+
- type: imdb_id
|
|
306
|
+
value: "tt9200001"
|
|
307
|
+
description: "Cooking show. Used to validate that unrelated collections do NOT match outdoor targeting."
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
id: get_media_buys_pagination_integrity
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Pagination shape — get_media_buys"
|
|
4
|
+
category: schema_validation
|
|
5
|
+
summary: "Validates that get_media_buys responses carry a well-formed pagination envelope honoring the cursor↔has_more invariant."
|
|
6
|
+
track: core
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_media_buys
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
Every paginated read in AdCP returns a `pagination` envelope satisfying
|
|
12
|
+
the cursor↔has_more invariant: `has_more=true` carries a `cursor`,
|
|
13
|
+
`has_more=false` omits it. The full multi-page round-trip is exercised
|
|
14
|
+
against `list_creatives` (`pagination_integrity.yaml`); this storyboard
|
|
15
|
+
verifies the simpler invariant — that `get_media_buys` emits a valid
|
|
16
|
+
pagination block on every successful response.
|
|
17
|
+
|
|
18
|
+
The runner seeds three media buys via `controller_seeding: true`. The
|
|
19
|
+
storyboard's get_media_buys call lands on an ID-lookup path because the
|
|
20
|
+
current `@adcp/client` request-builder injects `media_buy_ids` from
|
|
21
|
+
context (see adcp-client request-builder.js — broad-list queries
|
|
22
|
+
through the SDK are not yet supported for `get_media_buys`). On the
|
|
23
|
+
ID-lookup path the agent MUST still emit `pagination`, with
|
|
24
|
+
`has_more: false` and no cursor, and SHOULD volunteer `total_count`
|
|
25
|
+
reflecting the matched set.
|
|
26
|
+
|
|
27
|
+
An agent that omits the `pagination` block entirely on this call —
|
|
28
|
+
triage's pre-#3122 behavior — fails the first-page assertion. The
|
|
29
|
+
multi-page round-trip is parked under adcontextprotocol/adcp-client
|
|
30
|
+
for the request-builder gap; once that lands, this storyboard becomes
|
|
31
|
+
a candidate for upgrade to a seeded continuation+terminal walk like
|
|
32
|
+
`pagination_integrity.yaml`.
|
|
33
|
+
|
|
34
|
+
agent:
|
|
35
|
+
interaction_model: stateful_preloaded
|
|
36
|
+
capabilities:
|
|
37
|
+
- sells_media
|
|
38
|
+
examples:
|
|
39
|
+
- "Any AdCP media buy seller exposing get_media_buys"
|
|
40
|
+
|
|
41
|
+
caller:
|
|
42
|
+
role: buyer_agent
|
|
43
|
+
example: "Compliance test harness"
|
|
44
|
+
|
|
45
|
+
prerequisites:
|
|
46
|
+
description: |
|
|
47
|
+
The runner seeds three media buys via `controller_seeding: true`.
|
|
48
|
+
Each fixture only needs media_buy_id, status, and currency for
|
|
49
|
+
get_media_buys to surface the entry. The full multi-page walk is
|
|
50
|
+
deferred until the SDK supports broad-list queries on
|
|
51
|
+
get_media_buys (see request-builder.js gap).
|
|
52
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
53
|
+
controller_seeding: true
|
|
54
|
+
|
|
55
|
+
fixtures:
|
|
56
|
+
media_buys:
|
|
57
|
+
- media_buy_id: "pagination_integrity_mb_1"
|
|
58
|
+
status: "active"
|
|
59
|
+
currency: "USD"
|
|
60
|
+
- media_buy_id: "pagination_integrity_mb_2"
|
|
61
|
+
status: "active"
|
|
62
|
+
currency: "USD"
|
|
63
|
+
- media_buy_id: "pagination_integrity_mb_3"
|
|
64
|
+
status: "active"
|
|
65
|
+
currency: "USD"
|
|
66
|
+
|
|
67
|
+
phases:
|
|
68
|
+
- id: capability_discovery
|
|
69
|
+
title: "Capability discovery"
|
|
70
|
+
narrative: |
|
|
71
|
+
Confirm the agent supports the media buy protocol before
|
|
72
|
+
exercising get_media_buys.
|
|
73
|
+
steps:
|
|
74
|
+
- id: get_capabilities
|
|
75
|
+
title: "Check agent capabilities"
|
|
76
|
+
narrative: |
|
|
77
|
+
Verify the agent declares media_buy in supported_protocols
|
|
78
|
+
before driving get_media_buys.
|
|
79
|
+
task: get_adcp_capabilities
|
|
80
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
81
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
82
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
83
|
+
comply_scenario: capability_discovery
|
|
84
|
+
stateful: false
|
|
85
|
+
expected: |
|
|
86
|
+
Return capabilities declaring media_buy in supported_protocols.
|
|
87
|
+
|
|
88
|
+
sample_request:
|
|
89
|
+
context:
|
|
90
|
+
correlation_id: "get_media_buys_pagination_integrity--get_capabilities"
|
|
91
|
+
validations:
|
|
92
|
+
- check: response_schema
|
|
93
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
94
|
+
- check: field_present
|
|
95
|
+
path: "supported_protocols"
|
|
96
|
+
description: "Agent declares supported protocols"
|
|
97
|
+
|
|
98
|
+
- check: field_present
|
|
99
|
+
path: "context"
|
|
100
|
+
description: "Response echoes back the context object"
|
|
101
|
+
- check: field_value
|
|
102
|
+
path: "context.correlation_id"
|
|
103
|
+
value: "get_media_buys_pagination_integrity--get_capabilities"
|
|
104
|
+
description: "Context correlation_id returned unchanged"
|
|
105
|
+
|
|
106
|
+
- id: pagination_shape
|
|
107
|
+
title: "Verify pagination envelope on get_media_buys"
|
|
108
|
+
narrative: |
|
|
109
|
+
With three media buys seeded, the agent's response MUST carry a
|
|
110
|
+
well-formed `pagination` envelope. On the ID-lookup path
|
|
111
|
+
(current SDK request-builder default), the envelope is terminal:
|
|
112
|
+
`has_more=false`, no cursor. Agents that omit the envelope
|
|
113
|
+
altogether fail this assertion — that's the dishonest shape this
|
|
114
|
+
storyboard catches.
|
|
115
|
+
|
|
116
|
+
steps:
|
|
117
|
+
- id: list_call
|
|
118
|
+
title: "Call get_media_buys and verify pagination shape"
|
|
119
|
+
narrative: |
|
|
120
|
+
The buyer requests media buys. Whatever path the SDK
|
|
121
|
+
request-builder selects (today: ID-lookup with the most
|
|
122
|
+
recently seeded media_buy_id), the agent MUST emit a valid
|
|
123
|
+
`pagination` envelope satisfying the cursor↔has_more
|
|
124
|
+
invariant.
|
|
125
|
+
task: get_media_buys
|
|
126
|
+
schema_ref: "media-buy/get-media-buys-request.json"
|
|
127
|
+
response_schema_ref: "media-buy/get-media-buys-response.json"
|
|
128
|
+
doc_ref: "/media-buy/task-reference/get_media_buys"
|
|
129
|
+
comply_scenario: get_media_buys_pagination_integrity
|
|
130
|
+
stateful: true
|
|
131
|
+
expected: |
|
|
132
|
+
Return media_buys with a `pagination` envelope:
|
|
133
|
+
- pagination.has_more is a boolean (false on terminal ID-lookup)
|
|
134
|
+
- pagination.cursor absent or null when has_more is false
|
|
135
|
+
|
|
136
|
+
sample_request:
|
|
137
|
+
account:
|
|
138
|
+
brand:
|
|
139
|
+
domain: "acmeoutdoor.example"
|
|
140
|
+
operator: "pinnacle-agency.example"
|
|
141
|
+
|
|
142
|
+
context:
|
|
143
|
+
correlation_id: "get_media_buys_pagination_integrity--list_call"
|
|
144
|
+
validations:
|
|
145
|
+
- check: response_schema
|
|
146
|
+
description: "Response matches get-media-buys-response.json schema"
|
|
147
|
+
- check: field_present
|
|
148
|
+
path: "pagination"
|
|
149
|
+
description: "get_media_buys MUST emit a pagination envelope on every response"
|
|
150
|
+
- check: field_present
|
|
151
|
+
path: "pagination.has_more"
|
|
152
|
+
description: "pagination.has_more is REQUIRED per /schemas/core/pagination-response.json"
|
|
153
|
+
|
|
154
|
+
- check: field_present
|
|
155
|
+
path: "context"
|
|
156
|
+
description: "Response echoes back the context object"
|
|
157
|
+
- check: field_value
|
|
158
|
+
path: "context.correlation_id"
|
|
159
|
+
value: "get_media_buys_pagination_integrity--list_call"
|
|
160
|
+
description: "Context correlation_id returned unchanged"
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
id: get_signals_pagination_integrity
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "get_signals pagination cursor integrity"
|
|
4
|
+
category: schema_validation
|
|
5
|
+
summary: "Validates the cursor↔has_more invariant on a paginated get_signals response by walking from a continuation page to the next page under a broad query."
|
|
6
|
+
track: signals
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_signals
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
`get_signals` is the buyer's primary entry point into the signals
|
|
12
|
+
marketplace. The response carries the standard `pagination` envelope, so
|
|
13
|
+
the cursor↔has_more invariant that gates `list_creatives` (covered by
|
|
14
|
+
universal/pagination-integrity) gates this endpoint too.
|
|
15
|
+
|
|
16
|
+
This storyboard sends a deliberately broad `signal_spec` ("audience") so
|
|
17
|
+
any non-trivial signal catalog matches more than one entry, then asks
|
|
18
|
+
for `pagination.max_results: 1`. Conformant agents MUST report
|
|
19
|
+
`has_more: true` with a `cursor` on this page — an agent that caps
|
|
20
|
+
internally and reports `has_more: false` while more candidates match
|
|
21
|
+
fails the page-1 assertion. That's the dishonest-pagination shape this
|
|
22
|
+
storyboard exists to catch.
|
|
23
|
+
|
|
24
|
+
After capturing the cursor, the storyboard follows it on the second
|
|
25
|
+
call. The terminal state of that page depends on the agent's catalog
|
|
26
|
+
size and is not pinned — the second-page validations check
|
|
27
|
+
response-schema conformance only. The cursor↔has_more invariant on
|
|
28
|
+
any single page is enforced statically across all schema and storyboard
|
|
29
|
+
fixtures by `scripts/lint-pagination-invariant.cjs`; the storyboard's
|
|
30
|
+
job is the runtime catch on the page where the agent first decides
|
|
31
|
+
whether to honor `max_results`.
|
|
32
|
+
|
|
33
|
+
Catalog sizing: agents whose catalogs return zero or one match for
|
|
34
|
+
"audience" SHOULD declare themselves outside the catalog_signals
|
|
35
|
+
capability rather than passing this storyboard with a one-page result —
|
|
36
|
+
a signal marketplace with a single audience signal isn't a marketplace.
|
|
37
|
+
When such an agent runs the storyboard the first-page assertion fails
|
|
38
|
+
loud, which is the right grading: this is not a `not_applicable` case,
|
|
39
|
+
it's a too-thin catalog claiming a capability it can't honor.
|
|
40
|
+
|
|
41
|
+
agent:
|
|
42
|
+
interaction_model: marketplace_catalog
|
|
43
|
+
capabilities:
|
|
44
|
+
- catalog_signals
|
|
45
|
+
examples:
|
|
46
|
+
- "Any AdCP agent that exposes a paginated get_signals over a non-trivial catalog"
|
|
47
|
+
|
|
48
|
+
caller:
|
|
49
|
+
role: buyer_agent
|
|
50
|
+
example: "Compliance test harness"
|
|
51
|
+
|
|
52
|
+
prerequisites:
|
|
53
|
+
description: |
|
|
54
|
+
No fixtures required. The agent's signal catalog is treated as given —
|
|
55
|
+
the storyboard sends a broad query and asserts pagination shape
|
|
56
|
+
invariants on whatever match set the agent returns. Any agent
|
|
57
|
+
declaring catalog_signals SHOULD have a non-trivial catalog matching
|
|
58
|
+
"audience".
|
|
59
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
60
|
+
|
|
61
|
+
phases:
|
|
62
|
+
- id: capability_discovery
|
|
63
|
+
title: "Capability discovery"
|
|
64
|
+
narrative: |
|
|
65
|
+
Confirm the agent supports the signals protocol before exercising
|
|
66
|
+
get_signals.
|
|
67
|
+
steps:
|
|
68
|
+
- id: get_capabilities
|
|
69
|
+
title: "Check agent capabilities"
|
|
70
|
+
narrative: |
|
|
71
|
+
Verify that the agent declares signals in supported_protocols
|
|
72
|
+
before driving paginated get_signals.
|
|
73
|
+
task: get_adcp_capabilities
|
|
74
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
75
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
76
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
77
|
+
comply_scenario: capability_discovery
|
|
78
|
+
stateful: false
|
|
79
|
+
expected: |
|
|
80
|
+
Return capabilities declaring signals in supported_protocols.
|
|
81
|
+
|
|
82
|
+
sample_request:
|
|
83
|
+
context:
|
|
84
|
+
correlation_id: "get_signals_pagination_integrity--get_capabilities"
|
|
85
|
+
validations:
|
|
86
|
+
- check: response_schema
|
|
87
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
88
|
+
- check: field_present
|
|
89
|
+
path: "supported_protocols"
|
|
90
|
+
description: "Agent declares supported protocols"
|
|
91
|
+
|
|
92
|
+
- check: field_present
|
|
93
|
+
path: "context"
|
|
94
|
+
description: "Response echoes back the context object"
|
|
95
|
+
- check: field_value
|
|
96
|
+
path: "context.correlation_id"
|
|
97
|
+
value: "get_signals_pagination_integrity--get_capabilities"
|
|
98
|
+
description: "Context correlation_id returned unchanged"
|
|
99
|
+
|
|
100
|
+
- id: pagination_walk
|
|
101
|
+
title: "Walk pages with a small max_results"
|
|
102
|
+
narrative: |
|
|
103
|
+
A broad `signal_spec` ("audience") against any non-trivial signals
|
|
104
|
+
catalog matches more than one entry. With `max_results: 1` the
|
|
105
|
+
first call MUST return a continuation page; the second call follows
|
|
106
|
+
the captured cursor.
|
|
107
|
+
|
|
108
|
+
steps:
|
|
109
|
+
- id: first_page
|
|
110
|
+
title: "Request the first page with max_results=1"
|
|
111
|
+
narrative: |
|
|
112
|
+
The buyer asks for up to one signal under a broad
|
|
113
|
+
natural-language query. Agents whose catalogs contain more than
|
|
114
|
+
one match (the expected case for any agent claiming
|
|
115
|
+
catalog_signals) MUST report `has_more=true` and a `cursor` the
|
|
116
|
+
buyer can follow.
|
|
117
|
+
|
|
118
|
+
The runner captures `pagination.cursor` into
|
|
119
|
+
`$context.signals_next_cursor` for the follow-up step. If the
|
|
120
|
+
agent reports `has_more=false` while more matches exist (the
|
|
121
|
+
dishonest pagination case), the field_value check on
|
|
122
|
+
`pagination.has_more` fires — surfacing the bug class this
|
|
123
|
+
storyboard exists to catch.
|
|
124
|
+
task: get_signals
|
|
125
|
+
schema_ref: "signals/get-signals-request.json"
|
|
126
|
+
response_schema_ref: "signals/get-signals-response.json"
|
|
127
|
+
doc_ref: "/signals/tasks/get_signals"
|
|
128
|
+
comply_scenario: get_signals_pagination_integrity
|
|
129
|
+
stateful: true
|
|
130
|
+
context_outputs:
|
|
131
|
+
- name: signals_next_cursor
|
|
132
|
+
path: "pagination.cursor"
|
|
133
|
+
expected: |
|
|
134
|
+
Return up to one signal matching the broad audience query with:
|
|
135
|
+
- pagination.has_more = true
|
|
136
|
+
- pagination.cursor present (an opaque continuation token)
|
|
137
|
+
|
|
138
|
+
sample_request:
|
|
139
|
+
account:
|
|
140
|
+
brand:
|
|
141
|
+
domain: "acmeoutdoor.example"
|
|
142
|
+
operator: "pinnacle-agency.example"
|
|
143
|
+
signal_spec: "audience"
|
|
144
|
+
pagination:
|
|
145
|
+
max_results: 1
|
|
146
|
+
|
|
147
|
+
context:
|
|
148
|
+
correlation_id: "get_signals_pagination_integrity--first_page"
|
|
149
|
+
validations:
|
|
150
|
+
- check: response_schema
|
|
151
|
+
description: "Response matches get-signals-response.json schema"
|
|
152
|
+
- check: field_value
|
|
153
|
+
path: "pagination.has_more"
|
|
154
|
+
value: true
|
|
155
|
+
description: "A broad query against any non-trivial signal catalog must yield more than one match — first page is non-terminal"
|
|
156
|
+
- check: field_present
|
|
157
|
+
path: "pagination.cursor"
|
|
158
|
+
description: "has_more=true requires a cursor — without one the caller cannot continue"
|
|
159
|
+
|
|
160
|
+
- check: field_present
|
|
161
|
+
path: "context"
|
|
162
|
+
description: "Response echoes back the context object"
|
|
163
|
+
- check: field_value
|
|
164
|
+
path: "context.correlation_id"
|
|
165
|
+
value: "get_signals_pagination_integrity--first_page"
|
|
166
|
+
description: "Context correlation_id returned unchanged"
|
|
167
|
+
|
|
168
|
+
- id: next_page
|
|
169
|
+
title: "Follow the cursor"
|
|
170
|
+
narrative: |
|
|
171
|
+
The buyer follows the captured cursor under the same broad
|
|
172
|
+
query. The terminal state of this page depends on the agent's
|
|
173
|
+
catalog size — some agents exhaust the result set in two
|
|
174
|
+
pages, others continue paginating — so we do not pin
|
|
175
|
+
`has_more` here. Schema conformance MUST hold; the
|
|
176
|
+
cursor↔has_more invariant on this page is enforced by
|
|
177
|
+
`scripts/lint-pagination-invariant.cjs` against any sample
|
|
178
|
+
fixture and by the round-trip on `universal/
|
|
179
|
+
pagination-integrity.yaml`.
|
|
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: get_signals_pagination_integrity
|
|
185
|
+
stateful: true
|
|
186
|
+
expected: |
|
|
187
|
+
Return the next page of signals with a schema-valid response.
|
|
188
|
+
|
|
189
|
+
sample_request:
|
|
190
|
+
account:
|
|
191
|
+
brand:
|
|
192
|
+
domain: "acmeoutdoor.example"
|
|
193
|
+
operator: "pinnacle-agency.example"
|
|
194
|
+
signal_spec: "audience"
|
|
195
|
+
pagination:
|
|
196
|
+
cursor: "$context.signals_next_cursor"
|
|
197
|
+
max_results: 1
|
|
198
|
+
|
|
199
|
+
context:
|
|
200
|
+
correlation_id: "get_signals_pagination_integrity--next_page"
|
|
201
|
+
validations:
|
|
202
|
+
- check: response_schema
|
|
203
|
+
description: "Response matches get-signals-response.json schema"
|
|
204
|
+
|
|
205
|
+
- check: field_present
|
|
206
|
+
path: "context"
|
|
207
|
+
description: "Response echoes back the context object"
|
|
208
|
+
- check: field_value
|
|
209
|
+
path: "context.correlation_id"
|
|
210
|
+
value: "get_signals_pagination_integrity--next_page"
|
|
211
|
+
description: "Context correlation_id returned unchanged"
|