@adcp/client 4.22.1 → 4.24.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/README.md +23 -9
- package/bin/adcp.js +83 -18
- package/dist/lib/index.d.ts +3 -5
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +16 -12
- package/dist/lib/index.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 +10 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/postgres-task-store.d.ts +105 -0
- package/dist/lib/server/postgres-task-store.d.ts.map +1 -0
- package/dist/lib/server/postgres-task-store.js +267 -0
- package/dist/lib/server/postgres-task-store.js.map +1 -0
- package/dist/lib/server/responses.d.ts +1 -0
- package/dist/lib/server/responses.d.ts.map +1 -1
- package/dist/lib/server/responses.js +1 -0
- package/dist/lib/server/responses.js.map +1 -1
- package/dist/lib/server/test-controller.d.ts +88 -0
- package/dist/lib/server/test-controller.d.ts.map +1 -0
- package/dist/lib/server/test-controller.js +227 -0
- package/dist/lib/server/test-controller.js.map +1 -0
- package/dist/lib/testing/agent-tester.d.ts +1 -1
- package/dist/lib/testing/agent-tester.d.ts.map +1 -1
- package/dist/lib/testing/agent-tester.js +13 -1
- package/dist/lib/testing/agent-tester.js.map +1 -1
- package/dist/lib/testing/compliance/comply.d.ts +24 -5
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +318 -277
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/index.d.ts +2 -1
- package/dist/lib/testing/compliance/index.d.ts.map +1 -1
- package/dist/lib/testing/compliance/index.js +6 -1
- package/dist/lib/testing/compliance/index.js.map +1 -1
- package/dist/lib/testing/compliance/platform-storyboards.d.ts +44 -0
- package/dist/lib/testing/compliance/platform-storyboards.d.ts.map +1 -0
- package/dist/lib/testing/compliance/platform-storyboards.js +232 -0
- package/dist/lib/testing/compliance/platform-storyboards.js.map +1 -0
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts +2 -9
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.js +15 -46
- package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -1
- package/dist/lib/testing/compliance/types.d.ts +22 -1
- package/dist/lib/testing/compliance/types.d.ts.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 +6 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/orchestrator.d.ts.map +1 -1
- package/dist/lib/testing/orchestrator.js +5 -1
- package/dist/lib/testing/orchestrator.js.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.d.ts +19 -1
- package/dist/lib/testing/scenarios/brand-rights.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/brand-rights.js +138 -1
- package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
- package/dist/lib/testing/scenarios/deterministic.js +7 -7
- package/dist/lib/testing/scenarios/deterministic.js.map +1 -1
- package/dist/lib/testing/scenarios/index.d.ts +1 -1
- package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
- package/dist/lib/testing/scenarios/index.js +4 -2
- package/dist/lib/testing/scenarios/index.js.map +1 -1
- package/dist/lib/testing/scenarios/media-buy.js +4 -4
- package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
- package/dist/lib/testing/storyboard/loader.d.ts +1 -0
- package/dist/lib/testing/storyboard/loader.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/loader.js +14 -0
- package/dist/lib/testing/storyboard/loader.js.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/request-builder.js +88 -11
- package/dist/lib/testing/storyboard/request-builder.js.map +1 -1
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/runner.js +83 -5
- package/dist/lib/testing/storyboard/runner.js.map +1 -1
- package/dist/lib/testing/storyboard/task-map.d.ts +2 -0
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/task-map.js +23 -9
- package/dist/lib/testing/storyboard/task-map.js.map +1 -1
- package/dist/lib/testing/storyboard/types.d.ts +6 -2
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
- package/dist/lib/testing/storyboard/validations.js +21 -4
- package/dist/lib/testing/storyboard/validations.js.map +1 -1
- package/dist/lib/testing/types.d.ts +1 -1
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/core.generated.d.ts +242 -3
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +1 -1
- package/dist/lib/types/schemas.generated.d.ts +3697 -3468
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +226 -118
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +281 -79
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.d.ts +2 -2
- package/dist/lib/utils/capabilities.d.ts.map +1 -1
- package/dist/lib/utils/capabilities.js +9 -3
- package/dist/lib/utils/capabilities.js.map +1 -1
- package/dist/lib/utils/response-schemas.d.ts.map +1 -1
- package/dist/lib/utils/response-schemas.js +9 -0
- package/dist/lib/utils/response-schemas.js.map +1 -1
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/docs/llms.txt +56 -32
- package/package.json +8 -2
- package/skills/adcp/SKILL.md +118 -33
- package/skills/build-creative-agent/SKILL.md +221 -0
- package/skills/build-generative-seller-agent/SKILL.md +288 -0
- package/skills/build-retail-media-agent/SKILL.md +237 -0
- package/skills/build-seller-agent/SKILL.md +313 -0
- package/skills/build-signals-agent/SKILL.md +203 -0
- package/storyboards/audience_sync.yaml +18 -29
- package/storyboards/behavioral_analysis.yaml +40 -72
- package/storyboards/brand_rights.yaml +172 -75
- package/storyboards/campaign_governance_conditions.yaml +187 -0
- package/storyboards/campaign_governance_delivery.yaml +231 -0
- package/storyboards/campaign_governance_denied.yaml +136 -0
- package/storyboards/capability_discovery.yaml +106 -0
- package/storyboards/content_standards.yaml +251 -0
- package/storyboards/creative_ad_server.yaml +108 -16
- package/storyboards/creative_generative.yaml +317 -0
- package/storyboards/creative_lifecycle.yaml +284 -0
- package/storyboards/creative_sales_agent.yaml +2 -6
- package/storyboards/creative_template.yaml +3 -6
- package/storyboards/deterministic_testing.yaml +271 -245
- package/storyboards/error_compliance.yaml +105 -108
- package/storyboards/media_buy_catalog_creative.yaml +8 -5
- package/storyboards/media_buy_generative_seller.yaml +581 -0
- package/storyboards/media_buy_governance_escalation.yaml +10 -6
- package/storyboards/media_buy_guaranteed_approval.yaml +21 -19
- package/storyboards/media_buy_non_guaranteed.yaml +9 -8
- package/storyboards/media_buy_proposal_mode.yaml +12 -11
- package/storyboards/media_buy_seller.yaml +161 -173
- package/storyboards/media_buy_state_machine.yaml +102 -101
- package/storyboards/property_governance.yaml +239 -0
- package/storyboards/schema.yaml +3 -2
- package/storyboards/schema_validation.yaml +58 -51
- package/storyboards/si_session.yaml +99 -317
- package/storyboards/signal_marketplace.yaml +9 -5
- package/storyboards/signal_owned.yaml +6 -5
- package/storyboards/social_platform.yaml +274 -0
- package/storyboards/test-kits/acme-outdoor.yaml +118 -0
- package/storyboards/test-kits/nova-motors.yaml +134 -0
- package/storyboards/governance_content_standards.yaml +0 -213
- package/storyboards/governance_property_lists.yaml +0 -372
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
id: campaign_governance_delivery
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Campaign governance — delivery monitoring with drift detection"
|
|
4
|
+
category: campaign_governance_delivery
|
|
5
|
+
summary: "Governance agent monitors delivery, detects budget drift past thresholds, and triggers re-evaluation."
|
|
6
|
+
track: campaign_governance
|
|
7
|
+
required_tools:
|
|
8
|
+
- check_governance
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
After a media buy is confirmed with governance approval, the governance agent monitors
|
|
12
|
+
delivery. When spend drifts past a reallocation threshold — for example, one line item
|
|
13
|
+
is overspending while another is underspending — the governance agent triggers a delivery
|
|
14
|
+
phase re-evaluation.
|
|
15
|
+
|
|
16
|
+
This storyboard covers the delivery monitoring governance flow: initial approval,
|
|
17
|
+
delivery metrics showing drift, governance re-check triggered by drift, and either
|
|
18
|
+
re-approval with adjusted conditions or a pause recommendation.
|
|
19
|
+
|
|
20
|
+
agent:
|
|
21
|
+
interaction_model: media_buy_seller
|
|
22
|
+
capabilities:
|
|
23
|
+
- sells_media
|
|
24
|
+
- governance_aware
|
|
25
|
+
examples:
|
|
26
|
+
- "Publisher platform with governance and delivery reporting"
|
|
27
|
+
- "Retail media network with pacing data"
|
|
28
|
+
|
|
29
|
+
caller:
|
|
30
|
+
role: buyer_agent
|
|
31
|
+
example: "Pinnacle Agency (buyer)"
|
|
32
|
+
|
|
33
|
+
prerequisites:
|
|
34
|
+
description: |
|
|
35
|
+
The caller needs a brand identity, operator credentials, a governance agent URL,
|
|
36
|
+
and an active media buy with delivery data. The governance plan defines a
|
|
37
|
+
reallocation threshold that triggers re-evaluation.
|
|
38
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
39
|
+
|
|
40
|
+
phases:
|
|
41
|
+
- id: plan_registration
|
|
42
|
+
title: "Register governance plan with delivery monitoring"
|
|
43
|
+
narrative: |
|
|
44
|
+
The buyer registers a governance plan that includes delivery monitoring thresholds.
|
|
45
|
+
When spend drift exceeds the reallocation threshold, the governance agent triggers
|
|
46
|
+
a delivery-phase re-evaluation.
|
|
47
|
+
|
|
48
|
+
steps:
|
|
49
|
+
- id: sync_plans
|
|
50
|
+
title: "Register a governance plan with reallocation threshold"
|
|
51
|
+
narrative: |
|
|
52
|
+
The buyer's governance agent registers a plan with full spending authority and
|
|
53
|
+
a 20% reallocation threshold. If any line item's spend drifts more than 20%
|
|
54
|
+
from the planned budget allocation, the governance agent re-evaluates.
|
|
55
|
+
task: sync_plans
|
|
56
|
+
schema_ref: "governance/sync-plans-request.json"
|
|
57
|
+
response_schema_ref: "governance/sync-plans-response.json"
|
|
58
|
+
doc_ref: "/governance/campaign/tasks/sync_plans"
|
|
59
|
+
comply_scenario: campaign_governance_delivery
|
|
60
|
+
stateful: true
|
|
61
|
+
expected: |
|
|
62
|
+
Acknowledge the governance plan:
|
|
63
|
+
- plan_id: identifier for this governance plan
|
|
64
|
+
- authority_level: agent_full
|
|
65
|
+
- reallocation_threshold: 0.20 (20% drift triggers re-evaluation)
|
|
66
|
+
|
|
67
|
+
sample_request:
|
|
68
|
+
plans:
|
|
69
|
+
- plan_name: "Acme Outdoor delivery governance"
|
|
70
|
+
brand:
|
|
71
|
+
domain: "acmeoutdoor.com"
|
|
72
|
+
operator: "pinnacle-agency.com"
|
|
73
|
+
authority_level: "agent_full"
|
|
74
|
+
reallocation_threshold: 0.20
|
|
75
|
+
conditions:
|
|
76
|
+
- "Re-evaluate governance if any line item drifts >20% from plan"
|
|
77
|
+
|
|
78
|
+
validations:
|
|
79
|
+
- check: response_schema
|
|
80
|
+
description: "Response matches sync-plans-response.json schema"
|
|
81
|
+
|
|
82
|
+
- id: initial_approval
|
|
83
|
+
title: "Initial governance check — approved"
|
|
84
|
+
narrative: |
|
|
85
|
+
The buyer proposes a media buy within authority. The governance agent approves
|
|
86
|
+
the buy with the delivery monitoring conditions active.
|
|
87
|
+
|
|
88
|
+
steps:
|
|
89
|
+
- id: check_governance_approved
|
|
90
|
+
title: "Pre-buy governance check (approved)"
|
|
91
|
+
narrative: |
|
|
92
|
+
The buyer calls check_governance with a media buy within authority. The governance
|
|
93
|
+
agent approves and notes that delivery monitoring is active with the 20% drift
|
|
94
|
+
threshold.
|
|
95
|
+
task: check_governance
|
|
96
|
+
schema_ref: "governance/check-governance-request.json"
|
|
97
|
+
response_schema_ref: "governance/check-governance-response.json"
|
|
98
|
+
doc_ref: "/governance/campaign/tasks/check_governance"
|
|
99
|
+
comply_scenario: campaign_governance_delivery
|
|
100
|
+
stateful: true
|
|
101
|
+
expected: |
|
|
102
|
+
Return an approved governance decision:
|
|
103
|
+
- decision: approved
|
|
104
|
+
- governance_context: token for the media buy
|
|
105
|
+
- monitoring: delivery phase governance is active
|
|
106
|
+
|
|
107
|
+
sample_request:
|
|
108
|
+
plan_id: "gov_acme_delivery"
|
|
109
|
+
binding:
|
|
110
|
+
type: "media_buy"
|
|
111
|
+
account:
|
|
112
|
+
brand:
|
|
113
|
+
domain: "acmeoutdoor.com"
|
|
114
|
+
operator: "pinnacle-agency.com"
|
|
115
|
+
total_budget: 40000
|
|
116
|
+
packages:
|
|
117
|
+
- product_id: "sports_ctv_q2"
|
|
118
|
+
budget: 20000
|
|
119
|
+
- product_id: "outdoor_video_q2"
|
|
120
|
+
budget: 20000
|
|
121
|
+
|
|
122
|
+
validations:
|
|
123
|
+
- check: response_schema
|
|
124
|
+
description: "Response matches check-governance-response.json schema"
|
|
125
|
+
- check: field_present
|
|
126
|
+
path: "decision"
|
|
127
|
+
description: "Response contains a governance decision"
|
|
128
|
+
|
|
129
|
+
- id: delivery_monitoring
|
|
130
|
+
title: "Delivery metrics show budget drift"
|
|
131
|
+
narrative: |
|
|
132
|
+
The campaign is running. The buyer checks delivery and finds that one line item
|
|
133
|
+
is overspending while the other is underspending. The CTV line item has consumed
|
|
134
|
+
70% of its budget at the halfway point while the video line item is at 30%.
|
|
135
|
+
|
|
136
|
+
steps:
|
|
137
|
+
- id: get_delivery
|
|
138
|
+
title: "Check delivery metrics"
|
|
139
|
+
narrative: |
|
|
140
|
+
The buyer requests delivery data and finds budget drift. One line item is
|
|
141
|
+
significantly overpacing while the other is underpacing.
|
|
142
|
+
task: get_media_buy_delivery
|
|
143
|
+
schema_ref: "media-buy/get-media-buy-delivery-request.json"
|
|
144
|
+
response_schema_ref: "media-buy/get-media-buy-delivery-response.json"
|
|
145
|
+
doc_ref: "/media-buy/task-reference/get_media_buy_delivery"
|
|
146
|
+
comply_scenario: campaign_governance_delivery
|
|
147
|
+
stateful: true
|
|
148
|
+
expected: |
|
|
149
|
+
Return delivery metrics showing drift:
|
|
150
|
+
- Per-package delivery with impressions, spend, and pacing
|
|
151
|
+
- One package overpacing (>60% spend at 50% flight)
|
|
152
|
+
- One package underpacing (<40% spend at 50% flight)
|
|
153
|
+
|
|
154
|
+
sample_request:
|
|
155
|
+
account:
|
|
156
|
+
brand:
|
|
157
|
+
domain: "acmeoutdoor.com"
|
|
158
|
+
operator: "pinnacle-agency.com"
|
|
159
|
+
media_buy_ids:
|
|
160
|
+
- "mb_acme_q2_2026"
|
|
161
|
+
include_package_daily_breakdown: true
|
|
162
|
+
|
|
163
|
+
validations:
|
|
164
|
+
- check: response_schema
|
|
165
|
+
description: "Response matches get-media-buy-delivery-response.json schema"
|
|
166
|
+
- check: field_present
|
|
167
|
+
path: "media_buy_deliveries"
|
|
168
|
+
description: "Response contains media buy delivery data"
|
|
169
|
+
|
|
170
|
+
- id: drift_recheck
|
|
171
|
+
title: "Governance re-check — drift detected"
|
|
172
|
+
narrative: |
|
|
173
|
+
The buyer's governance agent detects that budget drift has exceeded the 20%
|
|
174
|
+
reallocation threshold. It triggers a delivery-phase governance check with the
|
|
175
|
+
current delivery data as evidence. The governance agent re-evaluates and returns
|
|
176
|
+
a decision — either re-approved with updated conditions or a recommendation to
|
|
177
|
+
pause and rebalance.
|
|
178
|
+
|
|
179
|
+
steps:
|
|
180
|
+
- id: check_governance_drift
|
|
181
|
+
title: "Delivery-phase governance re-check (drift exceeded)"
|
|
182
|
+
narrative: |
|
|
183
|
+
The buyer calls check_governance with governance_phase: delivery and attaches
|
|
184
|
+
the current delivery metrics as evidence. The governance agent evaluates the
|
|
185
|
+
drift against the reallocation threshold and returns a decision.
|
|
186
|
+
task: check_governance
|
|
187
|
+
schema_ref: "governance/check-governance-request.json"
|
|
188
|
+
response_schema_ref: "governance/check-governance-response.json"
|
|
189
|
+
doc_ref: "/governance/campaign/tasks/check_governance"
|
|
190
|
+
comply_scenario: campaign_governance_delivery
|
|
191
|
+
stateful: true
|
|
192
|
+
expected: |
|
|
193
|
+
Return a governance decision about the delivery drift:
|
|
194
|
+
- decision: approved (with rebalancing conditions) or denied (pause recommended)
|
|
195
|
+
- findings: should-severity findings noting the drift amounts
|
|
196
|
+
- severity: should
|
|
197
|
+
- code: BUDGET_DRIFT_EXCEEDED
|
|
198
|
+
- message: explains which line items drifted and by how much
|
|
199
|
+
- conditions: if approved, conditions for rebalancing (e.g., "Reallocate $5K from CTV to video")
|
|
200
|
+
|
|
201
|
+
sample_request:
|
|
202
|
+
plan_id: "gov_acme_delivery"
|
|
203
|
+
governance_phase: "delivery"
|
|
204
|
+
governance_context: "gov_ctx_acme_delivery_approved"
|
|
205
|
+
binding:
|
|
206
|
+
type: "media_buy"
|
|
207
|
+
account:
|
|
208
|
+
brand:
|
|
209
|
+
domain: "acmeoutdoor.com"
|
|
210
|
+
operator: "pinnacle-agency.com"
|
|
211
|
+
media_buy_id: "mb_acme_q2_2026"
|
|
212
|
+
delivery_evidence:
|
|
213
|
+
packages:
|
|
214
|
+
- product_id: "sports_ctv_q2"
|
|
215
|
+
budget: 20000
|
|
216
|
+
spend_to_date: 14000
|
|
217
|
+
flight_progress: 0.50
|
|
218
|
+
- product_id: "outdoor_video_q2"
|
|
219
|
+
budget: 20000
|
|
220
|
+
spend_to_date: 6000
|
|
221
|
+
flight_progress: 0.50
|
|
222
|
+
|
|
223
|
+
validations:
|
|
224
|
+
- check: response_schema
|
|
225
|
+
description: "Response matches check-governance-response.json schema"
|
|
226
|
+
- check: field_present
|
|
227
|
+
path: "decision"
|
|
228
|
+
description: "Response contains a governance decision"
|
|
229
|
+
- check: field_present
|
|
230
|
+
path: "findings"
|
|
231
|
+
description: "Response contains findings about the drift"
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
id: campaign_governance_denied
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Campaign governance — denied"
|
|
4
|
+
category: campaign_governance_denied
|
|
5
|
+
summary: "Governance agent denies a media buy that exceeds the agent's spending authority. No human escalation — the buy is blocked."
|
|
6
|
+
track: campaign_governance
|
|
7
|
+
required_tools:
|
|
8
|
+
- sync_plans
|
|
9
|
+
- check_governance
|
|
10
|
+
|
|
11
|
+
narrative: |
|
|
12
|
+
The buyer's governance agent registers a plan with strict spending authority. The buyer
|
|
13
|
+
then proposes a media buy that exceeds the agent's per-transaction threshold. The
|
|
14
|
+
governance agent denies the buy outright with a must-severity finding.
|
|
15
|
+
|
|
16
|
+
Unlike the escalation storyboard, there is no human override here. The denial is final.
|
|
17
|
+
The buyer must reduce the buy amount or restructure into smaller transactions that fall
|
|
18
|
+
within the agent's authority. This tests the hard-stop governance path.
|
|
19
|
+
|
|
20
|
+
agent:
|
|
21
|
+
interaction_model: media_buy_seller
|
|
22
|
+
capabilities:
|
|
23
|
+
- sells_media
|
|
24
|
+
- governance_aware
|
|
25
|
+
examples:
|
|
26
|
+
- "Publisher platform with governance support"
|
|
27
|
+
- "Retail media network"
|
|
28
|
+
|
|
29
|
+
caller:
|
|
30
|
+
role: buyer_agent
|
|
31
|
+
example: "Pinnacle Agency (buyer)"
|
|
32
|
+
|
|
33
|
+
prerequisites:
|
|
34
|
+
description: |
|
|
35
|
+
The caller needs a brand identity, operator credentials, and a governance agent URL.
|
|
36
|
+
The governance plan must define a per-transaction threshold below the intended buy amount.
|
|
37
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
38
|
+
|
|
39
|
+
phases:
|
|
40
|
+
- id: plan_registration
|
|
41
|
+
title: "Register governance plan"
|
|
42
|
+
narrative: |
|
|
43
|
+
The buyer registers a governance plan with strict spending authority. The plan sets
|
|
44
|
+
an agent_limited authority level with a $10K per-transaction threshold. Any buy above
|
|
45
|
+
this amount is denied without escalation.
|
|
46
|
+
|
|
47
|
+
steps:
|
|
48
|
+
- id: sync_plans
|
|
49
|
+
title: "Register a governance plan with strict authority"
|
|
50
|
+
narrative: |
|
|
51
|
+
The buyer's governance agent registers a plan with a $10K per-transaction limit
|
|
52
|
+
and no escalation path. Buys that exceed this threshold are denied outright.
|
|
53
|
+
task: sync_plans
|
|
54
|
+
schema_ref: "governance/sync-plans-request.json"
|
|
55
|
+
response_schema_ref: "governance/sync-plans-response.json"
|
|
56
|
+
doc_ref: "/governance/campaign/tasks/sync_plans"
|
|
57
|
+
comply_scenario: campaign_governance_denied
|
|
58
|
+
stateful: true
|
|
59
|
+
expected: |
|
|
60
|
+
Acknowledge the governance plan:
|
|
61
|
+
- plan_id: identifier for this governance plan
|
|
62
|
+
- authority_level: agent_limited
|
|
63
|
+
- per_transaction_threshold: $10K spending limit
|
|
64
|
+
|
|
65
|
+
sample_request:
|
|
66
|
+
plans:
|
|
67
|
+
- plan_name: "Acme Outdoor strict governance"
|
|
68
|
+
brand:
|
|
69
|
+
domain: "acmeoutdoor.com"
|
|
70
|
+
operator: "pinnacle-agency.com"
|
|
71
|
+
authority_level: "agent_limited"
|
|
72
|
+
per_transaction_threshold: 10000
|
|
73
|
+
escalation_path: "none"
|
|
74
|
+
|
|
75
|
+
validations:
|
|
76
|
+
- check: response_schema
|
|
77
|
+
description: "Response matches sync-plans-response.json schema"
|
|
78
|
+
|
|
79
|
+
- id: governance_check
|
|
80
|
+
title: "Governance check — denied"
|
|
81
|
+
narrative: |
|
|
82
|
+
The buyer proposes a $50K media buy against the $10K threshold. The governance agent
|
|
83
|
+
evaluates the binding and returns a denied decision with a must-severity finding
|
|
84
|
+
explaining the spending authority violation. No escalation instructions are provided
|
|
85
|
+
because the plan has no escalation path.
|
|
86
|
+
|
|
87
|
+
steps:
|
|
88
|
+
- id: check_governance_denied
|
|
89
|
+
title: "Pre-buy governance check (denied, no escalation)"
|
|
90
|
+
narrative: |
|
|
91
|
+
The buyer calls check_governance with a $50K media buy binding. The governance
|
|
92
|
+
agent denies the buy because the total exceeds the $10K per-transaction authority.
|
|
93
|
+
The response includes a must-severity finding with the violation details.
|
|
94
|
+
task: check_governance
|
|
95
|
+
schema_ref: "governance/check-governance-request.json"
|
|
96
|
+
response_schema_ref: "governance/check-governance-response.json"
|
|
97
|
+
doc_ref: "/governance/campaign/tasks/check_governance"
|
|
98
|
+
comply_scenario: campaign_governance_denied
|
|
99
|
+
stateful: true
|
|
100
|
+
expected: |
|
|
101
|
+
Return a denied governance decision:
|
|
102
|
+
- decision: denied
|
|
103
|
+
- findings: array with at least one must-severity finding
|
|
104
|
+
- severity: must
|
|
105
|
+
- code: SPENDING_AUTHORITY_EXCEEDED
|
|
106
|
+
- message: explains the threshold and how much the buy exceeds it
|
|
107
|
+
- No escalation instructions (plan has no escalation path)
|
|
108
|
+
|
|
109
|
+
sample_request:
|
|
110
|
+
plan_id: "gov_acme_strict"
|
|
111
|
+
binding:
|
|
112
|
+
type: "media_buy"
|
|
113
|
+
account:
|
|
114
|
+
brand:
|
|
115
|
+
domain: "acmeoutdoor.com"
|
|
116
|
+
operator: "pinnacle-agency.com"
|
|
117
|
+
total_budget: 50000
|
|
118
|
+
packages:
|
|
119
|
+
- product_id: "sports_ctv_q2"
|
|
120
|
+
budget: 30000
|
|
121
|
+
- product_id: "outdoor_video_q2"
|
|
122
|
+
budget: 20000
|
|
123
|
+
|
|
124
|
+
validations:
|
|
125
|
+
- check: response_schema
|
|
126
|
+
description: "Response matches check-governance-response.json schema"
|
|
127
|
+
- check: field_present
|
|
128
|
+
path: "decision"
|
|
129
|
+
description: "Response contains a governance decision"
|
|
130
|
+
- check: field_value
|
|
131
|
+
path: "decision"
|
|
132
|
+
value: "denied"
|
|
133
|
+
description: "Decision is denied"
|
|
134
|
+
- check: field_present
|
|
135
|
+
path: "findings"
|
|
136
|
+
description: "Response contains findings explaining the denial"
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
id: capability_discovery
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Capability discovery"
|
|
4
|
+
category: capability_discovery
|
|
5
|
+
summary: "Buyer calls get_adcp_capabilities to discover what an agent supports before making any buying or creative decisions."
|
|
6
|
+
track: core
|
|
7
|
+
|
|
8
|
+
narrative: |
|
|
9
|
+
Before doing anything else, a buyer agent calls get_adcp_capabilities to learn what your
|
|
10
|
+
platform supports. This is the first call in any new relationship — the buyer needs to know
|
|
11
|
+
your protocol version, supported domains (media buy, creative, governance, signals, SI),
|
|
12
|
+
pricing models, targeting capabilities, and creative specs.
|
|
13
|
+
|
|
14
|
+
The response shapes every subsequent call. If you declare media_buy support, the buyer knows
|
|
15
|
+
it can send briefs and create media buys. If you declare creative support, the buyer knows
|
|
16
|
+
it can sync or build creatives. The buyer uses this to decide which storyboards apply to your
|
|
17
|
+
agent and what flows to attempt.
|
|
18
|
+
|
|
19
|
+
agent:
|
|
20
|
+
interaction_model: media_buy_seller
|
|
21
|
+
capabilities:
|
|
22
|
+
- sells_media
|
|
23
|
+
examples:
|
|
24
|
+
- "Any AdCP-compliant agent"
|
|
25
|
+
- "Publisher platforms"
|
|
26
|
+
- "Creative ad servers"
|
|
27
|
+
- "DSPs"
|
|
28
|
+
|
|
29
|
+
caller:
|
|
30
|
+
role: buyer_agent
|
|
31
|
+
example: "Scope3 (DSP)"
|
|
32
|
+
|
|
33
|
+
prerequisites:
|
|
34
|
+
description: |
|
|
35
|
+
No prerequisites. This is the very first call a buyer makes to any agent.
|
|
36
|
+
The test kit provides brand context but it is not required for this storyboard.
|
|
37
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
38
|
+
|
|
39
|
+
phases:
|
|
40
|
+
- id: protocol_discovery
|
|
41
|
+
title: "Protocol and capability discovery"
|
|
42
|
+
narrative: |
|
|
43
|
+
The buyer calls get_adcp_capabilities to learn what your agent supports. This call
|
|
44
|
+
takes no required arguments — it is a read-only introspection of the agent's
|
|
45
|
+
capabilities. The buyer may optionally filter by protocol domain or major version.
|
|
46
|
+
|
|
47
|
+
steps:
|
|
48
|
+
- id: get_capabilities
|
|
49
|
+
title: "Discover agent capabilities"
|
|
50
|
+
narrative: |
|
|
51
|
+
The buyer calls get_adcp_capabilities with no arguments. Your agent returns its
|
|
52
|
+
full capability declaration: protocol version, supported domains, pricing models,
|
|
53
|
+
targeting options, creative specs, and any extensions.
|
|
54
|
+
|
|
55
|
+
This response is the source of truth for what the buyer can do with your agent.
|
|
56
|
+
Every field the buyer reads here determines which tasks it will call next.
|
|
57
|
+
task: get_adcp_capabilities
|
|
58
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
59
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
60
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
61
|
+
comply_scenario: capability_discovery
|
|
62
|
+
stateful: false
|
|
63
|
+
expected: |
|
|
64
|
+
Return your agent's full capability declaration:
|
|
65
|
+
- adcp.major_versions: which protocol versions you support (e.g., [3])
|
|
66
|
+
- supported_protocols: which domains are available (media_buy, creative, governance, signals, sponsored_intelligence)
|
|
67
|
+
- media_buy: pricing models, delivery types, targeting, reporting features
|
|
68
|
+
- creative: library support, generation, transformation capabilities
|
|
69
|
+
- governance: property and creative features the governance agent can evaluate
|
|
70
|
+
- account: auth model, billing support, sandbox mode
|
|
71
|
+
|
|
72
|
+
sample_request: {}
|
|
73
|
+
|
|
74
|
+
validations:
|
|
75
|
+
- check: response_schema
|
|
76
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|
|
77
|
+
- check: field_present
|
|
78
|
+
path: "adcp.major_versions"
|
|
79
|
+
description: "Agent declares supported protocol versions"
|
|
80
|
+
- check: field_present
|
|
81
|
+
path: "supported_protocols"
|
|
82
|
+
description: "Agent declares which protocol domains it supports"
|
|
83
|
+
|
|
84
|
+
- id: get_capabilities_filtered
|
|
85
|
+
title: "Discover capabilities filtered by protocol"
|
|
86
|
+
narrative: |
|
|
87
|
+
The buyer calls get_adcp_capabilities again, this time filtering for a specific
|
|
88
|
+
protocol domain. This is useful when the buyer already knows what it wants and
|
|
89
|
+
only needs details for one domain (e.g., just media_buy capabilities).
|
|
90
|
+
task: get_adcp_capabilities
|
|
91
|
+
schema_ref: "protocol/get-adcp-capabilities-request.json"
|
|
92
|
+
response_schema_ref: "protocol/get-adcp-capabilities-response.json"
|
|
93
|
+
doc_ref: "/protocol/get_adcp_capabilities"
|
|
94
|
+
comply_scenario: capability_discovery
|
|
95
|
+
stateful: false
|
|
96
|
+
expected: |
|
|
97
|
+
Return capabilities filtered to the requested protocol domain. The response
|
|
98
|
+
should include the same structure but only the requested domain details.
|
|
99
|
+
|
|
100
|
+
sample_request:
|
|
101
|
+
protocols:
|
|
102
|
+
- "media_buy"
|
|
103
|
+
|
|
104
|
+
validations:
|
|
105
|
+
- check: response_schema
|
|
106
|
+
description: "Response matches get-adcp-capabilities-response.json schema"
|