@adcp/sdk 6.7.0 → 6.9.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/ADCP_VERSION +1 -1
- package/bin/adcp.js +15 -3
- package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/inventory_list_targeting.yaml +5 -0
- package/compliance/cache/{3.0.5 → 3.0.6}/index.json +2 -2
- package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/inventory_list_targeting.yaml +5 -0
- package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-guaranteed/index.yaml +1 -1
- package/compliance/cache/{3.0.5 → 3.0.6}/universal/storyboard-schema.yaml +15 -0
- package/dist/lib/adapters/derived-account-store.d.ts +152 -0
- package/dist/lib/adapters/derived-account-store.d.ts.map +1 -0
- package/dist/lib/adapters/derived-account-store.js +135 -0
- package/dist/lib/adapters/derived-account-store.js.map +1 -0
- package/dist/lib/adapters/implicit-account-store.d.ts +3 -1
- package/dist/lib/adapters/implicit-account-store.d.ts.map +1 -1
- package/dist/lib/adapters/implicit-account-store.js +3 -1
- package/dist/lib/adapters/implicit-account-store.js.map +1 -1
- package/dist/lib/adapters/index.d.ts +1 -0
- package/dist/lib/adapters/index.d.ts.map +1 -1
- package/dist/lib/adapters/index.js +7 -1
- package/dist/lib/adapters/index.js.map +1 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.d.ts +3 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.d.ts.map +1 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.js +3 -1
- package/dist/lib/adapters/oauth-passthrough-resolver.js.map +1 -1
- package/dist/lib/adapters/roster-account-store.d.ts +85 -24
- package/dist/lib/adapters/roster-account-store.d.ts.map +1 -1
- package/dist/lib/adapters/roster-account-store.js +52 -30
- package/dist/lib/adapters/roster-account-store.js.map +1 -1
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/AgentClient.js +20 -0
- package/dist/lib/core/AgentClient.js.map +1 -1
- package/dist/lib/index.d.ts +3 -3
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +13 -8
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/mock-server/creative-ad-server/seed-data.d.ts +81 -0
- package/dist/lib/mock-server/creative-ad-server/seed-data.d.ts.map +1 -0
- package/dist/lib/mock-server/creative-ad-server/seed-data.js +200 -0
- package/dist/lib/mock-server/creative-ad-server/seed-data.js.map +1 -0
- package/dist/lib/mock-server/creative-ad-server/server.d.ts +39 -0
- package/dist/lib/mock-server/creative-ad-server/server.d.ts.map +1 -0
- package/dist/lib/mock-server/creative-ad-server/server.js +618 -0
- package/dist/lib/mock-server/creative-ad-server/server.js.map +1 -0
- package/dist/lib/mock-server/creative-template/seed-data.d.ts +1 -1
- package/dist/lib/mock-server/creative-template/seed-data.d.ts.map +1 -1
- package/dist/lib/mock-server/creative-template/seed-data.js +53 -0
- package/dist/lib/mock-server/creative-template/seed-data.js.map +1 -1
- package/dist/lib/mock-server/creative-template/server.d.ts.map +1 -1
- package/dist/lib/mock-server/creative-template/server.js +12 -0
- package/dist/lib/mock-server/creative-template/server.js.map +1 -1
- package/dist/lib/mock-server/index.d.ts.map +1 -1
- package/dist/lib/mock-server/index.js +180 -24
- package/dist/lib/mock-server/index.js.map +1 -1
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.d.ts +66 -0
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.d.ts.map +1 -0
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.js +193 -0
- package/dist/lib/mock-server/sales-non-guaranteed/seed-data.js.map +1 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.d.ts +33 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.d.ts.map +1 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.js +782 -0
- package/dist/lib/mock-server/sales-non-guaranteed/server.js.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.d.ts +50 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.d.ts.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.js +133 -0
- package/dist/lib/mock-server/sponsored-intelligence/seed-data.js.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.d.ts +13 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.d.ts.map +1 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.js +609 -0
- package/dist/lib/mock-server/sponsored-intelligence/server.js.map +1 -0
- package/dist/lib/protocols/mcp.d.ts.map +1 -1
- package/dist/lib/protocols/mcp.js +1 -41
- package/dist/lib/protocols/mcp.js.map +1 -1
- package/dist/lib/schemas-data/3.0/a2ui/bound-value.json +1 -1
- package/dist/lib/schemas-data/3.0/a2ui/component.json +1 -1
- package/dist/lib/schemas-data/3.0/a2ui/si-catalog.json +25 -25
- package/dist/lib/schemas-data/3.0/a2ui/surface.json +2 -2
- package/dist/lib/schemas-data/3.0/a2ui/user-action.json +1 -1
- package/dist/lib/schemas-data/3.0/account/get-account-financials-request.json +5 -5
- package/dist/lib/schemas-data/3.0/account/get-account-financials-response.json +10 -10
- package/dist/lib/schemas-data/3.0/account/list-accounts-request.json +4 -4
- package/dist/lib/schemas-data/3.0/account/list-accounts-response.json +6 -6
- package/dist/lib/schemas-data/3.0/account/report-usage-request.json +5 -5
- package/dist/lib/schemas-data/3.0/account/report-usage-response.json +4 -4
- package/dist/lib/schemas-data/3.0/account/sync-accounts-request.json +9 -9
- package/dist/lib/schemas-data/3.0/account/sync-accounts-response.json +12 -12
- package/dist/lib/schemas-data/3.0/account/sync-governance-request.json +5 -5
- package/dist/lib/schemas-data/3.0/account/sync-governance-response.json +8 -8
- package/dist/lib/schemas-data/3.0/adagents.json +32 -32
- package/dist/lib/schemas-data/3.0/brand/acquire-rights-request.json +8 -8
- package/dist/lib/schemas-data/3.0/brand/acquire-rights-response.json +14 -14
- package/dist/lib/schemas-data/3.0/brand/creative-approval-request.json +4 -4
- package/dist/lib/schemas-data/3.0/brand/creative-approval-response.json +10 -10
- package/dist/lib/schemas-data/3.0/brand/get-brand-identity-request.json +3 -3
- package/dist/lib/schemas-data/3.0/brand/get-brand-identity-response.json +8 -8
- package/dist/lib/schemas-data/3.0/brand/get-rights-request.json +7 -7
- package/dist/lib/schemas-data/3.0/brand/get-rights-response.json +9 -9
- package/dist/lib/schemas-data/3.0/brand/revocation-notification.json +4 -4
- package/dist/lib/schemas-data/3.0/brand/rights-pricing-option.json +5 -5
- package/dist/lib/schemas-data/3.0/brand/rights-terms.json +3 -3
- package/dist/lib/schemas-data/3.0/brand/update-rights-request.json +4 -4
- package/dist/lib/schemas-data/3.0/brand/update-rights-response.json +9 -9
- package/dist/lib/schemas-data/3.0/brand.json +14 -14
- package/dist/lib/schemas-data/3.0/bundled/content-standards/calibrate-content-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/calibrate-content-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/create-content-standards-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/create-content-standards-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/get-content-standards-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/get-content-standards-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/get-media-buy-artifacts-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/get-media-buy-artifacts-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/list-content-standards-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/list-content-standards-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/update-content-standards-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/update-content-standards-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/validate-content-delivery-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/content-standards/validate-content-delivery-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/core/tasks-get-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/core/tasks-get-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/core/tasks-list-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/core/tasks-list-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/get-creative-delivery-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/get-creative-delivery-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/get-creative-features-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/get-creative-features-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/list-creative-formats-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/list-creative-formats-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/list-creatives-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/list-creatives-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/preview-creative-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/preview-creative-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/sync-creatives-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/creative/sync-creatives-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/build-creative-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/build-creative-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/create-media-buy-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/create-media-buy-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-media-buy-delivery-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-media-buy-delivery-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-media-buys-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-media-buys-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-products-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/get-products-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/list-creative-formats-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/list-creative-formats-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/log-event-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/log-event-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/package-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/provide-performance-feedback-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/provide-performance-feedback-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-audiences-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-audiences-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-catalogs-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-catalogs-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-event-sources-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/sync-event-sources-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/update-media-buy-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/media-buy/update-media-buy-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/create-property-list-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/create-property-list-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/delete-property-list-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/delete-property-list-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/get-property-list-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/get-property-list-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/list-property-lists-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/list-property-lists-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/update-property-list-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/update-property-list-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/validate-property-delivery-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/property/validate-property-delivery-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/protocol/get-adcp-capabilities-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/protocol/get-adcp-capabilities-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/signals/activate-signal-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/signals/activate-signal-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/signals/get-signals-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/signals/get-signals-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-get-offering-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-get-offering-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-initiate-session-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-initiate-session-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-send-message-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-send-message-response.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-terminate-session-request.json +2 -2
- package/dist/lib/schemas-data/3.0/bundled/sponsored-intelligence/si-terminate-session-response.json +2 -2
- package/dist/lib/schemas-data/3.0/collection/base-collection-source.json +3 -3
- package/dist/lib/schemas-data/3.0/collection/collection-list-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.0/collection/collection-list-filters.json +7 -7
- package/dist/lib/schemas-data/3.0/collection/collection-list.json +5 -5
- package/dist/lib/schemas-data/3.0/collection/create-collection-list-request.json +7 -7
- package/dist/lib/schemas-data/3.0/collection/create-collection-list-response.json +4 -4
- package/dist/lib/schemas-data/3.0/collection/delete-collection-list-request.json +4 -4
- package/dist/lib/schemas-data/3.0/collection/delete-collection-list-response.json +3 -3
- package/dist/lib/schemas-data/3.0/collection/get-collection-list-request.json +4 -4
- package/dist/lib/schemas-data/3.0/collection/get-collection-list-response.json +10 -10
- package/dist/lib/schemas-data/3.0/collection/list-collection-lists-request.json +5 -5
- package/dist/lib/schemas-data/3.0/collection/list-collection-lists-response.json +5 -5
- package/dist/lib/schemas-data/3.0/collection/update-collection-list-request.json +7 -7
- package/dist/lib/schemas-data/3.0/collection/update-collection-list-response.json +4 -4
- package/dist/lib/schemas-data/3.0/content-standards/artifact-webhook-payload.json +3 -3
- package/dist/lib/schemas-data/3.0/content-standards/artifact.json +7 -7
- package/dist/lib/schemas-data/3.0/content-standards/calibrate-content-request.json +4 -4
- package/dist/lib/schemas-data/3.0/content-standards/calibrate-content-response.json +8 -8
- package/dist/lib/schemas-data/3.0/content-standards/content-standards.json +7 -7
- package/dist/lib/schemas-data/3.0/content-standards/create-content-standards-request.json +7 -7
- package/dist/lib/schemas-data/3.0/content-standards/create-content-standards-response.json +6 -6
- package/dist/lib/schemas-data/3.0/content-standards/get-content-standards-request.json +3 -3
- package/dist/lib/schemas-data/3.0/content-standards/get-content-standards-response.json +7 -7
- package/dist/lib/schemas-data/3.0/content-standards/get-media-buy-artifacts-request.json +4 -4
- package/dist/lib/schemas-data/3.0/content-standards/get-media-buy-artifacts-response.json +8 -8
- package/dist/lib/schemas-data/3.0/content-standards/list-content-standards-request.json +5 -5
- package/dist/lib/schemas-data/3.0/content-standards/list-content-standards-response.json +8 -8
- package/dist/lib/schemas-data/3.0/content-standards/update-content-standards-request.json +7 -7
- package/dist/lib/schemas-data/3.0/content-standards/update-content-standards-response.json +6 -6
- package/dist/lib/schemas-data/3.0/content-standards/validate-content-delivery-request.json +4 -4
- package/dist/lib/schemas-data/3.0/content-standards/validate-content-delivery-response.json +8 -8
- package/dist/lib/schemas-data/3.0/core/account-ref.json +2 -2
- package/dist/lib/schemas-data/3.0/core/account.json +9 -9
- package/dist/lib/schemas-data/3.0/core/activation-key.json +1 -1
- package/dist/lib/schemas-data/3.0/core/ad-inventory-config.json +1 -1
- package/dist/lib/schemas-data/3.0/core/agent-encryption-key.json +1 -1
- package/dist/lib/schemas-data/3.0/core/agent-signing-key.json +1 -1
- package/dist/lib/schemas-data/3.0/core/app-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/assets/asset-union.json +15 -15
- package/dist/lib/schemas-data/3.0/core/assets/audio-asset.json +3 -3
- package/dist/lib/schemas-data/3.0/core/assets/brief-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/catalog-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/css-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/daast-asset.json +4 -4
- package/dist/lib/schemas-data/3.0/core/assets/html-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/image-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/javascript-asset.json +3 -3
- package/dist/lib/schemas-data/3.0/core/assets/markdown-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/text-asset.json +2 -2
- package/dist/lib/schemas-data/3.0/core/assets/url-asset.json +3 -3
- package/dist/lib/schemas-data/3.0/core/assets/vast-asset.json +4 -4
- package/dist/lib/schemas-data/3.0/core/assets/video-asset.json +7 -7
- package/dist/lib/schemas-data/3.0/core/assets/webhook-asset.json +7 -7
- package/dist/lib/schemas-data/3.0/core/async-response-data.json +25 -25
- package/dist/lib/schemas-data/3.0/core/attribution-window.json +4 -4
- package/dist/lib/schemas-data/3.0/core/audience-member.json +3 -3
- package/dist/lib/schemas-data/3.0/core/audience-selector.json +4 -4
- package/dist/lib/schemas-data/3.0/core/brand-id.json +1 -1
- package/dist/lib/schemas-data/3.0/core/brand-ref.json +2 -2
- package/dist/lib/schemas-data/3.0/core/business-entity.json +2 -2
- package/dist/lib/schemas-data/3.0/core/cancellation-policy.json +2 -2
- package/dist/lib/schemas-data/3.0/core/catalog-field-mapping.json +2 -2
- package/dist/lib/schemas-data/3.0/core/catalog.json +7 -7
- package/dist/lib/schemas-data/3.0/core/catchment.json +5 -5
- package/dist/lib/schemas-data/3.0/core/collection-distribution.json +2 -2
- package/dist/lib/schemas-data/3.0/core/collection-list-ref.json +1 -1
- package/dist/lib/schemas-data/3.0/core/collection-selector.json +1 -1
- package/dist/lib/schemas-data/3.0/core/collection.json +13 -13
- package/dist/lib/schemas-data/3.0/core/content-rating.json +2 -2
- package/dist/lib/schemas-data/3.0/core/context.json +1 -1
- package/dist/lib/schemas-data/3.0/core/creative-asset.json +6 -6
- package/dist/lib/schemas-data/3.0/core/creative-assignment.json +1 -1
- package/dist/lib/schemas-data/3.0/core/creative-brief.json +4 -4
- package/dist/lib/schemas-data/3.0/core/creative-consumption.json +1 -1
- package/dist/lib/schemas-data/3.0/core/creative-filters.json +4 -4
- package/dist/lib/schemas-data/3.0/core/creative-item.json +1 -1
- package/dist/lib/schemas-data/3.0/core/creative-manifest.json +7 -7
- package/dist/lib/schemas-data/3.0/core/creative-policy.json +3 -3
- package/dist/lib/schemas-data/3.0/core/creative-variable.json +1 -1
- package/dist/lib/schemas-data/3.0/core/creative-variant.json +5 -5
- package/dist/lib/schemas-data/3.0/core/data-provider-signal-selector.json +1 -1
- package/dist/lib/schemas-data/3.0/core/date-range.json +1 -1
- package/dist/lib/schemas-data/3.0/core/datetime-range.json +1 -1
- package/dist/lib/schemas-data/3.0/core/daypart-target.json +2 -2
- package/dist/lib/schemas-data/3.0/core/deadline-policy.json +1 -1
- package/dist/lib/schemas-data/3.0/core/delivery-forecast.json +7 -7
- package/dist/lib/schemas-data/3.0/core/delivery-metrics.json +5 -5
- package/dist/lib/schemas-data/3.0/core/deployment.json +3 -3
- package/dist/lib/schemas-data/3.0/core/destination-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/destination.json +1 -1
- package/dist/lib/schemas-data/3.0/core/diagnostic-issue.json +1 -1
- package/dist/lib/schemas-data/3.0/core/duration.json +1 -1
- package/dist/lib/schemas-data/3.0/core/education-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/error.json +1 -1
- package/dist/lib/schemas-data/3.0/core/event-custom-data.json +2 -2
- package/dist/lib/schemas-data/3.0/core/event-source-health.json +3 -3
- package/dist/lib/schemas-data/3.0/core/event.json +6 -6
- package/dist/lib/schemas-data/3.0/core/ext.json +1 -1
- package/dist/lib/schemas-data/3.0/core/feature-requirement.json +1 -1
- package/dist/lib/schemas-data/3.0/core/flight-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/forecast-point.json +18 -18
- package/dist/lib/schemas-data/3.0/core/forecast-range.json +1 -1
- package/dist/lib/schemas-data/3.0/core/format-id.json +1 -1
- package/dist/lib/schemas-data/3.0/core/format.json +42 -42
- package/dist/lib/schemas-data/3.0/core/frequency-cap.json +4 -4
- package/dist/lib/schemas-data/3.0/core/generation-credential.json +3 -3
- package/dist/lib/schemas-data/3.0/core/geo-breakdown-support.json +3 -3
- package/dist/lib/schemas-data/3.0/core/hotel-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/identifier.json +2 -2
- package/dist/lib/schemas-data/3.0/core/industry-identifier.json +2 -2
- package/dist/lib/schemas-data/3.0/core/insertion-order.json +1 -1
- package/dist/lib/schemas-data/3.0/core/installment-deadlines.json +2 -2
- package/dist/lib/schemas-data/3.0/core/installment.json +9 -9
- package/dist/lib/schemas-data/3.0/core/job-item.json +3 -3
- package/dist/lib/schemas-data/3.0/core/limited-series.json +1 -1
- package/dist/lib/schemas-data/3.0/core/material-deadline.json +1 -1
- package/dist/lib/schemas-data/3.0/core/mcp-webhook-payload.json +5 -5
- package/dist/lib/schemas-data/3.0/core/measurement-readiness.json +5 -5
- package/dist/lib/schemas-data/3.0/core/measurement-terms.json +3 -3
- package/dist/lib/schemas-data/3.0/core/measurement-window.json +1 -1
- package/dist/lib/schemas-data/3.0/core/media-buy-features.json +1 -1
- package/dist/lib/schemas-data/3.0/core/media-buy.json +7 -7
- package/dist/lib/schemas-data/3.0/core/offering-asset-group.json +15 -15
- package/dist/lib/schemas-data/3.0/core/offering.json +5 -5
- package/dist/lib/schemas-data/3.0/core/optimization-goal.json +6 -6
- package/dist/lib/schemas-data/3.0/core/outcome-measurement.json +2 -2
- package/dist/lib/schemas-data/3.0/core/overlay.json +1 -1
- package/dist/lib/schemas-data/3.0/core/package.json +14 -14
- package/dist/lib/schemas-data/3.0/core/pagination-request.json +1 -1
- package/dist/lib/schemas-data/3.0/core/pagination-response.json +1 -1
- package/dist/lib/schemas-data/3.0/core/performance-feedback.json +3 -3
- package/dist/lib/schemas-data/3.0/core/performance-standard.json +4 -4
- package/dist/lib/schemas-data/3.0/core/placement-definition.json +5 -5
- package/dist/lib/schemas-data/3.0/core/placement.json +2 -2
- package/dist/lib/schemas-data/3.0/core/planned-delivery.json +5 -5
- package/dist/lib/schemas-data/3.0/core/price.json +1 -1
- package/dist/lib/schemas-data/3.0/core/pricing-option.json +10 -10
- package/dist/lib/schemas-data/3.0/core/product-allocation.json +4 -4
- package/dist/lib/schemas-data/3.0/core/product-filters.json +16 -16
- package/dist/lib/schemas-data/3.0/core/product.json +28 -28
- package/dist/lib/schemas-data/3.0/core/property-id.json +1 -1
- package/dist/lib/schemas-data/3.0/core/property-list-ref.json +1 -1
- package/dist/lib/schemas-data/3.0/core/property-tag.json +1 -1
- package/dist/lib/schemas-data/3.0/core/property.json +6 -6
- package/dist/lib/schemas-data/3.0/core/proposal.json +6 -6
- package/dist/lib/schemas-data/3.0/core/protocol-envelope.json +3 -3
- package/dist/lib/schemas-data/3.0/core/provenance.json +6 -6
- package/dist/lib/schemas-data/3.0/core/publisher-property-selector.json +3 -3
- package/dist/lib/schemas-data/3.0/core/push-notification-config.json +2 -2
- package/dist/lib/schemas-data/3.0/core/real-estate-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/reference-asset.json +1 -1
- package/dist/lib/schemas-data/3.0/core/reporting-capabilities.json +5 -5
- package/dist/lib/schemas-data/3.0/core/reporting-webhook.json +3 -3
- package/dist/lib/schemas-data/3.0/core/requirements/asset-requirements.json +13 -13
- package/dist/lib/schemas-data/3.0/core/requirements/audio-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/catalog-field-binding.json +4 -4
- package/dist/lib/schemas-data/3.0/core/requirements/catalog-requirements.json +5 -5
- package/dist/lib/schemas-data/3.0/core/requirements/css-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/daast-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/html-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/image-asset-requirements.json +2 -2
- package/dist/lib/schemas-data/3.0/core/requirements/javascript-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/markdown-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/offering-asset-constraint.json +4 -4
- package/dist/lib/schemas-data/3.0/core/requirements/text-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/url-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/vast-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/requirements/video-asset-requirements.json +6 -6
- package/dist/lib/schemas-data/3.0/core/requirements/webhook-asset-requirements.json +1 -1
- package/dist/lib/schemas-data/3.0/core/response.json +1 -1
- package/dist/lib/schemas-data/3.0/core/rights-constraint.json +4 -4
- package/dist/lib/schemas-data/3.0/core/seller-agent-ref.json +1 -1
- package/dist/lib/schemas-data/3.0/core/signal-definition.json +3 -3
- package/dist/lib/schemas-data/3.0/core/signal-filters.json +2 -2
- package/dist/lib/schemas-data/3.0/core/signal-id.json +1 -1
- package/dist/lib/schemas-data/3.0/core/signal-pricing-option.json +2 -2
- package/dist/lib/schemas-data/3.0/core/signal-pricing.json +6 -6
- package/dist/lib/schemas-data/3.0/core/signal-targeting.json +4 -4
- package/dist/lib/schemas-data/3.0/core/special.json +2 -2
- package/dist/lib/schemas-data/3.0/core/start-timing.json +1 -1
- package/dist/lib/schemas-data/3.0/core/store-item.json +3 -3
- package/dist/lib/schemas-data/3.0/core/talent.json +2 -2
- package/dist/lib/schemas-data/3.0/core/targeting.json +20 -20
- package/dist/lib/schemas-data/3.0/core/tasks-get-request.json +3 -3
- package/dist/lib/schemas-data/3.0/core/tasks-get-response.json +7 -7
- package/dist/lib/schemas-data/3.0/core/tasks-list-request.json +11 -11
- package/dist/lib/schemas-data/3.0/core/tasks-list-response.json +6 -6
- package/dist/lib/schemas-data/3.0/core/user-match.json +3 -3
- package/dist/lib/schemas-data/3.0/core/vehicle-item.json +4 -4
- package/dist/lib/schemas-data/3.0/core/vendor-pricing-option.json +2 -2
- package/dist/lib/schemas-data/3.0/core/x-entity-types.json +1 -1
- package/dist/lib/schemas-data/3.0/creative/asset-types/index.json +5 -5
- package/dist/lib/schemas-data/3.0/creative/creative-feature-result.json +2 -2
- package/dist/lib/schemas-data/3.0/creative/get-creative-delivery-request.json +5 -5
- package/dist/lib/schemas-data/3.0/creative/get-creative-delivery-response.json +7 -7
- package/dist/lib/schemas-data/3.0/creative/get-creative-features-request.json +5 -5
- package/dist/lib/schemas-data/3.0/creative/get-creative-features-response.json +8 -8
- package/dist/lib/schemas-data/3.0/creative/list-creative-formats-request.json +11 -11
- package/dist/lib/schemas-data/3.0/creative/list-creative-formats-response.json +7 -7
- package/dist/lib/schemas-data/3.0/creative/list-creatives-request.json +8 -8
- package/dist/lib/schemas-data/3.0/creative/list-creatives-response.json +14 -14
- package/dist/lib/schemas-data/3.0/creative/preview-creative-request.json +11 -11
- package/dist/lib/schemas-data/3.0/creative/preview-creative-response.json +12 -12
- package/dist/lib/schemas-data/3.0/creative/preview-render.json +1 -1
- package/dist/lib/schemas-data/3.0/creative/sync-creatives-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.0/creative/sync-creatives-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/creative/sync-creatives-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/creative/sync-creatives-request.json +7 -7
- package/dist/lib/schemas-data/3.0/creative/sync-creatives-response.json +13 -13
- package/dist/lib/schemas-data/3.0/enums/account-scope.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/account-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/action-source.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/adcp-protocol.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/adjustment-kind.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/advertiser-industry.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/age-verification-method.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/assessment-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/asset-content-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/attribution-model.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/audience-source.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/audience-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/audio-channel-layout.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/auth-scheme.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/available-metric.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/billing-party.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/binary-verdict.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/brand-agent-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/canceled-by.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/catalog-action.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/catalog-item-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/catalog-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/channels.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/cloud-storage-protocol.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/co-branding-requirement.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/collection-cadence.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/collection-kind.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/collection-relationship.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/collection-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/consent-basis.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/content-id-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/content-rating-system.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-action.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-agent-capability.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-approval-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-identifier-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-quality.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-sort-field.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/creative-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/daast-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/daast-version.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/day-of-week.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/delegation-authority.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/delivery-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/demographic-system.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/derivative-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/device-platform.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/device-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/digital-source-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/dimension-unit.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/disclosure-persistence.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/disclosure-position.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/distance-unit.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/distribution-identifier-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/error-code.json +3 -3
- package/dist/lib/schemas-data/3.0/enums/escalation-severity.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/event-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/exclusivity.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/feature-check-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/feed-format.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/feedback-source.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/forecast-method.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/forecast-range-unit.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/forecastable-metric.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/format-id-parameter.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/frame-rate-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/frequency-cap-scope.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/genre-taxonomy.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/geo-level.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/gop-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/governance-decision.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/governance-domain.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/governance-mode.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/governance-phase.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/history-entry-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/http-method.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/identifier-types.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/installment-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/javascript-module-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/landing-page-requirement.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/makegood-remedy.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/markdown-flavor.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/match-id-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/match-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/media-buy-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/media-buy-valid-action.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/metric-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/metro-system.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/moov-atom-position.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/notification-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/outcome-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/pacing.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/payment-terms.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/performance-standard-metric.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/policy-category.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/policy-enforcement.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/postal-system.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/preview-output-format.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/pricing-model.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/production-quality.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/property-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/proposal-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/publisher-identifier-types.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/purchase-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/reach-unit.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/reporting-frequency.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/response-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/restricted-attribute.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/right-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/right-use.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/rights-billing-period.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/scan-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/si-session-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/signal-catalog-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/signal-source.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/signal-value-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/snapshot-unavailable-reason.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/sort-direction.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/sort-metric.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/special-category.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/specialism.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/talent-role.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/task-status.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/task-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/transport-mode.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/travel-time-unit.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/uid-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/universal-macro.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/update-frequency.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/url-asset-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/validation-mode.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/vast-tracking-event.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/vast-version.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/viewability-standard.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/wcag-level.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/webhook-response-type.json +1 -1
- package/dist/lib/schemas-data/3.0/enums/webhook-security-method.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/account-setup-required.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/audience-too-small.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/budget-too-low.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/conflict.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/creative-rejected.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/policy-violation.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/rate-limited.json +1 -1
- package/dist/lib/schemas-data/3.0/error-details/vendor-error-codes.json +1 -1
- package/dist/lib/schemas-data/3.0/extensions/extension-meta.json +1 -1
- package/dist/lib/schemas-data/3.0/extensions/index.json +2 -2
- package/dist/lib/schemas-data/3.0/governance/attribute-definition.json +1 -1
- package/dist/lib/schemas-data/3.0/governance/audience-constraints.json +3 -3
- package/dist/lib/schemas-data/3.0/governance/check-governance-request.json +7 -7
- package/dist/lib/schemas-data/3.0/governance/check-governance-response.json +6 -6
- package/dist/lib/schemas-data/3.0/governance/get-plan-audit-logs-request.json +4 -4
- package/dist/lib/schemas-data/3.0/governance/get-plan-audit-logs-response.json +9 -9
- package/dist/lib/schemas-data/3.0/governance/policy-category-definition.json +2 -2
- package/dist/lib/schemas-data/3.0/governance/policy-entry.json +6 -6
- package/dist/lib/schemas-data/3.0/governance/policy-ref.json +1 -1
- package/dist/lib/schemas-data/3.0/governance/report-plan-outcome-request.json +6 -6
- package/dist/lib/schemas-data/3.0/governance/report-plan-outcome-response.json +4 -4
- package/dist/lib/schemas-data/3.0/governance/sync-plans-request.json +13 -13
- package/dist/lib/schemas-data/3.0/governance/sync-plans-response.json +4 -4
- package/dist/lib/schemas-data/3.0/index.json +364 -364
- package/dist/lib/schemas-data/3.0/manifest.json +5 -5
- package/dist/lib/schemas-data/3.0/manifest.schema.json +1 -1
- package/dist/lib/schemas-data/3.0/media-buy/build-creative-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.0/media-buy/build-creative-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/build-creative-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/build-creative-request.json +11 -11
- package/dist/lib/schemas-data/3.0/media-buy/build-creative-response.json +17 -17
- package/dist/lib/schemas-data/3.0/media-buy/create-media-buy-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.0/media-buy/create-media-buy-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/create-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/create-media-buy-request.json +12 -12
- package/dist/lib/schemas-data/3.0/media-buy/create-media-buy-response.json +15 -15
- package/dist/lib/schemas-data/3.0/media-buy/get-media-buy-delivery-request.json +17 -17
- package/dist/lib/schemas-data/3.0/media-buy/get-media-buy-delivery-response.json +24 -24
- package/dist/lib/schemas-data/3.0/media-buy/get-media-buys-request.json +7 -7
- package/dist/lib/schemas-data/3.0/media-buy/get-media-buys-response.json +19 -19
- package/dist/lib/schemas-data/3.0/media-buy/get-products-async-response-input-required.json +4 -4
- package/dist/lib/schemas-data/3.0/media-buy/get-products-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/get-products-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/get-products-request.json +11 -11
- package/dist/lib/schemas-data/3.0/media-buy/get-products-response.json +8 -8
- package/dist/lib/schemas-data/3.0/media-buy/list-creative-formats-request.json +11 -11
- package/dist/lib/schemas-data/3.0/media-buy/list-creative-formats-response.json +7 -7
- package/dist/lib/schemas-data/3.0/media-buy/log-event-request.json +4 -4
- package/dist/lib/schemas-data/3.0/media-buy/log-event-response.json +6 -6
- package/dist/lib/schemas-data/3.0/media-buy/package-request.json +12 -12
- package/dist/lib/schemas-data/3.0/media-buy/package-update.json +13 -13
- package/dist/lib/schemas-data/3.0/media-buy/provide-performance-feedback-request.json +6 -6
- package/dist/lib/schemas-data/3.0/media-buy/provide-performance-feedback-response.json +6 -6
- package/dist/lib/schemas-data/3.0/media-buy/sync-audiences-request.json +7 -7
- package/dist/lib/schemas-data/3.0/media-buy/sync-audiences-response.json +9 -9
- package/dist/lib/schemas-data/3.0/media-buy/sync-catalogs-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/sync-catalogs-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/sync-catalogs-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/sync-catalogs-request.json +7 -7
- package/dist/lib/schemas-data/3.0/media-buy/sync-catalogs-response.json +9 -9
- package/dist/lib/schemas-data/3.0/media-buy/sync-event-sources-request.json +5 -5
- package/dist/lib/schemas-data/3.0/media-buy/sync-event-sources-response.json +10 -10
- package/dist/lib/schemas-data/3.0/media-buy/update-media-buy-async-response-input-required.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/update-media-buy-async-response-submitted.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/update-media-buy-async-response-working.json +3 -3
- package/dist/lib/schemas-data/3.0/media-buy/update-media-buy-request.json +10 -10
- package/dist/lib/schemas-data/3.0/media-buy/update-media-buy-response.json +10 -10
- package/dist/lib/schemas-data/3.0/pricing-options/cpa-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/cpc-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/cpcv-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/cpm-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/cpp-option.json +5 -5
- package/dist/lib/schemas-data/3.0/pricing-options/cpv-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/flat-rate-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/price-breakdown.json +2 -2
- package/dist/lib/schemas-data/3.0/pricing-options/price-guidance.json +1 -1
- package/dist/lib/schemas-data/3.0/pricing-options/time-option.json +4 -4
- package/dist/lib/schemas-data/3.0/pricing-options/vcpm-option.json +4 -4
- package/dist/lib/schemas-data/3.0/property/authorization-result.json +1 -1
- package/dist/lib/schemas-data/3.0/property/base-property-source.json +4 -4
- package/dist/lib/schemas-data/3.0/property/create-property-list-request.json +7 -7
- package/dist/lib/schemas-data/3.0/property/create-property-list-response.json +4 -4
- package/dist/lib/schemas-data/3.0/property/delete-property-list-request.json +4 -4
- package/dist/lib/schemas-data/3.0/property/delete-property-list-response.json +3 -3
- package/dist/lib/schemas-data/3.0/property/delivery-record.json +3 -3
- package/dist/lib/schemas-data/3.0/property/get-property-list-request.json +4 -4
- package/dist/lib/schemas-data/3.0/property/get-property-list-response.json +7 -7
- package/dist/lib/schemas-data/3.0/property/list-property-lists-request.json +5 -5
- package/dist/lib/schemas-data/3.0/property/list-property-lists-response.json +5 -5
- package/dist/lib/schemas-data/3.0/property/property-error.json +2 -2
- package/dist/lib/schemas-data/3.0/property/property-feature-definition.json +2 -2
- package/dist/lib/schemas-data/3.0/property/property-feature-result.json +4 -4
- package/dist/lib/schemas-data/3.0/property/property-feature-value.json +2 -2
- package/dist/lib/schemas-data/3.0/property/property-feature.json +1 -1
- package/dist/lib/schemas-data/3.0/property/property-list-changed-webhook.json +2 -2
- package/dist/lib/schemas-data/3.0/property/property-list-filters.json +5 -5
- package/dist/lib/schemas-data/3.0/property/property-list.json +6 -6
- package/dist/lib/schemas-data/3.0/property/update-property-list-request.json +7 -7
- package/dist/lib/schemas-data/3.0/property/update-property-list-response.json +4 -4
- package/dist/lib/schemas-data/3.0/property/validate-property-delivery-request.json +5 -5
- package/dist/lib/schemas-data/3.0/property/validate-property-delivery-response.json +4 -4
- package/dist/lib/schemas-data/3.0/property/validation-result.json +5 -5
- package/dist/lib/schemas-data/3.0/protocol/get-adcp-capabilities-request.json +3 -3
- package/dist/lib/schemas-data/3.0/protocol/get-adcp-capabilities-response.json +25 -25
- package/dist/lib/schemas-data/3.0/signals/activate-signal-request.json +5 -5
- package/dist/lib/schemas-data/3.0/signals/activate-signal-response.json +7 -7
- package/dist/lib/schemas-data/3.0/signals/get-signals-request.json +8 -8
- package/dist/lib/schemas-data/3.0/signals/get-signals-response.json +10 -10
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-capabilities.json +1 -1
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-get-offering-request.json +3 -3
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-get-offering-response.json +4 -4
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-identity.json +1 -1
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-initiate-session-request.json +5 -5
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-initiate-session-response.json +7 -7
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-send-message-request.json +3 -3
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-send-message-response.json +7 -7
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-terminate-session-request.json +3 -3
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-terminate-session-response.json +5 -5
- package/dist/lib/schemas-data/3.0/sponsored-intelligence/si-ui-element.json +1 -1
- package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
- package/dist/lib/server/account-mode.d.ts +113 -0
- package/dist/lib/server/account-mode.d.ts.map +1 -0
- package/dist/lib/server/account-mode.js +125 -0
- package/dist/lib/server/account-mode.js.map +1 -0
- package/dist/lib/server/adcp-server.js +41 -0
- package/dist/lib/server/adcp-server.js.map +1 -1
- package/dist/lib/server/auth.d.ts +35 -0
- package/dist/lib/server/auth.d.ts.map +1 -1
- package/dist/lib/server/auth.js.map +1 -1
- package/dist/lib/server/create-adcp-server.d.ts +26 -9
- package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
- package/dist/lib/server/create-adcp-server.js +46 -20
- package/dist/lib/server/create-adcp-server.js.map +1 -1
- package/dist/lib/server/ctx-metadata/store.d.ts +1 -1
- package/dist/lib/server/ctx-metadata/store.d.ts.map +1 -1
- package/dist/lib/server/ctx-metadata/store.js +1 -0
- package/dist/lib/server/ctx-metadata/store.js.map +1 -1
- package/dist/lib/server/decisioning/account.d.ts +19 -0
- package/dist/lib/server/decisioning/account.d.ts.map +1 -1
- package/dist/lib/server/decisioning/account.js.map +1 -1
- package/dist/lib/server/decisioning/buyer-agent.d.ts +37 -4
- package/dist/lib/server/decisioning/buyer-agent.d.ts.map +1 -1
- package/dist/lib/server/decisioning/buyer-agent.js +12 -2
- package/dist/lib/server/decisioning/buyer-agent.js.map +1 -1
- package/dist/lib/server/decisioning/compose.d.ts +33 -2
- package/dist/lib/server/decisioning/compose.d.ts.map +1 -1
- package/dist/lib/server/decisioning/compose.js +13 -46
- package/dist/lib/server/decisioning/compose.js.map +1 -1
- package/dist/lib/server/decisioning/index.d.ts +2 -1
- package/dist/lib/server/decisioning/index.d.ts.map +1 -1
- package/dist/lib/server/decisioning/index.js +2 -1
- package/dist/lib/server/decisioning/index.js.map +1 -1
- package/dist/lib/server/decisioning/platform-helpers.d.ts +18 -0
- package/dist/lib/server/decisioning/platform-helpers.d.ts.map +1 -1
- package/dist/lib/server/decisioning/platform-helpers.js +20 -0
- package/dist/lib/server/decisioning/platform-helpers.js.map +1 -1
- package/dist/lib/server/decisioning/platform.d.ts +19 -21
- package/dist/lib/server/decisioning/platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/entity-hydration.generated.js +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/from-platform.js +369 -54
- package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/observed-modes.d.ts +40 -0
- package/dist/lib/server/decisioning/runtime/observed-modes.d.ts.map +1 -0
- package/dist/lib/server/decisioning/runtime/observed-modes.js +82 -0
- package/dist/lib/server/decisioning/runtime/observed-modes.js.map +1 -0
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.js +2 -2
- package/dist/lib/server/decisioning/runtime/protocol-for-tool.js.map +1 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.d.ts.map +1 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.js +9 -1
- package/dist/lib/server/decisioning/runtime/validate-platform.js.map +1 -1
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.d.ts +125 -0
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.d.ts.map +1 -0
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.js +52 -0
- package/dist/lib/server/decisioning/specialisms/sponsored-intelligence.js.map +1 -0
- package/dist/lib/server/decisioning/tenant-registry.d.ts +16 -0
- package/dist/lib/server/decisioning/tenant-registry.d.ts.map +1 -1
- package/dist/lib/server/decisioning/tenant-registry.js.map +1 -1
- package/dist/lib/server/index.d.ts +5 -1
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +15 -3
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/serve.js +20 -2
- package/dist/lib/server/serve.js.map +1 -1
- package/dist/lib/server/socket-mode/conformance-client.d.ts +83 -0
- package/dist/lib/server/socket-mode/conformance-client.d.ts.map +1 -0
- package/dist/lib/server/socket-mode/conformance-client.js +117 -0
- package/dist/lib/server/socket-mode/conformance-client.js.map +1 -0
- package/dist/lib/server/socket-mode/index.d.ts +15 -0
- package/dist/lib/server/socket-mode/index.d.ts.map +1 -0
- package/dist/lib/server/socket-mode/index.js +20 -0
- package/dist/lib/server/socket-mode/index.js.map +1 -0
- package/dist/lib/server/socket-mode/ws-transport.d.ts +26 -0
- package/dist/lib/server/socket-mode/ws-transport.d.ts.map +1 -0
- package/dist/lib/server/socket-mode/ws-transport.js +93 -0
- package/dist/lib/server/socket-mode/ws-transport.js.map +1 -0
- package/dist/lib/server/test-controller.d.ts +3 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -1
- package/dist/lib/server/test-controller.js +23 -20
- package/dist/lib/server/test-controller.js.map +1 -1
- package/dist/lib/testing/comply-controller.d.ts +65 -3
- package/dist/lib/testing/comply-controller.d.ts.map +1 -1
- package/dist/lib/testing/comply-controller.js +32 -3
- package/dist/lib/testing/comply-controller.js.map +1 -1
- package/dist/lib/testing/index.d.ts +1 -1
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.js +63 -40
- package/dist/lib/testing/storyboard/request-builder.js.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.js +36 -54
- package/dist/lib/testing/storyboard/validations.js.map +1 -1
- package/dist/lib/testing/test-controller.d.ts +10 -4
- package/dist/lib/testing/test-controller.d.ts.map +1 -1
- package/dist/lib/testing/test-controller.js +9 -3
- package/dist/lib/testing/test-controller.js.map +1 -1
- package/dist/lib/types/core.generated.d.ts +54 -14
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +2 -2
- package/dist/lib/types/error-codes.d.ts +2 -2
- package/dist/lib/types/index.d.ts +4 -3
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js +3 -0
- package/dist/lib/types/index.js.map +1 -1
- package/dist/lib/types/manifest.generated.d.ts +5 -5
- package/dist/lib/types/manifest.generated.js +3 -3
- package/dist/lib/types/manifest.generated.js.map +1 -1
- package/dist/lib/types/schemas.generated.d.ts +465 -381
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +171 -143
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +42 -14
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/glob.d.ts +4 -2
- package/dist/lib/utils/glob.d.ts.map +1 -1
- package/dist/lib/utils/glob.js +4 -2
- package/dist/lib/utils/glob.js.map +1 -1
- package/dist/lib/version.d.ts +7 -7
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +6 -5
- package/dist/lib/version.js.map +1 -1
- package/docs/llms.txt +5 -4
- package/examples/README.md +29 -13
- package/examples/hello-cluster.ts +62 -23
- package/examples/hello_creative_adapter_ad_server.ts +809 -0
- package/examples/hello_creative_adapter_template.ts +61 -6
- package/examples/hello_seller_adapter_guaranteed.ts +158 -25
- package/examples/hello_seller_adapter_multi_tenant.ts +39 -5
- package/examples/hello_seller_adapter_non_guaranteed.ts +1071 -0
- package/examples/hello_seller_adapter_social.ts +1 -1
- package/examples/hello_si_adapter_brand.ts +572 -0
- package/examples/hello_signals_adapter_marketplace.ts +34 -29
- package/package.json +7 -5
- package/skills/SHAPE-GOTCHAS.md +18 -0
- package/skills/build-brand-rights-agent/SKILL.md +61 -597
- package/skills/build-creative-agent/SKILL.md +69 -830
- package/skills/build-generative-seller-agent/SKILL.md +43 -577
- package/skills/build-governance-agent/SKILL.md +63 -950
- package/skills/build-holdco-agent/SKILL.md +8 -0
- package/skills/build-retail-media-agent/SKILL.md +46 -478
- package/skills/build-seller-agent/SKILL.md +53 -1795
- package/skills/build-seller-agent/specialisms/sales-non-guaranteed.md +9 -31
- package/skills/build-si-agent/SKILL.md +55 -318
- package/skills/build-signals-agent/SKILL.md +49 -537
- package/skills/call-adcp-agent/SKILL.md +7 -1
- package/skills/cross-cutting.md +84 -0
- package/skills/call-adcp-agent.previous/SKILL.md +0 -261
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/brand/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/creative/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/governance/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/creative-reception.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/signals/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/domains/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/brand/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/creative/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/governance/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/creative-reception.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/create_media_buy_async.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/delivery_reporting.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/governance_approved.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/governance_conditions.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/governance_denied_recovery.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/invalid_transitions.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/inventory_list_no_match.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/measurement_terms_rejected.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/pending_creatives_to_start.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/proposal_finalize.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/scenarios/refine_products.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/media-buy/state-machine.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/signals/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/protocols/sponsored-intelligence/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/audience-sync/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/brand-rights/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/brand-rights/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/collection-lists/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/content-standards/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/creative-ad-server/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/creative-generative/generative-seller.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/creative-generative/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/creative-template/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/governance-aware-seller/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/governance-delivery-monitor/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/governance-spend-authority/denied.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/governance-spend-authority/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/property-lists/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-broadcast-tv/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-catalog-driven/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-non-guaranteed/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-proposal-mode/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/sales-social/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/signal-marketplace/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/signal-marketplace/scenarios/governance_denied.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/specialisms/signal-owned/index.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/acme-outdoor.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/bistro-oranje.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/nova-motors.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/osei-natural.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/signed-requests-runner.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/substitution-observer-runner.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/summit-foods.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-kits/webhook-receiver-runner.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/001-minimal-plan.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/002-full-plan.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/003-bookkeeping-stripped.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/004a-human-review-omitted.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/004b-human-review-explicit-null.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/005a-policy-categories-order-1.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/005b-policy-categories-order-2.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/006a-ext-trace-v1.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/006b-ext-trace-v2.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/007-unicode-objectives.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/plan-hash/008-numeric-canonicalization.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/README.md +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/canonicalization.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/keys.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/001-no-signature-header.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/002-wrong-tag.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/003-expired-signature.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/004-window-too-long.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/005-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/006-missing-covered-component.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/007-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/008-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/009-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/010-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/011-malformed-header.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/018-digest-covered-when-forbidden.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/019-signature-without-signature-input.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/020-rate-abuse.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/021-duplicate-signature-input-label.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/022-multi-valued-content-type.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/023-multi-valued-content-digest.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/024-unquoted-string-param.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/025-jwk-alg-crv-mismatch.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/026-non-ascii-host.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/negative/027-webhook-registration-authentication-unsigned.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/002-post-with-content-digest.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/003-es256-post.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/004-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/005-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/006-dot-segment-path.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/007-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/008-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/009-percent-encoded-unreserved-decoded.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/010-percent-encoded-slash-preserved.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/011-ipv6-authority.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/request-signing/positive/012-ipv6-authority-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/README.md +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/keys.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/001-wrong-tag.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/002-expired-signature.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/003-window-too-long.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/004-alg-not-allowed.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/005-missing-authority-component.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/006-missing-content-digest.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/007-unknown-keyid.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/008-wrong-adcp-use.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/009-content-digest-mismatch.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/010-malformed-signature-input.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/011-signature-without-input.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/012-missing-expires-param.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/013-expires-le-created.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/014-missing-nonce-param.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/015-signature-invalid.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/016-replayed-nonce.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/017-key-revoked.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/018-rate-abuse.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/019-revocation-stale.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/020-key-ops-missing-verify.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/negative/021-base64-alphabet-mixing.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/001-basic-post.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/002-es256-post.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/003-multiple-signature-labels.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/004-default-port-stripped.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/005-percent-encoded-path.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/006-query-byte-preserved.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/test-vectors/webhook-signing/positive/007-body-without-idempotency-key.json +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/capability-discovery.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/collection-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/content-standards-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/deterministic-testing.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/error-compliance.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/fictional-entities.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/get-media-buys-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/get-signals-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/idempotency.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/pagination-integrity-creative-formats.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/pagination-integrity-list-accounts.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/property-lists-pagination-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/runner-output-contract.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/schema-validation.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/security.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/signed-requests.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/v3-envelope-integrity.yaml +0 -0
- /package/compliance/cache/{3.0.5 → 3.0.6}/universal/webhook-emission.yaml +0 -0
|
@@ -1,997 +1,110 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: build-governance-agent
|
|
3
|
-
description: Use when building an AdCP governance agent —
|
|
3
|
+
description: Use when building an AdCP governance agent — campaign governance (spending authority, approval/denial), property/collection lists for brand safety, or content standards for creative compliance.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Build a Governance Agent
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
A governance agent enforces policy on the buy side. It evaluates spending authority, maintains property and collection lists, and defines content standards. There is no dedicated `hello_governance_adapter_*.ts` yet — this skill collapses against the seller adapter pattern and the documented tool surface.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
## Pick your fork target
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
| Specialism | Status | Fork this | Storyboard |
|
|
13
|
+
| --- | --- | --- | --- |
|
|
14
|
+
| `governance-spend-authority` | stable | [`hello_seller_adapter_multi_tenant.ts`](../../examples/hello_seller_adapter_multi_tenant.ts) — `campaignGovernance` block | `governance_spend_authority` |
|
|
15
|
+
| `governance-delivery-monitor` | stable | Same; add `phase: 'delivery'` branch on `checkGovernance` | `governance_delivery_monitor` |
|
|
16
|
+
| `property-lists` | stable | [`hello_seller_adapter_multi_tenant.ts`](../../examples/hello_seller_adapter_multi_tenant.ts) — `propertyLists` block | `property_lists` |
|
|
17
|
+
| `collection-lists` | stable | Same shape as property-lists; add IMDb/Gracenote/EIDR resolution | placeholder |
|
|
18
|
+
| `content-standards` | stable | Add `contentStandards` domain group via `defineContentStandardsPlatform` | placeholder |
|
|
19
|
+
| `measurement-verification` | preview | v3.1 placeholder. Baseline only. | placeholder |
|
|
13
20
|
|
|
14
|
-
-
|
|
15
|
-
- User mentions governance, brand safety, spending authority, property lists, or content standards
|
|
16
|
-
- User references `check_governance`, `sync_plans`, `create_property_list`, or `calibrate_content`
|
|
21
|
+
The multi-tenant adapter is the canonical fork target — it implements `campaignGovernance` (sync_plans, check_governance, report_plan_outcome, get_plan_audit_logs), `propertyLists` (CRUD + `validate_property_delivery`), and `brandRights` against a per-tenant in-memory store with full tenant isolation via `createTenantStore`.
|
|
17
22
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
- Selling ad inventory → `skills/build-seller-agent/`
|
|
21
|
-
- Serving audience segments → `skills/build-signals-agent/`
|
|
22
|
-
- Managing brand identity and licensing → `skills/build-brand-rights-agent/`
|
|
23
|
-
|
|
24
|
-
## Specialisms This Skill Covers
|
|
25
|
-
|
|
26
|
-
Your compliance obligations come from the specialisms you claim in `get_adcp_capabilities`. Each maps to a storyboard at `compliance/cache/latest/specialisms/<id>/`:
|
|
27
|
-
|
|
28
|
-
| Specialism | Status | Delta from baseline | See |
|
|
29
|
-
| ----------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------ |
|
|
30
|
-
| `governance-spend-authority` | stable | `check_governance` evaluates `binding` against Plan's `budget.total`, `human_review_required`, and `custom_policies`; return `approved`, `conditions`, or `denied` | [§ governance-spend-authority](#specialism-governance-spend-authority) |
|
|
31
|
-
| `governance-delivery-monitor` | stable | `check_governance` with `phase: 'delivery'` + `delivery_metrics`; compute drift vs Plan's `budget.reallocation_threshold`; return `BUDGET_DRIFT_EXCEEDED` findings | [§ governance-delivery-monitor](#specialism-governance-delivery-monitor) |
|
|
32
|
-
| `property-lists` | stable | Tool family `property_list` — implement CRUD plus `validate_property_delivery` with full `violations[]` | [§ property-lists](#specialism-property-lists) |
|
|
33
|
-
| `collection-lists` | stable | Tool family `collection_list` — program-level brand safety (shows, series, podcasts) identified by platform-independent IDs: IMDb, Gracenote, EIDR. Mirrors property-lists CRUD plus collection resolution. | [§ collection-lists](#specialism-collection-lists) |
|
|
34
|
-
| `content-standards` | stable | `policies[]` is an array of `{ policy_id, enforcement, policy, policy_categories?, channels? }`; `validate_content_delivery` uses `records[].artifact` (not `creative_id`); re-read policies per call for `standards_version_change` | [§ content-standards](#specialism-content-standards) |
|
|
35
|
-
| `measurement-verification` | preview | v3.1 placeholder (empty `phases`). Pass universal + governance baseline only. Advertise `measurement_verification` capability for discoverability. | Baseline only |
|
|
36
|
-
|
|
37
|
-
**Not in this skill:** `audience-sync` lives under `protocol: media-buy`. Build it in `skills/build-seller-agent/` instead — it uses `sync_audiences` (overloaded for discovery, add, and delete) and `list_accounts` under the `accounts` / `eventTracking` domain groups.
|
|
38
|
-
|
|
39
|
-
Specialism ID (kebab-case) = storyboard directory. Storyboard `id:` (snake_case, e.g. `campaign_governance_conditions`) is the category name — multiple specialisms can reference the same storyboard category.
|
|
40
|
-
|
|
41
|
-
## Protocol-Wide Requirements
|
|
42
|
-
|
|
43
|
-
Every production governance agent — regardless of specialism — must wire these. Full treatment in `skills/build-seller-agent/SKILL.md` §Protocol-Wide Requirements and §Composing OAuth, signing, and idempotency; minimum-viable pointers:
|
|
44
|
-
|
|
45
|
-
- **`idempotency_key`** on every mutating request (`sync_plans`, `create_property_list`/`update_property_list`/`delete_property_list`, `create_collection_list`/`update_collection_list`/`delete_collection_list`, `create_content_standards`/`update_content_standards`, `calibrate_content`). Pass `createIdempotencyStore` to `createAdcpServerFromPlatform(platform, { idempotency })`.
|
|
46
|
-
- **Authentication** via `serve({ authenticate: verifyApiKey(...)/verifyBearer(...) })` from `@adcp/sdk/server`. Unauthenticated agents fail the universal `security_baseline` storyboard.
|
|
47
|
-
- **Signature-header transparency**: don't reject requests that carry `Signature-Input`/`Signature` headers even if you don't claim `signed-requests`.
|
|
48
|
-
- **Resolve-then-authorize** on id lookups (`get_property_list`, `get_content_standards`, `get_collection_list`): return byte-equivalent errors whether the id is cross-tenant or nonexistent — always `REFERENCE_NOT_FOUND`, never `PERMISSION_DENIED`. `adcp fuzz` runs a paired-probe invariant that enforces this; stand up two test tenants and pass `--auth-token` + `--auth-token-cross-tenant` for full coverage. See `skills/build-seller-agent/SKILL.md` §Resolve-then-authorize for the full rules.
|
|
49
|
-
- **`comply_test_controller`** — required to pass the `governance_spend_authority` and `property_lists` storyboards. Each seeds fixtures via `comply_test_controller.seed_plan` / `seed_property_list` before running the business-logic phases. Register via `createComplyController({ seed: { plan, property_list, collection_list, content_standards } })` and call `controller.register(server)` — same pattern as seller. Full treatment in `skills/build-seller-agent/SKILL.md` §Compliance Testing. Without it, all business-logic steps skip with `missing_test_controller` and the track vacuously "passes" (no tests run, vacuous green detected by the grader as fail).
|
|
50
|
-
|
|
51
|
-
## Before Writing Code
|
|
52
|
-
|
|
53
|
-
### 1. Which Governance Domains?
|
|
54
|
-
|
|
55
|
-
- **Campaign governance** — evaluates media buys against spending authority. Returns approved, denied, or approved with conditions.
|
|
56
|
-
- **Property governance** — maintains inclusion/exclusion lists of publisher properties for brand safety.
|
|
57
|
-
- **Content standards** — defines creative compliance rules and validates delivery against them.
|
|
58
|
-
|
|
59
|
-
Most governance agents start with campaign governance. Add property and content standards as needed.
|
|
60
|
-
|
|
61
|
-
### 2. Decision Logic
|
|
62
|
-
|
|
63
|
-
For campaign governance, how should the agent decide?
|
|
64
|
-
|
|
65
|
-
- **Budget threshold** — deny buys over a per-transaction limit
|
|
66
|
-
- **Policy conditions** — approve with conditions (e.g., "weekly reporting required for CTV")
|
|
67
|
-
- **Channel restrictions** — deny certain channels or require review
|
|
68
|
-
- **Delivery monitoring** — re-evaluate when spend drifts past threshold
|
|
69
|
-
|
|
70
|
-
### 3. Property List Types
|
|
71
|
-
|
|
72
|
-
- **Inclusion lists** — only serve ads on these properties
|
|
73
|
-
- **Exclusion lists** — never serve ads on these properties
|
|
74
|
-
- **GARM category filters** — exclude by IAB/GARM category
|
|
75
|
-
|
|
76
|
-
## Tools and Required Response Shapes
|
|
77
|
-
|
|
78
|
-
> **Before writing any handler's return statement, fetch [`docs/llms.txt`](../../docs/llms.txt) and grep for `#### \`<tool_name>\``(e.g.`#### \`check_governance\``) to read the exact required + optional field list.** The schema-derived contract lives there; this skill covers patterns, gotchas, and domain-specific examples. Strict response validation is on by default in dev — it will tell you the exact field path if you drift, so write the obvious thing and trust the contract.
|
|
79
|
-
>
|
|
80
|
-
> **Cross-cutting pitfalls matrix runs keep catching:**
|
|
81
|
-
>
|
|
82
|
-
> - **Declare `capabilities.specialisms: ['governance-spend-authority', 'property-lists'] as const` on the `DecisioningPlatform` you pass to `createAdcpServerFromPlatform`.** Value is `string[]` of enum ids (not `[{id, version}]`). Agents that don't declare their specialism fail the grader with "No applicable tracks found" even if every tool works — tracks are gated on the specialism claim.
|
|
83
|
-
> - Every mutating-tool response (`create_property_list`, `create_collection_list`, `create_content_standards`, etc.) has `additionalProperties: false` — don't add extra fields. Return exactly what the schema declares.
|
|
84
|
-
|
|
85
|
-
### Campaign Governance
|
|
86
|
-
|
|
87
|
-
**`get_adcp_capabilities`** — register first, empty `{}` schema
|
|
88
|
-
|
|
89
|
-
```
|
|
90
|
-
capabilitiesResponse({
|
|
91
|
-
adcp: { major_versions: [3] },
|
|
92
|
-
supported_protocols: ['governance'],
|
|
93
|
-
})
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**`sync_plans`** — `SyncPlansRequestSchema.shape`
|
|
97
|
-
|
|
98
|
-
Register governance plans. Each plan in the response needs `plan_id`, `status`, and `version`.
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
taskToolResponse({
|
|
102
|
-
plans: [{
|
|
103
|
-
plan_id: string, // required — echo from request
|
|
104
|
-
status: 'active', // required — 'active' | 'paused'
|
|
105
|
-
version: 1, // required — integer version number
|
|
106
|
-
}],
|
|
107
|
-
})
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
**`check_governance`** — `CheckGovernanceRequestSchema.shape`
|
|
111
|
-
|
|
112
|
-
Evaluate a media buy against the registered plan. The request carries a `binding` (what is being evaluated) and a `phase`:
|
|
113
|
-
|
|
114
|
-
```
|
|
115
|
-
// Request shape:
|
|
116
|
-
{
|
|
117
|
-
plan_id: string, // required — registered via sync_plans
|
|
118
|
-
phase?: 'create' | 'delivery', // optional — authoritative when present
|
|
119
|
-
binding: { // what to evaluate (create-phase)
|
|
120
|
-
type: 'media_buy',
|
|
121
|
-
media_buy_id?: string, // on delivery phase, the already-created buy
|
|
122
|
-
account: { brand: {...}, operator: string },
|
|
123
|
-
total_budget: { amount: number, currency: string },
|
|
124
|
-
packages: [{ product_id, pricing_option_id, budget }],
|
|
125
|
-
},
|
|
126
|
-
delivery_metrics?: { // on delivery-phase checks — NOT delivery_evidence
|
|
127
|
-
reporting_period: { start: string, end: string },
|
|
128
|
-
spend: number,
|
|
129
|
-
cumulative_spend: number,
|
|
130
|
-
channel_distribution: { [channel: string]: number }, // percent by channel
|
|
131
|
-
pacing: 'ahead' | 'on_pace' | 'behind',
|
|
132
|
-
},
|
|
133
|
-
governance_context?: string, // prior check's context, for re-evaluation
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
`phase` is an optional top-level field (`'create' | 'delivery'`). When present, it is authoritative — use it to route. When absent, the presence of `delivery_metrics` is the corroborating signal. The storyboard sends both for delivery-phase checks.
|
|
138
|
-
|
|
139
|
-
The Plan object (stored via `sync_plans`) drives decisions. Expected shape:
|
|
140
|
-
|
|
141
|
-
```
|
|
142
|
-
{
|
|
143
|
-
plan_id: string,
|
|
144
|
-
brand: { domain: string },
|
|
145
|
-
objectives: string,
|
|
146
|
-
budget: {
|
|
147
|
-
total: number,
|
|
148
|
-
currency: string,
|
|
149
|
-
// Exactly one of the next two is required:
|
|
150
|
-
reallocation_threshold?: number, // absolute currency amount the orchestrator can reallocate without human escalation
|
|
151
|
-
reallocation_unlimited?: boolean, // set true for full autonomy up to total (prefer this over threshold == total)
|
|
152
|
-
},
|
|
153
|
-
flight: { start: string, end: string },
|
|
154
|
-
countries: string[],
|
|
155
|
-
human_review_required?: boolean, // GDPR Art 22 / EU AI Act Annex III — when true, every action on this plan needs human review regardless of budget. Set automatically by the agent if any resolved policy has requires_human_review: true.
|
|
156
|
-
custom_policies: [ // array of structured policy objects — NOT bare strings
|
|
157
|
-
{
|
|
158
|
-
policy_id: string,
|
|
159
|
-
enforcement: 'must' | 'should',
|
|
160
|
-
policy: string, // prose description of the rule
|
|
161
|
-
},
|
|
162
|
-
],
|
|
163
|
-
}
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
Authority is split into two independent concerns:
|
|
167
|
-
|
|
168
|
-
- **`budget.reallocation_threshold` / `reallocation_unlimited`** — budget autonomy. Dollar-denominated cap on how much the orchestrator can shift around without asking.
|
|
169
|
-
- **`human_review_required`** — decisions affecting data subjects (targeting, creative, delivery). Fires regardless of budget. Driven by regulation, not finance.
|
|
170
|
-
|
|
171
|
-
Both can be true simultaneously on the same plan.
|
|
172
|
-
|
|
173
|
-
The response needs `check_id`, `status`, `plan_id`, and `explanation`.
|
|
174
|
-
|
|
175
|
-
```
|
|
176
|
-
// Approved:
|
|
177
|
-
taskToolResponse({
|
|
178
|
-
check_id: string, // required — unique check identifier
|
|
179
|
-
status: 'approved', // required — enum: 'approved' | 'denied' | 'conditions'
|
|
180
|
-
plan_id: string, // required — echo from request
|
|
181
|
-
explanation: string, // required — human-readable explanation
|
|
182
|
-
governance_context: string, // pass to create_media_buy
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
// Approved with conditions — status is literally 'conditions' (not 'approved' plus a conditions array):
|
|
186
|
-
taskToolResponse({
|
|
187
|
-
check_id: string,
|
|
188
|
-
status: 'conditions',
|
|
189
|
-
plan_id: string,
|
|
190
|
-
explanation: 'Approved with conditions',
|
|
191
|
-
conditions: [{ // array of binding conditions
|
|
192
|
-
field: string, // required — what the condition applies to
|
|
193
|
-
reason: string, // required — why the condition exists
|
|
194
|
-
required_value: string, // optional — specific value required
|
|
195
|
-
}],
|
|
196
|
-
governance_context: string,
|
|
197
|
-
})
|
|
198
|
-
|
|
199
|
-
// Denied — also the way human review is signalled (no separate 'escalate' status):
|
|
200
|
-
taskToolResponse({
|
|
201
|
-
check_id: string,
|
|
202
|
-
status: 'denied',
|
|
203
|
-
plan_id: string,
|
|
204
|
-
explanation: 'Exceeds spending authority',
|
|
205
|
-
findings: [{ // array of policy findings
|
|
206
|
-
category_id: string, // required — policy category ID
|
|
207
|
-
severity: 'info' | 'warning' | 'critical', // required — human-review signal uses 'critical'
|
|
208
|
-
explanation: string, // required — human-readable
|
|
209
|
-
}],
|
|
210
|
-
})
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
**`get_plan_audit_logs`** — `GetPlanAuditLogsRequestSchema.shape`
|
|
214
|
-
|
|
215
|
-
```
|
|
216
|
-
taskToolResponse({
|
|
217
|
-
plan_id: string,
|
|
218
|
-
logs: [{
|
|
219
|
-
timestamp: string, // ISO timestamp
|
|
220
|
-
action: string,
|
|
221
|
-
actor: string,
|
|
222
|
-
}],
|
|
223
|
-
})
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
### Property Governance
|
|
227
|
-
|
|
228
|
-
**`create_property_list`** — `CreatePropertyListRequestSchema.shape`
|
|
229
|
-
|
|
230
|
-
Response must include `list` object and `auth_token`.
|
|
231
|
-
|
|
232
|
-
```
|
|
233
|
-
taskToolResponse({
|
|
234
|
-
list: {
|
|
235
|
-
list_id: string, // required
|
|
236
|
-
name: string, // required — echo from request
|
|
237
|
-
description: string,
|
|
238
|
-
property_count: 0,
|
|
239
|
-
},
|
|
240
|
-
auth_token: string, // required — token for subsequent operations
|
|
241
|
-
})
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
**`get_property_list`** — `GetPropertyListRequestSchema.shape`
|
|
245
|
-
|
|
246
|
-
```
|
|
247
|
-
taskToolResponse({
|
|
248
|
-
list: {
|
|
249
|
-
list_id: string,
|
|
250
|
-
name: string,
|
|
251
|
-
},
|
|
252
|
-
})
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
**`update_property_list`** — `UpdatePropertyListRequestSchema.shape`
|
|
256
|
-
|
|
257
|
-
```
|
|
258
|
-
taskToolResponse({
|
|
259
|
-
list: {
|
|
260
|
-
list_id: string,
|
|
261
|
-
name: string,
|
|
262
|
-
},
|
|
263
|
-
})
|
|
264
|
-
```
|
|
23
|
+
### What to delete if you're single-specialism
|
|
265
24
|
|
|
266
|
-
|
|
25
|
+
**Forking the multi-tenant adapter for a single specialism? Delete these blocks first** — leaning on stable symbol names rather than line numbers (the adapter evolves; greppable identifiers don't):
|
|
267
26
|
|
|
268
|
-
|
|
269
|
-
taskToolResponse({
|
|
270
|
-
lists: [{
|
|
271
|
-
list_id: string,
|
|
272
|
-
name: string,
|
|
273
|
-
}],
|
|
274
|
-
})
|
|
275
|
-
```
|
|
27
|
+
A single-specialism `governance-spend-authority` adopter (an in-house policy engine, IAS, DoubleVerify) deletes:
|
|
276
28
|
|
|
277
|
-
|
|
29
|
+
- The `brandRights = defineBrandRightsPlatform({ ... })` block (the entire brand-rights surface)
|
|
30
|
+
- The `propertyLists = definePropertyListsPlatform({ ... })` block if you don't claim `property-lists`
|
|
31
|
+
- The `private async enforceGovernance(...)` helper and the `interface GovernanceBinding` — these belong to `brandRights` cross-specialism dispatch, not to standalone governance
|
|
32
|
+
- Per-tenant `brands` / `rights` Maps on `TenantState` (no brand-rights catalog to seed)
|
|
278
33
|
|
|
279
|
-
|
|
280
|
-
taskToolResponse({
|
|
281
|
-
deleted: true, // required — boolean
|
|
282
|
-
list_id: string, // required — echo from request
|
|
283
|
-
})
|
|
284
|
-
```
|
|
34
|
+
A single-specialism `property-lists` adopter mirrors this: keep the `propertyLists` block; delete `campaignGovernance`, `brandRights`, `enforceGovernance`, the brand/rights Maps, and the `governanceBindings` map.
|
|
285
35
|
|
|
286
|
-
|
|
36
|
+
**Keep**: the `accounts` / `createTenantStore` block (translates to single-tenant by passing one tenant entry — needed for tenant isolation), `agentRegistry`, the specialism block(s) you claim, `getTenant(ctx)` resolution. **Don't keep `enforceGovernance` if you also delete `brandRights`** — the helper has no caller and wires a non-existent governance binding.
|
|
287
37
|
|
|
288
|
-
|
|
38
|
+
For `content-standards` and `collection-lists`, no worked fork target ships yet — wire `defineContentStandardsPlatform` / `defineCollectionListsPlatform` from `@adcp/sdk/server` against the multi-tenant scaffolding.
|
|
289
39
|
|
|
290
|
-
|
|
291
|
-
// Request:
|
|
292
|
-
{
|
|
293
|
-
list_id: string,
|
|
294
|
-
records: [{
|
|
295
|
-
record_id: string,
|
|
296
|
-
property: { type: 'domain' | 'bundle_id' | ..., value: string },
|
|
297
|
-
impressions: number,
|
|
298
|
-
}],
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// Response:
|
|
302
|
-
taskToolResponse({
|
|
303
|
-
compliant: true, // required — overall compliance
|
|
304
|
-
list_id: string, // echo from request
|
|
305
|
-
results: [{
|
|
306
|
-
record_id: string, // echo
|
|
307
|
-
property: { type, value }, // echo
|
|
308
|
-
impressions: number,
|
|
309
|
-
compliant: boolean,
|
|
310
|
-
violations: [{ // empty when compliant
|
|
311
|
-
list_id: string,
|
|
312
|
-
list_type: 'inclusion' | 'exclusion',
|
|
313
|
-
severity: 'critical',
|
|
314
|
-
explanation: string, // e.g. "Property {value} is not on inclusion list {name}"
|
|
315
|
-
}],
|
|
316
|
-
}],
|
|
317
|
-
violations: [], // flattened — all violations across results
|
|
318
|
-
})
|
|
319
|
-
```
|
|
40
|
+
For exact response shapes, error codes, and optional fields, `docs/llms.txt` is the canonical reference.
|
|
320
41
|
|
|
321
|
-
|
|
42
|
+
## When to use this skill
|
|
322
43
|
|
|
323
|
-
|
|
44
|
+
- User wants to enforce campaign governance, property lists, collection lists, or content standards
|
|
45
|
+
- User describes themselves as a brand-safety vendor (IAS, DoubleVerify), policy engine (OPA/Cerbos), or compliance platform
|
|
46
|
+
- User mentions `check_governance`, `validate_property_delivery`, `validate_content_delivery`
|
|
324
47
|
|
|
325
|
-
|
|
326
|
-
taskToolResponse({
|
|
327
|
-
standards: [{
|
|
328
|
-
standards_id: string,
|
|
329
|
-
name: string,
|
|
330
|
-
}],
|
|
331
|
-
})
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
**`create_content_standards`** — `CreateContentStandardsRequestSchema.shape`
|
|
335
|
-
|
|
336
|
-
```
|
|
337
|
-
taskToolResponse({
|
|
338
|
-
standards_id: string, // required — generated ID
|
|
339
|
-
})
|
|
340
|
-
```
|
|
341
|
-
|
|
342
|
-
**`get_content_standards`** — `GetContentStandardsRequestSchema.shape`
|
|
343
|
-
|
|
344
|
-
`policies` is an array of structured rules. Each entry has a `policy_id`, enforcement level (`must` or `should`), a prose `policy` description, optional `policy_categories`, and optional `channels` scope. The prose lives **inside each entry**, not at the container level.
|
|
345
|
-
|
|
346
|
-
```
|
|
347
|
-
taskToolResponse({
|
|
348
|
-
standards_id: string,
|
|
349
|
-
name: string,
|
|
350
|
-
policies: [
|
|
351
|
-
{
|
|
352
|
-
policy_id: 'no_violent_imagery',
|
|
353
|
-
policy_categories: ['brand_safety'],
|
|
354
|
-
enforcement: 'must',
|
|
355
|
-
policy: 'No violent or controversial imagery',
|
|
356
|
-
},
|
|
357
|
-
{
|
|
358
|
-
policy_id: 'min_display_dpi',
|
|
359
|
-
policy_categories: ['imagery_quality'],
|
|
360
|
-
enforcement: 'should',
|
|
361
|
-
channels: ['display'],
|
|
362
|
-
policy: 'Minimum 72 DPI for display assets',
|
|
363
|
-
},
|
|
364
|
-
],
|
|
365
|
-
scope: { languages_any: ['en'], description: 'Acme Outdoor creative standards' },
|
|
366
|
-
})
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
On `create_content_standards` / `update_content_standards`, the buyer sends the same `policies[]` array. Store it indexed by `standards_id` and re-read on every `calibrate_content` / `validate_content_delivery` call — the `standards_version_change` storyboard phase re-issues policies and expects the next calibration to reflect the update (a memoized calibration will fail that phase).
|
|
370
|
-
|
|
371
|
-
**`update_content_standards`** — `UpdateContentStandardsRequestSchema.shape`
|
|
372
|
-
|
|
373
|
-
```
|
|
374
|
-
taskToolResponse({
|
|
375
|
-
success: true,
|
|
376
|
-
standards_id: string,
|
|
377
|
-
})
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
**`calibrate_content`** — `CalibrateContentRequestSchema.shape`
|
|
381
|
-
|
|
382
|
-
Verdict mapping: any `enforcement: 'must'` violation → `'fail'`. Only `'should'` violations → `'review'`. No violations → `'pass'`. The `standards_version_change` phase depends on this — after policies update, the same artifact must flip verdicts.
|
|
383
|
-
|
|
384
|
-
```
|
|
385
|
-
taskToolResponse({
|
|
386
|
-
verdict: 'pass' | 'fail' | 'review',
|
|
387
|
-
confidence: 0.95,
|
|
388
|
-
explanation: string,
|
|
389
|
-
features: [],
|
|
390
|
-
})
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
**`validate_content_delivery`** — `ValidateContentDeliveryRequestSchema.shape`
|
|
394
|
-
|
|
395
|
-
The request uses `records[].artifact`, not `creative_id`. Each record scopes a served impression with `property_rid`, `artifact_id`, and `assets`. Response returns per-record compliance plus a `summary`.
|
|
396
|
-
|
|
397
|
-
```
|
|
398
|
-
// Request:
|
|
399
|
-
{
|
|
400
|
-
standards_id: string,
|
|
401
|
-
records: [{
|
|
402
|
-
record_id: string,
|
|
403
|
-
property_rid: string,
|
|
404
|
-
artifact: {
|
|
405
|
-
artifact_id: string,
|
|
406
|
-
property_rid: string,
|
|
407
|
-
description?: string, // optional prose describing the ad — used by calibration matchers
|
|
408
|
-
assets: [{ // ARRAY of assets — not an object
|
|
409
|
-
type: 'image' | 'video' | 'html' | 'text',
|
|
410
|
-
url: string,
|
|
411
|
-
width?: number,
|
|
412
|
-
height?: number,
|
|
413
|
-
duration_ms?: number,
|
|
414
|
-
}],
|
|
415
|
-
},
|
|
416
|
-
impressions: number,
|
|
417
|
-
}],
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
// Response:
|
|
421
|
-
taskToolResponse({
|
|
422
|
-
summary: {
|
|
423
|
-
compliant: true,
|
|
424
|
-
total_impressions: number,
|
|
425
|
-
non_compliant_impressions: 0,
|
|
426
|
-
},
|
|
427
|
-
results: [{
|
|
428
|
-
record_id: string, // echo from request
|
|
429
|
-
artifact: {
|
|
430
|
-
artifact_id: string,
|
|
431
|
-
property_rid: string,
|
|
432
|
-
description?: string, // optional prose describing the ad — used by calibration matchers
|
|
433
|
-
assets: [{ // ARRAY of assets — not an object
|
|
434
|
-
type: 'image' | 'video' | 'html' | 'text',
|
|
435
|
-
url: string,
|
|
436
|
-
width?: number,
|
|
437
|
-
height?: number,
|
|
438
|
-
duration_ms?: number,
|
|
439
|
-
}],
|
|
440
|
-
},
|
|
441
|
-
impressions: number,
|
|
442
|
-
compliant: boolean,
|
|
443
|
-
violations: [{ // empty when compliant
|
|
444
|
-
rule: string, // e.g. "No tobacco advertising"
|
|
445
|
-
severity: 'must' | 'should',
|
|
446
|
-
evidence: string, // why it failed
|
|
447
|
-
remediation: string, // how to fix
|
|
448
|
-
}],
|
|
449
|
-
}],
|
|
450
|
-
})
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
### Context and Ext Passthrough
|
|
454
|
-
|
|
455
|
-
The framework auto-echoes the request's `context` into every response — **do not set `context` yourself in your handler return values.** It's injected post-handler only when the field isn't already present.
|
|
456
|
-
|
|
457
|
-
**Crucial:** `context` is schema-typed as an object. If your handler hand-sets a string or narrative description, validation fails with `/context: must be object` and the framework does not overwrite. Leave the field out entirely; the framework handles it.
|
|
458
|
-
|
|
459
|
-
Some schemas also define an `ext` field for vendor-namespaced extensions. If your request schema includes `ext`, accept it without error. Tools with explicit `ext` support: `sync_governance`.
|
|
460
|
-
|
|
461
|
-
## SDK Quick Reference
|
|
462
|
-
|
|
463
|
-
| SDK piece | Usage |
|
|
464
|
-
| ---------------------------------------- | -------------------------------------------------------------------------- |
|
|
465
|
-
| `createAdcpServerFromPlatform(platform, opts)` | Create server from a typed `DecisioningPlatform` — compile-time specialism enforcement, auto-generated capabilities, ctx_metadata round-trip |
|
|
466
|
-
| `createAdcpServer(config)` *(legacy)* | v5 handler-bag entry. Mid-migration / escape-hatch only; reach via `@adcp/sdk/server/legacy/v5` |
|
|
467
|
-
| `serve(() => createAdcpServerFromPlatform(platform, opts))` | Start HTTP server on `:3001/mcp` |
|
|
468
|
-
| `ctx.store` | State persistence — `get/put/patch/delete/list` domain objects |
|
|
469
|
-
| `adcpError(code, { message })` | Structured error |
|
|
470
|
-
|
|
471
|
-
Handlers return raw data objects. The framework auto-wraps responses and auto-generates `get_adcp_capabilities` from registered handlers.
|
|
472
|
-
|
|
473
|
-
Import: `import { createAdcpServerFromPlatform, serve, adcpError } from '@adcp/sdk/server';`
|
|
48
|
+
**Not this skill:**
|
|
474
49
|
|
|
475
|
-
|
|
50
|
+
- Selling inventory while consuming governance signals → `skills/build-seller-agent/` (governance-aware seller track)
|
|
51
|
+
- Brand identity / rights licensing → `skills/build-brand-rights-agent/`
|
|
52
|
+
- Audience sync (despite the name overlap) → `skills/build-seller-agent/` (audience-sync track)
|
|
476
53
|
|
|
477
|
-
|
|
478
|
-
npm init -y
|
|
479
|
-
npm install @adcp/sdk
|
|
480
|
-
npm install -D typescript @types/node
|
|
481
|
-
```
|
|
54
|
+
## Cross-cutting rules
|
|
482
55
|
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
```json
|
|
486
|
-
{
|
|
487
|
-
"compilerOptions": {
|
|
488
|
-
"target": "ES2022",
|
|
489
|
-
"module": "Node16",
|
|
490
|
-
"moduleResolution": "Node16",
|
|
491
|
-
"strict": true,
|
|
492
|
-
"skipLibCheck": true,
|
|
493
|
-
"outDir": "dist"
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
```
|
|
56
|
+
Every governance agent hits the cross-cutting rules in [`../cross-cutting.md`](../cross-cutting.md). The high-traffic ones for governance (deep-linked to the rule):
|
|
497
57
|
|
|
498
|
-
`
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
1. Single `.ts` file — `class MyGovernance implements DecisioningPlatform` with `campaignGovernance`, `propertyLists`, `collectionLists`, `contentStandards` typed sub-platforms
|
|
503
|
-
2. Do not register `get_adcp_capabilities` — the framework generates it from registered handlers
|
|
504
|
-
3. Return raw data objects from handlers — the framework wraps responses automatically
|
|
505
|
-
4. Use `ctx.store` to persist plans, property lists, and content standards
|
|
506
|
-
5. Set `sandbox: true` on all mock/demo responses
|
|
507
|
-
6. Handlers receive `(params, ctx)` — `ctx.store` for state, `ctx.account` for resolved account
|
|
508
|
-
|
|
509
|
-
```typescript
|
|
510
|
-
import { randomUUID } from 'node:crypto';
|
|
511
|
-
import {
|
|
512
|
-
createAdcpServerFromPlatform,
|
|
513
|
-
serve,
|
|
514
|
-
createIdempotencyStore,
|
|
515
|
-
memoryBackend,
|
|
516
|
-
type DecisioningPlatform,
|
|
517
|
-
type CampaignGovernancePlatform,
|
|
518
|
-
type PropertyListsPlatform,
|
|
519
|
-
type AccountStore,
|
|
520
|
-
} from '@adcp/sdk/server';
|
|
521
|
-
|
|
522
|
-
const idempotency = createIdempotencyStore({
|
|
523
|
-
backend: memoryBackend(),
|
|
524
|
-
ttlSeconds: 86400,
|
|
525
|
-
});
|
|
526
|
-
|
|
527
|
-
class MyGovernance implements DecisioningPlatform {
|
|
528
|
-
capabilities = {
|
|
529
|
-
specialisms: ['governance-spend-authority', 'property-lists'] as const,
|
|
530
|
-
config: {},
|
|
531
|
-
};
|
|
532
|
-
|
|
533
|
-
accounts: AccountStore = {
|
|
534
|
-
resolve: async ref => ({
|
|
535
|
-
id: 'account_id' in ref ? ref.account_id : 'gov_acc_1',
|
|
536
|
-
operator: 'me',
|
|
537
|
-
ctx_metadata: {},
|
|
538
|
-
}),
|
|
539
|
-
upsert: async () => ({ ok: true, items: [] }),
|
|
540
|
-
list: async () => ({ items: [], nextCursor: null }),
|
|
541
|
-
};
|
|
542
|
-
|
|
543
|
-
campaignGovernance: CampaignGovernancePlatform = {
|
|
544
|
-
syncPlans: async (req, ctx) => {
|
|
545
|
-
for (const plan of req.plans) {
|
|
546
|
-
await ctx.store.put('plan', plan.plan_id, plan);
|
|
547
|
-
}
|
|
548
|
-
return {
|
|
549
|
-
plans: req.plans.map(p => ({
|
|
550
|
-
plan_id: p.plan_id,
|
|
551
|
-
status: 'active' as const,
|
|
552
|
-
version: 1,
|
|
553
|
-
})),
|
|
554
|
-
};
|
|
555
|
-
},
|
|
556
|
-
checkGovernance: async (req, ctx) => {
|
|
557
|
-
const plan = await ctx.store.get('plan', req.plan_id);
|
|
558
|
-
// ... decision logic ...
|
|
559
|
-
return {
|
|
560
|
-
check_id: `chk_${randomUUID()}`,
|
|
561
|
-
status: 'approved' as const,
|
|
562
|
-
plan_id: req.plan_id,
|
|
563
|
-
explanation: 'Within spending authority',
|
|
564
|
-
};
|
|
565
|
-
},
|
|
566
|
-
// ... reportPlanOutcome, getPlanAuditLogs, etc.
|
|
567
|
-
};
|
|
568
|
-
|
|
569
|
-
propertyLists: PropertyListsPlatform = {
|
|
570
|
-
listPropertyLists: async (req, ctx) => ({ property_lists: [] }),
|
|
571
|
-
createPropertyList: async (req, ctx) => ({ /* ... */ }),
|
|
572
|
-
updatePropertyList: async (req, ctx) => ({ /* ... */ }),
|
|
573
|
-
deletePropertyList: async (req, ctx) => ({ /* ... */ }),
|
|
574
|
-
};
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
const platform = new MyGovernance();
|
|
578
|
-
|
|
579
|
-
serve(() =>
|
|
580
|
-
createAdcpServerFromPlatform(platform, {
|
|
581
|
-
name: 'Governance Agent',
|
|
582
|
-
version: '1.0.0',
|
|
583
|
-
idempotency,
|
|
584
|
-
})
|
|
585
|
-
);
|
|
586
|
-
```
|
|
58
|
+
- [`idempotency_key`](../cross-cutting.md#idempotency_key-is-required-on-every-mutating-call) on `sync_plans`, `sync_governance`, `report_plan_outcome`, `create_property_list` / `update_property_list` / `delete_property_list`, `create_collection_list` / `update_collection_list` / `delete_collection_list`, `create_content_standards` / `update_content_standards` / `calibrate_content`
|
|
59
|
+
- [Resolve-then-authorize](../cross-cutting.md#resolve-then-authorize--uniform-errors-for-not-found--not-yours) — byte-equivalent errors on `property_list_id` / `collection_list_id` / `plan_id` cross-tenant lookups
|
|
60
|
+
- [Account resolution](../cross-cutting.md#account-resolution-pick-a-security-preset) — `createTenantStore` for multi-tenant policy hubs
|
|
587
61
|
|
|
588
|
-
|
|
62
|
+
One governance-specific rule on top:
|
|
589
63
|
|
|
590
|
-
|
|
64
|
+
### `comply_test_controller` is required
|
|
591
65
|
|
|
592
|
-
|
|
593
|
-
- If `reallocation_threshold` is set and a reallocation exceeds it → require human review / deny
|
|
594
|
-
- If `plan.human_review_required: true` → action must escalate regardless of `mode` (advisory/audit cannot downgrade)
|
|
595
|
-
- Auto-flip `plan.human_review_required: true` when resolved `policy_categories` include `fair_housing | fair_lending | fair_employment | pharmaceutical_advertising`, or when `policy_ids` include `eu_ai_act_annex_iii`
|
|
596
|
-
- If `human_review_required: true` but the brand/brand-ref has no `data_subject_contestation` contact → emit a critical finding
|
|
597
|
-
- Require a `human_override` artifact (reason ≥20 chars, approver email) on re-sync to downgrade `human_review_required: true → false`
|
|
598
|
-
- If policy conditions match → approve with conditions
|
|
599
|
-
- If `phase: 'delivery'` → check delivery_metrics for drift
|
|
66
|
+
Both `governance_spend_authority` and `property_lists` storyboards seed fixtures via `comply_test_controller.seed_plan` / `seed_property_list` before running the business-logic phases. Register via `createComplyController({ seed: { plan, property_list, collection_list, content_standards } })` and call `controller.register(server)` — same pattern as the seller adapter wires for media-buy seeding.
|
|
600
67
|
|
|
601
|
-
|
|
68
|
+
Without the test controller, every business-logic step skips with `missing_test_controller` and the track "passes" vacuously — the grader treats vacuous green as fail. Wire it on day one.
|
|
602
69
|
|
|
603
|
-
|
|
70
|
+
## Specialism deltas at a glance
|
|
604
71
|
|
|
605
|
-
|
|
606
|
-
import { createIdempotencyStore, memoryBackend } from '@adcp/sdk/server';
|
|
72
|
+
**`governance-spend-authority`** — `check_governance` evaluates the request's `binding` against the Plan's `budget.total`, `human_review_required`, and `custom_policies`. Returns one of `approved` / `conditions` / `denied`. The Plan model is the source of truth: read `sync_plans` / `get_plan` to materialize the spending authority, then check the inbound binding against it.
|
|
607
73
|
|
|
608
|
-
|
|
609
|
-
backend: memoryBackend(), // or pgBackend(pool) for production
|
|
610
|
-
ttlSeconds: 86400, // 3600–604800 per spec; throws if out of range
|
|
611
|
-
});
|
|
74
|
+
**`governance-delivery-monitor`** — `check_governance` with `phase: 'delivery'` + `delivery_metrics`. Compute drift vs Plan's `budget.reallocation_threshold`; return `BUDGET_DRIFT_EXCEEDED` findings when delivery exceeds the threshold.
|
|
612
75
|
|
|
613
|
-
|
|
614
|
-
name: '...', version: '...',
|
|
615
|
-
idempotency,
|
|
616
|
-
// MUST never return undefined — or every mutating request rejects as
|
|
617
|
-
// SERVICE_UNAVAILABLE. A constant works for a demo; production uses
|
|
618
|
-
// `(ctx) => ctx.account?.id` against the typed `Account<MyMeta>`.
|
|
619
|
-
resolveSessionKey: () => 'default-principal',
|
|
620
|
-
});
|
|
621
|
-
```
|
|
76
|
+
**`property-lists`** — tool family `property_list_*` (`create`, `read`, `update`, `delete`, `list`). `validate_property_delivery` returns full `violations[]` (publisher property not in the inclusion list, or hit the exclusion list). Property identity is `{agent_url, id}` — buyers fetch lists by reference, not by inline copy.
|
|
622
77
|
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
**An AdCP agent that accepts unauthenticated requests is non-compliant** (see `security_baseline` in the universal storyboard bundle). Ask the operator: "API key, OAuth, or both?" — then wire one of these into `serve()`.
|
|
626
|
-
|
|
627
|
-
```typescript
|
|
628
|
-
import { serve } from '@adcp/sdk';
|
|
629
|
-
import { verifyApiKey, verifyBearer, anyOf } from '@adcp/sdk/server';
|
|
630
|
-
|
|
631
|
-
// API key — simplest, good for B2B integrations
|
|
632
|
-
serve(createAgent, {
|
|
633
|
-
authenticate: verifyApiKey({
|
|
634
|
-
verify: async token => {
|
|
635
|
-
const row = await db.api_keys.findUnique({ where: { token } });
|
|
636
|
-
return row ? { principal: row.account_id } : null;
|
|
637
|
-
},
|
|
638
|
-
}),
|
|
639
|
-
});
|
|
640
|
-
|
|
641
|
-
// OAuth — best when buyers authenticate as themselves
|
|
642
|
-
const AGENT_URL = 'https://my-agent.example.com/mcp';
|
|
643
|
-
serve(createAgent, {
|
|
644
|
-
publicUrl: AGENT_URL, // canonical RFC 8707 audience — also served as `resource` in protected-resource metadata
|
|
645
|
-
authenticate: verifyBearer({
|
|
646
|
-
jwksUri: 'https://auth.example.com/.well-known/jwks.json',
|
|
647
|
-
issuer: 'https://auth.example.com',
|
|
648
|
-
audience: AGENT_URL, // MUST equal publicUrl
|
|
649
|
-
}),
|
|
650
|
-
protectedResource: { authorization_servers: ['https://auth.example.com'] },
|
|
651
|
-
});
|
|
652
|
-
|
|
653
|
-
// Both
|
|
654
|
-
serve(createAgent, {
|
|
655
|
-
publicUrl: AGENT_URL,
|
|
656
|
-
authenticate: anyOf(verifyApiKey({ verify: lookupKey }), verifyBearer({ jwksUri, issuer, audience: AGENT_URL })),
|
|
657
|
-
protectedResource: { authorization_servers: [issuer] },
|
|
658
|
-
});
|
|
659
|
-
```
|
|
78
|
+
**`collection-lists`** — program-level brand safety (shows, series, podcasts) identified by platform-independent IDs: **IMDb** (movies/TV), **Gracenote** (TV/audio metadata), **EIDR** (entertainment industry standard). Mirrors property-lists CRUD plus collection resolution.
|
|
660
79
|
|
|
661
|
-
|
|
80
|
+
**`content-standards`** — `policies[]` is an array of `{ policy_id, enforcement, policy, policy_categories?, channels? }`. `validate_content_delivery` uses `records[].artifact` (not `creative_id`). Re-read policies per call so `standards_version_change` events don't serve stale policy.
|
|
662
81
|
|
|
663
|
-
|
|
82
|
+
**`measurement-verification`** — v3.1 placeholder (empty `phases`). Pass universal + governance baseline only. Advertise the capability for discoverability.
|
|
664
83
|
|
|
665
|
-
|
|
84
|
+
## Validate locally
|
|
666
85
|
|
|
667
86
|
```bash
|
|
668
|
-
#
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
# Happy paths — run the storyboards matching your claimed specialisms
|
|
672
|
-
npx @adcp/sdk@latest storyboard run http://localhost:3001/mcp \
|
|
673
|
-
--storyboards governance_spend_authority,governance_spend_authority/denied,governance_delivery_monitor \
|
|
674
|
-
--auth $TOKEN
|
|
675
|
-
npx @adcp/sdk@latest storyboard run http://localhost:3001/mcp \
|
|
676
|
-
--storyboards property_lists,collection_lists,content_standards \
|
|
677
|
-
--auth $TOKEN
|
|
678
|
-
|
|
679
|
-
# Cross-cutting obligations
|
|
680
|
-
npx @adcp/sdk@latest storyboard run http://localhost:3001/mcp \
|
|
681
|
-
--storyboards security_baseline,idempotency,schema_validation,error_compliance --auth $TOKEN
|
|
682
|
-
|
|
683
|
-
# Rejection-surface fuzz — includes update_property_list / update_content_standards (Tier 3)
|
|
684
|
-
npx @adcp/sdk@latest fuzz http://localhost:3001/mcp --auto-seed --auth-token $TOKEN
|
|
685
|
-
```
|
|
87
|
+
# Run the fork-matrix gate (tsc strict)
|
|
88
|
+
npm run compliance:fork-matrix -- --test-name-pattern="hello-seller-adapter-multi-tenant"
|
|
686
89
|
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
- `status: 'escalated'` on `check_governance` → enum is `approved` / `denied` / `conditions`
|
|
691
|
-
- Missing `check_id` on `check_governance` response → required; generate a unique ID per check
|
|
692
|
-
- `finding.code` / `finding.message` → schema requires `category_id`, `severity`, `explanation`
|
|
693
|
-
|
|
694
|
-
**Keep iterating until all steps pass.** Can't bind ports? `npm run compliance:skill-matrix -- --filter governance` runs an isolated end-to-end test.
|
|
695
|
-
|
|
696
|
-
## Common Mistakes
|
|
697
|
-
|
|
698
|
-
| Mistake | Fix |
|
|
699
|
-
| ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------- |
|
|
700
|
-
| Manually registering `get_adcp_capabilities` | Framework auto-generates it from registered handlers — do not register it yourself |
|
|
701
|
-
| Using `server.tool()` instead of domain groups | Use `governance: { syncPlans, checkGovernance, ... }` — framework wires schemas and response builders |
|
|
702
|
-
| Using in-memory Maps for state | Use `ctx.store.put/get/patch/delete/list` — built-in state persistence |
|
|
703
|
-
| `check_governance` missing `check_id` | Generate a unique ID per check — required field |
|
|
704
|
-
| `check_governance` returns `decision` not `status` | Field is `status`, not `decision`. Values: `approved`, `denied`, `conditions` |
|
|
705
|
-
| Conditions use `description` instead of `reason` | Condition schema requires `field` and `reason`, not `condition_id` and `description` |
|
|
706
|
-
| Findings use `code`/`message` instead of proper fields | Finding schema requires `category_id`, `severity`, `explanation` |
|
|
707
|
-
| `sync_plans` response missing `version` | Each plan needs `version: 1` (integer) — required field |
|
|
708
|
-
| `delete_property_list` missing `deleted: true` | Boolean `deleted` field is required in response |
|
|
709
|
-
| `create_property_list` missing `auth_token` | `auth_token` is required — generate a token string |
|
|
710
|
-
| Dropping `context` from responses | Echo `args.context` back unchanged in every response — buyers use it for correlation |
|
|
711
|
-
|
|
712
|
-
## Storyboards
|
|
713
|
-
|
|
714
|
-
| Storyboard | Tests |
|
|
715
|
-
| -------------------------------- | ------------------------------------------------------------------ |
|
|
716
|
-
| `campaign_governance_conditions` | Approved with conditions flow |
|
|
717
|
-
| `campaign_governance_delivery` | Delivery monitoring with drift re-evaluation |
|
|
718
|
-
| `campaign_governance_denied` | Denied — buy exceeds spending authority |
|
|
719
|
-
| `property_lists` | Property list lifecycle: create, query, update, delete, validate |
|
|
720
|
-
| `collection_lists` | Collection list lifecycle: create, query (resolve), update, delete |
|
|
721
|
-
| `content_standards` | Content standards lifecycle: create, calibrate, validate |
|
|
722
|
-
|
|
723
|
-
## Specialism Details
|
|
724
|
-
|
|
725
|
-
### <a name="specialism-governance-spend-authority"></a>governance-spend-authority
|
|
726
|
-
|
|
727
|
-
Storyboard category: `campaign_governance_*`. The agent holds a Plan and evaluates each binding against it.
|
|
728
|
-
|
|
729
|
-
Minimal decision logic:
|
|
730
|
-
|
|
731
|
-
```typescript
|
|
732
|
-
checkGovernance: async (params, ctx) => {
|
|
733
|
-
const plan = await ctx.store.get('plan', params.plan_id);
|
|
734
|
-
if (!plan) return adcpError('NOT_FOUND', { message: `Plan ${params.plan_id} not found` });
|
|
735
|
-
|
|
736
|
-
const budget = params.binding.total_budget.amount;
|
|
737
|
-
|
|
738
|
-
// 1. Human-review gate — GDPR Art 22 / EU AI Act.
|
|
739
|
-
// Every action on a human_review_required plan must be escalated, regardless of budget.
|
|
740
|
-
// Signal as `denied` + a critical-severity finding.
|
|
741
|
-
// The buyer resolves review off-protocol and re-calls check_governance with a fresh governance_context.
|
|
742
|
-
if (plan.human_review_required) {
|
|
743
|
-
return {
|
|
744
|
-
check_id: `chk_${Date.now()}`,
|
|
745
|
-
status: 'denied' as const,
|
|
746
|
-
plan_id: params.plan_id,
|
|
747
|
-
explanation: 'Plan requires human review before this action can proceed',
|
|
748
|
-
findings: [{
|
|
749
|
-
category_id: 'HUMAN_REVIEW_REQUIRED',
|
|
750
|
-
severity: 'critical',
|
|
751
|
-
explanation: 'plan.human_review_required is true — resolve off-protocol and retry with a fresh governance_context',
|
|
752
|
-
}],
|
|
753
|
-
};
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
// 2. Budget ceiling — cannot exceed plan.budget.total.
|
|
757
|
-
if (budget > plan.budget.total) {
|
|
758
|
-
return { check_id: `chk_${Date.now()}`, status: 'denied' as const, plan_id: params.plan_id,
|
|
759
|
-
explanation: `Budget ${budget} exceeds plan ceiling ${plan.budget.total}`,
|
|
760
|
-
findings: [{ category_id: 'BUDGET_EXCEEDED', severity: 'critical',
|
|
761
|
-
explanation: `Over plan ceiling by ${budget - plan.budget.total}` }],
|
|
762
|
-
};
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
// 3. Custom policy matching — custom_policies is an array of structured objects
|
|
766
|
-
const conditions = [];
|
|
767
|
-
for (const policy of plan.custom_policies ?? []) {
|
|
768
|
-
if (policy.policy.toLowerCase().includes('ctv') && hasCtv(params.binding)) {
|
|
769
|
-
conditions.push({ field: 'reporting.frequency', reason: policy.policy, policy_id: policy.policy_id });
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
return {
|
|
774
|
-
check_id: `chk_${Date.now()}`,
|
|
775
|
-
status: conditions.length ? 'conditions' as const : 'approved' as const, // 3-value enum, pick one
|
|
776
|
-
plan_id: params.plan_id,
|
|
777
|
-
explanation: conditions.length ? 'Approved with conditions' : 'Within spending authority',
|
|
778
|
-
conditions,
|
|
779
|
-
governance_context: `gov_ctx_${params.plan_id}_${Date.now()}`, // opaque string — buyer echoes back to create_media_buy
|
|
780
|
-
};
|
|
781
|
-
},
|
|
782
|
-
```
|
|
783
|
-
|
|
784
|
-
`governance_context` is an opaque string your agent mints and the buyer echoes back. Use it to tie a specific approval to a specific `create_media_buy` call — sign it or tag it with the plan revision if you care about tamper-resistance.
|
|
785
|
-
|
|
786
|
-
### <a name="specialism-governance-delivery-monitor"></a>governance-delivery-monitor
|
|
787
|
-
|
|
788
|
-
Storyboard: `governance_delivery_monitor`. Same `check_governance` tool, but the request carries `delivery_metrics` instead of a bare binding — that's the cue to run drift logic.
|
|
789
|
-
|
|
790
|
-
```typescript
|
|
791
|
-
checkGovernance: async (params, ctx) => {
|
|
792
|
-
if (params.phase === 'delivery' || params.delivery_metrics) {
|
|
793
|
-
const plan = await ctx.store.get('plan', params.plan_id);
|
|
794
|
-
const reallocationThreshold = plan.budget.reallocation_threshold; // absolute $, e.g. 8000
|
|
795
|
-
|
|
796
|
-
// Check total-spend drift against the reallocation threshold
|
|
797
|
-
const cumulative = params.delivery_metrics.cumulative_spend;
|
|
798
|
-
const overage = cumulative - plan.budget.total;
|
|
799
|
-
const exceeded = Math.abs(overage) > reallocationThreshold;
|
|
800
|
-
|
|
801
|
-
// Also flag pacing mismatches that imply channel reallocation
|
|
802
|
-
const driftedChannels = Object.entries(params.delivery_metrics.channel_distribution ?? {})
|
|
803
|
-
.filter(([channel, percent]) => {
|
|
804
|
-
const planAllocation = plan.channel_allocations?.[channel];
|
|
805
|
-
return planAllocation != null && Math.abs(percent - planAllocation) > 10; // 10pp threshold
|
|
806
|
-
});
|
|
807
|
-
|
|
808
|
-
if (!exceeded && driftedChannels.length === 0) {
|
|
809
|
-
return { check_id: `chk_${Date.now()}`, status: 'approved' as const, plan_id: params.plan_id,
|
|
810
|
-
explanation: 'Delivery within reallocation threshold',
|
|
811
|
-
governance_context: params.governance_context ?? `gov_ctx_${params.plan_id}_delivery_approved` };
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
return {
|
|
815
|
-
check_id: `chk_${Date.now()}`,
|
|
816
|
-
status: 'conditions' as const, // approved-with-reallocation — use the 'conditions' status, not 'approved'
|
|
817
|
-
plan_id: params.plan_id,
|
|
818
|
-
explanation: `Drift exceeded threshold: ${overage > 0 ? 'overage' : 'underage'} of ${Math.abs(overage)}`,
|
|
819
|
-
conditions: driftedChannels.map(([channel, percent]) => ({
|
|
820
|
-
field: `channel_distribution.${channel}`,
|
|
821
|
-
reason: `Rebalance away from ${channel} — currently ${percent}%, plan targets ${plan.channel_allocations?.[channel] ?? 'unspecified'}%`,
|
|
822
|
-
})),
|
|
823
|
-
findings: [{ category_id: 'BUDGET_DRIFT_EXCEEDED', severity: 'warning',
|
|
824
|
-
explanation: `Cumulative spend ${cumulative} outside reallocation threshold ±${reallocationThreshold}` }],
|
|
825
|
-
};
|
|
826
|
-
}
|
|
827
|
-
// ... create-phase logic above
|
|
828
|
-
},
|
|
829
|
-
|
|
830
|
-
// Policy matching in create-phase checks — custom_policies is an array of objects, not strings:
|
|
831
|
-
for (const policy of plan.custom_policies ?? []) {
|
|
832
|
-
if (policy.policy.toLowerCase().includes('ctv') && hasCtv(params.binding)) {
|
|
833
|
-
conditions.push({ field: 'reporting.frequency', reason: policy.policy });
|
|
834
|
-
}
|
|
835
|
-
}
|
|
836
|
-
```
|
|
837
|
-
|
|
838
|
-
The `findings[].category_id` / `severity: 'info' | 'warning' | 'critical'` enum is the schema-canonical shape per [adcontextprotocol/adcp#2286](https://github.com/adcontextprotocol/adcp/issues/2286). Storyboard validations today only check `field_present: findings`, so either spelling passes — but use the schema shape.
|
|
839
|
-
|
|
840
|
-
### <a name="specialism-property-lists"></a>property-lists
|
|
841
|
-
|
|
842
|
-
Storyboard: `property_lists`. Specialism and tool family share the same name. Your agent owns both inclusion and exclusion list semantics — track `list_type` on the stored list. Wrap identifiers with `selection_type: 'identifiers'`:
|
|
843
|
-
|
|
844
|
-
```typescript
|
|
845
|
-
createPropertyList: async (params, ctx) => {
|
|
846
|
-
const list_id = `plist_${Date.now()}`;
|
|
847
|
-
const stored = {
|
|
848
|
-
list_id,
|
|
849
|
-
name: params.name,
|
|
850
|
-
description: params.description,
|
|
851
|
-
list_type: 'inclusion' as const, // caller-modeled — infer from context or add as ext
|
|
852
|
-
base_properties: params.base_properties ?? [], // each entry: { selection_type: 'identifiers', identifiers: [{ type, value }] }
|
|
853
|
-
property_count: countIdentifiers(params.base_properties),
|
|
854
|
-
status: 'active' as const,
|
|
855
|
-
};
|
|
856
|
-
await ctx.store.put('property_list', list_id, stored);
|
|
857
|
-
return {
|
|
858
|
-
list: summarize(stored),
|
|
859
|
-
auth_token: `tok_${list_id}`,
|
|
860
|
-
};
|
|
861
|
-
},
|
|
862
|
-
|
|
863
|
-
// Shape of a base_properties entry (matches the storyboard sample):
|
|
864
|
-
type BaseProperty = {
|
|
865
|
-
selection_type: 'identifiers';
|
|
866
|
-
identifiers: Array<{
|
|
867
|
-
type: 'domain' | 'bundle_id' | 'app_store_url' | 'podcast_rss_feed' | 'property_rid';
|
|
868
|
-
value: string;
|
|
869
|
-
}>;
|
|
870
|
-
};
|
|
871
|
-
```
|
|
872
|
-
|
|
873
|
-
**`list_property_lists` / `list_collection_lists`** — destructure `ctx.store.list`. It returns `{ items, nextCursor? }`, never a bare array. Calling `.map` / `.filter` on the raw result throws `TypeError` and the dispatcher wraps it as `SERVICE_UNAVAILABLE`. Use the typed response helper so you can't accidentally ship a bare `[...]` at the top level (the storyboard runner flags that as shape drift):
|
|
874
|
-
|
|
875
|
-
```typescript
|
|
876
|
-
import { listPropertyListsResponse } from '@adcp/sdk/server';
|
|
877
|
-
|
|
878
|
-
listPropertyLists: async (params, ctx) => {
|
|
879
|
-
const { items } = await ctx.store.list('property_list');
|
|
880
|
-
return listPropertyListsResponse({
|
|
881
|
-
lists: items.map(list => ({ list_id: list.list_id, name: list.name })),
|
|
882
|
-
});
|
|
883
|
-
},
|
|
884
|
-
```
|
|
885
|
-
|
|
886
|
-
The same pattern applies to `list_collection_lists` (use `listCollectionListsResponse`) and `list_content_standards` (use `listContentStandardsResponse`). Both wrap the same `lists` / `standards` shape and guard against the bare-array drift at compile time.
|
|
887
|
-
|
|
888
|
-
`validate_property_delivery` returns `violations[]` with `list_id`, `list_type`, `severity: 'critical'`, and an explanation per non-compliant record — see the response shape in the tool section above.
|
|
889
|
-
|
|
890
|
-
The three mutating tools (`create_property_list`, `update_property_list`, `delete_property_list`) require `idempotency_key` per AdCP 3.0 GA — cache the response and return the same object on replay.
|
|
891
|
-
|
|
892
|
-
### <a name="specialism-collection-lists"></a>collection-lists
|
|
893
|
-
|
|
894
|
-
Storyboard: `collection_lists`. Where `property-lists` curate surfaces (domains, app bundle IDs), `collection-lists` curate **content programs** (shows, series, podcasts, series arcs) identified by platform-independent IDs: IMDb (`tt0944947`), Gracenote, EIDR. Program-level brand safety — "keep my ads out of all episodes of [show]" cuts across every surface that carries that show.
|
|
895
|
-
|
|
896
|
-
**Request shape** — `base_collections[]` wraps identifiers with a `selection_type`, and `filters` is an object (not an array):
|
|
897
|
-
|
|
898
|
-
```typescript
|
|
899
|
-
createCollectionList: async (params, ctx) => {
|
|
900
|
-
const list_id = `clist_${Date.now()}`;
|
|
901
|
-
const stored = {
|
|
902
|
-
list_id,
|
|
903
|
-
name: params.name,
|
|
904
|
-
description: params.description,
|
|
905
|
-
base_collections: params.base_collections ?? [], // see shape below
|
|
906
|
-
filters: params.filters ?? {}, // object — e.g. { kinds: ['series'] }
|
|
907
|
-
collection_count: resolveCollectionCount(params.base_collections, params.filters),
|
|
908
|
-
status: 'active' as const,
|
|
909
|
-
};
|
|
910
|
-
await ctx.store.put('collection_list', list_id, stored);
|
|
911
|
-
return { list: summarize(stored), auth_token: `tok_${list_id}` };
|
|
912
|
-
},
|
|
913
|
-
|
|
914
|
-
// Shape of a base_collections entry:
|
|
915
|
-
type BaseCollection = {
|
|
916
|
-
selection_type: 'distribution_ids';
|
|
917
|
-
identifiers: Array<{
|
|
918
|
-
type: 'imdb_id' | 'gracenote_id' | 'eidr';
|
|
919
|
-
value: string; // e.g. "tt9999901"
|
|
920
|
-
}>;
|
|
921
|
-
};
|
|
922
|
-
|
|
923
|
-
// Shape of filters:
|
|
924
|
-
type Filters = {
|
|
925
|
-
kinds?: ('series' | 'movie' | 'podcast' | 'episode')[];
|
|
926
|
-
// other filter families added in 3.1
|
|
927
|
-
};
|
|
928
|
-
```
|
|
90
|
+
# Run your forked agent against the matching storyboard
|
|
91
|
+
adcp storyboard run http://127.0.0.1:3003/mcp governance_spend_authority \
|
|
92
|
+
--bearer "$ADCP_AUTH_TOKEN" --include-bundles --json
|
|
929
93
|
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
{
|
|
934
|
-
list: {
|
|
935
|
-
list_id: string,
|
|
936
|
-
name: string,
|
|
937
|
-
collection_count: number,
|
|
938
|
-
collections: Array<{ type, value }>, // resolved programs
|
|
939
|
-
cache_valid_until: string, // ISO timestamp — sellers respect this TTL
|
|
940
|
-
},
|
|
941
|
-
}
|
|
94
|
+
# Property-lists track
|
|
95
|
+
adcp storyboard run http://127.0.0.1:3003/mcp property_lists \
|
|
96
|
+
--bearer "$ADCP_AUTH_TOKEN" --include-bundles --json
|
|
942
97
|
```
|
|
943
98
|
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
### <a name="specialism-content-standards"></a>content-standards
|
|
99
|
+
The fork-matrix gate is the three-gate contract from [`docs/guides/EXAMPLE-TEST-CONTRACT.md`](../../docs/guides/EXAMPLE-TEST-CONTRACT.md). The multi-tenant adapter currently runs the strict-tsc gate only (no governance / brand-rights mock-server today); storyboard-grader gates land alongside the next mock-server family.
|
|
947
100
|
|
|
948
|
-
|
|
101
|
+
For deeper validation: [`docs/guides/VALIDATE-YOUR-AGENT.md`](../../docs/guides/VALIDATE-YOUR-AGENT.md).
|
|
949
102
|
|
|
950
|
-
|
|
103
|
+
## Common shape gotchas
|
|
951
104
|
|
|
952
|
-
|
|
953
|
-
type Policy = {
|
|
954
|
-
policy_id: string;
|
|
955
|
-
enforcement: 'must' | 'should';
|
|
956
|
-
policy: string; // prose description of the rule
|
|
957
|
-
policy_categories?: string[]; // e.g. ['brand_safety', 'imagery_quality']
|
|
958
|
-
channels?: string[]; // e.g. ['display'] — scoped enforcement
|
|
959
|
-
};
|
|
960
|
-
|
|
961
|
-
function applies(p: Policy, artifact: { channel: string }): boolean {
|
|
962
|
-
return !p.channels || p.channels.includes(artifact.channel);
|
|
963
|
-
}
|
|
964
|
-
```
|
|
965
|
-
|
|
966
|
-
2. **`validate_content_delivery` uses `records[].artifact`**, not `results[].creative_id`. See the tool section above for the full shape.
|
|
967
|
-
|
|
968
|
-
**Re-read policies per call.** The `standards_version_change` phase issues an update, then re-calibrates the same artifact and expects the new verdict. A memoized calibrator that caches by artifact_id will fail that phase. Always fetch the latest policies from `ctx.store.get('content_standards', standards_id)` inside `calibrate_content` / `validate_content_delivery`.
|
|
969
|
-
|
|
970
|
-
`calibrate_content` should return per-rule results, not just a top-level verdict:
|
|
971
|
-
|
|
972
|
-
```typescript
|
|
973
|
-
calibrateContent: async (params, ctx) => ({
|
|
974
|
-
verdict: 'fail' as const,
|
|
975
|
-
confidence: 0.95,
|
|
976
|
-
explanation: 'Content violates tobacco-free rule',
|
|
977
|
-
rules: [
|
|
978
|
-
{ rule: 'No tobacco advertising', severity: 'must', passed: false,
|
|
979
|
-
evidence: 'Detected cigarette imagery in primary asset',
|
|
980
|
-
remediation: 'Remove cigarette imagery or select a compliant creative' },
|
|
981
|
-
{ rule: 'Weekly pacing reports required for CTV', severity: 'should', passed: true,
|
|
982
|
-
evidence: 'Agent has reporting_capabilities frequencies: ["weekly"]', remediation: null },
|
|
983
|
-
],
|
|
984
|
-
features: [],
|
|
985
|
-
}),
|
|
986
|
-
```
|
|
105
|
+
`policies[]` is `{ policy_id, enforcement, policy, ... }` — a wrapped policy, not a bare string. `validate_content_delivery` keys on `records[].artifact`, not `creative_id`. Property identity is `{agent_url, id}` (a `PropertyId`), not a bare string. `check_governance` response uses `decision: 'approved' | 'conditions' | 'denied'` — not boolean. See [`../SHAPE-GOTCHAS.md`](../SHAPE-GOTCHAS.md).
|
|
987
106
|
|
|
988
|
-
##
|
|
107
|
+
## Migration notes
|
|
989
108
|
|
|
990
|
-
- `
|
|
991
|
-
- `
|
|
992
|
-
- `storyboards/property_lists.yaml` — property list lifecycle
|
|
993
|
-
- `storyboards/collection_lists.yaml` — collection list lifecycle
|
|
994
|
-
- `storyboards/content_standards.yaml` — content standards lifecycle
|
|
995
|
-
- `docs/guides/BUILD-AN-AGENT.md` — SDK patterns
|
|
996
|
-
- `docs/TYPE-SUMMARY.md` — curated type signatures
|
|
997
|
-
- `docs/llms.txt` — full protocol reference
|
|
109
|
+
- 6.6 → 6.7: [`docs/migration-6.6-to-6.7.md`](../../docs/migration-6.6-to-6.7.md). Note: `inventory-lists` was renamed to `property-lists` in AdCP 3.0 GA (5.x → 5.2 migration).
|
|
110
|
+
- 4.x → 5.x: [`docs/migration-4.x-to-5.x.md`](../../docs/migration-4.x-to-5.x.md)
|