@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.
Files changed (144) hide show
  1. package/README.md +23 -9
  2. package/bin/adcp.js +83 -18
  3. package/dist/lib/index.d.ts +3 -5
  4. package/dist/lib/index.d.ts.map +1 -1
  5. package/dist/lib/index.js +16 -12
  6. package/dist/lib/index.js.map +1 -1
  7. package/dist/lib/server/index.d.ts +5 -1
  8. package/dist/lib/server/index.d.ts.map +1 -1
  9. package/dist/lib/server/index.js +10 -1
  10. package/dist/lib/server/index.js.map +1 -1
  11. package/dist/lib/server/postgres-task-store.d.ts +105 -0
  12. package/dist/lib/server/postgres-task-store.d.ts.map +1 -0
  13. package/dist/lib/server/postgres-task-store.js +267 -0
  14. package/dist/lib/server/postgres-task-store.js.map +1 -0
  15. package/dist/lib/server/responses.d.ts +1 -0
  16. package/dist/lib/server/responses.d.ts.map +1 -1
  17. package/dist/lib/server/responses.js +1 -0
  18. package/dist/lib/server/responses.js.map +1 -1
  19. package/dist/lib/server/test-controller.d.ts +88 -0
  20. package/dist/lib/server/test-controller.d.ts.map +1 -0
  21. package/dist/lib/server/test-controller.js +227 -0
  22. package/dist/lib/server/test-controller.js.map +1 -0
  23. package/dist/lib/testing/agent-tester.d.ts +1 -1
  24. package/dist/lib/testing/agent-tester.d.ts.map +1 -1
  25. package/dist/lib/testing/agent-tester.js +13 -1
  26. package/dist/lib/testing/agent-tester.js.map +1 -1
  27. package/dist/lib/testing/compliance/comply.d.ts +24 -5
  28. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  29. package/dist/lib/testing/compliance/comply.js +318 -277
  30. package/dist/lib/testing/compliance/comply.js.map +1 -1
  31. package/dist/lib/testing/compliance/index.d.ts +2 -1
  32. package/dist/lib/testing/compliance/index.d.ts.map +1 -1
  33. package/dist/lib/testing/compliance/index.js +6 -1
  34. package/dist/lib/testing/compliance/index.js.map +1 -1
  35. package/dist/lib/testing/compliance/platform-storyboards.d.ts +44 -0
  36. package/dist/lib/testing/compliance/platform-storyboards.d.ts.map +1 -0
  37. package/dist/lib/testing/compliance/platform-storyboards.js +232 -0
  38. package/dist/lib/testing/compliance/platform-storyboards.js.map +1 -0
  39. package/dist/lib/testing/compliance/storyboard-tracks.d.ts +2 -9
  40. package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -1
  41. package/dist/lib/testing/compliance/storyboard-tracks.js +15 -46
  42. package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -1
  43. package/dist/lib/testing/compliance/types.d.ts +22 -1
  44. package/dist/lib/testing/compliance/types.d.ts.map +1 -1
  45. package/dist/lib/testing/index.d.ts +1 -1
  46. package/dist/lib/testing/index.d.ts.map +1 -1
  47. package/dist/lib/testing/index.js +6 -1
  48. package/dist/lib/testing/index.js.map +1 -1
  49. package/dist/lib/testing/orchestrator.d.ts.map +1 -1
  50. package/dist/lib/testing/orchestrator.js +5 -1
  51. package/dist/lib/testing/orchestrator.js.map +1 -1
  52. package/dist/lib/testing/scenarios/brand-rights.d.ts +19 -1
  53. package/dist/lib/testing/scenarios/brand-rights.d.ts.map +1 -1
  54. package/dist/lib/testing/scenarios/brand-rights.js +138 -1
  55. package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
  56. package/dist/lib/testing/scenarios/deterministic.js +7 -7
  57. package/dist/lib/testing/scenarios/deterministic.js.map +1 -1
  58. package/dist/lib/testing/scenarios/index.d.ts +1 -1
  59. package/dist/lib/testing/scenarios/index.d.ts.map +1 -1
  60. package/dist/lib/testing/scenarios/index.js +4 -2
  61. package/dist/lib/testing/scenarios/index.js.map +1 -1
  62. package/dist/lib/testing/scenarios/media-buy.js +4 -4
  63. package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
  64. package/dist/lib/testing/storyboard/loader.d.ts +1 -0
  65. package/dist/lib/testing/storyboard/loader.d.ts.map +1 -1
  66. package/dist/lib/testing/storyboard/loader.js +14 -0
  67. package/dist/lib/testing/storyboard/loader.js.map +1 -1
  68. package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -1
  69. package/dist/lib/testing/storyboard/request-builder.js +88 -11
  70. package/dist/lib/testing/storyboard/request-builder.js.map +1 -1
  71. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  72. package/dist/lib/testing/storyboard/runner.js +83 -5
  73. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  74. package/dist/lib/testing/storyboard/task-map.d.ts +2 -0
  75. package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
  76. package/dist/lib/testing/storyboard/task-map.js +23 -9
  77. package/dist/lib/testing/storyboard/task-map.js.map +1 -1
  78. package/dist/lib/testing/storyboard/types.d.ts +6 -2
  79. package/dist/lib/testing/storyboard/types.d.ts.map +1 -1
  80. package/dist/lib/testing/storyboard/validations.d.ts.map +1 -1
  81. package/dist/lib/testing/storyboard/validations.js +21 -4
  82. package/dist/lib/testing/storyboard/validations.js.map +1 -1
  83. package/dist/lib/testing/types.d.ts +1 -1
  84. package/dist/lib/testing/types.d.ts.map +1 -1
  85. package/dist/lib/types/core.generated.d.ts +242 -3
  86. package/dist/lib/types/core.generated.d.ts.map +1 -1
  87. package/dist/lib/types/core.generated.js +1 -1
  88. package/dist/lib/types/schemas.generated.d.ts +3697 -3468
  89. package/dist/lib/types/schemas.generated.d.ts.map +1 -1
  90. package/dist/lib/types/schemas.generated.js +226 -118
  91. package/dist/lib/types/schemas.generated.js.map +1 -1
  92. package/dist/lib/types/tools.generated.d.ts +281 -79
  93. package/dist/lib/types/tools.generated.d.ts.map +1 -1
  94. package/dist/lib/utils/capabilities.d.ts +2 -2
  95. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  96. package/dist/lib/utils/capabilities.js +9 -3
  97. package/dist/lib/utils/capabilities.js.map +1 -1
  98. package/dist/lib/utils/response-schemas.d.ts.map +1 -1
  99. package/dist/lib/utils/response-schemas.js +9 -0
  100. package/dist/lib/utils/response-schemas.js.map +1 -1
  101. package/dist/lib/version.d.ts +3 -3
  102. package/dist/lib/version.js +3 -3
  103. package/docs/llms.txt +56 -32
  104. package/package.json +8 -2
  105. package/skills/adcp/SKILL.md +118 -33
  106. package/skills/build-creative-agent/SKILL.md +221 -0
  107. package/skills/build-generative-seller-agent/SKILL.md +288 -0
  108. package/skills/build-retail-media-agent/SKILL.md +237 -0
  109. package/skills/build-seller-agent/SKILL.md +313 -0
  110. package/skills/build-signals-agent/SKILL.md +203 -0
  111. package/storyboards/audience_sync.yaml +18 -29
  112. package/storyboards/behavioral_analysis.yaml +40 -72
  113. package/storyboards/brand_rights.yaml +172 -75
  114. package/storyboards/campaign_governance_conditions.yaml +187 -0
  115. package/storyboards/campaign_governance_delivery.yaml +231 -0
  116. package/storyboards/campaign_governance_denied.yaml +136 -0
  117. package/storyboards/capability_discovery.yaml +106 -0
  118. package/storyboards/content_standards.yaml +251 -0
  119. package/storyboards/creative_ad_server.yaml +108 -16
  120. package/storyboards/creative_generative.yaml +317 -0
  121. package/storyboards/creative_lifecycle.yaml +284 -0
  122. package/storyboards/creative_sales_agent.yaml +2 -6
  123. package/storyboards/creative_template.yaml +3 -6
  124. package/storyboards/deterministic_testing.yaml +271 -245
  125. package/storyboards/error_compliance.yaml +105 -108
  126. package/storyboards/media_buy_catalog_creative.yaml +8 -5
  127. package/storyboards/media_buy_generative_seller.yaml +581 -0
  128. package/storyboards/media_buy_governance_escalation.yaml +10 -6
  129. package/storyboards/media_buy_guaranteed_approval.yaml +21 -19
  130. package/storyboards/media_buy_non_guaranteed.yaml +9 -8
  131. package/storyboards/media_buy_proposal_mode.yaml +12 -11
  132. package/storyboards/media_buy_seller.yaml +161 -173
  133. package/storyboards/media_buy_state_machine.yaml +102 -101
  134. package/storyboards/property_governance.yaml +239 -0
  135. package/storyboards/schema.yaml +3 -2
  136. package/storyboards/schema_validation.yaml +58 -51
  137. package/storyboards/si_session.yaml +99 -317
  138. package/storyboards/signal_marketplace.yaml +9 -5
  139. package/storyboards/signal_owned.yaml +6 -5
  140. package/storyboards/social_platform.yaml +274 -0
  141. package/storyboards/test-kits/acme-outdoor.yaml +118 -0
  142. package/storyboards/test-kits/nova-motors.yaml +134 -0
  143. package/storyboards/governance_content_standards.yaml +0 -213
  144. package/storyboards/governance_property_lists.yaml +0 -372
@@ -1,17 +1,16 @@
1
1
  id: media_buy_state_machine
2
2
  version: "1.0.0"
3
3
  title: "Media buy state machine lifecycle"
4
- category: media_buy_seller
5
- track: media_buy
4
+ category: media_buy_state_machine
6
5
  summary: "Validates media buy state transitions: create, pause, resume, cancel, and terminal state enforcement."
7
-
6
+ track: media_buy
8
7
  required_tools:
9
8
  - create_media_buy
10
9
  - update_media_buy
11
10
 
12
11
  narrative: |
13
- A media buy has a well-defined state machine: draft, pending_approval, confirmed, active,
14
- paused, completed, canceled. Transitions between states must follow the spec — you cannot
12
+ A media buy has a well-defined state machine: pending_creatives, pending_start, active,
13
+ paused, completed, rejected, canceled. Transitions between states must follow the spec — you cannot
15
14
  resume a canceled buy or pause a completed one.
16
15
 
17
16
  This storyboard creates a media buy, walks it through pause/resume/cancel transitions, then
@@ -44,7 +43,7 @@ phases:
44
43
  title: "Create a media buy"
45
44
  narrative: |
46
45
  Discover products and create a media buy to use for state transition testing.
47
- The media buy ID is captured and passed to subsequent phases via context.
46
+ The media buy ID is captured and passed to subsequent phases.
48
47
 
49
48
  steps:
50
49
  - id: discover_products
@@ -53,22 +52,22 @@ phases:
53
52
  Send a brief to get available products with pricing options. The first product
54
53
  with a pricing option will be used to create the test media buy.
55
54
  task: get_products
56
- requires_tool: get_products
55
+ schema_ref: "media-buy/get-products-request.json"
56
+ response_schema_ref: "media-buy/get-products-response.json"
57
+ doc_ref: "/media-buy/task-reference/get_products"
58
+ comply_scenario: full_sales_flow
57
59
  stateful: false
58
60
  expected: |
59
61
  Return products with:
60
62
  - product_id
61
63
  - pricing_options with pricing_option_id
64
+
62
65
  sample_request:
63
66
  buying_mode: "brief"
64
67
  brief: "Display advertising products for state machine testing"
65
68
  brand:
66
69
  domain: "acmeoutdoor.com"
67
- context_outputs:
68
- - path: "products[0].product_id"
69
- key: "product_id"
70
- - path: "products[0].pricing_options[0].pricing_option_id"
71
- key: "pricing_option_id"
70
+
72
71
  validations:
73
72
  - check: response_schema
74
73
  description: "Response matches get-products-response.json schema"
@@ -79,176 +78,178 @@ phases:
79
78
  - id: create_buy
80
79
  title: "Create the test media buy"
81
80
  narrative: |
82
- Create a media buy using the discovered product. The media_buy_id is captured
83
- for use in all subsequent state transition steps.
81
+ Create a media buy using the discovered product. This buy will be used for
82
+ all subsequent state transition tests.
84
83
  task: create_media_buy
85
- requires_tool: create_media_buy
84
+ schema_ref: "media-buy/create-media-buy-request.json"
85
+ response_schema_ref: "media-buy/create-media-buy-response.json"
86
+ doc_ref: "/media-buy/task-reference/create_media_buy"
87
+ comply_scenario: create_media_buy
86
88
  stateful: true
87
89
  expected: |
88
- Return a media buy with:
89
- - media_buy_id: platform-assigned identifier
90
- - status: confirmed, active, or pending_approval
90
+ Return an active media buy with:
91
+ - media_buy_id
92
+ - status: active
93
+
91
94
  sample_request:
92
- account:
93
- brand:
94
- domain: "acmeoutdoor.com"
95
- operator: "pinnacle-agency.com"
96
95
  brand:
97
96
  domain: "acmeoutdoor.com"
98
97
  start_time: "2026-05-01T00:00:00Z"
99
98
  end_time: "2026-05-31T23:59:59Z"
100
99
  packages:
101
- - product_id: "$context.product_id"
102
- budget: 5000
103
- pricing_option_id: "$context.pricing_option_id"
104
- context_outputs:
105
- - path: "media_buy_id"
106
- key: "media_buy_id"
107
- - path: "media_buy.media_buy_id"
108
- key: "media_buy_id"
100
+ - product_id: "test-product"
101
+ budget: 10000
102
+ pricing_option_id: "test-pricing"
103
+
109
104
  validations:
110
105
  - check: response_schema
111
106
  description: "Response matches create-media-buy-response.json schema"
112
107
  - check: field_present
113
108
  path: "media_buy_id"
114
- description: "Response contains a media_buy_id"
109
+ description: "Response includes a media_buy_id"
115
110
 
116
111
  - id: state_transitions
117
- title: "State transitions: pause, resume, cancel"
112
+ title: "Valid state transitions"
118
113
  narrative: |
119
- Exercise the core state transitions on the media buy. Pause puts the buy on hold
120
- (status becomes paused), resume reactivates it (status becomes active), and cancel
121
- terminates it permanently (status becomes canceled).
122
-
123
- Each transition is validated by checking the returned status field.
114
+ Exercise the valid state transitions: pause, resume, and cancel. Each transition
115
+ must update the status field correctly.
124
116
 
125
117
  steps:
126
118
  - id: pause_buy
127
119
  title: "Pause the media buy"
128
120
  narrative: |
129
121
  Pause the active media buy. The status should transition to paused.
130
- This is a reversible operation — the buy can be resumed later.
131
122
  task: update_media_buy
132
- requires_tool: update_media_buy
123
+ schema_ref: "media-buy/update-media-buy-request.json"
124
+ response_schema_ref: "media-buy/update-media-buy-response.json"
125
+ doc_ref: "/media-buy/task-reference/update_media_buy"
126
+ comply_scenario: media_buy_lifecycle
133
127
  stateful: true
134
128
  expected: |
135
- Return the media buy with status: paused.
129
+ Media buy status transitions to paused.
130
+
136
131
  sample_request:
137
- media_buy_id: "$context.media_buy_id"
132
+ media_buy_id: "test-media-buy"
138
133
  paused: true
134
+
139
135
  validations:
140
- - check: field_value
136
+ - check: field_present
141
137
  path: "status"
142
- value: "paused"
143
- description: "Media buy status is paused"
138
+ description: "Response includes updated status"
144
139
 
145
140
  - id: resume_buy
146
141
  title: "Resume the media buy"
147
142
  narrative: |
148
- Resume the paused media buy. The status should transition back to active
149
- (or pending_activation on some platforms).
143
+ Resume the paused media buy. The status should transition back to active.
150
144
  task: update_media_buy
151
- requires_tool: update_media_buy
145
+ schema_ref: "media-buy/update-media-buy-request.json"
146
+ response_schema_ref: "media-buy/update-media-buy-response.json"
147
+ doc_ref: "/media-buy/task-reference/update_media_buy"
148
+ comply_scenario: media_buy_lifecycle
152
149
  stateful: true
153
150
  expected: |
154
- Return the media buy with status: active or pending_activation.
151
+ Media buy status transitions back to active.
152
+
155
153
  sample_request:
156
- media_buy_id: "$context.media_buy_id"
154
+ media_buy_id: "test-media-buy"
157
155
  paused: false
156
+
158
157
  validations:
159
158
  - check: field_present
160
159
  path: "status"
161
- description: "Response contains a status field after resume"
160
+ description: "Response includes updated status"
162
161
 
163
162
  - id: cancel_buy
164
163
  title: "Cancel the media buy"
165
164
  narrative: |
166
- Cancel the media buy permanently. The status should transition to canceled.
167
- This is a terminal state — no further transitions are allowed.
165
+ Cancel the media buy. This is a terminal transition the buy cannot be
166
+ resumed or modified after cancellation.
168
167
  task: update_media_buy
169
- requires_tool: update_media_buy
168
+ schema_ref: "media-buy/update-media-buy-request.json"
169
+ response_schema_ref: "media-buy/update-media-buy-response.json"
170
+ doc_ref: "/media-buy/task-reference/update_media_buy"
171
+ comply_scenario: media_buy_lifecycle
170
172
  stateful: true
171
173
  expected: |
172
- Return the media buy with status: canceled.
174
+ Media buy status transitions to canceled. This is terminal.
175
+
173
176
  sample_request:
174
- media_buy_id: "$context.media_buy_id"
177
+ media_buy_id: "test-media-buy"
175
178
  canceled: true
176
- cancellation_reason: "AdCP compliance test — state machine scenario"
179
+
177
180
  validations:
178
- - check: field_value
181
+ - check: field_present
179
182
  path: "status"
180
- value: "canceled"
181
- description: "Media buy status is canceled"
183
+ description: "Response includes canceled status"
182
184
 
183
185
  - id: terminal_enforcement
184
186
  title: "Terminal state enforcement"
185
187
  narrative: |
186
- Once a media buy is canceled or completed, the agent must reject any further
187
- state changes. Attempting to pause, resume, or re-cancel a terminated buy should
188
- return an error — typically INVALID_STATE_TRANSITION or INVALID_STATE.
189
-
190
- This validates that the state machine is properly enforced and buyers can trust
191
- that terminal states are final.
188
+ Verify that the agent rejects state transitions on a canceled media buy. Pausing,
189
+ resuming, or re-canceling a terminal buy must return an error.
192
190
 
193
191
  steps:
194
192
  - id: pause_canceled_buy
195
- title: "Pause a canceled media buy (expect rejection)"
193
+ title: "Reject pause on canceled buy"
196
194
  narrative: |
197
- Attempt to pause the canceled media buy. The agent should reject this with
198
- an error indicating the state transition is invalid.
195
+ Attempt to pause a canceled media buy. The agent must reject this with
196
+ INVALID_STATE_TRANSITION.
199
197
  task: update_media_buy
200
- requires_tool: update_media_buy
201
- expect_error: true
198
+ schema_ref: "media-buy/update-media-buy-request.json"
199
+ response_schema_ref: "media-buy/update-media-buy-response.json"
200
+ doc_ref: "/media-buy/task-reference/update_media_buy"
201
+ comply_scenario: terminal_state_enforcement
202
202
  stateful: true
203
203
  expected: |
204
- Reject with an error containing:
205
- - code: INVALID_STATE_TRANSITION, INVALID_STATE, or similar
206
- - The buy must remain in canceled status
204
+ Reject with INVALID_STATE_TRANSITION cannot pause a canceled buy.
205
+
207
206
  sample_request:
208
- media_buy_id: "$context.media_buy_id"
207
+ media_buy_id: "test-media-buy"
209
208
  paused: true
209
+
210
210
  validations:
211
- - check: error_code
212
- value: "INVALID_STATE_TRANSITION"
213
- description: "Error code indicates invalid state transition"
211
+ - check: field_present
212
+ path: "errors"
213
+ description: "Response contains an error for invalid transition"
214
214
 
215
215
  - id: resume_canceled_buy
216
- title: "Resume a canceled media buy (expect rejection)"
216
+ title: "Reject resume on canceled buy"
217
217
  narrative: |
218
- Attempt to resume the canceled media buy. The agent should reject this
219
- canceled is a terminal state and cannot be reversed.
218
+ Attempt to resume a canceled media buy. The agent must reject this with
219
+ INVALID_STATE_TRANSITION.
220
220
  task: update_media_buy
221
- requires_tool: update_media_buy
222
- expect_error: true
221
+ schema_ref: "media-buy/update-media-buy-request.json"
222
+ response_schema_ref: "media-buy/update-media-buy-response.json"
223
+ doc_ref: "/media-buy/task-reference/update_media_buy"
224
+ comply_scenario: terminal_state_enforcement
223
225
  stateful: true
224
226
  expected: |
225
- Reject with an error. Canceled media buys cannot be resumed.
227
+ Reject with INVALID_STATE_TRANSITION cannot resume a canceled buy.
228
+
226
229
  sample_request:
227
- media_buy_id: "$context.media_buy_id"
230
+ media_buy_id: "test-media-buy"
228
231
  paused: false
232
+
229
233
  validations:
230
- - check: error_code
231
- value: "INVALID_STATE_TRANSITION"
232
- description: "Error code indicates invalid state transition"
234
+ - check: field_present
235
+ path: "errors"
236
+ description: "Response contains an error for invalid transition"
233
237
 
234
238
  - id: recancel_buy
235
- title: "Re-cancel an already canceled media buy"
239
+ title: "Handle re-cancel of canceled buy"
236
240
  narrative: |
237
- Attempt to cancel a buy that is already canceled. The agent may either
238
- reject with INVALID_STATE_TRANSITION or accept idempotently. Both are
239
- acceptable — what matters is no crash or unstructured error.
241
+ Attempt to cancel an already-canceled media buy. The agent should either
242
+ return an error or accept it idempotently.
240
243
  task: update_media_buy
241
- requires_tool: update_media_buy
244
+ schema_ref: "media-buy/update-media-buy-request.json"
245
+ response_schema_ref: "media-buy/update-media-buy-response.json"
246
+ doc_ref: "/media-buy/task-reference/update_media_buy"
247
+ comply_scenario: terminal_state_enforcement
242
248
  stateful: true
243
249
  expected: |
244
- Either:
245
- - Reject with INVALID_STATE_TRANSITION (strict)
246
- - Accept idempotently and return status: canceled (permissive)
247
- Both are acceptable behaviors.
250
+ Either reject with INVALID_STATE_TRANSITION or accept idempotently.
251
+ Both behaviors are valid.
252
+
248
253
  sample_request:
249
- media_buy_id: "$context.media_buy_id"
254
+ media_buy_id: "test-media-buy"
250
255
  canceled: true
251
- validations:
252
- - check: field_present
253
- path: "status"
254
- description: "Response contains a status field (canceled) or a structured error"
@@ -0,0 +1,239 @@
1
+ id: property_governance
2
+ version: "1.0.0"
3
+ title: "Property governance"
4
+ category: property_governance
5
+ summary: "Manage brand safety property lists — create inclusion/exclusion lists, query and update them, validate delivery compliance."
6
+ track: governance
7
+ required_tools:
8
+ - create_property_list
9
+
10
+ narrative: |
11
+ You run a governance agent that manages property lists for brand safety. Buyers create
12
+ inclusion and exclusion lists that define where their ads can and cannot appear. Your
13
+ agent stores these lists, lets buyers query and update them, and validates that actual
14
+ ad delivery complied with the property constraints.
15
+
16
+ Property governance is how brands control their environment. An inclusion list says
17
+ "only show my ads on these properties." An exclusion list says "never show my ads here."
18
+ The validation step checks after the fact: did the seller actually respect the lists?
19
+
20
+ This storyboard covers the full property list lifecycle: creating lists, querying them,
21
+ updating and deleting, and validating that delivery matched the constraints.
22
+
23
+ agent:
24
+ interaction_model: governance_agent
25
+ capabilities:
26
+ - property_governance
27
+ - brand_safety
28
+ examples:
29
+ - "IAS"
30
+ - "DoubleVerify"
31
+ - "GARM-aligned platforms"
32
+ - "Brand safety services"
33
+
34
+ caller:
35
+ role: buyer_agent
36
+ example: "Pinnacle Agency (buyer)"
37
+
38
+ prerequisites:
39
+ description: |
40
+ The caller needs a brand identity and property domain knowledge. The test kit
41
+ provides a sample brand with campaign context.
42
+ test_kit: "test-kits/acme-outdoor.yaml"
43
+
44
+ phases:
45
+ - id: create_list
46
+ title: "Create property lists"
47
+ narrative: |
48
+ The buyer creates inclusion and exclusion property lists for the campaign. These
49
+ define the safe and unsafe environments for the brand's ads.
50
+
51
+ steps:
52
+ - id: create_inclusion_list
53
+ title: "Create an inclusion list"
54
+ narrative: |
55
+ The buyer creates an inclusion list specifying which properties (domains,
56
+ apps, channels) are approved for ad placement.
57
+ task: create_property_list
58
+ schema_ref: "property/create-property-list-request.json"
59
+ response_schema_ref: "property/create-property-list-response.json"
60
+ doc_ref: "/governance/property/tasks/property_lists"
61
+ comply_scenario: governance_property_lists
62
+ stateful: true
63
+ expected: |
64
+ Return the created property list:
65
+ - list_id: platform-assigned identifier
66
+ - list_type: inclusion
67
+ - Properties registered
68
+ - Status: active
69
+
70
+ sample_request:
71
+ brand:
72
+ domain: "acmeoutdoor.com"
73
+ list_type: "inclusion"
74
+ name: "Acme Outdoor approved properties"
75
+ properties:
76
+ - domain: "outdoormagazine.example.com"
77
+ - domain: "hikingtrails.example.com"
78
+ - domain: "campinggear.example.com"
79
+
80
+ validations:
81
+ - check: response_schema
82
+ description: "Response matches create-property-list-response.json schema"
83
+
84
+ - id: list_and_get
85
+ title: "Query property lists"
86
+ narrative: |
87
+ The buyer lists all property lists for the account and retrieves a specific list
88
+ to inspect its contents.
89
+
90
+ steps:
91
+ - id: list_property_lists
92
+ title: "List all property lists"
93
+ narrative: |
94
+ The buyer lists all property lists for the brand. The response includes list
95
+ metadata (name, type, property count) without full property details.
96
+ task: list_property_lists
97
+ schema_ref: "property/list-property-lists-request.json"
98
+ response_schema_ref: "property/list-property-lists-response.json"
99
+ doc_ref: "/governance/property/tasks/property_lists"
100
+ comply_scenario: property_list_filters
101
+ stateful: true
102
+ expected: |
103
+ Return property list summaries:
104
+ - Array of lists with list_id, name, list_type, property_count
105
+ - Includes both inclusion and exclusion lists
106
+
107
+ sample_request:
108
+ brand:
109
+ domain: "acmeoutdoor.com"
110
+
111
+ validations:
112
+ - check: response_schema
113
+ description: "Response matches list-property-lists-response.json schema"
114
+
115
+ - id: get_property_list
116
+ title: "Get a specific property list"
117
+ narrative: |
118
+ The buyer retrieves the full details of a specific property list, including
119
+ all properties in the list.
120
+ task: get_property_list
121
+ schema_ref: "property/get-property-list-request.json"
122
+ response_schema_ref: "property/get-property-list-response.json"
123
+ doc_ref: "/governance/property/tasks/property_lists"
124
+ comply_scenario: governance_property_lists
125
+ stateful: true
126
+ expected: |
127
+ Return the full property list:
128
+ - list_id, name, list_type
129
+ - All properties in the list with their details
130
+
131
+ sample_request:
132
+ list_id: "pl_acme_inclusion_001"
133
+
134
+ validations:
135
+ - check: response_schema
136
+ description: "Response matches get-property-list-response.json schema"
137
+
138
+ - id: update_list
139
+ title: "Update property lists"
140
+ narrative: |
141
+ The buyer modifies an existing property list — adding or removing properties
142
+ as brand safety requirements evolve.
143
+
144
+ steps:
145
+ - id: update_property_list
146
+ title: "Update a property list"
147
+ narrative: |
148
+ The buyer adds new properties to or removes properties from an existing list.
149
+ task: update_property_list
150
+ schema_ref: "property/update-property-list-request.json"
151
+ response_schema_ref: "property/update-property-list-response.json"
152
+ doc_ref: "/governance/property/tasks/property_lists"
153
+ comply_scenario: governance_property_lists
154
+ stateful: true
155
+ expected: |
156
+ Return the updated property list:
157
+ - Updated property count
158
+ - Confirmation of additions and removals
159
+
160
+ sample_request:
161
+ list_id: "pl_acme_inclusion_001"
162
+ add:
163
+ - domain: "mountaineering.example.com"
164
+ remove:
165
+ - domain: "campinggear.example.com"
166
+
167
+ validations:
168
+ - check: response_schema
169
+ description: "Response matches update-property-list-response.json schema"
170
+
171
+ - id: delete_list
172
+ title: "Delete a property list"
173
+ narrative: |
174
+ The buyer removes a property list that is no longer needed. Active media buys
175
+ referencing the list should be notified.
176
+
177
+ steps:
178
+ - id: delete_property_list
179
+ title: "Delete a property list"
180
+ narrative: |
181
+ The buyer deletes a property list. The governance agent removes the list and
182
+ returns confirmation.
183
+ task: delete_property_list
184
+ schema_ref: "property/delete-property-list-request.json"
185
+ response_schema_ref: "property/delete-property-list-response.json"
186
+ doc_ref: "/governance/property/tasks/property_lists"
187
+ comply_scenario: governance_property_lists
188
+ stateful: true
189
+ expected: |
190
+ Confirm deletion:
191
+ - list_id: the deleted list
192
+ - status: deleted
193
+
194
+ sample_request:
195
+ list_id: "pl_acme_inclusion_001"
196
+
197
+ validations:
198
+ - check: response_schema
199
+ description: "Response matches delete-property-list-response.json schema"
200
+
201
+ - id: delivery_validation
202
+ title: "Validate delivery compliance"
203
+ narrative: |
204
+ After ads have been delivered, the buyer validates that the seller respected the
205
+ property lists. The governance agent checks actual delivery data against the
206
+ inclusion/exclusion constraints.
207
+
208
+ steps:
209
+ - id: validate_property_delivery
210
+ title: "Validate property compliance"
211
+ narrative: |
212
+ The buyer submits delivery data and the governance agent checks whether all
213
+ placements complied with the property lists. Non-compliant placements are
214
+ flagged with details.
215
+ task: validate_property_delivery
216
+ schema_ref: "property/validate-property-delivery-request.json"
217
+ response_schema_ref: "property/validate-property-delivery-response.json"
218
+ doc_ref: "/governance/property/tasks/validate_property_delivery"
219
+ comply_scenario: governance_property_lists
220
+ stateful: true
221
+ expected: |
222
+ Return validation results:
223
+ - compliant: boolean overall status
224
+ - Per-placement compliance status
225
+ - Violations with details (property, list, severity)
226
+
227
+ sample_request:
228
+ brand:
229
+ domain: "acmeoutdoor.com"
230
+ list_id: "pl_acme_inclusion_001"
231
+ delivery:
232
+ - property: "outdoormagazine.example.com"
233
+ impressions: 50000
234
+ - property: "randomsite.example.com"
235
+ impressions: 200
236
+
237
+ validations:
238
+ - check: response_schema
239
+ description: "Response matches validate-property-delivery-response.json schema"
@@ -13,12 +13,12 @@
13
13
  # id: string (unique identifier, e.g., "creative_template")
14
14
  # version: string (semver, e.g., "1.0.0")
15
15
  # title: string (human-readable title)
16
- # category: enum (creative_template | creative_ad_server | creative_sales_agent | creative_generative | media_buy_seller | media_buy_guaranteed_approval | media_buy_non_guaranteed | media_buy_proposal_mode | media_buy_governance_escalation | media_buy_catalog_creative | signal_marketplace | signal_owned)
16
+ # category: enum (capability_discovery | schema_validation | behavioral_analysis | error_compliance | creative_template | creative_ad_server | creative_sales_agent | creative_generative | creative_lifecycle | media_buy_seller | media_buy_generative_seller | media_buy_guaranteed_approval | media_buy_non_guaranteed | media_buy_proposal_mode | media_buy_governance_escalation | media_buy_catalog_creative | media_buy_state_machine | campaign_governance_denied | campaign_governance_conditions | campaign_governance_delivery | signal_marketplace | signal_owned | social_platform | si_session | brand_rights | property_governance | content_standards | audience_sync)
17
17
  # summary: string (one-line description for listings)
18
18
  # narrative: string (paragraph explaining the overall flow)
19
19
  #
20
20
  # agent:
21
- # interaction_model: enum (stateless_transform | stateful_preloaded | stateful_push | stateless_generate | media_buy_seller | marketplace_catalog | owned_signals)
21
+ # interaction_model: enum (stateless_transform | stateful_preloaded | stateful_push | stateless_generate | media_buy_seller | marketplace_catalog | owned_signals | si_platform | brand_rights_holder | governance_agent)
22
22
  # capabilities: string[] (AdCP capability flags: supports_transformation, has_creative_library, supports_generation, sells_media, accepts_briefs, supports_guaranteed, supports_non_guaranteed, catalog_signals)
23
23
  # examples: string[] (real-world examples: "Celtra", "Innovid")
24
24
  #
@@ -62,4 +62,5 @@
62
62
  #
63
63
  # check: string (what to validate: "response_schema", "field_present", "field_value", "status_code")
64
64
  # path: string (JSON path to the field, e.g., "formats[0].format_id")
65
+ # value: any (expected value — string, number, or boolean; required when check is "field_value")
65
66
  # description: string (human-readable description of validation)