@adcp/sdk 6.9.0 → 6.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/adcp.js +285 -5
- package/compliance/cache/3.0.6.previous/domains/brand/index.yaml +163 -0
- package/compliance/cache/3.0.6.previous/domains/creative/index.yaml +412 -0
- package/compliance/cache/3.0.6.previous/domains/governance/index.yaml +683 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.6.previous/domains/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.6.previous/domains/signals/index.yaml +266 -0
- package/compliance/cache/3.0.6.previous/domains/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.6.previous/index.json +324 -0
- package/compliance/cache/3.0.6.previous/protocols/brand/index.yaml +163 -0
- package/compliance/cache/3.0.6.previous/protocols/creative/index.yaml +412 -0
- package/compliance/cache/3.0.6.previous/protocols/governance/index.yaml +683 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/creative-reception.yaml +247 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/index.yaml +769 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/create_media_buy_async.yaml +232 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +414 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/delivery_reporting.yaml +205 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_approved.yaml +211 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_conditions.yaml +196 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied.yaml +192 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/governance_denied_recovery.yaml +244 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/invalid_transitions.yaml +284 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_no_match.yaml +143 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/inventory_list_targeting.yaml +271 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +195 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +250 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/proposal_finalize.yaml +243 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/scenarios/refine_products.yaml +148 -0
- package/compliance/cache/3.0.6.previous/protocols/media-buy/state-machine.yaml +442 -0
- package/compliance/cache/3.0.6.previous/protocols/signals/index.yaml +266 -0
- package/compliance/cache/3.0.6.previous/protocols/sponsored-intelligence/index.yaml +256 -0
- package/compliance/cache/3.0.6.previous/specialisms/audience-sync/index.yaml +280 -0
- package/compliance/cache/3.0.6.previous/specialisms/brand-rights/index.yaml +350 -0
- package/compliance/cache/3.0.6.previous/specialisms/brand-rights/scenarios/governance_denied.yaml +204 -0
- package/compliance/cache/3.0.6.previous/specialisms/collection-lists/index.yaml +359 -0
- package/compliance/cache/3.0.6.previous/specialisms/content-standards/index.yaml +572 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-ad-server/index.yaml +383 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-generative/generative-seller.yaml +758 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-generative/index.yaml +746 -0
- package/compliance/cache/3.0.6.previous/specialisms/creative-template/index.yaml +413 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-aware-seller/index.yaml +136 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-delivery-monitor/index.yaml +441 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/denied.yaml +221 -0
- package/compliance/cache/3.0.6.previous/specialisms/governance-spend-authority/index.yaml +330 -0
- package/compliance/cache/3.0.6.previous/specialisms/property-lists/index.yaml +482 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-broadcast-tv/index.yaml +689 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-catalog-driven/index.yaml +779 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-guaranteed/index.yaml +504 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-non-guaranteed/index.yaml +428 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-proposal-mode/index.yaml +520 -0
- package/compliance/cache/3.0.6.previous/specialisms/sales-social/index.yaml +584 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/index.yaml +415 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-marketplace/scenarios/governance_denied.yaml +207 -0
- package/compliance/cache/3.0.6.previous/specialisms/signal-owned/index.yaml +316 -0
- package/compliance/cache/3.0.6.previous/test-kits/acme-outdoor.yaml +210 -0
- package/compliance/cache/3.0.6.previous/test-kits/bistro-oranje.yaml +126 -0
- package/compliance/cache/3.0.6.previous/test-kits/nova-motors.yaml +262 -0
- package/compliance/cache/3.0.6.previous/test-kits/osei-natural.yaml +126 -0
- package/compliance/cache/3.0.6.previous/test-kits/signed-requests-runner.yaml +155 -0
- package/compliance/cache/3.0.6.previous/test-kits/substitution-observer-runner.yaml +690 -0
- package/compliance/cache/3.0.6.previous/test-kits/summit-foods.yaml +125 -0
- package/compliance/cache/3.0.6.previous/test-kits/webhook-receiver-runner.yaml +265 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/001-minimal-plan.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/002-full-plan.json +217 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/003-bookkeeping-stripped.json +60 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004a-human-review-omitted.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/004b-human-review-explicit-null.json +49 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005a-policy-categories-order-1.json +53 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/005b-policy-categories-order-2.json +57 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006a-ext-trace-v1.json +49 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/006b-ext-trace-v2.json +53 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/007-unicode-objectives.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/plan-hash/008-numeric-canonicalization.json +65 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/README.md +219 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/canonicalization.json +241 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/keys.json +60 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/001-no-signature-header.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/002-wrong-tag.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/003-expired-signature.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/004-window-too-long.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/005-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/006-missing-covered-component.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/007-missing-content-digest.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/008-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/010-content-digest-mismatch.json +33 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/011-malformed-header.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/013-expires-le-created.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/014-missing-nonce-param.json +27 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/015-signature-invalid.json +28 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/016-replayed-nonce.json +35 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/017-key-revoked.json +38 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +28 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/019-signature-without-signature-input.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/020-rate-abuse.json +34 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/022-multi-valued-content-type.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/024-unquoted-string-param.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +43 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/026-non-ascii-host.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/001-basic-post.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/002-post-with-content-digest.json +31 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/003-es256-post.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/004-multiple-signature-labels.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/005-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/006-dot-segment-path.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/007-query-byte-preserved.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/008-percent-encoded-path.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/011-ipv6-authority.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +30 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/README.md +211 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/keys.json +61 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/001-wrong-tag.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/002-expired-signature.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/003-window-too-long.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/005-missing-authority-component.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/006-missing-content-digest.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/007-unknown-keyid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/011-signature-without-input.json +25 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/012-missing-expires-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/013-expires-le-created.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/015-signature-invalid.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/016-replayed-nonce.json +37 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/017-key-revoked.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/018-rate-abuse.json +33 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/019-revocation-stale.json +32 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +41 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +26 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/001-basic-post.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/002-es256-post.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/004-default-port-stripped.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +24 -0
- package/compliance/cache/3.0.6.previous/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +25 -0
- package/compliance/cache/3.0.6.previous/universal/capability-discovery.yaml +125 -0
- package/compliance/cache/3.0.6.previous/universal/collection-lists-pagination-integrity.yaml +306 -0
- package/compliance/cache/3.0.6.previous/universal/content-standards-pagination-integrity.yaml +326 -0
- package/compliance/cache/3.0.6.previous/universal/deterministic-testing.yaml +1343 -0
- package/compliance/cache/3.0.6.previous/universal/error-compliance.yaml +474 -0
- package/compliance/cache/3.0.6.previous/universal/fictional-entities.yaml +307 -0
- package/compliance/cache/3.0.6.previous/universal/get-media-buys-pagination-integrity.yaml +160 -0
- package/compliance/cache/3.0.6.previous/universal/get-signals-pagination-integrity.yaml +211 -0
- package/compliance/cache/3.0.6.previous/universal/idempotency.yaml +593 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity-creative-formats.yaml +258 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity-list-accounts.yaml +262 -0
- package/compliance/cache/3.0.6.previous/universal/pagination-integrity.yaml +263 -0
- package/compliance/cache/3.0.6.previous/universal/property-lists-pagination-integrity.yaml +307 -0
- package/compliance/cache/3.0.6.previous/universal/runner-output-contract.yaml +358 -0
- package/compliance/cache/3.0.6.previous/universal/schema-validation.yaml +526 -0
- package/compliance/cache/3.0.6.previous/universal/security.yaml +431 -0
- package/compliance/cache/3.0.6.previous/universal/signed-requests.yaml +205 -0
- package/compliance/cache/3.0.6.previous/universal/storyboard-schema.yaml +1176 -0
- package/compliance/cache/3.0.6.previous/universal/v3-envelope-integrity.yaml +106 -0
- package/compliance/cache/3.0.6.previous/universal/webhook-emission.yaml +337 -0
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/create-adcp-server.d.ts +33 -0
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +127 -1
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/credential-policy.d.ts +221 -0
- package/dist/lib/server/credential-policy.d.ts.map +1 -0
- package/dist/lib/server/credential-policy.js +260 -0
- package/dist/lib/server/credential-policy.js.map +1 -0
- package/dist/lib/server/decisioning/async-outcome.d.ts +17 -0
- package/dist/lib/server/decisioning/async-outcome.d.ts.map +1 -1
- package/dist/lib/server/decisioning/async-outcome.js +23 -18
- package/dist/lib/server/decisioning/async-outcome.js.map +1 -1
- package/dist/lib/server/decisioning/context.d.ts +8 -2
- package/dist/lib/server/decisioning/context.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.d.ts +1 -0
- package/dist/lib/server/decisioning/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +6 -4
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.js +5 -2
- package/dist/lib/server/decisioning/runtime/postgres-task-registry.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/task-registry.d.ts +5 -0
- package/dist/lib/server/decisioning/runtime/task-registry.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/task-registry.js +4 -1
- package/dist/lib/server/decisioning/runtime/task-registry.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/to-context.js +10 -2
- package/dist/lib/server/decisioning/runtime/to-context.js.map +1 -1
- package/dist/lib/server/dynamic-registry.d.ts +219 -0
- package/dist/lib/server/dynamic-registry.d.ts.map +1 -0
- package/dist/lib/server/dynamic-registry.js +245 -0
- package/dist/lib/server/dynamic-registry.js.map +1 -0
- package/dist/lib/server/index.d.ts +8 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +15 -4
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/operational-platform.d.ts +239 -0
- package/dist/lib/server/operational-platform.d.ts.map +1 -0
- package/dist/lib/server/operational-platform.js +94 -0
- package/dist/lib/server/operational-platform.js.map +1 -0
- package/dist/lib/server/test-controller.d.ts +2 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -1
- package/dist/lib/server/test-controller.js +6 -11
- package/dist/lib/server/test-controller.js.map +1 -1
- package/dist/lib/server/wire-safe.d.ts +211 -0
- package/dist/lib/server/wire-safe.d.ts.map +1 -0
- package/dist/lib/server/wire-safe.js +231 -0
- package/dist/lib/server/wire-safe.js.map +1 -0
- package/dist/lib/server/wire-spec-fields.generated.d.ts +168 -0
- package/dist/lib/server/wire-spec-fields.generated.d.ts.map +1 -0
- package/dist/lib/server/wire-spec-fields.generated.js +172 -0
- package/dist/lib/server/wire-spec-fields.generated.js.map +1 -0
- package/dist/lib/testing/compliance/index.d.ts +2 -0
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js +6 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/summary.d.ts +77 -0
- package/dist/lib/testing/compliance/summary.d.ts.map +1 -0
- package/dist/lib/testing/compliance/summary.js +176 -0
- package/dist/lib/testing/compliance/summary.js.map +1 -0
- package/dist/lib/testing/comply-controller.d.ts +2 -0
- package/dist/lib/testing/comply-controller.d.ts.map +1 -1
- package/dist/lib/testing/comply-controller.js.map +1 -1
- package/dist/lib/testing/storyboard/compliance.d.ts +26 -0
- package/dist/lib/testing/storyboard/compliance.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/compliance.js +51 -0
- package/dist/lib/testing/storyboard/compliance.js.map +1 -1
- package/dist/lib/testing/storyboard/index.d.ts +2 -2
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/index.js +4 -2
- package/dist/lib/testing/storyboard/index.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +58 -5
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.js.map +1 -1
- package/package.json +2 -2
package/bin/adcp.js
CHANGED
|
@@ -694,6 +694,13 @@ function parseAgentOptions(args) {
|
|
|
694
694
|
? args[formatIdx + 1]
|
|
695
695
|
: null;
|
|
696
696
|
|
|
697
|
+
// --summary-output is parsed locally inside `runFullAssessment`, but its
|
|
698
|
+
// value must be excluded from `positionalArgs` here so it doesn't
|
|
699
|
+
// accidentally get treated as a storyboard ID.
|
|
700
|
+
const summaryOutputIdx = args.indexOf('--summary-output');
|
|
701
|
+
const summaryOutputValue =
|
|
702
|
+
summaryOutputIdx !== -1 && summaryOutputIdx + 1 < args.length ? args[summaryOutputIdx + 1] : null;
|
|
703
|
+
|
|
697
704
|
// Filter out flags and their values to find positional args. The `--file=PATH`
|
|
698
705
|
// form is already removed by the `startsWith('--')` check; only the
|
|
699
706
|
// space-separated value needs explicit exclusion. Use explicit nullish check
|
|
@@ -715,6 +722,7 @@ function parseAgentOptions(args) {
|
|
|
715
722
|
invariantsValue,
|
|
716
723
|
localAgentValue,
|
|
717
724
|
formatValue,
|
|
725
|
+
summaryOutputValue,
|
|
718
726
|
fileIndex !== -1 ? file : null,
|
|
719
727
|
].filter(v => v !== null && v !== undefined);
|
|
720
728
|
const positionalArgs = args.filter(arg => !arg.startsWith('--') && !flagValues.includes(arg));
|
|
@@ -1145,6 +1153,7 @@ USAGE:
|
|
|
1145
1153
|
|
|
1146
1154
|
COMMANDS:
|
|
1147
1155
|
storyboard <subcommand> Test agent flows (run, list, show, step)
|
|
1156
|
+
specialism <subcommand> Inspect a compliance specialism (list, show)
|
|
1148
1157
|
grade <subject> <url> Conformance graders (e.g. request-signing)
|
|
1149
1158
|
fuzz <url> Property-based conformance fuzzing against schemas
|
|
1150
1159
|
resolve <agent-url> Walk the brand_json_url discovery chain
|
|
@@ -1241,6 +1250,22 @@ RUN OPTIONS (full assessment):
|
|
|
1241
1250
|
fallbacks, brand-domain heuristics, fixture
|
|
1242
1251
|
substitutes). Agents that don't recognize the
|
|
1243
1252
|
ext.adcp.disable_sandbox field ignore it.
|
|
1253
|
+
--summary-output PATH
|
|
1254
|
+
Write a narrow, schema-stable summary artifact
|
|
1255
|
+
to PATH (JSON: { schema_version, passed, failed,
|
|
1256
|
+
failures: [{storyboard_id, step_id, reason}] }).
|
|
1257
|
+
Pin downstream tooling (badges, Slack bots,
|
|
1258
|
+
dashboards) to this contract — the full
|
|
1259
|
+
ComplianceResult on stdout in --json mode evolves
|
|
1260
|
+
with the protocol. Independent of --json.
|
|
1261
|
+
|
|
1262
|
+
OUTPUT (always-on):
|
|
1263
|
+
Every run writes a compact summary to stderr with a greppable
|
|
1264
|
+
STORYBOARD-FAIL prefix when any step fails — visible regardless of
|
|
1265
|
+
--json mode or workflow continue-on-error wiring. When
|
|
1266
|
+
$GITHUB_STEP_SUMMARY is set (GitHub Actions), the same summary is
|
|
1267
|
+
appended as a markdown table so PR reviewers see failures without
|
|
1268
|
+
opening the run log.
|
|
1244
1269
|
|
|
1245
1270
|
WEBHOOK OPTIONS:
|
|
1246
1271
|
--webhook-receiver [MODE] Host an ephemeral receiver so expect_webhook*
|
|
@@ -1357,6 +1382,176 @@ EXAMPLES:
|
|
|
1357
1382
|
}
|
|
1358
1383
|
}
|
|
1359
1384
|
|
|
1385
|
+
// ────────────────────────────────────────────────────────────
|
|
1386
|
+
// Specialism command: inspect what CI will exercise per specialism slug.
|
|
1387
|
+
// ────────────────────────────────────────────────────────────
|
|
1388
|
+
|
|
1389
|
+
async function handleSpecialismCommand(args) {
|
|
1390
|
+
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
1391
|
+
console.log(`
|
|
1392
|
+
Inspect a compliance specialism — what CI will actually exercise against
|
|
1393
|
+
your server, before you run anything.
|
|
1394
|
+
|
|
1395
|
+
USAGE:
|
|
1396
|
+
adcp specialism list [--json]
|
|
1397
|
+
adcp specialism show <slug> [--json]
|
|
1398
|
+
|
|
1399
|
+
SUBCOMMANDS:
|
|
1400
|
+
list Enumerate every specialism the compliance cache
|
|
1401
|
+
knows about (slug, protocol, status, title).
|
|
1402
|
+
show <slug> Print the resolved required scenarios, required
|
|
1403
|
+
tools, and storyboard phases for a specialism.
|
|
1404
|
+
|
|
1405
|
+
EXAMPLES:
|
|
1406
|
+
adcp specialism list
|
|
1407
|
+
adcp specialism show sales-guaranteed
|
|
1408
|
+
adcp specialism show creative-template --json
|
|
1409
|
+
|
|
1410
|
+
Specialism slugs are kebab-case (e.g. sales-guaranteed). Storyboard
|
|
1411
|
+
category IDs in the YAML are snake_case (e.g. sales_guaranteed) — same
|
|
1412
|
+
concept, two names. \`adcp specialism list\` always prints the slug.
|
|
1413
|
+
`);
|
|
1414
|
+
process.exit(0);
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
const subcommand = args[0];
|
|
1418
|
+
const subArgs = args.slice(1);
|
|
1419
|
+
switch (subcommand) {
|
|
1420
|
+
case 'list':
|
|
1421
|
+
await handleSpecialismList(subArgs);
|
|
1422
|
+
break;
|
|
1423
|
+
case 'show':
|
|
1424
|
+
await handleSpecialismShow(subArgs);
|
|
1425
|
+
break;
|
|
1426
|
+
default:
|
|
1427
|
+
console.error(`Unknown specialism subcommand: ${subcommand}`);
|
|
1428
|
+
console.error(`Run 'adcp specialism --help' for usage.`);
|
|
1429
|
+
process.exit(2);
|
|
1430
|
+
}
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
async function handleSpecialismList(args) {
|
|
1434
|
+
const { listSpecialisms } = await import('../dist/lib/testing/storyboard/index.js');
|
|
1435
|
+
const jsonOutput = args.includes('--json');
|
|
1436
|
+
const specialisms = listSpecialisms();
|
|
1437
|
+
|
|
1438
|
+
if (jsonOutput) {
|
|
1439
|
+
await writeJsonOutput(specialisms);
|
|
1440
|
+
return;
|
|
1441
|
+
}
|
|
1442
|
+
|
|
1443
|
+
console.log(`\nSpecialisms (${specialisms.length}) — from compliance cache:\n`);
|
|
1444
|
+
const slugWidth = Math.max(...specialisms.map(s => s.id.length), 'SLUG'.length);
|
|
1445
|
+
const protocolWidth = Math.max(...specialisms.map(s => s.protocol.length), 'PROTOCOL'.length);
|
|
1446
|
+
console.log(` ${'SLUG'.padEnd(slugWidth)} ${'PROTOCOL'.padEnd(protocolWidth)} STATUS TITLE`);
|
|
1447
|
+
console.log(` ${'─'.repeat(slugWidth)} ${'─'.repeat(protocolWidth)} ──────── ─────`);
|
|
1448
|
+
for (const s of specialisms) {
|
|
1449
|
+
console.log(
|
|
1450
|
+
` ${s.id.padEnd(slugWidth)} ${s.protocol.padEnd(protocolWidth)} ${(s.status || '').padEnd(8)} ${s.title ?? ''}`
|
|
1451
|
+
);
|
|
1452
|
+
}
|
|
1453
|
+
console.log(`\n→ Run 'adcp specialism show <slug>' to see required scenarios, tools, and phases for a specialism.\n`);
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1456
|
+
async function handleSpecialismShow(args) {
|
|
1457
|
+
const { loadSpecialismDetail } = await import('../dist/lib/testing/storyboard/index.js');
|
|
1458
|
+
const slug = args.find(a => !a.startsWith('--'));
|
|
1459
|
+
const jsonOutput = args.includes('--json');
|
|
1460
|
+
|
|
1461
|
+
if (!slug) {
|
|
1462
|
+
console.error('Usage: adcp specialism show <slug> [--json]');
|
|
1463
|
+
process.exit(2);
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
let detail;
|
|
1467
|
+
try {
|
|
1468
|
+
detail = loadSpecialismDetail(slug);
|
|
1469
|
+
} catch (err) {
|
|
1470
|
+
console.error(err.message);
|
|
1471
|
+
process.exit(2);
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
if (jsonOutput) {
|
|
1475
|
+
await writeJsonOutput({
|
|
1476
|
+
slug: detail.slug,
|
|
1477
|
+
protocol: detail.protocol,
|
|
1478
|
+
status: detail.status,
|
|
1479
|
+
title: detail.index_title ?? detail.storyboard.title,
|
|
1480
|
+
summary: detail.storyboard.summary,
|
|
1481
|
+
track: detail.storyboard.track,
|
|
1482
|
+
required_tools: detail.required_tools,
|
|
1483
|
+
invariants: detail.storyboard.invariants ?? null,
|
|
1484
|
+
phases: detail.storyboard.phases.map(p => ({
|
|
1485
|
+
id: p.id,
|
|
1486
|
+
title: p.title,
|
|
1487
|
+
steps: p.steps.map(s => ({ id: s.id, task: s.task })),
|
|
1488
|
+
})),
|
|
1489
|
+
required_scenarios: detail.required_scenarios.map(sb => ({
|
|
1490
|
+
id: sb.id,
|
|
1491
|
+
title: sb.title,
|
|
1492
|
+
category: sb.category,
|
|
1493
|
+
track: sb.track,
|
|
1494
|
+
step_count: sb.phases.reduce((n, p) => n + p.steps.length, 0),
|
|
1495
|
+
})),
|
|
1496
|
+
unresolved_scenarios: detail.unresolved_scenarios,
|
|
1497
|
+
});
|
|
1498
|
+
return;
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
const sb = detail.storyboard;
|
|
1502
|
+
const title = detail.index_title ?? sb.title;
|
|
1503
|
+
console.log(`\n${title}`);
|
|
1504
|
+
console.log('─'.repeat(title.length));
|
|
1505
|
+
console.log(`Slug: ${detail.slug}`);
|
|
1506
|
+
console.log(`Protocol: ${detail.protocol}`);
|
|
1507
|
+
console.log(`Status: ${detail.status}`);
|
|
1508
|
+
if (sb.track) console.log(`Track: ${sb.track}`);
|
|
1509
|
+
console.log(`\n${sb.summary}`);
|
|
1510
|
+
|
|
1511
|
+
if (detail.required_tools.length > 0) {
|
|
1512
|
+
console.log(`\nRequired Tools`);
|
|
1513
|
+
console.log('─'.repeat(50));
|
|
1514
|
+
for (const tool of detail.required_tools) console.log(` • ${tool}`);
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
console.log(`\nStoryboard Phases (${sb.phases.length})`);
|
|
1518
|
+
console.log('─'.repeat(50));
|
|
1519
|
+
for (const phase of sb.phases) {
|
|
1520
|
+
console.log(` ${phase.id} — ${phase.title} (${phase.steps.length} step${phase.steps.length === 1 ? '' : 's'})`);
|
|
1521
|
+
}
|
|
1522
|
+
|
|
1523
|
+
console.log(`\nRequired Scenarios (${detail.required_scenarios.length})`);
|
|
1524
|
+
console.log('─'.repeat(50));
|
|
1525
|
+
if (detail.required_scenarios.length === 0) {
|
|
1526
|
+
console.log(' (none)');
|
|
1527
|
+
} else {
|
|
1528
|
+
for (const scn of detail.required_scenarios) {
|
|
1529
|
+
const stepCount = scn.phases.reduce((n, p) => n + p.steps.length, 0);
|
|
1530
|
+
console.log(` • ${scn.id} — ${scn.title} (${stepCount} step${stepCount === 1 ? '' : 's'})`);
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
if (detail.unresolved_scenarios.length > 0) {
|
|
1534
|
+
console.log(`\n⚠️ Unresolved (${detail.unresolved_scenarios.length}):`);
|
|
1535
|
+
for (const ref of detail.unresolved_scenarios) console.log(` • ${ref}`);
|
|
1536
|
+
console.log(
|
|
1537
|
+
` Run \`npm run sync-schemas\` to refresh the cache, or these scenarios may be on a newer AdCP version.`
|
|
1538
|
+
);
|
|
1539
|
+
}
|
|
1540
|
+
|
|
1541
|
+
if (sb.invariants) {
|
|
1542
|
+
console.log(`\nInvariants`);
|
|
1543
|
+
console.log('─'.repeat(50));
|
|
1544
|
+
const inv = sb.invariants;
|
|
1545
|
+
if (Array.isArray(inv)) {
|
|
1546
|
+
for (const id of inv) console.log(` + ${id}`);
|
|
1547
|
+
} else {
|
|
1548
|
+
if (inv.enable?.length) for (const id of inv.enable) console.log(` + ${id}`);
|
|
1549
|
+
if (inv.disable?.length) for (const id of inv.disable) console.log(` − ${id}`);
|
|
1550
|
+
}
|
|
1551
|
+
}
|
|
1552
|
+
console.log('');
|
|
1553
|
+
}
|
|
1554
|
+
|
|
1360
1555
|
async function handleStoryboardList(args) {
|
|
1361
1556
|
const { listBundles, loadBundleStoryboards } = await import('../dist/lib/testing/storyboard/index.js');
|
|
1362
1557
|
const jsonOutput = args.includes('--json');
|
|
@@ -3296,11 +3491,56 @@ async function runFullAssessment(agentArg, rawArgs, parsedOpts) {
|
|
|
3296
3491
|
console.log('');
|
|
3297
3492
|
}
|
|
3298
3493
|
|
|
3494
|
+
// --summary-output <path>: write the narrow ComplianceSummaryArtifact JSON
|
|
3495
|
+
// (schema-stable: { schema_version, passed, failed, failures: [...] }) to
|
|
3496
|
+
// a file. The full ComplianceResult on stdout in --json mode evolves with
|
|
3497
|
+
// the protocol; the summary contract is what downstream tooling
|
|
3498
|
+
// (badges, Slack bots, dashboards) should pin to.
|
|
3499
|
+
const summaryOutputIndex = rawArgs.indexOf('--summary-output');
|
|
3500
|
+
let summaryOutputPath = null;
|
|
3501
|
+
if (summaryOutputIndex !== -1) {
|
|
3502
|
+
if (summaryOutputIndex + 1 >= rawArgs.length) {
|
|
3503
|
+
console.error('ERROR: --summary-output requires a file path\n');
|
|
3504
|
+
process.exit(2);
|
|
3505
|
+
}
|
|
3506
|
+
summaryOutputPath = rawArgs[summaryOutputIndex + 1];
|
|
3507
|
+
}
|
|
3508
|
+
|
|
3509
|
+
const {
|
|
3510
|
+
comply,
|
|
3511
|
+
formatComplianceResults,
|
|
3512
|
+
formatComplianceResultsJSON,
|
|
3513
|
+
buildComplianceSummary,
|
|
3514
|
+
buildCrashSummary,
|
|
3515
|
+
formatComplianceSummaryText,
|
|
3516
|
+
formatComplianceSummaryMarkdown,
|
|
3517
|
+
} = await import('../dist/lib/testing/compliance/index.js');
|
|
3518
|
+
const { ADCP_VERSION } = await import('../dist/lib/version.js');
|
|
3519
|
+
|
|
3520
|
+
function emitSummary(summary) {
|
|
3521
|
+
process.stderr.write(formatComplianceSummaryText(summary));
|
|
3522
|
+
if (process.env.GITHUB_STEP_SUMMARY) {
|
|
3523
|
+
try {
|
|
3524
|
+
const fs = require('fs');
|
|
3525
|
+
fs.appendFileSync(process.env.GITHUB_STEP_SUMMARY, formatComplianceSummaryMarkdown(summary) + '\n');
|
|
3526
|
+
} catch (err) {
|
|
3527
|
+
process.stderr.write(`\nWarning: could not write GITHUB_STEP_SUMMARY: ${err.message}\n`);
|
|
3528
|
+
}
|
|
3529
|
+
}
|
|
3530
|
+
if (summaryOutputPath) {
|
|
3531
|
+
try {
|
|
3532
|
+
const fs = require('fs');
|
|
3533
|
+
fs.writeFileSync(summaryOutputPath, JSON.stringify(summary, null, 2) + '\n');
|
|
3534
|
+
} catch (err) {
|
|
3535
|
+
process.stderr.write(`\nWarning: could not write --summary-output to ${summaryOutputPath}: ${err.message}\n`);
|
|
3536
|
+
}
|
|
3537
|
+
}
|
|
3538
|
+
}
|
|
3539
|
+
|
|
3299
3540
|
const restoreLogs = opts.jsonOutput ? captureStdoutLogs() : null;
|
|
3541
|
+
const startedAt = new Date().toISOString();
|
|
3542
|
+
const runStartTime = Date.now();
|
|
3300
3543
|
try {
|
|
3301
|
-
const { comply, formatComplianceResults, formatComplianceResultsJSON } =
|
|
3302
|
-
await import('../dist/lib/testing/compliance/index.js');
|
|
3303
|
-
|
|
3304
3544
|
const { setAgentTesterLogger } = await import('../dist/lib/testing/client.js');
|
|
3305
3545
|
if (!opts.debug) {
|
|
3306
3546
|
setAgentTesterLogger({ info: () => {}, error: () => {}, warn: () => {}, debug: () => {} });
|
|
@@ -3315,12 +3555,47 @@ async function runFullAssessment(agentArg, rawArgs, parsedOpts) {
|
|
|
3315
3555
|
console.log(formatComplianceResults(result));
|
|
3316
3556
|
}
|
|
3317
3557
|
|
|
3318
|
-
|
|
3319
|
-
|
|
3558
|
+
// Always-on summary. STORYBOARD-FAIL fires on any non-passing run so
|
|
3559
|
+
// CI greppers see failures regardless of `continue-on-error: true` or
|
|
3560
|
+
// `|| true` shenanigans.
|
|
3561
|
+
const summary = buildComplianceSummary(result, {
|
|
3562
|
+
sdkVersion: LIBRARY_VERSION,
|
|
3563
|
+
adcpVersion: ADCP_VERSION,
|
|
3564
|
+
});
|
|
3565
|
+
emitSummary(summary);
|
|
3566
|
+
|
|
3567
|
+
// Exit code policy: anything that doesn't represent "the agent
|
|
3568
|
+
// exercised its tracks and they passed" is a CI failure. `partial`
|
|
3569
|
+
// is preserved as exit 0 because some tracks were silent (wired but
|
|
3570
|
+
// unexercised) — that's a reportable observation, not a hard failure.
|
|
3571
|
+
const exitCode =
|
|
3572
|
+
result.overall_status === 'failing' ||
|
|
3573
|
+
result.overall_status === 'unreachable' ||
|
|
3574
|
+
result.overall_status === 'auth_required'
|
|
3575
|
+
? 3
|
|
3576
|
+
: 0;
|
|
3577
|
+
process.exit(exitCode);
|
|
3320
3578
|
} catch (error) {
|
|
3321
3579
|
if (restoreLogs) restoreLogs();
|
|
3322
3580
|
console.error(`\nAssessment failed: ${error.message}`);
|
|
3323
3581
|
if (opts.debug) console.error(error.stack);
|
|
3582
|
+
|
|
3583
|
+
// Crash-path summary. Without this, a network drop or capabilities
|
|
3584
|
+
// parse error silently exits 1 with no `STORYBOARD-FAIL` marker —
|
|
3585
|
+
// breaking the always-on promise on the path where it matters most.
|
|
3586
|
+
try {
|
|
3587
|
+
const crashSummary = buildCrashSummary({
|
|
3588
|
+
sdkVersion: LIBRARY_VERSION,
|
|
3589
|
+
adcpVersion: ADCP_VERSION,
|
|
3590
|
+
agentUrl,
|
|
3591
|
+
error,
|
|
3592
|
+
startedAt,
|
|
3593
|
+
durationMs: Date.now() - runStartTime,
|
|
3594
|
+
});
|
|
3595
|
+
emitSummary(crashSummary);
|
|
3596
|
+
} catch {
|
|
3597
|
+
// Summary emission must never mask the original crash.
|
|
3598
|
+
}
|
|
3324
3599
|
process.exit(1);
|
|
3325
3600
|
}
|
|
3326
3601
|
}
|
|
@@ -3839,6 +4114,11 @@ async function main() {
|
|
|
3839
4114
|
return;
|
|
3840
4115
|
}
|
|
3841
4116
|
|
|
4117
|
+
if (args[0] === 'specialism') {
|
|
4118
|
+
await handleSpecialismCommand(args.slice(1));
|
|
4119
|
+
return;
|
|
4120
|
+
}
|
|
4121
|
+
|
|
3842
4122
|
if (args[0] === 'check-network') {
|
|
3843
4123
|
await handleCheckNetworkCommand(args.slice(1));
|
|
3844
4124
|
return;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
id: brand_baseline
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Brand baseline"
|
|
4
|
+
protocol: brand
|
|
5
|
+
category: brand_baseline
|
|
6
|
+
summary: "Baseline protocol storyboard — every brand agent must declare the brand protocol in capabilities and return a schema-valid brand identity."
|
|
7
|
+
track: brand
|
|
8
|
+
required_tools:
|
|
9
|
+
- get_brand_identity
|
|
10
|
+
|
|
11
|
+
narrative: |
|
|
12
|
+
Brand protocol agents are the identity layer of AdCP. Their job is to hold
|
|
13
|
+
brand identity data (names, logos, colors, fonts, tone) and expose it to
|
|
14
|
+
other agents — buyer agents, creative agents, DSPs — that need to render
|
|
15
|
+
on-brand creative or verify who a campaign is for.
|
|
16
|
+
|
|
17
|
+
The baseline tests the minimum contract that every brand agent honors,
|
|
18
|
+
regardless of what additional capabilities (rights licensing, creative
|
|
19
|
+
approval) it layers on top:
|
|
20
|
+
|
|
21
|
+
1. Declare `brand` in `supported_protocols` on `get_adcp_capabilities`.
|
|
22
|
+
2. Respond to `get_brand_identity` with a schema-valid identity manifest.
|
|
23
|
+
3. Reject unknown `brand_id` values with a structured error.
|
|
24
|
+
|
|
25
|
+
Rights licensing (`get_rights`, `acquire_rights`, `update_rights`,
|
|
26
|
+
`creative_approval`) ships experimentally in 3.0 and is covered by the
|
|
27
|
+
`brand-rights` specialism storyboard, not this baseline.
|
|
28
|
+
|
|
29
|
+
agent:
|
|
30
|
+
interaction_model: brand_agent
|
|
31
|
+
capabilities: []
|
|
32
|
+
examples:
|
|
33
|
+
- "Any brand agent (simple identity host or full rights platform)"
|
|
34
|
+
- "Brand-owned agents (Acme Outdoor)"
|
|
35
|
+
- "Third-party brand identity platforms"
|
|
36
|
+
- "Agency-hosted brand agents"
|
|
37
|
+
|
|
38
|
+
caller:
|
|
39
|
+
role: buyer_agent
|
|
40
|
+
example: "Any buyer, creative agent, or DSP needing brand identity"
|
|
41
|
+
|
|
42
|
+
prerequisites:
|
|
43
|
+
description: |
|
|
44
|
+
The test kit provides a sample brand (Nova Motors) that any brand agent
|
|
45
|
+
can serve identity for.
|
|
46
|
+
test_kit: "test-kits/nova-motors.yaml"
|
|
47
|
+
|
|
48
|
+
phases:
|
|
49
|
+
- id: capability_discovery
|
|
50
|
+
title: "Capability discovery"
|
|
51
|
+
narrative: |
|
|
52
|
+
The buyer calls `get_adcp_capabilities` to confirm the agent declares
|
|
53
|
+
the brand protocol before issuing any brand-identity call.
|
|
54
|
+
|
|
55
|
+
steps:
|
|
56
|
+
- id: get_capabilities
|
|
57
|
+
title: "Check agent capabilities"
|
|
58
|
+
narrative: |
|
|
59
|
+
Verify that the agent declares `brand` in `supported_protocols`.
|
|
60
|
+
Without this claim the buyer MUST NOT send `get_brand_identity`.
|
|
61
|
+
task: get_adcp_capabilities
|
|
62
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
63
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
64
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
65
|
+
comply_scenario: capability_discovery
|
|
66
|
+
stateful: false
|
|
67
|
+
expected: |
|
|
68
|
+
Return capabilities declaring `brand` in `supported_protocols`.
|
|
69
|
+
|
|
70
|
+
sample_request:
|
|
71
|
+
context:
|
|
72
|
+
correlation_id: "brand_baseline--get_capabilities"
|
|
73
|
+
validations:
|
|
74
|
+
- check: response_schema
|
|
75
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
76
|
+
- check: field_present
|
|
77
|
+
path: "supported_protocols"
|
|
78
|
+
description: "Response declares supported_protocols"
|
|
79
|
+
|
|
80
|
+
- id: brand_identity_retrieval
|
|
81
|
+
title: "Brand identity retrieval"
|
|
82
|
+
narrative: |
|
|
83
|
+
The buyer calls `get_brand_identity` to retrieve the brand's identity
|
|
84
|
+
manifest. The minimum contract is a schema-valid response that echoes
|
|
85
|
+
the requested `brand_id` and carries at least one name.
|
|
86
|
+
|
|
87
|
+
steps:
|
|
88
|
+
- id: get_brand_identity
|
|
89
|
+
title: "Retrieve brand identity"
|
|
90
|
+
narrative: |
|
|
91
|
+
The buyer calls `get_brand_identity` with a known `brand_id`. The
|
|
92
|
+
response MUST match the brand-identity schema and echo the
|
|
93
|
+
requested `brand_id`. Rich fields (logos, colors, fonts, tone,
|
|
94
|
+
visual_guidelines) are optional at the baseline level — the
|
|
95
|
+
minimum bar is that identity resolution works and is schema-valid.
|
|
96
|
+
task: get_brand_identity
|
|
97
|
+
schema_ref: "brand/get-brand-identity-request.json"
|
|
98
|
+
response_schema_ref: "brand/get-brand-identity-response.json"
|
|
99
|
+
doc_ref: "/brand-protocol/tasks/get_brand_identity"
|
|
100
|
+
stateful: false
|
|
101
|
+
expected: |
|
|
102
|
+
Return a schema-valid brand identity that echoes the requested
|
|
103
|
+
brand_id and includes at least one name.
|
|
104
|
+
|
|
105
|
+
sample_request:
|
|
106
|
+
brand_id: "nova_motors"
|
|
107
|
+
context:
|
|
108
|
+
correlation_id: "brand_baseline--get_brand_identity"
|
|
109
|
+
context_outputs:
|
|
110
|
+
- path: "brand_id"
|
|
111
|
+
key: "brand_id"
|
|
112
|
+
|
|
113
|
+
validations:
|
|
114
|
+
- check: response_schema
|
|
115
|
+
description: "Response matches get-brand-identity-response.json schema"
|
|
116
|
+
- check: field_present
|
|
117
|
+
path: "brand_id"
|
|
118
|
+
description: "Response includes brand_id"
|
|
119
|
+
- check: field_value
|
|
120
|
+
path: "brand_id"
|
|
121
|
+
value: "nova_motors"
|
|
122
|
+
description: "Returned brand_id echoes the requested brand"
|
|
123
|
+
- check: field_present
|
|
124
|
+
path: "names"
|
|
125
|
+
description: "Response includes brand names"
|
|
126
|
+
|
|
127
|
+
- id: unknown_brand_rejection
|
|
128
|
+
title: "Unknown brand rejection"
|
|
129
|
+
narrative: |
|
|
130
|
+
Agents MUST reject unknown `brand_id` values with a structured
|
|
131
|
+
AdCP error rather than returning an empty or fabricated manifest.
|
|
132
|
+
|
|
133
|
+
steps:
|
|
134
|
+
- id: get_brand_identity_unknown
|
|
135
|
+
title: "Reject unknown brand ID"
|
|
136
|
+
narrative: |
|
|
137
|
+
The buyer calls `get_brand_identity` with a `brand_id` the agent
|
|
138
|
+
does not serve. The response MUST be a structured error with a
|
|
139
|
+
recovery classification — not a success response with empty
|
|
140
|
+
fields.
|
|
141
|
+
task: get_brand_identity
|
|
142
|
+
schema_ref: "brand/get-brand-identity-request.json"
|
|
143
|
+
response_schema_ref: "brand/get-brand-identity-response.json"
|
|
144
|
+
doc_ref: "/brand-protocol/tasks/get_brand_identity"
|
|
145
|
+
stateful: false
|
|
146
|
+
expected: |
|
|
147
|
+
Return an AdCP error response indicating the brand is not known
|
|
148
|
+
to this agent.
|
|
149
|
+
|
|
150
|
+
sample_request:
|
|
151
|
+
brand_id: "brand_that_does_not_exist_12345"
|
|
152
|
+
context:
|
|
153
|
+
correlation_id: "brand_baseline--get_brand_identity_unknown"
|
|
154
|
+
|
|
155
|
+
expect_error: true
|
|
156
|
+
negative_path: payload_well_formed
|
|
157
|
+
validations:
|
|
158
|
+
- check: error_code
|
|
159
|
+
allowed_values:
|
|
160
|
+
- "brand_not_found"
|
|
161
|
+
- "BRAND_NOT_FOUND"
|
|
162
|
+
- "NOT_FOUND"
|
|
163
|
+
description: "Error code indicates brand-not-found"
|